Script: zerotab.py

Complete empty input line with latest speaker nick in channel.
Author: i686 — Version: 1.5 — License: GPL-3.0-or-later
For WeeChat ≥ 0.3.0.
Tags: completion, py2, py3
Added: 2010-08-03 — Updated: 2013-01-29

Download GitHub Repository

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# -*- coding: utf-8 -*-
#
# Script Name: Zerotab.py
# Script Author: Lucian Adamson <lucian.adamson@yahoo.com>
# Script License: GPL
# Alternate Contact: Freenode IRC nick i686
#
# 2013-01-27, Nils Görs <weechatter@arcor.de>:
#     version 1.5: make script compatible with Python 3.x
# 2011-09-20, Nils Görs <weechatter@arcor.de>:
#     version 1.4: fixed: latest nick from join/part messages were used.
# 2010-12-04, Sebastien Helleu <flashcode@flashtux.org>:
#     version 1.3: use tag "nick_xxx" (WeeChat >= 0.3.4 only)
# 2010-08-03, Sebastien Helleu <flashcode@flashtux.org>:
#     version 1.2: fix bug with nick prefixes (op/halfop/..)
# 2010-08-03, Sebastien Helleu <flashcode@flashtux.org>:
#     version 1.1: fix bug with self nick


SCRIPT_NAME='zerotab'
SCRIPT_AUTHOR='Lucian Adamson <lucian.adamson@yahoo.com>'
SCRIPT_VERSION='1.5'
SCRIPT_LICENSE='GPL'
SCRIPT_DESC='Will tab complete the last nick in channel without typing anything first. This is good for rapid conversations.'

import_ok=True

try:
    import weechat, re
except ImportError:
    print ('This script must be run under WeeChat')
    print ('You can obtain a copy of WeeChat, for free, at http://www.weechat.org')
    import_ok=False

latest_speaker={}
weechat_version=0

def my_completer(data, buffer, command):
    global latest_speaker
    str_input = weechat.buffer_get_string(weechat.current_buffer(), "input")
    if command == "/input complete_next" and str_input == '':
        nick = latest_speaker.get(buffer, "")
        if nick != "":
            weechat.command(buffer, "/input insert " + nick)
    return weechat.WEECHAT_RC_OK

def hook_print_cb(data, buffer, date, tags, displayed, highlight, prefix, message):
    global latest_speaker
    alltags = tags.split(',')
    if 'notify_message' in alltags:
        nick = None
        if int(weechat_version) >= 0x00030400:
            # in version >= 0.3.4, there is a tag "nick_xxx" for each message
            for tag in alltags:
                if tag.startswith('nick_'):
                    nick = tag[5:]
                    break
        else:
            # in older versions, no tag, so extract nick from printed message
            # this is working, except for irc actions (/me ...)
            nick = prefix
            if re.match('^[@%+~*&!-]', nick):
                nick = nick[1:]
        if nick:
            local_nick = weechat.buffer_get_string(buffer, "localvar_nick")
            if nick != local_nick:
                latest_speaker[buffer] = nick
    return weechat.WEECHAT_RC_OK

if __name__ == "__main__" and import_ok:
    if weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE, SCRIPT_DESC, "", ""):
        weechat_version = weechat.info_get("version_number", "") or 0
        weechat.hook_print("", "", "", 1, "hook_print_cb", "")
        weechat.hook_command_run('/input complete*', 'my_completer', '')