def hotlist_item_cb(data, item, window): priorities = {} titles = {} hdata_hotlist = w.hdata_get('hotlist') ptr_hotlist = w.hdata_get_list(hdata_hotlist, 'gui_hotlist') while ptr_hotlist: priority = w.hdata_integer(hdata_hotlist, ptr_hotlist, 'priority') buffer = w.hdata_pointer(hdata_hotlist, ptr_hotlist, 'buffer') count = w.hdata_integer( hdata_hotlist, ptr_hotlist, '%d|count' % GUI_HOTLIST_MESSAGE) number = w.buffer_get_integer(buffer, 'number') name = w.buffer_get_string(buffer, 'short_name') if priority != GUI_HOTLIST_LOW: priorities[number] = priority titles[number] = '%d:%s' % (number, name) if count: titles[number] += '(%d)' % count ptr_hotlist = w.hdata_move(hdata_hotlist, ptr_hotlist, 1) items = [] for number, priority in sorted(priorities.items()): items.append('%s %s %s' % ( w.color(COLORS[priority]), titles[number], w.color('reset'))) return ' '.join(items)
def count_lines(ptr_window,ptr_buffer): global filter_status hdata_buf = weechat.hdata_get('buffer') hdata_lines = weechat.hdata_get('lines') lines = weechat.hdata_pointer(hdata_buf, ptr_buffer, 'lines') # own_lines, mixed_lines lines_count = weechat.hdata_integer(hdata_lines, lines, 'lines_count') hdata_window = weechat.hdata_get('window') hdata_winscroll = weechat.hdata_get('window_scroll') window_scroll = weechat.hdata_pointer(hdata_window, ptr_window, 'scroll') lines_after = weechat.hdata_integer(hdata_winscroll, window_scroll, 'lines_after') window_height = weechat.window_get_integer(weechat.current_window(), 'win_chat_height') filtered = 0 filtered_before = 0 filtered_after = 0 # if filter is disabled, don't count. if (OPTIONS['count_filtered_lines'].lower() == 'off') and filter_status == 1: filtered, filtered_before,filtered_after = count_filtered_lines(ptr_buffer,lines_count,lines_after) lines_count = lines_count - filtered # lines_after = lines_after - filtered_after if lines_count > window_height: differential = lines_count - window_height percent = max(int(round(100. * (differential - lines_after) / differential)), 0) else: percent = 100 # get current position current_line = lines_count - lines_after return lines_after,lines_count,percent,current_line, filtered, filtered_before, filtered_after
def get_merged_buffers(ptr): """ Get a list of buffers which are merged with "ptr". """ hdata = weechat.hdata_get("buffer") buffers = weechat.hdata_get_list(hdata, "gui_buffers") buffer = weechat.hdata_search( hdata, buffers, "${buffer.number} == %i" % weechat.hdata_integer(hdata, ptr, "number"), 1) nbuffer = weechat.hdata_move(hdata, buffer, 1) ret = [] while buffer: ret.append(weechat.hdata_string(hdata, buffer, "full_name")) if (weechat.hdata_integer(hdata, buffer, "number") == weechat.hdata_integer( hdata, nbuffer, "number")): buffer = nbuffer nbuffer = weechat.hdata_move(hdata, nbuffer, 1) else: buffer = None return ret
def count_lines(ptr_window, ptr_buffer): global filter_status hdata_buf = weechat.hdata_get("buffer") hdata_lines = weechat.hdata_get("lines") lines = weechat.hdata_pointer(hdata_buf, ptr_buffer, "lines") # own_lines, mixed_lines lines_count = weechat.hdata_integer(hdata_lines, lines, "lines_count") hdata_window = weechat.hdata_get("window") hdata_winscroll = weechat.hdata_get("window_scroll") window_scroll = weechat.hdata_pointer(hdata_window, ptr_window, "scroll") lines_after = weechat.hdata_integer(hdata_winscroll, window_scroll, "lines_after") window_height = weechat.window_get_integer(weechat.current_window(), "win_chat_height") filtered = 0 filtered_before = 0 filtered_after = 0 # if filter is disabled, don't count. if (OPTIONS["count_filtered_lines"].lower() == "off") and filter_status == 1: filtered, filtered_before, filtered_after = count_filtered_lines(ptr_buffer, lines_count, lines_after) lines_count = lines_count - filtered # lines_after = lines_after - filtered_after if lines_count > window_height: differential = lines_count - window_height percent = max(int(round(100.0 * (differential - lines_after) / differential)), 0) else: percent = 100 # get current position current_line = lines_count - lines_after return lines_after, lines_count, percent, current_line, filtered, filtered_before, filtered_after
def count_lines(winpointer, bufpointer): hdata_buf = weechat.hdata_get('buffer') hdata_lines = weechat.hdata_get('lines') lines = weechat.hdata_pointer(hdata_buf, bufpointer, 'lines') # own_lines, mixed_lines lines_count = weechat.hdata_integer(hdata_lines, lines, 'lines_count') hdata_window = weechat.hdata_get('window') hdata_winscroll = weechat.hdata_get('window_scroll') window_scroll = weechat.hdata_pointer(hdata_window, winpointer, 'scroll') lines_after = weechat.hdata_integer(hdata_winscroll, window_scroll, 'lines_after') window_height = weechat.window_get_integer(weechat.current_window(), 'win_chat_height') if lines_count > window_height: differential = lines_count - window_height percent = max( int(round(100. * (differential - lines_after) / differential)), 0) else: percent = 100 #weechat.prnt('', " : lines_count "+str(lines_count)+" window_height "+str(window_height)+" lines after "+str(lines_after)) current_line = lines_count - lines_after return lines_after, lines_count, percent, current_line
def buffer_build_regex(buffer): """ Build a regex according to "buffer"'s search settings. """ hdata = weechat.hdata_get("buffer") input = weechat.hdata_string(hdata, buffer, "input_buffer") exact = weechat.hdata_integer(hdata, buffer, "text_search_exact") where = weechat.hdata_integer(hdata, buffer, "text_search_where") regex = weechat.hdata_integer(hdata, buffer, "text_search_regex") if not regex: input = re.escape(input) if exact: input = "(?-i)%s" % input filter_regex = None if where == 1: # message filter_regex = input elif where == 2: # prefix filter_regex = "%s\\t" % input else: # prefix | message filter_regex = input # TODO: impossible with current filter regex return "!%s" % filter_regex
def cb_exec_cmd(data, remaining_calls): """Translate and execute our custom commands to WeeChat command.""" # Process the entered command. data = list(data) del data[0] data = "".join(data) # s/foo/bar command. if data.startswith("s/"): cmd = data parsed_cmd = next(csv.reader(StringIO(cmd), delimiter="/", escapechar="\\")) pattern = re.escape(parsed_cmd[1]) repl = parsed_cmd[2] repl = re.sub(r"([^\\])&", r"\1" + pattern, repl) flag = None if len(parsed_cmd) == 4: flag = parsed_cmd[3] count = 1 if flag == "g": count = 0 buf = weechat.current_buffer() input_line = weechat.buffer_get_string(buf, "input") input_line = re.sub(pattern, repl, input_line, count) weechat.buffer_set(buf, "input", input_line) # Shell command. elif data.startswith("!"): weechat.command("", "/exec -buffer shell %s" % data[1:]) # Commands like `:22`. This should start cursor mode (``/cursor``) and take # us to the relevant line. # TODO: look into possible replacement key bindings for: ← ↑ → ↓ Q m q. elif data.isdigit(): line_number = int(data) hdata_window = weechat.hdata_get("window") window = weechat.current_window() x = weechat.hdata_integer(hdata_window, window, "win_chat_x") y = (weechat.hdata_integer(hdata_window, window, "win_chat_y") + (line_number - 1)) weechat.command("", "/cursor go {},{}".format(x, y)) # Check againt defined commands. else: data = data.split(" ", 1) cmd = data[0] args = "" if len(data) == 2: args = data[1] if cmd in VI_COMMANDS: weechat.command("", "%s %s" % (VI_COMMANDS[cmd], args)) # No vi commands defined, run the command as a WeeChat command. else: weechat.command("", "/{} {}".format(cmd, args)) return weechat.WEECHAT_RC_OK
def cb_exec_cmd(data, remaining_calls): """Translate and execute our custom commands to WeeChat command.""" # Process the entered command. data = list(data) del data[0] data = "".join(data) # s/foo/bar command. if data.startswith("s/"): cmd = data parsed_cmd = next( csv.reader(StringIO(cmd), delimiter="/", escapechar="\\")) pattern = re.escape(parsed_cmd[1]) repl = parsed_cmd[2] repl = re.sub(r"([^\\])&", r"\1" + pattern, repl) flag = None if len(parsed_cmd) == 4: flag = parsed_cmd[3] count = 1 if flag == "g": count = 0 buf = weechat.current_buffer() input_line = weechat.buffer_get_string(buf, "input") input_line = re.sub(pattern, repl, input_line, count) weechat.buffer_set(buf, "input", input_line) # Shell command. elif data.startswith("!"): weechat.command("", "/exec -buffer shell %s" % data[1:]) # Commands like `:22`. This should start cursor mode (``/cursor``) and take # us to the relevant line. # TODO: look into possible replacement key bindings for: ← ↑ → ↓ Q m q. elif data.isdigit(): line_number = int(data) hdata_window = weechat.hdata_get("window") window = weechat.current_window() x = weechat.hdata_integer(hdata_window, window, "win_chat_x") y = (weechat.hdata_integer(hdata_window, window, "win_chat_y") + (line_number - 1)) weechat.command("", "/cursor go {},{}".format(x, y)) # Check againt defined commands. else: data = data.split(" ", 1) cmd = data[0] args = "" if len(data) == 2: args = data[1] if cmd in VI_COMMANDS: weechat.command("", "%s %s" % (VI_COMMANDS[cmd], args)) # No vi commands defined, run the command as a WeeChat command. else: weechat.command("", "/{} {}".format(cmd, args)) return weechat.WEECHAT_RC_OK
def buffer_update(buffer): """ Refresh filtering in "buffer" by updating (or removing) the filter and update the bar item. """ hdata = weechat.hdata_get("buffer") buffers = ",".join(get_merged_buffers(buffer)) name = "%s_%s" % (SCRIPT_NAME, buffers) if buffer_searching(buffer): if buffer_filtering(buffer): filter_addreplace(name, buffers, "*", buffer_build_regex(buffer)) elif not buffer_filtering(buffer) and filter_exists(name): filter_del(name) elif filter_exists(name): filter_del(name) where = weechat.hdata_integer(hdata, buffer, "text_search_where") weechat.buffer_set( buffer, "localvar_set_%s_warn" % SCRIPT_LOCALVAR, "1" if where == 3 else "0", ) # warn about incorrect filter weechat.bar_item_update(SCRIPT_BAR_ITEM)
def fill_last_lines(buffer): last_lines.append(get_input_line(buffer, -1)) hdata = w.hdata_get("buffer") lines = w.hdata_pointer(hdata, buffer, "own_lines") found = 0 processed = 0 lines_limit = int(w.config_get_plugin("lines")) raw_lines_limit = int(w.config_get_plugin("raw_lines")) line = w.hdata_pointer(w.hdata_get('lines'), lines, "last_line") while found < lines_limit and processed < raw_lines_limit and line != "": line_data = w.hdata_pointer(w.hdata_get('line'), line, "data") count = w.hdata_integer(w.hdata_get("line_data"), line_data, "tags_count") if count == 0: processed += 1 continue tag = w.hdata_string(w.hdata_get('line_data'), line_data, "0|tags_array") if tag == 'irc_privmsg': message = w.hdata_string(w.hdata_get('line_data'), line_data, "message") last_lines.append(message) found += 1 line = w.hdata_pointer(w.hdata_get('line'), line, "prev_line") processed += 1 last_lines.append(get_input_line(buffer, 1))
def get_last_message_time(buffer): lines = weechat.hdata_pointer(weechat.hdata_get("buffer"), buffer, "own_lines") line = weechat.hdata_pointer(weechat.hdata_get("lines"), lines, "last_line") while line: line_data = weechat.hdata_pointer(weechat.hdata_get("line"), line, "data") tags_count = weechat.hdata_integer(weechat.hdata_get("line_data"), line_data, "tags_count") tags = [ weechat.hdata_string(weechat.hdata_get("line_data"), line_data, "{}|tags_array".format(i)) for i in range(tags_count) ] irc_tags = [t for t in tags if t.startswith("irc_")] if len(irc_tags) > 0: break line = weechat.hdata_pointer(weechat.hdata_get("line"), line, "prev_line") if not line: return None # TODO: get timestamp with millisecond granularity ts = weechat.hdata_time(weechat.hdata_get("line_data"), line_data, "date") t = datetime.datetime.fromtimestamp(ts, tz=datetime.timezone.utc) return t
def buffer_searching(buffer): """ Check whether "buffer" is in search mode. """ hdata = weechat.hdata_get("buffer") return bool(weechat.hdata_integer(hdata, buffer, "text_search"))
def hdata_server(server_to_search): hdata = weechat.hdata_get('irc_server') hdata_servers = weechat.hdata_get_list(hdata,'irc_servers') server = weechat.hdata_search(hdata, hdata_servers,'${irc_server.name} =* %s' % server_to_search, 1) if server: is_connected = weechat.hdata_integer(hdata, server, 'is_connected') nick_modes = weechat.hdata_string(hdata, server, 'nick_modes') buffer_ptr = weechat.hdata_pointer(hdata, server, 'buffer') return
def hdata_server(server_to_search): hdata = weechat.hdata_get('irc_server') hdata_servers = weechat.hdata_get_list(hdata, 'irc_servers') server = weechat.hdata_search( hdata, hdata_servers, '${irc_server.name} =* %s' % server_to_search, 1) if server: is_connected = weechat.hdata_integer(hdata, server, 'is_connected') nick_modes = weechat.hdata_string(hdata, server, 'nick_modes') buffer_ptr = weechat.hdata_pointer(hdata, server, 'buffer') return
def get_merged_buffers(ptr): """ Get a list of buffers which are merged with "ptr". """ weechat_version = int(weechat.info_get("version_number", "") or 0) hdata = weechat.hdata_get("buffer") buffers = weechat.hdata_get_list(hdata, "gui_buffers") if weechat_version >= 0x03040000: buffer = weechat.hdata_search( hdata, buffers, "${buffer.number} == ${value}", {}, {"value": str(weechat.hdata_integer(hdata, ptr, "number"))}, {}, 1, ) else: buffer = weechat.hdata_search( hdata, buffers, "${buffer.number} == %i" % weechat.hdata_integer(hdata, ptr, "number"), 1, ) nbuffer = weechat.hdata_move(hdata, buffer, 1) ret = [] while buffer: ret.append(weechat.hdata_string(hdata, buffer, "full_name")) if weechat.hdata_integer(hdata, buffer, "number") == weechat.hdata_integer( hdata, nbuffer, "number"): buffer = nbuffer nbuffer = weechat.hdata_move(hdata, nbuffer, 1) else: buffer = None return ret
def get_buffers(): ''' Get a list of all the buffers in weechat. ''' hdata = weechat.hdata_get('buffer') buffer = weechat.hdata_get_list(hdata, "gui_buffers"); result = [] while buffer: number = weechat.hdata_integer(hdata, buffer, 'number') result.append((number, buffer)) buffer = weechat.hdata_pointer(hdata, buffer, 'next_buffer') return hdata, result
def count_lines(ptr_window, ptr_buffer): global filter_status hdata_buf = weechat.hdata_get('buffer') hdata_lines = weechat.hdata_get('lines') lines = weechat.hdata_pointer(hdata_buf, ptr_buffer, 'lines') # own_lines, mixed_lines lines_count = weechat.hdata_integer(hdata_lines, lines, 'lines_count') hdata_window = weechat.hdata_get('window') hdata_winscroll = weechat.hdata_get('window_scroll') window_scroll = weechat.hdata_pointer(hdata_window, ptr_window, 'scroll') lines_after = weechat.hdata_integer(hdata_winscroll, window_scroll, 'lines_after') window_height = weechat.window_get_integer(weechat.current_window(), 'win_chat_height') filtered = 0 filtered_before = 0 filtered_after = 0 # if filter is disabled, don't count. if (OPTIONS['count_filtered_lines'].lower() == 'off') and filter_status == 1: filtered, filtered_before, filtered_after = count_filtered_lines( ptr_buffer, lines_count, lines_after) lines_count = lines_count - filtered # lines_after = lines_after - filtered_after if lines_count > window_height: differential = lines_count - window_height percent = max( int(round(100. * (differential - lines_after) / differential)), 0) else: percent = 100 # get current position current_line = lines_count - lines_after return lines_after, lines_count, percent, current_line, filtered, filtered_before, filtered_after
def get_merged_buffers(ptr): """ Get a list of buffers which are merged with "ptr". """ hdata = weechat.hdata_get("buffer") buffers = weechat.hdata_get_list(hdata, "gui_buffers") buffer = weechat.hdata_search(hdata, buffers, "${buffer.number} == %i" % weechat.hdata_integer(hdata, ptr, "number"), 1) nbuffer = weechat.hdata_move(hdata, buffer, 1) ret = [] while buffer: ret.append(weechat.hdata_string(hdata, buffer, "full_name")) if (weechat.hdata_integer(hdata, buffer, "number") == weechat.hdata_integer(hdata, nbuffer, "number")): buffer = nbuffer nbuffer = weechat.hdata_move(hdata, nbuffer, 1) else: buffer = None return ret
def count_lines(winpointer, bufpointer): hdata_buf = weechat.hdata_get("buffer") hdata_lines = weechat.hdata_get("lines") lines = weechat.hdata_pointer(hdata_buf, bufpointer, "lines") # own_lines, mixed_lines lines_count = weechat.hdata_integer(hdata_lines, lines, "lines_count") hdata_window = weechat.hdata_get("window") hdata_winscroll = weechat.hdata_get("window_scroll") window_scroll = weechat.hdata_pointer(hdata_window, winpointer, "scroll") lines_after = weechat.hdata_integer(hdata_winscroll, window_scroll, "lines_after") window_height = weechat.window_get_integer(weechat.current_window(), "win_chat_height") if lines_count > window_height: differential = lines_count - window_height percent = max(int(round(100.0 * (differential - lines_after) / differential)), 0) else: percent = 100 # weechat.prnt('', " : lines_count "+str(lines_count)+" window_height "+str(window_height)+" lines after "+str(lines_after)) current_line = lines_count - lines_after return lines_after, lines_count, percent, current_line
def buffer_update(buffer): """ Refresh filtering in "buffer" by updating (or removing) the filter and update the bar item. """ hdata = weechat.hdata_get("buffer") buffers = ",".join(get_merged_buffers(buffer)) name = "%s_%s" % (SCRIPT_NAME, buffers) if buffer_searching(buffer): if buffer_filtering(buffer): filter_addreplace(name, buffers, "*", buffer_build_regex(buffer)) elif not buffer_filtering(buffer) and filter_exists(name): filter_del(name) elif filter_exists(name): filter_del(name) where = weechat.hdata_integer(hdata, buffer, "text_search_where") weechat.buffer_set(buffer, "localvar_set_%s_warn" % SCRIPT_LOCALVAR, "1" if where == 3 else "0") # warn about incorrect filter weechat.bar_item_update(SCRIPT_BAR_ITEM)
def buffer_open_full_name_irc_cb(data, signal, hashtable): full_name = hashtable["full_name"] noswitch = bool(int(hashtable.get("noswitch", "0"))) m = IRC_SERVER_RE.match(full_name) if m: server = m.group(1) irc_server_open(server, noswitch) return weechat.WEECHAT_RC_OK_EAT m = IRC_BUFFER_RE.match(full_name) if m: server = m.group(1) name = m.group(2) hdata_irc_server = weechat.hdata_get("irc_server") irc_servers = weechat.hdata_get_list(hdata_irc_server, "irc_servers") irc_server = weechat.hdata_search(hdata_irc_server, irc_servers, "${irc_server.name} == " + server, 1) if irc_server: is_connected = bool( weechat.hdata_integer(hdata_irc_server, irc_server, "is_connected")) is_connecting = bool( weechat.hdata_pointer(hdata_irc_server, irc_server, "hook_connect")) if is_connected: irc_buffer_open(server, name, noswitch) else: irc_server_connected_opens[server].add((name, noswitch)) if not is_connecting: irc_server_open(server, noswitch) else: error("unknown server {}".format(server)) return weechat.WEECHAT_RC_OK_EAT return weechat.WEECHAT_RC_OK
def build_list(data, item, window): # Setup variables # First retrieve the `hdata`s, then get relevant lists buffer_hdata = weechat.hdata_get('buffer') server_hdata = weechat.hdata_get('irc_server') hotlist_hdata = weechat.hdata_get('hotlist') buffer_pointer = weechat.hdata_get_list(buffer_hdata, 'gui_buffers') server_pointer = weechat.hdata_get_list(server_hdata, 'irc_servers') bar_width = weechat.config_integer( weechat.config_get('weechat.bar.buffers.size')) buflist = '' # Start looping through the buffers while buffer_pointer: # Grab the hotlist and priority level for the current buffer hotlist_pointer = weechat.hdata_pointer(buffer_hdata, buffer_pointer, "hotlist") if hotlist_pointer: priority = weechat.hdata_integer(hotlist_hdata, hotlist_pointer, 'priority') else: priority = 0 # Setup the info variables for the current buffer nick = weechat.buffer_get_string(buffer_pointer, "localvar_nick") name = weechat.buffer_get_string(buffer_pointer, "short_name") full_name = weechat.buffer_get_string(buffer_pointer, "name") plugin = weechat.buffer_get_string(buffer_pointer, "plugin") buffer_type = weechat.buffer_get_string(buffer_pointer, "localvar_type") server = weechat.buffer_get_string(buffer_pointer, 'localvar_server') icon_color = weechat.buffer_get_string(buffer_pointer, "localvar_icon_color") or 0 current_buffer = 1 if weechat.current_buffer() == buffer_pointer else 0 # Setup info variables for next buffer next_pointer = weechat.hdata_move(buffer_hdata, buffer_pointer, 1) next_type = weechat.buffer_get_string(next_pointer, "plugin") # Start building! # Draw icons for non-IRC buffers - core, script, fset, etc # You can set an `icon_color` localvar to override the `color.icon` option for a particular buffer when it's active # This isn't exactly ideal. Another option would be to use a localvar for each buffer that gets an icon, and then do a check for that if plugin != 'irc': if current_buffer: if icon_color: buflist += weechat.color(icon_color) else: buflist += weechat.color(option_values['color.icon']) else: buflist += weechat.color(option_values['color.default_fg']) buflist += "● " buflist += weechat.color(option_values['color.default_fg']) # Add a newline if the next buffer is the start of IRC buffers if next_type == 'irc': buflist += '\n' # Start adding other buffers else: # Add separator between servers if option_values[ 'look.server_separator'] == '1' and buffer_type == 'server': buflist += '─' * bar_width + '\n' # Print the appropriate color for the current buffer, as well as an icon for the current buffer if current_buffer: buflist += weechat.color(option_values['color.current_fg']) buflist += "●" elif priority == 1: buflist += weechat.color( option_values['color.hotlist_message']) elif priority == 2: buflist += weechat.color( option_values['color.hotlist_private']) elif priority == 3: buflist += weechat.color( option_values['color.hotlist_highlight']) else: buflist += weechat.color(option_values['color.default_fg']) # Spacing between icon and name if current_buffer: buflist += ' ' else: buflist += ' ' if buffer_type != 'server': buflist += ' ' if buffer_type == 'private': buflist += ' ' # Add the nick prefix (@, +, etc) nick_prefix = get_nick_prefix(buffer_pointer) buflist += nick_prefix # Add the buffer name buflist += name # Add nick modes next to server buffers, if any are set if buffer_type == 'server': # Search for and retrieve a pointer for the server pointer = weechat.hdata_search( server_hdata, server_pointer, '${irc_server.name} == ' + server, 1) # Then get the nick modes for that server nick_modes = weechat.hdata_string(server_hdata, pointer, 'nick_modes') if nick_modes: buflist += ' (+{})'.format(nick_modes) # Add the newline after each buffer buflist += '\n' # Move to the next buffer buffer_pointer = weechat.hdata_move(buffer_hdata, buffer_pointer, 1) # All done. Return the list return buflist