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
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]))
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
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
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
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
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
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
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]))
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
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
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
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
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
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
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()
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
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))
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))
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
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]
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
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
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
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
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", "")
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)
def force_redraw(): wc.hook_signal_send("input_text_changed", \ wc.WEECHAT_HOOK_SIGNAL_STRING, "")
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
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, ')',
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)
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))
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
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))
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 ''