Files
FunguyBot/plugins/welcome.py
T

120 lines
4.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
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 "
"**Selfhosting | Security | Sysadmin | Homelab | Programming**!\n\n"
"To help us get to know you better:\n"
"• 🔧 **What do you selfhost?** 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)