diff --git a/README.md b/README.md index 6d6dd57..2436516 100644 --- a/README.md +++ b/README.md @@ -131,25 +131,56 @@ send_time_night = "23 0" # 选填 晚上发送时间默认为22:00 超级用户删他人头衔:删头衔 @某人 【管理员】permission=SUPERUSER | GROUP_OWNER + gl+ @xxx 设置某人为管理员 管理员+ @xxx 设置某人为管理员 + 管理员加 @xxx 设置某人为管理员 + 加管理 @xxx 设置某人为管理员 + + gl- @xxx 取消某人管理员 管理员- @xxx 取消某人管理员 + 管理员减 @xxx 取消某人管理员 + 减管理 @xxx 取消某人管理员 + 【加群自动审批】: 群内发送 permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER 查看词条 : 查看本群审批词条 或/审批 + ct+ [词条] :增加审批词条 或/审批+ 词条+ [词条] :增加审批词条 或/审批+ + ct- [词条] :删除审批词条 或/审批- 词条- [词条] :删除审批词条 或/审批- + 按照黑名单自动拒绝:(当验证消息与黑名单内容匹配时,自动拒绝) + 添加示例: + jj+管理员你好,请通过一下 + ctjj+管理员你好,请通过一下 + 词条拒绝+管理员你好,请通过一下 + 拒绝词条+管理员你好,请通过一下 + /spx+管理员你好,请通过一下 + 删除示例: + jj-管理员你好,请通过一下 + ctjj-管理员你好,请通过一下 + 词条拒绝-管理员你好,请通过一下 + 拒绝词条-管理员你好,请通过一下 + /spx-管理员你好,请通过一下 【superuser】: 所有词条 : 查看所有审批词条 或/su审批 - 指定词条+ [群号] [词条] :增加指定群审批词条 或/su审批+ - 指定词条- [群号] [词条] :删除指定群审批词条 或/su审批- + zdct+ [词条] :增加审批词条 + 指定词条+ [群号] [词条] :增加指定群审批词条 + 指定词条加 [群号] [词条] :增加指定群审批词条 或/su审批+ + zdct- [词条] :删除审批词条 + 指定词条- [群号] [词条] :删除指定群审批词条 + 指定词条减 [群号] [词条] :删除指定群审批词条 或/su审批- 自动审批处理结果将发送给superuser 【分群管理员设置】*分管:可以接受加群处理结果消息的用户 群内发送 permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER + fg+ [user] :user可用@或qq 添加分群管理员 分管+ [user] :user可用@或qq 添加分群管理员 + 分管加 [user] :user可用@或qq 添加分群管理员 + fg- [user] :删除分群管理员 分管- [user] :删除分群管理员 + 分管减 [user] :删除分群管理员 查看分管 :查看本群分群管理员 群内或私聊 permission=SUPERUSER @@ -196,6 +227,7 @@ send_time_night = "23 0" # 选填 晚上发送时间默认为22:00 } 违禁词检测: +(如果要使用正则匹配,暂时需要用户自定编辑【机器人项目/config/违禁词.txt】,后续会优化,有需要请提issue催更) - 支持正则表达式(使用用制表符分隔) - 可定义触发违禁词操作(默认为禁言+撤回) - 可定义生效范围(排除某些群 or 仅限某些群生效) diff --git a/nonebot_plugin_admin/__init__.py b/nonebot_plugin_admin/__init__.py index 2bcc13b..5db9aad 100644 --- a/nonebot_plugin_admin/__init__.py +++ b/nonebot_plugin_admin/__init__.py @@ -46,7 +46,7 @@ async def _(bot: nonebot.adapters.Bot): 群管初始化 :初始化插件 【群管】: -权限:permission = SUPERUSER | GROUP_ADMIN | GROUP_OWNER +权限:permission=SUPERUSER | GROUP_ADMIN | GROUP_OWNER 禁言: 禁 @某人 时间(s)[1,2591999] 禁 时间(s)@某人 [1,2591999] @@ -54,65 +54,96 @@ async def _(bot: nonebot.adapters.Bot): 禁 @某人 0 可解禁 解 @某人 禁言时,该条消息中所有数字都会组合作为禁言时间,如:‘禁@某人 1哈2哈0哈’,则禁言120s - + 全群禁言 若命令前缀不为空,请使用//all,若为空,需用 /all 来触发 - /all + /all /all 解 - + 改名片 改 @某人 名片 - + 踢出: 踢 @某人 踢出并拉黑: 黑 @某人 - + 撤回: 撤回 (回复某条消息即可撤回对应消息) 撤回 @user [(可选,默认n=5)历史消息倍数n] (实际检查的历史数为 n*19) - + 设置精华 回复某条消息 + 加精 取消精华 回复某条消息 + 取消精华 - + 【头衔】 改头衔 - 自助领取:头衔 xxx + 自助领取:头衔 xxx 自助删头衔:删头衔 超级用户更改他人头衔:头衔 @某人 头衔 超级用户删他人头衔:删头衔 @某人 -【管理员】permission = SUPERUSER | GROUP_OWNER +【管理员】permission=SUPERUSER | GROUP_OWNER + gl+ @xxx 设置某人为管理员 管理员+ @xxx 设置某人为管理员 + 管理员加 @xxx 设置某人为管理员 + 加管理 @xxx 设置某人为管理员 + + gl- @xxx 取消某人管理员 管理员- @xxx 取消某人管理员 + 管理员减 @xxx 取消某人管理员 + 减管理 @xxx 取消某人管理员 + 【加群自动审批】: -群内发送 permission = GROUP_ADMIN | GROUP_OWNER | SUPERUSER +群内发送 permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER 查看词条 : 查看本群审批词条 或/审批 + ct+ [词条] :增加审批词条 或/审批+ 词条+ [词条] :增加审批词条 或/审批+ + ct- [词条] :删除审批词条 或/审批- 词条- [词条] :删除审批词条 或/审批- + 按照黑名单自动拒绝:(当验证消息与黑名单内容匹配时,自动拒绝) + 添加示例: + jj+管理员你好,请通过一下 + ctjj+管理员你好,请通过一下 + 词条拒绝+管理员你好,请通过一下 + 拒绝词条+管理员你好,请通过一下 + /spx+管理员你好,请通过一下 + 删除示例: + jj-管理员你好,请通过一下 + ctjj-管理员你好,请通过一下 + 词条拒绝-管理员你好,请通过一下 + 拒绝词条-管理员你好,请通过一下 + /spx-管理员你好,请通过一下 【superuser】: 所有词条 : 查看所有审批词条 或/su审批 - 指定词条+ [群号] [词条] :增加指定群审批词条 或/su审批+ - 指定词条- [群号] [词条] :删除指定群审批词条 或/su审批- + zdct+ [词条] :增加审批词条 + 指定词条+ [群号] [词条] :增加指定群审批词条 + 指定词条加 [群号] [词条] :增加指定群审批词条 或/su审批+ + zdct- [词条] :删除审批词条 + 指定词条- [群号] [词条] :删除指定群审批词条 + 指定词条减 [群号] [词条] :删除指定群审批词条 或/su审批- 自动审批处理结果将发送给superuser 【分群管理员设置】*分管:可以接受加群处理结果消息的用户 -群内发送 permission = GROUP_ADMIN | GROUP_OWNER | SUPERUSER +群内发送 permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER + fg+ [user] :user可用@或qq 添加分群管理员 分管+ [user] :user可用@或qq 添加分群管理员 + 分管加 [user] :user可用@或qq 添加分群管理员 + fg- [user] :删除分群管理员 分管- [user] :删除分群管理员 + 分管减 [user] :删除分群管理员 查看分管 :查看本群分群管理员 -群内或私聊 permission = SUPERUSER +群内或私聊 permission=SUPERUSER 所有分管 :查看所有分群管理员 群管接收 :打开或关闭超管消息接收(关闭则审批结果不会发送给superusers) - + 【群词云统计】 该功能所用库 wordcloud 未写入依赖,请自行安装 群内发送: - 记录本群 : 开始统计聊天记录 permission = GROUP_ADMIN | GROUP_OWNER | SUPERUSER + 记录本群 : 开始统计聊天记录 permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER 停止记录本群 :停止统计聊天记录 群词云 : 发送词云图片 更新mask : 更新mask图片 @@ -130,8 +161,8 @@ async def _(bot: nonebot.adapters.Bot): - 某人发言数 - 日:今日发言数@xxx, aliases={'今日发言数', '今日发言', '今日发言量'} - 总:发言数@xxx, aliases={'发言数', '发言', '发言量'} - - + + 【被动识别】 涩图检测: - 图片检测偏向于涩图检测,90分以上色图禁言,其他基本不处理 @@ -149,16 +180,17 @@ async def _(bot: nonebot.adapters.Bot): } 违禁词检测: +(如果要使用正则匹配,暂时需要用户自定编辑【机器人项目/config/违禁词.txt】,后续会优化,有需要请提issue催更) - 支持正则表达式(使用用制表符分隔) - 可定义触发违禁词操作(默认为禁言+撤回) - 可定义生效范围(排除某些群 or 仅限某些群生效) - - 示例(使用TAB隔开): - - 加(群|君\\S?羊|羣)\\S*\\d{6,} $撤回$禁言$仅限123456789,987654321 - - 狗群主 $禁言$排除987654321 + - 示例: + - 加(群|君\S?羊|羣)\S*\d{6,} $撤回$禁言$仅限123456789,987654321 + - 狗群主 $禁言$排除987654321 【功能开关】 群内发送: - 开关xx : 对某功能进行开/关 permission = SUPERUSER | GROUP_ADMIN | GROUP_OWNER + 开关xx : 对某功能进行开/关 permission=SUPERUSER | GROUP_ADMIN | GROUP_OWNER 开关状态 : 查看各功能的状态 xx in : ['管理', '踢', '禁', '改', '基础群管'] #基础功能 踢、禁、改、管理员+- @@ -175,30 +207,31 @@ async def _(bot: nonebot.adapters.Bot): 【广播】permission = SUPERUSER 本功能默认关闭 - "发送【广播】/【广播+[消息]】可广播消息" - "发送【群列表】可查看能广播到的所有群" - "发送【排除列表】可查看已排除的群" - "发送【广播排除+】可添加群到广播排除列表" + "发送【广播】/【广播+[消息]】可广播消息" + "发送【群列表】可查看能广播到的所有群" + "发送【排除列表】可查看已排除的群" + "发送【广播排除+】可添加群到广播排除列表" "发送【广播排除-】可从广播排除列表删除群" "发送【广播帮助】可查看广播帮助" 发送【开关广播】来开启/关闭(意义不大) - + 【特殊事件提醒】 包括管理员变动,加群退群等... 待完善 - 发送【开关事件通知】来开启/关闭功能 permission = SUPERUSER | GROUP_ADMIN | GROUP_OWNER + 发送【开关事件通知】来开启/关闭功能 permission=SUPERUSER | GROUP_ADMIN | GROUP_OWNER 【防撤回】 默认关闭 - 发送【开关防撤回】开启或关闭功能 permission = SUPERUSER | GROUP_ADMIN | GROUP_OWNER + 发送【开关防撤回】开启或关闭功能 permission=SUPERUSER | GROUP_ADMIN | GROUP_OWNER 【群员清理】 -群内发送 permission = SUPERUSER | GROUP_ADMIN | GROUP_OWNER | DEPUTY_ADMIN +群内发送 permission=SUPERUSER | GROUP_OWNER 该功能暂不被开关控制 发送【群员清理】可根据[等级] 或 [发言时间] 清理群员 在执行此命令时,当前群会对此操作加锁,防止其他人同时操作,如果出现问题,可执行【清理解锁】来手动解锁 + """ __help_plugin_name__ = '简易群管' diff --git a/nonebot_plugin_admin/admin.py b/nonebot_plugin_admin/admin.py index 9a2c32b..1efff5d 100644 --- a/nonebot_plugin_admin/admin.py +++ b/nonebot_plugin_admin/admin.py @@ -181,7 +181,7 @@ async def _(bot: Bot, matcher: Matcher, event: GroupMessageEvent, sb: list = Dep except ActionFailed: await fi(matcher, '权限不足') -set_g_admin = on_command('管理员+', priority=2, block=True, permission=SUPERUSER | GROUP_OWNER) +set_g_admin = on_command('管理员+', aliases={'加管理', '管理加', '加管理员', '管理员加', 'gl+', 'gly+'}, priority=2, block=True, permission=SUPERUSER | GROUP_OWNER) @set_g_admin.handle() async def _(bot: Bot, matcher: Matcher, event: GroupMessageEvent, sb: list = Depends(msg_at)): """ @@ -196,7 +196,7 @@ async def _(bot: Bot, matcher: Matcher, event: GroupMessageEvent, sb: list = Dep except ActionFailed: await fi(matcher, '权限不足') -unset_g_admin = on_command('管理员-', priority=2, block=True, permission=SUPERUSER | GROUP_OWNER) +unset_g_admin = on_command('管理员-', aliases={'减管理', '管理减', '减管理员', '管理员减', 'gl-', 'gly-'}, priority=2, block=True, permission=SUPERUSER | GROUP_OWNER) @unset_g_admin.handle() async def _(bot: Bot, matcher: Matcher, event: GroupMessageEvent, sb: list = Depends(msg_at)): """ diff --git a/nonebot_plugin_admin/admin_role.py b/nonebot_plugin_admin/admin_role.py index ff5c539..241850c 100644 --- a/nonebot_plugin_admin/admin_role.py +++ b/nonebot_plugin_admin/admin_role.py @@ -10,11 +10,15 @@ from .approve import g_admin + async def _deputy_admin(event: GroupMessageEvent) -> bool: admins = g_admin() gid = str(event.group_id) if admins.get(gid): return event.user_id in admins[gid] + else: + return False + DEPUTY_ADMIN: Permission = Permission(_deputy_admin) """匹配分管事件""" diff --git a/nonebot_plugin_admin/notice.py b/nonebot_plugin_admin/notice.py index 10be94e..7be8e89 100644 --- a/nonebot_plugin_admin/notice.py +++ b/nonebot_plugin_admin/notice.py @@ -38,7 +38,7 @@ async def _(matcher: Matcher): await matcher.finish(str(admins)) # 添加分群管理员 -g_admin = on_command('分管+', priority=2, aliases={'/gad+', '分群管理+'}, block=True, +g_admin = on_command('分管+', priority=2, aliases={'/gad+', '分群管理+', '分管加', '分群管理加', 'fg+'}, block=True, permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER) @g_admin.handle() async def _(matcher: Matcher, event: GroupMessageEvent, state: T_State, sb: list = Depends(msg_at)): @@ -67,7 +67,7 @@ async def _(matcher: Matcher): await matcher.finish('已开启审批消息接收' if status else '已关闭审批消息接收') # 删除分群管理 -g_admin_ = on_command('分管-', priority=2, aliases={'/gad-', '分群管理-'}, block=True, +g_admin_ = on_command('分管-', priority=2, aliases={'/gad-', '分群管理-', '分管减', '分群管理减', 'fg-'}, block=True, permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER) @g_admin_.handle() async def _(matcher: Matcher, event: GroupMessageEvent, state: T_State, sb: list = Depends(msg_at)): diff --git a/nonebot_plugin_admin/path.py b/nonebot_plugin_admin/path.py index bba04bf..71f9f38 100644 --- a/nonebot_plugin_admin/path.py +++ b/nonebot_plugin_admin/path.py @@ -30,6 +30,7 @@ ttf_path = Path() / 'resource' / 'msyhblod.ttf' summary_path = config_path / 'summary' kick_lock_path = config_path / 'kick_lock' +appr_bk = config_path / '加群验证信息黑名单.json' admin_funcs = { 'admin': ['管理', '踢', '禁', '改', '基础群管'], diff --git a/nonebot_plugin_admin/requests.py b/nonebot_plugin_admin/requests.py index fef441f..e499778 100644 --- a/nonebot_plugin_admin/requests.py +++ b/nonebot_plugin_admin/requests.py @@ -13,18 +13,21 @@ from nonebot.matcher import Matcher from nonebot.permission import SUPERUSER from nonebot.typing import T_State +from fuzzyfinder import fuzzyfinder from . import approve from .approve import g_admin from .config import global_config from .group_request_verify import verify from .path import * -from .utils import json_load +from .utils import json_load, json_upload, mk su = global_config.superusers # 查看所有审批词条 super_sp = on_command('所有词条', priority=2, aliases={'/susp', '/su审批'}, block=True, permission=SUPERUSER) + + @super_sp.handle() async def _(matcher: Matcher): answers = json_load(config_admin) @@ -33,8 +36,11 @@ async def _(matcher: Matcher): rely += i + ' : ' + str(answers[i]) + '\n' await matcher.finish(rely) + # 按群号添加词条 -super_sp_add = on_command('指定词条+', priority=2, aliases={'/susp+', '/su审批+'}, block=True, permission=SUPERUSER) +super_sp_add = on_command('指定词条+', priority=2, aliases={'/susp+', '/su审批+', "指定词条加", 'zdct+'}, block=True, permission=SUPERUSER) + + @super_sp_add.handle() async def _(matcher: Matcher, event: MessageEvent): msg = str(event.get_message()).split() @@ -54,8 +60,11 @@ async def _(matcher: Matcher, event: MessageEvent): else: await matcher.finish('输入有误 /susp+ [群号] [词条]') + # 按群号删除词条 -super_sp_de = on_command('指定词条-', priority=2, aliases={'/susp-', '/su审批-'}, block=True, permission=SUPERUSER) +super_sp_de = on_command('指定词条-', priority=2, aliases={'/susp-', '/su审批-', "指定词条减", 'zdct-'}, block=True, permission=SUPERUSER) + + @super_sp_de.handle() async def _(matcher: Matcher, event: MessageEvent): msg = str(event.get_message()).split() @@ -75,8 +84,11 @@ async def _(matcher: Matcher, event: MessageEvent): else: await matcher.finish('输入有误 /susp- [群号] [词条]') + check = on_command('查看词条', priority=2, aliases={'/sp', '/审批'}, block=True, permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER) + + @check.handle() async def _(matcher: Matcher, event: GroupMessageEvent): """ @@ -89,9 +101,12 @@ async def _(matcher: Matcher, event: GroupMessageEvent): await matcher.finish(f"当前群审批词条:{this_config}") await matcher.finish('当前群从未配置过审批词条') -config = on_command('词条+', priority=2, aliases={'/sp+', '/审批+'}, block=True, - permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER) -@config.handle() + +add_appr_term = on_command('词条+', priority=2, aliases={'/sp+', '/审批+', '审批词条加', "词条加", 'ct+', 'sp+'}, block=True, + permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER) + + +@add_appr_term.handle() async def _(matcher: Matcher, event: GroupMessageEvent, state: T_State): """ /sp+ 增加本群词条 @@ -103,9 +118,12 @@ async def _(matcher: Matcher, event: GroupMessageEvent, state: T_State): await matcher.finish(f"群{gid}添加词条:{msg}") await matcher.finish(f"{msg} 已存在于群{gid}的词条中") -config_ = on_command('词条-', priority=2, aliases={'/sp-', '/审批-'}, block=True, - permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER) -@config_.handle() + +del_appr_term = on_command('词条-', priority=2, aliases={'/sp-', '/审批-', '审批词条减', "词条减", 'ct-', 'sp-'}, block=True, + permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER) + + +@del_appr_term.handle() async def _(matcher: Matcher, event: GroupMessageEvent, state: T_State): """ /sp- 删除本群某词条 @@ -120,8 +138,59 @@ async def _(matcher: Matcher, event: GroupMessageEvent, state: T_State): elif sp_delete is None: await matcher.finish("当前群从未配置过词条") + +edit_appr_bk = on_command('词条拒绝', priority=2, aliases={'/spx', '/审批拒绝', '拒绝词条', 'ctjj', 'jj'}, block=True, + permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER) + + +@edit_appr_bk.handle() +async def _(matcher: Matcher, event: GroupMessageEvent, state: T_State): + """ + /spx 词条拒绝 + """ + msg = str(state['_prefix']['command_arg']) + cmd = 'add' if msg[0] == '+' else 'unknown' + gid = str(event.group_id) + word = (msg[1:]).replace(' ', '') + if not appr_bk.exists() and cmd == 'unknown': + await matcher.send("当前机器人从未为任何群配置过加群验证信息黑名单...") + content = f"{{\"{gid}\":[\"This_is\",\"an_example\"]}}" + await mk('file', appr_bk, 'w', content=content) +# bk_example: {"123456":["This_is","an_example"]} +# appr_bk = config_path / '加群验证信息黑名单.json' is a json file + appr_obj = json_load(appr_bk) + if cmd == 'add': + if gid not in appr_obj: + appr_obj[gid] = [word] + else: + if word not in appr_obj[gid]: + appr_obj[gid].append(word) + else: + await matcher.finish(f"群{gid}已存在此词条,无需重复添加") + json_upload(appr_bk, appr_obj) + await matcher.finish(f"群{gid}添加自动拒绝词条:{word}") + elif cmd == 'unknown': + if msg[0] == '-': + if gid in appr_obj: + if word in appr_obj[gid]: + appr_obj[gid].remove(word) + json_upload(appr_bk, appr_obj) + await matcher.finish(f"群{gid}删除自动拒绝词条:{word}") + else: + await matcher.finish(f"群{gid}不存在此词条") + else: + await matcher.finish(f"群{gid}从未配置过词条") + else: + await matcher.finish("输入有误:\n 拒绝词条 [+/-] [词条]") + + + + + # 加群审批 group_req = on_request(priority=2, block=True) + + @group_req.handle() async def gr_(bot: Bot, matcher: Matcher, event: GroupRequestEvent): gid = str(event.group_id) @@ -134,6 +203,18 @@ async def gr_(bot: Bot, matcher: Matcher, event: GroupRequestEvent): word = word[0] if word else comment compared = await verify(word, gid) uid = event.user_id + # 加载验证消息黑名单 + if appr_bk.exists(): + appr_obj = json_load(appr_bk) + if gid in appr_obj: + suggestions = fuzzyfinder(word, appr_obj[gid]) + result = list(suggestions) + if result and len(word) >= len(result[0]) / 3: + logger.info(f"验证消息【{word}】符合:黑名单词条:【{result}】") + await bot.set_group_add_request(flag=flag, sub_type=sub_type, approve=False, + reason='答案未通过群管验证,可修改答案后再次申请') + logger.info(f"拒绝{uid}加入群 {gid},验证消息为 “{word}”") + logger.info(f"拒绝原因:加群验证消息在黑名单中") if compared: logger.info(f"同意{uid}加入群 {gid},验证消息为 “{word}”") await bot.set_group_add_request(flag=flag, sub_type=sub_type, approve=True, reason=' ') diff --git a/nonebot_plugin_admin/utils.py b/nonebot_plugin_admin/utils.py index e5bc116..2195c60 100644 --- a/nonebot_plugin_admin/utils.py +++ b/nonebot_plugin_admin/utils.py @@ -47,6 +47,8 @@ async def init(): await mk('file', config_group_admin, 'w', content='{"su": "True"}') if not word_path.exists(): await mk('file', word_path, 'w', content='123456789\n') + if not appr_bk.exists(): + await mk('file', appr_bk, 'w', content='{"1008611":["This_is","an_example"]}') if not switcher_path.exists(): bots = nonebot.get_bots() for bot in bots.values(): diff --git a/setup.py b/setup.py index 742060d..ffa5f10 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ setuptools.setup( name="nonebot-plugin-admin", - version="0.4.6.1", + version="0.4.7", author="yzyyz1387", author_email="youzyyz1384@qq.com", keywords=("pip", "nonebot2", "nonebot", "admin", "nonebot_plugin"),