2020-10-06 02:08:48 +08:00
"""
事件响应器
== == == == ==
该模块实现事件响应器的创建与运行 , 并提供一些快捷方法来帮助用户更好的与机器人进行 对话 。
"""
2020-06-30 10:13:58 +08:00
2020-08-24 17:59:36 +08:00
import inspect
2020-05-02 20:03:36 +08:00
from functools import wraps
2020-08-06 17:54:55 +08:00
from datetime import datetime
2020-09-22 11:28:38 +08:00
from contextvars import ContextVar
2020-06-30 10:13:58 +08:00
from collections import defaultdict
2020-12-06 02:30:19 +08:00
from typing import Type , List , Dict , Union , Callable , Optional , NoReturn , TYPE_CHECKING
2020-05-02 20:03:36 +08:00
2020-08-17 16:09:41 +08:00
from nonebot . rule import Rule
2020-12-06 02:30:19 +08:00
from nonebot . log import logger
2020-08-18 11:28:33 +08:00
from nonebot . permission import Permission , USER
2020-12-20 11:59:23 +08:00
from nonebot . typing import T_State , T_StateFactory , T_Handler , T_ArgsParser
2020-12-24 22:19:08 +08:00
from nonebot . exception import PausedException , RejectedException , FinishedException , StopPropagation
2020-05-02 20:03:36 +08:00
2020-12-06 02:30:19 +08:00
if TYPE_CHECKING :
2020-12-07 00:06:09 +08:00
from nonebot . adapters import Bot , Event , Message , MessageSegment
2020-12-06 02:30:19 +08:00
2020-06-30 10:13:58 +08:00
matchers : Dict [ int , List [ Type [ " Matcher " ] ] ] = defaultdict ( list )
2020-10-05 23:10:20 +08:00
"""
: 类型 : ` ` Dict [ int , List [ Type [ Matcher ] ] ] ` `
2020-10-06 02:08:48 +08:00
: 说明 : 用于存储当前所有的事件响应器
2020-10-05 23:10:20 +08:00
"""
2020-08-25 15:23:10 +08:00
current_bot : ContextVar = ContextVar ( " current_bot " )
current_event : ContextVar = ContextVar ( " current_event " )
2020-06-30 10:13:58 +08:00
2020-05-02 20:03:36 +08:00
2020-08-27 16:43:58 +08:00
class MatcherMeta ( type ) :
def __repr__ ( self ) - > str :
return ( f " <Matcher from { self . module or ' unknow ' } , " # type: ignore
f " type= { self . type } , priority= { self . priority } , " # type: ignore
f " temp= { self . temp } > " ) # type: ignore
def __str__ ( self ) - > str :
2020-08-28 11:54:21 +08:00
return repr ( self )
2020-08-27 16:43:58 +08:00
class Matcher ( metaclass = MatcherMeta ) :
2020-10-06 02:08:48 +08:00
""" 事件响应器类 """
2020-08-27 16:43:58 +08:00
module : Optional [ str ] = None
2020-10-06 02:08:48 +08:00
"""
: 类型 : ` ` Optional [ str ] ` `
: 说明 : 事件响应器所在模块名称
"""
2020-05-02 20:03:36 +08:00
2020-08-20 17:15:05 +08:00
type : str = " "
2020-10-06 02:08:48 +08:00
"""
: 类型 : ` ` str ` `
: 说明 : 事件响应器类型
"""
2020-08-17 16:09:41 +08:00
rule : Rule = Rule ( )
2020-10-06 02:08:48 +08:00
"""
: 类型 : ` ` Rule ` `
: 说明 : 事件响应器匹配规则
"""
2020-08-17 16:09:41 +08:00
permission : Permission = Permission ( )
2020-10-06 02:08:48 +08:00
"""
: 类型 : ` ` Permission ` `
: 说明 : 事件响应器触发权限
"""
2020-12-17 21:09:30 +08:00
handlers : List [ T_Handler ] = [ ]
2020-10-06 02:08:48 +08:00
"""
2020-12-17 21:09:30 +08:00
: 类型 : ` ` List [ T_Handler ] ` `
2020-10-06 02:08:48 +08:00
: 说明 : 事件响应器拥有的事件处理函数列表
"""
2020-06-30 10:13:58 +08:00
priority : int = 1
2020-10-06 02:08:48 +08:00
"""
: 类型 : ` ` int ` `
: 说明 : 事件响应器优先级
"""
2020-08-21 14:24:32 +08:00
block : bool = False
2020-10-06 02:08:48 +08:00
"""
: 类型 : ` ` bool ` `
: 说明 : 事件响应器是否阻止事件传播
"""
temp : bool = False
"""
: 类型 : ` ` bool ` `
: 说明 : 事件响应器是否为临时
"""
expire_time : Optional [ datetime ] = None
"""
: 类型 : ` ` Optional [ datetime ] ` `
: 说明 : 事件响应器过期时间点
"""
2020-05-05 16:11:05 +08:00
2020-12-17 21:09:30 +08:00
_default_state : T_State = { }
2020-10-06 02:08:48 +08:00
"""
2020-12-17 21:09:30 +08:00
: 类型 : ` ` T_State ` `
2020-10-06 02:08:48 +08:00
: 说明 : 事件响应器默认状态
"""
2020-12-20 11:59:23 +08:00
_default_state_factory : Optional [ T_StateFactory ] = None
"""
: 类型 : ` ` Optional [ T_State ] ` `
: 说明 : 事件响应器默认工厂函数
"""
2020-06-30 10:13:58 +08:00
2020-12-17 21:09:30 +08:00
_default_parser : Optional [ T_ArgsParser ] = None
2020-10-06 02:08:48 +08:00
"""
2020-12-17 21:09:30 +08:00
: 类型 : ` ` Optional [ T_ArgsParser ] ` `
2020-10-06 02:08:48 +08:00
: 说明 : 事件响应器默认参数解析函数
"""
2020-05-05 16:11:05 +08:00
def __init__ ( self ) :
2020-11-30 11:08:00 +08:00
""" 实例化 Matcher 以便运行 """
2020-05-05 16:11:05 +08:00
self . handlers = self . handlers . copy ( )
self . state = self . _default_state . copy ( )
2020-08-24 17:59:36 +08:00
def __repr__ ( self ) - > str :
2020-12-30 18:33:54 +08:00
return ( f " <Matcher from { self . module or ' unknown ' } , type= { self . type } , "
2020-08-27 16:43:58 +08:00
f " priority= { self . priority } , temp= { self . temp } > " )
2020-08-24 17:59:36 +08:00
def __str__ ( self ) - > str :
return self . __repr__ ( )
2020-05-05 16:11:05 +08:00
@classmethod
2020-06-30 10:13:58 +08:00
def new ( cls ,
2020-08-20 17:15:05 +08:00
type_ : str = " " ,
2020-10-06 02:08:48 +08:00
rule : Optional [ Rule ] = None ,
permission : Optional [ Permission ] = None ,
2020-12-17 21:09:30 +08:00
handlers : Optional [ List [ T_Handler ] ] = None ,
2020-06-30 10:13:58 +08:00
temp : bool = False ,
priority : int = 1 ,
2020-08-21 14:24:32 +08:00
block : bool = False ,
2020-06-30 10:13:58 +08:00
* ,
2020-08-27 16:43:58 +08:00
module : Optional [ str ] = None ,
2020-12-17 21:09:30 +08:00
default_state : Optional [ T_State ] = None ,
2020-12-20 11:59:23 +08:00
default_state_factory : Optional [ T_StateFactory ] = None ,
2020-08-06 17:54:55 +08:00
expire_time : Optional [ datetime ] = None ) - > Type [ " Matcher " ] :
2020-10-06 02:08:48 +08:00
"""
: 说明 :
2020-11-30 11:08:00 +08:00
2020-10-06 02:08:48 +08:00
创建一个新的事件响应器 , 并存储至 ` matchers < #matchers>`_
2020-11-30 11:08:00 +08:00
2020-10-06 02:08:48 +08:00
: 参数 :
2020-11-30 11:08:00 +08:00
2020-12-31 17:58:09 +08:00
* ` ` type_ : str ` ` : 事件响应器类型 , 与 ` ` event . get_type ( ) ` ` 一致时触发 , 空字符串表示任意
2020-10-06 02:08:48 +08:00
* ` ` rule : Optional [ Rule ] ` ` : 匹配规则
* ` ` permission : Optional [ Permission ] ` ` : 权限
2020-12-17 21:09:30 +08:00
* ` ` handlers : Optional [ List [ T_Handler ] ] ` ` : 事件处理函数列表
2020-10-06 02:08:48 +08:00
* ` ` temp : bool ` ` : 是否为临时事件响应器 , 即触发一次后删除
* ` ` priority : int ` ` : 响应优先级
* ` ` block : bool ` ` : 是否阻止事件向更低优先级的响应器传播
* ` ` module : Optional [ str ] ` ` : 事件响应器所在模块名称
2020-12-17 21:09:30 +08:00
* ` ` default_state : Optional [ T_State ] ` ` : 默认状态 ` ` state ` `
2020-12-20 11:59:23 +08:00
* ` ` default_state_factory : Optional [ T_StateFactory ] ` ` : 默认状态 ` ` state ` ` 的工厂函数
2020-10-06 02:08:48 +08:00
* ` ` expire_time : Optional [ datetime ] ` ` : 事件响应器最终有效时间点 , 过时即被删除
2020-11-30 11:08:00 +08:00
2020-10-06 02:08:48 +08:00
: 返回 :
2020-11-30 11:08:00 +08:00
2020-10-06 02:08:48 +08:00
- ` ` Type [ Matcher ] ` ` : 新的事件响应器类
2020-07-04 22:51:10 +08:00
"""
2020-05-05 16:11:05 +08:00
NewMatcher = type (
2020-06-24 21:56:49 +08:00
" Matcher " , ( Matcher , ) , {
2020-12-20 12:09:30 +08:00
" module " :
module ,
" type " :
type_ ,
" rule " :
rule or Rule ( ) ,
" permission " :
permission or Permission ( ) ,
2021-02-02 12:48:16 +08:00
" handlers " : [
cls . process_handler ( handler ) for handler in handlers
] if handlers else [ ] ,
2020-12-20 12:09:30 +08:00
" temp " :
temp ,
" expire_time " :
expire_time ,
" priority " :
priority ,
" block " :
block ,
" _default_state " :
default_state or { } ,
" _default_state_factory " :
staticmethod ( default_state_factory )
if default_state_factory else None
2020-05-05 16:11:05 +08:00
} )
2020-06-30 10:13:58 +08:00
matchers [ priority ] . append ( NewMatcher )
2020-05-05 16:11:05 +08:00
return NewMatcher
2020-07-04 22:51:10 +08:00
@classmethod
2020-12-06 02:30:19 +08:00
async def check_perm ( cls , bot : " Bot " , event : " Event " ) - > bool :
2020-10-06 02:08:48 +08:00
"""
: 说明 :
2020-11-30 11:08:00 +08:00
2020-10-06 02:08:48 +08:00
检查是否满足触发权限
2020-11-30 11:08:00 +08:00
2020-10-06 02:08:48 +08:00
: 参数 :
2020-11-30 11:08:00 +08:00
2020-10-06 02:08:48 +08:00
* ` ` bot : Bot ` ` : Bot 对象
* ` ` event : Event ` ` : 上报事件
2020-11-30 11:08:00 +08:00
2020-10-06 02:08:48 +08:00
: 返回 :
2020-11-30 11:08:00 +08:00
2020-10-06 02:08:48 +08:00
- ` ` bool ` ` : 是否满足权限
"""
2021-02-02 12:48:16 +08:00
event_type = event . get_type ( )
return ( event_type == ( cls . type or event_type ) and
await cls . permission ( bot , event ) )
2020-08-17 16:09:41 +08:00
@classmethod
2020-12-17 21:09:30 +08:00
async def check_rule ( cls , bot : " Bot " , event : " Event " ,
state : T_State ) - > bool :
2020-10-06 02:08:48 +08:00
"""
: 说明 :
2020-11-30 11:08:00 +08:00
2020-10-06 02:08:48 +08:00
检查是否满足匹配规则
2020-11-30 11:08:00 +08:00
2020-10-06 02:08:48 +08:00
: 参数 :
2020-11-30 11:08:00 +08:00
2020-10-06 02:08:48 +08:00
* ` ` bot : Bot ` ` : Bot 对象
* ` ` event : Event ` ` : 上报事件
2020-12-17 21:09:30 +08:00
* ` ` state : T_State ` ` : 当前状态
2020-11-30 11:08:00 +08:00
2020-10-06 02:08:48 +08:00
: 返回 :
2020-11-30 11:08:00 +08:00
2020-10-06 02:08:48 +08:00
- ` ` bool ` ` : 是否满足匹配规则
2020-07-04 22:51:10 +08:00
"""
2020-12-09 19:57:49 +08:00
event_type = event . get_type ( )
return ( event_type == ( cls . type or event_type ) and
2020-09-22 00:18:57 +08:00
await cls . rule ( bot , event , state ) )
2020-07-04 22:51:10 +08:00
2020-08-18 11:28:33 +08:00
@classmethod
2020-12-17 21:09:30 +08:00
def args_parser ( cls , func : T_ArgsParser ) - > T_ArgsParser :
2020-10-06 02:08:48 +08:00
"""
: 说明 :
2020-11-30 11:08:00 +08:00
2020-10-06 17:03:05 +08:00
装饰一个函数来更改当前事件响应器的默认参数解析函数
2020-11-30 11:08:00 +08:00
2020-10-06 02:08:48 +08:00
: 参数 :
2020-11-30 11:08:00 +08:00
2020-12-17 21:09:30 +08:00
* ` ` func : T_ArgsParser ` ` : 参数解析函数
2020-10-06 02:08:48 +08:00
"""
2020-08-18 11:28:33 +08:00
cls . _default_parser = func
return func
2020-06-30 10:13:58 +08:00
2020-12-16 23:13:00 +08:00
@staticmethod
2020-12-17 21:09:30 +08:00
def process_handler ( handler : T_Handler ) - > T_Handler :
2020-12-16 23:13:00 +08:00
signature = inspect . signature ( handler , follow_wrapped = False )
bot = signature . parameters . get ( " bot " )
event = signature . parameters . get ( " event " )
state = signature . parameters . get ( " state " )
2020-12-24 22:19:08 +08:00
matcher = signature . parameters . get ( " matcher " )
2020-12-16 23:13:00 +08:00
if not bot :
raise ValueError ( " Handler missing parameter ' bot ' " )
handler . __params__ = {
" bot " : bot . annotation ,
" event " : event . annotation if event else None ,
2020-12-24 22:19:08 +08:00
" state " : T_State if state else None ,
" matcher " : matcher . annotation if matcher else None
2020-12-16 23:13:00 +08:00
}
return handler
@classmethod
2020-12-17 21:09:30 +08:00
def append_handler ( cls , handler : T_Handler ) - > None :
2020-12-16 23:13:00 +08:00
# Process handler first
cls . handlers . append ( cls . process_handler ( handler ) )
2020-05-05 16:11:05 +08:00
@classmethod
2020-12-17 21:09:30 +08:00
def handle ( cls ) - > Callable [ [ T_Handler ] , T_Handler ] :
2020-10-06 17:03:05 +08:00
"""
: 说明 :
2020-11-30 11:08:00 +08:00
2020-10-06 17:03:05 +08:00
装饰一个函数来向事件响应器直接添加一个处理函数
2020-11-30 11:08:00 +08:00
2020-10-06 17:03:05 +08:00
: 参数 :
2020-11-30 11:08:00 +08:00
2020-10-06 17:03:05 +08:00
* 无
"""
2020-06-30 10:13:58 +08:00
2020-12-17 21:09:30 +08:00
def _decorator ( func : T_Handler ) - > T_Handler :
2020-12-16 23:13:00 +08:00
cls . append_handler ( func )
2020-06-30 10:13:58 +08:00
return func
return _decorator
2020-05-02 20:03:36 +08:00
2020-05-05 16:11:05 +08:00
@classmethod
2020-12-17 21:09:30 +08:00
def receive ( cls ) - > Callable [ [ T_Handler ] , T_Handler ] :
2020-10-06 17:03:05 +08:00
"""
: 说明 :
2020-11-30 11:08:00 +08:00
2020-10-06 17:03:05 +08:00
装饰一个函数来指示 NoneBot 在接收用户新的一条消息后继续运行该函数
2020-11-30 11:08:00 +08:00
2020-10-06 17:03:05 +08:00
: 参数 :
2020-11-30 11:08:00 +08:00
2020-10-06 17:03:05 +08:00
* 无
"""
2020-05-02 20:03:36 +08:00
2021-01-06 18:29:24 +08:00
async def _receive ( bot : " Bot " , event : " Event " ) - > NoReturn :
2020-08-22 15:22:46 +08:00
raise PausedException
2020-05-02 20:03:36 +08:00
2021-01-06 18:29:24 +08:00
cls . process_handler ( _receive )
2020-08-22 15:22:46 +08:00
if cls . handlers :
# 已有前置handlers则接受一条新的消息, 否则视为接收初始消息
2020-12-16 23:13:00 +08:00
cls . append_handler ( _receive )
2020-05-05 16:11:05 +08:00
2020-12-17 21:09:30 +08:00
def _decorator ( func : T_Handler ) - > T_Handler :
2021-01-06 18:29:24 +08:00
cls . process_handler ( func )
2020-08-24 17:59:36 +08:00
if not cls . handlers or cls . handlers [ - 1 ] is not func :
2020-12-16 23:13:00 +08:00
cls . append_handler ( func )
2020-05-02 20:03:36 +08:00
2021-01-06 18:29:24 +08:00
_receive . __params__ . update ( {
" bot " :
func . __params__ [ " bot " ] ,
" event " :
func . __params__ [ " event " ] or _receive . __params__ [ " event " ]
} )
2020-05-02 20:03:36 +08:00
return func
return _decorator
2020-08-18 11:28:33 +08:00
@classmethod
def got (
cls ,
key : str ,
2020-12-06 02:30:19 +08:00
prompt : Optional [ Union [ str , " Message " , " MessageSegment " ] ] = None ,
2020-12-17 21:09:30 +08:00
args_parser : Optional [ T_ArgsParser ] = None
) - > Callable [ [ T_Handler ] , T_Handler ] :
2020-10-06 17:03:05 +08:00
"""
: 说明 :
2020-11-30 11:08:00 +08:00
2020-10-06 17:03:05 +08:00
装饰一个函数来指示 NoneBot 当要获取的 ` ` key ` ` 不存在时接收用户新的一条消息并经过 ` ` ArgsParser ` ` 处理后再运行该函数 , 如果 ` ` key ` ` 已存在则直接继续运行
2020-11-30 11:08:00 +08:00
2020-10-06 17:03:05 +08:00
: 参数 :
2020-11-30 11:08:00 +08:00
2020-10-06 17:03:05 +08:00
* ` ` key : str ` ` : 参数名
* ` ` prompt : Optional [ Union [ str , Message , MessageSegment ] ] ` ` : 在参数不存在时向用户发送的消息
2020-12-17 21:09:30 +08:00
* ` ` args_parser : Optional [ T_ArgsParser ] ` ` : 可选参数解析函数 , 空则使用默认解析函数
2020-10-06 17:03:05 +08:00
"""
2020-05-02 20:03:36 +08:00
2020-12-17 21:09:30 +08:00
async def _key_getter ( bot : " Bot " , event : " Event " , state : T_State ) :
2020-09-26 17:36:04 +08:00
state [ " _current_key " ] = key
2020-08-22 15:22:46 +08:00
if key not in state :
if prompt :
2020-11-09 16:34:14 +08:00
await bot . send ( event = event ,
message = str ( prompt ) . format ( * * state ) )
2020-08-22 15:22:46 +08:00
raise PausedException
2020-09-26 17:36:04 +08:00
else :
state [ " _skip_key " ] = True
2020-05-02 20:03:36 +08:00
2020-12-17 21:09:30 +08:00
async def _key_parser ( bot : " Bot " , event : " Event " , state : T_State ) :
2020-09-26 17:36:04 +08:00
if key in state and state . get ( " _skip_key " ) :
del state [ " _skip_key " ]
2020-09-26 16:33:30 +08:00
return
2020-08-22 15:22:46 +08:00
parser = args_parser or cls . _default_parser
if parser :
2020-12-17 21:09:30 +08:00
# parser = cast(T_ArgsParser["Bot", "Event"], parser)
2020-08-22 15:22:46 +08:00
await parser ( bot , event , state )
else :
2020-12-09 19:57:49 +08:00
state [ state [ " _current_key " ] ] = str ( event . get_message ( ) )
2020-08-22 15:22:46 +08:00
2020-12-16 23:13:00 +08:00
cls . append_handler ( _key_getter )
cls . append_handler ( _key_parser )
2020-08-22 15:22:46 +08:00
2020-12-17 21:09:30 +08:00
def _decorator ( func : T_Handler ) - > T_Handler :
2020-08-24 17:59:36 +08:00
if not hasattr ( cls . handlers [ - 1 ] , " __wrapped__ " ) :
2020-12-16 23:13:00 +08:00
cls . process_handler ( func )
2020-08-24 17:59:36 +08:00
parser = cls . handlers . pop ( )
@wraps ( func )
2020-12-24 22:19:08 +08:00
async def wrapper ( bot : " Bot " , event : " Event " , state : T_State ,
matcher : Matcher ) :
await matcher . run_handler ( parser , bot , event , state )
await matcher . run_handler ( func , bot , event , state )
2020-09-26 16:33:30 +08:00
if " _current_key " in state :
del state [ " _current_key " ]
2020-08-24 17:59:36 +08:00
2020-12-16 23:13:00 +08:00
cls . append_handler ( wrapper )
2020-05-02 20:03:36 +08:00
2021-01-06 18:29:24 +08:00
wrapper . __params__ . update ( {
" bot " :
func . __params__ [ " bot " ] ,
" event " :
func . __params__ [ " event " ] or wrapper . __params__ [ " event " ]
} )
_key_getter . __params__ . update ( {
" bot " :
func . __params__ [ " bot " ] ,
" event " :
func . __params__ [ " event " ] or wrapper . __params__ [ " event " ]
} )
_key_parser . __params__ . update ( {
" bot " :
func . __params__ [ " bot " ] ,
" event " :
func . __params__ [ " event " ] or wrapper . __params__ [ " event " ]
} )
2020-08-18 11:28:33 +08:00
return func
2020-05-02 20:03:36 +08:00
2020-08-18 11:28:33 +08:00
return _decorator
2020-05-02 20:03:36 +08:00
2020-10-06 16:24:04 +08:00
@classmethod
2020-12-06 02:30:19 +08:00
async def send ( cls , message : Union [ str , " Message " , " MessageSegment " ] ,
* * kwargs ) :
2020-10-06 17:03:05 +08:00
"""
: 说明 :
2020-11-30 11:08:00 +08:00
2020-10-06 17:03:05 +08:00
发送一条消息给当前交互用户
2020-11-30 11:08:00 +08:00
2020-10-06 17:03:05 +08:00
: 参数 :
2020-11-30 11:08:00 +08:00
2020-10-06 17:03:05 +08:00
* ` ` message : Union [ str , Message , MessageSegment ] ` ` : 消息内容
2020-10-17 19:50:25 +08:00
* ` ` * * kwargs ` ` : 其他传递给 ` ` bot . send ` ` 的参数 , 请参考对应 adapter 的 bot 对象 api
2020-10-06 17:03:05 +08:00
"""
2020-10-06 16:24:04 +08:00
bot = current_bot . get ( )
event = current_event . get ( )
2021-02-07 10:14:19 +08:00
await bot . send ( event = event , message = message , * * kwargs )
2020-10-06 16:24:04 +08:00
2020-08-18 11:28:33 +08:00
@classmethod
2020-10-17 19:50:25 +08:00
async def finish ( cls ,
2020-12-06 02:30:19 +08:00
message : Optional [ Union [ str , " Message " ,
" MessageSegment " ] ] = None ,
2020-10-17 19:50:25 +08:00
* * kwargs ) - > NoReturn :
2020-10-06 17:03:05 +08:00
"""
: 说明 :
2020-11-30 11:08:00 +08:00
2020-10-06 17:03:05 +08:00
发送一条消息给当前交互用户并结束当前事件响应器
2020-11-30 11:08:00 +08:00
2020-10-06 17:03:05 +08:00
: 参数 :
2020-11-30 11:08:00 +08:00
2020-10-06 17:03:05 +08:00
* ` ` message : Union [ str , Message , MessageSegment ] ` ` : 消息内容
2020-10-17 19:50:25 +08:00
* ` ` * * kwargs ` ` : 其他传递给 ` ` bot . send ` ` 的参数 , 请参考对应 adapter 的 bot 对象 api
2020-10-06 17:03:05 +08:00
"""
2020-10-06 16:24:04 +08:00
bot = current_bot . get ( )
event = current_event . get ( )
2020-10-06 17:03:05 +08:00
if message :
2020-10-17 19:50:25 +08:00
await bot . send ( event = event , message = message , * * kwargs )
2020-08-18 11:28:33 +08:00
raise FinishedException
2020-05-02 20:03:36 +08:00
2020-08-18 11:28:33 +08:00
@classmethod
2020-10-17 19:50:25 +08:00
async def pause ( cls ,
2020-12-06 02:30:19 +08:00
prompt : Optional [ Union [ str , " Message " ,
" MessageSegment " ] ] = None ,
2020-10-17 19:50:25 +08:00
* * kwargs ) - > NoReturn :
2020-10-06 17:03:05 +08:00
"""
: 说明 :
2020-11-30 11:08:00 +08:00
2020-10-06 17:03:05 +08:00
发送一条消息给当前交互用户并暂停事件响应器 , 在接收用户新的一条消息后继续下一个处理函数
2020-11-30 11:08:00 +08:00
2020-10-06 17:03:05 +08:00
: 参数 :
2020-11-30 11:08:00 +08:00
2020-10-06 17:03:05 +08:00
* ` ` prompt : Union [ str , Message , MessageSegment ] ` ` : 消息内容
2020-10-17 19:50:25 +08:00
* ` ` * * kwargs ` ` : 其他传递给 ` ` bot . send ` ` 的参数 , 请参考对应 adapter 的 bot 对象 api
2020-10-06 17:03:05 +08:00
"""
2020-10-06 16:24:04 +08:00
bot = current_bot . get ( )
event = current_event . get ( )
2020-08-25 15:23:10 +08:00
if prompt :
2020-10-17 19:50:25 +08:00
await bot . send ( event = event , message = prompt , * * kwargs )
2020-08-18 11:28:33 +08:00
raise PausedException
2020-06-30 10:13:58 +08:00
2020-08-18 11:28:33 +08:00
@classmethod
2020-10-17 19:50:25 +08:00
async def reject ( cls ,
2020-12-06 02:30:19 +08:00
prompt : Optional [ Union [ str , " Message " ,
" MessageSegment " ] ] = None ,
2020-10-17 19:50:25 +08:00
* * kwargs ) - > NoReturn :
2020-10-06 17:03:05 +08:00
"""
: 说明 :
2020-11-30 11:08:00 +08:00
2020-10-06 17:03:05 +08:00
发送一条消息给当前交互用户并暂停事件响应器 , 在接收用户新的一条消息后重新运行当前处理函数
2020-11-30 11:08:00 +08:00
2020-10-06 17:03:05 +08:00
: 参数 :
2020-11-30 11:08:00 +08:00
2020-10-06 17:03:05 +08:00
* ` ` prompt : Union [ str , Message , MessageSegment ] ` ` : 消息内容
2020-10-17 19:50:25 +08:00
* ` ` * * kwargs ` ` : 其他传递给 ` ` bot . send ` ` 的参数 , 请参考对应 adapter 的 bot 对象 api
2020-10-06 17:03:05 +08:00
"""
2020-10-06 16:24:04 +08:00
bot = current_bot . get ( )
event = current_event . get ( )
2020-08-25 15:23:10 +08:00
if prompt :
2020-10-17 19:50:25 +08:00
await bot . send ( event = event , message = prompt , * * kwargs )
2020-08-18 11:28:33 +08:00
raise RejectedException
2020-05-02 20:03:36 +08:00
2020-12-24 22:19:08 +08:00
def stop_propagation ( self ) :
self . block = True
async def run_handler ( self , handler : T_Handler , bot : " Bot " , event : " Event " ,
2020-12-17 21:09:30 +08:00
state : T_State ) :
2020-12-16 23:13:00 +08:00
if not hasattr ( handler , " __params__ " ) :
2020-12-24 22:19:08 +08:00
self . process_handler ( handler )
2020-12-16 23:13:00 +08:00
params = getattr ( handler , " __params__ " )
2020-12-30 18:33:54 +08:00
2020-12-16 23:13:00 +08:00
BotType = ( ( params [ " bot " ] is not inspect . Parameter . empty ) and
inspect . isclass ( params [ " bot " ] ) and params [ " bot " ] )
2020-12-30 18:33:54 +08:00
if BotType and not isinstance ( bot , BotType ) :
2020-12-30 20:08:22 +08:00
logger . debug (
2020-12-30 18:33:54 +08:00
f " Matcher { self } bot type { type ( bot ) } not match annotation { BotType } , ignored "
)
return
2020-12-16 23:13:00 +08:00
EventType = ( ( params [ " event " ] is not inspect . Parameter . empty ) and
inspect . isclass ( params [ " event " ] ) and params [ " event " ] )
2020-12-30 18:33:54 +08:00
if EventType and not isinstance ( event , EventType ) :
2020-12-30 20:08:22 +08:00
logger . debug (
2020-12-30 18:33:54 +08:00
f " Matcher { self } event type { type ( event ) } not match annotation { EventType } , ignored "
)
2020-12-16 23:13:00 +08:00
return
2020-12-30 18:33:54 +08:00
2020-12-24 22:19:08 +08:00
args = { " bot " : bot , " event " : event , " state " : state , " matcher " : self }
2020-12-16 23:13:00 +08:00
await handler (
* * { k : v for k , v in args . items ( ) if params [ k ] is not None } )
2020-07-04 22:51:10 +08:00
# 运行handlers
2020-12-17 21:09:30 +08:00
async def run ( self , bot : " Bot " , event : " Event " , state : T_State ) :
2020-08-25 15:23:10 +08:00
b_t = current_bot . set ( bot )
e_t = current_event . set ( event )
2020-05-05 16:11:05 +08:00
try :
2020-08-17 16:09:41 +08:00
# Refresh preprocess state
2020-12-20 11:59:23 +08:00
state_ = await self . _default_state_factory (
bot , event ) if self . _default_state_factory else self . state
state_ . update ( state )
2020-08-17 16:09:41 +08:00
2020-05-05 16:11:05 +08:00
for _ in range ( len ( self . handlers ) ) :
handler = self . handlers . pop ( 0 )
2020-12-20 11:59:23 +08:00
await self . run_handler ( handler , bot , event , state_ )
2020-08-18 11:28:33 +08:00
2020-05-05 16:11:05 +08:00
except RejectedException :
2020-06-30 10:13:58 +08:00
self . handlers . insert ( 0 , handler ) # type: ignore
2020-08-24 17:59:36 +08:00
Matcher . new (
2021-01-24 18:16:18 +08:00
" message " ,
2020-08-24 17:59:36 +08:00
Rule ( ) ,
2020-12-09 19:57:49 +08:00
USER ( event . get_session_id ( ) ,
perm = self . permission ) , # type:ignore
2020-08-17 16:09:41 +08:00
self . handlers ,
temp = True ,
priority = 0 ,
2020-08-24 17:59:36 +08:00
block = True ,
2020-09-22 11:28:38 +08:00
module = self . module ,
2020-08-17 16:09:41 +08:00
default_state = self . state ,
expire_time = datetime . now ( ) + bot . config . session_expire_timeout )
2020-05-05 16:11:05 +08:00
except PausedException :
2020-08-24 17:59:36 +08:00
Matcher . new (
2021-01-24 18:16:18 +08:00
" message " ,
2020-08-24 17:59:36 +08:00
Rule ( ) ,
2020-12-09 19:57:49 +08:00
USER ( event . get_session_id ( ) ,
perm = self . permission ) , # type:ignore
2020-08-17 16:09:41 +08:00
self . handlers ,
temp = True ,
priority = 0 ,
2020-08-24 17:59:36 +08:00
block = True ,
2020-09-22 11:28:38 +08:00
module = self . module ,
2020-08-17 16:09:41 +08:00
default_state = self . state ,
expire_time = datetime . now ( ) + bot . config . session_expire_timeout )
2020-05-05 16:11:05 +08:00
except FinishedException :
2020-08-25 15:23:10 +08:00
pass
2020-12-24 22:19:08 +08:00
except StopPropagation :
self . block = True
2020-08-25 15:23:10 +08:00
finally :
2020-08-27 16:43:58 +08:00
logger . info ( f " Matcher { self } running complete " )
2020-08-25 15:23:10 +08:00
current_bot . reset ( b_t )
current_event . reset ( e_t )