message.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. from nio import MatrixRoom, RoomMessageText, MegolmEvent, RoomKeyRequestError, RoomKeyRequestResponse
  2. from datetime import datetime
  3. async def message_callback(room: MatrixRoom | str, event: RoomMessageText | MegolmEvent, bot):
  4. bot.logger.log(f"Received message from {event.sender} in room {room.room_id}")
  5. sent = datetime.fromtimestamp(event.server_timestamp / 1000)
  6. received = datetime.now()
  7. latency = received - sent
  8. if isinstance(event, MegolmEvent):
  9. try:
  10. event = await bot.matrix_client.decrypt_event(event)
  11. except Exception as e:
  12. try:
  13. bot.logger.log("Requesting new encryption keys...")
  14. response = await bot.matrix_client.request_room_key(event)
  15. if isinstance(response, RoomKeyRequestError):
  16. bot.logger.log(f"Error requesting encryption keys: {response}", "error")
  17. elif isinstance(response, RoomKeyRequestResponse):
  18. bot.logger.log(f"Encryption keys received: {response}", "debug")
  19. bot.matrix_bot.olm.handle_response(response)
  20. event = await bot.matrix_client.decrypt_event(event)
  21. except:
  22. pass
  23. bot.logger.log(f"Error decrypting message: {e}", "error")
  24. await bot.send_message(room, "Sorry, I couldn't decrypt that message. Please try again later or switch to a room without encryption.", True)
  25. return
  26. if event.sender == bot.matrix_client.user_id:
  27. bot.logger.log("Message is from bot itself - ignoring")
  28. elif event.body.startswith("!gptbot"):
  29. await bot.process_command(room, event)
  30. elif event.body.startswith("!"):
  31. bot.logger.log(f"Received {event.body} - might be a command, but not for this bot - ignoring")
  32. else:
  33. await bot.process_query(room, event)
  34. processed = datetime.now()
  35. processing_time = processed - received
  36. bot.logger.log(f"Message processing took {processing_time.total_seconds()} seconds (latency: {latency.total_seconds()} seconds)")
  37. if bot.room_uses_timing(room):
  38. await bot.send_message(room, f"Message processing took {processing_time.total_seconds()} seconds (latency: {latency.total_seconds()} seconds)", True)