From 7bf0ff5e13e095465a93234bf2c528107ad17f7d Mon Sep 17 00:00:00 2001 From: Jackson Egan Date: Mon, 14 Sep 2020 23:35:47 -0400 Subject: [PATCH] Allow welcome behavior to be configured via chat commands --- docker-compose.yml | 3 -- modules/welcome_room.py | 106 +++++++++++++++++++++++++------------- modules/welcome_server.py | 65 +++++++++++++++-------- welcome.md | 1 - 4 files changed, 113 insertions(+), 62 deletions(-) delete mode 100644 welcome.md diff --git a/docker-compose.yml b/docker-compose.yml index 165d563..c01bb52 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -14,9 +14,6 @@ services: - BOT_OWNERS - DEBUG - TZ - - WELCOME_ROOMID - - WELCOME_MESSAGE - - WELCOME_ROOM_NOTIFY_DEPARTURE volumes: - ${PWD}/config/:/bot/config - ${PWD}/credentials.json:/bot/credentials.json diff --git a/modules/welcome_room.py b/modules/welcome_room.py index e15183d..f88104e 100644 --- a/modules/welcome_room.py +++ b/modules/welcome_room.py @@ -1,5 +1,5 @@ -import os import itertools +import shlex from modules.common.module import BotModule @@ -11,62 +11,94 @@ class MatrixModule(BotModule): def __init__(self, name): super().__init__(name) - self.room_id = os.getenv("WELCOME_ROOMID") - self.last_welcome_room_user_count = 0 - self.last_welcome_room_users = [] - - # If the provided welcome message is a file path, read the file into - # the welcome message. Otherwise, use the variable data as the message. - if os.path.isfile(os.getenv("WELCOME_MESSAGE")): - with open(os.getenv("WELCOME_MESSAGE"), "r") as file: - self.welcome_message = file.read() - else: - self.welcome_message = os.getenv("WELCOME_MESSAGE") + self.enabled = False + self.rooms = dict() async def matrix_message(self, bot, room, event): - return + bot.must_be_owner(event) + args = shlex.split(event.body) + args.pop(0) + # Message body possibilities: + # ["welcome_message", "notify_departure", "settings"] + if args[0] == "welcome_message": + users = bot.client.rooms[room.room_id].users + welcome_settings = { + "last_room_user_count": len(users), + "last_room_users": [username for username in users], + "welcome_message": event.body.split("welcome_message", 1)[1], + "notify_departure": False + } + self.rooms[room.room_id] = welcome_settings + bot.save_settings() + await bot.send_text(room, "Welcome settings configured: {settings}".format(settings=welcome_settings)) + elif args[0] == "notify_departure": + notify_departure = True if args[1] == "True" else False + self.rooms[room.room_id]["notify_departure"] = notify_departure + bot.save_settings() + await bot.send_text(room, "notify_departure set to {setting}".format(setting=notify_departure)) + elif args[0] == "settings": + await bot.send_text(room, "Welcome settings: {settings}".format(settings=self.rooms[room.room_id])) + + def get_settings(self): + data = super().get_settings() + data["rooms"] = self.rooms + return data + + def set_settings(self, data): + super().set_settings(data) + if data.get("rooms"): + self.rooms = data["rooms"] async def matrix_poll(self, bot, pollcount): - newcomer_room_users = bot.client.rooms[self.room_id].users - newcomer_room_user_delta = self.get_user_list_delta( - newcomer_room_users, - self.last_welcome_room_users - ) - self.last_welcome_room_user_count = len(newcomer_room_users) - self.last_welcome_room_users = [u for u in newcomer_room_users] + for room_id in self.rooms: + if room_id in bot.client.rooms: + welcome_parameters = self.rooms[room_id] + newcomer_room_users = bot.client.rooms[room_id].users + newcomer_room_user_delta = self.get_user_list_delta( + newcomer_room_users, + welcome_parameters["last_room_users"] + ) + self.rooms[room_id]["last_room_user_count"] = len(newcomer_room_users) + self.rooms[room_id]["last_room_users"] = [u for u in newcomer_room_users] - if pollcount != 1: - new_users = newcomer_room_user_delta.get("recently_added", []) - if os.getenv("WELCOME_ROOM_NOTIFY_DEPARTURE", 0) and \ - len(newcomer_room_user_delta.get("recently_removed")) > 0: - for owner in bot.owners: - await bot.send_msg( - owner, - "Welcome Bot", - "User {left} left the welcome channel".format( - left=newcomer_room_user_delta.get( - "recently_removed") - ) + if pollcount != 1: + new_users = newcomer_room_user_delta.get("recently_added", []) + if welcome_parameters["notify_departure"] and \ + len(newcomer_room_user_delta.get("recently_removed")) > 0: + for owner in bot.owners: + await bot.send_msg( + owner, + "Welcome Bot", + "User {user_left} left {channel}".format( + user_left=newcomer_room_user_delta.get("recently_removed"), + channel=bot.client.rooms[room_id].display_name + ) + ) + await self.welcome_users( + new_users, + welcome_parameters["welcome_message"], + bot, + bot.client.rooms[room_id].display_name ) - await self.welcome_users(new_users, bot) def help(self): return "Poll for new users in the room and welcome them" - async def welcome_users(self, user_list, bot): + async def welcome_users(self, user_list, message, bot, roomname): for user in user_list: await bot.send_msg( user, "Welcome", - self.welcome_message + message ) if len(user_list) > 0: for owner in bot.owners: await bot.send_msg( owner, "Welcome Bot", - "Sent a welcome message to: {noobs}".format( - noobs=user_list + "Sent a welcome message from {channel} to: {users}".format( + users=user_list, + channel=roomname ) ) diff --git a/modules/welcome_server.py b/modules/welcome_server.py index b1a45fb..32857f0 100644 --- a/modules/welcome_server.py +++ b/modules/welcome_server.py @@ -1,5 +1,6 @@ import os import itertools +import shlex import requests from modules.common.module import BotModule @@ -15,21 +16,39 @@ class MatrixModule(BotModule): def __init__(self, name): super().__init__(name) + self.enabled = False self.access_token = os.getenv("MATRIX_ACCESS_TOKEN") - self.user_query_url = os.getenv("MATRIX_SERVER") + "/_synapse/admin/v2/users" - self.last_server_user_count = 0 - self.last_server_users = [] - - # If the provided welcome message is a file path, read the file into - # the welcome message. Otherwise, use the variable data as the message. - if os.path.isfile(os.getenv("WELCOME_MESSAGE")): - with open(os.getenv("WELCOME_MESSAGE"), "r") as file: - self.welcome_message = file.read() - else: - self.welcome_message = os.getenv("WELCOME_MESSAGE") + self.welcome_settings = dict() async def matrix_message(self, bot, room, event): - return + bot.must_be_owner(event) + args = shlex.split(event.body) + args.pop(0) + # Message body possibilities: + # ["welcome_message", "query_host", "settings"] + if args[0] == "welcome_message": + users = bot.client.rooms[room.room_id].users + welcome_settings = { + "last_server_user_count": len(users), + "last_server_users": [username for username in users], + "welcome_message": event.body.split("welcome_message", 1)[1], + "user_query_host": os.getenv("MATRIX_SERVER") + } + self.welcome_settings = welcome_settings + bot.save_settings() + await bot.send_text(room, "Welcome settings configured for server: {settings}".format(settings=welcome_settings)) + elif args[0] == "settings": + await bot.send_text(room, "Welcome settings for server: {settings}".format(settings=self.welcome_settings)) + + def get_settings(self): + data = super().get_settings() + data["welcome_settings"] = self.welcome_settings + return data + + def set_settings(self, data): + super().set_settings(data) + if data.get("welcome_settings"): + self.welcome_settings = data["welcome_settings"] async def matrix_poll(self, bot, pollcount): server_user_delta = self.get_server_user_delta() @@ -39,25 +58,29 @@ class MatrixModule(BotModule): if pollcount != 1: new_users = [u.get("name") for u in server_user_delta.get( "recently_added", [])] - await self.welcome_users(new_users, bot) + await self.welcome_users( + new_users, + self.welcome_settings["welcome_message"], + bot + ) def help(self): return "Poll for new users on the server and welcome them" - async def welcome_users(self, user_list, bot): + async def welcome_users(self, user_list, message, bot): for user in user_list: await bot.send_msg( user, "Welcome", - self.welcome_message + message ) if len(user_list) > 0: for owner in bot.owners: await bot.send_msg( owner, "Welcome Bot", - "Sent a welcome message to: {new_users}".format( - new_users=user_list + "Sent a welcome message to new server user(s): {users}".format( + users=user_list ) ) @@ -88,7 +111,7 @@ class MatrixModule(BotModule): since the last run. """ user_data = requests.get( - self.user_query_url, + self.welcome_settings["user_query_host"] + "/_synapse/admin/v2/users", headers={"Authorization": "Bearer {token}".format( token=self.access_token )} @@ -97,8 +120,8 @@ class MatrixModule(BotModule): user_list = user_data_json.get("users", []) user_delta = self.get_user_list_delta( user_list, - self.last_server_users + self.welcome_settings["last_server_users"] ) - self.last_server_users = [u for u in user_list] - self.last_server_user_count = user_data_json.get("total") + self.welcome_settings["last_server_users"] = [u for u in user_list] + self.welcome_settings["last_server_user_count"] = user_data_json.get("total") return user_delta diff --git a/welcome.md b/welcome.md deleted file mode 100644 index a67a121..0000000 --- a/welcome.md +++ /dev/null @@ -1 +0,0 @@ -Welcome to the server.