コード例 #1
0
ファイル: hipchat.py プロジェクト: recht/weechat-plugins
def nicklist_download_cb(data, command, rc, out, err):
    global nicklist, nicklist_data

    if nicklist is None:
        nicklist = {}

    try:
        data = json.loads(nicklist_data + out)
        for nick in data['items']:
            nicklist[nick['mention_name']] = nick

        nicklist_data = ''
        next = data.get('links', {}).get('next')
        if next:
            nicklist_download(next)
        else:
            f = os.path.join(hipchat_dir(), 'nicks.json')
            with open(f, 'w') as f:
                f.write(json.dumps(nicklist))
            update_all_fullnames()
            weechat.hook_signal_send('hipchat_nicks_downloaded', weechat.WEECHAT_HOOK_SIGNAL_STRING,
                                     '')
    except (TypeError, ValueError):
        if out:
            nicklist_data += out
    return weechat.WEECHAT_RC_OK
コード例 #2
0
ファイル: weeget.py プロジェクト: nyulacska/vim-dotfiles
def wg_remove_scripts(names):
    """ Remove scripts. """
    if len(wg_scripts) == 0:
        return
    list_names = names.split(" ")
    scripts_to_remove = {}
    for language in SCRIPT_EXTENSION.keys():
        scripts_to_remove[language] = []
    for name in list_names:
        script = wg_search_script_by_name(name)
        if script == None:
            weechat.prnt(
                "", "%s: script \"%s%s%s\" not found" %
                (SCRIPT_NAME, wg_config_color("script"), name,
                 weechat.color("chat")))
        else:
            if script["full_name"] not in scripts_to_remove[
                    script["language"]]:
                scripts_to_remove[script["language"]].append(
                    script["full_name"])
    for language in SCRIPT_EXTENSION.keys():
        if len(scripts_to_remove[language]) > 0:
            # ask C plugin to remove script file(s)
            weechat.hook_signal_send(language + "_script_remove",
                                     weechat.WEECHAT_HOOK_SIGNAL_STRING,
                                     ",".join(scripts_to_remove[language]))
コード例 #3
0
ファイル: weecat.py プロジェクト: jesskay/weecat
def weecat_command_cb(data, buffer, args):
    global weecat_buffers, cmds_by_buffer, listen_hooks

    try:
        this_file = open(args)
    except IOError as e:
        weechat.prnt("", weechat.prefix("error") + "weecat: " + e.strerror)
        return weechat.WEECHAT_RC_ERROR

    filename = this_file.name

    if not args in listen_hooks:
        new_buffer = weechat.buffer_new(
                "wc: " + filename,
                "weecat_input_cb", "",
                "weecat_close_cb", ""
                )

        weechat.buffer_set(new_buffer, "title",
                "weecat: " + filename)

        weechat.hook_signal_send("logger_backlog",
                weechat.WEECHAT_HOOK_SIGNAL_POINTER, new_buffer)

        listen_hooks[filename] = weechat.hook_fd(this_file.fileno(), 1, 0, 0, "weecat_update_cb", new_buffer)

        weechat.buffer_set(new_buffer, "display", "1") # switch to it

        weecat_buffers.add(new_buffer)
        files_by_buffer[new_buffer] = this_file

    return weechat.WEECHAT_RC_OK
コード例 #4
0
ファイル: go.py プロジェクト: thisismiller/dotfiles
def command_run_input(data, buffer, command):
    """ Function called when a command "/input xxxx" is run """
    global buffers, buffers_pos
    if command == "/input search_text" or command.find("/input jump") == 0:
        # search text or jump to another buffer is forbidden now
        return weechat.WEECHAT_RC_OK_EAT
    elif command == "/input complete_next":
        # choose next buffer in list
        buffers_pos += 1
        if buffers_pos >= len(buffers):
            buffers_pos = 0
        weechat.hook_signal_send("input_text_changed", weechat.WEECHAT_HOOK_SIGNAL_STRING, "")
        return weechat.WEECHAT_RC_OK_EAT
    elif command == "/input complete_previous":
        # choose previous buffer in list
        buffers_pos -= 1
        if buffers_pos < 0:
            buffers_pos = len(buffers) - 1
        weechat.hook_signal_send("input_text_changed", weechat.WEECHAT_HOOK_SIGNAL_STRING, "")
        return weechat.WEECHAT_RC_OK_EAT
    elif command == "/input return":
        # switch to selected buffer (if any)
        go_end(buffer)
        if len(buffers) > 0:
            weechat.command(buffer, "/buffer " + str(buffers[buffers_pos]["number"]))
        return weechat.WEECHAT_RC_OK_EAT
    return weechat.WEECHAT_RC_OK
コード例 #5
0
def command_run_input(data, buffer, command):
    """ Function called when a command "/input xxxx" is run """
    global commands, commands_pos
    if command == "/input search_text" or command.find("/input jump") == 0:
        # search text or jump to another buffer is forbidden now
        return w.WEECHAT_RC_OK_EAT
    elif command == "/input complete_next":
        # choose next buffer in list
        commands_pos += 1
        if commands_pos >= len(commands):
            commands_pos = 0
        w.hook_signal_send("input_text_changed",
                                 w.WEECHAT_HOOK_SIGNAL_STRING, "")
        return w.WEECHAT_RC_OK_EAT
    elif command == "/input complete_previous":
        # choose previous buffer in list
        commands_pos -= 1
        if commands_pos < 0:
            commands_pos = len(commands) - 1
        w.hook_signal_send("input_text_changed",
                                 w.WEECHAT_HOOK_SIGNAL_STRING, "")
        return w.WEECHAT_RC_OK_EAT
    elif command == "/input return":
        # As in enter was pressed.
        # Put the current command on the input bar
        histsearch_end(buffer)
        if len(commands) > 0:
            w.command(buffer, "/input insert " + commands[commands_pos])
        return w.WEECHAT_RC_OK_EAT
    return w.WEECHAT_RC_OK
コード例 #6
0
def go_command_run_input(data, buf, command):
    """Function called when a command "/input xxx" is run."""
    global buffers, buffers_pos
    if command == '/input search_text' or command.find('/input jump') == 0:
        # search text or jump to another buffer is forbidden now
        return weechat.WEECHAT_RC_OK_EAT
    elif command == '/input complete_next':
        # choose next buffer in list
        buffers_pos += 1
        if buffers_pos >= len(buffers):
            buffers_pos = 0
        weechat.hook_signal_send('input_text_changed',
                                 weechat.WEECHAT_HOOK_SIGNAL_STRING, '')
        return weechat.WEECHAT_RC_OK_EAT
    elif command == '/input complete_previous':
        # choose previous buffer in list
        buffers_pos -= 1
        if buffers_pos < 0:
            buffers_pos = len(buffers) - 1
        weechat.hook_signal_send('input_text_changed',
                                 weechat.WEECHAT_HOOK_SIGNAL_STRING, '')
        return weechat.WEECHAT_RC_OK_EAT
    elif command == '/input return':
        # switch to selected buffer (if any)
        go_end(buf)
        if len(buffers) > 0:
            weechat.command(
                buf, '/buffer ' + str(buffers[buffers_pos]['full_name']))
        return weechat.WEECHAT_RC_OK_EAT
    return weechat.WEECHAT_RC_OK
コード例 #7
0
ファイル: go.py プロジェクト: gilbertw1/scripts
def go_command_run_input(data, buf, command):
    """Function called when a command "/input xxx" is run."""
    global buffers, buffers_pos
    if command == '/input search_text' or command.find('/input jump') == 0:
        # search text or jump to another buffer is forbidden now
        return weechat.WEECHAT_RC_OK_EAT
    elif command == '/input complete_next':
        # choose next buffer in list
        buffers_pos += 1
        if buffers_pos >= len(buffers):
            buffers_pos = 0
        weechat.hook_signal_send('input_text_changed',
                                 weechat.WEECHAT_HOOK_SIGNAL_STRING, '')
        return weechat.WEECHAT_RC_OK_EAT
    elif command == '/input complete_previous':
        # choose previous buffer in list
        buffers_pos -= 1
        if buffers_pos < 0:
            buffers_pos = len(buffers) - 1
        weechat.hook_signal_send('input_text_changed',
                                 weechat.WEECHAT_HOOK_SIGNAL_STRING, '')
        return weechat.WEECHAT_RC_OK_EAT
    elif command == '/input return':
        # switch to selected buffer (if any)
        go_end(buf)
        if len(buffers) > 0:
            weechat.command(
                buf, '/buffer ' + str(buffers[buffers_pos]['full_name']))
        return weechat.WEECHAT_RC_OK_EAT
    return weechat.WEECHAT_RC_OK
コード例 #8
0
    def __init__(self, server, name, id, type="channel", auto=True):
        """ Init chat """
        self.server = server
        # TODO(arnaud) maybe add an option to remove the # in front of channels
        self.name = f"#{name}" if type == 'channel' else f"{name}"
        self.id = f"{id}"
        self.buffer = weechat.buffer_search("python", self.id)
        self.type = type  # can be channel or private
        if not self.buffer:
            self.buffer = weechat.buffer_new(self.name,
                                             "webex_buffer_input_cb", "",
                                             "webex_buffer_close_cb", "")
        if self.buffer:
            weechat.buffer_set(self.buffer, "title", self.name)
            weechat.buffer_set(self.buffer, "short_name", self.name)
            weechat.buffer_set(self.buffer, "input_multiline", "1")
            weechat.buffer_set(
                self.buffer, "localvar_set_type", self.type
            )  # I use this in external plugin (notification/autosort)
            weechat.buffer_set(self.buffer, "localvar_set_roomid",
                               self.id)  # I use this to debug
            weechat.hook_signal_send("logger_backlog",
                                     weechat.WEECHAT_HOOK_SIGNAL_POINTER,
                                     self.buffer)
            if auto:
                weechat.buffer_set(self.buffer, "display", "auto")

        # Store real ID if possible
        if self.type == "channel":
            self.real_id = get_real_room_id(self.id)
        else:
            self.real_id = None
コード例 #9
0
def cowchat(data, command, return_code, out, err):
    for line in out.split("\n"):
        if len(line) > 0 and line[0] == '/':
            line = '/' + line
        weechat.hook_signal_send("irc_input_send", weechat.WEECHAT_HOOK_SIGNAL_STRING,
                                 "{0};2;;{1}".format(data, line))
    return weechat.WEECHAT_RC_OK
コード例 #10
0
ファイル: weeget.py プロジェクト: zachwlewis/dotfiles
def wg_remove_scripts(names):
    """ Remove scripts. """
    if len(wg_scripts) == 0:
        return
    list_names = names.split(" ")
    scripts_to_remove = {}
    for language in SCRIPT_EXTENSION.keys():
        scripts_to_remove[language] = []
    for name in list_names:
        script = wg_search_script_by_name(name)
        if script == None:
            weechat.prnt("", "%s: script \"%s%s%s\" not found"
                         % (SCRIPT_NAME,
                            wg_config_color("script"),
                            name,
                            weechat.color("chat")))
        else:
            if script["full_name"] not in scripts_to_remove[script["language"]]:
                scripts_to_remove[script["language"]].append(script["full_name"])
    for language in SCRIPT_EXTENSION.keys():
        if len(scripts_to_remove[language]) > 0:
            # ask C plugin to remove script file(s)
            weechat.hook_signal_send(language + "_script_remove",
                                     weechat.WEECHAT_HOOK_SIGNAL_STRING,
                                    ",".join(scripts_to_remove[language]))
コード例 #11
0
ファイル: aban.py プロジェクト: NetSysFire/aban.py
def prepare_and_send_signal(buffer, nick, action):
    global PENDING_ACTIONS
    # needed to get the server buffer (irc.server.#somechannel)
    buffer_info = weechat.buffer_get_string(buffer, "full_name").split(".")
    if buffer_info.pop(0) != "irc":
        log_warning("aban can only be used in irc channel buffers")
        return weechat.WEECHAT_RC_ERROR

    server, channel = buffer_info
    if not channel.startswith("#"):
        log_warning("aban can only be used in irc channel buffers")
        return weechat.WEECHAT_RC_ERROR
    if weechat.info_get('irc_nick', server) == nick:
        log_warning(f"You probably do not want to {action} yourself.")
        return weechat.WEECHAT_RC_ERROR
    # see known issues section in the README
    PENDING_ACTIONS[nick] = {
        "server": server,
        "channel": channel,
        "action": action
    }

    weechat.hook_hsignal_send("irc_redirect_command", {
        "server": server,
        "pattern": "who",
        "signal": "action"
    })
    weechat.hook_signal_send('irc_input_send',
                             weechat.WEECHAT_HOOK_SIGNAL_STRING,
                             f"{server};;2;;/who {nick} %a")

    # to please pylint
    return weechat.WEECHAT_RC_OK
コード例 #12
0
ファイル: go.py プロジェクト: norrs/weechat-plugins
def command_run_input(data, buffer, command):
    """ Function called when a command "/input xxxx" is run """
    global buffers, buffers_pos
    if command == "/input search_text" or command.find("/input jump") == 0:
        # search text or jump to another buffer is forbidden now
        return weechat.WEECHAT_RC_OK_EAT
    elif command == "/input complete_next":
        # choose next buffer in list
        buffers_pos += 1
        if buffers_pos >= len(buffers):
            buffers_pos = 0
        weechat.hook_signal_send("input_text_changed",
                                 weechat.WEECHAT_HOOK_SIGNAL_STRING, "")
        return weechat.WEECHAT_RC_OK_EAT
    elif command == "/input complete_previous":
        # choose previous buffer in list
        buffers_pos -= 1
        if buffers_pos < 0:
            buffers_pos = len(buffers) - 1
        weechat.hook_signal_send("input_text_changed",
                                 weechat.WEECHAT_HOOK_SIGNAL_STRING, "")
        return weechat.WEECHAT_RC_OK_EAT
    elif command == "/input return":
        # switch to selected buffer (if any)
        go_end(buffer)
        if len(buffers) > 0:
            weechat.command(
                buffer, "/buffer " + str(buffers[buffers_pos]["full_name"]))
        return weechat.WEECHAT_RC_OK_EAT
    return weechat.WEECHAT_RC_OK
コード例 #13
0
ファイル: cowchat.py プロジェクト: telnoratti/weechatrc
def cowchat_line(data, remaining_calls):
    lines = data.split("\n")
    data = lines.pop(0)
    line = lines[-int(remaining_calls) - 1]
    if len(line) > 1 and line[0] == '/':
        line = '/' + line
    weechat.hook_signal_send("irc_input_send",
                             weechat.WEECHAT_HOOK_SIGNAL_STRING,
                             "{};2;;{}".format(data, line))
    return weechat.WEECHAT_RC_OK
コード例 #14
0
def command_run_input(data, buffer, command):
    """ Function called when a command "/input xxxx" is run """
    global buffers, buffers_pos
    if command == "/input search_text" or command.find("/input jump") == 0:
        # search text or jump to another buffer is forbidden now
        return weechat.WEECHAT_RC_OK_EAT
    elif command == "/input complete_next":
        # choose next buffer in list
        buffers_pos += 1
        if buffers_pos >= len(buffers):
            buffers_pos = 0
        weechat.hook_signal_send("input_text_changed",
                                 weechat.WEECHAT_HOOK_SIGNAL_STRING, "")
        return weechat.WEECHAT_RC_OK_EAT
    elif command == "/input complete_previous":
        # choose previous buffer in list
        buffers_pos -= 1
        if buffers_pos < 0:
            buffers_pos = len(buffers) - 1
        weechat.hook_signal_send("input_text_changed",
                                 weechat.WEECHAT_HOOK_SIGNAL_STRING, "")
        return weechat.WEECHAT_RC_OK_EAT
    elif command == "/input return":
        # switch to selected buffer (if any)
        go_end(buffer)
        if len(buffers) > 0:
            currentbuffer = buffers[buffers_pos]["number"]

            # check for a window opened with this buffer
            if buffers_match_window:
                windows = weechat.infolist_get("window", "", "")
                win = True
                foundwin = False

                while win:
                    win = weechat.infolist_next(windows)
                    if weechat.buffer_get_integer(
                            weechat.infolist_pointer(windows, "buffer"),
                            "number") == currentbuffer:
                        foundwin = True
                        break

                weechat.infolist_free(windows)

            if buffers_match_window and foundwin:
                weechat.command(
                    buffer, "/window b" + str(buffers[buffers_pos]["number"]))
            else:
                weechat.command(
                    buffer, "/buffer " + str(buffers[buffers_pos]["number"]))

        return weechat.WEECHAT_RC_OK_EAT
    return weechat.WEECHAT_RC_OK
コード例 #15
0
def owl_init(buff_ptr):
    # get more info about this buffer
    buff_name = weechat.buffer_get_string(buff_ptr, 'name')
    buff_server = weechat.buffer_get_string(buff_ptr, 'localvar_server')
    buff_channel = weechat.buffer_get_string(buff_ptr, 'localvar_channel')
    if DEBUG:
        weechat.prnt('', 'ptr:{} name:{}\n'.format(buff_ptr, buff_name))

    # is owl active in this channel?
    if (buff_name in owl_on_buffers
            or (buff_name not in owl_off_buffers and owl_default_on)):
        # analyze nicks in the buffer
        iln = weechat.infolist_get('irc_nick', '',
                                   '{},{}'.format(buff_server, buff_channel))
        while weechat.infolist_next(iln):
            nick_ptr = weechat.infolist_pointer(iln, 'pointer')
            nick = weechat.infolist_string(iln, 'name')
            user_host = weechat.infolist_string(iln, 'host')
            # should we use /userhost to get hostname?
            if len(user_host) == 0:
                # track nick-buffer relationship
                if buff_server in owl_state['nick_buffs']:
                    if nick in owl_state['nick_buffs'][buff_server]:
                        owl_state['nick_buffs'][buff_server][nick].append(
                            buff_name)
                    else:
                        owl_state['nick_buffs'][buff_server][nick] = [
                            buff_name
                        ]
                else:
                    owl_state['nick_buffs'][buff_server] = {nick: [buff_name]}
                # do hookie things
                weechat.hook_hsignal_send(
                    'irc_redirect_command', {
                        'server': buff_server,
                        'pattern': 'userhost',
                        'signal': 'owl',
                        'string': nick,
                        'timeout': owl_settings['userhost_timeout'],
                    })
                weechat.hook_signal_send(
                    'irc_input_send', weechat.WEECHAT_HOOK_SIGNAL_STRING,
                    '{};;;;/userhost {}'.format(buff_server, nick))
                user_host = '****PENDING****'
            else:
                user, host = user_host.split('@')
                owl_analyze(nick, user, host, buff_name, DIR_IN)
            if DEBUG:
                weechat.prnt('', '  {}!{}\n'.format(nick, user_host))
        weechat.infolist_free(iln)

    return weechat.WEECHAT_RC_OK
コード例 #16
0
ファイル: vimode.py プロジェクト: alejandraa/home
def handle_esc(data, remaining_calls):
    """Esc acts as a modifier and usually waits for another keypress.

    To circumvent that, simulate a keypress then remove what was inserted.

    """
    global cmd_text
    weechat.command('', "/input insert %s" % data)
    weechat.hook_signal_send("key_pressed", weechat.WEECHAT_HOOK_SIGNAL_STRING,
                             data)
    if cmd_text == ":[":
        cmd_text = ':'
    return weechat.WEECHAT_RC_OK
コード例 #17
0
ファイル: autoaway.py プロジェクト: miniCruzer/irc-scripts
def clear_away(server="") -> None:
    """ clear away status on 'server'. if no server parameter is specified, clears away status on
    all servers that *this script* set /AWAY on. """

    if server:
        w.hook_signal_send("irc_input_send", w.WEECHAT_HOOK_SIGNAL_STRING,
                           f"{server};;priority_low;;/away")
        AWAY_SERVERS.remove(server)
    else:
        for name in AWAY_SERVERS:
            w.hook_signal_send("irc_input_send", w.WEECHAT_HOOK_SIGNAL_STRING,
                               f"{name};;priority_low;;/away")
        AWAY_SERVERS.clear()
コード例 #18
0
ファイル: vimode.py プロジェクト: jnbek/_weechat
def handle_esc(data, remaining_calls):
    """Esc acts as a modifier and usually waits for another keypress.

    To circumvent that, simulate a keypress then remove what was inserted.

    """
    global cmd_text
    weechat.command('', "/input insert %s" % data)
    weechat.hook_signal_send("key_pressed", weechat.WEECHAT_HOOK_SIGNAL_STRING,
                            data)
    if cmd_text == ":[":
        cmd_text = ':'
    return weechat.WEECHAT_RC_OK
コード例 #19
0
ファイル: autoaway.py プロジェクト: usrbinsam/irc-scripts
def clear_away(server="") -> None:
    """ clear away status on 'server'. if no server parameter is specified, clears away status on
    all servers that *this script* set /AWAY on. """

    if server:
        w.hook_signal_send("irc_input_send", w.WEECHAT_HOOK_SIGNAL_STRING,
                           f"{server};;priority_low;;/away")
        AWAY_SERVERS.remove(server)
    else:
        for name in AWAY_SERVERS:
            w.hook_signal_send("irc_input_send", w.WEECHAT_HOOK_SIGNAL_STRING,
                               f"{name};;priority_low;;/away")
        AWAY_SERVERS.clear()
コード例 #20
0
ファイル: go.py プロジェクト: GGLucas/configs
def command_run_input(data, buffer, command):
    """ Function called when a command "/input xxxx" is run """
    global buffers, buffers_pos
    if command == "/input search_text" or command.find("/input jump") == 0:
        # search text or jump to another buffer is forbidden now
        return weechat.WEECHAT_RC_OK_EAT
    elif command == "/input complete_next":
        # choose next buffer in list
        buffers_pos += 1
        if buffers_pos >= len(buffers):
            buffers_pos = 0
        weechat.hook_signal_send("input_text_changed",
                                 weechat.WEECHAT_HOOK_SIGNAL_STRING, "")
        return weechat.WEECHAT_RC_OK_EAT
    elif command == "/input complete_previous":
        # choose previous buffer in list
        buffers_pos -= 1
        if buffers_pos < 0:
            buffers_pos = len(buffers) - 1
        weechat.hook_signal_send("input_text_changed",
                                 weechat.WEECHAT_HOOK_SIGNAL_STRING, "")
        return weechat.WEECHAT_RC_OK_EAT
    elif command == "/input return":
        # switch to selected buffer (if any)
        go_end(buffer)
        if len(buffers) > 0:
            currentbuffer = buffers[buffers_pos]["number"]

            # check for a window opened with this buffer
            if buffers_match_window:
                windows = weechat.infolist_get("window", "", "")
                win = True
                foundwin = False

                while win:
                    win = weechat.infolist_next(windows)
                    if weechat.buffer_get_integer(weechat.infolist_pointer(windows, "buffer"), "number") == currentbuffer:
                        foundwin = True
                        break

                weechat.infolist_free(windows)

            if buffers_match_window and foundwin:
                weechat.command(buffer, "/window b" + str(buffers[buffers_pos]["number"]))
            else:
                weechat.command(buffer, "/buffer " + str(buffers[buffers_pos]["number"]))

        return weechat.WEECHAT_RC_OK_EAT
    return weechat.WEECHAT_RC_OK
コード例 #21
0
def ison(bufpointer, servername, nick, nicklist):
    command = ISON % ' '.join(nicklist)
    weechat.hook_hsignal_send(
        'irc_redirect_command', {
            'server': servername,
            'pattern': 'ison',
            'signal': SCRIPT_NAME,
            'count': '1',
            'string': servername,
            'timeout': OPTIONS['timeout'],
            'cmd_filter': ''
        })
    weechat.hook_signal_send('irc_input_send',
                             weechat.WEECHAT_HOOK_SIGNAL_STRING,
                             '%s;;;;%s' % (servername, command))
コード例 #22
0
ファイル: keepnick.py プロジェクト: Shrews/scripts
def ison(bufpointer, servername, nick, nicklist):
    command = ISON % " ".join(nicklist)
    weechat.hook_hsignal_send(
        "irc_redirect_command",
        {
            "server": servername,
            "pattern": "ison",
            "signal": SCRIPT_NAME,
            "count": "1",
            "string": servername,
            "timeout": OPTIONS["timeout"],
            "cmd_filter": "",
        },
    )
    weechat.hook_signal_send("irc_input_send", weechat.WEECHAT_HOOK_SIGNAL_STRING, "%s;;;;%s" % (servername, command))
コード例 #23
0
def topic_cb(data, signal, signal_data):
    global i
    (host, command, channel) = signal_data.split()[0:3]

    # ban cc66 from changing topic anywhere possible
    if (host.lower().find('unaffiliated/cc66') != -1
            or host.lower().find('gateway/web') != -1):

        wc.hook_signal_send(
            'irc_input_send', wc.WEECHAT_HOOK_SIGNAL_STRING,
            'freenode;{};priority_low;;/topic {}'.format(
                channel, halal_topic[i % len(halal_topic)]))
        i += 1

    return wc.WEECHAT_RC_OK
コード例 #24
0
ファイル: signal.py プロジェクト: rxcomm/signal-weechat
def get_buffer(identifier, isGroup):
    if identifier not in buffers:
        cb = "buffer_input_group" if isGroup else "buffer_input"
        logger.debug("Creating buffer for identifier %s (%s)", identifier,
                     "group" if isGroup else "contact")
        buffers[identifier] = weechat.buffer_new(identifier, cb, identifier,
                                                 "buffer_close_cb", identifier)
        if not isGroup and identifier in contacts:
            name = contacts[identifier].get('name', identifier)
            set_buffer_name(buffers[identifier], name)
        if isGroup:
            setup_group_buffer(identifier)
        weechat.hook_signal_send("logger_backlog",
                                 weechat.WEECHAT_HOOK_SIGNAL_POINTER,
                                 buffers[identifier])
    return buffers[identifier]
コード例 #25
0
ファイル: xfer_scp.py プロジェクト: ktsamis/scripts-1
def xfer_scp_process_cb(data, command, rc, out, err):
    if rc == 0:
        # process has terminated successfully
        weechat.prnt('', "xfer_scp: File " + data + " sent via SCP successfully")
        if configurations['delete_after_send'].lower() == "true":
            del_file(data)

        weechat.hook_signal_send("xfer_scp_success", weechat.WEECHAT_HOOK_SIGNAL_STRING, data.rsplit("/", 1).pop())
        return weechat.WEECHAT_RC_OK

    elif rc > 0:
        # process terminated unsuccesfully
        weechat.prnt('', "xfer_scp: File " + data + " did not send successfully")

        weechat.hook_signal_send("xfer_scp_failure", weechat.WEECHAT_HOOK_SIGNAL_STRING, data.rsplit("/", 1).pop())
        return weechat.WEECHAT_RC_ERROR

    else:
        return weechat.WEECHAT_RC_OK
コード例 #26
0
ファイル: weeget.py プロジェクト: zachwlewis/dotfiles
def wg_process_script_cb(data, command, rc, stdout, stderr):
    """ Callback when reading a script from website. """
    global wg_hook_process, wg_stdout, wg_current_script_install, wg_loaded_scripts
    if stdout != "":
        wg_stdout["script"] += stdout
    if stderr != "":
        wg_stdout["script"] += stderr
    if int(rc) >= 0:
        if wg_stdout["script"].startswith("error:"):
            weechat.prnt("", "%s%s: error downloading script (%s)"
                         % (weechat.prefix("error"), SCRIPT_NAME,
                            wg_stdout["update"][6:].strip()))
        else:
            # ask C plugin to install/load script
            weechat.hook_signal_send(wg_current_script_install["language"] + "_script_install",
                                     weechat.WEECHAT_HOOK_SIGNAL_STRING,
                                     wg_config_get_dir() + os.sep + wg_current_script_install["full_name"])
        wg_hook_process["script"] = ""
        wg_install_next_script()
    return weechat.WEECHAT_RC_OK
コード例 #27
0
def wg_process_script_cb(data, command, rc, stdout, stderr):
    """ Callback when reading a script from website. """
    global wg_hook_process, wg_stdout, wg_current_script_install, wg_loaded_scripts
    if stdout != "":
        wg_stdout["script"] += stdout
    if stderr != "":
        wg_stdout["script"] += stderr
    if int(rc) >= 0:
        if wg_stdout["script"].startswith("error:"):
            weechat.prnt("", "%s%s: error downloading script (%s)"
                         % (weechat.prefix("error"), SCRIPT_NAME,
                            wg_stdout["update"][6:].strip()))
        else:
            # ask C plugin to install/load script
            weechat.hook_signal_send(wg_current_script_install["language"] + "_script_install",
                                     weechat.WEECHAT_HOOK_SIGNAL_STRING,
                                     wg_config_get_dir() + os.sep + wg_current_script_install["full_name"])
        wg_hook_process["script"] = ""
        wg_install_next_script()
    return weechat.WEECHAT_RC_OK
コード例 #28
0
ファイル: WeeMustFeed.py プロジェクト: jesskay/WeeMustFeed
def weemustfeed_command_cb(data, buffer, args):
    global weemustfeed_buffer

    if weemustfeed_buffer is None:
        weemustfeed_buffer = weechat.buffer_new(
                "weemustfeed",
                "weemustfeed_input_cb", "",
                "weemustfeed_close_cb", ""
                )

        weechat.buffer_set(weemustfeed_buffer, "title",
                "WeeMustFeed - a: Add feed, d: Delete feed, u: Update URL, l: List feeds, t: Toggle feed, ?: Show help")

        weechat.hook_signal_send("logger_backlog",
                weechat.WEECHAT_HOOK_SIGNAL_POINTER, weemustfeed_buffer)

        set_timer()

    weechat.buffer_set(weemustfeed_buffer, "display", "1") # switch to it

    return weechat.WEECHAT_RC_OK
コード例 #29
0
ファイル: stalker.py プロジェクト: JackMc/WeeChatStalker
def stalker_cmd(data, buffer, args):
    args = args.strip()
    if ' ' in args:
        return w.WEECHAT_RC_ERROR

    server = w.buffer_get_string(buffer, "localvar_server")

    # it's a hostname
    if '@' in args:
        stalker_cmd_bottom(buffer, server, args.split('@')[-1])
    else:
        # Check if the user's in our database already.
        cur = conn.cursor()
        cur.execute('SELECT host_id FROM nicks WHERE nick = "%s"' % (args))
        rows = cur.fetchall()
        cur.close()

        if len(rows):
            host_id = rows[0][0]
            cur = conn.cursor()
            cur.execute('SELECT host FROM hosts WHERE id = %d' % host_id)
            hostnames = [c[0] for c in cur.fetchall()]
            for hostname in hostnames:
                who_cache_update(args, server, hostname)
            stalker_cmd_bottom(buffer, server, hostnames)
            cur.close()
        else:
            if (args + server) in who_cache:
                stalker_cmd_bottom(buffer, server, who_cache[args + server])
            else:
                w.hook_hsignal ("irc_redirection_stalker_who", "stalker_cmd_cb", buffer)
                w.hook_hsignal_send("irc_redirect_command",
                                          { "server": server, "pattern": "who", "signal": "stalker" })
                w.hook_signal_send("irc_input_send", w.WEECHAT_HOOK_SIGNAL_STRING,
                                         ("%s;;2;;/who %s") % (server, args))
        
    return w.WEECHAT_RC_OK
コード例 #30
0
ファイル: stalker.py プロジェクト: JackMc/WeeChatStalker
    global conn
    if conn:
        conn.close()

if __name__ == '__main__' and import_ok:
    if w.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION,
                        SCRIPT_LICENSE, SCRIPT_DESC, "", ""):
        stalker_init()
        try:
            stalker_load_db()
        except Exception as e:
            traceback.print_exc()
            w.prnt('', '%s could not load database: %s. Unloading script.' % (SCRIPT_NAME, str(e)))
            # Commit honourable script-icide
            w.hook_signal_send('python_script_remove',
                                     w.WEECHAT_HOOK_SIGNAL_STRING,
                                     os.path.basename(__file__))

        w.hook_command(STALKER_CMD, SCRIPT_DESC,
                      "<user>",
                      '''
                         user: User or hostname to stalk!
                      ''',
                      '%(irc_channel_nicks_hosts)',
                      'stalker_cmd', 'stalker_finish')
        w.hook_signal("*,irc_in2_join", "stalk_cb", "")
        w.hook_signal("*,irc_in2_part", "stalk_cb", "")
        w.hook_signal("*,irc_in2_quit", "stalk_quit_cb", "")
        w.hook_signal("*,irc_in2_nick", "stalk_nick_cb", "")
        w.hook_signal("*,irc_in2_privmsg", "stalk_cb", "")
コード例 #31
0
ファイル: autoaway.py プロジェクト: miniCruzer/irc-scripts
def set_away(server: str, message: str) -> None:
    """ set away status on 'server' with 'message' """
    w.hook_signal_send("irc_input_send", w.WEECHAT_HOOK_SIGNAL_STRING,
                       f"{server};;priority_low;;/away {message}")
    AWAY_SERVERS.add(server)
コード例 #32
0
def force_redraw():
    wc.hook_signal_send("input_text_changed", \
                        wc.WEECHAT_HOOK_SIGNAL_STRING, "")
コード例 #33
0
ファイル: autoaway.py プロジェクト: usrbinsam/irc-scripts
def set_away(server: str, message: str) -> None:
    """ set away status on 'server' with 'message' """
    w.hook_signal_send("irc_input_send", w.WEECHAT_HOOK_SIGNAL_STRING,
                       f"{server};;priority_low;;/away {message}")
    AWAY_SERVERS.add(server)
コード例 #34
0
ファイル: znc-playback.py プロジェクト: cp16net/dotfiles-1
def playback_cb(data, modifier, modifier_data, string):
    global COLOR_RESET, COLOR_CHAT_DELIMITERS, COLOR_CHAT_NICK, COLOR_CHAT_HOST, \
           COLOR_CHAT_CHANNEL, COLOR_CHAT, COLOR_MESSAGE_JOIN, COLOR_MESSAGE_QUIT, \
           COLOR_REASON_QUIT, SMART_FILTER
    global send_signals, znc_timestamp

    plugin, buffer_name, tags = modifier_data.split(';')
    if plugin != 'irc' or buffer_name == 'irc_raw':
        return string

    if tags:
        tags = set(tags.split(','))
    else:
        tags = set()

    global buffer_playback
    if 'nick_***' in tags:
        line = string.partition('\t')[2]
        if line == 'Buffer Playback...':
            weechat.hook_signal_send("znc-playback-start",
                                     WEECHAT_HOOK_SIGNAL_STRING, buffer_name)
            debug("* buffer playback for %s", buffer_name)
            get_config_options()
            nick_talked.clear()
            buffer = weechat.buffer_search(plugin, buffer_name)
            buffer_playback[buffer_name] = buffer
        elif line == 'Playback Complete.':
            buffer = buffer_playback[buffer_name]
            del buffer_playback[buffer_name]
            debug("* end of playback for %s", buffer_name)
            weechat.hook_signal_send("znc-playback-stop",
                                     WEECHAT_HOOK_SIGNAL_STRING, buffer_name)
        tags.discard('notify_message')
        tags.discard('irc_privmsg')
        prnt_date_tags(buffer, 0, ','.join(tags), string)
        return ''

    elif not (buffer_playback and buffer_name in buffer_playback):
        return string

    buffer = buffer_playback[buffer_name]

    #debug(string)

    def strip_timestamp(s):
        words = znc_timestamp.count(' ') + 1
        p = 0
        for i in range(words):
            p = s[p:].find(' ') + p + 1
        return s[:p - 1], s[p:]

    prefix, s, line = string.partition('\t')
    if 'irc_action' in tags or 'irc_notice' in tags:
        _prefix, _, line = line.partition(' ')
        timestamp, line = strip_timestamp(line)
        line = '%s %s' % (_prefix, line)
    else:
        timestamp, line = strip_timestamp(line)

    try:
        t = time.strptime(timestamp, znc_timestamp)
    except ValueError, e:
        # bad time format.
        error(e)
        #debug("%s\n%s" % (modifier_data, string))
        return string
コード例 #35
0
ファイル: znc-playback.py プロジェクト: jb55/dotfiles
def playback_cb(data, modifier, modifier_data, string):
    global COLOR_RESET, COLOR_CHAT_DELIMITERS, COLOR_CHAT_NICK, COLOR_CHAT_HOST, \
           COLOR_CHAT_CHANNEL, COLOR_CHAT, COLOR_MESSAGE_JOIN, COLOR_MESSAGE_QUIT, \
           COLOR_REASON_QUIT, SMART_FILTER
    global send_signals, znc_timestamp

    plugin, buffer_name, tags = modifier_data.split(';')
    if plugin != 'irc' or buffer_name == 'irc_raw':
        return string

    if tags:
        tags = set(tags.split(','))
    else:
        tags = set()
    
    global buffer_playback
    if 'nick_***' in tags:
        line = string.partition('\t')[2]
        if line == 'Buffer Playback...':
            weechat.hook_signal_send("znc-playback-start",
                                     WEECHAT_HOOK_SIGNAL_STRING,
                                     buffer_name)
            debug("* buffer playback for %s", buffer_name)
            get_config_options()
            nick_talked.clear()
            buffer = weechat.buffer_search(plugin, buffer_name)
            buffer_playback[buffer_name] = buffer
        elif line == 'Playback Complete.':
            buffer = buffer_playback[buffer_name]
            del buffer_playback[buffer_name]
            debug("* end of playback for %s", buffer_name)
            weechat.hook_signal_send("znc-playback-stop",
                                     WEECHAT_HOOK_SIGNAL_STRING,
                                     buffer_name)
        tags.discard('notify_message')
        tags.discard('irc_privmsg')
        prnt_date_tags(buffer, 0, ','.join(tags), string)
        return ''

    elif not (buffer_playback and buffer_name in buffer_playback):
        return string

    buffer = buffer_playback[buffer_name]

    #debug(string)

    def strip_timestamp(s):
        words = znc_timestamp.count(' ') + 1
        p = 0
        for i in range(words):
            p = s[p:].find(' ') + p + 1
        return s[:p - 1], s[p:]

    prefix, s, line = string.partition('\t')
    if 'irc_action' in tags or 'irc_notice' in tags:
        _prefix, _, line = line.partition(' ')
        timestamp, line = strip_timestamp(line)
        line = '%s %s' % (_prefix, line)
    else:
        timestamp, line = strip_timestamp(line)

    try:
        t = time.strptime(timestamp, znc_timestamp)
    except ValueError, e:
        # bad time format.
        error(e)
        #debug("%s\n%s" % (modifier_data, string))
        return string
コード例 #36
0
ファイル: znc-playback.py プロジェクト: jb55/dotfiles
                COLOR_CHAT_NICK, # TODO there's a function for use nick's color
                nick,
                COLOR_CHAT_DELIMITERS,
                ' (',
                COLOR_CHAT_HOST, # TODO host can be hidden in config
                host,
                COLOR_CHAT_DELIMITERS,
                ')',
                COLOR_MESSAGE_JOIN,
                COLOR_CHAT_CHANNEL,
                channel,
                COLOR_MESSAGE_JOIN)

        if send_signals:
            weechat.hook_signal_send(server + ",irc_in_JOIN",
                                     WEECHAT_HOOK_SIGNAL_STRING,
                                     ":%s JOIN :%s" % (hostmask, channel))

    elif line == 'parted':
        tags.add('irc_part')
        # buffextras doesn't seem to send the part's reason.
        s = weechat.gettext("%s%s%s%s%s%s%s%s%s%s has left %s%s%s")
        s = s %(weechat.prefix('quit'),
                COLOR_CHAT_NICK,
                nick,
                COLOR_CHAT_DELIMITERS,
                ' (',
                COLOR_CHAT_HOST,
                host,
                COLOR_CHAT_DELIMITERS,
                ')',
コード例 #37
0
ファイル: weetwit.py プロジェクト: torhve/weetwit
def setup_timeline(timelined, followed=False, search=False):
    """Sets up the main timeline window."""
    global hooks
    global user
    global tlid
    global buffers
    if not search:
        name = "timeline"
        short_name = "twitter"
        title = "%s's timeline" % user.screen_name
        prefix = "__TIMELINE"
        search = False
        buf_cb = "tweet_cb"
    else:
        name = search
        short_name = search
        title = "Twitter search for %s" % search
        prefix = md5(search).hexdigest()
        buf_cb = "tweet_cb"
    buf = wc.buffer_new(name, buf_cb, "", "stop_timelined", prefix)
    # Some naming
    wc.buffer_set(buf, "title", title)
    wc.buffer_set(buf, "short_name", short_name)
    wc.buffer_set(buf, "localvar_set_server", "twitter")
    wc.buffer_set(buf, "localvar_set_channel", name)
    wc.buffer_set(buf, "localvar_set_nick", user.screen_name)

    # We want mentions to highlight.
    wc.buffer_set(buf, "highlight_words", user.screen_name)

    if followed:
        # We want a nicklist to hold everyone we follow.
        wc.buffer_set(buf, "nicklist", "1")
        add_to_nicklist(buf, user.screen_name)

        for screen_name in followed:
            add_to_nicklist(buf, screen_name)

    storage_dir = wc.config_get_plugin("storage_dir")
    command = timelined + " " + storage_dir
    if search:
        command += " '%s'" % search
    timelinestream_hook = wc.hook_process(
        command,
        0, "timelined_cb", prefix)

    strkey = prefix + "STREAM"
    hooks[strkey] = timelinestream_hook

    # Check if there are new timeline entries every second.
    timelinedisplay_hook = wc.hook_timer(1 * 1000, 60, 0, "display_cb",
        prefix)
    diskey = prefix + "DISPLAY"
    hooks[diskey] = timelinedisplay_hook
    if search:
        wc.buffer_set(buf, "display", "1")
    buffers[prefix] = buf

    hooks['signal'] = wc.hook_signal("input_text_changed",
            "timeline_prompt_cb", "")

    if prefix is "__TIMELINE":
        tlid[prefix] = "timelined"
    else:
        tlid[prefix] = prefix

    wc.hook_signal_send("logger_backlog",
            wc.WEECHAT_HOOK_SIGNAL_POINTER, buf)
コード例 #38
0
ファイル: keepnick.py プロジェクト: DarkDefender/scripts
def ison(servername,nick,nicklist):
    command = ISON % ' '.join(nicklist)
    debug_print("Checking nicks on server %s with command: %s" % (servername, command) )
    weechat.hook_hsignal_send('irc_redirect_command',
                                  { 'server': servername, 'pattern': 'ison', 'signal': SCRIPT_NAME, 'count': '1', 'string': servername, 'timeout': OPTIONS['timeout'], 'cmd_filter': '' })
    weechat.hook_signal_send('irc_input_send', weechat.WEECHAT_HOOK_SIGNAL_STRING, '%s;;;;%s' % (servername,command))
コード例 #39
0
def handle_message_cb(data, buffer, date, tags, disp, hl, nick, message):
    """
    Callback that handles new messages.  If the message is in the format of a
    regex find/replace (ex. 's/typo/replacement/', 'nick: s/typo/replacement')
    then the last print_limit messages for that nick are re-printed to the
    current buffer in their oringal order with the change applied.  Otherwise
    the message is stored in LASTWORDS dictionary for this buffer > nick.
    """

    # Don't do anything if the message isn't suppose to be displayed.
    if disp:
        buffer_name = weechat.buffer_get_string(buffer, 'name')
        if (nick == ' *'):
            nick = message.split(' ')[0]
        log = LASTWORDS[(buffer_name, nick)]
        try:
            server_name, buf_short_name = buffer_name.split('.', 2)
        except:
            return
        all_vaild_nick = weechat.config_get_plugin('valid_nick')
        if (all_vaild_nick != '0'):
            all_vaild_nick = all_vaild_nick.split(',')
            if (nick not in all_vaild_nick):
                return weechat.WEECHAT_RC_OK

        # Matches on both 's/typo/replacement' and 'nick: s/typo/replacement',
        # mainly because of bitlbee since it puts your nick in front of
        # incoming messages.
        #
        # Nick regex nicked from colorize_nicks available here:
        # http://www.weechat.org/scripts/source/stable/colorize_nicks.py.html/
        valid_nick = r'([@~&!%+])?([-a-zA-Z0-9\[\]\\`_^\{|\}]+)'
        valid_correction = r's/[^/]*/[^/]*'
        correction_message_pattern = re.compile(r'(%s:\s*)?(%s)(/)?$' %
                                                (valid_nick, valid_correction))
        match = re.match(correction_message_pattern, message)

        if match:
            # If message is a correction and we have previous messages from
            # this nick, print up to print_limit of the nick's previous
            # messages with corrections applied, in their original order.
            correction = match.group(4)
            if log and correction:
                print_format = weechat.config_get_plugin('print_format')
                for cm in get_corrected_messages(nick, log, correction):
                    corrected_msg = print_format
                    for k, v in cm.iteritems():
                        corrected_msg = corrected_msg.replace('[%s]' % k, v)
                    send_msg = "%s;%s;priority_high,user_message;;%s" % (
                        server_name, buf_short_name, corrected_msg)
                    weechat.hook_signal_send(
                        "irc_input_send", weechat.WEECHAT_HOOK_SIGNAL_STRING,
                        send_msg)
        else:
            # If it's not a correction, store the message in LASTWORDS.
            log.insert(0, {'message': message, 'timestamp': date})
            # If there's a per-nick limit, shorten the list to match.
            message_limit = get_option_int('message_limit')
            while message_limit and len(log) > message_limit:
                log.pop()

    return weechat.WEECHAT_RC_OK
コード例 #40
0
ファイル: znc-playback.py プロジェクト: cp16net/dotfiles-1
            COLOR_CHAT_NICK,  # TODO there's a function for use nick's color
            nick,
            COLOR_CHAT_DELIMITERS,
            ' (',
            COLOR_CHAT_HOST,  # TODO host can be hidden in config
            host,
            COLOR_CHAT_DELIMITERS,
            ')',
            COLOR_MESSAGE_JOIN,
            COLOR_CHAT_CHANNEL,
            channel,
            COLOR_MESSAGE_JOIN)

        if send_signals:
            weechat.hook_signal_send(server + ",irc_in_JOIN",
                                     WEECHAT_HOOK_SIGNAL_STRING,
                                     ":%s JOIN :%s" % (hostmask, channel))

    elif line == 'parted':
        tags.add('irc_part')
        # buffextras doesn't seem to send the part's reason.
        s = weechat.gettext("%s%s%s%s%s%s%s%s%s%s has left %s%s%s")
        s = s % (weechat.prefix('quit'), COLOR_CHAT_NICK, nick,
                 COLOR_CHAT_DELIMITERS, ' (', COLOR_CHAT_HOST, host,
                 COLOR_CHAT_DELIMITERS, ')', COLOR_MESSAGE_QUIT,
                 COLOR_CHAT_CHANNEL, channel, COLOR_MESSAGE_QUIT)

        if send_signals:
            weechat.hook_signal_send(server + ",irc_in_PART",
                                     WEECHAT_HOOK_SIGNAL_STRING,
                                     ":%s PART %s" % (hostmask, channel))
コード例 #41
0
ファイル: znc-playback.py プロジェクト: 9ary/weechat-scripts
def playback_cb(data, modifier, modifier_data, string):
    global COLOR_RESET, COLOR_CHAT_DELIMITERS, COLOR_CHAT_NICK, COLOR_CHAT_HOST, \
           COLOR_CHAT_CHANNEL, COLOR_CHAT, COLOR_MESSAGE_JOIN, COLOR_MESSAGE_QUIT, \
           COLOR_REASON_QUIT, SMART_FILTER
    global send_signals, znc_timestamp

    if modifier_data.startswith('0x'):
        buffer, tags = modifier_data.split(';', 1)
        plugin = weechat.buffer_get_string(buffer, 'plugin')
        buffer_name = weechat.buffer_get_string(buffer, 'name')
    else:
        plugin, buffer_name, tags = modifier_data.split(';', 2)
        buffer = weechat.buffer_search(plugin, buffer_name)
    if plugin != 'irc' or buffer_name == 'irc_raw':
        return string

    if tags:
        tags = set(tags.split(','))
    else:
        tags = set()

    global buffer_playback
    if 'nick_***' in tags:
        line = string.partition('\t')[2]
        if line in ['Buffer Playback...', 'Backlog playback...']:
            weechat.hook_signal_send("znc-playback-start",
                                     WEECHAT_HOOK_SIGNAL_STRING, buffer_name)
            debug("* buffer playback for %s", buffer_name)
            get_config_options()
            nick_talked.clear()
            buffer_playback.add(buffer)
        elif line == 'Playback Complete.':
            buffer_playback.remove(buffer)
            debug("* end of playback for %s", buffer_name)
            weechat.hook_signal_send("znc-playback-stop",
                                     WEECHAT_HOOK_SIGNAL_STRING, buffer_name)
        tags.discard('notify_message')
        tags.discard('irc_privmsg')
        prnt_date_tags(buffer, 0, ','.join(tags), string)
        return ''

    elif buffer not in buffer_playback:
        return string

    #debug(string)

    def strip_timestamp(s):
        words = znc_timestamp.count(' ') + 1
        p = 0
        for i in range(words):
            p = s[p:].find(' ') + p + 1
        return s[:p - 1], s[p:]

    prefix, s, line = string.partition('\t')
    if 'irc_action' in tags or 'irc_notice' in tags:
        _prefix, _, line = line.partition(' ')
        timestamp, line = strip_timestamp(line)
        line = '%s %s' % (_prefix, line)
    else:
        timestamp, line = strip_timestamp(line)

    try:
        t = time.strptime(timestamp, znc_timestamp)
    except ValueError as e:
        # bad time format.
        error(e)
        debug("Timestamp error: %s\n%s" % (modifier_data, string))
        return string
    else:
        if t[0] == 1900:
            # only hour information, complete year, month and day with today's date
            # might be incorrect though if day changed during playback.
            t = datetime.time(*t[3:6])
            d = datetime.datetime.combine(datetime.date.today(), t)
        else:
            d = datetime.datetime(*t[:6])
        time_epoch = int(time.mktime(d.timetuple()))

    if 'nick_*buffextras' not in tags:
        # not a line coming from ZNC buffextras module.
        nick_talked.add((buffer, weechat.string_remove_color(prefix, '')))
        prnt_date_tags(buffer, time_epoch, ','.join(tags),
                       "%s\t%s" % (prefix, line))
        return ''

    tags.discard('notify_message')
    tags.discard('irc_privmsg')
    tags.discard('nick_*buffextras')

    hostmask, s, line = line.partition(' ')
    nick = hostmask[:hostmask.find('!')]
    host = hostmask[len(nick) + 1:]
    server = weechat.buffer_get_string(buffer, 'localvar_server')
    channel = weechat.buffer_get_string(buffer, 'localvar_channel')

    s = None
    if line == 'joined':
        tags.add('irc_join')
        s = weechat.gettext("%s%s%s%s%s%s%s%s%s%s has joined %s%s%s")
        s = s % (
            weechat.prefix('join'),
            COLOR_CHAT_NICK,  # TODO there's a function for use nick's color
            nick,
            COLOR_CHAT_DELIMITERS,
            ' (',
            COLOR_CHAT_HOST,  # TODO host can be hidden in config
            host,
            COLOR_CHAT_DELIMITERS,
            ')',
            COLOR_MESSAGE_JOIN,
            COLOR_CHAT_CHANNEL,
            channel,
            COLOR_MESSAGE_JOIN)

        if send_signals:
            weechat.hook_signal_send(server + ",irc_in_JOIN",
                                     WEECHAT_HOOK_SIGNAL_STRING,
                                     ":%s JOIN :%s" % (hostmask, channel))

    elif line.startswith('parted with message:'):
        tags.add('irc_part')
        reason = line[line.find('[') + 1:-1]
        if reason:
            s = weechat.gettext(
                "%s%s%s%s%s%s%s%s%s%s has left %s%s%s %s(%s%s%s)")
            s = s % (weechat.prefix('quit'), COLOR_CHAT_NICK, nick,
                     COLOR_CHAT_DELIMITERS, ' (', COLOR_CHAT_HOST, host,
                     COLOR_CHAT_DELIMITERS, ')', COLOR_MESSAGE_QUIT,
                     COLOR_CHAT_CHANNEL, channel, COLOR_MESSAGE_QUIT,
                     COLOR_CHAT_DELIMITERS, COLOR_REASON_QUIT, reason,
                     COLOR_CHAT_DELIMITERS)

            if send_signals:
                weechat.hook_signal_send(
                    server + ",irc_in_PART", WEECHAT_HOOK_SIGNAL_STRING,
                    ":%s PART %s :%s" % (hostmask, channel, reason))
        else:
            s = weechat.gettext("%s%s%s%s%s%s%s%s%s%s has left %s%s%s")
            s = s % (weechat.prefix('quit'), COLOR_CHAT_NICK, nick,
                     COLOR_CHAT_DELIMITERS, ' (', COLOR_CHAT_HOST, host,
                     COLOR_CHAT_DELIMITERS, ')', COLOR_MESSAGE_QUIT,
                     COLOR_CHAT_CHANNEL, channel, COLOR_MESSAGE_QUIT)

            if send_signals:
                weechat.hook_signal_send(server + ",irc_in_PART",
                                         WEECHAT_HOOK_SIGNAL_STRING,
                                         ":%s PART %s" % (hostmask, channel))

    elif line.startswith('quit with message:'):
        tags.add('irc_quit')
        reason = line[line.find('[') + 1:-1]
        s = weechat.gettext("%s%s%s%s%s%s%s%s%s%s has quit %s(%s%s%s)")
        s = s % (weechat.prefix('quit'), COLOR_CHAT_NICK, nick,
                 COLOR_CHAT_DELIMITERS, ' (', COLOR_CHAT_HOST, host,
                 COLOR_CHAT_DELIMITERS, ')', COLOR_MESSAGE_QUIT,
                 COLOR_CHAT_DELIMITERS, COLOR_REASON_QUIT, reason,
                 COLOR_CHAT_DELIMITERS)

        # QUIT messages should be sent only once, but since there's
        # one quit per channel, use PART instead.
        if send_signals:
            if not reason:
                weechat.hook_signal_send(server + ",irc_in_PART",
                                         WEECHAT_HOOK_SIGNAL_STRING,
                                         ":%s PART %s" % (hostmask, channel))
            else:
                weechat.hook_signal_send(
                    server + ",irc_in_PART", WEECHAT_HOOK_SIGNAL_STRING,
                    ":%s PART %s :%s" % (hostmask, channel, reason))

    elif line.startswith('is now known as '):
        tags.add('irc_nick')
        new_nick = line.rpartition(' ')[-1]
        s = weechat.gettext("%s%s%s%s is now known as %s%s%s")
        s = s % (weechat.prefix('network'), COLOR_CHAT_NICK, nick, COLOR_CHAT,
                 COLOR_CHAT_NICK, new_nick, COLOR_CHAT)

        # NICK messages should be sent only once, but since there's one
        # per every channel, we fake it with a PART/JOIN
        if send_signals:
            new_hostmask = new_nick + hostmask[hostmask.find('!'):]
            weechat.hook_signal_send(server + ",irc_in_PART",
                                     WEECHAT_HOOK_SIGNAL_STRING,
                                     ":%s PART %s" % (hostmask, channel))
            weechat.hook_signal_send(server + ",irc_in_JOIN",
                                     WEECHAT_HOOK_SIGNAL_STRING,
                                     ":%s JOIN :%s" % (new_hostmask, channel))

    elif line.startswith('set mode: '):
        tags.add('irc_mode')
        modes = line[line.find(':') + 2:]
        s = weechat.gettext("%sMode %s%s %s[%s%s%s]%s by %s%s")
        s = s % (weechat.prefix('network'), COLOR_CHAT_CHANNEL, channel,
                 COLOR_CHAT_DELIMITERS, COLOR_CHAT, modes,
                 COLOR_CHAT_DELIMITERS, COLOR_CHAT, COLOR_CHAT_NICK, nick)

        if send_signals:
            # buffextras can send an invalid hostmask "nick!@" sometimes
            # fix it so at least is valid.
            if not is_hostmask(hostmask):
                nick = hostmask[:hostmask.find('!')]
                hostmask = nick + '!unknow@unknow'
            weechat.hook_signal_send(
                server + ",irc_in_MODE", WEECHAT_HOOK_SIGNAL_STRING,
                ":%s MODE %s %s" % (hostmask, channel, modes))

    elif line.startswith('kicked'):
        tags.add('irc_kick')
        _, nick_kicked, reason = line.split(None, 2)
        reason = reason[reason.find('[') + 1:-1]
        s = weechat.gettext("%s%s%s%s has kicked %s%s%s %s(%s%s%s)")
        s = s % (weechat.prefix('quit'), COLOR_CHAT_NICK, nick,
                 COLOR_MESSAGE_QUIT, COLOR_CHAT_NICK, nick_kicked,
                 COLOR_MESSAGE_QUIT, COLOR_CHAT_DELIMITERS, COLOR_CHAT, reason,
                 COLOR_CHAT_DELIMITERS)

        if send_signals:
            weechat.hook_signal_send(
                server + ",irc_in_KICK", WEECHAT_HOOK_SIGNAL_STRING,
                ":%s KICK %s %s :%s" %
                (hostmask, channel, nick_kicked, reason))

    elif line.startswith('changed the topic to: '):
        tags.add('irc_topic')
        topic = line[line.find(':') + 2:]
        s = weechat.gettext(
            "%s%s%s%s has changed topic for %s%s%s to \"%s%s\"")
        s = s % (weechat.prefix('network'), COLOR_CHAT_NICK, nick, COLOR_CHAT,
                 COLOR_CHAT_CHANNEL, channel, COLOR_CHAT, topic, COLOR_CHAT)

    # crude smart filter
    if SMART_FILTER and (buffer, nick) not in nick_talked \
            and ('irc_join' in tags \
                 or 'irc_part' in tags \
                 or 'irc_quit' in tags \
                 or 'irc_nick' in tags):
        tags.add('irc_smart_filter')

    if s is None:
        error('Unknown message from ZNC: %r' % string)
        return string
    else:
        prnt_date_tags(buffer, time_epoch, ','.join(tags), s)
        return ''