summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/source/plugins/index.rst6
-rw-r--r--doc/source/plugins/irc.rst6
-rw-r--r--plugins/irc.py121
3 files changed, 133 insertions, 0 deletions
diff --git a/doc/source/plugins/index.rst b/doc/source/plugins/index.rst
index aecf5fe8..28c03b55 100644
--- a/doc/source/plugins/index.rst
+++ b/doc/source/plugins/index.rst
@@ -224,6 +224,11 @@ Plugin index
Add new ways to correct messages.
+ IRC
+ :ref:`Documentation <irc-plugin>`
+
+ Manage IRC gateways with biboumi more easily
+
.. toctree::
@@ -261,3 +266,4 @@ Plugin index
regex_admin
pointpoint
autocorrect
+ irc
diff --git a/doc/source/plugins/irc.rst b/doc/source/plugins/irc.rst
new file mode 100644
index 00000000..696835b0
--- /dev/null
+++ b/doc/source/plugins/irc.rst
@@ -0,0 +1,6 @@
+.. _irc-plugin:
+
+IRC
+===
+
+.. automodule:: irc
diff --git a/plugins/irc.py b/plugins/irc.py
new file mode 100644
index 00000000..62192ec5
--- /dev/null
+++ b/plugins/irc.py
@@ -0,0 +1,121 @@
+"""
+Plugin destined to be used together with the Biboumi IRC gateway.
+
+For more information about Biboumi, please see the `official website`_.
+
+This plugin is here as a non-default extension of the poezio configuration
+made to work with IRC rooms and logins. Therefore, it does not define any
+commands or do anything useful except on load.
+
+Configuration
+-------------
+
+Global configuration
+~~~~~~~~~~~~~~~~~~~~
+.. glossary::
+ :sorted:
+
+ gateway
+ **Default:** ``irc.poez.io``
+
+ The JID of the IRC gateway to use. If empty, irc.poez.io will be
+ used. Please try to run your own, though, it’s painless to setup.
+
+.. note:: There is no nickname option because the default from poezio will be used.
+
+Server-specific configuration
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Write a configuration section for each server, with the server address as the
+section name, and the following options:
+
+
+.. glossary::
+ :sorted:
+
+
+ login_command
+ **Default:** ``[empty]``
+
+ The command used to identify with the services (e.g. ``IDENTIFY mypassword``).
+
+ login_nick
+ **Default:** ``[empty]``
+
+ The nickname to whom the auth command will be sent.
+
+ nickname
+ **Default:** ``[empty]``
+
+ Your nickname on this server. If empty, the default configuration will be used.
+
+ rooms
+ **Default:** ``[empty]``
+
+ The list of rooms to join on this server (e.g. ``#room1:#room2``).
+
+.. note:: If no login_command or login_nick is set, the authentication phase
+ won’t take place and you will join the rooms after a small delay.
+
+
+Example configuration
+~~~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: ini
+
+ [irc]
+ gateway = irc.poez.io
+
+ [irc.freenode.net]
+ nickname = mynick
+ login_nick = nickserv
+ login_command = identify mynick mypassword
+ rooms = #testroom1:#testroom2
+
+ [irc.geeknode.org]
+ nickname = anothernick
+ login_nick = C
+ login_command = nick identify mypassword
+ rooms = #testvroum
+
+
+
+.. _official website: http://biboumi.louiz.org/
+"""
+
+from plugin import BasePlugin
+
+class Plugin(BasePlugin):
+ def init(self):
+
+ def join(server):
+ "Join rooms after a small delay"
+ nick = self.config.get('nickname', '', server) or self.core.own_nick
+ rooms = self.config.get('rooms', '', server).split(':')
+ for room in rooms:
+ room = '{}%{}@{}/{}'.format(room, server, gateway, nick)
+ self.core.command_join(room)
+
+ gateway = self.config.get('gateway', 'irc.poez.io')
+ sections = self.config.sections()
+
+ for section in (s for s in sections if s != 'irc'):
+ server_suffix = '%%%s@%s' % (section, gateway)
+
+ already_opened = False
+ for tab in self.core.tabs:
+ if tab.name.endswith(server_suffix):
+ already_opened = True
+
+ login_command = self.config.get('login_command', '', section)
+ login_nick = self.config.get('login_nick', '', section)
+ nick = self.config.get('nickname', '', section) or self.core.own_nick
+
+ if login_command and login_nick:
+ dest = '{}{}/{}'.format(login_nick, server_suffix, nick)
+ self.core.xmpp.send_message(mto=dest, mbody=login_command, mtype='chat')
+
+ if not already_opened:
+ delayed = self.api.create_delayed_event(5, join, section)
+ self.api.add_timed_event(delayed)
+