change Event

This commit is contained in:
yanyongyu 2020-08-10 14:50:12 +08:00
parent 9e33a605a6
commit 2d90c35df6
3 changed files with 81 additions and 52 deletions

View File

@ -4,6 +4,7 @@
import abc import abc
from functools import reduce from functools import reduce
from dataclasses import dataclass, field from dataclasses import dataclass, field
from nonebot.rule import notice
from nonebot.config import Config from nonebot.config import Config
from nonebot.typing import Dict, Union, Iterable, WebSocket from nonebot.typing import Dict, Union, Iterable, WebSocket
@ -37,6 +38,46 @@ class BaseBot(abc.ABC):
raise NotImplementedError raise NotImplementedError
class BaseEvent(abc.ABC):
def __init__(self, raw_event: dict):
self._raw_event = raw_event
def __repr__(self) -> str:
# TODO: pretty print
return f"<Event: >"
@property
@abc.abstractmethod
def type(self):
raise NotImplementedError
@type.setter
@abc.abstractmethod
def type(self, value):
raise NotImplementedError
@property
@abc.abstractmethod
def detail_type(self):
raise NotImplementedError
@detail_type.setter
@abc.abstractmethod
def detail_type(self, value):
raise NotImplementedError
@property
@abc.abstractmethod
def sub_type(self):
raise NotImplementedError
@sub_type.setter
@abc.abstractmethod
def sub_type(self, value):
raise NotImplementedError
@dataclass @dataclass
class BaseMessageSegment(abc.ABC): class BaseMessageSegment(abc.ABC):
type: str type: str
@ -51,50 +92,6 @@ class BaseMessageSegment(abc.ABC):
raise NotImplementedError raise NotImplementedError
# class BaseMessageSegment(dict):
# def __init__(self,
# type_: Optional[str] = None,
# data: Optional[Dict[str, str]] = None):
# super().__init__()
# if type_:
# self.type = type_
# self.data = data
# else:
# raise ValueError('The "type" field cannot be empty')
# def __str__(self):
# raise NotImplementedError
# def __getitem__(self, item):
# if item not in ("type", "data"):
# raise KeyError(f'Key "{item}" is not allowed')
# return super().__getitem__(item)
# def __setitem__(self, key, value):
# if key not in ("type", "data"):
# raise KeyError(f'Key "{key}" is not allowed')
# return super().__setitem__(key, value)
# # TODO: __eq__ __add__
# @property
# def type(self) -> str:
# return self["type"]
# @type.setter
# def type(self, value: str):
# self["type"] = value
# @property
# def data(self) -> Dict[str, str]:
# return self["data"]
# @data.setter
# def data(self, data: Optional[Dict[str, str]]):
# self["data"] = data or {}
class BaseMessage(list, abc.ABC): class BaseMessage(list, abc.ABC):
def __init__(self, def __init__(self,

View File

@ -5,12 +5,12 @@ import re
import httpx import httpx
from nonebot.event import Event # from nonebot.event import Event
from nonebot.config import Config from nonebot.config import Config
from nonebot.message import handle_event from nonebot.message import handle_event
from nonebot.exception import ApiNotAvailable from nonebot.exception import ApiNotAvailable
from nonebot.adapters import BaseBot, BaseMessage, BaseMessageSegment
from nonebot.typing import Tuple, Iterable, Optional, overrides, WebSocket from nonebot.typing import Tuple, Iterable, Optional, overrides, WebSocket
from nonebot.adapters import BaseBot, BaseEvent, BaseMessage, BaseMessageSegment
def escape(s: str, *, escape_comma: bool = True) -> str: def escape(s: str, *, escape_comma: bool = True) -> str:
@ -60,13 +60,13 @@ class Bot(BaseBot):
@overrides(BaseBot) @overrides(BaseBot)
async def handle_message(self, message: dict): async def handle_message(self, message: dict):
# TODO: convert message into event # TODO: convert message into event
event = Event.from_payload(message) event = Event(message)
if not event: if not event:
return return
if "message" in event.keys(): # if "message" in event.keys():
event["message"] = Message(event["message"]) # event["message"] = Message(event["message"])
await handle_event(self, event) await handle_event(self, event)
@ -96,6 +96,39 @@ class Bot(BaseBot):
"<HttpFailed {0.status_code} for url: {0.url}>", response) "<HttpFailed {0.status_code} for url: {0.url}>", response)
class Event(BaseEvent):
@property
@overrides(BaseEvent)
def type(self):
return self._raw_event["post_type"]
@type.setter
@overrides(BaseEvent)
def type(self, value):
self._raw_event["post_type"] = value
@property
@overrides(BaseEvent)
def detail_type(self):
return self._raw_event[f"{self.type}_type"]
@detail_type.setter
@overrides(BaseEvent)
def detail_type(self, value):
self._raw_event[f"{self.type}_type"] = value
@property
@overrides(BaseEvent)
def sub_type(self):
return self._raw_event["sub_type"]
@type.setter
@overrides(BaseEvent)
def sub_type(self, value):
self._raw_event["sub_type"] = value
class MessageSegment(BaseMessageSegment): class MessageSegment(BaseMessageSegment):
@overrides(BaseMessageSegment) @overrides(BaseMessageSegment)

View File

@ -8,10 +8,9 @@ from typing import Union, TypeVar, Optional, Iterable, Callable, Awaitable
# import some modules needed when checking types # import some modules needed when checking types
if TYPE_CHECKING: if TYPE_CHECKING:
from nonebot.event import Event as EventClass
from nonebot.matcher import Matcher as MatcherClass from nonebot.matcher import Matcher as MatcherClass
from nonebot.drivers import BaseDriver, BaseWebSocket from nonebot.drivers import BaseDriver, BaseWebSocket
from nonebot.adapters import BaseBot, BaseMessage, BaseMessageSegment from nonebot.adapters import BaseBot, BaseEvent, BaseMessage, BaseMessageSegment
def overrides(InterfaceClass: object): def overrides(InterfaceClass: object):
@ -28,7 +27,7 @@ Driver = TypeVar("Driver", bound="BaseDriver")
WebSocket = TypeVar("WebSocket", bound="BaseWebSocket") WebSocket = TypeVar("WebSocket", bound="BaseWebSocket")
Bot = TypeVar("Bot", bound="BaseBot") Bot = TypeVar("Bot", bound="BaseBot")
Event = TypeVar("Event", bound="EventClass") Event = TypeVar("Event", bound="BaseEvent")
Message = TypeVar("Message", bound="BaseMessage") Message = TypeVar("Message", bound="BaseMessage")
MessageSegment = TypeVar("MessageSegment", bound="BaseMessageSegment") MessageSegment = TypeVar("MessageSegment", bound="BaseMessageSegment")