43 lines
1.7 KiB
Python
43 lines
1.7 KiB
Python
from asyncio import get_event_loop, ensure_future
|
|
from json import loads
|
|
|
|
|
|
from .context import Context
|
|
from .config import get_config
|
|
from .utils import _
|
|
|
|
|
|
class Remote:
|
|
async def register_remote(self) -> None:
|
|
print()
|
|
print(_('======== Registered remote event ========'))
|
|
self.listened_connection = await self.pool.acquire()
|
|
for version, messages in self.messages.items():
|
|
for message, message_infos in messages.items():
|
|
# event not emit locally
|
|
if message_infos['pattern'] == 'event':
|
|
module, submodule, submessage = message.split('.', 2)
|
|
if f'{module}.{submodule}' not in self.injected_self:
|
|
uri = f'{version}.{message}'
|
|
print(f' - {uri}')
|
|
await self.listened_connection.add_listener(uri, self.to_async_publish)
|
|
|
|
def to_async_publish(self,
|
|
con: 'asyncpg.connection.Connection',
|
|
pid: int,
|
|
uri: str,
|
|
payload: str,
|
|
) -> None:
|
|
version, message = uri.split('.', 1)
|
|
loop = get_event_loop()
|
|
remote_kw = loads(payload)
|
|
context = Context()
|
|
for key, value in remote_kw['context'].items():
|
|
setattr(context, key, value)
|
|
callback = lambda: ensure_future(self.publish(version,
|
|
message,
|
|
context,
|
|
**remote_kw['kwargs'],
|
|
))
|
|
loop.call_soon(callback)
|