summaryrefslogtreecommitdiff
path: root/ATRI/plugins/essential/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'ATRI/plugins/essential/__init__.py')
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)