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