添加 __init__.py
This commit is contained in:
142
__init__.py
Normal file
142
__init__.py
Normal file
@@ -0,0 +1,142 @@
|
||||
import json
|
||||
import random
|
||||
import asyncio
|
||||
from datetime import datetime, timedelta
|
||||
from nonebot import on_notice, on_message, get_bot
|
||||
from nonebot.adapters.onebot.v11 import (
|
||||
GroupIncreaseNoticeEvent,
|
||||
MessageEvent,
|
||||
Message,
|
||||
Bot,
|
||||
)
|
||||
from nonebot.permission import SUPERUSER
|
||||
|
||||
BAN_FILE = "zhenxun/plugins/nb_new/ban.json"
|
||||
GROUP_FILE = "zhenxun/plugins/nb_new/group.json"
|
||||
VERIFY_TIMEOUT = 300 # 5分钟
|
||||
LEVEL_LIMIT = 20 # QQ等级限制
|
||||
|
||||
# 内存缓存
|
||||
verify_data = {} # user_id -> {"code": xxx, "group_id": xxx, "expire": time}
|
||||
|
||||
# 初始化配置文件
|
||||
def load_json(path, default):
|
||||
try:
|
||||
with open(path, "r", encoding="utf-8") as f:
|
||||
return json.load(f)
|
||||
except:
|
||||
with open(path, "w", encoding="utf-8") as f:
|
||||
json.dump(default, f, indent=2, ensure_ascii=False)
|
||||
return default
|
||||
|
||||
|
||||
def save_json(path, data):
|
||||
with open(path, "w", encoding="utf-8") as f:
|
||||
json.dump(data, f, indent=2, ensure_ascii=False)
|
||||
|
||||
|
||||
ban_list = load_json(BAN_FILE, [])
|
||||
group_list = load_json(GROUP_FILE, [记得改成要启用的群聊]) # 默认群
|
||||
|
||||
# 新人进群事件
|
||||
new_member = on_notice(priority=5, block=False)
|
||||
|
||||
|
||||
@new_member.handle()
|
||||
async def _(bot: Bot, event: GroupIncreaseNoticeEvent):
|
||||
user_id = event.user_id
|
||||
group_id = event.group_id
|
||||
|
||||
if group_id not in group_list:
|
||||
return
|
||||
|
||||
# 如果在ban名单中
|
||||
if user_id in ban_list:
|
||||
await bot.call_api("set_group_kick", group_id=group_id, user_id=user_id)
|
||||
return
|
||||
|
||||
# 检查QQ等级
|
||||
try:
|
||||
profile = await bot.get_stranger_info(user_id=user_id, no_cache=True)
|
||||
level = profile.get("level", 0)
|
||||
if level < LEVEL_LIMIT:
|
||||
await bot.call_api("set_group_kick", group_id=group_id, user_id=user_id)
|
||||
return
|
||||
except:
|
||||
pass
|
||||
|
||||
# 禁言
|
||||
await bot.call_api("set_group_ban", group_id=group_id, user_id=user_id, duration=3600)
|
||||
|
||||
# 生成验证码
|
||||
code = str(random.randint(100000, 999999))
|
||||
verify_data[user_id] = {
|
||||
"code": code,
|
||||
"group_id": group_id,
|
||||
"expire": datetime.now() + timedelta(seconds=VERIFY_TIMEOUT),
|
||||
}
|
||||
|
||||
try:
|
||||
await bot.send_private_msg(user_id=user_id, message=f"请在5分钟内回复验证码:{code}\n回复错误或超时将被踢出群聊。")
|
||||
except:
|
||||
await bot.send_group_msg(group_id=group_id, message=f"[CQ:at,qq={user_id}] 请在私聊完成验证")
|
||||
|
||||
|
||||
# 私聊消息监听
|
||||
verify_reply = on_message(priority=5, block=False)
|
||||
|
||||
|
||||
@verify_reply.handle()
|
||||
async def _(bot: Bot, event: MessageEvent):
|
||||
user_id = event.user_id
|
||||
msg = str(event.get_message()).strip()
|
||||
|
||||
if user_id not in verify_data:
|
||||
return
|
||||
|
||||
data = verify_data[user_id]
|
||||
group_id = data["group_id"]
|
||||
correct_code = data["code"]
|
||||
|
||||
# 超时
|
||||
if datetime.now() > data["expire"]:
|
||||
await bot.call_api("set_group_kick", group_id=group_id, user_id=user_id)
|
||||
ban_list.append(user_id)
|
||||
save_json(BAN_FILE, ban_list)
|
||||
verify_data.pop(user_id, None)
|
||||
return
|
||||
|
||||
# 验证
|
||||
if msg == correct_code:
|
||||
await bot.call_api("set_group_ban", group_id=group_id, user_id=user_id, duration=0)
|
||||
await bot.send_group_msg(group_id=group_id, message=f"[CQ:at,qq={user_id}] 验证成功,欢迎加入群聊")
|
||||
verify_data.pop(user_id, None)
|
||||
else:
|
||||
await bot.call_api("set_group_kick", group_id=group_id, user_id=user_id)
|
||||
ban_list.append(user_id)
|
||||
save_json(BAN_FILE, ban_list)
|
||||
verify_data.pop(user_id, None)
|
||||
|
||||
|
||||
# 定时任务:清理超时
|
||||
async def check_timeout(bot: Bot):
|
||||
while True:
|
||||
now = datetime.now()
|
||||
to_remove = []
|
||||
for uid, data in verify_data.items():
|
||||
if now > data["expire"]:
|
||||
try:
|
||||
await bot.call_api("set_group_kick", group_id=data["group_id"], user_id=uid)
|
||||
except:
|
||||
pass
|
||||
ban_list.append(uid)
|
||||
save_json(BAN_FILE, ban_list)
|
||||
to_remove.append(uid)
|
||||
for uid in to_remove:
|
||||
verify_data.pop(uid, None)
|
||||
await asyncio.sleep(60)
|
||||
|
||||
|
||||
@new_member.handle()
|
||||
async def start_check(bot: Bot, event: GroupIncreaseNoticeEvent):
|
||||
asyncio.create_task(check_timeout(bot))
|
||||
Reference in New Issue
Block a user