hemppa/modules/relay.py

110 lines
3.7 KiB
Python

from modules.common.module import BotModule
from nio import RoomMessageText
class MatrixModule(BotModule):
def __init__(self, name):
super().__init__(name)
self.bridges = dict()
self.bot = None
self.enabled = False
async def message_cb(self, room, event):
if self.bot.should_ignore_event(event):
return
if event.body.startswith('!'):
return
source_id = None
target_id = None
for src_id, tgt_id in self.bridges.items():
if room.room_id == src_id:
source_id = src_id
target_id = tgt_id
elif room.room_id == tgt_id:
source_id = tgt_id
target_id = src_id
if not source_id or not target_id:
return
target_room = self.bot.get_room_by_id(target_id)
if(target_room):
sendernick = target_room.user_name(event.sender)
if not sendernick:
sendernick = event.sender
await self.bot.send_text(target_room, f'<{sendernick}> {event.body}', msgtype="m.text", bot_ignore=True)
else:
self.logger.warning(f"Bot doesn't seem to be in bridged room {target_id}")
def matrix_start(self, bot):
super().matrix_start(bot)
bot.client.add_event_callback(self.message_cb, RoomMessageText)
self.bot = bot
def matrix_stop(self, bot):
super().matrix_stop(bot)
bot.remove_callback(self.message_cb)
self.bot = None
async def matrix_message(self, bot, room, event):
bot.must_be_admin(room, event)
args = event.body.split()
args.pop(0)
if len(args) == 1:
if args[0] == 'list':
i = 1
msg = f"Active relay bridges ({len(self.bridges)}):\n"
for src_id, tgt_id in self.bridges.items():
srcroom = self.bot.get_room_by_id(src_id)
tgtroom = self.bot.get_room_by_id(tgt_id)
if srcroom:
srcroom = srcroom.display_name
else:
srcroom = f'??? {src_id}'
if tgtroom:
tgtroom = tgtroom.display_name
else:
tgtroom = f'??? {tgt_id}'
msg += f'{i}: {srcroom} <-> {tgtroom}'
i = i + 1
await bot.send_text(room, msg)
if len(args) == 2:
if args[0] == 'bridge':
roomid = args[1]
room_to_bridge = bot.get_room_by_id(roomid)
if room_to_bridge:
await bot.send_text(room, f'Bridging {room_to_bridge.display_name} here.')
self.bridges[room.room_id] = roomid
bot.save_settings()
else:
await bot.send_text(room, f'I am not on room with id {roomid} (note: use id, not alias)!')
elif args[0] == 'unbridge':
idx = int(args[1]) - 1
i = 0
for src_id, tgt_id in self.bridges.items():
if i == idx:
del self.bridges[src_id]
await bot.send_text(room, f'Unbridged {src_id} and {tgt_id}.')
bot.save_settings()
return
i = i + 1
def help(self):
return 'Simple relaybot between two Matrix rooms'
def get_settings(self):
data = super().get_settings()
data["bridges"] = self.bridges
return data
def set_settings(self, data):
super().set_settings(data)
if data.get("bridges"):
self.bridges = data["bridges"]