mirror of
https://github.com/nonebot/nonebot2.git
synced 2024-11-24 09:05:04 +08:00
63 lines
2.0 KiB
Python
63 lines
2.0 KiB
Python
from typing import Dict, Any, Union, List, Sequence, Callable, Optional
|
|
|
|
from aiocqhttp import CQHttp, Error as CQHttpError
|
|
from aiocqhttp.bus import EventBus
|
|
|
|
from . import expression
|
|
|
|
|
|
def context_source(ctx: Dict[str, Any]) -> str:
|
|
src = ''
|
|
if ctx.get('group_id'):
|
|
src += f'/group/{ctx["group_id"]}'
|
|
elif ctx.get('discuss_id'):
|
|
src += f'/discuss/{ctx["discuss_id"]}'
|
|
if ctx.get('user_id'):
|
|
src += f'/user/{ctx["user_id"]}'
|
|
return src
|
|
|
|
|
|
async def send(bot: CQHttp, ctx: Dict[str, Any],
|
|
message: Union[str, Dict[str, Any], List[Dict[str, Any]]],
|
|
*, ignore_failure: bool = True) -> None:
|
|
try:
|
|
if ctx.get('post_type') == 'message':
|
|
await bot.send(ctx, message)
|
|
else:
|
|
ctx = ctx.copy()
|
|
if 'message' in ctx:
|
|
del ctx['message']
|
|
if 'group_id' in ctx:
|
|
await bot.send_group_msg(**ctx, message=message)
|
|
elif 'discuss_id' in ctx:
|
|
await bot.send_discuss_msg(**ctx, message=message)
|
|
elif 'user_id' in ctx:
|
|
await bot.send_private_msg(**ctx, message=message)
|
|
except CQHttpError:
|
|
if not ignore_failure:
|
|
raise
|
|
|
|
|
|
async def send_expr(bot: CQHttp, ctx: Dict[str, Any],
|
|
expr: Union[str, Sequence[str], Callable],
|
|
**kwargs):
|
|
return await send(bot, ctx, expression.render(expr, **kwargs))
|
|
|
|
|
|
def make_event_deco(post_type: str, bus: EventBus) -> Callable:
|
|
def deco_deco(arg: Optional[Union[str, Callable]] = None,
|
|
*events: str) -> Callable:
|
|
def deco(func: Callable) -> Callable:
|
|
if isinstance(arg, str):
|
|
for e in [arg] + list(events):
|
|
bus.subscribe(f'{post_type}.{e}', func)
|
|
else:
|
|
bus.subscribe(post_type, func)
|
|
return func
|
|
|
|
if isinstance(arg, Callable):
|
|
return deco(arg)
|
|
return deco
|
|
|
|
return deco_deco
|