120 lines
4.1 KiB
Python
120 lines
4.1 KiB
Python
"""
|
||
Plugin for welcoming new users to the room.
|
||
|
||
Features:
|
||
* Automatically greets users when they join the target room.
|
||
* !welcome command – manually trigger the welcome message for yourself.
|
||
|
||
Restricted to room: !NXdVjDXPxXowPkrJJY:matrix.org
|
||
"""
|
||
|
||
import logging
|
||
import simplematrixbotlib as botlib
|
||
import nio
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# Configuration
|
||
# ---------------------------------------------------------------------------
|
||
|
||
ALLOWED_ROOM_ID = "!NXdVjDXPxXowPkrJJY:matrix.org"
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# Internal helpers
|
||
# ---------------------------------------------------------------------------
|
||
|
||
def _build_welcome_message(display_name: str) -> str:
|
||
"""Return the Markdown welcome message for a given display name."""
|
||
return (
|
||
f"Welcome to the room, **{display_name}**! 🎉\n\n"
|
||
"We're glad to have you here in "
|
||
"**Self‑hosting | Security | Sysadmin | Homelab | Programming**!\n\n"
|
||
"To help us get to know you better:\n"
|
||
"• 🔧 **What do you self‑host?** Got any cool services running?\n"
|
||
"• 🔐 **Are you into cybersecurity?** What areas interest you most?\n"
|
||
"• 💻 **What programming languages do you use?**\n"
|
||
"• 🏠 **Tell us about your homelab setup!**\n\n"
|
||
"Feel free to introduce yourself and jump into the conversation! 🍄"
|
||
)
|
||
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# Plugin setup - called by funguy.py's run() after the bot object is created
|
||
# ---------------------------------------------------------------------------
|
||
|
||
def setup(bot):
|
||
"""
|
||
Register the member-join listener.
|
||
|
||
funguy.py must call plugin_module.setup(self.bot) for each loaded plugin
|
||
(after self.bot is created) for this listener to fire. See the note in
|
||
funguy.py's run() method.
|
||
"""
|
||
|
||
@bot.listener.on_custom_event(nio.RoomMemberEvent)
|
||
async def _on_member_event(room, event):
|
||
logging.debug(
|
||
"RoomMemberEvent received: room=%s, sender=%s, membership=%s",
|
||
room.room_id, event.sender, event.membership,
|
||
)
|
||
|
||
# Only the configured room
|
||
if room.room_id != ALLOWED_ROOM_ID:
|
||
return
|
||
|
||
# Only on actual join (not invite / leave / ban)
|
||
if event.membership != "join":
|
||
return
|
||
|
||
# Ignore the bot itself
|
||
if event.sender == bot.async_client.user_id:
|
||
logging.debug("Ignoring bot's own join event")
|
||
return
|
||
|
||
# Derive a friendly display name from the Matrix ID (@name:server → name)
|
||
display_name = event.sender.split(":")[0].lstrip("@")
|
||
|
||
logging.info(
|
||
"User %s joined room %s – sending welcome", event.sender, room.room_id
|
||
)
|
||
try:
|
||
await bot.api.send_markdown_message(
|
||
room.room_id, _build_welcome_message(display_name)
|
||
)
|
||
logging.info("Welcome message sent successfully to %s", display_name)
|
||
except Exception as exc:
|
||
logging.error("Failed to send welcome message: %s", exc)
|
||
|
||
logging.info("Join listener registered for room %s", ALLOWED_ROOM_ID)
|
||
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# Plugin entry point - called by FunguyBot for every message event
|
||
# ---------------------------------------------------------------------------
|
||
|
||
async def handle_command(room, message, bot, prefix, config):
|
||
"""Handle the !welcome command."""
|
||
|
||
match = botlib.MessageMatch(room, message, bot, prefix)
|
||
|
||
if not (
|
||
match.is_not_from_this_bot()
|
||
and match.prefix()
|
||
and match.command("welcome")
|
||
):
|
||
return
|
||
|
||
if room.room_id != ALLOWED_ROOM_ID:
|
||
await bot.api.send_text_message(
|
||
room.room_id,
|
||
"The !welcome command only works in the designated room.",
|
||
)
|
||
return
|
||
|
||
sender = str(message.sender)
|
||
display_name = sender.split(":")[0].lstrip("@")
|
||
|
||
await bot.api.send_markdown_message(
|
||
room.room_id, _build_welcome_message(display_name)
|
||
)
|
||
logging.info("Sent manual !welcome to %s", sender)
|