First working code

This commit is contained in:
2024-04-25 11:46:00 +02:00
parent 8c4775e882
commit 801e6b527e

View File

@@ -1,55 +1,51 @@
import logging import logging
from synapse.module_api import ModuleApi from synapse.module_api import ModuleApi, errors
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class AutoInviteBotModule: class AutoInviteBotModule:
def __init__(self, config, api: ModuleApi): def __init__(self, config, api: ModuleApi):
self.api = api self.api = api
self.bot_user_id = config.get("bot_user_id", "@bot.id:blackmesaresearch.net") # Fetch the bot user ID from the config file
logger.info("Module initialized with bot_user_id: %s", self.bot_user_id) self.auto_invite_user_id = config.get("auto_invite_user_id")
if not self.auto_invite_user_id:
# Register the new event callback only raise ValueError("auto_invite_user_id must be configured")
self.api.register_third_party_rules_callbacks( self.api.register_third_party_rules_callbacks(
on_new_event=self.on_new_event on_new_event=self.on_new_event
) )
@staticmethod @staticmethod
def parse_config(config): 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 return config
async def on_new_event(self, event, state_events): async def on_new_event(self, event, state_events):
# Respond only to membership changes, not all messages if event['type'] == "m.room.member" and event['content'].get('membership') == "invite":
if event.type == "m.room.member": room_id = event['room_id']
room_id = event.room_id inviter = event['sender']
target_user_id = event.state_key invitee = 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) # 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")
# Fetch the current state to check the bot's membership status if bot_membership != "join":
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( await self.api.update_room_membership(
sender=event.sender, sender=inviter,
target=self.bot_user_id, target=self.auto_invite_user_id,
room_id=room_id, room_id=room_id,
membership="invite" new_membership="invite"
) )
logger.info("Bot invited to room %s upon new event.", room_id) logger.info(f"Invited bot to room {room_id} as {invitee} was invited by {inviter}")
except Exception as e:
logger.error("Failed to invite bot to room %s: %s", room_id, e) except errors.SynapseError as e:
else: logger.error(f"Failed to invite bot to room {room_id}: {str(e)}")
logger.info("Bot is already a member of the room. No action needed.")
def setup(config, api): def setup(config, api):
# Parse and validate config when setting up the module
module_config = AutoInviteBotModule.parse_config(config) module_config = AutoInviteBotModule.parse_config(config)
return AutoInviteBotModule(module_config, api) return AutoInviteBotModule(module_config, api)