110 lines
3.7 KiB
Python
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"]
|