From 2c97902f4e394c3e5618c5626e1fa332de9ef6c4 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Wed, 9 Dec 2020 17:51:24 +0800 Subject: [PATCH] :construction: update cqhttp bot --- nonebot/adapters/cqhttp/bot.py | 39 ++++++++++++++++--------------- nonebot/adapters/cqhttp/bot.pyi | 2 +- nonebot/adapters/cqhttp/event.py | 40 ++++++++++++++++++-------------- nonebot/message.py | 28 ++++++---------------- 4 files changed, 51 insertions(+), 58 deletions(-) diff --git a/nonebot/adapters/cqhttp/bot.py b/nonebot/adapters/cqhttp/bot.py index e861aa91..e20dd094 100644 --- a/nonebot/adapters/cqhttp/bot.py +++ b/nonebot/adapters/cqhttp/bot.py @@ -14,13 +14,13 @@ from nonebot.message import handle_event from nonebot.adapters import Bot as BaseBot from nonebot.exception import RequestDenied -from .event import Event +from .utils import log +from .event import Reply, CQHTTPEvent, MessageEvent from .message import Message, MessageSegment from .exception import NetworkError, ApiNotAvailable, ActionFailed -from .utils import log if TYPE_CHECKING: - from nonebot.drivers import BaseDriver as Driver, BaseWebSocket as WebSocket + from nonebot.drivers import Driver, WebSocket def get_auth_bearer(access_token: Optional[str] = None) -> Optional[str]: @@ -32,7 +32,7 @@ def get_auth_bearer(access_token: Optional[str] = None) -> Optional[str]: return param -async def _check_reply(bot: "Bot", event: "Event"): +async def _check_reply(bot: "Bot", event: "CQHTTPEvent"): """ :说明: @@ -41,9 +41,9 @@ async def _check_reply(bot: "Bot", event: "Event"): :参数: * ``bot: Bot``: Bot 对象 - * ``event: Event``: Event 对象 + * ``event: CQHTTPEvent``: CQHTTPEvent 对象 """ - if event.type != "message": + if not isinstance(event, MessageEvent): return try: @@ -52,9 +52,10 @@ async def _check_reply(bot: "Bot", event: "Event"): except ValueError: return msg_seg = event.message[index] - event.reply = await bot.get_msg(message_id=msg_seg.data["id"]) + event.reply = Reply.parse_obj(await + bot.get_msg(message_id=msg_seg.data["id"])) # ensure string comparation - if str(event.reply["sender"]["user_id"]) == str(event.self_id): + if str(event.reply.sender.user_id) == str(event.self_id): event.to_me = True del event.message[index] if len(event.message) > index and event.message[index].type == "at": @@ -68,7 +69,7 @@ async def _check_reply(bot: "Bot", event: "Event"): event.message.append(MessageSegment.text("")) -def _check_at_me(bot: "Bot", event: "Event"): +def _check_at_me(bot: "Bot", event: "CQHTTPEvent"): """ :说明: @@ -77,12 +78,12 @@ def _check_at_me(bot: "Bot", event: "Event"): :参数: * ``bot: Bot``: Bot 对象 - * ``event: Event``: Event 对象 + * ``event: CQHTTPEvent``: CQHTTPEvent 对象 """ - if event.type != "message": + if not isinstance(event, MessageEvent): return - if event.detail_type == "private": + if event.message_type == "private": event.to_me = True else: at_me_seg = MessageSegment.at(event.self_id) @@ -122,7 +123,7 @@ def _check_at_me(bot: "Bot", event: "Event"): event.message.append(MessageSegment.text("")) -def _check_nickname(bot: "Bot", event: "Event"): +def _check_nickname(bot: "Bot", event: "CQHTTPEvent"): """ :说明: @@ -131,9 +132,9 @@ def _check_nickname(bot: "Bot", event: "Event"): :参数: * ``bot: Bot``: Bot 对象 - * ``event: Event``: Event 对象 + * ``event: CQHTTPEvent``: CQHTTPEvent 对象 """ - if event.type != "message": + if not isinstance(event, MessageEvent): return first_msg_seg = event.message[0] @@ -286,7 +287,7 @@ class Bot(BaseBot): """ :说明: - 调用 `_check_reply <#async-check-reply-bot-event>`_, `_check_at_me <#check-at-me-bot-event>`_, `_check_nickname <#check-nickname-bot-event>`_ 处理事件并转换为 `Event <#class-event>`_ + 调用 `_check_reply <#async-check-reply-bot-event>`_, `_check_at_me <#check-at-me-bot-event>`_, `_check_nickname <#check-nickname-bot-event>`_ 处理事件并转换为 `CQHTTPEvent <#class-event>`_ """ if not message: return @@ -296,7 +297,7 @@ class Bot(BaseBot): return try: - event = Event(message) + event = CQHTTPEvent.parse_obj(message) # Check whether user is calling me await _check_reply(self, event) @@ -379,7 +380,7 @@ class Bot(BaseBot): @overrides(BaseBot) async def send(self, - event: Event, + event: CQHTTPEvent, message: Union[str, Message, MessageSegment], at_sender: bool = False, **kwargs) -> Any: @@ -390,7 +391,7 @@ class Bot(BaseBot): :参数: - * ``event: Event``: Event 对象 + * ``event: CQHTTPEvent``: CQHTTPEvent 对象 * ``message: Union[str, Message, MessageSegment]``: 要发送的消息 * ``at_sender: bool``: 是否 @ 事件主体 * ``**kwargs``: 覆盖默认参数 diff --git a/nonebot/adapters/cqhttp/bot.pyi b/nonebot/adapters/cqhttp/bot.pyi index 825432e8..7ba09f8a 100644 --- a/nonebot/adapters/cqhttp/bot.pyi +++ b/nonebot/adapters/cqhttp/bot.pyi @@ -3,7 +3,7 @@ from typing import Any, Dict, List, Union, Optional from nonebot.config import Config from nonebot.adapters import Bot as BaseBot -from nonebot.drivers import BaseDriver as Driver, BaseWebSocket as WebSocket +from nonebot.drivers import Driver, WebSocket from .event import Event from .message import Message, MessageSegment diff --git a/nonebot/adapters/cqhttp/event.py b/nonebot/adapters/cqhttp/event.py index a556875c..1b7976d6 100644 --- a/nonebot/adapters/cqhttp/event.py +++ b/nonebot/adapters/cqhttp/event.py @@ -210,14 +210,13 @@ from .message import Message class CQHTTPEvent(Event): - type: Literal["message", "notice", "request", "meta_event"] time: int self_id: int - post_type: str + post_type: Literal["message", "notice", "request", "meta_event"] @overrides(Event) def get_type(self) -> Literal["message", "notice", "request", "meta_event"]: - return self.type + return self.post_type @overrides(Event) def get_event_name(self) -> str: @@ -244,6 +243,18 @@ class Sender(BaseModel): extra = "allow" +class Reply(BaseModel): + time: int + message_type: str + message_id: int + real_id: int + sender: Sender + message: Message + + class Config: + extra = "allow" + + class Anonymous(BaseModel): id: int name: str @@ -274,7 +285,16 @@ class Status(BaseModel): # Message Events class MessageEvent(CQHTTPEvent): post_type: Literal["message"] + sub_type: str + user_id: int message_type: str + message_id: int + message: Message + raw_message: str + font: int + sender: Sender + to_me: bool = False + reply: Optional[Reply] = None @overrides(CQHTTPEvent) def get_event_name(self) -> str: @@ -285,13 +305,6 @@ class MessageEvent(CQHTTPEvent): class PrivateMessageEvent(MessageEvent): message_type: Literal["private"] - sub_type: str - user_id: int - message_id: int - message: Message - raw_message: str - font: int - sender: Sender @overrides(CQHTTPEvent) def get_event_description(self) -> str: @@ -304,14 +317,7 @@ class PrivateMessageEvent(MessageEvent): class GroupMessageEvent(MessageEvent): message_type: Literal["group"] - sub_type: str - user_id: int group_id: int - message_id: int - message: Message - raw_message: str - font: int - sender: Sender anonymous: Anonymous @overrides(CQHTTPEvent) diff --git a/nonebot/message.py b/nonebot/message.py index eb209a9c..b5cb689a 100644 --- a/nonebot/message.py +++ b/nonebot/message.py @@ -13,7 +13,7 @@ from nonebot.log import logger from nonebot.rule import TrieRule from nonebot.utils import escape_tag from nonebot.matcher import matchers, Matcher -from nonebot.exception import IgnoredException, StopPropagation +from nonebot.exception import IgnoredException, StopPropagation, NoLogException from nonebot.typing import State, EventPreProcessor, RunPreProcessor, EventPostProcessor, RunPostProcessor if TYPE_CHECKING: @@ -208,24 +208,10 @@ async def handle_event(bot: "Bot", event: "Event"): asyncio.create_task(handle_event(bot, event)) """ show_log = True - log_msg = f"{bot.type.upper()} | {event.self_id} [{event.name}]: " - if event.type == "message": - log_msg += f"Message {event.id} from " - log_msg += str(event.user_id) - if event.detail_type == "group": - log_msg += f"@[群:{event.group_id}]:" - - log_msg += ' "' + "".join( - map( - lambda x: escape_tag(str(x)) - if x.type == "text" else f"{escape_tag(str(x))}", - event.message)) + '"' # type: ignore - elif event.type == "notice": - log_msg += f"Notice {event.raw_event}" - elif event.type == "request": - log_msg += f"Request {event.raw_event}" - elif event.type == "meta_event": - # log_msg += f"MetaEvent {event.detail_type}" + log_msg = f"{bot.type.upper()} {bot.self_id} | " + try: + log_msg += event.get_log_string() + except NoLogException: show_log = False if show_log: logger.opt(colors=True).info(log_msg) @@ -237,8 +223,8 @@ async def handle_event(bot: "Bot", event: "Event"): logger.debug("Running PreProcessors...") await asyncio.gather(*coros) except IgnoredException: - logger.opt( - colors=True).info(f"Event {event.name} is ignored") + logger.opt(colors=True).info( + f"Event {event.get_event_name()} is ignored") return except Exception as e: logger.opt(colors=True, exception=e).error(