56 lines
2.3 KiB
Python
56 lines
2.3 KiB
Python
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)
|