diff options
Diffstat (limited to 'weechat/.weechat/python/bitlbee_completion.py')
-rw-r--r-- | weechat/.weechat/python/bitlbee_completion.py | 114 |
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() |