diff --git a/bot.py b/bot.py index f92be70..e693c7d 100644 --- a/bot.py +++ b/bot.py @@ -1364,6 +1364,30 @@ class Bot: self.client.add_to_device_callback(self.on_key_verification, KeyVerificationCancel) self.client.add_to_device_callback(self.on_to_device_unknown, UnknownToDeviceEvent) + # Monkey-patch nio's Olm handler to forward unknown Olm event types + # (like io.element.call.encryption_keys) instead of silently dropping them. + if self.client.olm: + _orig_handle_olm = self.client.olm._handle_olm_event + bot_ref = self + + def _patched_handle_olm_event(sender, sender_key, payload): + result = _orig_handle_olm(sender, sender_key, payload) + if result is None and payload.get("type") not in ("m.room_key", "m.forwarded_room_key", "m.dummy"): + # Forward as callback — nio drops unknown Olm types but we need them + evt_type = payload.get("type", "") + content = payload.get("content", {}) + logger.info("Forwarding decrypted Olm event type=%s from %s to handler", evt_type, sender) + asyncio.ensure_future(bot_ref.on_to_device_unknown( + type( + "DecryptedOlmUnknown", (), + {"source": {"type": evt_type, "content": content, "sender": sender}, + "type": evt_type, "sender": sender} + )() + )) + return result + + self.client.olm._handle_olm_event = _patched_handle_olm_event + # Cache display name for mention matching in group rooms try: dn_resp = await self.client.get_displayname(BOT_USER)