️优化ban插件

This commit is contained in:
HibiKier 2024-08-04 18:49:39 +08:00
parent 3eb107a79d
commit ecc8ec3fd8
5 changed files with 83 additions and 59 deletions

View File

@ -30,12 +30,12 @@ __plugin_meta__ = PluginMetadata(
usage=""" usage="""
普通管理员 普通管理员
格式: 格式:
ban [At用户] [时长(分钟)] ban [At用户] -t [时长(分钟)]
示例: 示例:
ban @用户 : 永久拉黑用户 ban @用户 : 永久拉黑用户
ban @用户 100 : 拉黑用户100分钟 ban @用户 -t 100 : 拉黑用户100分钟
unban @用户 : 从小黑屋中拉出来 unban @用户 : 从小黑屋中拉出来
""".strip(), """.strip(),
extra=PluginExtraData( extra=PluginExtraData(
author="HibiKier", author="HibiKier",
@ -46,15 +46,23 @@ __plugin_meta__ = PluginMetadata(
格式: 格式:
ban [At用户/用户Id] [时长] ban [At用户/用户Id] [时长]
ban列表: 获取所有Ban数据 ban列表: 获取所有Ban数据
群组ban列表: 获取群组Ban数据 群组ban列表: 获取群组Ban数据
用户ban列表: 获取用户Ban数据 用户ban列表: 获取用户Ban数据
ban列表 -u [用户Id]: 查找指定用户ban数据
ban列表 -g [群组Id]: 查找指定群组ban数据
示例:
ban列表 -u 123456789 : 查找用户123456789的ban数据
ban列表 -g 123456789 : 查找群组123456789的ban数据
私聊下: 私聊下:
示例: 示例:
ban 123456789 : 永久拉黑用户123456789 ban 123456789 : 永久拉黑用户123456789
ban 123456789 100 : 拉黑用户123456789 100分钟 ban 123456789 -t 100 : 拉黑用户123456789 100分钟
ban -g 999999 : 拉黑群组为999999的群组 ban -g 999999 : 拉黑群组为999999的群组
ban -g 999999 -t 100 : 拉黑群组为999999的群组 100分钟
unban 123456789 : 从小黑屋中拉出来 unban 123456789 : 从小黑屋中拉出来
unban -g 999999 : 将群组9999999从小黑屋中拉出来 unban -g 999999 : 将群组9999999从小黑屋中拉出来
@ -76,8 +84,9 @@ __plugin_meta__ = PluginMetadata(
_ban_matcher = on_alconna( _ban_matcher = on_alconna(
Alconna( Alconna(
"ban", "ban",
Args["user?", [str, At]]["duration?", int], Args["user?", [str, At]],
Option("-g|--group", Args["group_id", str]), Option("-g|--group", Args["group_id", str]),
Option("-t|--time", Args["duration", int]),
), ),
rule=admin_check("ban", "BAN_LEVEL"), rule=admin_check("ban", "BAN_LEVEL"),
priority=5, priority=5,
@ -97,33 +106,27 @@ _unban_matcher = on_alconna(
_status_matcher = on_alconna( _status_matcher = on_alconna(
Alconna( Alconna(
"ban-status", "ban列表",
Option("-u|--user", action=store_true, help_text="过滤用户"), Option("-u", Args["user_id", str], help_text="查找用户"),
Option("-g|--group", action=store_true, help_text="过滤群组"), Option("-g", Args["group_id", str], help_text="查找群组"),
Option("--user", action=store_true, help_text="过滤用户"),
Option("--group", action=store_true, help_text="过滤群组"),
), ),
permission=SUPERUSER, permission=SUPERUSER,
priority=1, priority=1,
block=True, block=True,
) )
_status_matcher.shortcut(
"ban列表",
command="ban-status",
arguments=[],
prefix=True,
)
_status_matcher.shortcut( _status_matcher.shortcut(
"用户ban列表", "用户ban列表",
command="ban-status", command="ban列表",
arguments=["--user"], arguments=["--user"],
prefix=True, prefix=True,
) )
_status_matcher.shortcut( _status_matcher.shortcut(
"群组ban列表", "群组ban列表",
command="ban-status", command="ban列表",
arguments=["--group"], arguments=["--group"],
prefix=True, prefix=True,
) )
@ -131,8 +134,6 @@ _status_matcher.shortcut(
@_status_matcher.handle() @_status_matcher.handle()
async def _( async def _(
bot: Bot,
session: EventSession,
arparma: Arparma, arparma: Arparma,
user_id: Match[str], user_id: Match[str],
group_id: Match[str], group_id: Match[str],
@ -144,7 +145,7 @@ async def _(
filter_type = "group" filter_type = "group"
_user_id = user_id.result if user_id.available else None _user_id = user_id.result if user_id.available else None
_group_id = group_id.result if group_id.available else None _group_id = group_id.result if group_id.available else None
if image := await BanManage.build_ban_image(filter_type): if image := await BanManage.build_ban_image(filter_type, _user_id, _group_id):
await Image(image.pic2bytes()).finish(reply=True) await Image(image.pic2bytes()).finish(reply=True)
else: else:
await Text("数据为空捏...").finish(reply=True) await Text("数据为空捏...").finish(reply=True)
@ -164,9 +165,11 @@ async def _(
if isinstance(user.result, At): if isinstance(user.result, At):
user_id = user.result.target user_id = user.result.target
else: else:
if session.id1 not in bot.config.superusers:
await Text("权限不足捏...").finish(reply=True)
user_id = user.result user_id = user.result
_duration = duration.result * 60 if duration.available else -1 _duration = duration.result * 60 if duration.available else -1
if gid := session.id3 or session.id2: if (gid := session.id3 or session.id2) and not group_id.available:
if group_id.available: if group_id.available:
gid = group_id.result gid = group_id.result
await BanManage.ban( await BanManage.ban(
@ -181,7 +184,7 @@ async def _(
await MessageFactory( await MessageFactory(
[ [
Text(""), Text(""),
Mention(user_id), # type: ignore Mention(user_id) if isinstance(user.result, At) else Text(user_id), # type: ignore
Text(f" 狠狠惩戒了一番,一脚踢进了小黑屋!"), Text(f" 狠狠惩戒了一番,一脚踢进了小黑屋!"),
] ]
).finish(reply=True) ).finish(reply=True)
@ -211,34 +214,40 @@ async def _(
if isinstance(user.result, At): if isinstance(user.result, At):
user_id = user.result.target user_id = user.result.target
else: else:
if session.id1 not in bot.config.superusers:
await Text("权限不足捏...").finish(reply=True)
user_id = user.result user_id = user.result
if gid := session.id3 or session.id2: if gid := session.id3 or session.id2:
if group_id.available: if group_id.available:
gid = group_id.result gid = group_id.result
await BanManage.unban( if await BanManage.unban(
user_id, gid, session, session.id1 in bot.config.superusers user_id, gid, session, session.id1 in bot.config.superusers
) ):
logger.info( logger.info(
f"管理员UnBan", f"管理员UnBan",
arparma.header_result, arparma.header_result,
session=session, session=session,
target=f"{gid}:{user_id}", target=f"{gid}:{user_id}",
) )
await MessageFactory( await MessageFactory(
[ [
Text(""), Text(""),
Mention(user_id), # type: ignore Mention(user_id) if isinstance(user.result, At) else Text(user_id), # type: ignore
Text(f" 从黑屋中拉了出来并急救了一下!"), Text(f" 从黑屋中拉了出来并急救了一下!"),
] ]
).finish(reply=True) ).finish(reply=True)
else:
await Text(f"该用户不在黑名单中捏...").finish(reply=True)
elif session.id1 in bot.config.superusers: elif session.id1 in bot.config.superusers:
_group_id = group_id.result if group_id.available else None _group_id = group_id.result if group_id.available else None
await BanManage.unban(user_id, _group_id, session, True) if await BanManage.unban(user_id, _group_id, session, True):
logger.info( logger.info(
f"超级用户UnBan", f"超级用户UnBan",
arparma.header_result, arparma.header_result,
session=session, session=session,
target=f"{_group_id}:{user_id}", target=f"{_group_id}:{user_id}",
) )
at_msg = user_id if user_id else f"群组:{_group_id}" at_msg = user_id if user_id else f"群组:{_group_id}"
await Text(f"{at_msg} 从黑屋中拉了出来并急救了一下!").finish(reply=True) await Text(f"{at_msg} 从黑屋中拉了出来并急救了一下!").finish(reply=True)
else:
await Text(f"该用户不在黑名单中捏...").finish(reply=True)

View File

@ -14,22 +14,31 @@ class BanManage:
async def build_ban_image( async def build_ban_image(
cls, cls,
filter_type: Literal["group", "user"] | None, filter_type: Literal["group", "user"] | None,
user_id: str | None = None,
group_id: str | None = None,
) -> BuildImage | None: ) -> BuildImage | None:
"""构造Ban列表图片 """构造Ban列表图片
参数: 参数:
filter_type: 过滤类型 filter_type: 过滤类型
user_id: 用户id
group_id: 群组id
返回: 返回:
BuildImage | None: Ban列表图片 BuildImage | None: Ban列表图片
""" """
data_list = None data_list = None
if not filter_type: query = BanConsole
data_list = await BanConsole.all() if user_id:
elif filter_type == "user": query = query.filter(user_id=user_id)
data_list = await BanConsole.filter(group_id__isnull=True).all() elif group_id:
elif filter_type == "group": query = query.filter(group_id=group_id)
data_list = await BanConsole.filter(user_id__isnull=True).all() else:
if filter_type == "user":
query = query.filter(group_id__isnull=True)
elif filter_type == "group":
query = query.filter(user_id__isnull=True)
data_list = await query.all()
if not data_list: if not data_list:
return None return None
column_name = [ column_name = [

View File

@ -10,6 +10,7 @@ from nonebot_plugin_session import EventSession
from pydantic import BaseModel from pydantic import BaseModel
from zhenxun.configs.config import Config from zhenxun.configs.config import Config
from zhenxun.models.ban_console import BanConsole
from zhenxun.models.group_console import GroupConsole from zhenxun.models.group_console import GroupConsole
from zhenxun.models.level_user import LevelUser from zhenxun.models.level_user import LevelUser
from zhenxun.models.plugin_info import PluginInfo from zhenxun.models.plugin_info import PluginInfo

View File

@ -34,6 +34,11 @@ async def _(
return return
user_id = session.id1 user_id = session.id1
group_id = session.id3 or session.id2 group_id = session.id3 or session.id2
if group_id:
if user_id in bot.config.superusers:
return
if await BanConsole.is_ban(None, group_id):
raise IgnoredException("群组处于黑名单中...")
if user_id: if user_id:
ban_result = Config.get_config("hook", "BAN_RESULT") ban_result = Config.get_config("hook", "BAN_RESULT")
if user_id in bot.config.superusers: if user_id in bot.config.superusers:
@ -62,4 +67,4 @@ async def _(
Text(f"{ban_result}\n在..在 {time_str} 后才会理你喔"), Text(f"{ban_result}\n在..在 {time_str} 后才会理你喔"),
] ]
).send() ).send()
raise IgnoredException("用户处于黑名单中") raise IgnoredException("用户处于黑名单中...")

View File

@ -116,7 +116,7 @@ class BanConsole(Model):
if await cls.check_ban_time(user_id, group_id): if await cls.check_ban_time(user_id, group_id):
return True return True
else: else:
if await cls.check_ban_time(user_id): if await cls.check_ban_time(user_id, group_id):
return True return True
await cls.unban(user_id, group_id) await cls.unban(user_id, group_id)
return False return False
@ -140,7 +140,7 @@ class BanConsole(Model):
operator: 操作者id operator: 操作者id
""" """
logger.debug( logger.debug(
f"封禁用户,等级:{ban_level},时长: {duration}", f"封禁用户/群组,等级:{ban_level},时长: {duration}",
target=f"{group_id}:{user_id}", target=f"{group_id}:{user_id}",
) )
user = await cls._get_data(user_id, group_id) user = await cls._get_data(user_id, group_id)