from nio import MatrixRoom, Event from matrix_bot.config import logger from matrix_bot.client import MatrixClient def properly_fail(function): """use this decorator so that your async callback never crash, log the error and return a message to the room""" @wraps(function) def decorated(room: MatrixRoom, message: Event, matrix_client: MatrixClient): function_instance = function(room, message, matrix_client) async def inner(): try: return await function_instance except Exception as unexpected_exception: # noqa await matrix_client.send_text_message(room.room_id, "Oups, j'ai buggué 😿", "m.notice") logger.warning(f"command failed with exception : {unexpected_exception}") exit() finally: await matrix_client.room_typing(room.room_id, typing_state=False) return inner() return decorated