import logging from synapse.module_api import ModuleApi logger = logging.getLogger(__name__) class AutoInviteBotModule: def __init__(self, config, api: ModuleApi): self.api = api self.bot_user_id = config.get("bot_user_id", "@bot.id:blackmesaresearch.net") logger.info("Module initialized with bot_user_id: %s", self.bot_user_id) # Register the new event callback only self.api.register_third_party_rules_callbacks( on_new_event=self.on_new_event ) @staticmethod def parse_config(config): return config async def on_new_event(self, event, state_events): # Respond only to membership changes, not all messages if event.type == "m.room.member": room_id = event.room_id target_user_id = event.state_key membership = event.content.get("membership") logger.debug("Membership event in room %s for user %s: %s", room_id, target_user_id, membership) # Fetch the current state to check the bot's membership status current_state = await self.api.get_room_state_by_type(room_id, "m.room.member", self.bot_user_id) bot_membership = current_state.get("content", {}).get("membership", "leave") # Log current membership state logger.debug("Bot's current membership status in %s: %s", room_id, bot_membership) # Invite bot if it is not already a member if bot_membership != "join": logger.info("Bot is not a member of the room. Sending invite...") try: await self.api.update_room_membership( sender=event.sender, target=self.bot_user_id, room_id=room_id, membership="invite" ) logger.info("Bot invited to room %s upon new event.", room_id) except Exception as e: logger.error("Failed to invite bot to room %s: %s", room_id, e) else: logger.info("Bot is already a member of the room. No action needed.") def setup(config, api): module_config = AutoInviteBotModule.parse_config(config) return AutoInviteBotModule(module_config, api)