about summary refs log tree commit diff
path: root/weechat/.weechat/python/bitlbee_completion.py
diff options
context:
space:
mode:
Diffstat (limited to 'weechat/.weechat/python/bitlbee_completion.py')
-rw-r--r--weechat/.weechat/python/bitlbee_completion.py114
1 files changed, 114 insertions, 0 deletions
diff --git a/weechat/.weechat/python/bitlbee_completion.py b/weechat/.weechat/python/bitlbee_completion.py
new file mode 100644
index 0000000..be6f80e
--- /dev/null
+++ b/weechat/.weechat/python/bitlbee_completion.py
@@ -0,0 +1,114 @@
+# -*- coding: utf-8 -*-
+# Add tab completion to bitlbee commands
+# based on http://scripts.irssi.org/scripts/bitlbee_tab_completion.pl
+#
+# History:
+#
+# 2015-11-02, Mickaƫl Thomas <mickael9@gmail.com>:
+#     version 0.2: strip color attributes for topic detection
+# 2015-03-22, Roger Duran <rogerduran@gmail.com>:
+#     version 0.1: initial version
+
+import weechat
+
+SCRIPT_NAME = "bitlbee_completion"
+SCRIPT_AUTHOR = "Roger Duran <rogerduran@gmail.com>"
+SCRIPT_VERSION = "0.2"
+SCRIPT_LICENSE = "GPL3"
+SCRIPT_DESC = "Add tab completion to bitlbee commands"
+
+OPTS = {
+    "server": None,
+    "channel": None
+    }
+
+TOPIC = "Welcome to the control channel. "\
+    "Type help for help information."
+
+commands = []
+
+
+def request_completion():
+    """
+    Request the completion to the bitlbee server and wait for response
+    """
+    server = OPTS["server"]
+    weechat.command(server, "/quote -server %s COMPLETIONS" % server)
+
+
+def modifier_cb(data, modifier, modifier_data, string):
+    """
+    When the server returns the completion, update the commands list
+    """
+
+    if ":COMPLETIONS" not in string:
+        return string
+    command = string.split(":COMPLETIONS ")[1]
+    if command not in ("OK", "END"):
+        commands.append(command)
+    return ""
+
+
+def bitlbee_completion(data, completion_item, buffer, completion):
+    """
+    Complete bitlbee commands only in the bitlbee buffer
+    """
+
+    server = OPTS["server"]
+    channel = OPTS["channel"]
+    if not server or not channel:
+        return weechat.WEECHAT_RC_OK
+
+    buff_name = weechat.buffer_get_string(buffer, "name")
+    if buff_name == "%s.%s" % (server, channel):
+        for command in commands:
+            weechat.hook_completion_list_add(completion, command, 0,
+                                             weechat.WEECHAT_LIST_POS_SORT)
+    return weechat.WEECHAT_RC_OK
+
+
+def find_buffer():
+    """
+    Find the buffer when the plugin starts
+    """
+    infolist = weechat.infolist_get("buffer", "", "")
+    while weechat.infolist_next(infolist):
+        topic = weechat.infolist_string(infolist, "title")
+        if weechat.string_remove_color(topic, "") == TOPIC:
+            name = weechat.infolist_string(infolist, "name")
+            set_options(name)
+            request_completion()
+            break
+    weechat.infolist_free(infolist)
+
+
+def set_options(name):
+    server, channel = name.split(".")
+    OPTS["server"] = server
+    OPTS["channel"] = channel
+
+
+def print_332(data, buffer, time, tags, displayed, highlight, prefix, message):
+    """
+    Find the buffer when a new one is open
+    """
+    if weechat.string_remove_color(message, "") == TOPIC:
+        name = weechat.buffer_get_string(buffer, "name")
+        set_options(name)
+        request_completion()
+    return weechat.WEECHAT_RC_OK
+
+
+def main():
+    weechat.hook_modifier("irc_in_notice", "modifier_cb", "")
+    weechat.hook_completion("bitlbee", "bitlbee completion",
+                            "bitlbee_completion", "")
+
+    weechat.hook_print('', 'irc_332', '', 1, 'print_332', '')
+    weechat.hook_print('', 'irc_topic', '', 1, 'print_332', '')
+    find_buffer()
+
+if __name__ == "__main__":
+    if weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION,
+                        SCRIPT_LICENSE, SCRIPT_DESC, "", ""):
+        main()