diff options
Diffstat (limited to 'ATRI/plugins/essential/__init__.py')
-rw-r--r-- | ATRI/plugins/essential/__init__.py | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/ATRI/plugins/essential/__init__.py b/ATRI/plugins/essential/__init__.py new file mode 100644 index 0000000..4635583 --- /dev/null +++ b/ATRI/plugins/essential/__init__.py @@ -0,0 +1,274 @@ +import json +import shutil +import asyncio +from pathlib import Path +from datetime import datetime +from random import choice, randint + +from nonebot.adapters.onebot.v11 import ( + Bot, + MessageEvent, + FriendRequestEvent, + GroupRequestEvent, + GroupIncreaseNoticeEvent, + GroupDecreaseNoticeEvent, + GroupAdminNoticeEvent, + GroupBanNoticeEvent, + GroupRecallNoticeEvent, + FriendRecallNoticeEvent, +) + +from ATRI import conf +from ATRI.log import log +from ATRI.service import Service +from ATRI.utils.apscheduler import scheduler +from ATRI.utils import FileDealer, MessageChecker +from ATRI.permission import MASTER +from ATRI.message import MessageBuilder + +from .models import RequestInfo +from .data_source import recall_msg_dealer + + +__ESSENTIAL_DIR = Path(".") / "data" / "plugins" / "essential" +__TEMP_DIR = Path(".") / "data" / "temp" +__ESSENTIAL_DIR.mkdir(parents=True, exist_ok=True) +__TEMP_DIR.mkdir(parents=True, exist_ok=True) + +# __REJECT_RECALL_LIST = list() + + +plugin = Service("基础部件").document("对基础请求进行处理") + + +friend_add_event = plugin.on_request("好友申请", "好友申请检测") + + +@friend_add_event.handle() +async def _(event: FriendRequestEvent): + path = __ESSENTIAL_DIR / "friend_add.json" + file = FileDealer(path) + if not path.is_file(): + await file.write(json.dumps(dict())) + data = dict() + + apply_code = event.flag + user_id = event.get_user_id() + apply_comment = event.comment + now_time = str(datetime.now().timestamp()) + + data = file.json() + data[apply_code] = RequestInfo( + user_id=user_id, + comment=apply_comment, + time=now_time, + ) + await file.write(json.dumps(data)) + + result = ( + MessageBuilder("咱收到一条好友请求!") + .text(f"请求人: {user_id}") + .text(f"申请信息: {apply_comment}") + .text(f"申请码: {apply_code}") + .text("Tip: 好友申请列表") + ) + await plugin.send_to_master(result) + + +group_invite_request = plugin.on_request("应邀入群", "应邀入群检测") + + +@group_invite_request.handle() +async def _(event: GroupRequestEvent): + path = __ESSENTIAL_DIR / "group_invite.json" + file = FileDealer(path) + if not path.is_file(): + await file.write(json.dumps(dict())) + data = dict() + + apply_code = event.flag + user_id = event.get_user_id() + apply_comment = event.comment + now_time = str(datetime.now().timestamp()) + + data = file.json() + data[apply_code] = RequestInfo( + user_id=user_id, + comment=apply_comment, + time=now_time, + ) + await file.write(json.dumps(data)) + + result = ( + MessageBuilder("咱收到一条应邀入群请求!") + .text(f"申请人: {user_id}") + .text(f"申请信息: {apply_comment}") + .text(f"申请码: {apply_code}") + .text("Tip: 应邀入群列表") + ) + await plugin.send_to_master(result) + + +group_member_event = plugin.on_notice("群成员变动", "群成员变动检测") + + +@group_member_event.handle() +async def _(event: GroupIncreaseNoticeEvent): + await asyncio.sleep(randint(1, 6)) + await group_member_event.finish( + MessageBuilder("好欸! 事新人!").text(f"在下 {choice(list(conf.BotConfig.nickname))}") + ) + + +@group_member_event.handle() +async def _(event: GroupDecreaseNoticeEvent): + await asyncio.sleep(randint(1, 6)) + await group_member_event.finish("呜——有人跑了...") + + +group_admin_event = plugin.on_notice("群管理变动", "群管理变动检测") + + +@group_admin_event.handle() +async def _(event: GroupAdminNoticeEvent): + sub_type = event.sub_type + if event.is_tome() and sub_type == "set": + await plugin.send_to_master(f"好欸! 咱在群 {event.group_id} 成为了管理!!") + return + elif sub_type == "set": + await group_admin_event.finish("新的py交易已达成") + else: + await group_admin_event.finish("有的人超能力到期了 (") + + +group_ban_event = plugin.on_notice("群禁言变动", "群禁言变动检测") + + +@group_ban_event.handle() +async def _(event: GroupBanNoticeEvent): + if not event.is_tome(): + await group_ban_event.finish("群友喝下管理的红茶昏睡了过去") + + if event.duration: + await plugin.send_to_master( + MessageBuilder("那个...") + .text(f"咱在群 {event.group_id} 被 {event.operator_id} 塞上了口球...") + .text(f"时长...是 {event.duration} 秒") + ) + else: + await plugin.send_to_master( + MessageBuilder("好欸!").text( + f"咱在群 {event.group_id} 的口球被 {event.operator_id} 解除了!" + ) + ) + + +_acc_recall = True + + +recall_event = plugin.on_notice("撤回事件", "撤回事件检测") + + +@recall_event.handle() +async def _(bot: Bot, event: FriendRecallNoticeEvent): + if event.is_tome() and not _acc_recall: + return + + try: + repo = await bot.get_msg(message_id=event.message_id) + except Exception: + return + + log.debug(f"Recall raw msg:\n{repo}") + user = event.user_id + repo = repo["message"] + + try: + m = recall_msg_dealer(repo) + except Exception: + check = MessageChecker(repo).check_cq_code + if not check: + m = repo + else: + return + + await plugin.send_to_master( + MessageBuilder("咱拿到了一条撤回信息!").text(f"{user}@[私聊]").text(f"撤回了\n{m}") + ) + + +@recall_event.handle() +async def _(bot: Bot, event: GroupRecallNoticeEvent): + if event.is_tome() and not _acc_recall: + return + + try: + repo = await bot.get_msg(message_id=event.message_id) + except Exception: + return + + log.debug(f"Recall raw msg:\n{repo}") + user = event.user_id + group = event.group_id + repo = repo["message"] + + try: + m = recall_msg_dealer(repo) + except Exception: + check = MessageChecker(repo).check_cq_code + if not check: + m = repo + else: + return + await plugin.send_to_master( + MessageBuilder("咱拿到了一条撤回信息!").text(f"{user}@[群:{group}]").text(f"撤回了\n{m}") + ) + + +reject_recall = plugin.on_command("拒绝撤回", "拒绝撤回信息", permission=MASTER) + + +@reject_recall.handle() +async def _(event: MessageEvent): + # global __REJECT_RECALL_LIST + + # user_id = event.get_user_id() + # if not user_id in __REJECT_RECALL_LIST: + # __REJECT_RECALL_LIST.append(user_id) + global _acc_recall + + _acc_recall = False + await reject_recall.finish("完成~") + + +accept_recall = plugin.on_command("接受撤回", "拒绝撤回信息", permission=MASTER) + + +@accept_recall.handle() +async def _(event: MessageEvent): + # global __REJECT_RECALL_LIST + + # user_id = event.get_user_id() + # if user_id in __REJECT_RECALL_LIST: + # __REJECT_RECALL_LIST.remove(user_id) + global _acc_recall + + _acc_recall = True + await accept_recall.finish("完成~") + + +@scheduler.scheduled_job("interval", name="清除缓存", minutes=30, misfire_grace_time=5) # type: ignore +async def _(): + try: + shutil.rmtree(__TEMP_DIR) + __TEMP_DIR.mkdir(parents=True, exist_ok=True) + except Exception: + log.warning("清除缓存失败, 请手动清除: data/temp") + + +from ATRI import driver + +from .listener import init_listener + + +driver().on_startup(init_listener) |