diff options
Diffstat (limited to 'ATRI/plugins/essential.py')
-rw-r--r-- | ATRI/plugins/essential.py | 160 |
1 files changed, 121 insertions, 39 deletions
diff --git a/ATRI/plugins/essential.py b/ATRI/plugins/essential.py index 80a1c97..c48d540 100644 --- a/ATRI/plugins/essential.py +++ b/ATRI/plugins/essential.py @@ -4,10 +4,17 @@ import json import shutil from pathlib import Path from random import choice +from datetime import datetime -from nonebot.adapters import Bot +from nonebot.typing import T_State +from nonebot.matcher import Matcher +from nonebot.message import run_preprocessor +from nonebot.exception import IgnoredException from nonebot.adapters.cqhttp.message import Message from nonebot.adapters.cqhttp import ( + Bot, + MessageEvent, + GroupMessageEvent, FriendRequestEvent, GroupRequestEvent, GroupIncreaseNoticeEvent, @@ -24,12 +31,14 @@ import ATRI from ATRI.log import logger from ATRI.exceptions import WriteError from ATRI.config import Config -from ATRI.rule import is_block from ATRI.service import Service as sv from ATRI.utils.cqcode import coolq_code_check PLUGIN_INFO_DIR = Path('.') / 'ATRI' / 'data' / 'service' / 'services' +ESSENTIAL_DIR = Path('.') / 'ATRI' / 'data' / 'database' / 'essential' +os.makedirs(PLUGIN_INFO_DIR, exist_ok=True) +os.makedirs(ESSENTIAL_DIR, exist_ok=True) driver = ATRI.driver() @@ -79,11 +88,86 @@ async def disconnect(bot) -> None: logger.error("WebSocket 已断开,等待重连") -ESSENTIAL_DIR = Path('.') / 'ATRI' / 'data' / 'database' / 'essential' -os.makedirs(ESSENTIAL_DIR, exist_ok=True) +@run_preprocessor # type: ignore +async def _idk(matcher: Matcher, + bot: Bot, + event: MessageEvent, + state: T_State) -> None: + user = str(event.user_id) + if not sv.BlockSystem.auth_user(user): + raise IgnoredException(f'Block user: {user}') + + if not sv.Dormant.is_dormant(): + raise IgnoredException('Bot has been dormant.') + + if isinstance(event, GroupMessageEvent): + group = str(event.group_id) + if not sv.BlockSystem.auth_group(group): + raise IgnoredException(f'Block group: {group}') + +@run_preprocessor # type: ignore +async def _store_message(matcher: Matcher, + bot: Bot, + event, + state: T_State) -> None: + if isinstance(event, GroupMessageEvent): + group = str(event.group_id) + + if event.sub_type == "normal": + now_time = datetime.now().strftime('%Y-%m-%d') + GROUP_DIR = ESSENTIAL_DIR / 'chat_history' / f'{event.group_id}' + os.makedirs(GROUP_DIR, exist_ok=True) + path = GROUP_DIR / f"{now_time}.chat.json" + now_time = datetime.now().strftime('%Y%m%d-%H%M%S') + + try: + data = json.loads(path.read_bytes()) + except: + data = {} + data[event.message_id] = { + "date": now_time, + "time": str(time.time()), + "post_type": str(event.post_type), + "sub_type": str(event.sub_type), + "user_id": str(event.user_id), + "group_id": str(event.group_id), + "message_type": str(event.message_type), + "message": str(event.message), + "raw_message": event.raw_message, + "font": str(event.font), + "sender": { + "user_id": str(event.sender.user_id), + "nickname": event.sender.nickname, + "sex": event.sender.sex, + "age": str(event.sender.age), + "card": event.sender.card, + "area": event.sender.area, + "level": event.sender.level, + "role": event.sender.role, + "title": event.sender.title + }, + "to_me": event.to_me + } + try: + with open(path, 'w', encoding='utf-8') as r: + r.write(json.dumps(data, indent=4)) + logger.debug(f"写入消息成功,id: {event.message_id}") + except WriteError: + logger.error("消息记录失败,可能是缺少文件的原因!") + else: + pass + else: + pass + + if sv.BlockSystem.auth_group(group): + return + else: + pass + + # 处理:好友请求 -request_friend_event = sv.on_request(rule=is_block()) +request_friend_event = sv.on_request() @request_friend_event.handle() async def _request_friend_event(bot, event: FriendRequestEvent) -> None: @@ -123,7 +207,7 @@ async def _request_friend_event(bot, event: FriendRequestEvent) -> None: # 处理:邀请入群,如身为管理,还附有入群请求 -request_group_event = sv.on_request(rule=is_block()) +request_group_event = sv.on_request() @request_group_event.handle() async def _request_group_event(bot, event: GroupRequestEvent) -> None: @@ -197,11 +281,13 @@ group_admin_event = sv.on_notice() @group_admin_event.handle() async def _group_admin_event(bot: Bot, event: GroupAdminNoticeEvent) -> None: if event.is_tome(): - for superuser in Config.BotSelfConfig.superusers: - await sv.NetworkPost.send_private_msg( - user_id=int(superuser), - message=f"好欸!主人!我在群 {event.group_id} 成为了管理!!" - ) + return + + for superuser in Config.BotSelfConfig.superusers: + await sv.NetworkPost.send_private_msg( + user_id=int(superuser), + message=f"好欸!主人!我在群 {event.group_id} 成为了管理!!" + ) # 处理群禁言事件 @@ -209,28 +295,30 @@ group_ban_event = sv.on_notice() @group_ban_event.handle() async def _group_ban_event(bot: Bot, event: GroupBanNoticeEvent) -> None: - if event.is_tome(): - if event.duration: - msg = ( - "那个..。,主人\n" - f"咱在群 {event.group_id} 被 {event.operator_id} 塞上了口球...\n" - f"时长...是 {event.duration} 秒" + if not event.is_tome(): + return + + if event.duration: + msg = ( + "那个..。,主人\n" + f"咱在群 {event.group_id} 被 {event.operator_id} 塞上了口球...\n" + f"时长...是 {event.duration} 秒" + ) + for superuser in Config.BotSelfConfig.superusers: + await sv.NetworkPost.send_private_msg( + user_id=int(superuser), + message=msg ) - for superuser in Config.BotSelfConfig.superusers: - await sv.NetworkPost.send_private_msg( - user_id=int(superuser), - message=msg - ) - else: - msg = ( - "好欸!主人\n" - f"咱在群 {event.group_id} 被 {event.operator_id} 上的口球解除了!" + else: + msg = ( + "好欸!主人\n" + f"咱在群 {event.group_id} 被 {event.operator_id} 上的口球解除了!" + ) + for superuser in Config.BotSelfConfig.superusers: + await sv.NetworkPost.send_private_msg( + user_id=int(superuser), + message=msg ) - for superuser in Config.BotSelfConfig.superusers: - await sv.NetworkPost.send_private_msg( - user_id=int(superuser), - message=msg - ) # 处理群红包运气王事件 @@ -260,10 +348,7 @@ recall_event = sv.on_notice() @recall_event.handle() async def _recall_event(bot: Bot, event: GroupRecallNoticeEvent) -> None: group = event.group_id - repo = await bot.call_api( - "get_msg", - message_id=event.message_id - ) + repo = await bot.get_msg(message_id=event.message_id) repo = str(repo["message"]) check = await coolq_code_check(repo, group=group) if not check: @@ -286,10 +371,7 @@ async def _recall_event(bot: Bot, event: GroupRecallNoticeEvent) -> None: @recall_event.handle() async def _rec(bot: Bot, event: FriendRecallNoticeEvent) -> None: user = event.user_id - repo = await bot.call_api( - "get_msg", - message_id=event.message_id - ) + repo = await bot.get_msg(message_id=event.message_id) repo = str(repo["message"]) check = await coolq_code_check(repo, user) if not check: |