""" The bot that send messages. """ import asyncio from typing import ( Any, NoReturn ) import nio from matrix_bot.client import Client from matrix_bot.invite_policy import WhiteList from matrix_bot.utils import ignore_client_message from .config import Config from .format import Message @ignore_client_message async def __pong( client: Client, room: nio.rooms.MatrixRoom, message: nio.events.room_events.RoomMessageText ): """ If the bot is pinged, send "Pong" """ if (client.user_name + ':') in message.body: await client.send_message(room.room_id, "Pong") async def __send_messsages( message_queue: asyncio.Queue[Message], bot: Client, rooms: list[str] )->NoReturn: """ Actually send the messages from the queue. """ while True: message = await message_queue.get() for room in rooms: await bot.send_formated_message( room, message.formated_body, unformated_message=message.body ) message_queue.task_done() async def send_messages( message_queue: asyncio.Queue[dict[str, Any]], # For now, type will change in the futur config: Config ): """ Initialize the bot and send messages added to the queue to the alert_rooms. """ bot = await Client( config.username, config.homeserver, config.password ) invite_policy = await WhiteList(bot, config.alert_rooms) bot.set_invite_policy(invite_policy) bot.add_message_callback(__pong) await asyncio.gather( bot.run(), __send_messsages( message_queue, bot, config.alert_rooms ) )