ayaka.driver.ayakabot.event

  1import inspect
  2from typing_extensions import Literal
  3from typing import TYPE_CHECKING, List, Type, Optional
  4from pydantic import BaseModel
  5from pygtrie import StringTrie
  6from pydantic import BaseModel
  7
  8from .result import ResultStore
  9from .model import DataclassEncoder
 10from .message import Message
 11
 12from ayaka import logger
 13
 14if TYPE_CHECKING:
 15    from .bot import Bot
 16
 17
 18class Event(BaseModel):
 19    """
 20    OneBot v11 协议事件,字段与 OneBot 一致。各事件字段参考 `OneBot 文档`_
 21
 22    .. OneBot 文档:
 23        https://github.com/botuniverse/onebot-11/blob/master/README.md
 24    """
 25
 26    class Config:
 27        extra = "allow"
 28        json_encoders = {Message: DataclassEncoder}
 29
 30    def __str__(self) -> str:
 31        return f"[{self.get_event_name()}]: {self.get_event_description()}"
 32
 33    def get_log_string(self) -> str:
 34        """获取事件日志信息的方法。
 35
 36        通常你不需要修改这个方法,只有当希望 ayaka 隐藏该事件日志时,可以抛出 `NoLogException` 异常。
 37
 38        异常:
 39            NoLogException
 40        """
 41        return f"[{self.get_event_name()}]: {self.get_event_description()}"
 42
 43    def get_plaintext(self) -> str:
 44        """获取消息纯文本的方法。
 45
 46        通常不需要修改,默认通过 `get_message().extract_plain_text` 获取。
 47        """
 48        return self.get_message().extract_plain_text()
 49
 50    __event__ = ""
 51    time: int
 52    self_id: int
 53    post_type: str
 54
 55    def get_type(self) -> str:
 56        return self.post_type
 57
 58    def get_event_name(self) -> str:
 59        return self.post_type
 60
 61    def get_event_description(self) -> str:
 62        return str(self.dict())
 63
 64    def get_message(self) -> Message:
 65        raise ValueError("Event has no message!")
 66
 67    def get_plaintext(self) -> str:
 68        raise ValueError("Event has no message!")
 69
 70    def get_user_id(self) -> str:
 71        raise ValueError("Event has no context!")
 72
 73    def get_session_id(self) -> str:
 74        raise ValueError("Event has no context!")
 75
 76    def is_tome(self) -> bool:
 77        return False
 78
 79
 80# Models
 81class Sender(BaseModel):
 82    user_id: Optional[int] = None
 83    nickname: Optional[str] = None
 84    sex: Optional[str] = None
 85    age: Optional[int] = None
 86    card: Optional[str] = None
 87    area: Optional[str] = None
 88    level: Optional[str] = None
 89    role: Optional[str] = None
 90    title: Optional[str] = None
 91
 92    class Config:
 93        extra = "allow"
 94
 95
 96class Reply(BaseModel):
 97    time: int
 98    message_type: str
 99    message_id: int
100    real_id: int
101    sender: Sender
102    message: Message
103
104    class Config:
105        extra = "allow"
106
107
108class Anonymous(BaseModel):
109    id: int
110    name: str
111    flag: str
112
113    class Config:
114        extra = "allow"
115
116
117class File(BaseModel):
118    id: str
119    name: str
120    size: int
121    busid: int
122
123    class Config:
124        extra = "allow"
125
126
127class Status(BaseModel):
128    online: bool
129    good: bool
130
131    class Config:
132        extra = "allow"
133
134
135# Message Events
136class MessageEvent(Event):
137    """消息事件"""
138
139    __event__ = "message"
140    post_type: Literal["message"]
141    sub_type: str
142    user_id: int
143    message_type: str
144    message_id: int
145    message: Message
146    raw_message: str
147    font: int
148    sender: Sender
149    reply: Optional[Reply] = None
150    """
151    :说明: 消息中提取的回复消息,内容为 ``get_msg`` API 返回结果
152
153    :类型: ``Optional[Reply]``
154    """
155
156    def get_event_name(self) -> str:
157        sub_type = getattr(self, "sub_type", None)
158        return f"{self.post_type}.{self.message_type}" + (
159            f".{sub_type}" if sub_type else ""
160        )
161
162    def get_message(self) -> Message:
163        return self.message
164
165    def get_plaintext(self) -> str:
166        return self.message.extract_plain_text()
167
168    def get_user_id(self) -> str:
169        return str(self.user_id)
170
171    def get_session_id(self) -> str:
172        return str(self.user_id)
173
174
175class PrivateMessageEvent(MessageEvent):
176    """私聊消息"""
177
178    __event__ = "message.private"
179    message_type: Literal["private"]
180
181    def get_event_description(self) -> str:
182        return (
183            f'Message {self.message_id} from {self.user_id} \n'
184            + "".join(
185                map(
186                    lambda x: str(x) if x.is_text() else f"<c>{x}</c>",
187                    self.message,
188                )
189            )
190        )
191
192
193class GroupMessageEvent(MessageEvent):
194    """群消息"""
195
196    __event__ = "message.group"
197    message_type: Literal["group"]
198    group_id: int
199    anonymous: Optional[Anonymous] = None
200
201    def get_event_description(self) -> str:
202        return (
203            f'Message {self.message_id} from {self.user_id}@[群:{self.group_id}] \n'
204            + "".join(
205                map(
206                    lambda x: str(x) if x.is_text() else f"<c>{x}</c>",
207                    self.message,
208                )
209            )
210        )
211
212    def get_session_id(self) -> str:
213        return f"group_{self.group_id}_{self.user_id}"
214
215
216# Notice Events
217class NoticeEvent(Event):
218    """通知事件"""
219
220    __event__ = "notice"
221    post_type: Literal["notice"]
222    notice_type: str
223
224    def get_event_name(self) -> str:
225        sub_type = getattr(self, "sub_type", None)
226        sub_type = f".{sub_type}" if sub_type else ""
227        return f"{self.post_type}.{self.notice_type}{sub_type}"
228
229
230class GroupUploadNoticeEvent(NoticeEvent):
231    """群文件上传事件"""
232
233    __event__ = "notice.group_upload"
234    notice_type: Literal["group_upload"]
235    user_id: int
236    group_id: int
237    file: File
238
239    def get_user_id(self) -> str:
240        return str(self.user_id)
241
242    def get_session_id(self) -> str:
243        return f"group_{self.group_id}_{self.user_id}"
244
245
246class GroupAdminNoticeEvent(NoticeEvent):
247    """群管理员变动"""
248
249    __event__ = "notice.group_admin"
250    notice_type: Literal["group_admin"]
251    sub_type: str
252    user_id: int
253    group_id: int
254
255    def is_tome(self) -> bool:
256        return self.user_id == self.self_id
257
258    def get_user_id(self) -> str:
259        return str(self.user_id)
260
261    def get_session_id(self) -> str:
262        return f"group_{self.group_id}_{self.user_id}"
263
264
265class GroupDecreaseNoticeEvent(NoticeEvent):
266    """群成员减少事件"""
267
268    __event__ = "notice.group_decrease"
269    notice_type: Literal["group_decrease"]
270    sub_type: str
271    user_id: int
272    group_id: int
273    operator_id: int
274
275    def is_tome(self) -> bool:
276        return self.user_id == self.self_id
277
278    def get_user_id(self) -> str:
279        return str(self.user_id)
280
281    def get_session_id(self) -> str:
282        return f"group_{self.group_id}_{self.user_id}"
283
284
285class GroupIncreaseNoticeEvent(NoticeEvent):
286    """群成员增加事件"""
287
288    __event__ = "notice.group_increase"
289    notice_type: Literal["group_increase"]
290    sub_type: str
291    user_id: int
292    group_id: int
293    operator_id: int
294
295    def is_tome(self) -> bool:
296        return self.user_id == self.self_id
297
298    def get_user_id(self) -> str:
299        return str(self.user_id)
300
301    def get_session_id(self) -> str:
302        return f"group_{self.group_id}_{self.user_id}"
303
304
305class GroupBanNoticeEvent(NoticeEvent):
306    """群禁言事件"""
307
308    __event__ = "notice.group_ban"
309    notice_type: Literal["group_ban"]
310    sub_type: str
311    user_id: int
312    group_id: int
313    operator_id: int
314    duration: int
315
316    def is_tome(self) -> bool:
317        return self.user_id == self.self_id
318
319    def get_user_id(self) -> str:
320        return str(self.user_id)
321
322    def get_session_id(self) -> str:
323        return f"group_{self.group_id}_{self.user_id}"
324
325
326class FriendAddNoticeEvent(NoticeEvent):
327    """好友添加事件"""
328
329    __event__ = "notice.friend_add"
330    notice_type: Literal["friend_add"]
331    user_id: int
332
333    def get_user_id(self) -> str:
334        return str(self.user_id)
335
336    def get_session_id(self) -> str:
337        return str(self.user_id)
338
339
340class GroupRecallNoticeEvent(NoticeEvent):
341    """群消息撤回事件"""
342
343    __event__ = "notice.group_recall"
344    notice_type: Literal["group_recall"]
345    user_id: int
346    group_id: int
347    operator_id: int
348    message_id: int
349
350    def is_tome(self) -> bool:
351        return self.user_id == self.self_id
352
353    def get_user_id(self) -> str:
354        return str(self.user_id)
355
356    def get_session_id(self) -> str:
357        return f"group_{self.group_id}_{self.user_id}"
358
359
360class FriendRecallNoticeEvent(NoticeEvent):
361    """好友消息撤回事件"""
362
363    __event__ = "notice.friend_recall"
364    notice_type: Literal["friend_recall"]
365    user_id: int
366    message_id: int
367
368    def get_user_id(self) -> str:
369        return str(self.user_id)
370
371    def get_session_id(self) -> str:
372        return str(self.user_id)
373
374
375class NotifyEvent(NoticeEvent):
376    """提醒事件"""
377
378    __event__ = "notice.notify"
379    notice_type: Literal["notify"]
380    sub_type: str
381    user_id: int
382    group_id: int
383
384    def get_user_id(self) -> str:
385        return str(self.user_id)
386
387    def get_session_id(self) -> str:
388        return f"group_{self.group_id}_{self.user_id}"
389
390
391class PokeNotifyEvent(NotifyEvent):
392    """戳一戳提醒事件"""
393
394    __event__ = "notice.notify.poke"
395    sub_type: Literal["poke"]
396    target_id: int
397    group_id: Optional[int] = None
398
399    def is_tome(self) -> bool:
400        return self.target_id == self.self_id
401
402    def get_session_id(self) -> str:
403        if not self.group_id:
404            return str(self.user_id)
405        return super().get_session_id()
406
407
408class LuckyKingNotifyEvent(NotifyEvent):
409    """群红包运气王提醒事件"""
410
411    __event__ = "notice.notify.lucky_king"
412    sub_type: Literal["lucky_king"]
413    target_id: int
414
415    def is_tome(self) -> bool:
416        return self.target_id == self.self_id
417
418    def get_user_id(self) -> str:
419        return str(self.target_id)
420
421    def get_session_id(self) -> str:
422        return f"group_{self.group_id}_{self.target_id}"
423
424
425class HonorNotifyEvent(NotifyEvent):
426    """群荣誉变更提醒事件"""
427
428    __event__ = "notice.notify.honor"
429    sub_type: Literal["honor"]
430    honor_type: str
431
432    def is_tome(self) -> bool:
433        return self.user_id == self.self_id
434
435
436# Request Events
437class RequestEvent(Event):
438    """请求事件"""
439
440    __event__ = "request"
441    post_type: Literal["request"]
442    request_type: str
443
444    def get_event_name(self) -> str:
445        sub_type = getattr(self, "sub_type", None)
446        sub_type = f".{sub_type}" if sub_type else ""
447        return f"{self.post_type}.{self.request_type}{sub_type}"
448
449
450class FriendRequestEvent(RequestEvent):
451    """加好友请求事件"""
452
453    __event__ = "request.friend"
454    request_type: Literal["friend"]
455    user_id: int
456    comment: str
457    flag: str
458
459    def get_user_id(self) -> str:
460        return str(self.user_id)
461
462    def get_session_id(self) -> str:
463        return str(self.user_id)
464
465    async def approve(self, bot: "Bot", remark: str = ""):
466        return await bot.set_friend_add_request(
467            flag=self.flag, approve=True, remark=remark
468        )
469
470    async def reject(self, bot: "Bot"):
471        return await bot.set_friend_add_request(flag=self.flag, approve=False)
472
473
474class GroupRequestEvent(RequestEvent):
475    """加群请求/邀请事件"""
476
477    __event__ = "request.group"
478    request_type: Literal["group"]
479    sub_type: str
480    group_id: int
481    user_id: int
482    comment: str
483    flag: str
484
485    def get_user_id(self) -> str:
486        return str(self.user_id)
487
488    def get_session_id(self) -> str:
489        return f"group_{self.group_id}_{self.user_id}"
490
491    async def approve(self, bot: "Bot"):
492        return await bot.set_group_add_request(
493            flag=self.flag, sub_type=self.sub_type, approve=True
494        )
495
496    async def reject(self, bot: "Bot", reason: str = ""):
497        return await bot.set_group_add_request(
498            flag=self.flag, sub_type=self.sub_type, approve=False, reason=reason
499        )
500
501
502# Meta Events
503class MetaEvent(Event):
504    """元事件"""
505
506    __event__ = "meta_event"
507    post_type: Literal["meta_event"]
508    meta_event_type: str
509
510    def get_event_name(self) -> str:
511        sub_type = getattr(self, "sub_type", None)
512        return f"{self.post_type}.{self.meta_event_type}" + (
513            f".{sub_type}" if sub_type else ""
514        )
515
516    def get_log_string(self) -> str:
517        return ""
518
519
520class LifecycleMetaEvent(MetaEvent):
521    """生命周期元事件"""
522
523    __event__ = "meta_event.lifecycle"
524    meta_event_type: Literal["lifecycle"]
525    sub_type: str
526
527
528class HeartbeatMetaEvent(MetaEvent):
529    """心跳元事件"""
530
531    __event__ = "meta_event.heartbeat"
532    meta_event_type: Literal["heartbeat"]
533    status: Status
534    interval: int
535
536
537# 属实奢侈了一把,家人们
538_t = StringTrie(separator=".")
539
540# define `model` first to avoid globals changing while `for`
541model = None
542for model in globals().values():
543    if not inspect.isclass(model) or not issubclass(model, Event):
544        continue
545    _t["." + model.__event__] = model
546
547
548def get_event_model(event_name) -> List[Type[Event]]:
549    """
550    :说明:
551
552      根据事件名获取对应 ``Event Model`` 及 ``FallBack Event Model`` 列表
553
554    :返回:
555
556      - ``List[Type[Event]]``
557    """
558    return [model.value for model in _t.prefixes("." + event_name)][::-1]
559
560
561def json_to_event(json_data) -> Optional[Event]:
562    if not isinstance(json_data, dict):
563        return None
564
565    if "post_type" not in json_data:
566        ResultStore.add_result(json_data)
567        return
568
569    try:
570        post_type = json_data["post_type"]
571        detail_type = json_data.get(f"{post_type}_type")
572        detail_type = f".{detail_type}" if detail_type else ""
573        sub_type = json_data.get("sub_type")
574        sub_type = f".{sub_type}" if sub_type else ""
575        models = get_event_model(post_type + detail_type + sub_type)
576        for model in models:
577            try:
578                event = model.parse_obj(json_data)
579                break
580            except:
581                logger.debug(f"Event Parser Error {model.__name__}")
582        else:
583            event = Event.parse_obj(json_data)
584
585        return event
586
587    except:
588        logger.exception()
589        logger.opt(colors=True).error(f"<r>Failed to parse event.\nRaw: {json_data}</r>")
590
591
592__all__ = [
593    "Event",
594    "MessageEvent",
595    "PrivateMessageEvent",
596    "GroupMessageEvent",
597    "NoticeEvent",
598    "GroupUploadNoticeEvent",
599    "GroupAdminNoticeEvent",
600    "GroupDecreaseNoticeEvent",
601    "GroupIncreaseNoticeEvent",
602    "GroupBanNoticeEvent",
603    "FriendAddNoticeEvent",
604    "GroupRecallNoticeEvent",
605    "FriendRecallNoticeEvent",
606    "NotifyEvent",
607    "PokeNotifyEvent",
608    "LuckyKingNotifyEvent",
609    "HonorNotifyEvent",
610    "RequestEvent",
611    "FriendRequestEvent",
612    "GroupRequestEvent",
613    "MetaEvent",
614    "LifecycleMetaEvent",
615    "HeartbeatMetaEvent",
616    "get_event_model",
617]
class Event(pydantic.main.BaseModel):
19class Event(BaseModel):
20    """
21    OneBot v11 协议事件,字段与 OneBot 一致。各事件字段参考 `OneBot 文档`_
22
23    .. OneBot 文档:
24        https://github.com/botuniverse/onebot-11/blob/master/README.md
25    """
26
27    class Config:
28        extra = "allow"
29        json_encoders = {Message: DataclassEncoder}
30
31    def __str__(self) -> str:
32        return f"[{self.get_event_name()}]: {self.get_event_description()}"
33
34    def get_log_string(self) -> str:
35        """获取事件日志信息的方法。
36
37        通常你不需要修改这个方法,只有当希望 ayaka 隐藏该事件日志时,可以抛出 `NoLogException` 异常。
38
39        异常:
40            NoLogException
41        """
42        return f"[{self.get_event_name()}]: {self.get_event_description()}"
43
44    def get_plaintext(self) -> str:
45        """获取消息纯文本的方法。
46
47        通常不需要修改,默认通过 `get_message().extract_plain_text` 获取。
48        """
49        return self.get_message().extract_plain_text()
50
51    __event__ = ""
52    time: int
53    self_id: int
54    post_type: str
55
56    def get_type(self) -> str:
57        return self.post_type
58
59    def get_event_name(self) -> str:
60        return self.post_type
61
62    def get_event_description(self) -> str:
63        return str(self.dict())
64
65    def get_message(self) -> Message:
66        raise ValueError("Event has no message!")
67
68    def get_plaintext(self) -> str:
69        raise ValueError("Event has no message!")
70
71    def get_user_id(self) -> str:
72        raise ValueError("Event has no context!")
73
74    def get_session_id(self) -> str:
75        raise ValueError("Event has no context!")
76
77    def is_tome(self) -> bool:
78        return False

OneBot v11 协议事件,字段与 OneBot 一致。各事件字段参考 OneBot 文档_

.. OneBot 文档: https://github.com/botuniverse/onebot-11/blob/master/README.md

def get_log_string(self) -> str:
34    def get_log_string(self) -> str:
35        """获取事件日志信息的方法。
36
37        通常你不需要修改这个方法,只有当希望 ayaka 隐藏该事件日志时,可以抛出 `NoLogException` 异常。
38
39        异常:
40            NoLogException
41        """
42        return f"[{self.get_event_name()}]: {self.get_event_description()}"

获取事件日志信息的方法。

通常你不需要修改这个方法,只有当希望 ayaka 隐藏该事件日志时,可以抛出 NoLogException 异常。

异常: NoLogException

def get_plaintext(self) -> str:
68    def get_plaintext(self) -> str:
69        raise ValueError("Event has no message!")

获取消息纯文本的方法。

通常不需要修改,默认通过 get_message().extract_plain_text 获取。

def get_type(self) -> str:
56    def get_type(self) -> str:
57        return self.post_type
def get_event_name(self) -> str:
59    def get_event_name(self) -> str:
60        return self.post_type
def get_event_description(self) -> str:
62    def get_event_description(self) -> str:
63        return str(self.dict())
def get_message(self) -> ayaka.driver.ayakabot.message.Message:
65    def get_message(self) -> Message:
66        raise ValueError("Event has no message!")
def get_user_id(self) -> str:
71    def get_user_id(self) -> str:
72        raise ValueError("Event has no context!")
def get_session_id(self) -> str:
74    def get_session_id(self) -> str:
75        raise ValueError("Event has no context!")
def is_tome(self) -> bool:
77    def is_tome(self) -> bool:
78        return False
Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
class Event.Config:
27    class Config:
28        extra = "allow"
29        json_encoders = {Message: DataclassEncoder}
Event.Config()
class MessageEvent(Event):
137class MessageEvent(Event):
138    """消息事件"""
139
140    __event__ = "message"
141    post_type: Literal["message"]
142    sub_type: str
143    user_id: int
144    message_type: str
145    message_id: int
146    message: Message
147    raw_message: str
148    font: int
149    sender: Sender
150    reply: Optional[Reply] = None
151    """
152    :说明: 消息中提取的回复消息,内容为 ``get_msg`` API 返回结果
153
154    :类型: ``Optional[Reply]``
155    """
156
157    def get_event_name(self) -> str:
158        sub_type = getattr(self, "sub_type", None)
159        return f"{self.post_type}.{self.message_type}" + (
160            f".{sub_type}" if sub_type else ""
161        )
162
163    def get_message(self) -> Message:
164        return self.message
165
166    def get_plaintext(self) -> str:
167        return self.message.extract_plain_text()
168
169    def get_user_id(self) -> str:
170        return str(self.user_id)
171
172    def get_session_id(self) -> str:
173        return str(self.user_id)

消息事件

reply: Union[ayaka.driver.ayakabot.event.Reply, NoneType]

:说明: 消息中提取的回复消息,内容为 get_msg API 返回结果

:类型: Optional[Reply]

def get_event_name(self) -> str:
157    def get_event_name(self) -> str:
158        sub_type = getattr(self, "sub_type", None)
159        return f"{self.post_type}.{self.message_type}" + (
160            f".{sub_type}" if sub_type else ""
161        )
def get_message(self) -> ayaka.driver.ayakabot.message.Message:
163    def get_message(self) -> Message:
164        return self.message
def get_plaintext(self) -> str:
166    def get_plaintext(self) -> str:
167        return self.message.extract_plain_text()

获取消息纯文本的方法。

通常不需要修改,默认通过 get_message().extract_plain_text 获取。

def get_user_id(self) -> str:
169    def get_user_id(self) -> str:
170        return str(self.user_id)
def get_session_id(self) -> str:
172    def get_session_id(self) -> str:
173        return str(self.user_id)
Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
Event
Config
get_log_string
get_type
get_event_description
is_tome
class PrivateMessageEvent(MessageEvent):
176class PrivateMessageEvent(MessageEvent):
177    """私聊消息"""
178
179    __event__ = "message.private"
180    message_type: Literal["private"]
181
182    def get_event_description(self) -> str:
183        return (
184            f'Message {self.message_id} from {self.user_id} \n'
185            + "".join(
186                map(
187                    lambda x: str(x) if x.is_text() else f"<c>{x}</c>",
188                    self.message,
189                )
190            )
191        )

私聊消息

def get_event_description(self) -> str:
182    def get_event_description(self) -> str:
183        return (
184            f'Message {self.message_id} from {self.user_id} \n'
185            + "".join(
186                map(
187                    lambda x: str(x) if x.is_text() else f"<c>{x}</c>",
188                    self.message,
189                )
190            )
191        )
Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
MessageEvent
reply
get_event_name
get_message
get_plaintext
get_user_id
get_session_id
Event
Config
get_log_string
get_type
is_tome
class GroupMessageEvent(MessageEvent):
194class GroupMessageEvent(MessageEvent):
195    """群消息"""
196
197    __event__ = "message.group"
198    message_type: Literal["group"]
199    group_id: int
200    anonymous: Optional[Anonymous] = None
201
202    def get_event_description(self) -> str:
203        return (
204            f'Message {self.message_id} from {self.user_id}@[群:{self.group_id}] \n'
205            + "".join(
206                map(
207                    lambda x: str(x) if x.is_text() else f"<c>{x}</c>",
208                    self.message,
209                )
210            )
211        )
212
213    def get_session_id(self) -> str:
214        return f"group_{self.group_id}_{self.user_id}"

群消息

def get_event_description(self) -> str:
202    def get_event_description(self) -> str:
203        return (
204            f'Message {self.message_id} from {self.user_id}@[群:{self.group_id}] \n'
205            + "".join(
206                map(
207                    lambda x: str(x) if x.is_text() else f"<c>{x}</c>",
208                    self.message,
209                )
210            )
211        )
def get_session_id(self) -> str:
213    def get_session_id(self) -> str:
214        return f"group_{self.group_id}_{self.user_id}"
Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
MessageEvent
reply
get_event_name
get_message
get_plaintext
get_user_id
Event
Config
get_log_string
get_type
is_tome
class NoticeEvent(Event):
218class NoticeEvent(Event):
219    """通知事件"""
220
221    __event__ = "notice"
222    post_type: Literal["notice"]
223    notice_type: str
224
225    def get_event_name(self) -> str:
226        sub_type = getattr(self, "sub_type", None)
227        sub_type = f".{sub_type}" if sub_type else ""
228        return f"{self.post_type}.{self.notice_type}{sub_type}"

通知事件

def get_event_name(self) -> str:
225    def get_event_name(self) -> str:
226        sub_type = getattr(self, "sub_type", None)
227        sub_type = f".{sub_type}" if sub_type else ""
228        return f"{self.post_type}.{self.notice_type}{sub_type}"
Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
Event
Config
get_log_string
get_plaintext
get_type
get_event_description
get_message
get_user_id
get_session_id
is_tome
class GroupUploadNoticeEvent(NoticeEvent):
231class GroupUploadNoticeEvent(NoticeEvent):
232    """群文件上传事件"""
233
234    __event__ = "notice.group_upload"
235    notice_type: Literal["group_upload"]
236    user_id: int
237    group_id: int
238    file: File
239
240    def get_user_id(self) -> str:
241        return str(self.user_id)
242
243    def get_session_id(self) -> str:
244        return f"group_{self.group_id}_{self.user_id}"

群文件上传事件

def get_user_id(self) -> str:
240    def get_user_id(self) -> str:
241        return str(self.user_id)
def get_session_id(self) -> str:
243    def get_session_id(self) -> str:
244        return f"group_{self.group_id}_{self.user_id}"
Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
NoticeEvent
get_event_name
Event
Config
get_log_string
get_plaintext
get_type
get_event_description
get_message
is_tome
class GroupAdminNoticeEvent(NoticeEvent):
247class GroupAdminNoticeEvent(NoticeEvent):
248    """群管理员变动"""
249
250    __event__ = "notice.group_admin"
251    notice_type: Literal["group_admin"]
252    sub_type: str
253    user_id: int
254    group_id: int
255
256    def is_tome(self) -> bool:
257        return self.user_id == self.self_id
258
259    def get_user_id(self) -> str:
260        return str(self.user_id)
261
262    def get_session_id(self) -> str:
263        return f"group_{self.group_id}_{self.user_id}"

群管理员变动

def is_tome(self) -> bool:
256    def is_tome(self) -> bool:
257        return self.user_id == self.self_id
def get_user_id(self) -> str:
259    def get_user_id(self) -> str:
260        return str(self.user_id)
def get_session_id(self) -> str:
262    def get_session_id(self) -> str:
263        return f"group_{self.group_id}_{self.user_id}"
Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
NoticeEvent
get_event_name
Event
Config
get_log_string
get_plaintext
get_type
get_event_description
get_message
class GroupDecreaseNoticeEvent(NoticeEvent):
266class GroupDecreaseNoticeEvent(NoticeEvent):
267    """群成员减少事件"""
268
269    __event__ = "notice.group_decrease"
270    notice_type: Literal["group_decrease"]
271    sub_type: str
272    user_id: int
273    group_id: int
274    operator_id: int
275
276    def is_tome(self) -> bool:
277        return self.user_id == self.self_id
278
279    def get_user_id(self) -> str:
280        return str(self.user_id)
281
282    def get_session_id(self) -> str:
283        return f"group_{self.group_id}_{self.user_id}"

群成员减少事件

def is_tome(self) -> bool:
276    def is_tome(self) -> bool:
277        return self.user_id == self.self_id
def get_user_id(self) -> str:
279    def get_user_id(self) -> str:
280        return str(self.user_id)
def get_session_id(self) -> str:
282    def get_session_id(self) -> str:
283        return f"group_{self.group_id}_{self.user_id}"
Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
NoticeEvent
get_event_name
Event
Config
get_log_string
get_plaintext
get_type
get_event_description
get_message
class GroupIncreaseNoticeEvent(NoticeEvent):
286class GroupIncreaseNoticeEvent(NoticeEvent):
287    """群成员增加事件"""
288
289    __event__ = "notice.group_increase"
290    notice_type: Literal["group_increase"]
291    sub_type: str
292    user_id: int
293    group_id: int
294    operator_id: int
295
296    def is_tome(self) -> bool:
297        return self.user_id == self.self_id
298
299    def get_user_id(self) -> str:
300        return str(self.user_id)
301
302    def get_session_id(self) -> str:
303        return f"group_{self.group_id}_{self.user_id}"

群成员增加事件

def is_tome(self) -> bool:
296    def is_tome(self) -> bool:
297        return self.user_id == self.self_id
def get_user_id(self) -> str:
299    def get_user_id(self) -> str:
300        return str(self.user_id)
def get_session_id(self) -> str:
302    def get_session_id(self) -> str:
303        return f"group_{self.group_id}_{self.user_id}"
Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
NoticeEvent
get_event_name
Event
Config
get_log_string
get_plaintext
get_type
get_event_description
get_message
class GroupBanNoticeEvent(NoticeEvent):
306class GroupBanNoticeEvent(NoticeEvent):
307    """群禁言事件"""
308
309    __event__ = "notice.group_ban"
310    notice_type: Literal["group_ban"]
311    sub_type: str
312    user_id: int
313    group_id: int
314    operator_id: int
315    duration: int
316
317    def is_tome(self) -> bool:
318        return self.user_id == self.self_id
319
320    def get_user_id(self) -> str:
321        return str(self.user_id)
322
323    def get_session_id(self) -> str:
324        return f"group_{self.group_id}_{self.user_id}"

群禁言事件

def is_tome(self) -> bool:
317    def is_tome(self) -> bool:
318        return self.user_id == self.self_id
def get_user_id(self) -> str:
320    def get_user_id(self) -> str:
321        return str(self.user_id)
def get_session_id(self) -> str:
323    def get_session_id(self) -> str:
324        return f"group_{self.group_id}_{self.user_id}"
Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
NoticeEvent
get_event_name
Event
Config
get_log_string
get_plaintext
get_type
get_event_description
get_message
class FriendAddNoticeEvent(NoticeEvent):
327class FriendAddNoticeEvent(NoticeEvent):
328    """好友添加事件"""
329
330    __event__ = "notice.friend_add"
331    notice_type: Literal["friend_add"]
332    user_id: int
333
334    def get_user_id(self) -> str:
335        return str(self.user_id)
336
337    def get_session_id(self) -> str:
338        return str(self.user_id)

好友添加事件

def get_user_id(self) -> str:
334    def get_user_id(self) -> str:
335        return str(self.user_id)
def get_session_id(self) -> str:
337    def get_session_id(self) -> str:
338        return str(self.user_id)
Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
NoticeEvent
get_event_name
Event
Config
get_log_string
get_plaintext
get_type
get_event_description
get_message
is_tome
class GroupRecallNoticeEvent(NoticeEvent):
341class GroupRecallNoticeEvent(NoticeEvent):
342    """群消息撤回事件"""
343
344    __event__ = "notice.group_recall"
345    notice_type: Literal["group_recall"]
346    user_id: int
347    group_id: int
348    operator_id: int
349    message_id: int
350
351    def is_tome(self) -> bool:
352        return self.user_id == self.self_id
353
354    def get_user_id(self) -> str:
355        return str(self.user_id)
356
357    def get_session_id(self) -> str:
358        return f"group_{self.group_id}_{self.user_id}"

群消息撤回事件

def is_tome(self) -> bool:
351    def is_tome(self) -> bool:
352        return self.user_id == self.self_id
def get_user_id(self) -> str:
354    def get_user_id(self) -> str:
355        return str(self.user_id)
def get_session_id(self) -> str:
357    def get_session_id(self) -> str:
358        return f"group_{self.group_id}_{self.user_id}"
Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
NoticeEvent
get_event_name
Event
Config
get_log_string
get_plaintext
get_type
get_event_description
get_message
class FriendRecallNoticeEvent(NoticeEvent):
361class FriendRecallNoticeEvent(NoticeEvent):
362    """好友消息撤回事件"""
363
364    __event__ = "notice.friend_recall"
365    notice_type: Literal["friend_recall"]
366    user_id: int
367    message_id: int
368
369    def get_user_id(self) -> str:
370        return str(self.user_id)
371
372    def get_session_id(self) -> str:
373        return str(self.user_id)

好友消息撤回事件

def get_user_id(self) -> str:
369    def get_user_id(self) -> str:
370        return str(self.user_id)
def get_session_id(self) -> str:
372    def get_session_id(self) -> str:
373        return str(self.user_id)
Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
NoticeEvent
get_event_name
Event
Config
get_log_string
get_plaintext
get_type
get_event_description
get_message
is_tome
class NotifyEvent(NoticeEvent):
376class NotifyEvent(NoticeEvent):
377    """提醒事件"""
378
379    __event__ = "notice.notify"
380    notice_type: Literal["notify"]
381    sub_type: str
382    user_id: int
383    group_id: int
384
385    def get_user_id(self) -> str:
386        return str(self.user_id)
387
388    def get_session_id(self) -> str:
389        return f"group_{self.group_id}_{self.user_id}"

提醒事件

def get_user_id(self) -> str:
385    def get_user_id(self) -> str:
386        return str(self.user_id)
def get_session_id(self) -> str:
388    def get_session_id(self) -> str:
389        return f"group_{self.group_id}_{self.user_id}"
Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
NoticeEvent
get_event_name
Event
Config
get_log_string
get_plaintext
get_type
get_event_description
get_message
is_tome
class PokeNotifyEvent(NotifyEvent):
392class PokeNotifyEvent(NotifyEvent):
393    """戳一戳提醒事件"""
394
395    __event__ = "notice.notify.poke"
396    sub_type: Literal["poke"]
397    target_id: int
398    group_id: Optional[int] = None
399
400    def is_tome(self) -> bool:
401        return self.target_id == self.self_id
402
403    def get_session_id(self) -> str:
404        if not self.group_id:
405            return str(self.user_id)
406        return super().get_session_id()

戳一戳提醒事件

def is_tome(self) -> bool:
400    def is_tome(self) -> bool:
401        return self.target_id == self.self_id
def get_session_id(self) -> str:
403    def get_session_id(self) -> str:
404        if not self.group_id:
405            return str(self.user_id)
406        return super().get_session_id()
Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
NotifyEvent
get_user_id
NoticeEvent
get_event_name
Event
Config
get_log_string
get_plaintext
get_type
get_event_description
get_message
class LuckyKingNotifyEvent(NotifyEvent):
409class LuckyKingNotifyEvent(NotifyEvent):
410    """群红包运气王提醒事件"""
411
412    __event__ = "notice.notify.lucky_king"
413    sub_type: Literal["lucky_king"]
414    target_id: int
415
416    def is_tome(self) -> bool:
417        return self.target_id == self.self_id
418
419    def get_user_id(self) -> str:
420        return str(self.target_id)
421
422    def get_session_id(self) -> str:
423        return f"group_{self.group_id}_{self.target_id}"

群红包运气王提醒事件

def is_tome(self) -> bool:
416    def is_tome(self) -> bool:
417        return self.target_id == self.self_id
def get_user_id(self) -> str:
419    def get_user_id(self) -> str:
420        return str(self.target_id)
def get_session_id(self) -> str:
422    def get_session_id(self) -> str:
423        return f"group_{self.group_id}_{self.target_id}"
Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
NoticeEvent
get_event_name
Event
Config
get_log_string
get_plaintext
get_type
get_event_description
get_message
class HonorNotifyEvent(NotifyEvent):
426class HonorNotifyEvent(NotifyEvent):
427    """群荣誉变更提醒事件"""
428
429    __event__ = "notice.notify.honor"
430    sub_type: Literal["honor"]
431    honor_type: str
432
433    def is_tome(self) -> bool:
434        return self.user_id == self.self_id

群荣誉变更提醒事件

def is_tome(self) -> bool:
433    def is_tome(self) -> bool:
434        return self.user_id == self.self_id
Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
NotifyEvent
get_user_id
get_session_id
NoticeEvent
get_event_name
Event
Config
get_log_string
get_plaintext
get_type
get_event_description
get_message
class RequestEvent(Event):
438class RequestEvent(Event):
439    """请求事件"""
440
441    __event__ = "request"
442    post_type: Literal["request"]
443    request_type: str
444
445    def get_event_name(self) -> str:
446        sub_type = getattr(self, "sub_type", None)
447        sub_type = f".{sub_type}" if sub_type else ""
448        return f"{self.post_type}.{self.request_type}{sub_type}"

请求事件

def get_event_name(self) -> str:
445    def get_event_name(self) -> str:
446        sub_type = getattr(self, "sub_type", None)
447        sub_type = f".{sub_type}" if sub_type else ""
448        return f"{self.post_type}.{self.request_type}{sub_type}"
Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
Event
Config
get_log_string
get_plaintext
get_type
get_event_description
get_message
get_user_id
get_session_id
is_tome
class FriendRequestEvent(RequestEvent):
451class FriendRequestEvent(RequestEvent):
452    """加好友请求事件"""
453
454    __event__ = "request.friend"
455    request_type: Literal["friend"]
456    user_id: int
457    comment: str
458    flag: str
459
460    def get_user_id(self) -> str:
461        return str(self.user_id)
462
463    def get_session_id(self) -> str:
464        return str(self.user_id)
465
466    async def approve(self, bot: "Bot", remark: str = ""):
467        return await bot.set_friend_add_request(
468            flag=self.flag, approve=True, remark=remark
469        )
470
471    async def reject(self, bot: "Bot"):
472        return await bot.set_friend_add_request(flag=self.flag, approve=False)

加好友请求事件

def get_user_id(self) -> str:
460    def get_user_id(self) -> str:
461        return str(self.user_id)
def get_session_id(self) -> str:
463    def get_session_id(self) -> str:
464        return str(self.user_id)
async def approve(self, bot: ayaka.driver.ayakabot.bot.Bot, remark: str = ''):
466    async def approve(self, bot: "Bot", remark: str = ""):
467        return await bot.set_friend_add_request(
468            flag=self.flag, approve=True, remark=remark
469        )
async def reject(self, bot: ayaka.driver.ayakabot.bot.Bot):
471    async def reject(self, bot: "Bot"):
472        return await bot.set_friend_add_request(flag=self.flag, approve=False)
Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
RequestEvent
get_event_name
Event
Config
get_log_string
get_plaintext
get_type
get_event_description
get_message
is_tome
class GroupRequestEvent(RequestEvent):
475class GroupRequestEvent(RequestEvent):
476    """加群请求/邀请事件"""
477
478    __event__ = "request.group"
479    request_type: Literal["group"]
480    sub_type: str
481    group_id: int
482    user_id: int
483    comment: str
484    flag: str
485
486    def get_user_id(self) -> str:
487        return str(self.user_id)
488
489    def get_session_id(self) -> str:
490        return f"group_{self.group_id}_{self.user_id}"
491
492    async def approve(self, bot: "Bot"):
493        return await bot.set_group_add_request(
494            flag=self.flag, sub_type=self.sub_type, approve=True
495        )
496
497    async def reject(self, bot: "Bot", reason: str = ""):
498        return await bot.set_group_add_request(
499            flag=self.flag, sub_type=self.sub_type, approve=False, reason=reason
500        )

加群请求/邀请事件

def get_user_id(self) -> str:
486    def get_user_id(self) -> str:
487        return str(self.user_id)
def get_session_id(self) -> str:
489    def get_session_id(self) -> str:
490        return f"group_{self.group_id}_{self.user_id}"
async def approve(self, bot: ayaka.driver.ayakabot.bot.Bot):
492    async def approve(self, bot: "Bot"):
493        return await bot.set_group_add_request(
494            flag=self.flag, sub_type=self.sub_type, approve=True
495        )
async def reject(self, bot: ayaka.driver.ayakabot.bot.Bot, reason: str = ''):
497    async def reject(self, bot: "Bot", reason: str = ""):
498        return await bot.set_group_add_request(
499            flag=self.flag, sub_type=self.sub_type, approve=False, reason=reason
500        )
Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
RequestEvent
get_event_name
Event
Config
get_log_string
get_plaintext
get_type
get_event_description
get_message
is_tome
class MetaEvent(Event):
504class MetaEvent(Event):
505    """元事件"""
506
507    __event__ = "meta_event"
508    post_type: Literal["meta_event"]
509    meta_event_type: str
510
511    def get_event_name(self) -> str:
512        sub_type = getattr(self, "sub_type", None)
513        return f"{self.post_type}.{self.meta_event_type}" + (
514            f".{sub_type}" if sub_type else ""
515        )
516
517    def get_log_string(self) -> str:
518        return ""

元事件

def get_event_name(self) -> str:
511    def get_event_name(self) -> str:
512        sub_type = getattr(self, "sub_type", None)
513        return f"{self.post_type}.{self.meta_event_type}" + (
514            f".{sub_type}" if sub_type else ""
515        )
def get_log_string(self) -> str:
517    def get_log_string(self) -> str:
518        return ""

获取事件日志信息的方法。

通常你不需要修改这个方法,只有当希望 ayaka 隐藏该事件日志时,可以抛出 NoLogException 异常。

异常: NoLogException

Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
Event
Config
get_plaintext
get_type
get_event_description
get_message
get_user_id
get_session_id
is_tome
class LifecycleMetaEvent(MetaEvent):
521class LifecycleMetaEvent(MetaEvent):
522    """生命周期元事件"""
523
524    __event__ = "meta_event.lifecycle"
525    meta_event_type: Literal["lifecycle"]
526    sub_type: str

生命周期元事件

Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
MetaEvent
get_event_name
get_log_string
Event
Config
get_plaintext
get_type
get_event_description
get_message
get_user_id
get_session_id
is_tome
class HeartbeatMetaEvent(MetaEvent):
529class HeartbeatMetaEvent(MetaEvent):
530    """心跳元事件"""
531
532    __event__ = "meta_event.heartbeat"
533    meta_event_type: Literal["heartbeat"]
534    status: Status
535    interval: int

心跳元事件

Inherited Members
pydantic.main.BaseModel
BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
MetaEvent
get_event_name
get_log_string
Event
Config
get_plaintext
get_type
get_event_description
get_message
get_user_id
get_session_id
is_tome
def get_event_model(event_name) -> List[Type[ayaka.driver.ayakabot.event.Event]]:
549def get_event_model(event_name) -> List[Type[Event]]:
550    """
551    :说明:
552
553      根据事件名获取对应 ``Event Model`` 及 ``FallBack Event Model`` 列表
554
555    :返回:
556
557      - ``List[Type[Event]]``
558    """
559    return [model.value for model in _t.prefixes("." + event_name)][::-1]

:说明:

根据事件名获取对应 Event ModelFallBack Event Model 列表

:返回:

  • List[Type[Event]]