nonebot2/nonebot/notice_request.py

94 lines
2.7 KiB
Python
Raw Normal View History

from functools import update_wrapper
2020-04-07 21:58:10 +08:00
from typing import List, Optional, Callable, Union
2018-06-27 22:50:01 +08:00
from aiocqhttp import Event as CQEvent
2018-06-27 22:50:01 +08:00
from aiocqhttp.bus import EventBus
2018-07-04 09:28:31 +08:00
from . import NoneBot
2018-06-27 22:50:01 +08:00
from .log import logger
2020-04-22 13:55:33 +08:00
from .exceptions import CQHttpError
2018-07-02 16:54:29 +08:00
from .session import BaseSession
2018-06-27 22:50:01 +08:00
_bus = EventBus()
2020-04-20 13:50:38 +08:00
2020-04-07 21:58:10 +08:00
class EventHandler:
2020-04-20 13:50:38 +08:00
__slots__ = ('events', 'func')
2020-04-07 21:58:10 +08:00
def __init__(self, events: List[str], func: Callable):
self.events = events
self.func = func
2018-06-27 22:50:01 +08:00
class NoticeSession(BaseSession):
__slots__ = ()
def __init__(self, bot: NoneBot, event: CQEvent):
super().__init__(bot, event)
2018-06-27 22:50:01 +08:00
class RequestSession(BaseSession):
__slots__ = ()
def __init__(self, bot: NoneBot, event: CQEvent):
super().__init__(bot, event)
2018-06-27 22:50:01 +08:00
2018-08-22 23:00:22 +08:00
async def approve(self, remark: str = '') -> None:
"""
Approve the request.
:param remark: remark of friend (only works in friend request)
"""
try:
2020-04-20 13:50:38 +08:00
await self.bot.call_action(action='.handle_quick_operation_async',
self_id=self.event.self_id,
context=self.event,
operation={
'approve': True,
'remark': remark
})
except CQHttpError:
pass
2018-08-22 23:00:22 +08:00
async def reject(self, reason: str = '') -> None:
"""
Reject the request.
:param reason: reason to reject (only works in group request)
"""
try:
2020-04-20 13:50:38 +08:00
await self.bot.call_action(action='.handle_quick_operation_async',
self_id=self.event.self_id,
context=self.event,
operation={
'approve': False,
'reason': reason
})
except CQHttpError:
pass
2018-06-27 22:50:01 +08:00
async def handle_notice_or_request(bot: NoneBot, event: CQEvent) -> None:
if event.type == 'notice':
_log_notice(event)
session = NoticeSession(bot, event)
2018-07-01 20:01:05 +08:00
else: # must be 'request'
_log_request(event)
session = RequestSession(bot, event)
2018-06-27 22:50:01 +08:00
ev_name = event.name
logger.debug(f'Emitting event: {ev_name}')
2018-12-25 20:40:36 +08:00
try:
await _bus.emit(ev_name, session)
2018-12-25 20:40:36 +08:00
except Exception as e:
logger.error(f'An exception occurred while handling event {ev_name}:')
2018-12-25 20:40:36 +08:00
logger.exception(e)
2018-07-21 00:46:34 +08:00
def _log_notice(event: CQEvent) -> None:
logger.info(f'Notice: {event}')
2018-07-21 00:46:34 +08:00
def _log_request(event: CQEvent) -> None:
logger.info(f'Request: {event}')