import logging from synapse.module_api import ModuleApi, errors logger = logging.getLogger(__name__) class AutoInviteBotModule: def __init__(self, config, api: ModuleApi): self.api = api # Fetch the bot user ID from the config file self.auto_invite_user_id = config.get("auto_invite_user_id") if not self.auto_invite_user_id: raise ValueError("auto_invite_user_id must be configured") self.api.register_third_party_rules_callbacks( on_new_event=self.on_new_event ) @staticmethod def parse_config(config): # Validate that the auto_invite_user_id is in the config if "auto_invite_user_id" not in config: logger.error("auto_invite_user_id not provided in config") raise Exception("auto_invite_user_id must be provided in config") return config async def on_new_event(self, event, state_events): if event['type'] == "m.room.member" and event['content'].get('membership') == "invite": room_id = event['room_id'] inviter = event['sender'] invitee = event['state_key'] # Check if the bot is already in the room try: state = await self.api.get_room_state(room_id) bot_membership = state.get(("m.room.member", self.auto_invite_user_id), {}).get("content", {}).get("membership") if bot_membership != "join": await self.api.update_room_membership( sender=inviter, target=self.auto_invite_user_id, room_id=room_id, new_membership="invite" ) logger.info(f"Invited bot to room {room_id} as {invitee} was invited by {inviter}") except errors.SynapseError as e: logger.error(f"Failed to invite bot to room {room_id}: {str(e)}") def setup(config, api): # Parse and validate config when setting up the module module_config = AutoInviteBotModule.parse_config(config) return AutoInviteBotModule(module_config, api)