mirror of
https://github.com/nonebot/nonebot2.git
synced 2025-07-28 00:31:14 +00:00
✨ cqhttp support forward websocket
This commit is contained in:
@ -71,11 +71,11 @@ class Bot(abc.ABC):
|
||||
raise NotImplementedError
|
||||
|
||||
@classmethod
|
||||
def register(cls, driver: Driver, config: Config):
|
||||
def register(cls, driver: Driver, config: Config, **kwargs):
|
||||
"""
|
||||
:说明:
|
||||
|
||||
`register` 方法会在 `driver.register_adapter` 时被调用,用于初始化相关配置
|
||||
``register`` 方法会在 ``driver.register_adapter`` 时被调用,用于初始化相关配置
|
||||
"""
|
||||
cls.driver = driver
|
||||
cls.config = config
|
||||
|
@ -84,6 +84,7 @@ class Driver(abc.ABC):
|
||||
|
||||
* ``name: str``: 适配器名称,用于在连接时进行识别
|
||||
* ``adapter: Type[Bot]``: 适配器 Class
|
||||
* ``**kwargs``: 其他传递给适配器的参数
|
||||
"""
|
||||
if name in self._adapters:
|
||||
logger.opt(
|
||||
@ -195,7 +196,8 @@ class Driver(abc.ABC):
|
||||
class ForwardDriver(Driver):
|
||||
|
||||
@abc.abstractmethod
|
||||
def setup(self, adapter: str, request: "HTTPConnection") -> None:
|
||||
def setup(self, adapter: str, self_id: str,
|
||||
request: "HTTPConnection") -> None:
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
|
@ -24,6 +24,7 @@ AVAILABLE_REQUEST = Union[HTTPRequest, WebSocket]
|
||||
@dataclass
|
||||
class RequestSetup:
|
||||
adapter: str
|
||||
self_id: str
|
||||
request: AVAILABLE_REQUEST
|
||||
poll_interval: float
|
||||
reconnect_interval: float
|
||||
@ -61,13 +62,15 @@ class Driver(ForwardDriver):
|
||||
@overrides(ForwardDriver)
|
||||
def setup(self,
|
||||
adapter: str,
|
||||
self_id: str,
|
||||
request: HTTPConnection,
|
||||
poll_interval: float = 3.,
|
||||
reconnect_interval: float = 3.) -> None:
|
||||
if not isinstance(request, (HTTPRequest, WebSocket)):
|
||||
raise TypeError(f"Request Type {type(request)!r} is not supported!")
|
||||
self.requests.append(
|
||||
RequestSetup(adapter, request, poll_interval, reconnect_interval))
|
||||
RequestSetup(adapter, self_id, request, poll_interval,
|
||||
reconnect_interval))
|
||||
|
||||
@overrides(ForwardDriver)
|
||||
def run(self, *args, **kwargs):
|
||||
@ -90,11 +93,11 @@ class Driver(ForwardDriver):
|
||||
for setup in self.requests:
|
||||
if isinstance(setup.request, HTTPRequest):
|
||||
setups.append(
|
||||
self._http_setup(setup.adapter, setup.request,
|
||||
setup.poll_interval))
|
||||
self._http_setup(setup.adapter, setup.self_id,
|
||||
setup.request, setup.poll_interval))
|
||||
else:
|
||||
setups.append(
|
||||
self._ws_setup(setup.adapter, setup.request,
|
||||
self._ws_setup(setup.adapter, setup.self_id, setup.request,
|
||||
setup.reconnect_interval))
|
||||
|
||||
try:
|
||||
@ -142,26 +145,17 @@ class Driver(ForwardDriver):
|
||||
|
||||
loop.stop()
|
||||
|
||||
async def _http_setup(self, adapter: str, request: HTTPRequest,
|
||||
poll_interval: float):
|
||||
async def _http_setup(self, adapter: str, self_id: str,
|
||||
request: HTTPRequest, poll_interval: float):
|
||||
BotClass = self._adapters[adapter]
|
||||
self_id, _ = await BotClass.check_permission(self, request)
|
||||
|
||||
if not self_id:
|
||||
raise SetupFailed("Bot self_id get failed")
|
||||
|
||||
bot = BotClass(self_id, request)
|
||||
self._bot_connect(bot)
|
||||
asyncio.create_task(self._http_loop(bot, request, poll_interval))
|
||||
|
||||
async def _ws_setup(self, adapter: str, request: WebSocket,
|
||||
async def _ws_setup(self, adapter: str, self_id: str, request: WebSocket,
|
||||
reconnect_interval: float):
|
||||
BotClass = self._adapters[adapter]
|
||||
self_id, _ = await BotClass.check_permission(self, request)
|
||||
|
||||
if not self_id:
|
||||
raise SetupFailed("Bot self_id get failed")
|
||||
|
||||
bot = BotClass(self_id, request)
|
||||
self._bot_connect(bot)
|
||||
asyncio.create_task(self._ws_loop(bot, request, reconnect_interval))
|
||||
|
Reference in New Issue
Block a user