mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-15 14:22:55 +08:00
197 lines
5.6 KiB
Python
197 lines
5.6 KiB
Python
from arclet.alconna import Args
|
|
from nonebot.adapters import Bot
|
|
from nonebot.permission import SUPERUSER
|
|
from nonebot.plugin import PluginMetadata
|
|
from nonebot_plugin_alconna import (
|
|
Alconna,
|
|
Arparma,
|
|
At,
|
|
Match,
|
|
Option,
|
|
Subcommand,
|
|
on_alconna,
|
|
store_true,
|
|
)
|
|
from nonebot_plugin_saa import Image, Mention, MessageFactory, Text
|
|
from nonebot_plugin_session import EventSession
|
|
|
|
from zhenxun.configs.config import Config
|
|
from zhenxun.configs.utils import PluginExtraData, RegisterConfig
|
|
from zhenxun.services.log import logger
|
|
from zhenxun.utils.enum import PluginType
|
|
from zhenxun.utils.rules import admin_check
|
|
|
|
from ._data_source import BanManage
|
|
|
|
base_config = Config.get("ban")
|
|
|
|
__plugin_meta__ = PluginMetadata(
|
|
name="封禁用户/群组",
|
|
description="你被逮捕了!丢进小黑屋!封禁用户以及群组,屏蔽消息",
|
|
usage="""
|
|
.ban [at] ?[小时] ?[分钟]
|
|
.unban
|
|
示例:.ban @user
|
|
示例:.ban @user 6
|
|
示例:.ban @user 3 10
|
|
示例:.unban @user
|
|
""".strip(),
|
|
extra=PluginExtraData(
|
|
author="HibiKier",
|
|
version="0.1",
|
|
plugin_type=PluginType.SUPER_AND_ADMIN,
|
|
admin_level=base_config.get("BAN_LEVEL", 5),
|
|
configs=[
|
|
RegisterConfig(
|
|
key="BAN_LEVEL",
|
|
value=5,
|
|
help="ban/unban所需要的管理员权限等级",
|
|
default_value=5,
|
|
type=int,
|
|
)
|
|
],
|
|
).dict(),
|
|
)
|
|
|
|
|
|
_matcher = on_alconna(
|
|
Alconna(
|
|
"ban-console",
|
|
Subcommand(
|
|
"ban",
|
|
Args["user?", [str, At]]["duration?", int],
|
|
Option("-g|--group", Args["group_id", str]),
|
|
),
|
|
Subcommand(
|
|
"unban",
|
|
Args["user?", [str, At]],
|
|
Option("-g|--group", Args["group_id", str]),
|
|
),
|
|
),
|
|
rule=admin_check("ban", "BAN_LEVEL"),
|
|
priority=5,
|
|
block=True,
|
|
)
|
|
|
|
_status_matcher = on_alconna(
|
|
Alconna(
|
|
"ban-status",
|
|
Option("-u|--user", Args["user_id", str]),
|
|
Option("-g|--group", Args["group_id", str]),
|
|
),
|
|
permission=SUPERUSER,
|
|
priority=1,
|
|
block=True,
|
|
)
|
|
# TODO: shortcut
|
|
|
|
|
|
@_status_matcher.handle()
|
|
async def _(
|
|
bot: Bot,
|
|
session: EventSession,
|
|
arparma: Arparma,
|
|
user_id: Match[str],
|
|
group_id: Match[str],
|
|
):
|
|
_user_id = user_id.result if user_id.available else None
|
|
_group_id = group_id.result if group_id.available else None
|
|
if image := await BanManage.build_ban_image(_user_id, _group_id):
|
|
await Image(image.pic2bs4()).finish(reply=True)
|
|
else:
|
|
await Text("数据为空捏...").finish(reply=True)
|
|
|
|
|
|
@_matcher.assign("ban")
|
|
async def _(
|
|
bot: Bot,
|
|
session: EventSession,
|
|
arparma: Arparma,
|
|
user: Match[str | At],
|
|
duration: Match[int],
|
|
group_id: Match[str],
|
|
):
|
|
user_id = None
|
|
if user.available:
|
|
if isinstance(user.result, At):
|
|
user_id = user.result.target
|
|
else:
|
|
user_id = user.result
|
|
_duration = duration.result * 60 if duration.available else -1
|
|
if gid := session.id3 or session.id2:
|
|
if group_id.available:
|
|
gid = group_id.result
|
|
await BanManage.ban(
|
|
user_id, gid, _duration, session, session.id1 in bot.config.superusers
|
|
)
|
|
logger.info(
|
|
f"管理员Ban",
|
|
arparma.header_result,
|
|
session=session,
|
|
target=f"{gid}:{user_id}",
|
|
)
|
|
await MessageFactory(
|
|
[
|
|
Text("对 "),
|
|
Mention(user_id), # type: ignore
|
|
Text(f" 狠狠惩戒了一番,一脚踢进了小黑屋!"),
|
|
]
|
|
).finish(reply=True)
|
|
elif session.id1 in bot.config.superusers:
|
|
_group_id = group_id.result if group_id.available else None
|
|
await BanManage.ban(user_id, _group_id, _duration, session, True)
|
|
logger.info(
|
|
f"超级用户Ban",
|
|
arparma.header_result,
|
|
session=session,
|
|
target=f"{_group_id}:{user_id}",
|
|
)
|
|
at_msg = user_id if user_id else f"群组:{_group_id}"
|
|
await Text(f"对 {at_msg} 狠狠惩戒了一番,一脚踢进了小黑屋!").finish(reply=True)
|
|
|
|
|
|
@_matcher.assign("unban")
|
|
async def _(
|
|
bot: Bot,
|
|
session: EventSession,
|
|
arparma: Arparma,
|
|
user: Match[str | At],
|
|
group_id: Match[str],
|
|
):
|
|
user_id = None
|
|
if user.available:
|
|
if isinstance(user.result, At):
|
|
user_id = user.result.target
|
|
else:
|
|
user_id = user.result
|
|
if gid := session.id3 or session.id2:
|
|
if group_id.available:
|
|
gid = group_id.result
|
|
await BanManage.unban(
|
|
user_id, gid, session, session.id1 in bot.config.superusers
|
|
)
|
|
logger.info(
|
|
f"管理员UnBan",
|
|
arparma.header_result,
|
|
session=session,
|
|
target=f"{gid}:{user_id}",
|
|
)
|
|
await MessageFactory(
|
|
[
|
|
Text("将 "),
|
|
Mention(user_id), # type: ignore
|
|
Text(f" 从黑屋中拉了出来并急救了一下!"),
|
|
]
|
|
).finish(reply=True)
|
|
elif session.id1 in bot.config.superusers:
|
|
_group_id = group_id.result if group_id.available else None
|
|
await BanManage.unban(user_id, _group_id, session, True)
|
|
logger.info(
|
|
f"超级用户UnBan",
|
|
arparma.header_result,
|
|
session=session,
|
|
target=f"{_group_id}:{user_id}",
|
|
)
|
|
at_msg = user_id if user_id else f"群组:{_group_id}"
|
|
await Text(f"对 {at_msg} 从黑屋中拉了出来并急救了一下!").finish(reply=True)
|