"""群管理工具 —— 禁言相关。""" from __future__ import annotations import math import random from nonebot import logger, on_fullmatch, on_message, on_regex, on_startswith, require from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent, MessageEvent from nonebot.rule import Rule, is_type from nonebot_plugin_alconna import UniMessage from hexi.core.custom_utils import check_manage from ...services.moderation import group_silence, member_silence, silence from ...utils.message import get_at_id, has_at_all from ...utils.permissions import check_perm from ...utils.text import parse_seconds, strip_prefix require("nonebot_plugin_alconna") def _is_ban_cmd(event: GroupMessageEvent) -> bool: text = event.message.extract_plain_text() return text.startswith("禁言") and not text.startswith("禁言一下") ban_user = on_message(rule=Rule(_is_ban_cmd) & is_type(GroupMessageEvent), block=True) ban_member = on_startswith(("来发口球", "塞口球", "禁言一下")) one_for_one = on_startswith("极限一换一") cancel_ban = on_startswith(("解除口球", "取消口球", "摘口球", "脱口球", "取消禁言", "解除禁言", "解禁")) ban_all = on_fullmatch(("全员口球", "全员禁言")) cancel_ban_all = on_fullmatch(("取消全员口球", "取消全员禁言", "解除全员口球", "解除全员禁言")) sleep_8h = on_fullmatch(("睡眠套餐", "休眠套餐", "精致睡眠", "来一份精致睡眠套餐")) tea = on_regex(r"(来|來)(.*(份|个)(.*)(睡|茶)(.*))套餐") @ban_user.handle() async def ban_user_handle(bot: Bot, ev: GroupMessageEvent): if not await check_perm(bot, ev, silent=True): return msg = ev.message.extract_plain_text().removeprefix("禁言").strip() at_seg = next( (seg for seg in ev.message if seg.type == "at" and seg.data.get("qq") != "all"), None, ) if not at_seg: return try: uid = int(at_seg.data["qq"]) minutes = 1 if not msg else int(msg) await bot.set_group_ban(group_id=ev.group_id, user_id=uid, duration=minutes * 60) await UniMessage.text("我好了").send() except Exception as ex: logger.error(ex) @ban_member.handle() async def ban_member_handle(bot: Bot, ev: GroupMessageEvent): uid = ev.user_id gid = ev.group_id duration_text = strip_prefix( ev.message.extract_plain_text(), ("来发口球", "塞口球", "禁言一下") ) if not duration_text: duration_text = "30" if has_at_all(ev): await group_silence(bot, ev, gid, True) return sid = get_at_id(ev) or uid await member_silence(bot, ev, uid, sid, gid, duration_text, silent=False) @one_for_one.handle() async def one_for_one_handle(bot: Bot, ev: GroupMessageEvent): uid = ev.user_id gid = ev.group_id duration_text = strip_prefix(ev.message.extract_plain_text(), ("极限一换一",)) if has_at_all(ev): await UniMessage.text("人干事?").send(at_sender=True) await member_silence(bot, ev, uid, uid, gid, "180", silent=False) return seconds = parse_seconds(duration_text) if seconds is None: await UniMessage.text("请输入正确时长~").send(at_sender=True) return if seconds > 30: await UniMessage.text("时长不可大于30秒哟~").send(at_sender=True) return sid = get_at_id(ev) or uid await member_silence(bot, ev, uid, sid, gid, str(seconds), silent=True) await member_silence(bot, ev, uid, uid, gid, str(seconds), silent=True) await ( UniMessage.at(user_id=str(uid)) .text("成功一换一") .at(user_id=str(sid)) .text(f"{seconds}秒~") .send() ) @cancel_ban.handle() async def cancel_ban_handle(bot: Bot, ev: GroupMessageEvent): if not await check_manage(bot, ev): await UniMessage.text("权限不足").send() return uid = ev.user_id gid = ev.group_id if has_at_all(ev): await group_silence(bot, ev, gid, False) return sid = get_at_id(ev) if sid is None: await UniMessage.text("请@需要摘口球的群员哦w").send() return await member_silence(bot, ev, uid, sid, gid, "0", silent=False) @ban_all.handle() async def ban_all_handle(bot: Bot, ev: GroupMessageEvent): if not await check_manage(bot, ev): await UniMessage.text("权限不足").send() return await group_silence(bot, ev, ev.group_id, True) @cancel_ban_all.handle() async def cancel_ban_all_handle(bot: Bot, ev: GroupMessageEvent): if not await check_manage(bot, ev): await UniMessage.text("权限不足").send() return await group_silence(bot, ev, ev.group_id, False) @sleep_8h.handle() async def sleep_8h_handle(bot: Bot, ev: MessageEvent): await silence(bot, ev, 8 * 60 * 60) @tea.handle() async def tea_handle(bot: Bot, ev: MessageEvent): base = 0 if "午" in ev.plain_text else 5 * 60 * 60 length = len(ev.plain_text) sleep_time = base + round(math.sqrt(length) * 60 * 30 + 60 * random.randint(-15, 15)) await silence(bot, ev, sleep_time)