aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar jesopo2019-06-20 18:08:59 +0100
committerGravatar jesopo2019-06-20 18:08:59 +0100
commitac19b766bcb4cefb08c84a4641bddc8ef024d62a (patch)
tree6af2a5e6f28af738588ee39284ea88528daa6fed
parentfix hostmask_match_many type hinting (diff)
signature
Add relay.py - cross-network relaying
-rw-r--r--modules/relay.py109
1 files changed, 109 insertions, 0 deletions
diff --git a/modules/relay.py b/modules/relay.py
new file mode 100644
index 00000000..4869617e
--- /dev/null
+++ b/modules/relay.py
@@ -0,0 +1,109 @@
+from src import ModuleManager, utils
+
+class Module(ModuleManager.BaseModule):
+ def _get_relays(self, channel):
+ return channel.get_setting("channel-relays", [])
+
+ def _relay(self, event, channel):
+ if event["server"].is_own_nickname(event["user"].nickname):
+ return
+
+ relays = self._get_relays(channel)
+ for server_id, channel_name in relays:
+ server = self.bot.get_server_by_id(server_id)
+ if not server == None and channel_name in server.channels:
+ other_channel = server.channels.get(channel_name)
+
+ if not self._has_relay_for(other_channel, event["server"].id,
+ channel.name):
+ self.log.warn(
+ "Tried to relay with one-way config: %s%s -> %s%s",
+ [str(event["server"]), channel.name, str(server),
+ other_channel.name])
+ return
+
+ relay_prefix_channel = ""
+ if not other_channel.name == channel.name:
+ relay_prefix_channel = channel.name
+
+ relay_message = "[relay/%s%s] %s" % (str(event["server"]),
+ relay_prefix_channel, event["line"])
+ other_channel.send_message(relay_message)
+
+ def _has_relay_for(self, channel, server_id, channel_name):
+ relays = self._get_relays(channel)
+ for other_server_id, other_channel_name in relays:
+ if (other_server_id == server_id and
+ other_channel_name == channel_name):
+ print("yes!")
+ return True
+ return False
+
+ @utils.hook("formatted.message.channel")
+ @utils.hook("formatted.notice.channel")
+ @utils.hook("formatted.join")
+ @utils.hook("formatted.part")
+ @utils.hook("formatted.nick")
+ @utils.hook("formatted.mode.channel")
+ @utils.hook("formatted.kick")
+ @utils.hook("formatted.quit")
+ @utils.hook("formatted.rename")
+ def formatted(self, event):
+ if event["channel"]:
+ self._relay(event, event["channel"])
+ elif event["user"]:
+ for channel in event["user"].channels:
+ self._relay(event, channel)
+
+ @utils.hook("received.command.relay", min_args=3, channel_only=True)
+ def relay(self, event):
+ """
+ :help: Edit configured relays
+ :usage: add <server> <channel>
+ :usage: remove <server> <channel>
+ :permission: relay
+ """
+ target_server_alias = event["args_split"][1].lower()
+ target_server = self.bot.get_server_by_alias(target_server_alias)
+
+ if target_server == None:
+ raise utils.EventError("Unknown server provided")
+
+ current_relays = self._get_relays(event["target"])
+ target_server_relays = list(filter(
+ lambda relay: relay[0] == target_server.id, current_relays))
+ target_relays = list(map(lambda relay: relay[1], target_server_relays))
+
+ target_channel_name = target_server.irc_lower(event["args_split"][2])
+
+ changed = False
+ message = None
+
+ subcommand = event["args_split"][0].lower()
+ if subcommand == "add":
+ if target_channel_name in target_relays:
+ raise utils.EventError("Already relaying to that channel")
+
+ if not target_channel_name in target_server.channels:
+ raise utils.EventError("Cannot find the provided channel")
+
+ current_relays.append((target_server.id, target_channel_name))
+
+ message = "Relay added"
+ elif subcommand == "remove":
+ if not target_channel_name in target_relays:
+ raise utils.EventError("I'm not relaying to that channel")
+
+ for i, (server_id, channel_name) in enumerate(current_relays):
+ if (server_id == target_server.id and
+ channel_name == target_channel_name):
+ current_relays.pop(i)
+ break
+
+ message = "Removed relay"
+ else:
+ raise utils.EventError("Unknown subcommand '%s'" % subcommand)
+
+
+ event["target"].set_setting("channel-relays", current_relays)
+ event["stdout"].write(message)