Allow welcome behavior to be configured via chat commands
This commit is contained in:
parent
d38c8c7b1c
commit
7bf0ff5e13
|
@ -14,9 +14,6 @@ services:
|
||||||
- BOT_OWNERS
|
- BOT_OWNERS
|
||||||
- DEBUG
|
- DEBUG
|
||||||
- TZ
|
- TZ
|
||||||
- WELCOME_ROOMID
|
|
||||||
- WELCOME_MESSAGE
|
|
||||||
- WELCOME_ROOM_NOTIFY_DEPARTURE
|
|
||||||
volumes:
|
volumes:
|
||||||
- ${PWD}/config/:/bot/config
|
- ${PWD}/config/:/bot/config
|
||||||
- ${PWD}/credentials.json:/bot/credentials.json
|
- ${PWD}/credentials.json:/bot/credentials.json
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import os
|
|
||||||
import itertools
|
import itertools
|
||||||
|
import shlex
|
||||||
from modules.common.module import BotModule
|
from modules.common.module import BotModule
|
||||||
|
|
||||||
|
|
||||||
|
@ -11,62 +11,94 @@ class MatrixModule(BotModule):
|
||||||
|
|
||||||
def __init__(self, name):
|
def __init__(self, name):
|
||||||
super().__init__(name)
|
super().__init__(name)
|
||||||
self.room_id = os.getenv("WELCOME_ROOMID")
|
self.enabled = False
|
||||||
self.last_welcome_room_user_count = 0
|
self.rooms = dict()
|
||||||
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")
|
|
||||||
|
|
||||||
async def matrix_message(self, bot, room, event):
|
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):
|
async def matrix_poll(self, bot, pollcount):
|
||||||
newcomer_room_users = bot.client.rooms[self.room_id].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_user_delta = self.get_user_list_delta(
|
||||||
newcomer_room_users,
|
newcomer_room_users,
|
||||||
self.last_welcome_room_users
|
welcome_parameters["last_room_users"]
|
||||||
)
|
)
|
||||||
self.last_welcome_room_user_count = len(newcomer_room_users)
|
self.rooms[room_id]["last_room_user_count"] = len(newcomer_room_users)
|
||||||
self.last_welcome_room_users = [u for u in newcomer_room_users]
|
self.rooms[room_id]["last_room_users"] = [u for u in newcomer_room_users]
|
||||||
|
|
||||||
if pollcount != 1:
|
if pollcount != 1:
|
||||||
new_users = newcomer_room_user_delta.get("recently_added", [])
|
new_users = newcomer_room_user_delta.get("recently_added", [])
|
||||||
if os.getenv("WELCOME_ROOM_NOTIFY_DEPARTURE", 0) and \
|
if welcome_parameters["notify_departure"] and \
|
||||||
len(newcomer_room_user_delta.get("recently_removed")) > 0:
|
len(newcomer_room_user_delta.get("recently_removed")) > 0:
|
||||||
for owner in bot.owners:
|
for owner in bot.owners:
|
||||||
await bot.send_msg(
|
await bot.send_msg(
|
||||||
owner,
|
owner,
|
||||||
"Welcome Bot",
|
"Welcome Bot",
|
||||||
"User {left} left the welcome channel".format(
|
"User {user_left} left {channel}".format(
|
||||||
left=newcomer_room_user_delta.get(
|
user_left=newcomer_room_user_delta.get("recently_removed"),
|
||||||
"recently_removed")
|
channel=bot.client.rooms[room_id].display_name
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
await self.welcome_users(new_users, bot)
|
await self.welcome_users(
|
||||||
|
new_users,
|
||||||
|
welcome_parameters["welcome_message"],
|
||||||
|
bot,
|
||||||
|
bot.client.rooms[room_id].display_name
|
||||||
|
)
|
||||||
|
|
||||||
def help(self):
|
def help(self):
|
||||||
return "Poll for new users in the room and welcome them"
|
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:
|
for user in user_list:
|
||||||
await bot.send_msg(
|
await bot.send_msg(
|
||||||
user,
|
user,
|
||||||
"Welcome",
|
"Welcome",
|
||||||
self.welcome_message
|
message
|
||||||
)
|
)
|
||||||
if len(user_list) > 0:
|
if len(user_list) > 0:
|
||||||
for owner in bot.owners:
|
for owner in bot.owners:
|
||||||
await bot.send_msg(
|
await bot.send_msg(
|
||||||
owner,
|
owner,
|
||||||
"Welcome Bot",
|
"Welcome Bot",
|
||||||
"Sent a welcome message to: {noobs}".format(
|
"Sent a welcome message from {channel} to: {users}".format(
|
||||||
noobs=user_list
|
users=user_list,
|
||||||
|
channel=roomname
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import os
|
import os
|
||||||
import itertools
|
import itertools
|
||||||
|
import shlex
|
||||||
import requests
|
import requests
|
||||||
from modules.common.module import BotModule
|
from modules.common.module import BotModule
|
||||||
|
|
||||||
|
@ -15,21 +16,39 @@ class MatrixModule(BotModule):
|
||||||
|
|
||||||
def __init__(self, name):
|
def __init__(self, name):
|
||||||
super().__init__(name)
|
super().__init__(name)
|
||||||
|
self.enabled = False
|
||||||
self.access_token = os.getenv("MATRIX_ACCESS_TOKEN")
|
self.access_token = os.getenv("MATRIX_ACCESS_TOKEN")
|
||||||
self.user_query_url = os.getenv("MATRIX_SERVER") + "/_synapse/admin/v2/users"
|
self.welcome_settings = dict()
|
||||||
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")
|
|
||||||
|
|
||||||
async def matrix_message(self, bot, room, event):
|
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):
|
async def matrix_poll(self, bot, pollcount):
|
||||||
server_user_delta = self.get_server_user_delta()
|
server_user_delta = self.get_server_user_delta()
|
||||||
|
@ -39,25 +58,29 @@ class MatrixModule(BotModule):
|
||||||
if pollcount != 1:
|
if pollcount != 1:
|
||||||
new_users = [u.get("name") for u in server_user_delta.get(
|
new_users = [u.get("name") for u in server_user_delta.get(
|
||||||
"recently_added", [])]
|
"recently_added", [])]
|
||||||
await self.welcome_users(new_users, bot)
|
await self.welcome_users(
|
||||||
|
new_users,
|
||||||
|
self.welcome_settings["welcome_message"],
|
||||||
|
bot
|
||||||
|
)
|
||||||
|
|
||||||
def help(self):
|
def help(self):
|
||||||
return "Poll for new users on the server and welcome them"
|
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:
|
for user in user_list:
|
||||||
await bot.send_msg(
|
await bot.send_msg(
|
||||||
user,
|
user,
|
||||||
"Welcome",
|
"Welcome",
|
||||||
self.welcome_message
|
message
|
||||||
)
|
)
|
||||||
if len(user_list) > 0:
|
if len(user_list) > 0:
|
||||||
for owner in bot.owners:
|
for owner in bot.owners:
|
||||||
await bot.send_msg(
|
await bot.send_msg(
|
||||||
owner,
|
owner,
|
||||||
"Welcome Bot",
|
"Welcome Bot",
|
||||||
"Sent a welcome message to: {new_users}".format(
|
"Sent a welcome message to new server user(s): {users}".format(
|
||||||
new_users=user_list
|
users=user_list
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -88,7 +111,7 @@ class MatrixModule(BotModule):
|
||||||
since the last run.
|
since the last run.
|
||||||
"""
|
"""
|
||||||
user_data = requests.get(
|
user_data = requests.get(
|
||||||
self.user_query_url,
|
self.welcome_settings["user_query_host"] + "/_synapse/admin/v2/users",
|
||||||
headers={"Authorization": "Bearer {token}".format(
|
headers={"Authorization": "Bearer {token}".format(
|
||||||
token=self.access_token
|
token=self.access_token
|
||||||
)}
|
)}
|
||||||
|
@ -97,8 +120,8 @@ class MatrixModule(BotModule):
|
||||||
user_list = user_data_json.get("users", [])
|
user_list = user_data_json.get("users", [])
|
||||||
user_delta = self.get_user_list_delta(
|
user_delta = self.get_user_list_delta(
|
||||||
user_list,
|
user_list,
|
||||||
self.last_server_users
|
self.welcome_settings["last_server_users"]
|
||||||
)
|
)
|
||||||
self.last_server_users = [u for u in user_list]
|
self.welcome_settings["last_server_users"] = [u for u in user_list]
|
||||||
self.last_server_user_count = user_data_json.get("total")
|
self.welcome_settings["last_server_user_count"] = user_data_json.get("total")
|
||||||
return user_delta
|
return user_delta
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
Welcome to the server.
|
|
Loading…
Reference in New Issue