From 4aa1e2d0f410b376d668e1ba7aca2a5c62f1a1da Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Sat, 9 Jan 2021 21:58:39 -0500 Subject: [PATCH] React to undecryptable messages --- my_project_name/callbacks.py | 26 +++++++++++++++++++++-- my_project_name/chat_functions.py | 34 ++++++++++++++++++++++++++++++- my_project_name/main.py | 2 ++ 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/my_project_name/callbacks.py b/my_project_name/callbacks.py index a7443ec..3c7406b 100644 --- a/my_project_name/callbacks.py +++ b/my_project_name/callbacks.py @@ -1,9 +1,9 @@ import logging -from nio import JoinError, MatrixRoom, RoomGetEventError, UnknownEvent +from nio import JoinError, MatrixRoom, MegolmEvent, RoomGetEventError, UnknownEvent from my_project_name.bot_commands import Command -from my_project_name.chat_functions import make_pill, send_text_to_room +from my_project_name.chat_functions import make_pill, react_to_event, send_text_to_room from my_project_name.message_responses import Message logger = logging.getLogger(__name__) @@ -130,6 +130,28 @@ class Callbacks(object): reply_to_event_id=reacted_to_id, ) + async def decryption_failure(self, room: MatrixRoom, event: MegolmEvent): + """Callback for when an event fails to decrypt. Inform the user""" + logger.error( + f"Failed to decrypt event '{event.event_id}' in room '{room.room_id}'!" + f"\n\n" + f"Tip: try using a different device ID in your config file and restart." + f"\n\n" + f"If all else fails, delete your store directory and let the bot recreate " + f"it (your reminders will NOT be deleted, but the bot may respond to existing " + f"commands a second time)." + ) + + red_x_and_lock_emoji = "❌ 🔐" + + # React to the undecryptable event with some emoji + await react_to_event( + self.client, + room.room_id, + event.event_id, + red_x_and_lock_emoji, + ) + async def unknown(self, room: MatrixRoom, event: UnknownEvent): """Callback for when an event with a type that is unknown to matrix-nio is received. Currently this is used for reaction events, which are not specced. diff --git a/my_project_name/chat_functions.py b/my_project_name/chat_functions.py index 87038fb..c8959fb 100644 --- a/my_project_name/chat_functions.py +++ b/my_project_name/chat_functions.py @@ -2,7 +2,14 @@ import logging from typing import Optional, Union from markdown import markdown -from nio import AsyncClient, ErrorResponse, Response, SendRetryError +from nio import ( + AsyncClient, + ErrorResponse, + MatrixRoom, + MegolmEvent, + Response, + SendRetryError, +) logger = logging.getLogger(__name__) @@ -116,3 +123,28 @@ async def react_to_event( content, ignore_unverified_devices=True, ) + + +async def decryption_failure(self, room: MatrixRoom, event: MegolmEvent): + """Callback for when an event fails to decrypt. Inform the user""" + logger.error( + f"Failed to decrypt event '{event.event_id}' in room '{room.room_id}'!" + f"\n\n" + f"Tip: try using a different device ID in your config file and restart." + f"\n\n" + f"If all else fails, delete your store directory and let the bot recreate " + f"it (your reminders will NOT be deleted, but the bot may respond to existing " + f"commands a second time)." + ) + + user_msg = ( + "Unable to decrypt this message. " + "Check whether you've chosen to only encrypt to trusted devices." + ) + + await send_text_to_room( + self.client, + room.room_id, + user_msg, + reply_to_event_id=event.event_id, + ) diff --git a/my_project_name/main.py b/my_project_name/main.py index 732340b..a7d3936 100644 --- a/my_project_name/main.py +++ b/my_project_name/main.py @@ -11,6 +11,7 @@ from nio import ( InviteMemberEvent, LocalProtocolError, LoginError, + MegolmEvent, RoomMessageText, UnknownEvent, ) @@ -60,6 +61,7 @@ async def main(): callbacks = Callbacks(client, store, config) client.add_event_callback(callbacks.message, (RoomMessageText,)) client.add_event_callback(callbacks.invite, (InviteMemberEvent,)) + client.add_event_callback(callbacks.decryption_failure, (MegolmEvent,)) client.add_event_callback(callbacks.unknown, (UnknownEvent,)) # Keep trying to reconnect on failure (with some time in-between)