diff --git a/ubottu/bot.py b/ubottu/bot.py index 0e9c764..8b050f5 100644 --- a/ubottu/bot.py +++ b/ubottu/bot.py @@ -8,6 +8,7 @@ from typing import Type, Tuple from mautrix.util.config import BaseProxyConfig, ConfigUpdateHelper from maubot import Plugin, MessageEvent from maubot.handlers import command +import mautrix.util from mautrix.types import ( EventType, MemberStateEventContent, @@ -69,7 +70,7 @@ class Ubottu(Plugin): # Fetch the state of the room, focusing on power levels levels = await self.get_power_levels(evt.room_id) for user_id, level in levels.users.items(): - if level > 50: + if level >= 50: high_level_user_ids.append(user_id) else: self.log.info("No power levels found in {evt.room_id}") @@ -142,6 +143,7 @@ class Ubottu(Plugin): name = data['name'] value = data['value'] ftype = data['ftype'] + user_ids = data['user_ids'] if ftype == 'ALIAS': command_name = value url = api_url + command_name + '/?format=json' @@ -149,19 +151,57 @@ class Ubottu(Plugin): if resp and resp.status == 200: data = await resp.json() value = data['value'] - if "{moderators}" in value: + + content = {} + content['m.mentions'] = {} + moderators = [] + mentions = 0 + m_str = '' + m_str_html = '' + user_ids = [] + value = data['value'] + formatted_value = value + + if '.mentions' in value: + value = value.replace('.mentions', '') + mentions = 1 + + #find matrix user ids in message + user_id_re = '@[\w.-]+:[a-zA-Z\d.-]+\.[a-zA-Z]{2,}' + user_ids = re.findall(user_id_re, value) + if len(user_ids) > 0: + for user_id in user_ids: + formatted_value = formatted_value.replace(user_id, '' + user_id + '') + + + #find room moderators and add to mentions if needed + if '{moderators}' in value: moderators = await self.get_room_mods_and_admins(evt) - if isinstance(moderators, list) and len(moderators) > 0: - m_str = '' + if mentions == 1: + value = value.replace('{moderators}', '') + + formatted_value = value + + if mentions == 0: for m in moderators: - m_str = m_str + 'https://matrix.to/#/' + m + ' ' - value = value.replace("{moderators}", m_str) - else: - return False + m_str_html = "" + m + ' ' + m_str_html + m_str = m_str + ' ' + m + value = value.replace('{moderators}', m_str) + formatted_value = formatted_value.replace('{moderators}', m_str_html) + + value = re.sub(' +', ' ', value) + + content['m.mentions']['user_ids'] = list(set(list(moderators) + list(data['user_ids']))) + self.log.info(content['m.mentions']['user_ids']) + content['formatted_body'] = mautrix.util.markdown.render(formatted_value, allow_html=True) + content['msgtype'] = "m.text" + content['format'] = 'org.matrix.custom.html' + content['body'] = mautrix.util.markdown.render(value, allow_html=True) if to_user: - await evt.respond(to_user + ': ' + value) - else: - await evt.respond(value) + content['body'] = to_user + ': ' + content['body'] + content['formatted_body'] = to_user + content['formatted_body'] + + await evt.respond(content) return True return False