feat✨: 更新内置插件

This commit is contained in:
HibiKier
2024-02-25 03:18:34 +08:00
parent 131200a28e
commit eb0572ea77
83 changed files with 7588 additions and 450 deletions
@@ -0,0 +1,196 @@
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)
@@ -0,0 +1,120 @@
import time
from nonebot_plugin_session import EventSession
from zhenxun.models.ban_console import BanConsole
from zhenxun.models.level_user import LevelUser
from zhenxun.utils.image_utils import ImageTemplate
class BanManage:
@classmethod
async def build_ban_image(cls, user_id: str | None, group_id: str | None):
data_list = None
if not user_id and not group_id:
data_list = await BanConsole.all()
elif user_id:
if group_id:
data_list = await BanConsole.filter(
user_id=user_id, group_id=group_id
).all()
else:
data_list = await BanConsole.filter(
user_id=user_id, group_id__isnull=True
).all()
else:
if group_id:
data_list = await BanConsole.filter(
user_id__isnull=True, group_id=group_id
).all()
if not data_list:
return None
column_name = [
"ID",
"用户ID",
"群组ID",
"BAN LEVEL",
"剩余时长(分钟)",
"操作员ID",
]
row_data = []
for data in data_list:
duration = int((data.ban_time + data.duration - time.time()) / 60)
if duration < 0:
duration = 0
row_data.append(
[
data.id,
data.user_id,
data.group_id,
data.ban_level,
duration,
data.operator,
]
)
return await ImageTemplate.table_page(
"Ban / UnBan 列表", "在黑屋中狠狠调教!", column_name, row_data
)
@classmethod
async def is_ban(cls, user_id: str, group_id: str | None):
"""判断用户是否被ban
参数:
user_id: 用户id
返回:
bool: 是否被ban
"""
return await BanConsole.is_ban(user_id, group_id)
@classmethod
async def unban(
cls,
user_id: str | None,
group_id: str | None,
session: EventSession,
is_superuser: bool = False,
) -> bool:
"""ban掉目标用户
参数:
user_id: 用户id
group_id: 群组id
session: Session
is_superuser: 是否为超级用户操作
返回:
bool: 是否unban成功
"""
user_level = 9999
if not is_superuser and user_id and session.id1:
user_level = await LevelUser.get_user_level(session.id1, group_id)
if await BanConsole.check_ban_level(user_id, group_id, user_level):
await BanConsole.unban(user_id, group_id)
return True
return False
@classmethod
async def ban(
cls,
user_id: str | None,
group_id: str | None,
duration: int,
session: EventSession,
is_superuser: bool,
):
"""ban掉目标用户
参数:
user_id: 用户id
group_id: 群组id
duration: 时长,秒
session: Session
is_superuser: 是否为超级用户操作
"""
level = 9999
if not is_superuser and user_id and session.id1:
level = await LevelUser.get_user_level(session.id1, group_id)
await BanConsole.ban(user_id, group_id, level, duration, session.id1)