From 46c10934d99ca5b6c7281f9d4d9cb9fe4aa9d6f9 Mon Sep 17 00:00:00 2001 From: Ryan Date: Mon, 15 May 2017 15:15:14 +0200 Subject: [PATCH] weechat config --- weechat/.weechat/alias.conf | 48 + weechat/.weechat/aspell.conf | 27 + weechat/.weechat/buffers.conf | 80 + weechat/.weechat/charset.conf | 18 + weechat/.weechat/colorize_nicks.conf | 19 + weechat/.weechat/exec.conf | 18 + weechat/.weechat/fifo.conf | 14 + weechat/.weechat/logger.conf | 33 + weechat/.weechat/perl/autoload/buffers.pl | 1 + weechat/.weechat/perl/autoload/highmon.pl | 1 + weechat/.weechat/perl/buffers.pl | 1821 +++++++++++++++++ weechat/.weechat/perl/highmon.pl | 1139 +++++++++++ weechat/.weechat/plugins.conf | 58 + .../python/autoload/buffer_autoclose.py | 1 + .../python/autoload/colorize_nicks.py | 1 + weechat/.weechat/python/autoload/go.py | 1 + weechat/.weechat/python/autoload/urlgrab.py | 1 + weechat/.weechat/python/buffer_autoclose.py | 130 ++ weechat/.weechat/python/colorize_nicks.py | 355 ++++ weechat/.weechat/python/go.py | 561 +++++ weechat/.weechat/python/urlgrab.py | 687 +++++++ weechat/.weechat/relay.conf | 48 + weechat/.weechat/script.conf | 57 + weechat/.weechat/sec.conf | 18 + weechat/.weechat/trigger.conf | 67 + weechat/.weechat/urlgrab.conf | 29 + weechat/.weechat/urls.log | 343 ++++ weechat/.weechat/xfer.conf | 46 + 28 files changed, 5622 insertions(+) create mode 100644 weechat/.weechat/alias.conf create mode 100644 weechat/.weechat/aspell.conf create mode 100644 weechat/.weechat/buffers.conf create mode 100644 weechat/.weechat/charset.conf create mode 100644 weechat/.weechat/colorize_nicks.conf create mode 100644 weechat/.weechat/exec.conf create mode 100644 weechat/.weechat/fifo.conf create mode 100644 weechat/.weechat/logger.conf create mode 120000 weechat/.weechat/perl/autoload/buffers.pl create mode 120000 weechat/.weechat/perl/autoload/highmon.pl create mode 100644 weechat/.weechat/perl/buffers.pl create mode 100644 weechat/.weechat/perl/highmon.pl create mode 100644 weechat/.weechat/plugins.conf create mode 120000 weechat/.weechat/python/autoload/buffer_autoclose.py create mode 120000 weechat/.weechat/python/autoload/colorize_nicks.py create mode 120000 weechat/.weechat/python/autoload/go.py create mode 120000 weechat/.weechat/python/autoload/urlgrab.py create mode 100644 weechat/.weechat/python/buffer_autoclose.py create mode 100644 weechat/.weechat/python/colorize_nicks.py create mode 100644 weechat/.weechat/python/go.py create mode 100644 weechat/.weechat/python/urlgrab.py create mode 100644 weechat/.weechat/relay.conf create mode 100644 weechat/.weechat/script.conf create mode 100644 weechat/.weechat/sec.conf create mode 100644 weechat/.weechat/trigger.conf create mode 100644 weechat/.weechat/urlgrab.conf create mode 100644 weechat/.weechat/urls.log create mode 100644 weechat/.weechat/xfer.conf diff --git a/weechat/.weechat/alias.conf b/weechat/.weechat/alias.conf new file mode 100644 index 0000000..d993aa0 --- /dev/null +++ b/weechat/.weechat/alias.conf @@ -0,0 +1,48 @@ +# +# weechat -- alias.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use /set or similar command to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[cmd] +AAWAY = "allserv /away" +AME = "allchan /me" +AMSG = "allchan /msg *" +ANICK = "allserv /nick" +BEEP = "print -beep" +BYE = "quit" +C = "buffer clear" +CHAT = "dcc chat" +CL = "buffer clear" +CLOSE = "buffer close" +EXIT = "quit" +IG = "ignore" +J = "join" +K = "kick" +KB = "kickban" +LEAVE = "part" +M = "msg" +MSGBUF = "command -buffer $1 * /input send $2-" +MUB = "unban *" +N = "names" +Q = "query" +REDRAW = "window refresh" +SAY = "msg *" +SIGNOFF = "quit" +T = "topic" +UB = "unban" +UMODE = "mode $nick" +V = "command core version" +W = "who" +WC = "window merge" +WI = "whois" +WII = "whois $1 $1" +WW = "whowas" + +[completion] +MSGBUF = "%(buffers_plugins_names)" diff --git a/weechat/.weechat/aspell.conf b/weechat/.weechat/aspell.conf new file mode 100644 index 0000000..5b2a417 --- /dev/null +++ b/weechat/.weechat/aspell.conf @@ -0,0 +1,27 @@ +# +# weechat -- aspell.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use /set or similar command to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[color] +misspelled = lightred +suggestions = default + +[check] +commands = "ame,amsg,away,command,cycle,kick,kickban,me,msg,notice,part,query,quit,topic" +default_dict = "" +during_search = off +enabled = off +real_time = off +suggestions = -1 +word_min_length = 2 + +[dict] + +[option] diff --git a/weechat/.weechat/buffers.conf b/weechat/.weechat/buffers.conf new file mode 100644 index 0000000..543f3ce --- /dev/null +++ b/weechat/.weechat/buffers.conf @@ -0,0 +1,80 @@ +# +# weechat -- buffers.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use /set or similar command to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[color] +current_bg = red +current_fg = lightcyan +default_bg = default +default_fg = default +hotlist_highlight_bg = default +hotlist_highlight_fg = magenta +hotlist_low_bg = default +hotlist_low_fg = white +hotlist_message_bg = default +hotlist_message_fg = 7 +hotlist_private_bg = default +hotlist_private_fg = lightgreen +none_channel_bg = default +none_channel_fg = default +number = lightgreen +number_char = lightgreen +prefix_bufname = default +queries_default_bg = default +queries_default_fg = default +queries_highlight_bg = default +queries_highlight_fg = default +queries_message_bg = default +queries_message_fg = default +suffix_bufname = default +whitelist_default_bg = default +whitelist_default_fg = default +whitelist_highlight_bg = default +whitelist_highlight_fg = default +whitelist_low_bg = default +whitelist_low_fg = default +whitelist_message_bg = default +whitelist_message_fg = default +whitelist_private_bg = default +whitelist_private_fg = default + +[look] +core_to_front = off +detach = 600 +detach_buffer_immediately = "" +detach_buffer_immediately_level = 2 +detach_display_window_number = off +detach_displayed_buffers = on +detach_free_content = off +detach_query = off +hide_merged_buffers = server +hotlist_counter = off +immune_detach_buffers = "" +indenting = off +indenting_amount = 2 +indenting_number = on +jump_prev_next_visited_buffer = off +mark_inactive = off +mouse_move_buffer = on +mouse_wheel = on +name_crop_suffix = "+" +name_size_max = 0 +number_char = "." +prefix = off +prefix_bufname = "" +prefix_empty = on +prefix_for_query = "" +short_names = on +show_lag = off +show_number = on +sort = number +suffix_bufname = "" +toggle_bar = on +whitelist_buffers = "" diff --git a/weechat/.weechat/charset.conf b/weechat/.weechat/charset.conf new file mode 100644 index 0000000..00d304c --- /dev/null +++ b/weechat/.weechat/charset.conf @@ -0,0 +1,18 @@ +# +# weechat -- charset.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use /set or similar command to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[default] +decode = "iso-8859-1" +encode = "" + +[decode] + +[encode] diff --git a/weechat/.weechat/colorize_nicks.conf b/weechat/.weechat/colorize_nicks.conf new file mode 100644 index 0000000..6c88017 --- /dev/null +++ b/weechat/.weechat/colorize_nicks.conf @@ -0,0 +1,19 @@ +# +# weechat -- colorize_nicks.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use /set or similar command to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[look] +blacklist_channels = "" +blacklist_nicks = "so,root" +colorize_input = off +greedy_matching = on +ignore_nicks_in_urls = off +ignore_tags = "" +min_nick_length = 2 diff --git a/weechat/.weechat/exec.conf b/weechat/.weechat/exec.conf new file mode 100644 index 0000000..519ccc1 --- /dev/null +++ b/weechat/.weechat/exec.conf @@ -0,0 +1,18 @@ +# +# weechat -- exec.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use /set or similar command to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[command] +default_options = "" +purge_delay = 0 + +[color] +flag_finished = lightred +flag_running = lightgreen diff --git a/weechat/.weechat/fifo.conf b/weechat/.weechat/fifo.conf new file mode 100644 index 0000000..904985d --- /dev/null +++ b/weechat/.weechat/fifo.conf @@ -0,0 +1,14 @@ +# +# weechat -- fifo.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use /set or similar command to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[file] +enabled = on +path = "%h/weechat_fifo" diff --git a/weechat/.weechat/logger.conf b/weechat/.weechat/logger.conf new file mode 100644 index 0000000..09b543e --- /dev/null +++ b/weechat/.weechat/logger.conf @@ -0,0 +1,33 @@ +# +# weechat -- logger.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use /set or similar command to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[look] +backlog = 20 + +[color] +backlog_end = default +backlog_line = default + +[file] +auto_log = on +flush_delay = 120 +info_lines = off +mask = "$plugin.$name.weechatlog" +name_lower_case = on +nick_prefix = "" +nick_suffix = "" +path = "%h/logs/" +replacement_char = "_" +time_format = "%Y-%m-%d %H:%M:%S" + +[level] + +[mask] diff --git a/weechat/.weechat/perl/autoload/buffers.pl b/weechat/.weechat/perl/autoload/buffers.pl new file mode 120000 index 0000000..445dc3c --- /dev/null +++ b/weechat/.weechat/perl/autoload/buffers.pl @@ -0,0 +1 @@ +../buffers.pl \ No newline at end of file diff --git a/weechat/.weechat/perl/autoload/highmon.pl b/weechat/.weechat/perl/autoload/highmon.pl new file mode 120000 index 0000000..2eb5e1e --- /dev/null +++ b/weechat/.weechat/perl/autoload/highmon.pl @@ -0,0 +1 @@ +../highmon.pl \ No newline at end of file diff --git a/weechat/.weechat/perl/buffers.pl b/weechat/.weechat/perl/buffers.pl new file mode 100644 index 0000000..46e2460 --- /dev/null +++ b/weechat/.weechat/perl/buffers.pl @@ -0,0 +1,1821 @@ +# +# Copyright (C) 2008-2014 Sebastien Helleu +# Copyright (C) 2011-2013 Nils G +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# +# Display sidebar with list of buffers. +# +# History: +# +# 2017-03-17, arza : +# v5.6: fix truncating buffer names that contain multibyte characters +# 2017-02-21, arza : +# v5.5: fix memory leak in perl 5.23.7-5.24.1 +# fix truncation and crop_suffix when truncating to 1-4 characters +# fix prefix_empty for inactive buffers +# tidy code +# 2016-05-01, mumixam : +# v5.4: add option "detach_buffer_immediately_level" +# 2015-08-21, Matthew Cox +# v5.3: add option "indenting_amount", to adjust the indenting of channel buffers +# 2015-05-02, arza : +# v5.2: truncate long names (name_size_max) more when mark_inactive adds parenthesis +# 2015-03-29, Ed Santiago : +# v5.1: merged buffers: always indent, except when filling is horizontal +# 2014-12-12, oakkitten +# v5.0: fix cropping non-latin buffer names +# 2014-08-29, Patrick Steinhardt : +# v4.9: add support for specifying custom buffer names +# 2014-07-19, Sebastien Helleu : +# v4.8: add support of ctrl + mouse wheel to jump to previous/next buffer, +# new option "mouse_wheel" +# 2014-06-22, Sebastien Helleu : +# v4.7: fix typos in options +# 2014-04-05, Sebastien Helleu : +# v4.6: add support of hidden buffers (WeeChat >= 0.4.4) +# 2014-01-01, Sebastien Helleu : +# v4.5: add option "mouse_move_buffer" +# 2013-12-11, Sebastien Helleu : +# v4.4: fix buffer number on drag to the end of list when option +# weechat.look.buffer_auto_renumber is off +# 2013-12-10, nils_2@freenode.#weechat: +# v4.3: add options "prefix_bufname" and "suffix_bufname (idea by silverd) +# fix hook_timer() for show_lag wasn't disabled +# improve signal handling (less updating of buffers list) +# 2013-11-07, Sebastien Helleu : +# v4.2: use default filling "columns_vertical" when bar position is top/bottom +# 2013-10-31, nils_2@freenode.#weechat: +# v4.1: add option "detach_buffer_immediately" (idea by farn) +# 2013-10-20, nils_2@freenode.#weechat: +# v4.0: add options "detach_displayed_buffers", "detach_display_window_number" +# 2013-09-27, nils_2@freenode.#weechat: +# v3.9: add option "toggle_bar" and option "show_prefix_query" (idea by IvarB) +# fix problem with linefeed at end of list of buffers (reported by grawity) +# 2012-10-18, nils_2@freenode.#weechat: +# v3.8: add option "mark_inactive", to mark buffers you are not in (idea by xrdodrx) +# add wildcard "*" for immune_detach_buffers (idea by StarWeaver) +# add new options "detach_query" and "detach_free_content" (idea by StarWeaver) +# 2012-10-06, Nei : +# v3.7: call menu on right mouse if menu script is loaded. +# 2012-10-06, nils_2 : +# v3.6: add new option "hotlist_counter" (idea by torque). +# 2012-06-02, nils_2 : +# v3.5: add values "server|channel|private|all|keepserver|none" to option "hide_merged_buffers" (suggested by dominikh). +# 2012-05-25, nils_2 : +# v3.4: add new option "show_lag". +# 2012-04-07, Sebastien Helleu : +# v3.3: fix truncation of wide chars in buffer name (option name_size_max) (bug #36034) +# 2012-03-15, nils_2 : +# v3.2: add new option "detach"(weechat >= 0.3.8) +# add new option "immune_detach_buffers" (requested by Mkaysi) +# add new function buffers_whitelist add|del|reset (suggested by FiXato) +# add new function buffers_detach add|del|reset +# 2012-03-09, Sebastien Helleu : +# v3.1: fix reload of config file +# 2012-01-29, nils_2 : +# v3.0: fix: buffers did not update directly during window_switch (reported by FiXato) +# 2012-01-29, nils_2 : +# v2.9: add options "name_size_max" and "name_crop_suffix" +# 2012-01-08, nils_2 : +# v2.8: fix indenting for option "show_number off" +# fix unset of buffer activity in hotlist when buffer was moved with mouse +# add buffer with free content and core buffer sorted first (suggested by nyuszika7h) +# add options queries_default_fg/bg and queries_message_fg/bg (suggested by FiXato) +# add clicking with left button on current buffer will do a jump_previously_visited_buffer (suggested by FiXato) +# add clicking with right button on current buffer will do a jump_next_visited_buffer +# add additional informations in help texts +# add default_fg and default_bg for whitelist channels +# internal changes (script is now 3Kb smaller) +# 2012-01-04, Sebastien Helleu : +# v2.7: fix regex lookup in whitelist buffers list +# 2011-12-04, nils_2 : +# v2.6: add own config file (buffers.conf) +# add new behavior for indenting (under_name) +# add new option to set different color for server buffers and buffers with free content +# 2011-10-30, nils_2 : +# v2.5: add new options "show_number_char" and "color_number_char", +# add help-description for options +# 2011-08-24, Sebastien Helleu : +# v2.4: add mouse support +# 2011-06-06, nils_2 : +# v2.3: add missing option "color_whitelist_default" +# 2011-03-23, Sebastien Helleu : +# v2.2: fix color of nick prefix with WeeChat >= 0.3.5 +# 2011-02-13, nils_2 : +# v2.1: add options "color_whitelist_*" +# 2010-10-05, Sebastien Helleu : +# v2.0: add options "sort" and "show_number" +# 2010-04-12, Sebastien Helleu : +# v1.9: replace call to log() by length() to align buffer numbers +# 2010-04-02, Sebastien Helleu : +# v1.8: fix bug with background color and option indenting_number +# 2010-04-02, Helios : +# v1.7: add indenting_number option +# 2010-02-25, m4v : +# v1.6: add option to hide empty prefixes +# 2010-02-12, Sebastien Helleu : +# v1.5: add optional nick prefix for buffers like IRC channels +# 2009-09-30, Sebastien Helleu : +# v1.4: remove spaces for indenting when bar position is top/bottom +# 2009-06-14, Sebastien Helleu : +# v1.3: add option "hide_merged_buffers" +# 2009-06-14, Sebastien Helleu : +# v1.2: improve display with merged buffers +# 2009-05-02, Sebastien Helleu : +# v1.1: sync with last API changes +# 2009-02-21, Sebastien Helleu : +# v1.0: remove timer used to update bar item first time (not needed any more) +# 2009-02-17, Sebastien Helleu : +# v0.9: fix bug with indenting of private buffers +# 2009-01-04, Sebastien Helleu : +# v0.8: update syntax for command /set (comments) +# 2008-10-20, Jiri Golembiovsky : +# v0.7: add indenting option +# 2008-10-01, Sebastien Helleu : +# v0.6: add default color for buffers, and color for current active buffer +# 2008-09-18, Sebastien Helleu : +# v0.5: fix color for "low" level entry in hotlist +# 2008-09-18, Sebastien Helleu : +# v0.4: rename option "show_category" to "short_names", +# remove option "color_slash" +# 2008-09-15, Sebastien Helleu : +# v0.3: fix bug with priority in hotlist (var not defined) +# 2008-09-02, Sebastien Helleu : +# v0.2: add color for buffers with activity and config options for +# colors, add config option to display/hide categories +# 2008-03-15, Sebastien Helleu : +# v0.1: script creation +# +# Help about settings: +# display all settings for script (or use iset.pl script to change settings): +# /set buffers* +# show help text for option buffers.look.whitelist_buffers: +# /help buffers.look.whitelist_buffers +# +# Mouse-support (standard key bindings): +# left mouse-button: +# - click on a buffer to switch to selected buffer +# - click on current buffer will do action jump_previously_visited_buffer +# - drag a buffer and drop it on another position will move the buffer to position +# right mouse-button: +# - click on current buffer will do action jump_next_visited_buffer +# - moving buffer to the left/right will close buffer. +# + +use strict; +use Encode qw( decode encode ); +# -----------------------------[ internal ]------------------------------------- +my $SCRIPT_NAME = "buffers"; +my $SCRIPT_VERSION = "5.6"; + +my $BUFFERS_CONFIG_FILE_NAME = "buffers"; +my $buffers_config_file; +my $cmd_buffers_whitelist= "buffers_whitelist"; +my $cmd_buffers_detach = "buffers_detach"; + +my %mouse_keys = ("\@item(buffers):button1*" => "hsignal:buffers_mouse", + "\@item(buffers):button2*" => "hsignal:buffers_mouse", + "\@bar(buffers):ctrl-wheelup" => "hsignal:buffers_mouse", + "\@bar(buffers):ctrl-wheeldown" => "hsignal:buffers_mouse"); +my %options; +my %hotlist_level = (0 => "low", 1 => "message", 2 => "private", 3 => "highlight"); +my @whitelist_buffers = (); +my @immune_detach_buffers= (); +my @detach_buffer_immediately= (); +my @buffers_focus = (); +my %buffers_timer = (); +my %Hooks = (); + +# --------------------------------[ init ]-------------------------------------- +weechat::register($SCRIPT_NAME, "Sebastien Helleu ", + $SCRIPT_VERSION, "GPL3", + "Sidebar with list of buffers", "shutdown_cb", ""); +my $weechat_version = weechat::info_get("version_number", "") || 0; + +buffers_config_init(); +buffers_config_read(); + +weechat::bar_item_new($SCRIPT_NAME, "build_buffers", ""); +weechat::bar_new($SCRIPT_NAME, "0", "0", "root", "", "left", "columns_vertical", + "vertical", "0", "0", "default", "default", "default", "1", + $SCRIPT_NAME); + +if ( check_bar_item() == 0 ) +{ + weechat::command("", "/bar show " . $SCRIPT_NAME) if ( weechat::config_boolean($options{"toggle_bar"}) eq 1 ); +} + +weechat::hook_signal("buffer_opened", "buffers_signal_buffer", ""); +weechat::hook_signal("buffer_closed", "buffers_signal_buffer", ""); +weechat::hook_signal("buffer_merged", "buffers_signal_buffer", ""); +weechat::hook_signal("buffer_unmerged", "buffers_signal_buffer", ""); +weechat::hook_signal("buffer_moved", "buffers_signal_buffer", ""); +weechat::hook_signal("buffer_renamed", "buffers_signal_buffer", ""); +weechat::hook_signal("buffer_switch", "buffers_signal_buffer", ""); +weechat::hook_signal("buffer_hidden", "buffers_signal_buffer", ""); # WeeChat >= 0.4.4 +weechat::hook_signal("buffer_unhidden", "buffers_signal_buffer", ""); # WeeChat >= 0.4.4 +weechat::hook_signal("buffer_localvar_added", "buffers_signal_buffer", ""); +weechat::hook_signal("buffer_localvar_changed", "buffers_signal_buffer", ""); + +weechat::hook_signal("window_switch", "buffers_signal_buffer", ""); +weechat::hook_signal("hotlist_changed", "buffers_signal_hotlist", ""); +#weechat::hook_command_run("/input switch_active_*", "buffers_signal_buffer", ""); +weechat::bar_item_update($SCRIPT_NAME); + + +if ($weechat_version >= 0x00030600) +{ + weechat::hook_focus($SCRIPT_NAME, "buffers_focus_buffers", ""); + weechat::hook_hsignal("buffers_mouse", "buffers_hsignal_mouse", ""); + weechat::key_bind("mouse", \%mouse_keys); +} + +weechat::hook_command($cmd_buffers_whitelist, + "add/del current buffer to/from buffers whitelist", + "[add] || [del] || [reset]", + " add: add current buffer in configuration file\n". + " del: delete current buffer from configuration file\n". + "reset: reset all buffers from configuration file ". + "(no confirmation!)\n\n". + "Examples:\n". + "/$cmd_buffers_whitelist add\n", + "add %-||". + "del %-||". + "reset %-", + "buffers_cmd_whitelist", ""); +weechat::hook_command($cmd_buffers_detach, + "add/del current buffer to/from buffers detach", + "[add] || [del] || [reset]", + " add: add current buffer in configuration file\n". + " del: delete current buffer from configuration file\n". + "reset: reset all buffers from configuration file ". + "(no confirmation!)\n\n". + "Examples:\n". + "/$cmd_buffers_detach add\n", + "add %-||". + "del %-||". + "reset %-", + "buffers_cmd_detach", ""); + +if ($weechat_version >= 0x00030800) +{ + weechat::hook_config("buffers.look.detach", "hook_timer_detach", ""); + if (weechat::config_integer($options{"detach"}) > 0) + { + $Hooks{timer_detach} = weechat::hook_timer(weechat::config_integer($options{"detach"}) * 1000, + 60, 0, "buffers_signal_hotlist", ""); + } +} + +weechat::hook_config("buffers.look.show_lag", "hook_timer_lag", ""); + +if (weechat::config_boolean($options{"show_lag"})) +{ + $Hooks{timer_lag} = weechat::hook_timer( + weechat::config_integer(weechat::config_get("irc.network.lag_refresh_interval")) * 1000, + 0, 0, "buffers_signal_hotlist", ""); +} + +# -------------------------------- [ command ] -------------------------------- +sub buffers_cmd_whitelist +{ +my ( $data, $buffer, $args ) = @_; + $args = lc($args); + my $buffers_whitelist = weechat::config_string( weechat::config_get("buffers.look.whitelist_buffers") ); + return weechat::WEECHAT_RC_OK if ( $buffers_whitelist eq "" and $args eq "del" or $buffers_whitelist eq "" and $args eq "reset" ); + my @buffers_list = split( /,/, $buffers_whitelist ); + # get buffers name + my $infolist = weechat::infolist_get("buffer", weechat::current_buffer(), ""); + weechat::infolist_next($infolist); + my $buffers_name = weechat::infolist_string($infolist, "name"); + weechat::infolist_free($infolist); + return weechat::WEECHAT_RC_OK if ( $buffers_name eq "" ); # should never happen + + if ( $args eq "add" ) + { + return weechat::WEECHAT_RC_OK if ( grep /^$buffers_name$/, @buffers_list ); # check if buffer already in list + push @buffers_list, ( $buffers_name ); + my $buffers_list = &create_whitelist(\@buffers_list); + weechat::config_option_set( weechat::config_get("buffers.look.whitelist_buffers"), $buffers_list, 1); + weechat::print(weechat::current_buffer(), "buffer \"$buffers_name\" added to buffers whitelist"); + } + elsif ( $args eq "del" ) + { + return weechat::WEECHAT_RC_OK unless ( grep /^$buffers_name$/, @buffers_list ); # check if buffer is in list + @buffers_list = grep {$_ ne $buffers_name} @buffers_list; # delete entry + my $buffers_list = &create_whitelist(\@buffers_list); + weechat::config_option_set( weechat::config_get("buffers.look.whitelist_buffers"), $buffers_list, 1); + weechat::print(weechat::current_buffer(), "buffer \"$buffers_name\" deleted from buffers whitelist"); + } + elsif ( $args eq "reset" ) + { + return weechat::WEECHAT_RC_OK if ( $buffers_whitelist eq "" ); + weechat::config_option_set( weechat::config_get("buffers.look.whitelist_buffers"), "", 1); + weechat::print(weechat::current_buffer(), "buffers whitelist is empty, now..."); + } + return weechat::WEECHAT_RC_OK; +} + +sub buffers_cmd_detach +{ + my ( $data, $buffer, $args ) = @_; + $args = lc($args); + my $immune_detach_buffers = weechat::config_string( weechat::config_get("buffers.look.immune_detach_buffers") ); + return weechat::WEECHAT_RC_OK if ( $immune_detach_buffers eq "" and $args eq "del" or $immune_detach_buffers eq "" and $args eq "reset" ); + + my @buffers_list = split( /,/, $immune_detach_buffers ); + # get buffers name + my $infolist = weechat::infolist_get("buffer", weechat::current_buffer(), ""); + weechat::infolist_next($infolist); + my $buffers_name = weechat::infolist_string($infolist, "name"); + weechat::infolist_free($infolist); + return weechat::WEECHAT_RC_OK if ( $buffers_name eq "" ); # should never happen + + if ( $args eq "add" ) + { + return weechat::WEECHAT_RC_OK if ( grep /^$buffers_name$/, @buffers_list ); # check if buffer already in list + push @buffers_list, ( $buffers_name ); + my $buffers_list = &create_whitelist(\@buffers_list); + weechat::config_option_set( weechat::config_get("buffers.look.immune_detach_buffers"), $buffers_list, 1); + weechat::print(weechat::current_buffer(), "buffer \"$buffers_name\" added to immune detach buffers"); + } + elsif ( $args eq "del" ) + { + return weechat::WEECHAT_RC_OK unless ( grep /^$buffers_name$/, @buffers_list ); # check if buffer is in list + @buffers_list = grep {$_ ne $buffers_name} @buffers_list; # delete entry + my $buffers_list = &create_whitelist(\@buffers_list); + weechat::config_option_set( weechat::config_get("buffers.look.immune_detach_buffers"), $buffers_list, 1); + weechat::print(weechat::current_buffer(), "buffer \"$buffers_name\" deleted from immune detach buffers"); + } + elsif ( $args eq "reset" ) + { + return weechat::WEECHAT_RC_OK if ( $immune_detach_buffers eq "" ); + weechat::config_option_set( weechat::config_get("buffers.look.immune_detach_buffers"), "", 1); + weechat::print(weechat::current_buffer(), "immune detach buffers is empty, now..."); + } + return weechat::WEECHAT_RC_OK; +} + +sub create_whitelist +{ + my @buffers_list = @{$_[0]}; + my $buffers_list = ""; + foreach (@buffers_list) + { + $buffers_list .= $_ .","; + } + # remove last "," + chop $buffers_list; + return $buffers_list; +} + +# -------------------------------- [ config ] -------------------------------- +sub hook_timer_detach +{ + my $detach = $_[2]; + if ( $detach eq 0 ) + { + weechat::unhook($Hooks{timer_detach}) if $Hooks{timer_detach}; + $Hooks{timer_detach} = ""; + } + else + { + weechat::unhook($Hooks{timer_detach}) if $Hooks{timer_detach}; + $Hooks{timer_detach} = weechat::hook_timer( weechat::config_integer($options{"detach"}) * 1000, 60, 0, "buffers_signal_hotlist", ""); + } + weechat::bar_item_update($SCRIPT_NAME); + return weechat::WEECHAT_RC_OK; +} + +sub hook_timer_lag +{ + my $lag = $_[2]; + if ( $lag eq "off" ) + { + weechat::unhook($Hooks{timer_lag}) if $Hooks{timer_lag}; + $Hooks{timer_lag} = ""; + } + else + { + weechat::unhook($Hooks{timer_lag}) if $Hooks{timer_lag}; + $Hooks{timer_lag} = weechat::hook_timer( weechat::config_integer(weechat::config_get("irc.network.lag_refresh_interval")) * 1000, 0, 0, "buffers_signal_hotlist", ""); + } + weechat::bar_item_update($SCRIPT_NAME); + return weechat::WEECHAT_RC_OK; +} + +sub buffers_config_read +{ + return weechat::config_read($buffers_config_file) if ($buffers_config_file ne ""); +} + +sub buffers_config_write +{ + return weechat::config_write($buffers_config_file) if ($buffers_config_file ne ""); +} + +sub buffers_config_reload_cb +{ + my ($data, $config_file) = ($_[0], $_[1]); + return weechat::config_reload($config_file) +} + +sub buffers_config_init +{ + $buffers_config_file = weechat::config_new($BUFFERS_CONFIG_FILE_NAME, + "buffers_config_reload_cb", ""); + return if ($buffers_config_file eq ""); + +my %default_options_color = +("color_current_fg" => [ + "current_fg", "color", + "foreground color for current buffer", + "", 0, 0, "lightcyan", "lightcyan", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_current_bg" => [ + "current_bg", "color", + "background color for current buffer", + "", 0, 0, "red", "red", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_default_fg" => [ + "default_fg", "color", + "default foreground color for buffer name", + "", 0, 0, "default", "default", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_default_bg" => [ + "default_bg", "color", + "default background color for buffer name", + "", 0, 0, "default", "default", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_hotlist_highlight_fg" => [ + "hotlist_highlight_fg", "color", + "change foreground color of buffer name if a highlight messaged received", + "", 0, 0, "magenta", "magenta", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_hotlist_highlight_bg" => [ + "hotlist_highlight_bg", "color", + "change background color of buffer name if a highlight messaged received", + "", 0, 0, "default", "default", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_hotlist_low_fg" => [ + "hotlist_low_fg", "color", + "change foreground color of buffer name if a low message received", + "", 0, 0, "white", "white", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_hotlist_low_bg" => [ + "hotlist_low_bg", "color", + "change background color of buffer name if a low message received", + "", 0, 0, "default", "default", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_hotlist_message_fg" => [ + "hotlist_message_fg", "color", + "change foreground color of buffer name if a normal message received", + "", 0, 0, "yellow", "yellow", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_hotlist_message_bg" => [ + "hotlist_message_bg", "color", + "change background color of buffer name if a normal message received", + "", 0, 0, "default", "default", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_hotlist_private_fg" => [ + "hotlist_private_fg", "color", + "change foreground color of buffer name if a private message received", + "", 0, 0, "lightgreen", "lightgreen", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_hotlist_private_bg" => [ + "hotlist_private_bg", "color", + "change background color of buffer name if a private message received", + "", 0, 0, "default", "default", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_number" => [ + "number", "color", + "color for buffer number", + "", 0, 0, "lightgreen", "lightgreen", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_number_char" => [ + "number_char", "color", + "color for buffer number char", + "", 0, 0, "lightgreen", "lightgreen", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_whitelist_default_fg" => [ + "whitelist_default_fg", "color", + "default foreground color for whitelist buffer name", + "", 0, 0, "", "", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_whitelist_default_bg" => [ + "whitelist_default_bg", "color", + "default background color for whitelist buffer name", + "", 0, 0, "", "", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_whitelist_low_fg" => [ + "whitelist_low_fg", "color", + "low color of whitelist buffer name", + "", 0, 0, "", "", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_whitelist_low_bg" => [ + "whitelist_low_bg", "color", + "low color of whitelist buffer name", + "", 0, 0, "", "", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_whitelist_message_fg" => [ + "whitelist_message_fg", "color", + "message color of whitelist buffer name", + "", 0, 0, "", "", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_whitelist_message_bg" => [ + "whitelist_message_bg", "color", + "message color of whitelist buffer name", + "", 0, 0, "", "", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_whitelist_private_fg" => [ + "whitelist_private_fg", "color", + "private color of whitelist buffer name", + "", 0, 0, "", "", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_whitelist_private_bg" => [ + "whitelist_private_bg", "color", + "private color of whitelist buffer name", + "", 0, 0, "", "", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_whitelist_highlight_fg" => [ + "whitelist_highlight_fg", "color", + "highlight color of whitelist buffer name", + "", 0, 0, "", "", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_whitelist_highlight_bg" => [ + "whitelist_highlight_bg", "color", + "highlight color of whitelist buffer name", + "", 0, 0, "", "", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_none_channel_fg" => [ + "none_channel_fg", "color", + "foreground color for none channel buffer (e.g.: core/server/plugin ". + "buffer)", + "", 0, 0, "default", "default", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_none_channel_bg" => [ + "none_channel_bg", "color", + "background color for none channel buffer (e.g.: core/server/plugin ". + "buffer)", + "", 0, 0, "default", "default", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "queries_default_fg" => [ + "queries_default_fg", "color", + "foreground color for query buffer without message", + "", 0, 0, "default", "default", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "queries_default_bg" => [ + "queries_default_bg", "color", + "background color for query buffer without message", + "", 0, 0, "default", "default", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "queries_message_fg" => [ + "queries_message_fg", "color", + "foreground color for query buffer with unread message", + "", 0, 0, "default", "default", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "queries_message_bg" => [ + "queries_message_bg", "color", + "background color for query buffer with unread message", + "", 0, 0, "default", "default", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "queries_highlight_fg" => [ + "queries_highlight_fg", "color", + "foreground color for query buffer with unread highlight", + "", 0, 0, "default", "default", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "queries_highlight_bg" => [ + "queries_highlight_bg", "color", + "background color for query buffer with unread highlight", + "", 0, 0, "default", "default", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_prefix_bufname" => [ + "prefix_bufname", "color", + "color for prefix of buffer name", + "", 0, 0, "default", "default", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "color_suffix_bufname" => [ + "suffix_bufname", "color", + "color for suffix of buffer name", + "", 0, 0, "default", "default", 0, + "", "", "buffers_signal_config", "", "", "" + ], +); + +my %default_options_look = +( + "hotlist_counter" => [ + "hotlist_counter", "boolean", + "show number of message for the buffer (this option needs WeeChat >= ". + "0.3.5). The relevant option for notification is \"weechat.look.". + "buffer_notify_default\"", + "", 0, 0, "off", "off", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "show_lag" => [ + "show_lag", "boolean", + "show lag behind server name. This option is using \"irc.color.". + "item_lag_finished\", ". + "\"irc.network.lag_min_show\" and \"irc.network.lag_refresh_interval\"", + "", 0, 0, "off", "off", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "look_whitelist_buffers" => [ + "whitelist_buffers", "string", + "comma separated list of buffers for using a different color scheme ". + "(for example: freenode.#weechat,freenode.#weechat-fr)", + "", 0, 0, "", "", 0, + "", "", "buffers_signal_config_whitelist", "", "", "" + ], + "hide_merged_buffers" => [ + "hide_merged_buffers", "integer", + "hide merged buffers. The value determines which merged buffers should ". + "be hidden, keepserver meaning 'all except server buffers'. Other values ". + "correspondent to the buffer type.", + "server|channel|private|keepserver|all|none", 0, 0, "none", "none", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "indenting" => [ + "indenting", "integer", "use indenting for channel and query buffers. ". + "This option only takes effect if bar is left/right positioned", + "off|on|under_name", 0, 0, "off", "off", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "indenting_number" => [ + "indenting_number", "boolean", + "use indenting for numbers. This option only takes effect if bar is ". + "left/right positioned", + "", 0, 0, "on", "on", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "indenting_amount" => [ + "indenting_amount", "integer", + "amount of indenting to use. This option only takes effect if bar ". + "is left/right positioned, and indenting is enabled", + "", 0, 16, 2, 2, 0, + "", "", "buffers_signal_config", "", "", "" + ], + "short_names" => [ + "short_names", "boolean", + "display short names (remove text before first \".\" in buffer name)", + "", 0, 0, "on", "on", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "show_number" => [ + "show_number", "boolean", + "display buffer number in front of buffer name", + "", 0, 0, "on", "on", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "show_number_char" => [ + "number_char", "string", + "display a char behind buffer number", + "", 0, 0, ".", ".", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "show_prefix_bufname" => [ + "prefix_bufname", "string", + "prefix displayed in front of buffer name", + "", 0, 0, "", "", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "show_suffix_bufname" => [ + "suffix_bufname", "string", + "suffix displayed at end of buffer name", + "", 0, 0, "", "", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "show_prefix" => [ + "prefix", "boolean", + "displays your prefix for channel in front of buffer name", + "", 0, 0, "off", "off", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "show_prefix_empty" => [ + "prefix_empty", "boolean", + "use a placeholder for channels without prefix", + "", 0, 0, "on", "on", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "show_prefix_query" => [ + "prefix_for_query", "string", + "prefix displayed in front of query buffer", + "", 0, 0, "", "", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "sort" => [ + "sort", "integer", + "sort buffer-list by \"number\" or \"name\"", + "number|name", 0, 0, "number", "number", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "core_to_front" => [ + "core_to_front", "boolean", + "core buffer and buffers with free content will be listed first. ". + "Take only effect if buffer sort is by name", + "", 0, 0, "off", "off", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "jump_prev_next_visited_buffer" => [ + "jump_prev_next_visited_buffer", "boolean", + "jump to previously or next visited buffer if you click with ". + "left/right mouse button on currently visiting buffer", + "", 0, 0, "off", "off", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "name_size_max" => [ + "name_size_max", "integer", + "maximum size of buffer name. 0 means no limitation", + "", 0, 256, 0, 0, 0, + "", "", "buffers_signal_config", "", "", "" + ], + "name_crop_suffix" => [ + "name_crop_suffix", "string", + "contains an optional char(s) that is appended when buffer name is ". + "shortened", + "", 0, 0, "+", "+", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "detach" => [ + "detach", "integer", + "detach buffer from buffers list after a specific period of time ". + "(in seconds) without action (weechat ≥ 0.3.8 required) (0 means \"off\")", + "", 0, 31536000, 0, "number", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "immune_detach_buffers" => [ + "immune_detach_buffers", "string", + "comma separated list of buffers to NOT automatically detach. ". + "Allows \"*\" wildcard. Ex: \"BitlBee,freenode.*\"", + "", 0, 0, "", "", 0, + "", "", "buffers_signal_config_immune_detach_buffers", "", "", "" + ], + "detach_query" => [ + "detach_query", "boolean", + "query buffer will be detached", + "", 0, 0, "off", "off", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "detach_buffer_immediately" => [ + "detach_buffer_immediately", "string", + "comma separated list of buffers to detach immediately. Buffers ". + "will attach again based on notify level set in ". + "\"detach_buffer_immediately_level\". Allows \"*\" wildcard. ". + "Ex: \"BitlBee,freenode.*\"", + "", 0, 0, "", "", 0, + "", "", "buffers_signal_config_detach_buffer_immediately", "", "", "" + ], + "detach_buffer_immediately_level" => [ + "detach_buffer_immediately_level", "integer", + "The value determines what notify level messages are reattached from activity. ". + " This option works in conjunction with \"detach_buffer_immediately\" ". + "0: low priority (like join/part messages), ". + "1: message, ". + "2: private, ". + "3: highlight", + "", 0, 3, 2, 2, 0, + "", "", "buffers_signal_config", "", "", "" + ], + "detach_free_content" => [ + "detach_free_content", "boolean", + "buffers with free content will be detached (Ex: iset, chanmon)", + "", 0, 0, "off", "off", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "detach_displayed_buffers" => [ + "detach_displayed_buffers", "boolean", + "buffers displayed in a (split) window will be detached", + "", 0, 0, "on", "on", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "detach_display_window_number" => [ + "detach_display_window_number", "boolean", + "window number will be add, behind buffer name (this option takes only ". + "effect with \"detach_displayed_buffers\" option)", + "", 0, 0, "off", "off", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "mark_inactive" => [ + "mark_inactive", "boolean", + "if option is \"on\", inactive buffers (those you are not in) will have ". + "parentheses around them. An inactive buffer will not be detached.", + "", 0, 0, "off", "off", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "toggle_bar" => [ + "toggle_bar", "boolean", + "if option is \"on\", buffers bar will hide/show when script is ". + "(un)loaded.", + "", 0, 0, "on", "on", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "mouse_move_buffer" => [ + "mouse_move_buffer", "boolean", + "if option is \"on\", mouse gestures (drag & drop) can move buffers in list.", + "", 0, 0, "on", "on", 0, + "", "", "buffers_signal_config", "", "", "" + ], + "mouse_wheel" => [ + "mouse_wheel", "boolean", + "if option is \"on\", mouse wheel jumps to previous/next buffer in list.", + "", 0, 0, "on", "on", 0, + "", "", "buffers_signal_config", "", "", "" + ], +); + + # section "color" + my $section_color = weechat::config_new_section( + $buffers_config_file, + "color", 0, 0, "", "", "", "", "", "", "", "", "", ""); + if ($section_color eq "") + { + weechat::config_free($buffers_config_file); + return; + } + foreach my $option (keys %default_options_color) + { + $options{$option} = weechat::config_new_option( + $buffers_config_file, + $section_color, + $default_options_color{$option}[0], + $default_options_color{$option}[1], + $default_options_color{$option}[2], + $default_options_color{$option}[3], + $default_options_color{$option}[4], + $default_options_color{$option}[5], + $default_options_color{$option}[6], + $default_options_color{$option}[7], + $default_options_color{$option}[8], + $default_options_color{$option}[9], + $default_options_color{$option}[10], + $default_options_color{$option}[11], + $default_options_color{$option}[12], + $default_options_color{$option}[13], + $default_options_color{$option}[14]); + } + + # section "look" + my $section_look = weechat::config_new_section( + $buffers_config_file, + "look", 0, 0, "", "", "", "", "", "", "", "", "", ""); + if ($section_look eq "") + { + weechat::config_free($buffers_config_file); + return; + } + foreach my $option (keys %default_options_look) + { + $options{$option} = weechat::config_new_option( + $buffers_config_file, + $section_look, + $default_options_look{$option}[0], + $default_options_look{$option}[1], + $default_options_look{$option}[2], + $default_options_look{$option}[3], + $default_options_look{$option}[4], + $default_options_look{$option}[5], + $default_options_look{$option}[6], + $default_options_look{$option}[7], + $default_options_look{$option}[8], + $default_options_look{$option}[9], + $default_options_look{$option}[10], + $default_options_look{$option}[11], + $default_options_look{$option}[12], + $default_options_look{$option}[13], + $default_options_look{$option}[14], + $default_options_look{$option}[15]); + } +} + +# get sort key of buffer +sub key_of_buffer +{ + my ($buffer, $number) = @_; + my $key = ""; + + if (weechat::config_integer($options{"sort"}) eq 1) # number = 0; name = 1 + { + my $name = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_custom_name"); + if (not defined $name or $name eq "") + { + if (weechat::config_boolean( $options{"short_names"} ) eq 1) + { + $name = $buffer->{"short_name"}; + } + else + { + $name = $buffer->{"name"}; + } + } + if ( weechat::config_boolean($options{"core_to_front"}) eq 1) + { + if ( weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") ne "channel" and + weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") ne "private" ) + { + my $type = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type"); + if ( $type eq "" and $name ne "weechat") + { + $name = " " . $name; + } + else + { + $name = " " . $name; + } + } + } + $key = sprintf("%s%08d", lc($name), $buffer->{"number"}); + } + else + { + $key = sprintf("%08d", $number); + } + + return $key; +} + +# whether to skip this buffer +sub skip_buffer +{ + my ($buffer) = @_; + return 0 if $buffer->{"active"}; + + if ( weechat::config_string($options{"hide_merged_buffers"}) eq "server" and + ($buffer->{"type"} eq "server" or $buffer->{"plugin_name"} eq "core") ) + { + return 1; + } + if ( weechat::config_string($options{"hide_merged_buffers"}) eq "channel" and + ($buffer->{"type"} eq "channel" or $buffer->{"plugin_name"} eq "core") ) + { + return 1; + } + if ( weechat::config_string($options{"hide_merged_buffers"}) eq "private" and + ($buffer->{"type"} eq "private" or $buffer->{"plugin_name"} eq "core") ) + { + return 1; + } + if ( weechat::config_string($options{"hide_merged_buffers"}) eq "keepserver" and + ($buffer->{"type"} ne "server" or $buffer->{"plugin_name"} eq "core") ) + { + return 1; + } + if ( weechat::config_string($options{"hide_merged_buffers"}) eq "all" ) + { + return 1; + } + + return 0; +} + +# truncate string from the end to $maxlength, 0 = don't truncate +sub truncate_end +{ + my ($name, $maxlength) = @_; + if ($maxlength == 0) + { + return $name; + } + my $str = decode("UTF-8", $name); + $str = substr($str, 0, $maxlength); + $str = encode("UTF-8", $str); + return $str; +} + +# format one buffer name in buffers bar: truncate and add parentheses +sub format_name +{ + my ($buffer, $fg, $bg) = @_; + my $output = ""; + my $crop_suffix = weechat::color( weechat::config_color($options{"color_number_char"}) ) . weechat::config_string($options{"name_crop_suffix"}); + my $maxlength = weechat::config_integer($options{"name_size_max"}); + + my $name = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_custom_name"); + if (not defined $name or $name eq "") + { + if (weechat::config_boolean( $options{"short_names"} ) eq 1) + { + $name = $buffer->{"short_name"}; + } + else + { + $name = $buffer->{"name"}; + } + } + + if ( $buffer->{"type"} eq "channel" && + weechat::config_boolean($options{"mark_inactive"}) eq 1 && + $buffer->{"nicks_count"} == 0 && + $maxlength > 2 ) + { + $output = weechat::color( weechat::config_color($options{"color_number_char"}) ). + "(". + weechat::color($fg). + weechat::color(",$bg"). + truncate_end($name, $maxlength-2). + (length(Encode::decode_utf8($name)) > $maxlength-2 ? $crop_suffix : ""). + weechat::color( weechat::config_color($options{"color_number_char"}) ). + ")"; + } + else + { + $output = weechat::color($fg). + weechat::color(",$bg"). + truncate_end($name, $maxlength). + (length(Encode::decode_utf8($name)) > $maxlength && $maxlength > 0 ? $crop_suffix : ""); + } + + return $output; +} + +# get fg and bg for a buffer +sub get_colors +{ + my ($buffer, %hotlist) = @_; + my $fg = weechat::config_color( $options{"color_default_fg"} ); + my $bg = weechat::config_color( $options{"color_default_bg"} ); + + if ( weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") eq "private" ) + { + if ( weechat::config_color($options{"queries_default_bg"}) ne "default" || weechat::config_color($options{"queries_default_fg"}) ne "default" ) + { + $fg = weechat::config_color( $options{"queries_default_fg"} ); + $bg = weechat::config_color( $options{"queries_default_bg"} ); + } + } + # check for core and buffer with free content + elsif ( weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") ne "channel" and + weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") ne "private" ) + { + $fg = weechat::config_color( $options{"color_none_channel_fg"} ); + $bg = weechat::config_color( $options{"color_none_channel_bg"} ); + } + # default whitelist buffer? + if (grep {$_ eq $buffer->{"name"}} @whitelist_buffers) + { + $fg = weechat::config_color( $options{"color_whitelist_default_fg"} ); + $bg = weechat::config_color( $options{"color_whitelist_default_bg"} ); + } + + $fg = "default" if ($fg eq ""); + $bg = "default" if ($bg eq ""); + + # color for channel and query buffer + if (exists $hotlist{$buffer->{"pointer"}}) + { + delete $buffers_timer{$buffer->{"pointer"}}; + # check if buffer is in whitelist buffer + if (grep {$_ eq $buffer->{"name"}} @whitelist_buffers) + { + $fg = weechat::config_color( $options{"color_whitelist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_fg"} ); + $bg = weechat::config_color( $options{"color_whitelist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_bg"} ); + } + elsif ( weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") eq "private" ) + { + # queries_default_fg/bg and buffers.color.queries_message_fg/bg + if ( weechat::config_color($options{"queries_highlight_fg"}) ne "default" || + weechat::config_color($options{"queries_highlight_bg"}) ne "default" || + weechat::config_color($options{"queries_message_fg"}) ne "default" || + weechat::config_color($options{"queries_message_bg"}) ne "default" ) + { + if ( ($hotlist{$buffer->{"pointer"}}) == 2 ) + { + $fg = weechat::config_color( $options{"queries_message_fg"} ); + $bg = weechat::config_color( $options{"queries_message_bg"} ); + } + + elsif ( ($hotlist{$buffer->{"pointer"}}) == 3 ) + { + $fg = weechat::config_color( $options{"queries_highlight_fg"} ); + $bg = weechat::config_color( $options{"queries_highlight_bg"} ); + } + } + else + { + $fg = weechat::config_color( $options{"color_hotlist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_fg"} ); + $bg = weechat::config_color( $options{"color_hotlist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_bg"} ); + } + } + else + { + $fg = weechat::config_color( $options{"color_hotlist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_fg"} ); + $bg = weechat::config_color( $options{"color_hotlist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_bg"} ); + } + } + + if ($buffer->{"current_buffer"}) + { + $fg = weechat::config_color( $options{"color_current_fg"} ); + $bg = weechat::config_color( $options{"color_current_bg"} ); + } + return ($fg, $bg); +} + +# get nick prefix of channel +sub nick_prefix +{ + my ($buffer) = @_; + my $output = ""; + + my $nickname = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_nick"); + if ($nickname eq "") + { + return ""; + } + + # with version >= 0.3.2, this infolist will return only nick + # with older versions, whole nicklist is returned for buffer, and this can be very slow + my $infolist_nick = weechat::infolist_get("nicklist", $buffer->{"pointer"}, "nick_".$nickname); + if ($infolist_nick eq "") + { + return weechat::config_boolean($options{"show_prefix_empty"}) eq 1 && $buffer->{"type"} eq "channel" ? " " : ""; + } + while (weechat::infolist_next($infolist_nick)) + { + if ( (weechat::infolist_string($infolist_nick, "type") eq "nick") + && (weechat::infolist_string($infolist_nick, "name") eq $nickname) ) + { + my $prefix = weechat::infolist_string($infolist_nick, "prefix"); + if ( ($prefix eq " ") and (weechat::config_boolean($options{"show_prefix_empty"}) eq 0) ) + { + last; + } + + # with version >= 0.3.5, it is now a color name (for older versions: option name with color) + if ($weechat_version >= 0x00030500) + { + $output .= weechat::color(weechat::infolist_string($infolist_nick, "prefix_color")); + } + else + { + $output .= weechat::color(weechat::config_color( + weechat::config_get( + weechat::infolist_string($infolist_nick, "prefix_color")))); + } + $output .= $prefix; + last; + } + } + weechat::infolist_free($infolist_nick); + return $output; +} + +# get all hotlist counts for a buffer +sub hotlist_counts +{ + my ($buffer, %hotlist) = @_; + my $delim_color = weechat::color( weechat::config_color($options{"color_number_char"}) ); + my $counters = ""; + + foreach my $counter ("low", "message", "private", "highlight") + { + if ($hotlist{$buffer."_count_${counter}"}) + { + $counters =~ s/([0-9])$/$1,/; + $counters .= weechat::color( weechat::config_color($options{"color_hotlist_${counter}_fg"}) ) . $hotlist{$buffer."_count_${counter}"}; + } + } + return " $delim_color($counters$delim_color)"; +} + +# buffers item +sub build_buffers +{ + my $str = ""; + + # get bar position (left/right/top/bottom) + my $position = "left"; + my $option_position = weechat::config_get("weechat.bar.buffers.position"); + if ($option_position ne "") + { + $position = weechat::config_string($option_position); + } + + # read hotlist + my %hotlist; + my $infolist = weechat::infolist_get("hotlist", "", ""); + while (weechat::infolist_next($infolist)) + { + $hotlist{weechat::infolist_pointer($infolist, "buffer_pointer")} = + weechat::infolist_integer($infolist, "priority"); + if ( weechat::config_boolean( $options{"hotlist_counter"} ) eq 1 and $weechat_version >= 0x00030500 ) + { + $hotlist{weechat::infolist_pointer($infolist, "buffer_pointer")."_count_low"} = + weechat::infolist_integer($infolist, "count_00"); # low message + $hotlist{weechat::infolist_pointer($infolist, "buffer_pointer")."_count_message"} = + weechat::infolist_integer($infolist, "count_01"); # channel message + $hotlist{weechat::infolist_pointer($infolist, "buffer_pointer")."_count_private"} = + weechat::infolist_integer($infolist, "count_02"); # private message + $hotlist{weechat::infolist_pointer($infolist, "buffer_pointer")."_count_highlight"} = + weechat::infolist_integer($infolist, "count_03"); # highlight message + } + } + weechat::infolist_free($infolist); + + # read buffers list + @buffers_focus = (); + my @buffers; + my @current1 = (); + my @current2 = (); + my $old_number = -1; + my $max_number = 0; + my $max_number_digits = 0; + my $active_seen = 0; + my $current_time = time(); + + $infolist = weechat::infolist_get("buffer", "", ""); + while (weechat::infolist_next($infolist)) + { + # ignore hidden buffers (WeeChat >= 0.4.4) + if ($weechat_version >= 0x00040400 and weechat::infolist_integer($infolist, "hidden")) + { + next; + } + my $buffer; + my $number = weechat::infolist_integer($infolist, "number"); + if ($number ne $old_number) + { + @buffers = (@buffers, @current2, @current1); + @current1 = (); + @current2 = (); + $active_seen = 0; + } + if ($number > $max_number) + { + $max_number = $number; + } + $old_number = $number; + my $active = weechat::infolist_integer($infolist, "active"); + if ($active) + { + $active_seen = 1; + } + $buffer->{"pointer"} = weechat::infolist_pointer($infolist, "pointer"); + $buffer->{"number"} = $number; + $buffer->{"active"} = $active; + $buffer->{"current_buffer"} = weechat::infolist_integer($infolist, "current_buffer"); + $buffer->{"num_displayed"} = weechat::infolist_integer($infolist, "num_displayed"); + $buffer->{"plugin_name"} = weechat::infolist_string($infolist, "plugin_name"); + $buffer->{"name"} = weechat::infolist_string($infolist, "name"); + $buffer->{"short_name"} = weechat::infolist_string($infolist, "short_name"); + $buffer->{"full_name"} = $buffer->{"plugin_name"}.".".$buffer->{"name"}; + $buffer->{"type"} = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type"); + + # check if buffer is active (or maybe a /part, /kick channel) + if ($buffer->{"type"} eq "channel" and weechat::config_boolean( $options{"mark_inactive"} ) eq 1) + { + my $server = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_server"); + my $channel = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_channel"); + my $infolist_channel = weechat::infolist_get("irc_channel", "", "$server,$channel"); + if ($infolist_channel) + { + weechat::infolist_next($infolist_channel); + $buffer->{"nicks_count"} = weechat::infolist_integer($infolist_channel, "nicks_count"); + } + else + { + $buffer->{"nicks_count"} = 0; + } + weechat::infolist_free($infolist_channel); + } + + my $maxlevel = weechat::config_integer($options{"detach_buffer_immediately_level"}); + next if ( check_detach_buffer_immediately($buffer->{"name"}) eq 1 + and $buffer->{"current_buffer"} eq 0 + and ( not exists $hotlist{$buffer->{"pointer"}} or $hotlist{$buffer->{"pointer"}} < $maxlevel) ); # checking for buffer to immediately detach + + if (check_immune_detached_buffers($buffer->{"name"})) + { + if ($active_seen) + { + push(@current2, $buffer); + } + else + { + push(@current1, $buffer); + } + } + else + { + my $detach_time = weechat::config_integer($options{"detach"}); + # set timer for buffers with no hotlist action + $buffers_timer{$buffer->{"pointer"}} = $current_time + if ( not exists $hotlist{$buffer->{"pointer"}} + and $buffer->{"type"} eq "channel" + and not exists $buffers_timer{$buffer->{"pointer"}} + and $detach_time > 0); + + $buffers_timer{$buffer->{"pointer"}} = $current_time + if (weechat::config_boolean($options{"detach_query"}) eq 1 + and not exists $hotlist{$buffer->{"pointer"}} + and $buffer->{"type"} eq "private" + and not exists $buffers_timer{$buffer->{"pointer"}} + and $detach_time > 0); + + $detach_time = 0 + if (weechat::config_boolean($options{"detach_query"}) eq 0 + and $buffer->{"type"} eq "private"); + + # free content buffer + $buffers_timer{$buffer->{"pointer"}} = $current_time + if (weechat::config_boolean($options{"detach_free_content"}) eq 1 + and not exists $hotlist{$buffer->{"pointer"}} + and $buffer->{"type"} eq "" + and not exists $buffers_timer{$buffer->{"pointer"}} + and $detach_time > 0); + + $detach_time = 0 + if (weechat::config_boolean($options{"detach_free_content"}) eq 0 + and $buffer->{"type"} eq ""); + + $detach_time = 0 + if (weechat::config_boolean($options{"mark_inactive"}) eq 1 + and defined $buffer->{"nicks_count"} + and $buffer->{"nicks_count"} == 0); + + # check for detach + unless ( $buffer->{"current_buffer"} eq 0 + and not exists $hotlist{$buffer->{"pointer"}} + and exists $buffers_timer{$buffer->{"pointer"}} + and $detach_time > 0 + and $weechat_version >= 0x00030800 + and $current_time - $buffers_timer{$buffer->{"pointer"}} >= $detach_time) + { + if ($active_seen) + { + push(@current2, $buffer); + } + else + { + push(@current1, $buffer); + } + } + elsif ( $buffer->{"current_buffer"} eq 0 + and not exists $hotlist{$buffer->{"pointer"}} + and exists $buffers_timer{$buffer->{"pointer"}} + and $detach_time > 0 + and $weechat_version >= 0x00030800 + and $current_time - $buffers_timer{$buffer->{"pointer"}} >= $detach_time + and $buffer->{"num_displayed"} eq 1 # check for option detach_displayed_buffers and if buffer is displayed in a split window + and weechat::config_boolean($options{"detach_displayed_buffers"}) eq 0 ) + { + my $infolist_window = weechat::infolist_get("window", "", ""); + while (weechat::infolist_next($infolist_window)) + { + my $buffer_ptr = weechat::infolist_pointer($infolist_window, "buffer"); + if ($buffer_ptr eq $buffer->{"pointer"}) + { + $buffer->{"window"} = weechat::infolist_integer($infolist_window, "number"); + } + } + weechat::infolist_free($infolist_window); + push(@current2, $buffer); + } + } + + } # end of while + + $max_number_digits = length($max_number); + @buffers = (@buffers, @current2, @current1); + weechat::infolist_free($infolist); + + # sort buffers by number, name or shortname + my %sorted_buffers; + + my $number = 0; + for my $buffer (@buffers) + { + $sorted_buffers{key_of_buffer($buffer, $number)} = $buffer; + $number++; + } + + # build string with buffers + $old_number = -1; + foreach my $key (sort keys %sorted_buffers) + { + my $buffer = $sorted_buffers{$key}; + + if (skip_buffer($buffer)) + { + next; + } + + push(@buffers_focus, $buffer); # buffer > buffers_focus, for mouse support + + my ($fg, $bg) = get_colors($buffer, %hotlist); + my $color_bg = weechat::color(",$bg"); + + if ( weechat::config_string($options{"show_prefix_bufname"}) ne "" ) + { + $str .= $color_bg. + weechat::color( weechat::config_color($options{"color_prefix_bufname"}) ). + weechat::config_string( $options{"show_prefix_bufname"} ). + weechat::color("default"); + } + + if ( weechat::config_boolean($options{"show_number"}) eq 1 ) # on + { + if (( weechat::config_boolean( $options{"indenting_number"} ) eq 1) + && (($position eq "left") || ($position eq "right"))) + { + $str .= weechat::color("default") + . $color_bg + . " " x ($max_number_digits - length($buffer->{"number"})); + } + + if ($old_number ne $buffer->{"number"}) + { + $str .= weechat::color( weechat::config_color($options{"color_number"}) ) + .$color_bg + .$buffer->{"number"} + .weechat::color("default") + .$color_bg + .weechat::color( weechat::config_color($options{"color_number_char"}) ) + .weechat::config_string( $options{"show_number_char"} ) + .$color_bg; + } + else + { + # Indentation aligns channels in a visually appealing way + # when viewing list top-to-bottom... + my $indent = " " x length($buffer->{"number"}) . " "; + # ...except when list is top/bottom and channels left-to-right. + my $option_pos = weechat::config_string( weechat::config_get("weechat.bar.buffers.position") ); + if ( ($option_pos eq 'top') || ($option_pos eq 'bottom') + and weechat::config_string( weechat::config_get("weechat.bar.buffers.filling_top_bottom") ) =~ /horizontal/ ) + { + $indent = ''; + } + $str .= weechat::color("default") . $color_bg . $indent; + } + } + + if ( ( weechat::config_integer( $options{"indenting"} ) ne 0 ) # indenting NOT off + && (($position eq "left") || ($position eq "right")) ) + { + my $type = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type"); + if (($type eq "channel") || ($type eq "private")) + { + if ( weechat::config_integer($options{"indenting"}) eq 2 # under_name + and weechat::config_integer($options{"indenting_number"}) eq 0 + and weechat::config_boolean($options{"show_number"}) ne 0 ) + { + $str .= " " x ( $max_number_digits - length($buffer->{"number"}) ); + } + $str .= " " x weechat::config_integer($options{"indenting_amount"}); + } + } + + $str .= weechat::config_string($options{"show_prefix_query"}) if (weechat::config_string($options{"show_prefix_query"}) ne "" and $buffer->{"type"} eq "private"); + $str .= nick_prefix($buffer) if (weechat::config_boolean($options{"show_prefix"}) eq 1); + $str .= format_name($buffer, $fg, $bg); + $str .= hotlist_counts($buffer->{"pointer"}, %hotlist) + if ( weechat::config_boolean($options{"hotlist_counter"}) eq 1 and $weechat_version >= 0x00030500 and defined $hotlist{$buffer->{"pointer"}}); + + # lag + if ( weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") eq "server" and weechat::config_boolean($options{"show_lag"}) eq 1) + { + my $color_lag = weechat::config_color(weechat::config_get("irc.color.item_lag_finished")); + my $min_lag = weechat::config_integer(weechat::config_get("irc.network.lag_min_show")); + my $infolist_server = weechat::infolist_get("irc_server", "", $buffer->{"short_name"}); + weechat::infolist_next($infolist_server); + my $lag = (weechat::infolist_integer($infolist_server, "lag")); + weechat::infolist_free($infolist_server); + if ( int($lag) > int($min_lag) ) + { + $lag = $lag / 1000; + $str .= weechat::color("default") . " (" . weechat::color($color_lag) . $lag . weechat::color("default") . ")"; + } + } + + # window number + if (weechat::config_boolean($options{"detach_displayed_buffers"}) eq 0 + and weechat::config_boolean($options{"detach_display_window_number"}) eq 1 + and $buffer->{"window"}) + { + $str .= weechat::color("default"). + " (". + weechat::color( weechat::config_color($options{"color_number"}) ). + $buffer->{"window"}. + weechat::color("default"). + ")"; + } + $str .= weechat::color("default"); + + # suffix + if ( weechat::config_string($options{"show_suffix_bufname"}) ne "" ) + { + $str .= weechat::color( weechat::config_color($options{"color_suffix_bufname"}) ). + weechat::config_string( $options{"show_suffix_bufname"} ). + weechat::color("default"); + } + + $str .= "\n"; + $old_number = $buffer->{"number"}; + } # end of foreach + + # remove spaces and/or linefeed at the end + $str =~ s/\s+$//; + chomp($str); + return $str; +} + +# react to numerous signals +sub buffers_signal_buffer +{ + my ($data, $signal, $signal_data) = @_; + + # check for buffer_switch and set or remove detach time + if ($weechat_version >= 0x00030800) + { + if ($signal eq "buffer_switch") + { + my $pointer = weechat::hdata_get_list (weechat::hdata_get("buffer"), "gui_buffer_last_displayed"); # get switched buffer + my $current_time = time(); + if ( weechat::buffer_get_string($pointer, "localvar_type") eq "channel") + { + $buffers_timer{$pointer} = $current_time; + } + else + { + delete $buffers_timer{$pointer}; + } + } + elsif ($signal eq "buffer_opened") + { + my $current_time = time(); + $buffers_timer{$signal_data} = $current_time; + } + elsif ($signal eq "buffer_closing") + { + delete $buffers_timer{$signal_data}; + } + } + weechat::bar_item_update($SCRIPT_NAME); + return weechat::WEECHAT_RC_OK; +} + +sub buffers_signal_hotlist +{ + weechat::bar_item_update($SCRIPT_NAME); + return weechat::WEECHAT_RC_OK; +} + + +sub buffers_signal_config_whitelist +{ + @whitelist_buffers = split( /,/, weechat::config_string($options{"look_whitelist_buffers"}) ); + weechat::bar_item_update($SCRIPT_NAME); + return weechat::WEECHAT_RC_OK; +} + +sub buffers_signal_config_immune_detach_buffers +{ + @immune_detach_buffers = split( /,/, weechat::config_string($options{"immune_detach_buffers"}) ); + weechat::bar_item_update($SCRIPT_NAME); + return weechat::WEECHAT_RC_OK; +} + +sub buffers_signal_config_detach_buffer_immediately +{ + @detach_buffer_immediately = split( /,/, weechat::config_string($options{"detach_buffer_immediately"}) ); + weechat::bar_item_update($SCRIPT_NAME); + return weechat::WEECHAT_RC_OK; +} + +sub buffers_signal_config +{ + weechat::bar_item_update($SCRIPT_NAME); + return weechat::WEECHAT_RC_OK; +} + +# called when mouse click occured in buffers item: this callback returns buffer +# hash according to line of item where click occured +sub buffers_focus_buffers +{ + my %info = %{$_[1]}; + my $item_line = int($info{"_bar_item_line"}); + undef my $hash; + if (($info{"_bar_item_name"} eq $SCRIPT_NAME) && ($item_line >= 0) && ($item_line <= $#buffers_focus)) + { + $hash = $buffers_focus[$item_line]; + } + else + { + $hash = {}; + my $hash_focus = $buffers_focus[0]; + foreach my $key (keys %$hash_focus) + { + $hash->{$key} = "?"; + } + } + return $hash; +} + +# called when a mouse action is done on buffers item, to execute action +# possible actions: jump to a buffer or move buffer in list (drag & drop of buffer) +sub buffers_hsignal_mouse +{ + my ($data, $signal, %hash) = ($_[0], $_[1], %{$_[2]}); + my $current_buffer = weechat::buffer_get_integer(weechat::current_buffer(), "number"); # get current buffer number + + if ( $hash{"_key"} eq "button1" ) + { + # left mouse button + if ($hash{"number"} eq $hash{"number2"}) + { + if ( weechat::config_boolean($options{"jump_prev_next_visited_buffer"}) ) + { + if ( $current_buffer eq $hash{"number"} ) + { + weechat::command("", "/input jump_previously_visited_buffer"); + } + else + { + weechat::command("", "/buffer ".$hash{"full_name"}); + } + } + else + { + weechat::command("", "/buffer ".$hash{"full_name"}); + } + } + else + { + move_buffer(%hash) if (weechat::config_boolean($options{"mouse_move_buffer"})); + } + } + elsif ( ($hash{"_key"} eq "button2") && (weechat::config_boolean($options{"jump_prev_next_visited_buffer"})) ) + { + # right mouse button + if ( $current_buffer eq $hash{"number2"} ) + { + weechat::command("", "/input jump_next_visited_buffer"); + } + } + elsif ( $hash{"_key"} =~ /wheelup$/ ) + { + # wheel up + if (weechat::config_boolean($options{"mouse_wheel"})) + { + weechat::command("", "/buffer -1"); + } + } + elsif ( $hash{"_key"} =~ /wheeldown$/ ) + { + # wheel down + if (weechat::config_boolean($options{"mouse_wheel"})) + { + weechat::command("", "/buffer +1"); + } + } + else + { + my $infolist = weechat::infolist_get("hook", "", "command,menu"); + my $has_menu_command = weechat::infolist_next($infolist); + weechat::infolist_free($infolist); + + if ( $has_menu_command && $hash{"_key"} =~ /button2/ ) + { + if ($hash{"number"} eq $hash{"number2"}) + { + weechat::command($hash{"pointer"}, "/menu buffer1 $hash{short_name} $hash{number}"); + } + else + { + weechat::command($hash{"pointer"}, "/menu buffer2 $hash{short_name}/$hash{short_name2} $hash{number} $hash{number2}") + } + } + else + { + move_buffer(%hash) if (weechat::config_boolean($options{"mouse_move_buffer"})); + } + } +} + +sub move_buffer +{ + my %hash = @_; + my $number2 = $hash{"number2"}; + if ($number2 eq "?") + { + # if number 2 is not known (end of gesture outside buffers list), then set it + # according to mouse gesture + $number2 = "1"; + if (($hash{"_key"} =~ /gesture-right/) || ($hash{"_key"} =~ /gesture-down/)) + { + $number2 = "999999"; + if ($weechat_version >= 0x00030600) + { + my $hdata_buffer = weechat::hdata_get("buffer"); + my $last_gui_buffer = weechat::hdata_get_list($hdata_buffer, "last_gui_buffer"); + if ($last_gui_buffer) + { + $number2 = weechat::hdata_integer($hdata_buffer, $last_gui_buffer, "number") + 1; + } + } + } + } + my $ptrbuf = weechat::current_buffer(); + weechat::command($hash{"pointer"}, "/buffer move ".$number2); +} + +sub check_immune_detached_buffers +{ + my ($buffername) = @_; + foreach ( @immune_detach_buffers ) + { + my $immune_buffer = weechat::string_mask_to_regex($_); + if ($buffername =~ /^$immune_buffer$/i) + { + return 1; + } + } + return 0; +} + +sub check_detach_buffer_immediately +{ + my ($buffername) = @_; + foreach ( @detach_buffer_immediately ) + { + my $detach_buffer = weechat::string_mask_to_regex($_); + if ($buffername =~ /^$detach_buffer$/i) + { + return 1; + } + } + return 0; +} + +sub shutdown_cb +{ + weechat::command("", "/bar hide " . $SCRIPT_NAME) if ( weechat::config_boolean($options{"toggle_bar"}) eq 1 ); + return weechat::WEECHAT_RC_OK +} + +sub check_bar_item +{ + my $item = 0; + my $infolist = weechat::infolist_get("bar", "", ""); + while (weechat::infolist_next($infolist)) + { + my $bar_items = weechat::infolist_string($infolist, "items"); + if (index($bar_items, $SCRIPT_NAME) != -1) + { + my $name = weechat::infolist_string($infolist, "name"); + if ($name ne $SCRIPT_NAME) + { + $item = 1; + last; + } + } + } + weechat::infolist_free($infolist); + return $item; +} diff --git a/weechat/.weechat/perl/highmon.pl b/weechat/.weechat/perl/highmon.pl new file mode 100644 index 0000000..1c07712 --- /dev/null +++ b/weechat/.weechat/perl/highmon.pl @@ -0,0 +1,1139 @@ +# +# highmon.pl - Highlight Monitoring for weechat 0.3.0 +# Version 2.5 +# +# Add 'Highlight Monitor' buffer/bar to log all highlights in one spot +# +# Usage: +# /highmon [help] | [monitor [channel [server]]] | [clean default|orphan|all] | clearbar +# Command wrapper for highmon commands +# +# /highmon clean default|orphan|all will clean the config section of default 'on' entries, +# channels you are no longer joined, or both +# +# /highmon clearbar will clear the contents of highmon's bar output +# +# /highmon monitor [channel] [server] is used to toggle a highlight monitoring on and off, this +# can be used in the channel buffer for the channel you wish to toggle, or be given +# with arguments e.g. /highmon monitor #weechat freenode +# +# /set plugins.var.perl.highmon.alignment +# The config setting "alignment" can be changed to; +# "channel", "schannel", "nchannel", "channel,nick", "schannel,nick", "nchannel,nick" +# to change how the monitor appears +# The 'channel' value will show: "#weechat" +# The 'schannel' value will show: "6" +# The 'nchannel' value will show: "6:#weechat" +# +# /set plugins.var.perl.highmon.short_names +# Setting this to 'on' will trim the network name from highmon, ala buffers.pl +# +# /set plugins.var.perl.highmon.merge_private +# Setting this to 'on' will merge private messages to highmon's display +# +# /set plugins.var.perl.highmon.color_buf +# This turns colored buffer names on or off, you can also set a single fixed color by using a weechat color name. +# This *must* be a valid color name, or weechat will likely do unexpected things :) +# +# /set plugins.var.perl.highmon.hotlist_show +# Setting this to 'on' will let the highmon buffer appear in hotlists +# (status bar/buffer.pl) +# +# /set plugins.var.perl.highmon.away_only +# Setting this to 'on' will only put messages in the highmon buffer when +# you set your status to away +# +# /set plugins.var.perl.highmon.logging +# Toggles logging status for highmon buffer (default: off) +# +# /set plugins.var.perl.highmon.output +# Changes where output method of highmon; takes either "bar" or "buffer" (default; buffer) +# /set plugins.var.perl.highmon.bar_lines +# Changes the amount of lines the output bar will hold. +# (Only appears once output has been set to bar, defaults to 10) +# /set plugins.var.perl.highmon.bar_scrolldown +# Toggles the bar scrolling at the bottom when new highlights are received +# (Only appears once output has been set to bar, defaults to off) +# +# /set plugins.var.perl.highmon.nick_prefix +# /set plugins.var.perl.highmon.nick_suffix +# Sets the prefix and suffix chars in the highmon buffer +# (Defaults to <> if nothing set, and blank if there is) +# +# servername.#channel +# servername is the internal name for the server (set when you use /server add) +# #channel is the channel name, (where # is whatever channel type that channel happens to be) +# +# Optional, set up tweaks; Hide the status and input lines on highmon +# +# /set weechat.bar.status.conditions "${window.buffer.full_name} != perl.highmon" +# /set weechat.bar.input.conditions "${window.buffer.full_name} != perl.highmon" +# + +# Bugs and feature requests at: https://github.com/KenjiE20/highmon + +# History: +# 2014-08-16, KenjiE20 : +# v2.5: -add: clearbar command to clear bar output +# -add: firstrun output prompt to check the help text for set up hints as they were being missed +# and update hint for conditions to use eval +# -change: Make all outputs use the date callback for more accurate timestamps (thanks Germainz) +# 2013-12-04, KenjiE20 : +# v2.4: -add: Support for eval style colour codes in time format used for bar output +# 2013-10-22, KenjiE20 : +# v2.3.3.2: -fix: Typo in fix command +# 2013-10-10, KenjiE20 : +# v2.3.3.1: -fix: Typo in closed buffer warning +# 2013-10-07, KenjiE20 : +# v2.3.3: -add: Warning and fixer for accidental buffer closes +# 2013-01-15, KenjiE20 : +# v2.3.2: -fix: Let bar output use the string set in weechat's config option +# -add: github info +# 2012-04-15, KenjiE20 : +# v2.3.1: -fix: Colour tags in bar timestamp string +# 2012-02-28, KenjiE20 : +# v2.3: -feature: Added merge_private option to display private messages (default: off) +# -fix: Channel name colours now show correctly when set to on +# 2011-08-07, Sitaktif : +# v2.2.1: -feature: Add "bar_scrolldown" option to have the bar display the latest hl at anytime +# -fix: Set up bar-specific config at startup if 'output' is already configured as 'bar' +# 2010-12-22, KenjiE20 : +# v2.2: -change: Use API instead of config to find channel colours, ready for 0.3.4 and 256 colours +# 2010-12-13, idl0r & KenjiE20 : +# v2.1.3: -fix: perl errors caused by bar line counter +# -fix: Add command list to inbuilt help +# 2010-09-30, KenjiE20 : +# v2.1.2: -fix: logging config was not correctly toggling back on (thanks to sleo for noticing) +# -version sync w/ chanmon +# 2010-08-27, KenjiE20 : +# v2.1: -feature: Add 'nchannel' option to alignment to display buffer and name +# 2010-04-25, KenjiE20 : +# v2.0: Release as version 2.0 +# 2010-04-24, KenjiE20 : +# v1.9: Rewrite for v2.0 +# Bring feature set in line with chanmon 2.0 +# -code change: Made more subs to shrink the code down in places +# -fix: Stop highmon attempting to double load/hook +# -fix: Add version dependant check for away status +# 2010-01-25, KenjiE20 : +# v1.7: -fixture: Let highmon be aware of nick_prefix/suffix +# and allow custom prefix/suffix for chanmon buffer +# (Defaults to <> if nothing set, and blank if there is) +# (Thanks to m4v for these) +# 2009-09-07, KenjiE20 : +# v1.6: -feature: colored buffer names +# -change: version sync with chanmon +# 2009-09-05, KenjiE20 : +# v1.2: -fix: disable buffer highlight +# 2009-09-02, KenjiE20 : +# v.1.1.1 -change: Stop unsightly text block on '/help' +# 2009-08-10, KenjiE20 : +# v1.1: In-client help added +# 2009-08-02, KenjiE20 : +# v1.0: Initial Public Release + +# Copyright (c) 2009 by KenjiE20 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +@bar_lines = (); +@bar_lines_time = (); +# Replicate info earlier for in-client help + +$highmonhelp = weechat::color("bold")."/highmon [help] | [monitor [channel [server]]] | [clean default|orphan|all] | clearbar".weechat::color("-bold")." + Command wrapper for highmon commands + +".weechat::color("bold")."/highmon clean default|orphan|all".weechat::color("-bold")." will clean the config section of default 'on' entries, channels you are no longer joined, or both + +".weechat::color("bold")."/highmon clearbar".weechat::color("-bold")." will clear the contents of highmon's bar output + +".weechat::color("bold")."/highmon monitor [channel] [server]".weechat::color("-bold")." is used to toggle a highlight monitoring on and off, this can be used in the channel buffer for the channel you wish to toggle, or be given with arguments e.g. /highmon monitor #weechat freenode + +".weechat::color("bold")."/set plugins.var.perl.highmon.alignment".weechat::color("-bold")." + The config setting \"alignment\" can be changed to; + \"channel\", \"schannel\", \"nchannel\", \"channel,nick\", \"schannel,nick\", \"nchannel,nick\" + to change how the monitor appears + The 'channel' value will show: \"#weechat\" + The 'schannel' value will show: \"6\" + The 'nchannel' value will show: \"6:#weechat\" + +".weechat::color("bold")."/set plugins.var.perl.highmon.short_names".weechat::color("-bold")." + Setting this to 'on' will trim the network name from highmon, ala buffers.pl + +".weechat::color("bold")."/set plugins.var.perl.highmon.merge_private".weechat::color("-bold")." + Setting this to 'on' will merge private messages to highmon's display + +".weechat::color("bold")."/set plugins.var.perl.highmon.color_buf".weechat::color("-bold")." + This turns colored buffer names on or off, you can also set a single fixed color by using a weechat color name. + This ".weechat::color("bold")."must".weechat::color("-bold")." be a valid color name, or weechat will likely do unexpected things :) + +".weechat::color("bold")."/set plugins.var.perl.highmon.hotlist_show".weechat::color("-bold")." +Setting this to 'on' will let the highmon buffer appear in hotlists (status bar/buffer.pl) + +".weechat::color("bold")."/set plugins.var.perl.highmon.away_only".weechat::color("-bold")." +Setting this to 'on' will only put messages in the highmon buffer when you set your status to away + +".weechat::color("bold")."/set plugins.var.perl.highmon.logging".weechat::color("-bold")." + Toggles logging status for highmon buffer (default: off) + +".weechat::color("bold")."/set plugins.var.perl.highmon.output".weechat::color("-bold")." + Changes where output method of highmon; takes either \"bar\" or \"buffer\" (default; buffer) +".weechat::color("bold")."/set plugins.var.perl.highmon.bar_lines".weechat::color("-bold")." + Changes the amount of lines the output bar will hold. + (Only appears once output has been set to bar, defaults to 10) +".weechat::color("bold")."/set plugins.var.perl.highmon.bar_scrolldown".weechat::color("-bold")." + Toggles the bar scrolling at the bottom when new highlights are received + (Only appears once output has been set to bar, defaults to off) + +".weechat::color("bold")."/set plugins.var.perl.highmon.nick_prefix".weechat::color("-bold")." +".weechat::color("bold")."/set plugins.var.perl.highmon.nick_suffix".weechat::color("-bold")." + Sets the prefix and suffix chars in the highmon buffer + (Defaults to <> if nothing set, and blank if there is) + +".weechat::color("bold")."servername.#channel".weechat::color("-bold")." + servername is the internal name for the server (set when you use /server add) + #channel is the channel name, (where # is whatever channel type that channel happens to be) + +".weechat::color("bold")."Optional, set up tweaks;".weechat::color("-bold")." Hide the status and input lines on highmon + +".weechat::color("bold")."/set weechat.bar.status.conditions \"\${window.buffer.full_name} != perl.highmon\"".weechat::color("-bold")." +".weechat::color("bold")."/set weechat.bar.input.conditions \"\${window.buffer.full_name} != perl.highmon\"".weechat::color("-bold"); +# Print verbose help +sub print_help +{ + weechat::print("", "\t".weechat::color("bold")."Highmon Help".weechat::color("-bold")."\n\n"); + weechat::print("", "\t".$highmonhelp); + return weechat::WEECHAT_RC_OK; +} + +# Bar item build +sub highmon_bar_build +{ + # Get max lines + $max_lines = weechat::config_get_plugin("bar_lines"); + $max_lines = $max_lines ? $max_lines : 10; + $str = ''; + $align_num = 0; + $count = 0; + # Keep lines within max + while ($#bar_lines > $max_lines) + { + shift(@bar_lines); + shift(@bar_lines_time); + } + # So long as we have some lines, build a string + if (@bar_lines) + { + # Build loop + $sep = " ".weechat::config_string(weechat::config_get("weechat.look.prefix_suffix"))." "; + foreach(@bar_lines) + { + # Find max align needed + $prefix_num = (index(weechat::string_remove_color($_, ""), $sep)); + $align_num = $prefix_num if ($prefix_num > $align_num); + } + foreach(@bar_lines) + { + # Get align for this line + $prefix_num = (index(weechat::string_remove_color($_, ""), $sep)); + + # Make string + $str = $str.$bar_lines_time[$count]." ".(" " x ($align_num - $prefix_num)).$_."\n"; + # Increment count for sync with time list + $count++; + } + } + return $str; +} + +# Make a new bar +sub highmon_bar_open +{ + # Make the bar item + weechat::bar_item_new("highmon", "highmon_bar_build", ""); + + $highmon_bar = weechat::bar_new ("highmon", "off", 100, "root", "", "bottom", "vertical", "vertical", 0, 0, "default", "cyan", "default", "on", "highmon"); + + return weechat::WEECHAT_RC_OK; +} +# Close bar +sub highmon_bar_close +{ + # Find if bar exists + $highmon_bar = weechat::bar_search("highmon"); + # If is does, close it + if ($highmon_bar ne "") + { + weechat::bar_remove($highmon_bar); + } + + # Find if bar item exists + $highmon_bar_item = weechat::bar_item_search("highmon_bar"); + # If is does, close it + if ($highmon_bar_item ne "") + { + weechat::bar_remove($highmon_bar_item); + } + + @bar_lines = (); + return weechat::WEECHAT_RC_OK; +} + +# Make a new buffer +sub highmon_buffer_open +{ + # Search for pre-existing buffer + $highmon_buffer = weechat::buffer_search("perl", "highmon"); + + # Make a new buffer + if ($highmon_buffer eq "") + { + $highmon_buffer = weechat::buffer_new("highmon", "highmon_buffer_input", "", "highmon_buffer_close", ""); + } + + # Turn off notify, highlights + if ($highmon_buffer ne "") + { + if (weechat::config_get_plugin("hotlist_show" eq "off")) + { + weechat::buffer_set($highmon_buffer, "notify", "0"); + } + weechat::buffer_set($highmon_buffer, "highlight_words", "-"); + weechat::buffer_set($highmon_buffer, "title", "Highlight Monitor"); + # Set no_log + if (weechat::config_get_plugin("logging") eq "off") + { + weechat::buffer_set($highmon_buffer, "localvar_set_no_log", "1"); + } + } + return weechat::WEECHAT_RC_OK; +} +# Buffer input has no action +sub highmon_buffer_input +{ + return weechat::WEECHAT_RC_OK; +} +# Close up +sub highmon_buffer_close +{ + $highmon_buffer = ""; + # If user hasn't changed output style warn user + if (weechat::config_get_plugin("output") eq "buffer") + { + weechat::print("", "\tHighmon buffer has been closed but output is still set to buffer, unusual results may occur. To recreate the buffer use ".weechat::color("bold")."/highmon fix".weechat::color("-bold")); + } + return weechat::WEECHAT_RC_OK; +} + +# Highmon command wrapper +sub highmon_command_cb +{ + $data = $_[0]; + $buffer = $_[1]; + $args = $_[2]; + my $cmd = ''; + my $arg = ''; + + if ($args ne "") + { + # Split argument up + @arg_array = split(/ /,$args); + # Take first as command + $cmd = shift(@arg_array); + # Rebuild string to pass to subs + if (@arg_array) + { + $arg = join(" ", @arg_array); + } + } + + # Help command + if ($cmd eq "" || $cmd eq "help") + { + print_help(); + } + # /monitor command + elsif ($cmd eq "monitor") + { + highmon_toggle($data, $buffer, $arg); + } + # /highclean command + elsif ($cmd eq "clean") + { + highmon_config_clean($data, $buffer, $arg); + } + # clearbar command + elsif ($cmd eq "clearbar") + { + if (weechat::config_get_plugin("output") eq "bar") + { + @bar_lines = (); + weechat::bar_item_update("highmon"); + } + } + # Fix closed buffer + elsif ($cmd eq "fix") + { + if (weechat::config_get_plugin("output") eq "buffer" && $highmon_buffer eq "") + { + highmon_buffer_open(); + } + } + return weechat::WEECHAT_RC_OK; +} + +# Clean up config entries +sub highmon_config_clean +{ + $data = $_[0]; + $buffer = $_[1]; + $args = $_[2]; + + # Don't do anything if bad option given + if ($args ne "default" && $args ne "orphan" && $args ne "all") + { + weechat::print("", "\thighmon.pl: Unknown option"); + return weechat::WEECHAT_RC_OK; + } + + @chans = (); + # Load an infolist of highmon options + $infolist = weechat::infolist_get("option", "", "*highmon*"); + while (weechat::infolist_next($infolist)) + { + $name = weechat::infolist_string($infolist, "option_name"); + $name =~ s/perl\.highmon\.(\w*)\.([#&\+!])(.*)/$1.$2$3/; + if ($name =~ /^(.*)\.([#&\+!])(.*)$/) + { + $action = 0; + # Clean up all 'on's + if ($args eq "default" || $args eq "all") + { + # If value in config is "on" + if (weechat::config_get_plugin($name) eq "on") + { + # Unset and if successful flag as changed + $rc = weechat::config_unset_plugin($name); + if ($rc eq weechat::WEECHAT_CONFIG_OPTION_UNSET_OK_REMOVED) + { + $action = 1; + } + } + } + # Clean non joined + if ($args eq "orphan" || $args eq "all") + { + # If we can't find the buffer for this entry + if (weechat::buffer_search("irc", $name) eq "") + { + # Unset and if successful flag as changed + $rc = weechat::config_unset_plugin($name); + if ($rc eq weechat::WEECHAT_CONFIG_OPTION_UNSET_OK_REMOVED) + { + $action = 1; + } + } + } + # Add changed entry names to list + push (@chans, $name) if ($action); + } + } + weechat::infolist_free($infolist); + # If channels were cleaned from config + if (@chans) + { + # If only one entry + if (@chans == 1) + { + $str = "\thighmon.pl: Cleaned ".@chans." entry from the config:"; + } + else + { + $str = "\thighmon.pl: Cleaned ".@chans." entries from the config:"; + } + # Build a list of channels + foreach(@chans) + { + $str = $str." ".$_; + } + # Print what happened + weechat::print("",$str); + } + # Config seemed to be clean + else + { + weechat::print("", "\thighmon.pl: No entries removed"); + } + return weechat::WEECHAT_RC_OK; +} + +# Check config elements +sub highmon_config_init +{ + # First run default + if (!(weechat::config_is_set_plugin ("first_run"))) + { + if (weechat::config_get_plugin("first_run") ne "true") + { + weechat::print("", "\tThis appears to be the first time highmon has been run. For help and common set up hints see /highmon help"); + weechat::config_set_plugin("first_run", "true"); + } + } + # Alignment default + if (!(weechat::config_is_set_plugin ("alignment"))) + { + weechat::config_set_plugin("alignment", "channel"); + } + if (weechat::config_get_plugin("alignment") eq "") + { + weechat::config_set_plugin("alignment", "none"); + } + + # Short name default + if (!(weechat::config_is_set_plugin ("short_names"))) + { + weechat::config_set_plugin("short_names", "off"); + } + + # Coloured names default + if (!(weechat::config_is_set_plugin ("color_buf"))) + { + weechat::config_set_plugin("color_buf", "on"); + } + + # Hotlist show default + if (!(weechat::config_is_set_plugin ("hotlist_show"))) + { + weechat::config_set_plugin("hotlist_show", "off"); + } + + # Away only default + if (!(weechat::config_is_set_plugin ("away_only"))) + { + weechat::config_set_plugin("away_only", "off"); + } + + # highmon log default + if (!(weechat::config_is_set_plugin ("logging"))) + { + weechat::config_set_plugin("logging", "off"); + } + + # Output default + if (!(weechat::config_is_set_plugin ("output"))) + { + weechat::config_set_plugin("output", "buffer"); + } + + # Private message merging + if (!(weechat::config_is_set_plugin ("merge_private"))) + { + weechat::config_set_plugin("merge_private", "off"); + } + + # Set bar config in case output was set to "bar" before even changing the setting + if (weechat::config_get_plugin("output") eq "bar") + { + # Output bar lines default + if (!(weechat::config_is_set_plugin ("bar_lines"))) + { + weechat::config_set_plugin("bar_lines", "10"); + } + if (!(weechat::config_is_set_plugin ("bar_scrolldown"))) + { + weechat::config_set_plugin("bar_scrolldown", "off"); + } + } + + # Check for exisiting prefix/suffix chars, and setup accordingly + $prefix = weechat::config_get("irc.look.nick_prefix"); + $prefix = weechat::config_string($prefix); + $suffix = weechat::config_get("irc.look.nick_suffix"); + $suffix = weechat::config_string($suffix); + + if (!(weechat::config_is_set_plugin("nick_prefix"))) + { + if ($prefix eq "" && $suffix eq "") + { + weechat::config_set_plugin("nick_prefix", "<"); + } + else + { + weechat::config_set_plugin("nick_prefix", ""); + } + } + + if (!(weechat::config_is_set_plugin("nick_suffix"))) + { + if ($prefix eq "" && $suffix eq "") + { + weechat::config_set_plugin("nick_suffix", ">"); + } + else + { + weechat::config_set_plugin("nick_suffix", ""); + } + } +} + +# Get config updates +sub highmon_config_cb +{ + $point = $_[0]; + $name = $_[1]; + $value = $_[2]; + + $name =~ s/^plugins\.var\.perl\.highmon\.//; + + # Set logging on buffer + if ($name eq "logging") + { + # Search for pre-existing buffer + $highmon_buffer = weechat::buffer_search("perl", "highmon"); + if ($value eq "off") + { + weechat::buffer_set($highmon_buffer, "localvar_set_no_log", "1"); + } + else + { + weechat::buffer_set($highmon_buffer, "localvar_del_no_log", ""); + } + } + # Output changer + elsif ($name eq "output") + { + if ($value eq "bar") + { + # Search for pre-existing buffer + $highmon_buffer = weechat::buffer_search("perl", "highmon"); + # Close if it exists + if ($highmon_buffer ne "") + { + weechat::buffer_close($highmon_buffer) + } + + # Output bar lines default + if (!(weechat::config_is_set_plugin ("bar_lines"))) + { + weechat::config_set_plugin("bar_lines", "10"); + } + if (!(weechat::config_is_set_plugin ("bar_scrolldown"))) + { + weechat::config_set_plugin("bar_scrolldown", "off"); + } + # Make a bar if doesn't exist + highmon_bar_open(); + } + elsif ($value eq "buffer") + { + # If a bar exists, close it + highmon_bar_close(); + # Open buffer + highmon_buffer_open(); + } + + } + # Change if hotlist config changes + elsif ($name eq "hotlist_show") + { + # Search for pre-existing buffer + $highmon_buffer = weechat::buffer_search("perl", "highmon"); + if ($value eq "off" && $highmon_buffer) + { + weechat::buffer_set($highmon_buffer, "notify", "0"); + } + elsif ($value ne "off" && $highmon_buffer) + { + weechat::buffer_set($highmon_buffer, "notify", "3"); + } + } + elsif ($name eq "weechat.look.prefix_suffix") + { + if (weechat::config_get_plugin("output") eq "bar") + { + @bar_lines = (); + weechat::print("", "\thighmon: weechat.look.prefix_suffix changed, clearing highmon bar"); + weechat::bar_item_update("highmon"); + } + } + return weechat::WEECHAT_RC_OK; +} + +# Set up weechat hooks / commands +sub highmon_hook +{ + weechat::hook_print("", "", "", 0, "highmon_new_message", ""); + weechat::hook_command("highclean", "Highmon config clean up", "default|orphan|all", " default: Cleans all config entries with the default \"on\" value\n orphan: Cleans all config entries for channels you aren't currently joined\n all: Does both defaults and orphan", "default|orphan|all", "highmon_config_clean", ""); + + weechat::hook_command("highmon", "Highmon help", "[help] | [monitor [channel [server]]] | [clean default|orphan|all] | clearbar", " help: Print help on config options for highmon\n monitor: Toggles monitoring for a channel\n clean: Highmon config clean up (/highclean)\nclearbar: Clear Highmon bar", "help || monitor %(irc_channels) %(irc_servers) || clean default|orphan|all || clearbar", "highmon_command_cb", ""); + + weechat::hook_config("plugins.var.perl.highmon.*", "highmon_config_cb", ""); + weechat::hook_config("weechat.look.prefix_suffix", "highmon_config_cb", ""); +} + +# Main body, Callback for hook_print +sub highmon_new_message +{ + my $net = ""; + my $chan = ""; + my $nick = ""; + my $outstr = ""; + my $window_displayed = ""; + my $dyncheck = "0"; + +# DEBUG point +# $string = "\t"."0: ".$_[0]." 1: ".$_[1]." 2: ".$_[2]." 3: ".$_[3]." 4: ".$_[4]." 5: ".$_[5]." 6: ".$_[6]." 7: ".$_[7]; +# weechat::print("", "\t".$string); + + $cb_datap = $_[0]; + $cb_bufferp = $_[1]; + $cb_date = $_[2]; + $cb_tags = $_[3]; + $cb_disp = $_[4]; + $cb_high = $_[5]; + $cb_prefix = $_[6]; + $cb_msg = $_[7]; + + # Only work on highlighted messages or private message when enabled + if ($cb_high == "1" || (weechat::config_get_plugin("merge_private") eq "on" && $cb_tags =~ /notify_private/)) + { + # Pre bug #29618 (0.3.3) away detect + if (weechat::info_get("version_number", "") <= 197120) + { + $away = ''; + # Get infolist for this server + $infolist = weechat::infolist_get("irc_server", "", weechat::buffer_get_string($cb_bufferp, "localvar_server")); + while (weechat::infolist_next($infolist)) + { + # Get away message is is_away is on + $away = weechat::infolist_string($infolist, "away_message") if (weechat::infolist_integer($infolist, "is_away")); + } + weechat::infolist_free($infolist); + } + # Post bug #29618 fix + else + { + $away = weechat::buffer_get_string($cb_bufferp, "localvar_away"); + } + if (weechat::config_get_plugin("away_only") ne "on" || ($away ne "")) + { + # Check buffer name is an IRC channel + $bufname = weechat::buffer_get_string($cb_bufferp, 'name'); + if ($bufname =~ /(.*)\.([#&\+!])(.*)/) + { + # Are we running on this channel + if (weechat::config_get_plugin($bufname) ne "off" && $cb_disp eq "1") + { + # Format nick + # Line isn't action or topic notify + if (!($cb_tags =~ /irc_action/) && !($cb_tags =~ /irc_topic/)) + { + # Strip nick colour + $uncolnick = weechat::string_remove_color($cb_prefix, ""); + # Format nick + $nick = " ".weechat::config_get_plugin("nick_prefix").weechat::color("chat_highlight").$uncolnick.weechat::color("reset").weechat::config_get_plugin("nick_suffix"); + } + # Topic line + elsif ($cb_tags =~ /irc_topic/) + { + $nick = " ".$cb_prefix.weechat::color("reset"); + } + # Action line + else + { + $uncolnick = weechat::string_remove_color($cb_prefix, ""); + $nick = weechat::color("chat_highlight").$uncolnick.weechat::color("reset"); + } + # Send to output + highmon_print ($cb_msg, $cb_bufferp, $nick, $cb_date, $cb_tags); + } + } + # Or is private message + elsif (weechat::config_get_plugin("merge_private") eq "on" && $cb_tags =~ /notify_private/) + { + # Strip nick colour + $uncolnick = weechat::buffer_get_string($cb_bufferp, 'short_name'); + # Format nick + $nick = " ".weechat::config_get_plugin("nick_prefix").weechat::color("chat_highlight").$uncolnick.weechat::color("reset").weechat::config_get_plugin("nick_suffix"); + #Send to output + highmon_print ($cb_msg, $cb_bufferp, $nick, $cb_date, $cb_tags); + } + } + } + return weechat::WEECHAT_RC_OK; +} + +# Output formatter and printer takes (msg bufpointer nick) +sub highmon_print +{ + $cb_msg = $_[0]; + my $cb_bufferp = $_[1] if ($_[1]); + my $nick = $_[2] if ($_[2]); + my $cb_date = $_[3] if ($_[3]); + my $cb_tags = $_[4] if ($_[4]); + + #Normal channel message + if ($cb_bufferp && $nick) + { + # Format buffer name + $bufname = format_buffer_name($cb_bufferp); + + # If alignment is #channel | nick msg + if (weechat::config_get_plugin("alignment") eq "channel") + { + $nick =~ s/\s(.*)/$1/; + # Build string + $outstr = $bufname."\t".$nick." ".$cb_msg; + } + # or if it is channel number | nick msg + elsif (weechat::config_get_plugin("alignment") eq "schannel") + { + $nick =~ s/\s(.*)/$1/; + # Use channel number instead + $bufname = weechat::color("chat_prefix_buffer").weechat::buffer_get_integer($cb_bufferp, 'number').weechat::color("reset"); + # Build string + $outstr = $bufname."\t".$nick." ".$cb_msg; + } + # or if it is number:#channel | nick msg + elsif (weechat::config_get_plugin("alignment") eq "nchannel") + { + $nick =~ s/\s(.*)/$1/; + # Place channel number in front of formatted name + $bufname = weechat::color("chat_prefix_buffer").weechat::buffer_get_integer($cb_bufferp, 'number').":".weechat::color("reset").$bufname; + # Build string + $outstr = $bufname."\t".$nick." ".$cb_msg; + } + # or if it is #channel nick | msg + elsif (weechat::config_get_plugin("alignment") eq "channel,nick") + { + # Build string + $outstr = $bufname.":".$nick."\t".$cb_msg; + } + # or if it is channel number nick | msg + elsif (weechat::config_get_plugin("alignment") eq "schannel,nick") + { + # Use channel number instead + $bufname = weechat::color("chat_prefix_buffer").weechat::buffer_get_integer($cb_bufferp, 'number').weechat::color("reset"); + # Build string + $outstr = $bufname.":".$nick."\t".$cb_msg; + } + # or if it is number:#channel nick | msg + elsif (weechat::config_get_plugin("alignment") eq "nchannel,nick") + { + # Place channel number in front of formatted name + $bufname = weechat::color("chat_prefix_buffer").weechat::buffer_get_integer($cb_bufferp, 'number').":".weechat::color("reset").$bufname; + # Build string + $outstr = $bufname.":".$nick."\t".$cb_msg; + } + # or finally | #channel nick msg + else + { + # Build string + $outstr = "\t".$bufname.":".$nick." ".$cb_msg; + } + } + # highmon channel toggle message + elsif ($cb_bufferp && !$nick) + { + # Format buffer name + $bufname = format_buffer_name($cb_bufferp); + + # If alignment is #channel * | * + if (weechat::config_get_plugin("alignment") =~ /channel/) + { + # If it's actually channel number * | * + if (weechat::config_get_plugin("alignment") =~ /schannel/) + { + # Use channel number instead + $bufname = weechat::color("chat_prefix_buffer").weechat::buffer_get_integer($cb_bufferp, 'number').weechat::color("reset"); + } + # Or if it's actually number:#channel * | * + if (weechat::config_get_plugin("alignment") =~ /nchannel/) + { + # Place channel number in front of formatted name + $bufname = weechat::color("chat_prefix_buffer").weechat::buffer_get_integer($cb_bufferp, 'number').":".weechat::color("reset").$bufname; + } + $outstr = $bufname."\t".$cb_msg; + } + # or if alignment is | * + else + { + $outstr = $bufname.": ".$cb_msg; + } + } + # highmon dynmon + elsif (!$cb_bufferp && !$nick) + { + $outstr = "\t".$cb_msg; + } + + # Send string to buffer + if (weechat::config_get_plugin("output") eq "buffer") + { + # Search for and confirm buffer + $highmon_buffer = weechat::buffer_search("perl", "highmon"); + # Print + if ($cb_date) + { + weechat::print_date_tags($highmon_buffer, $cb_date, $cb_tags, $outstr); + } + else + { + weechat::print($highmon_buffer, $outstr); + } + } + elsif (weechat::config_get_plugin("output") eq "bar") + { + # Add time string + use POSIX qw(strftime); + if ($cb_date) + { + $time = strftime(weechat::config_string(weechat::config_get("weechat.look.buffer_time_format")), localtime($cb_date)); + } + else + { + $time = strftime(weechat::config_string(weechat::config_get("weechat.look.buffer_time_format")), localtime); + } + # Colourise + if ($time =~ /\$\{(?:color:)?[\w,]+\}/) # Coloured string + { + while ($time =~ /\$\{(?:color:)?([\w,]+)\}/) + { + $color = weechat::color($1); + $time =~ s/\$\{(?:color:)?[\w,]+\}/$color/; + } + $time .= weechat::color("reset"); + } + else # Default string + { + $colour = weechat::color(weechat::config_string(weechat::config_get("weechat.color.chat_time_delimiters"))); + $reset = weechat::color("reset"); + $time =~ s/(\d*)(.)(\d*)/$1$colour$2$reset$3/g; + } + # Push updates to bar lists + push (@bar_lines_time, $time); + + # Change tab char + $delim = " ".weechat::color(weechat::config_string(weechat::config_get("weechat.color.chat_delimiters"))).weechat::config_string(weechat::config_get("weechat.look.prefix_suffix")).weechat::color("reset")." "; + $outstr =~ s/\t/$delim/; + + push (@bar_lines, $outstr); + # Trigger update + weechat::bar_item_update("highmon"); + + if (weechat::config_get_plugin("bar_scrolldown") eq "on") + { + weechat::command("", "/bar scroll highmon * ye") + } + } +} + +# Start the output display +sub highmon_start +{ + if (weechat::config_get_plugin("output") eq "buffer") + { + highmon_buffer_open(); + } + elsif (weechat::config_get_plugin("output") eq "bar") + { + highmon_bar_open(); + } +} + +# Takes two optional args (channel server), toggles monitoring on/off +sub highmon_toggle +{ + $data = $_[0]; + $buffer = $_[1]; + $args = $_[2]; + + # Check if we've been told what channel to act on + if ($args ne "") + { + # Split argument up + @arg_array = split(/ /,$args); + # Check if a server was given + if ($arg_array[1]) + { + # Find matching + $bufp = weechat::buffer_search("irc", $arg_array[1].".".$arg_array[0]); + } + else + { + $found_chans = 0; + # Loop through defined servers + $infolist = weechat::infolist_get("buffer", "", ""); + while (weechat::infolist_next($infolist)) + { + # Only interesting in IRC buffers + if (weechat::infolist_string($infolist, "plugin_name") eq "irc") + { + # Find buffers that maych + $sname = weechat::infolist_string($infolist, "short_name"); + if ($sname eq $arg_array[0]) + { + $found_chans++; + $bufp = weechat::infolist_pointer($infolist, "pointer"); + } + } + } + weechat::infolist_free($infolist); + # If the infolist found more than one channel, halt as we need to know which one + if ($found_chans > 1) + { + weechat::print("", "Channel name is not unique, please define server"); + return weechat::WEECHAT_RC_OK; + } + } + # Something didn't return right + if ($bufp eq "") + { + weechat::print("", "Could not find buffer"); + return weechat::WEECHAT_RC_OK; + } + } + else + { + # Get pointer from where we are + $bufp = weechat::current_buffer(); + } + # Get buffer name + $bufname = weechat::buffer_get_string($bufp, 'name'); + # Test if buffer is an IRC channel + if ($bufname =~ /(.*)\.([#&\+!])(.*)/) + { + if (weechat::config_get_plugin($bufname) eq "off") + { + # If currently off, set on + weechat::config_set_plugin($bufname, "on"); + + # Send to output formatter + highmon_print("Highlight Monitoring Enabled", $bufp); + return weechat::WEECHAT_RC_OK; + } + elsif (weechat::config_get_plugin($bufname) eq "on" || weechat::config_get_plugin($bufname) eq "") + { + # If currently on, set off + weechat::config_set_plugin($bufname, "off"); + + # Send to output formatter + highmon_print("Highlight Monitoring Disabled", $bufp); + return weechat::WEECHAT_RC_OK; + } + } +} + +# Takes a buffer pointer and returns a formatted name +sub format_buffer_name +{ + $cb_bufferp = $_[0]; + $bufname = weechat::buffer_get_string($cb_bufferp, 'name'); + + # Set colour from buffer name + if (weechat::config_get_plugin("color_buf") eq "on") + { + # Determine what colour to use + $color = weechat::info_get("irc_nick_color", $bufname); + if (!$color) + { + $color = 0; + @char_array = split(//,$bufname); + foreach $char (@char_array) + { + $color += ord($char); + } + $color %= 10; + $color = sprintf "weechat.color.chat_nick_color%02d", $color+1; + $color = weechat::config_get($color); + $color = weechat::config_string($color); + $color = weechat::color($color); + } + + # Private message just show network + if (weechat::config_get_plugin("merge_private") eq "on" && weechat::buffer_get_string($cb_bufferp, "localvar_type") eq "private") + { + $bufname = weechat::buffer_get_string($cb_bufferp, "localvar_server"); + } + # Format name to short or 'nicename' + elsif (weechat::config_get_plugin("short_names") eq "on") + { + $bufname = weechat::buffer_get_string($cb_bufferp, 'short_name'); + } + else + { + $bufname =~ s/(.*)\.([#&\+!])(.*)/$1$2$3/; + } + + # Build a coloured string + $bufname = $color.$bufname.weechat::color("reset"); + } + # User set colour name + elsif (weechat::config_get_plugin("color_buf") ne "off") + { + # Private message just show network + if (weechat::config_get_plugin("merge_private") eq "on" && weechat::buffer_get_string($cb_bufferp, "localvar_type") eq "private") + { + $bufname = weechat::buffer_get_string($cb_bufferp, "localvar_server"); + } + # Format name to short or 'nicename' + elsif (weechat::config_get_plugin("short_names") eq "on") + { + $bufname = weechat::buffer_get_string($cb_bufferp, 'short_name'); + } + else + { + $bufname =~ s/(.*)\.([#&\+!])(.*)/$1$2$3/; + } + + $color = weechat::config_get_plugin("color_buf"); + $bufname = weechat::color($color).$bufname.weechat::color("reset"); + } + # Stick with default colour + else + { + # Private message just show network + if (weechat::config_get_plugin("merge_private") eq "on" && weechat::buffer_get_string($cb_bufferp, "localvar_type") eq "private") + { + $bufname = weechat::buffer_get_string($cb_bufferp, "localvar_server"); + } + # Format name to short or 'nicename' + elsif (weechat::config_get_plugin("short_names") eq "on") + { + $bufname = weechat::buffer_get_string($cb_bufferp, 'short_name'); + } + else + { + $bufname =~ s/(.*)\.([#&\+!])(.*)/$1$2$3/; + } + } + + return $bufname; +} + +# Check result of register, and attempt to behave in a sane manner +if (!weechat::register("highmon", "KenjiE20", "2.5", "GPL3", "Highlight Monitor", "", "")) +{ + # Double load + weechat::print ("", "\tHighmon is already loaded"); + return weechat::WEECHAT_RC_OK; +} +else +{ + # Start everything + highmon_hook(); + highmon_config_init(); + highmon_start(); +} diff --git a/weechat/.weechat/plugins.conf b/weechat/.weechat/plugins.conf new file mode 100644 index 0000000..84105c7 --- /dev/null +++ b/weechat/.weechat/plugins.conf @@ -0,0 +1,58 @@ +# +# weechat -- plugins.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use /set or similar command to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[var] +lua.check_license = "off" +perl.check_license = "off" +perl.highmon.alignment = "channel" +perl.highmon.away_only = "off" +perl.highmon.color_buf = "on" +perl.highmon.first_run = "true" +perl.highmon.hotlist_show = "off" +perl.highmon.logging = "off" +perl.highmon.merge_private = "off" +perl.highmon.nick_prefix = "<" +perl.highmon.nick_suffix = ">" +perl.highmon.output = "buffer" +perl.highmon.short_names = "off" +python.buffer_autoclose.age_limit = "30" +python.buffer_autoclose.ignore = "" +python.buffer_autoclose.interval = "1" +python.check_license = "off" +python.go.auto_jump = "off" +python.go.buffer_number = "on" +python.go.color_name = "black,cyan" +python.go.color_name_highlight = "red,cyan" +python.go.color_name_highlight_selected = "red,brown" +python.go.color_name_selected = "black,brown" +python.go.color_number = "yellow,magenta" +python.go.color_number_selected = "yellow,red" +python.go.fuzzy_search = "off" +python.go.message = "Go to: " +python.go.short_name = "off" +python.go.sort = "number,beginning" +python.go.use_core_instead_weechat = "off" +ruby.check_license = "off" + +[desc] +python.go.auto_jump = "automatically jump to buffer when it is uniquely selected (default: "off")" +python.go.buffer_number = "display buffer number (default: "on")" +python.go.color_name = "color for buffer name (not selected) (default: "black,cyan")" +python.go.color_name_highlight = "color for highlight in buffer name (not selected) (default: "red,cyan")" +python.go.color_name_highlight_selected = "color for highlight in a selected buffer name (default: "red,brown")" +python.go.color_name_selected = "color for a selected buffer name (default: "black,brown")" +python.go.color_number = "color for buffer number (not selected) (default: "yellow,magenta")" +python.go.color_number_selected = "color for selected buffer number (default: "yellow,red")" +python.go.fuzzy_search = "search buffer matches using approximation (default: "off")" +python.go.message = "message to display before list of buffers (default: "Go to: ")" +python.go.short_name = "display and search in short names instead of buffer name (default: "off")" +python.go.sort = "comma-separated list of keys to sort buffers (the order is important, sorts are performed in the given order): name = sort by name (or short name), (default: "number,beginning")" +python.go.use_core_instead_weechat = "use name "core" instead of "weechat" for core buffer (default: "off")" diff --git a/weechat/.weechat/python/autoload/buffer_autoclose.py b/weechat/.weechat/python/autoload/buffer_autoclose.py new file mode 120000 index 0000000..a639358 --- /dev/null +++ b/weechat/.weechat/python/autoload/buffer_autoclose.py @@ -0,0 +1 @@ +../buffer_autoclose.py \ No newline at end of file diff --git a/weechat/.weechat/python/autoload/colorize_nicks.py b/weechat/.weechat/python/autoload/colorize_nicks.py new file mode 120000 index 0000000..3ee34e9 --- /dev/null +++ b/weechat/.weechat/python/autoload/colorize_nicks.py @@ -0,0 +1 @@ +../colorize_nicks.py \ No newline at end of file diff --git a/weechat/.weechat/python/autoload/go.py b/weechat/.weechat/python/autoload/go.py new file mode 120000 index 0000000..bdfb7dd --- /dev/null +++ b/weechat/.weechat/python/autoload/go.py @@ -0,0 +1 @@ +../go.py \ No newline at end of file diff --git a/weechat/.weechat/python/autoload/urlgrab.py b/weechat/.weechat/python/autoload/urlgrab.py new file mode 120000 index 0000000..16cbe4d --- /dev/null +++ b/weechat/.weechat/python/autoload/urlgrab.py @@ -0,0 +1 @@ +../urlgrab.py \ No newline at end of file diff --git a/weechat/.weechat/python/buffer_autoclose.py b/weechat/.weechat/python/buffer_autoclose.py new file mode 100644 index 0000000..303f5b3 --- /dev/null +++ b/weechat/.weechat/python/buffer_autoclose.py @@ -0,0 +1,130 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2009 by xt +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# +# (this script requires WeeChat 0.3.0 or newer) +# +# History: +# 2016-02-05, ixti +# version 0.4: Add Python3 support +# 2009-12-15, xt +# version 0.3: moved around some control structures to not be as noisy +# 2009-12-02, xt +# version 0.2: bugfix, more printing +# 2009-12-01, xt +# version 0.1: initial release + +import weechat as w +import time + +SCRIPT_NAME = "buffer_autoclose" +SCRIPT_AUTHOR = "xt " +SCRIPT_VERSION = "0.4" +SCRIPT_LICENSE = "GPL3" +SCRIPT_DESC = "Automatically close inactive private message buffers" + +settings = { + 'interval': '1', # How often in minutes to check + 'age_limit': '30', # How old in minutes before auto close + 'ignore': '', # Buffers to ignore (use full name: server.buffer_name) +} + +if w.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE, + SCRIPT_DESC, "", ""): + for option, default_value in settings.items(): + if not w.config_is_set_plugin(option): + w.config_set_plugin(option, default_value) + w.hook_timer(\ + int(w.config_get_plugin('interval')) * 1000 * 60, + 0, + 0, + "close_time_cb", + '') + + +def get_all_buffers(): + '''Returns list with pointers of all open buffers.''' + buffers = [] + infolist = w.infolist_get('buffer', '', '') + while w.infolist_next(infolist): + buffer_type = w.buffer_get_string(w.infolist_pointer(infolist, 'pointer'), 'localvar_type') + if buffer_type == 'private': # we only close private message buffers for now + buffers.append(w.infolist_pointer(infolist, 'pointer')) + w.infolist_free(infolist) + return buffers + +def get_last_line_date(buffer): + date = '1970-01-01 01:00:00' + infolist = w.infolist_get('buffer_lines', buffer, '') + while w.infolist_prev(infolist): + date = w.infolist_time(infolist, 'date') + if date != '1970-01-01 01:00:00': + # Some lines like "Day changed to" message doesn't have date + # set so loop until we find a message that does + break + w.infolist_free(infolist) + return date + +def is_in_hotlist(buffer): + ''' Returns true if buffer is in hotlist, false if not''' + + hotlist = w.infolist_get('hotlist', '', '') + found = False + while w.infolist_next(hotlist): + thebuffer = w.infolist_pointer(hotlist, 'buffer_pointer') + if thebuffer == buffer: + found = True + name = w.buffer_get_string(thebuffer, 'short_name') + break + + w.infolist_free(hotlist) + return found + +def close_time_cb(buffer, args): + ''' Callback for check for inactivity and close ''' + + for buffer in get_all_buffers(): + name = w.buffer_get_string(buffer, 'name') + + + date = get_last_line_date(buffer) + date = time.mktime(time.strptime(date, '%Y-%m-%d %H:%M:%S')) + now = time.time() + seconds_old = now - date + if seconds_old > int(w.config_get_plugin('age_limit'))*60: + if is_in_hotlist(buffer): + #w.prnt('', '%s: Not closing buffer: %s: it is in hotlist' %(SCRIPT_NAME, name)) + continue + if name in w.config_get_plugin('ignore').split(','): + #w.prnt('', '%s: Not closing buffer: %s: it is in ignore list' %(SCRIPT_NAME, name)) + continue + if buffer == w.current_buffer(): + # Never close current buffer + #w.prnt('', '%s: Not closing buffer: %s: it is in currently active' %(SCRIPT_NAME, name)) + continue + if len(w.buffer_get_string(buffer, 'input')): + # Don't close buffers with text on input line + #w.prnt('', '%s: Not closing buffer: %s: it has input' %(SCRIPT_NAME, name)) + continue + + w.prnt('', '%s: Closing buffer: %s' %(SCRIPT_NAME, name)) + w.command(buffer, '/buffer close') + #else: + # w.prnt('', '%s: Not closing buffer: %s: it is too new: %s' %(SCRIPT_NAME, name, seconds_old)) + + return w.WEECHAT_RC_OK diff --git a/weechat/.weechat/python/colorize_nicks.py b/weechat/.weechat/python/colorize_nicks.py new file mode 100644 index 0000000..1460f01 --- /dev/null +++ b/weechat/.weechat/python/colorize_nicks.py @@ -0,0 +1,355 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2010 by xt +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# This script colors nicks in IRC channels in the actual message +# not just in the prefix section. +# +# +# History: +# 2017-03-01, arza +# version 23: don't colorize nicklist group names +# 2016-05-01, Simmo Saan +# version 22: invalidate cached colors on hash algorithm change +# 2015-07-28, xt +# version 21: fix problems with nicks with commas in them +# 2015-04-19, xt +# version 20: fix ignore of nicks in URLs +# 2015-04-18, xt +# version 19: new option ignore nicks in URLs +# 2015-03-03, xt +# version 18: iterate buffers looking for nicklists instead of servers +# 2015-02-23, holomorph +# version 17: fix coloring in non-channel buffers (#58) +# 2014-09-17, holomorph +# version 16: use weechat config facilities +# clean unused, minor linting, some simplification +# 2014-05-05, holomorph +# version 15: fix python2-specific re.search check +# 2013-01-29, nils_2 +# version 14: make script compatible with Python 3.x +# 2012-10-19, ldvx +# version 13: Iterate over every word to prevent incorrect colorization of +# nicks. Added option greedy_matching. +# 2012-04-28, ldvx +# version 12: added ignore_tags to avoid colorizing nicks if tags are present +# 2012-01-14, nesthib +# version 11: input_text_display hook and modifier to colorize nicks in input bar +# 2010-12-22, xt +# version 10: hook config option for updating blacklist +# 2010-12-20, xt +# version 0.9: hook new config option for weechat 0.3.4 +# 2010-11-01, nils_2 +# version 0.8: hook_modifier() added to communicate with rainbow_text +# 2010-10-01, xt +# version 0.7: changes to support non-irc-plugins +# 2010-07-29, xt +# version 0.6: compile regexp as per patch from Chris quigybo@hotmail.com +# 2010-07-19, xt +# version 0.5: fix bug with incorrect coloring of own nick +# 2010-06-02, xt +# version 0.4: update to reflect API changes +# 2010-03-26, xt +# version 0.3: fix error with exception +# 2010-03-24, xt +# version 0.2: use ignore_channels when populating to increase performance. +# 2010-02-03, xt +# version 0.1: initial (based on ruby script by dominikh) +# +# Known issues: nicks will not get colorized if they begin with a character +# such as ~ (which some irc networks do happen to accept) + +import weechat +import re +w = weechat + +SCRIPT_NAME = "colorize_nicks" +SCRIPT_AUTHOR = "xt " +SCRIPT_VERSION = "23" +SCRIPT_LICENSE = "GPL" +SCRIPT_DESC = "Use the weechat nick colors in the chat area" + +VALID_NICK = r'([@~&!%+])?([-a-zA-Z0-9\[\]\\`_^\{|\}]+)' +valid_nick_re = re.compile(VALID_NICK) +ignore_channels = [] +ignore_nicks = [] + +# Dict with every nick on every channel with its color as lookup value +colored_nicks = {} + +CONFIG_FILE_NAME = "colorize_nicks" + +# config file and options +colorize_config_file = "" +colorize_config_option = {} + +def colorize_config_init(): + ''' + Initialization of configuration file. + Sections: look. + ''' + global colorize_config_file, colorize_config_option + colorize_config_file = weechat.config_new(CONFIG_FILE_NAME, + "colorize_config_reload_cb", "") + if colorize_config_file == "": + return + + # section "look" + section_look = weechat.config_new_section( + colorize_config_file, "look", 0, 0, "", "", "", "", "", "", "", "", "", "") + if section_look == "": + weechat.config_free(colorize_config_file) + return + colorize_config_option["blacklist_channels"] = weechat.config_new_option( + colorize_config_file, section_look, "blacklist_channels", + "string", "Comma separated list of channels", "", 0, 0, + "", "", 0, "", "", "", "", "", "") + colorize_config_option["blacklist_nicks"] = weechat.config_new_option( + colorize_config_file, section_look, "blacklist_nicks", + "string", "Comma separated list of nicks", "", 0, 0, + "so,root", "so,root", 0, "", "", "", "", "", "") + colorize_config_option["min_nick_length"] = weechat.config_new_option( + colorize_config_file, section_look, "min_nick_length", + "integer", "Minimum length nick to colorize", "", + 2, 20, "", "", 0, "", "", "", "", "", "") + colorize_config_option["colorize_input"] = weechat.config_new_option( + colorize_config_file, section_look, "colorize_input", + "boolean", "Whether to colorize input", "", 0, + 0, "off", "off", 0, "", "", "", "", "", "") + colorize_config_option["ignore_tags"] = weechat.config_new_option( + colorize_config_file, section_look, "ignore_tags", + "string", "Comma separated list of tags to ignore; i.e. irc_join,irc_part,irc_quit", "", 0, 0, + "", "", 0, "", "", "", "", "", "") + colorize_config_option["greedy_matching"] = weechat.config_new_option( + colorize_config_file, section_look, "greedy_matching", + "boolean", "If off, then use lazy matching instead", "", 0, + 0, "on", "on", 0, "", "", "", "", "", "") + colorize_config_option["ignore_nicks_in_urls"] = weechat.config_new_option( + colorize_config_file, section_look, "ignore_nicks_in_urls", + "boolean", "If on, don't colorize nicks inside URLs", "", 0, + 0, "off", "off", 0, "", "", "", "", "", "") + +def colorize_config_read(): + ''' Read configuration file. ''' + global colorize_config_file + return weechat.config_read(colorize_config_file) + +def colorize_nick_color(nick, my_nick): + ''' Retrieve nick color from weechat. ''' + if nick == my_nick: + return w.color(w.config_string(w.config_get('weechat.color.chat_nick_self'))) + else: + return w.info_get('irc_nick_color', nick) + +def colorize_cb(data, modifier, modifier_data, line): + ''' Callback that does the colorizing, and returns new line if changed ''' + + global ignore_nicks, ignore_channels, colored_nicks + + + full_name = modifier_data.split(';')[1] + channel = '.'.join(full_name.split('.')[1:]) + + buffer = w.buffer_search('', full_name) + # Check if buffer has colorized nicks + if buffer not in colored_nicks: + return line + + if channel and channel in ignore_channels: + return line + + min_length = w.config_integer(colorize_config_option['min_nick_length']) + reset = w.color('reset') + + # Don't colorize if the ignored tag is present in message + tags_line = modifier_data.rsplit(';') + if len(tags_line) >= 3: + tags_line = tags_line[2].split(',') + for i in w.config_string(colorize_config_option['ignore_tags']).split(','): + if i in tags_line: + return line + + for words in valid_nick_re.findall(line): + nick = words[1] + # Check that nick is not ignored and longer than minimum length + if len(nick) < min_length or nick in ignore_nicks: + continue + + # Check that nick is in the dictionary colored_nicks + if nick in colored_nicks[buffer]: + nick_color = colored_nicks[buffer][nick] + + # Let's use greedy matching. Will check against every word in a line. + if w.config_boolean(colorize_config_option['greedy_matching']): + for word in line.split(): + if w.config_boolean(colorize_config_option['ignore_nicks_in_urls']) and \ + word.startswith(('http://', 'https://')): + continue + + if nick in word: + # Is there a nick that contains nick and has a greater lenght? + # If so let's save that nick into var biggest_nick + biggest_nick = "" + for i in colored_nicks[buffer]: + if nick in i and nick != i and len(i) > len(nick): + if i in word: + # If a nick with greater len is found, and that word + # also happens to be in word, then let's save this nick + biggest_nick = i + # If there's a nick with greater len, then let's skip this + # As we will have the chance to colorize when biggest_nick + # iterates being nick. + if len(biggest_nick) > 0 and biggest_nick in word: + pass + elif len(word) < len(biggest_nick) or len(biggest_nick) == 0: + new_word = word.replace(nick, '%s%s%s' % (nick_color, nick, reset)) + line = line.replace(word, new_word) + # Let's use lazy matching for nick + else: + nick_color = colored_nicks[buffer][nick] + # The two .? are in case somebody writes "nick:", "nick,", etc + # to address somebody + regex = r"(\A|\s).?(%s).?(\Z|\s)" % re.escape(nick) + match = re.search(regex, line) + if match is not None: + new_line = line[:match.start(2)] + nick_color+nick+reset + line[match.end(2):] + line = new_line + return line + +def colorize_input_cb(data, modifier, modifier_data, line): + ''' Callback that does the colorizing in input ''' + + global ignore_nicks, ignore_channels, colored_nicks + + min_length = w.config_integer(colorize_config_option['min_nick_length']) + + if not w.config_boolean(colorize_config_option['colorize_input']): + return line + + buffer = w.current_buffer() + # Check if buffer has colorized nicks + if buffer not in colored_nicks: + return line + + channel = w.buffer_get_string(buffer, 'name') + if channel and channel in ignore_channels: + return line + + reset = w.color('reset') + + for words in valid_nick_re.findall(line): + nick = words[1] + # Check that nick is not ignored and longer than minimum length + if len(nick) < min_length or nick in ignore_nicks: + continue + if nick in colored_nicks[buffer]: + nick_color = colored_nicks[buffer][nick] + line = line.replace(nick, '%s%s%s' % (nick_color, nick, reset)) + + return line + +def populate_nicks(*args): + ''' Fills entire dict with all nicks weechat can see and what color it has + assigned to it. ''' + global colored_nicks + + colored_nicks = {} + + buffers = w.infolist_get('buffer', '', '') + while w.infolist_next(buffers): + buffer_ptr = w.infolist_pointer(buffers, 'pointer') + my_nick = w.buffer_get_string(buffer_ptr, 'localvar_nick') + nicklist = w.infolist_get('nicklist', buffer_ptr, '') + while w.infolist_next(nicklist): + if buffer_ptr not in colored_nicks: + colored_nicks[buffer_ptr] = {} + + if w.infolist_string(nicklist, 'type') != 'nick': + continue + + nick = w.infolist_string(nicklist, 'name') + nick_color = colorize_nick_color(nick, my_nick) + + colored_nicks[buffer_ptr][nick] = nick_color + + w.infolist_free(nicklist) + + w.infolist_free(buffers) + + return w.WEECHAT_RC_OK + +def add_nick(data, signal, type_data): + ''' Add nick to dict of colored nicks ''' + global colored_nicks + + # Nicks can have , in them in some protocols + splitted = type_data.split(',') + pointer = splitted[0] + nick = ",".join(splitted[1:]) + if pointer not in colored_nicks: + colored_nicks[pointer] = {} + + my_nick = w.buffer_get_string(pointer, 'localvar_nick') + nick_color = colorize_nick_color(nick, my_nick) + + colored_nicks[pointer][nick] = nick_color + + return w.WEECHAT_RC_OK + +def remove_nick(data, signal, type_data): + ''' Remove nick from dict with colored nicks ''' + global colored_nicks + + # Nicks can have , in them in some protocols + splitted = type_data.split(',') + pointer = splitted[0] + nick = ",".join(splitted[1:]) + + if pointer in colored_nicks and nick in colored_nicks[pointer]: + del colored_nicks[pointer][nick] + + return w.WEECHAT_RC_OK + +def update_blacklist(*args): + ''' Set the blacklist for channels and nicks. ''' + global ignore_channels, ignore_nicks + ignore_channels = w.config_string(colorize_config_option['blacklist_channels']).split(',') + ignore_nicks = w.config_string(colorize_config_option['blacklist_nicks']).split(',') + return w.WEECHAT_RC_OK + +if __name__ == "__main__": + if w.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE, + SCRIPT_DESC, "", ""): + colorize_config_init() + colorize_config_read() + + # Run once to get data ready + update_blacklist() + populate_nicks() + + w.hook_signal('nicklist_nick_added', 'add_nick', '') + w.hook_signal('nicklist_nick_removed', 'remove_nick', '') + w.hook_modifier('weechat_print', 'colorize_cb', '') + # Hook config for changing colors + w.hook_config('weechat.color.chat_nick_colors', 'populate_nicks', '') + w.hook_config('weechat.look.nick_color_hash', 'populate_nicks', '') + # Hook for working togheter with other scripts (like colorize_lines) + w.hook_modifier('colorize_nicks', 'colorize_cb', '') + # Hook for modifying input + w.hook_modifier('250|input_text_display', 'colorize_input_cb', '') + # Hook for updating blacklist (this could be improved to use fnmatch) + weechat.hook_config('%s.look.blacklist*' % SCRIPT_NAME, 'update_blacklist', '') diff --git a/weechat/.weechat/python/go.py b/weechat/.weechat/python/go.py new file mode 100644 index 0000000..a30f58f --- /dev/null +++ b/weechat/.weechat/python/go.py @@ -0,0 +1,561 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2009-2014 Sébastien Helleu +# Copyright (C) 2010 m4v +# Copyright (C) 2011 stfn +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# +# History: +# +# 2017-04-01, Sébastien Helleu : +# version 2.5: add option "buffer_number" +# 2017-03-02, Sébastien Helleu : +# version 2.4: fix syntax and indentation error +# 2017-02-25, Simmo Saan +# version 2.3: fix fuzzy search breaking buffer number search display +# 2016-01-28, ylambda +# version 2.2: add option "fuzzy_search" +# 2015-11-12, nils_2 +# version 2.1: fix problem with buffer short_name "weechat", using option +# "use_core_instead_weechat", see: +# https://github.com/weechat/weechat/issues/574 +# 2014-05-12, Sébastien Helleu : +# version 2.0: add help on options, replace option "sort_by_activity" by +# "sort" (add sort by name and first match at beginning of +# name and by number), PEP8 compliance +# 2012-11-26, Nei +# version 1.9: add auto_jump option to automatically go to buffer when it +# is uniquely selected +# 2012-09-17, Sébastien Helleu : +# version 1.8: fix jump to non-active merged buffers (jump with buffer name +# instead of number) +# 2012-01-03 nils_2 +# version 1.7: add option "use_core_instead_weechat" +# 2012-01-03, Sébastien Helleu : +# version 1.6: make script compatible with Python 3.x +# 2011-08-24, stfn : +# version 1.5: /go with name argument jumps directly to buffer +# Remember cursor position in buffer input +# 2011-05-31, Elián Hanisch : +# version 1.4: Sort list of buffers by activity. +# 2011-04-25, Sébastien Helleu : +# version 1.3: add info "go_running" (used by script input_lock.rb) +# 2010-11-01, Sébastien Helleu : +# version 1.2: use high priority for hooks to prevent conflict with other +# plugins/scripts (WeeChat >= 0.3.4 only) +# 2010-03-25, Elián Hanisch : +# version 1.1: use a space to match the end of a string +# 2009-11-16, Sébastien Helleu : +# version 1.0: add new option to display short names +# 2009-06-15, Sébastien Helleu : +# version 0.9: fix typo in /help go with command /key +# 2009-05-16, Sébastien Helleu : +# version 0.8: search buffer by number, fix bug when window is split +# 2009-05-03, Sébastien Helleu : +# version 0.7: eat tab key (do not complete input, just move buffer +# pointer) +# 2009-05-02, Sébastien Helleu : +# version 0.6: sync with last API changes +# 2009-03-22, Sébastien Helleu : +# version 0.5: update modifier signal name for input text display, +# fix arguments for function string_remove_color +# 2009-02-18, Sébastien Helleu : +# version 0.4: do not hook command and init options if register failed +# 2009-02-08, Sébastien Helleu : +# version 0.3: case insensitive search for buffers names +# 2009-02-08, Sébastien Helleu : +# version 0.2: add help about Tab key +# 2009-02-08, Sébastien Helleu : +# version 0.1: initial release +# + +""" +Quick jump to buffers. +(this script requires WeeChat 0.3.0 or newer) +""" + +from __future__ import print_function + +SCRIPT_NAME = 'go' +SCRIPT_AUTHOR = 'Sébastien Helleu ' +SCRIPT_VERSION = '2.5' +SCRIPT_LICENSE = 'GPL3' +SCRIPT_DESC = 'Quick jump to buffers' + +SCRIPT_COMMAND = 'go' + +IMPORT_OK = True + +try: + import weechat +except ImportError: + print('This script must be run under WeeChat.') + print('Get WeeChat now at: http://www.weechat.org/') + IMPORT_OK = False + +import re + +# script options +SETTINGS = { + 'color_number': ( + 'yellow,magenta', + 'color for buffer number (not selected)'), + 'color_number_selected': ( + 'yellow,red', + 'color for selected buffer number'), + 'color_name': ( + 'black,cyan', + 'color for buffer name (not selected)'), + 'color_name_selected': ( + 'black,brown', + 'color for a selected buffer name'), + 'color_name_highlight': ( + 'red,cyan', + 'color for highlight in buffer name (not selected)'), + 'color_name_highlight_selected': ( + 'red,brown', + 'color for highlight in a selected buffer name'), + 'message': ( + 'Go to: ', + 'message to display before list of buffers'), + 'short_name': ( + 'off', + 'display and search in short names instead of buffer name'), + 'sort': ( + 'number,beginning', + 'comma-separated list of keys to sort buffers ' + '(the order is important, sorts are performed in the given order): ' + 'name = sort by name (or short name), ', + 'hotlist = sort by hotlist order, ' + 'number = first match a buffer number before digits in name, ' + 'beginning = first match at beginning of names (or short names); ' + 'the default sort of buffers is by numbers'), + 'use_core_instead_weechat': ( + 'off', + 'use name "core" instead of "weechat" for core buffer'), + 'auto_jump': ( + 'off', + 'automatically jump to buffer when it is uniquely selected'), + 'fuzzy_search': ( + 'off', + 'search buffer matches using approximation'), + 'buffer_number': ( + 'on', + 'display buffer number'), +} + +# hooks management +HOOK_COMMAND_RUN = { + 'input': ('/input *', 'go_command_run_input'), + 'buffer': ('/buffer *', 'go_command_run_buffer'), + 'window': ('/window *', 'go_command_run_window'), +} +hooks = {} + +# input before command /go (we'll restore it later) +saved_input = '' +saved_input_pos = 0 + +# last user input (if changed, we'll update list of matching buffers) +old_input = None + +# matching buffers +buffers = [] +buffers_pos = 0 + + +def go_option_enabled(option): + """Checks if a boolean script option is enabled or not.""" + return weechat.config_string_to_boolean(weechat.config_get_plugin(option)) + + +def go_info_running(data, info_name, arguments): + """Returns "1" if go is running, otherwise "0".""" + return '1' if 'modifier' in hooks else '0' + + +def go_unhook_one(hook): + """Unhook something hooked by this script.""" + global hooks + if hook in hooks: + weechat.unhook(hooks[hook]) + del hooks[hook] + + +def go_unhook_all(): + """Unhook all.""" + go_unhook_one('modifier') + for hook in HOOK_COMMAND_RUN: + go_unhook_one(hook) + + +def go_hook_all(): + """Hook command_run and modifier.""" + global hooks + priority = '' + version = weechat.info_get('version_number', '') or 0 + # use high priority for hook to prevent conflict with other plugins/scripts + # (WeeChat >= 0.3.4 only) + if int(version) >= 0x00030400: + priority = '2000|' + for hook, value in HOOK_COMMAND_RUN.items(): + if hook not in hooks: + hooks[hook] = weechat.hook_command_run( + '%s%s' % (priority, value[0]), + value[1], '') + if 'modifier' not in hooks: + hooks['modifier'] = weechat.hook_modifier( + 'input_text_display_with_cursor', 'go_input_modifier', '') + + +def go_start(buf): + """Start go on buffer.""" + global saved_input, saved_input_pos, old_input, buffers_pos + go_hook_all() + saved_input = weechat.buffer_get_string(buf, 'input') + saved_input_pos = weechat.buffer_get_integer(buf, 'input_pos') + weechat.buffer_set(buf, 'input', '') + old_input = None + buffers_pos = 0 + + +def go_end(buf): + """End go on buffer.""" + global saved_input, saved_input_pos, old_input + go_unhook_all() + weechat.buffer_set(buf, 'input', saved_input) + weechat.buffer_set(buf, 'input_pos', str(saved_input_pos)) + old_input = None + + +def go_match_beginning(buf, string): + """Check if a string matches the beginning of buffer name/short name.""" + if not string: + return False + esc_str = re.escape(string) + if re.search(r'^#?' + esc_str, buf['name']) \ + or re.search(r'^#?' + esc_str, buf['short_name']): + return True + return False + + +def go_match_fuzzy(name, string): + """Check if string matches name using approximation.""" + if not string: + return False + + name_len = len(name) + string_len = len(string) + + if string_len > name_len: + return False + if name_len == string_len: + return name == string + + # Attempt to match all chars somewhere in name + prev_index = -1 + for i, char in enumerate(string): + index = name.find(char, prev_index+1) + if index == -1: + return False + prev_index = index + return True + + +def go_now(buf, args): + """Go to buffer specified by args.""" + listbuf = go_matching_buffers(args) + if not listbuf: + return + + # prefer buffer that matches at beginning (if option is enabled) + if 'beginning' in weechat.config_get_plugin('sort').split(','): + for index in range(len(listbuf)): + if go_match_beginning(listbuf[index], args): + weechat.command(buf, + '/buffer ' + str(listbuf[index]['full_name'])) + return + + # jump to first buffer in matching buffers by default + weechat.command(buf, '/buffer ' + str(listbuf[0]['full_name'])) + + +def go_cmd(data, buf, args): + """Command "/go": just hook what we need.""" + global hooks + if args: + go_now(buf, args) + elif 'modifier' in hooks: + go_end(buf) + else: + go_start(buf) + return weechat.WEECHAT_RC_OK + + +def go_matching_buffers(strinput): + """Return a list with buffers matching user input.""" + global buffers_pos + listbuf = [] + if len(strinput) == 0: + buffers_pos = 0 + strinput = strinput.lower() + infolist = weechat.infolist_get('buffer', '', '') + while weechat.infolist_next(infolist): + short_name = weechat.infolist_string(infolist, 'short_name') + if go_option_enabled('short_name'): + name = weechat.infolist_string(infolist, 'short_name') + else: + name = weechat.infolist_string(infolist, 'name') + if name == 'weechat' \ + and go_option_enabled('use_core_instead_weechat') \ + and weechat.infolist_string(infolist, 'plugin_name') == 'core': + name = 'core' + number = weechat.infolist_integer(infolist, 'number') + full_name = weechat.infolist_string(infolist, 'full_name') + if not full_name: + full_name = '%s.%s' % ( + weechat.infolist_string(infolist, 'plugin_name'), + weechat.infolist_string(infolist, 'name')) + pointer = weechat.infolist_pointer(infolist, 'pointer') + matching = name.lower().find(strinput) >= 0 + if not matching and strinput[-1] == ' ': + matching = name.lower().endswith(strinput.strip()) + if not matching and go_option_enabled('fuzzy_search'): + matching = go_match_fuzzy(name.lower(), strinput) + if not matching and strinput.isdigit(): + matching = str(number).startswith(strinput) + if len(strinput) == 0 or matching: + listbuf.append({ + 'number': number, + 'short_name': short_name, + 'name': name, + 'full_name': full_name, + 'pointer': pointer, + }) + weechat.infolist_free(infolist) + + # sort buffers + hotlist = [] + infolist = weechat.infolist_get('hotlist', '', '') + while weechat.infolist_next(infolist): + hotlist.append( + weechat.infolist_pointer(infolist, 'buffer_pointer')) + weechat.infolist_free(infolist) + last_index_hotlist = len(hotlist) + + def _sort_name(buf): + """Sort buffers by name (or short name).""" + return buf['name'] + + def _sort_hotlist(buf): + """Sort buffers by hotlist order.""" + try: + return hotlist.index(buf['pointer']) + except ValueError: + # not in hotlist, always last. + return last_index_hotlist + + def _sort_match_number(buf): + """Sort buffers by match on number.""" + return 0 if str(buf['number']) == strinput else 1 + + def _sort_match_beginning(buf): + """Sort buffers by match at beginning.""" + return 0 if go_match_beginning(buf, strinput) else 1 + + funcs = { + 'name': _sort_name, + 'hotlist': _sort_hotlist, + 'number': _sort_match_number, + 'beginning': _sort_match_beginning, + } + + for key in weechat.config_get_plugin('sort').split(','): + if key in funcs: + listbuf = sorted(listbuf, key=funcs[key]) + + if not strinput: + index = [i for i, buf in enumerate(listbuf) + if buf['pointer'] == weechat.current_buffer()] + if index: + buffers_pos = index[0] + + return listbuf + + +def go_buffers_to_string(listbuf, pos, strinput): + """Return string built with list of buffers found (matching user input).""" + string = '' + strinput = strinput.lower() + for i in range(len(listbuf)): + selected = '_selected' if i == pos else '' + buffer_name = listbuf[i]['name'] + index = buffer_name.lower().find(strinput) + if index >= 0: + index2 = index + len(strinput) + name = '%s%s%s%s%s' % ( + buffer_name[:index], + weechat.color(weechat.config_get_plugin( + 'color_name_highlight' + selected)), + buffer_name[index:index2], + weechat.color(weechat.config_get_plugin( + 'color_name' + selected)), + buffer_name[index2:]) + elif go_option_enabled("fuzzy_search") and \ + go_match_fuzzy(buffer_name.lower(), strinput): + name = "" + prev_index = -1 + for char in strinput.lower(): + index = buffer_name.lower().find(char, prev_index+1) + if prev_index < 0: + name += buffer_name[:index] + name += weechat.color(weechat.config_get_plugin( + 'color_name_highlight' + selected)) + if prev_index >= 0 and index > prev_index+1: + name += weechat.color(weechat.config_get_plugin( + 'color_name' + selected)) + name += buffer_name[prev_index+1:index] + name += weechat.color(weechat.config_get_plugin( + 'color_name_highlight' + selected)) + name += buffer_name[index] + prev_index = index + + name += weechat.color(weechat.config_get_plugin( + 'color_name' + selected)) + name += buffer_name[prev_index+1:] + else: + name = buffer_name + string += ' ' + if go_option_enabled('buffer_number'): + string += '%s%s' % ( + weechat.color(weechat.config_get_plugin( + 'color_number' + selected)), + str(listbuf[i]['number'])) + string += '%s%s%s' % ( + weechat.color(weechat.config_get_plugin( + 'color_name' + selected)), + name, + weechat.color('reset')) + return ' ' + string if string else '' + + +def go_input_modifier(data, modifier, modifier_data, string): + """This modifier is called when input text item is built by WeeChat. + + This is commonly called after changes in input or cursor move: it builds + a new input with prefix ("Go to:"), and suffix (list of buffers found). + """ + global old_input, buffers, buffers_pos + if modifier_data != weechat.current_buffer(): + return '' + names = '' + new_input = weechat.string_remove_color(string, '') + new_input = new_input.lstrip() + if old_input is None or new_input != old_input: + old_buffers = buffers + buffers = go_matching_buffers(new_input) + if buffers != old_buffers and len(new_input) > 0: + if len(buffers) == 1 and go_option_enabled('auto_jump'): + weechat.command(modifier_data, '/wait 1ms /input return') + buffers_pos = 0 + old_input = new_input + names = go_buffers_to_string(buffers, buffers_pos, new_input.strip()) + return weechat.config_get_plugin('message') + string + names + + +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 go_command_run_buffer(data, buf, command): + """Function called when a command "/buffer xxx" is run.""" + return weechat.WEECHAT_RC_OK_EAT + + +def go_command_run_window(data, buf, command): + """Function called when a command "/window xxx" is run.""" + return weechat.WEECHAT_RC_OK_EAT + + +def go_unload_script(): + """Function called when script is unloaded.""" + go_unhook_all() + return weechat.WEECHAT_RC_OK + + +def go_main(): + """Entry point.""" + if not weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, + SCRIPT_LICENSE, SCRIPT_DESC, + 'go_unload_script', ''): + return + weechat.hook_command( + SCRIPT_COMMAND, + 'Quick jump to buffers', '[name]', + 'name: directly jump to buffer by name (without argument, list is ' + 'displayed)\n\n' + 'You can bind command to a key, for example:\n' + ' /key bind meta-g /go\n\n' + 'You can use completion key (commonly Tab and shift-Tab) to select ' + 'next/previous buffer in list.', + '%(buffers_names)', + 'go_cmd', '') + + # set default settings + version = weechat.info_get('version_number', '') or 0 + for option, value in SETTINGS.items(): + if not weechat.config_is_set_plugin(option): + weechat.config_set_plugin(option, value[0]) + if int(version) >= 0x00030500: + weechat.config_set_desc_plugin( + option, '%s (default: "%s")' % (value[1], value[0])) + weechat.hook_info('go_running', + 'Return "1" if go is running, otherwise "0"', + '', + 'go_info_running', '') + + +if __name__ == "__main__" and IMPORT_OK: + go_main() diff --git a/weechat/.weechat/python/urlgrab.py b/weechat/.weechat/python/urlgrab.py new file mode 100644 index 0000000..b4dc8e6 --- /dev/null +++ b/weechat/.weechat/python/urlgrab.py @@ -0,0 +1,687 @@ +# +# UrlGrab, for weechat version >= 0.3.0 +# +# Listens to all channels for URLs, collects them in a list, and launches +# them in your favourite web server on the local host or a remote server. +# Copies url to X11 clipboard via xsel +# (http://www.vergenet.net/~conrad/software/xsel) +# +# Usage: +# +# The /url command provides access to all UrlGrab functions. Run +# '/help url' for complete command usage. +# +# In general, use '/url list' to list the entire url list for the current +# channel, and '/url ' to launch the nth url in the list. For +# example, to launch the first (and most-recently added) url in the list, +# you would run '/url 1' +# +# From the server window, you must specify a specific channel for the +# list and launch commands, for example: +# /url list weechat +# /url 3 weechat +# +# Configuration: +# +# The '/url set' command lets you get and set the following options: +# +# historysize +# The maximum number of URLs saved per channel. Default is 10 +# +# method +# Must be one of 'local' or 'remote' - Defines how URLs are launched by +# the script. If 'local', the script will run 'localcmd' on the host. +# If 'remote', the script will run 'remotessh remotehost remotecmd' on +# the local host which should normally use ssh to connect to another +# host and run the browser command there. +# +# localcmd +# The command to run on the local host to launch URLs in 'local' mode. +# The string '%s' will be replaced with the URL. The default is +# 'firefox %s'. +# +# remotessh +# The command (and arguments) used to connect to the remote host for +# 'remote' mode. The default is 'ssh -x' which will connect as the +# current username via ssh and disable X11 forwarding. +# +# remotehost +# The remote host to which we will connect in 'remote' mode. For ssh, +# this can just be a hostname or 'user@host' to specify a username +# other than your current login name. The default is 'localhost'. +# +# remotecmd +# The command to execute on the remote host for 'remote' mode. The +# default is 'bash -c "DISPLAY=:0.0 firefox '%s'"' Which runs bash, sets +# up the environment to display on the remote host's main X display, +# and runs firefox. As with 'localcmd', the string '%s' will be +# replaced with the URL. +# +# cmdoutput +# The file where the command output (if any) is saved. Overwritten +# each time you launch a new URL. Default is ~/.weechat/urllaunch.log +# +# default +# The command that will be run if no arguemnts to /url are given. +# Default is show +# +# Requirements: +# +# - Designed to run with weechat version 0.3 or better. +# http://www.weechat.org/ +# +# Acknowlegements: +# +# - Based on an earlier version called 'urlcollector.py' by 'kolter' of +# irc.freenode.net/#weechat Honestly, I just cleaned up the code a bit and +# made the settings a little more useful (to me). +# +# - With changes by Leonid Evdokimov (weechat at darkk dot net another dot ru): +# http://darkk.net.ru/weechat/urlgrab.py +# v1.1: added better handling of dead zombie-childs +# added parsing of private messages +# added default command setting +# added parsing of scrollback buffers on load +# v1.2: `historysize` was ignored +# +# - With changes by ExclusivE (exclusive_tm at mail dot ru): +# v1.3: X11 clipboard support +# +# - V1.4 Just ported it over to weechat 0.2.7 drubin AT smartcube dot co dot za +# - V1.5 1) I created a logging feature for urls, Time, Date, buffer, and url. +# 2) Added selectable urls support, similar to the iset plugin (Thanks FlashCode) +# 3) Colors/formats are configuarable. +# 4) browser now uses hook_process (Please test with remote clients) +# 5) Added /url open http://url.com functionality +# 6) Changed urls detection to use regexpressions so should be much better +# Thanks to xt of #weechat bassed on on urlbar.py +# - V1.6 FlashCode : Increase timeout for hook_process +# (from 1 second to 1 minute) +# - V1.7 FlashCode : Update WeeChat site +# - V1.8 drubin : +# - Changed remote cmd to be single option +# - Added scrolling on up and down arrow keys for /url show +# - Changed remotecmd to include options with public/private keys password auth doesn't work +# - V1.9 Specimen : +# - Changed the default command when /url is run with no arguments to 'show' +# - Removed '/url help' command, because /help is the standard way +# - V2.0 Xilov: replace "/url help" by "/help url" +# - V2.1 nand: Changed default: firefox %s to firefox '%s' (localcmd) +# - V2.2 Sebastien Helleu : fix reload of config file +# - V2.3 nand: Allowed trailing )s for unmatched (s in URLs +# - V2.4 nand: Escaped URLs via URL-encoding instead of shell escaping, fixes ' +# - V2.5 nand: Fixed some URLs that got incorrectly mangled by escaping +# - V2.6 nesthib: Fixed escaping of "=" +# Added missing quotes in default parameter (firefox '%s') +# Removed the mix of tabs and spaces in the file indentation +# - V2.7 dobbymoodge +# ( https://github.com/dobbymoodge/ ): +# - Added 'copycmd' setting, users can set command to pipe into +# for '/url copy' +# - V2.8 Simmo Saan : +# - Changed print hook to ignore filtered lines +# +# Copyright (C) 2005 David Rubin +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +# USA. +# + +import sys +import os +try: + import weechat + import_ok = True +except: + print "This script must be run under WeeChat." + print "Get WeeChat now at: http://www.weechat.org/" + import_ok = False +import subprocess +import time +import urllib +import re +from UserDict import UserDict + + +octet = r'(?:2(?:[0-4]\d|5[0-5])|1\d\d|\d{1,2})' +ipAddr = r'%s(?:\.%s){3}' % (octet, octet) +# Base domain regex off RFC 1034 and 1738 +label = r'[0-9a-z][-0-9a-z]*[0-9a-z]?' +domain = r'%s(?:\.%s)*\.[a-z][-0-9a-z]*[a-z]?' % (label, label) +urlRe = re.compile(r'(\w+://(?:%s|%s)(?::\d+)?(?:/[^\]>\s]*)?)' % (domain, ipAddr), re.I) + + +SCRIPT_NAME = "urlgrab" +SCRIPT_AUTHOR = "David Rubin " +SCRIPT_VERSION = "2.8" +SCRIPT_LICENSE = "GPL" +SCRIPT_DESC = "Url functionality Loggin, opening of browser, selectable links" +CONFIG_FILE_NAME= "urlgrab" +SCRIPT_COMMAND = "url" + + +def stripParens(url): + return dropChar(')', url.count(')') - url.count('('), url[::-1])[::-1] + +def dropChar(c, n, xs): + if n == 0 or xs == []: + return xs + elif xs[0] == c: + return dropChar(c, n-1, xs[1:]) + else: + return xs + +def urlGrabPrint(message): + bufferd=weechat.current_buffer() + if urlGrabSettings['output_main_buffer'] == 1 : + weechat.prnt("","[%s] %s" % ( SCRIPT_NAME, message ) ) + else : + weechat.prnt(bufferd,"[%s] %s" % ( SCRIPT_NAME, message ) ) + +def hashBufferName(bufferp): + if not weechat.buffer_get_string(bufferp, "short_name"): + bufferd = weechat.buffer_get_string(bufferp, "name") + else: + bufferd = weechat.buffer_get_string(bufferp, "short_name") + return bufferd + +def ug_config_reload_cb(data, config_file): + """ Reload configuration file. """ + return weechat.config_reload(config_file) + +class UrlGrabSettings(UserDict): + def __init__(self): + UserDict.__init__(self) + self.data = {} + self.config_file = weechat.config_new(CONFIG_FILE_NAME, + "ug_config_reload_cb", "") + if not self.config_file: + return + + section_color = weechat.config_new_section( + self.config_file, "color", 0, 0, "", "", "", "", "", "", + "", "", "", "") + section_default = weechat.config_new_section( + self.config_file, "default", 0, 0, "", "", "", "", "", "", + "", "", "", "") + + self.data['color_buffer']=weechat.config_new_option( + self.config_file, section_color, + "color_buffer", "color", "Color to display buffer name", "", 0, 0, + "red", "red", 0, "", "", "", "", "", "") + + self.data['color_url']=weechat.config_new_option( + self.config_file, section_color, + "color_url", "color", "Color to display urls", "", 0, 0, + "blue", "blue", 0, "", "", "", "", "", "") + + self.data['color_time']=weechat.config_new_option( + self.config_file, section_color, + "color_time", "color", "Color to display time", "", 0, 0, + "cyan", "cyan", 0, "", "", "", "", "", "") + + self.data['color_buffer_selected']=weechat.config_new_option( + self.config_file, section_color, + "color_buffer_selected", "color", + "Color to display buffer selected name", "", 0, 0, "red", "red", + 0, "", "", "", "", "", "") + + self.data['color_url_selected']=weechat.config_new_option( + self.config_file, section_color, + "color_url_selected", "color", "Color to display url selected", + "", 0, 0, "blue", "blue", 0, "", "", "", "", "", "") + + self.data['color_time_selected']=weechat.config_new_option( + self.config_file, section_color, + "color_time_selected", "color", "Color to display tim selected", + "", 0, 0, "cyan", "cyan", 0, "", "", "", "", "", "") + + self.data['color_bg_selected']=weechat.config_new_option( + self.config_file, section_color, + "color_bg_selected", "color", "Background for selected row", "", 0, 0, + "green", "green", 0, "", "", "", "", "", "") + + self.data['historysize']=weechat.config_new_option( + self.config_file, section_default, + "historysize", "integer", "Max number of urls to store per buffer", + "", 0, 999, "10", "10", 0, "", "", "", "", "", "") + + self.data['method']=weechat.config_new_option( + self.config_file, section_default, + "method", "string", """Where to launch URLs + If 'local', runs %localcmd%. + If 'remote' runs the following command: + '%remodecmd%'""", "", 0, 0, + "local", "local", 0, "", "", "", "", "", "") + + self.data['copycmd']=weechat.config_new_option( + self.config_file, section_default, + "copycmd", "string", + "Command to pipe into for 'url copy'. " + "E.g. to copy into the CLIPBOARD buffer " + "instead of PRIMARY, you can use 'xsel -b " + "-i' here.", "", 0, 0, + "xsel -i", "xsel -i", 0, "", "", "", "", "", "") + + self.data['localcmd']=weechat.config_new_option( + self.config_file, section_default, + "localcmd", "string", """Local command to execute""", "", 0, 0, + "firefox '%s'", "firefox '%s'", 0, "", "", "", "", "", "") + + remotecmd="ssh -x localhost -i ~/.ssh/id_rsa -C \"export DISPLAY=\":0.0\" && firefox '%s'\"" + self.data['remotecmd']=weechat.config_new_option( + self.config_file, section_default, + "remotecmd", "string", remotecmd, "", 0, 0, + remotecmd, remotecmd, 0, "", "", "", "", "", "") + + self.data['url_log']=weechat.config_new_option( + self.config_file, section_default, + "url_log", "string", """log location""", "", 0, 0, + "~/.weechat/urls.log", "~/.weechat/urls.log", 0, "", "", "", "", "", "") + + self.data['time_format']=weechat.config_new_option( + self.config_file, section_default, + "time_format", "string", """TIme format""", "", 0, 0, + "%H:%M:%S", "%H:%M:%S", 0, "", "", "", "", "", "") + + self.data['output_main_buffer']=weechat.config_new_option( + self.config_file, section_default, + "output_main_buffer", "boolean", + """Print text to main buffer or current one""", "", 0, 0, "1", "1", + 0, "", "", "", "", "", "") + weechat.config_read(self.config_file) + + def __getitem__(self, key): + if key == "historysize": + return weechat.config_integer(self.data[key]) + elif key == 'output_main_buffer': + return weechat.config_boolean(self.data[key]) + #elif key.startswith('color'): + # return weechat.config_color(self.data[key]) + else: + return weechat.config_string(self.data[key]) + + def prnt(self, name, verbose = True): + weechat.prnt( ""," %s = %s" % (name.ljust(11), self.data[name]) ) + + def prntall(self): + for key in self.names(): + self.prnt(key, verbose = False) + + def createCmd(self, url): + str ="" + if self['method'] == 'remote': + str = self['remotecmd'] % url + else: + str = self['localcmd'] % url + return str + +class UrlGrabber: + def __init__(self, historysize): + # init + self.urls = {} + self.globalUrls = [] + self.historysize = 5 + # control + self.setHistorysize(historysize) + + def setHistorysize(self, count): + if count > 1: + self.historysize = count + + def getHistorysize(self): + return self.historysize + + def addUrl(self, bufferp,url ): + global urlGrabSettings + self.globalUrls.insert(0,{"buffer":bufferp, + "url":url, "time":time.strftime(urlGrabSettings["time_format"])}) + #Log urls only if we have set a log path. + if urlGrabSettings['url_log']: + try : + index = self.globalUrls[0] + logfile = os.path.expanduser(urlGrabSettings['url_log']) + dout = open(logfile, "a") + dout.write("%s %s %s\n" % (index['time'], + index['buffer'], index['url'])) + dout.close() + except : + print "failed to log url check that %s is valid path" % urlGrabSettings['url_log'] + pass + + # check for buffer + if not bufferp in self.urls: + self.urls[bufferp] = [] + # add url + if url in self.urls[bufferp]: + self.urls[bufferp].remove(url) + self.urls[bufferp].insert(0, url) + # removing old urls + while len(self.urls[bufferp]) > self.historysize: + self.urls[bufferp].pop() + + def hasIndex( self, bufferp, index ): + return bufferp in self.urls and \ + len(self.url[bufferp]) >= index + + def hasBuffer( self, bufferp ): + return bufferp in self.urls + + + def getUrl(self, bufferp, index): + url = "" + if bufferp in self.urls: + if len(self.urls[bufferp]) >= index: + url = self.urls[bufferp][index-1] + return url + + + def prnt(self, buff): + found = True + if self.urls.has_key(buff): + if len(self.urls[buff]) > 0: + i = 1 + for url in self.urls[buff]: + urlGrabPrint("--> " + str(i) + " : " + url) + i += 1 + else: + found = False + elif buff == "*": + for b in self.urls.keys(): + self.prnt(b) + else: + found = False + + if not found: + urlGrabPrint(buff + ": no entries") + +def urlGrabCheckMsgline(bufferp, message, isdisplayed): + global urlGrab, max_buffer_length + if not message or isdisplayed == 0: + return + # Ignore output from 'tinyurl.py' and our selfs + if ( message.startswith( "[AKA] http://tinyurl.com" ) or + message.startswith("[urlgrab]") ): + return + # Check for URLs + for url in urlRe.findall(message): + urlGrab.addUrl(bufferp,stripParens(url)) + if max_buffer_length < len(bufferp): + max_buffer_length = len(bufferp) + if urlgrab_buffer: + refresh() + + +def urlGrabCheck(data, bufferp, uber_empty, tagsn, isdisplayed, ishilight, prefix, message): + urlGrabCheckMsgline(hashBufferName(bufferp), message, isdisplayed) + return weechat.WEECHAT_RC_OK + +def urlGrabCopy(bufferd, index): + global urlGrab + if bufferd == "": + urlGrabPrint( "No current channel, you must activate one" ) + elif not urlGrab.hasBuffer(bufferd): + urlGrabPrint("No URL found - Invalid channel") + else: + if index <= 0: + urlGrabPrint("No URL found - Invalid index") + return + url = urlGrab.getUrl(bufferd,index) + if url == "": + urlGrabPrint("No URL found - Invalid index") + else: + try: + pipe = os.popen(urlGrabSettings['copycmd'],"w") + pipe.write(url) + pipe.close() + urlGrabPrint("Url: %s gone to clipboard." % url) + except: + urlGrabPrint("Url: %s failed to copy to clipboard." % url) + +def urlGrabOpenUrl(url): + global urlGrab, urlGrabSettings + argl = urlGrabSettings.createCmd( urllib.quote(url, '/:#%?&+=') ) + weechat.hook_process(argl,60000, "ug_open_cb", "") + +def ug_open_cb(data, command, code, out, err): + #print out + #print err + return weechat.WEECHAT_RC_OK + + +def urlGrabOpen(bufferd, index): + global urlGrab, urlGrabSettings + if bufferd == "": + urlGrabPrint( "No current channel, you must specify one" ) + elif not urlGrab.hasBuffer(bufferd) : + urlGrabPrint("No URL found - Invalid channel") + else: + if index <= 0: + urlGrabPrint("No URL found - Invalid index") + return + url = urlGrab.getUrl(bufferd,index) + if url == "": + urlGrabPrint("No URL found - Invalid index") + else: + urlGrabPrint("loading %s %sly" % (url, urlGrabSettings["method"])) + urlGrabOpenUrl (url) + +def urlGrabList( args ): + global urlGrab + if len(args) == 0: + buf = hashBufferName(weechat.current_buffer()) + else: + buf = args[0] + if buf == "" or buf == "all": + buf = "*" + urlGrab.prnt(buf) + + +def urlGrabMain(data, bufferp, args): + if args[0:2] == "**": + keyEvent(data, bufferp, args[2:]) + return weechat.WEECHAT_RC_OK + + bufferd = hashBufferName(bufferp) + largs = args.split(" ") + #strip spaces + while '' in largs: + largs.remove('') + while ' ' in largs: + largs.remove(' ') + if len(largs) == 0 or largs[0] == "show": + if not urlgrab_buffer: + init() + refresh() + weechat.buffer_set(urlgrab_buffer, "display", "1") + elif largs[0] == 'open' and len(largs) == 2: + urlGrabOpenUrl(largs[1]) + elif largs[0] == 'list': + urlGrabList( largs[1:] ) + elif largs[0] == 'copy': + if len(largs) > 1: + no = int(largs[1]) + urlGrabCopy(bufferd, no) + else: + urlGrabCopy(bufferd,1) + else: + try: + no = int(largs[0]) + if len(largs) > 1: + urlGrabOpen(largs[1], no) + else: + urlGrabOpen(bufferd, no) + except ValueError: + #not a valid number so try opening it as a url.. + for url in urlRe.findall(largs[0]): + urlGrabOpenUrl(stripParens(url)) + urlGrabPrint( "Unknown command '%s'. Try '/help url' for usage" % largs[0]) + return weechat.WEECHAT_RC_OK + +def buffer_input(*kwargs): + return weechat.WEECHAT_RC_OK + +def buffer_close(*kwargs): + global urlgrab_buffer + urlgrab_buffer = None + return weechat.WEECHAT_RC_OK + +def keyEvent (data, bufferp, args): + global urlGrab , urlGrabSettings, urlgrab_buffer, current_line + if args == "refresh": + refresh() + elif args == "up": + if current_line > 0: + current_line = current_line -1 + refresh_line (current_line + 1) + refresh_line (current_line) + ugCheckLineOutsideWindow() + elif args == "down": + if current_line < len(urlGrab.globalUrls) - 1: + current_line = current_line +1 + refresh_line (current_line - 1) + refresh_line (current_line) + ugCheckLineOutsideWindow() + elif args == "scroll_top": + temp_current = current_line + current_line = 0 + refresh_line (temp_current) + refresh_line (current_line) + weechat.command(urlgrab_buffer, "/window scroll_top") + pass + elif args == "scroll_bottom": + temp_current = current_line + current_line = len(urlGrab.globalUrls) + refresh_line (temp_current) + refresh_line (current_line) + weechat.command(urlgrab_buffer, "/window scroll_bottom") + elif args == "enter": + if urlGrab.globalUrls[current_line]: + urlGrabOpenUrl (urlGrab.globalUrls[current_line]['url']) + +def refresh_line (y): + global urlGrab , urlGrabSettings, urlgrab_buffer, current_line, max_buffer_length + #Print format Time(space)buffer(max4 spaces, but lined up)url + format = "%%s%%s %%s%%-%ds%%s%%s" % (max_buffer_length+4) + + #non selected colors + color_buffer = urlGrabSettings["color_buffer"] + color_url = urlGrabSettings["color_url"] + color_time =urlGrabSettings["color_time"] + #selected colors + color_buffer_selected = urlGrabSettings["color_buffer_selected"] + color_url_selected = urlGrabSettings["color_url_selected"] + color_time_selected = urlGrabSettings["color_time_selected"] + + color_bg_selected = urlGrabSettings["color_bg_selected"] + + color1 = color_time + color2 = color_buffer + color3 = color_url + + #If this line is selected we change the colors. + if y == current_line: + color1 = "%s,%s" % (color_time_selected, color_bg_selected) + color2 = "%s,%s" % (color_buffer_selected, color_bg_selected) + color3 = "%s,%s" % (color_url_selected, color_bg_selected) + + color1 = weechat.color(color1) + color2 = weechat.color(color2) + color3 = weechat.color(color3) + text = format % (color1, + urlGrab.globalUrls[y]['time'], + color2, + urlGrab.globalUrls[y]['buffer'], + color3, + urlGrab.globalUrls[y]['url'] ) + weechat.prnt_y(urlgrab_buffer,y,text) + +def ugCheckLineOutsideWindow(): + global urlGrab , urlGrabSettings, urlgrab_buffer, current_line, max_buffer_length + if (urlgrab_buffer): + infolist = weechat.infolist_get("window", "", "current") + if (weechat.infolist_next(infolist)): + start_line_y = weechat.infolist_integer(infolist, "start_line_y") + chat_height = weechat.infolist_integer(infolist, "chat_height") + if(start_line_y > current_line): + weechat.command(urlgrab_buffer, "/window scroll -%i" %(start_line_y - current_line)) + elif(start_line_y <= current_line - chat_height): + weechat.command(urlgrab_buffer, "/window scroll +%i"%(current_line - start_line_y - chat_height + 1)) + weechat.infolist_free(infolist) + + +def refresh(): + global urlGrab + y=0 + for x in urlGrab.globalUrls: + refresh_line (y) + y += 1 + + +def init(): + global urlGrab , urlGrabSettings, urlgrab_buffer + if not urlgrab_buffer: + urlgrab_buffer = weechat.buffer_new("urlgrab", "buffer_input", "", "buffer_close", "") + if urlgrab_buffer: + weechat.buffer_set(urlgrab_buffer, "type", "free") + weechat.buffer_set(urlgrab_buffer, "key_bind_ctrl-R", "/url **refresh") + weechat.buffer_set(urlgrab_buffer, "key_bind_meta2-A", "/url **up") + weechat.buffer_set(urlgrab_buffer, "key_bind_meta2-B", "/url **down") + weechat.buffer_set(urlgrab_buffer, "key_bind_meta-ctrl-J", "/url **enter") + weechat.buffer_set(urlgrab_buffer, "key_bind_meta-ctrl-M", "/url **enter") + weechat.buffer_set(urlgrab_buffer, "key_bind_meta-meta2-1./~", "/url **scroll_top") + weechat.buffer_set(urlgrab_buffer, "key_bind_meta-meta2-4~", "/url **scroll_bottom") + weechat.buffer_set(urlgrab_buffer, "title","Lists the urls in the applications") + weechat.buffer_set(urlgrab_buffer, "display", "1") + +def completion_urls_cb(data, completion_item, bufferp, completion): + """ Complete with URLS, for command '/url'. """ + global urlGrab + bufferd = hashBufferName( bufferp) + for url in urlGrab.globalUrls : + if url['buffer'] == bufferd: + weechat.hook_completion_list_add(completion, url['url'], 0, weechat.WEECHAT_LIST_POS_SORT) + return weechat.WEECHAT_RC_OK + +def ug_unload_script(): + """ Function called when script is unloaded. """ + global urlGrabSettings + weechat.config_write(urlGrabSettings.config_file) + return weechat.WEECHAT_RC_OK + +#Main stuff +if ( import_ok and + weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, + SCRIPT_LICENSE,SCRIPT_DESC, "ug_unload_script", "") ): + urlgrab_buffer = None + current_line = 0 + max_buffer_length = 0 + urlGrabSettings = UrlGrabSettings() + urlGrab = UrlGrabber( urlGrabSettings['historysize']) + weechat.hook_print("", "", "", 1, "urlGrabCheck", "") + weechat.hook_command(SCRIPT_COMMAND, + "Url Grabber", + "[open | | show | copy [n] | [n] | list]", + "open or : opens the url\n" + "show: Opens the select buffer to allow for url selection\n" + "copy: Copies the nth url to the system clipboard\n" + "list: Lists the urls in the current buffer\n", + "open %(urlgrab_urls) || %(urlgrab_urls) || " + "copy || show || list", + "urlGrabMain", "") + weechat.hook_completion("urlgrab_urls", "list of URLs", + "completion_urls_cb", "") +else: + print "failed to load weechat" diff --git a/weechat/.weechat/relay.conf b/weechat/.weechat/relay.conf new file mode 100644 index 0000000..565dd14 --- /dev/null +++ b/weechat/.weechat/relay.conf @@ -0,0 +1,48 @@ +# +# weechat -- relay.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use /set or similar command to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[look] +auto_open_buffer = on +raw_messages = 256 + +[color] +client = cyan +status_active = lightblue +status_auth_failed = lightred +status_connecting = yellow +status_disconnected = lightred +status_waiting_auth = brown +text = default +text_bg = default +text_selected = white + +[network] +allow_empty_password = off +allowed_ips = "" +bind_address = "" +clients_purge_delay = 0 +compression_level = 6 +ipv6 = on +max_clients = 5 +password = "" +ssl_cert_key = "%h/ssl/relay.pem" +ssl_priorities = "NORMAL:-VERS-SSL3.0" +websocket_allowed_origins = "" + +[irc] +backlog_max_minutes = 1440 +backlog_max_number = 256 +backlog_since_last_disconnect = on +backlog_since_last_message = off +backlog_tags = "irc_privmsg" +backlog_time_format = "[%H:%M] " + +[port] diff --git a/weechat/.weechat/script.conf b/weechat/.weechat/script.conf new file mode 100644 index 0000000..2cfb4e4 --- /dev/null +++ b/weechat/.weechat/script.conf @@ -0,0 +1,57 @@ +# +# weechat -- script.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use /set or similar command to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[look] +columns = "%s %n %V %v %u | %d | %t" +diff_color = on +diff_command = "auto" +display_source = on +quiet_actions = on +sort = "p,n" +translate_description = on +use_keys = on + +[color] +status_autoloaded = cyan +status_held = white +status_installed = lightcyan +status_obsolete = lightmagenta +status_popular = yellow +status_running = lightgreen +status_unknown = lightred +text = default +text_bg = default +text_bg_selected = red +text_date = default +text_date_selected = white +text_delimiters = default +text_description = default +text_description_selected = white +text_extension = default +text_extension_selected = white +text_name = cyan +text_name_selected = lightcyan +text_selected = white +text_tags = brown +text_tags_selected = yellow +text_version = magenta +text_version_loaded = default +text_version_loaded_selected = white +text_version_selected = lightmagenta + +[scripts] +autoload = on +cache_expire = 1440 +download_timeout = 30 +hold = "" +path = "%h/script" +url = "http://weechat.org/files/plugins.xml.gz" +url_force_https = on diff --git a/weechat/.weechat/sec.conf b/weechat/.weechat/sec.conf new file mode 100644 index 0000000..8c60d03 --- /dev/null +++ b/weechat/.weechat/sec.conf @@ -0,0 +1,18 @@ +# +# weechat -- sec.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use /set or similar command to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[crypt] +cipher = aes256 +hash_algo = sha256 +passphrase_file = "" +salt = on + +[data] diff --git a/weechat/.weechat/trigger.conf b/weechat/.weechat/trigger.conf new file mode 100644 index 0000000..2ff585a --- /dev/null +++ b/weechat/.weechat/trigger.conf @@ -0,0 +1,67 @@ +# +# weechat -- trigger.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use /set or similar command to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[look] +enabled = on +monitor_strip_colors = off + +[color] +flag_command = lightgreen +flag_conditions = yellow +flag_post_action = lightblue +flag_regex = lightcyan +flag_return_code = lightmagenta +regex = white +replace = cyan +trigger = green +trigger_disabled = red + +[trigger] +beep.arguments = "" +beep.command = "/print -beep" +beep.conditions = "${tg_displayed} && (${tg_highlight} || ${tg_msg_pv})" +beep.enabled = on +beep.hook = print +beep.post_action = none +beep.regex = "" +beep.return_code = ok +cmd_pass.arguments = "5000|input_text_display;5000|history_add;5000|irc_command_auth" +cmd_pass.command = "" +cmd_pass.conditions = "" +cmd_pass.enabled = on +cmd_pass.hook = modifier +cmd_pass.post_action = none +cmd_pass.regex = "==^((/(msg|m|quote) +nickserv +(id|identify|ghost +[^ ]+|release +[^ ]+|regain +[^ ]+|recover +[^ ]+) +)|/oper +[^ ]+ +|/quote +pass +|/set +[^ ]*password[^ ]* +|/secure +(passphrase|decrypt|set +[^ ]+) +)(.*)==${re:1}${hide:*,${re:+}}" +cmd_pass.return_code = ok +cmd_pass_register.arguments = "5000|input_text_display;5000|history_add;5000|irc_command_auth" +cmd_pass_register.command = "" +cmd_pass_register.conditions = "" +cmd_pass_register.enabled = on +cmd_pass_register.hook = modifier +cmd_pass_register.post_action = none +cmd_pass_register.regex = "==^(/(msg|m|quote) +nickserv +register +)([^ ]+)(.*)==${re:1}${hide:*,${re:3}}${re:4}" +cmd_pass_register.return_code = ok +msg_auth.arguments = "5000|irc_message_auth" +msg_auth.command = "" +msg_auth.conditions = "" +msg_auth.enabled = on +msg_auth.hook = modifier +msg_auth.post_action = none +msg_auth.regex = "==^(.*(id|identify|register|ghost +[^ ]+|release +[^ ]+|regain +[^ ]+|recover +[^ ]+) +)(.*)==${re:1}${hide:*,${re:+}}" +msg_auth.return_code = ok +server_pass.arguments = "5000|input_text_display;5000|history_add" +server_pass.command = "" +server_pass.conditions = "" +server_pass.enabled = on +server_pass.hook = modifier +server_pass.post_action = none +server_pass.regex = "==^(/(server|connect) .*-(sasl_)?password=)([^ ]+)(.*)==${re:1}${hide:*,${re:4}}${re:5}" +server_pass.return_code = ok diff --git a/weechat/.weechat/urlgrab.conf b/weechat/.weechat/urlgrab.conf new file mode 100644 index 0000000..5180a25 --- /dev/null +++ b/weechat/.weechat/urlgrab.conf @@ -0,0 +1,29 @@ +# +# weechat -- urlgrab.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use /set or similar command to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[color] +color_bg_selected = green +color_buffer = red +color_buffer_selected = red +color_time = cyan +color_time_selected = cyan +color_url = blue +color_url_selected = blue + +[default] +copycmd = "xsel -i" +historysize = 10 +localcmd = "qutebrowser '%s'" +method = "local" +output_main_buffer = on +remotecmd = "ssh -x localhost -i ~/.ssh/id_rsa -C "export DISPLAY=":0.0" && firefox '%s'"" +time_format = "%H:%M:%S" +url_log = "~/.weechat/urls.log" diff --git a/weechat/.weechat/urls.log b/weechat/.weechat/urls.log new file mode 100644 index 0000000..0ccb0c0 --- /dev/null +++ b/weechat/.weechat/urls.log @@ -0,0 +1,343 @@ +23:33:02 #linuxmasterrace https://redd.it/3tiy3m +23:34:07 #linuxmasterrace https://pta2002.com/pastes/blob/c06d69d5-1c58-471f-a34b-20921861347a +23:34:39 #linuxmasterrace https://www.reddit.com/r/Stepmania/ +23:35:58 #linuxmasterrace https://u.teknik.io/zDGHH.png +23:46:23 #linuxmasterrace http://redd.it/6an8gb +23:47:47 #linuxmasterrace http://redd.it/6an8sh +11:13:19 snoonet http://www.snoonet.org/rules +11:13:19 snoonet http://www.snoonet.org/rules +11:13:19 snoonet http://www.snoonet.org/rules +11:13:20 #linuxmasterrace http://redd.it/6aq5ny +11:17:41 #linuxmasterrace https://i.imgur.com/Dht7g3z.png +11:37:49 ##Gupshup https://twitter.com/hassimer/status/859479073147543552 +11:38:11 #linuxmasterrace https://www.youtube.com/watch?v=rg3Mr6e1KMo +11:38:46 #linuxmasterrace http://redd.it/6aqb99 +11:43:52 #linuxmasterrace http://imgur.com/HODoX3x +11:47:23 #Islam https://www.facebook.com/AnimationClub/videos/1348723505213803/ +11:55:23 #linuxmasterrace https://ocharles.org.uk/blog/posts/2013-12-06-24-days-of-hackage-persistent-esqueleto.html +11:55:44 #Islam http://www.mibbit.com +11:59:56 #linuxmasterrace http://redd.it/6aqdul +12:39:52 #linuxmasterrace http://redd.it/6aqj1a +12:40:26 ##Gupshup http://hearthstone.gamepedia.com/Murloc_Warleader +12:47:59 #linuxmasterrace http://youtu.be/B3h2Rw1mHew +12:51:20 #linuxmasterrace https://justcause3mods.com/wp-content/uploads/cmdm/165054/1456341811_Monster-Plane-1600x836.png +12:56:10 #linuxmasterrace http://redd.it/6aql7b +13:00:13 #linuxmasterrace https://en.wikipedia.org/wiki/MG_08 +13:00:25 #linuxmasterrace https://en.wikipedia.org/wiki/08/15_%28film_series%29 +13:00:54 #linuxmasterrace http://redd.it/6aqlpu +13:30:39 #linuxmasterrace http://edition.cnn.com/2017/05/11/politics/oval-office-photos-donald-trump-russians/ +13:34:19 #linuxmasterrace http://www.abc.net.au/news/2017-03-04/white-house-defends-pences-use-of-private-email/8324608 +13:34:29 #linuxmasterrace http://imgur.com/a/pLckP +13:41:57 #linuxmasterrace http://rrrather.com/view/3462 +13:42:06 #linuxmasterrace http://rrrather.com/view/139 +13:42:14 #linuxmasterrace https://www.washingtonpost.com/business/economy/trump-sold-all-shares-in-companies-in-june-spokesman-says/2016/12/06/55419d44-bbcf-11e6-94ac-3d324840106c_story.html?utm_term=.8d134eed0033 +13:43:37 #linuxmasterrace http://rrrather.com/view/5044 +13:47:57 #linuxmasterrace http://www.cnn.com/2017/04/06/politics/hillary-clinton-syria-assad/ +13:50:25 #linuxmasterrace https://www.washingtonpost.com/blogs/fact-checker/post/hillary-clintons-uncredible-statement-on-syria/2011/04/01/AFWPEYaC_blog.html +14:08:33 #linuxmasterrace https://en.wikipedia.org/wiki/List_of_Chancellors_of_Germany_by_time_in_office +14:24:17 #linuxmasterrace http://i2.kym-cdn.com/photos/images/newsfeed/000/106/292/Furrychart.jpg +14:25:06 #Islam https://is.gd/1JYVa2 +14:35:57 #linuxmasterrace http://redd.it/6ar0og +14:41:33 #linuxmasterrace http://redd.it/6ar1p3 +14:42:47 #Islam http://tasfiyah.com/ibn-al-qayyim-three-causes-of-hearts-feeling-open-or-tight-and-the-effect-of-that-in-the-grave/ +14:53:47 #linuxmasterrace https://redquasar.xyz/stuff/neon-useredition-20170504-1018-amd64.iso +14:54:42 ##Gupshup http://rrrather.com/view/16152 +15:14:10 #linuxmasterrace https://weechat.org/files/scripts/unofficial/greentext.py +15:28:10 #Islam http://imgur.com/a/7rnSJ +15:28:21 #linuxmasterrace https://hastebin.com/cemibawivi.tex +15:30:29 #linuxmasterrace https://pta2002.com/pastes/paste/bd67f311-79d6-4d27-b614-4d5e8ef258fa +15:31:43 #Islam https://my.mixtape.moe/dclnzp.png +15:32:55 #linuxmasterrace https://rubygems.org/gems/haste/versions/0.2.1 +15:37:45 ##Gupshup https://www.nytimes.com/2017/05/12/world/asia/china-south-korea-thaad-rap-video.html?emc=edit_tnt_20170512&nlid=15404638&tntemail0=y&utm_content=buffer7cdec&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer +15:37:49 ##Gupshup https://www.youtube.com/watch?v=9p0nQdvHOOo +15:42:31 #linuxmasterrace http://redd.it/6ard5f +15:42:41 #linuxmasterrace https://www.quora.com/What-is-the-difference-between-Wi-Fi-and-WLAN +15:42:56 #linuxmasterrace https://twitter.com/jacobrossi/status/851992646151278592 +15:42:57 #linuxmasterrace https://t.co/uUduqKF1Zg +15:46:37 #linuxmasterrace http://www.sndio.org/ +15:49:30 #linuxmasterrace http://youtu.be/9sJUDx7iEJw +15:49:46 #linuxmasterrace http://www.microkernel.info/ +15:52:51 #linuxmasterrace https://en.m.wikipedia.org/wiki/Redox +15:52:57 #linuxmasterrace https://www.redoxengine.com/ +15:53:03 #linuxmasterrace https://github.com/redox-os/kernel +15:53:18 #linuxmasterrace https://www.redox-os.org/ +15:56:27 #Islam https://www.albalagh.net/bookstore/?action=view&item=1006 +15:59:58 #Islam https://www.albalagh.net/bookstore/sample_pages/1006Sample.pdf +16:05:22 #linuxmasterrace https://twitter.com/jacobrossi/status/851992646151278592 +16:05:22 #linuxmasterrace https://t.co/uUduqKF1Zg +16:08:27 #linuxmasterrace https://matrix.org/_matrix/media/v1/download/matrix.org/LjwZZkZeFovTLmKLNmVSQIPP +16:10:19 #linuxmasterrace https://ih1.redbubble.net/image.320603864.9552/st%2Csmall%2C215x235-pad%2C210x230%2Cf8f8f8.lite-1u1.jpg +16:19:09 #linuxmasterrace https://matrix.org/_matrix/media/v1/download/matrix.org/ZrASXQZZvKzZaFRUDujEDyYv +16:33:46 #linuxmasterrace http://redd.it/6arnpt +16:46:37 #linuxmasterrace http://redd.it/6arqdv +17:03:03 #linuxmasterrace https://i.imgur.com/QQ1onY0.png +17:03:37 #linuxmasterrace https://en.wikipedia.org/wiki/Annealing_(metallurgy) +17:04:01 #linuxmasterrace https://en.wikipedia.org/wiki/Simulated_annealing +17:05:25 #linuxmasterrace http://www.kiwiirc.com/ +17:32:19 #linuxmasterrace https://en.wikipedia.org/wiki/MediaGoblin +17:36:12 #linuxmasterrace https://en.wikipedia.org/wiki/Passive_house +17:38:02 #linuxmasterrace https://i.redditmedia.com/5URnoOZST6AvudAJRTUsJMoTz_NkwGmqNnlftmO6Ivg.jpg?w=320&s=a53278006fa80c8a9875c5804a314b03 +17:59:12 #linuxmasterrace https://www.youtube.com/watch?v=GaUi8Dv73hA +18:04:19 #linuxmasterrace https://www.theverge.com/2017/5/8/15577340/pepe-the-frog-is-dead-matt-furie +02:12:04 snoonet http://www.snoonet.org/rules +02:12:04 snoonet http://www.snoonet.org/rules +02:12:04 snoonet http://www.snoonet.org/rules +02:12:04 ##Gupshup https://m.facebook.com/pages/Black-Tea-Party/162935357076298 +02:12:04 #Islam https://islamhouse.com +02:12:04 #linuxmasterrace http://youtu.be/qeMFqkcPYcg +02:12:04 #linuxmasterrace https://ichef.bbci.co.uk/news/800/cpsprodpb/13A4F/production/_96036408_compo.jpg +02:12:04 #linuxmasterrace http://i.imgur.com/6xybZcg.png +02:12:04 #linuxmasterrace http://redd.it/6aul0g +02:12:04 #linuxmasterrace http://redd.it/6ausvp +02:12:04 #linuxmasterrace https://matrix.org/_matrix/media/v1/download/matrix.org/smRFSifQYLgcsXcSogUYwnvg +02:12:04 #linuxmasterrace https://intel.malwaretech.com/botnet/wcrypt +02:16:12 #linuxmasterrace https://dspinellis.github.io/unix-architecture/arch.pdf +02:19:19 #linuxmasterrace http://redd.it/6av036 +02:21:10 ##Gupshup https://is.gd/F28cXX +02:26:03 #linuxmasterrace https://twitter.com/dodicin/status/862991818904002565 +02:26:03 #linuxmasterrace https://t.co/8dROVXXkQv +02:34:26 ##Gupshup http://imgur.com/atS0qTv +02:35:10 #linuxmasterrace https://www.reddit.com/r/Android/comments/6at05a/here_comes_treble_a_modular_base_for_android/ +02:38:39 ##Gupshup http://youtu.be/09wdQP1FFR0 +02:54:59 #linuxmasterrace https://fuchsia.googlesource.com/ +03:02:49 #linuxmasterrace http://redd.it/6av7ge +03:02:49 #linuxmasterrace http://redd.it/6av7jm +03:12:28 ##Gupshup http://imgur.com/atS0qTv +03:13:12 #linuxmasterrace http://redd.it/6av93h +03:14:03 #linuxmasterrace https://stallman.org/apple.html +03:17:59 #linuxmasterrace https://plasma-mobile.org/ +22:23:26 snoonet http://www.snoonet.org/rules +22:23:26 snoonet http://www.snoonet.org/rules +22:23:26 snoonet http://www.snoonet.org/rules +22:23:26 #Islam http://www.haaretz.com/middle-east-news/palestinians/1.788853 +22:23:26 #linuxmasterrace http://redd.it/6aztfr +22:32:14 #linuxmasterrace http://redd.it/6b0026 +22:36:25 ##Gupshup https://soundcloud.com/bahyan-qr/4mjnfctfj1wx +22:38:01 #linuxmasterrace https://alpha.wallhaven.cc/search?q=linux +22:39:29 freenode http://www.freenode.net +22:39:29 snoonet http://www.snoonet.org/rules +22:39:29 freenode http://www.fosscon.org +22:39:29 snoonet http://www.snoonet.org/rules +22:39:29 freenode https://www.privateinternetaccess.com/ +22:39:29 snoonet http://www.snoonet.org/rules +22:39:29 #emberjs https://ember-community-slackin.herokuapp.com +22:39:29 #emberjs https://ember-community-slackin.herokuapp.com +22:39:29 #symfony http://symfony.com/doc/current/testing/http_authentication.html +22:39:29 #symfony https://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html +22:39:29 #zeronet https://git.io/v9SVh +22:44:17 ##Gupshup http://www.kiwiirc.com/ +22:46:03 #linuxmasterrace http://www.netlib.org/linpack/ +22:46:42 ##Gupshup https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTJKoPBwG7kxHGT7ded39ouBT5rYIiRUYSs1yNt8EQocw4RnuOLpvO_xoA +22:50:24 #linuxmasterrace https://wiki.archlinux.org/index.php/Stress_Test#Linpack +22:54:36 #linuxmasterrace https://pta2002.com/pastes/blob/117492c7-9ad8-43e6-88df-50e6d4c263c6 +22:56:25 ##Gupshup https://tools.ietf.org/html/rfc2812 +23:03:31 #linuxmasterrace https://arstechnica.com/information-technology/2017/02/microsoft-hosts-the-windows-source-in-a-monstrous-300gb-git-repository/ +23:04:10 #linuxmasterrace https://arstechnica.com/information-technology/2017/02/microsoft-hosts-the-windows-source-in-a-monstrous-300gb-git-repository/ +23:05:39 #linuxmasterrace https://en.wikipedia.org/wiki/Space-cadet_keyboard +23:21:57 #linuxmasterrace https://puri.sm/posts/reverse-engineering-the-intel-management-engine-romp-module/ +23:22:52 ##Gupshup https://www.reddit.com/r/SuicideWatch/ +23:25:35 #linuxmasterrace https://eurovision.tv/ +23:26:38 #linuxmasterrace http://redd.it/6b0a46 +23:32:03 #linuxmasterrace https://concordiaabchao.wordpress.com/2016/05/13/occult-symbolism-in-eurovision-2016/ +23:37:39 #linuxmasterrace https://en.wikipedia.org/wiki/European_Broadcasting_Union +23:44:25 #linuxmasterrace http://youtu.be/Sj_9CiNkkn4 +23:45:41 ##Gupshup http://www.kiwiirc.com/ +23:47:14 #linuxmasterrace https://youtu.be/3FsVeMz1F5c?t=58 +23:48:32 #linuxmasterrace https://twitter.com/ChrisPalacefc/status/863509765896499206 +23:48:32 #linuxmasterrace https://t.co/liniTBzCBG +23:52:46 #linuxmasterrace http://redd.it/6b0eui +23:56:24 ##Gupshup http://islamlecture.com/book.php?subject_id=34 +23:57:17 #Islam http://islamlecture.com/book.php?subject_id=34 +00:02:41 #linuxmasterrace http://i.imgur.com/Yhk6pIS.png +00:06:44 #linuxmasterrace https://en.m.wikipedia.org/wiki/Verka_Serduchka +00:11:57 ##Gupshup https://twitter.com/JOE_co_uk/status/863516621884751872 +00:11:58 ##Gupshup https://t.co/SP5Weywrop +21:08:27 snoonet http://www.snoonet.org/rules +21:08:27 freenode http://www.freenode.net +21:08:27 snoonet http://www.snoonet.org/rules +21:08:27 freenode http://www.fosscon.org +21:08:27 freenode https://www.privateinternetaccess.com/ +21:08:27 snoonet http://www.snoonet.org/rules +21:08:27 #symfony https://notey.it/n/MTJuZg +21:08:27 #Islam http://islamiclectures.net/ahle-hadees-ka-manhaj/ +21:08:27 #linuxmasterrace https://i.imgur.com/KcFqHw3.png +21:08:27 #linuxmasterrace https://webcache.googleusercontent.com/search?q=cache:cQOpZWYen_UJ:https://www.sophos.com/en-us/lp/nhs.aspx +21:08:27 #linuxmasterrace https://web.archive.org/web/20170102055713/https://www.sophos.com/en-us/lp/nhs.aspx +21:08:27 #linuxmasterrace https://nhsbuntu.org/ +21:12:12 freenode http://www.freenode.net +21:12:12 snoonet http://www.snoonet.org/rules +21:12:12 freenode http://www.fosscon.org +21:12:12 snoonet http://www.snoonet.org/rules +21:12:12 freenode https://www.privateinternetaccess.com/ +21:12:12 snoonet http://www.snoonet.org/rules +21:17:43 ##Gupshup http://www.fatwaislam.com/fis/index.cfm?scn=fd&ID=563 +21:20:55 snoonet http://www.snoonet.org/rules +21:20:55 freenode http://www.freenode.net +21:20:55 snoonet http://www.snoonet.org/rules +21:20:55 freenode http://www.fosscon.org +21:20:55 freenode https://www.privateinternetaccess.com/ +21:20:55 snoonet http://www.snoonet.org/rules +21:24:33 weechat http://weechat.org/files/plugins.xml.gz" +21:25:07 ##Gupshup https://en.m.wikipedia.org/wiki/Shalwar_Kameez +21:25:11 ##Gupshup http://images.plus613.net/images/f/3/9/3/www_plus613_net_d1.jpg +21:25:13 ##Gupshup http://www.fashiontrends.pk/wp-content/uploads/2012/02/Shalwar-Kameez-For-Men-05.jpg +21:25:54 ##Gupshup http://www.storesdirect.co.uk/media/catalog/product/cache/5/image/9df78eab33525d08d6e5fb8d27136e95/F/F/FFA014_1_banana_hammock.jpg +21:26:35 ##Gupshup http://friends.urbanup.com/1774853 +21:26:56 ##Gupshup http://images4.fanpop.com/image/photos/17500000/Hibari-and-Dino-yaoi-17501325-1000-882.jpg +21:31:57 ##Gupshup https://is.gd/gQ4hNX +21:32:17 ##Gupshup https://is.gd/b8zARe +21:32:37 ##Gupshup https://is.gd/9hZpr9 +21:34:38 ##Gupshup https://www.schulich.uwo.ca/bmsc/ +21:37:47 ##Gupshup http://youtu.be/U61yzVVlUoE +01:12:05 snoonet http://www.snoonet.org/rules +01:12:05 freenode http://www.freenode.net +01:12:05 snoonet http://www.snoonet.org/rules +01:12:05 freenode http://www.fosscon.org +01:12:05 freenode https://www.privateinternetaccess.com/ +01:12:05 snoonet http://www.snoonet.org/rules +01:12:05 #symfony https://notey.it/n/MTJuZw +01:12:06 #Islam https://islamqa.info/en/59905 +01:12:06 #linuxmasterrace https://addons.mozilla.org/de/firefox/addon/chrome-store-foxified/ +01:12:06 #linuxmasterrace https://xkcd.com/927/ +01:12:20 freenode http://www.freenode.net +01:12:20 snoonet http://www.snoonet.org/rules +01:12:20 freenode http://www.fosscon.org +01:12:20 snoonet http://www.snoonet.org/rules +01:12:20 freenode https://www.privateinternetaccess.com/ +01:12:20 snoonet http://www.snoonet.org/rules +01:14:13 snoonet http://www.snoonet.org/rules +01:14:13 freenode http://www.freenode.net +01:14:13 snoonet http://www.snoonet.org/rules +01:14:13 freenode http://www.fosscon.org +01:14:13 freenode https://www.privateinternetaccess.com/ +01:14:13 snoonet http://www.snoonet.org/rules +01:14:30 freenode http://www.freenode.net +01:14:30 snoonet http://www.snoonet.org/rules +01:14:30 freenode http://www.fosscon.org +01:14:30 snoonet http://www.snoonet.org/rules +01:14:30 freenode https://www.privateinternetaccess.com/ +01:14:30 snoonet http://www.snoonet.org/rules +01:16:32 snoonet http://www.snoonet.org/rules +01:16:32 freenode http://www.freenode.net +01:16:32 snoonet http://www.snoonet.org/rules +01:16:32 freenode http://www.fosscon.org +01:16:32 freenode https://www.privateinternetaccess.com/ +01:16:32 snoonet http://www.snoonet.org/rules +01:16:54 freenode http://www.freenode.net +01:16:54 snoonet http://www.snoonet.org/rules +01:16:54 freenode http://www.fosscon.org +01:16:54 snoonet http://www.snoonet.org/rules +01:16:54 freenode https://www.privateinternetaccess.com/ +01:16:54 snoonet http://www.snoonet.org/rules +01:17:12 freenode http://www.freenode.net +01:17:12 snoonet http://www.snoonet.org/rules +01:17:12 freenode http://www.fosscon.org +01:17:12 snoonet http://www.snoonet.org/rules +01:17:12 freenode https://www.privateinternetaccess.com/ +01:17:12 snoonet http://www.snoonet.org/rules +01:17:28 snoonet http://www.snoonet.org/rules +01:17:28 freenode http://www.freenode.net +01:17:28 snoonet http://www.snoonet.org/rules +01:17:28 freenode http://www.fosscon.org +01:17:28 freenode https://www.privateinternetaccess.com/ +01:17:29 snoonet http://www.snoonet.org/rules +01:20:22 snoonet http://www.snoonet.org/rules +01:20:22 freenode http://www.freenode.net +01:20:22 snoonet http://www.snoonet.org/rules +01:20:22 freenode http://www.fosscon.org +01:20:22 freenode https://www.privateinternetaccess.com/ +01:20:22 snoonet http://www.snoonet.org/rules +01:20:22 ##Gupshup http://www.gym-talk.com/arnold-schwarzeneggers-golden-six-routine/ +01:20:48 snoonet http://www.snoonet.org/rules +01:20:48 freenode http://www.freenode.net +01:20:48 snoonet http://www.snoonet.org/rules +01:20:48 freenode http://www.fosscon.org +01:20:48 freenode https://www.privateinternetaccess.com/ +01:20:49 snoonet http://www.snoonet.org/rules +01:21:07 freenode http://www.freenode.net +01:21:07 snoonet http://www.snoonet.org/rules +01:21:07 freenode http://www.fosscon.org +01:21:07 snoonet http://www.snoonet.org/rules +01:21:07 freenode https://www.privateinternetaccess.com/ +01:21:07 snoonet http://www.snoonet.org/rules +01:21:30 snoonet http://www.snoonet.org/rules +01:21:30 freenode http://www.freenode.net +01:21:30 snoonet http://www.snoonet.org/rules +01:21:30 freenode http://www.fosscon.org +01:21:30 freenode https://www.privateinternetaccess.com/ +01:21:30 snoonet http://www.snoonet.org/rules +01:23:20 #linuxmasterrace https://www.youtube.com/watch?v=lbJ51AJuR7E&list=PLSMETuURtTXCzW7Q_ZIy4QzEnyUG8totf +01:23:30 snoonet http://www.snoonet.org/rules +01:23:30 freenode http://www.freenode.net +01:23:30 snoonet http://www.snoonet.org/rules +01:23:30 freenode http://www.fosscon.org +01:23:30 freenode https://www.privateinternetaccess.com/ +01:23:30 snoonet http://www.snoonet.org/rules +01:23:43 #linuxmasterrace https://www.youtube.com/watch?v=lbJ51AJuR7E&index=1&list=PLSMETuURtTXCzW7Q_ZIy4QzEnyUG8totf +01:28:28 #linuxmasterrace http://i.imgur.com/hd3uT1g.jpg +01:29:22 #linuxmasterrace https://is.gd/rSuanT +01:29:53 #linuxmasterrace https://is.gd/GUp5Xz +01:29:59 #linuxmasterrace https://is.gd/DBIChI +01:30:30 #linuxmasterrace https://is.gd/ohbuYN +01:30:40 #linuxmasterrace https://is.gd/ev0FgR +01:33:55 #linuxmasterrace https://youtu.be/DNRTfhmDJ7g +01:39:21 freenode http://www.freenode.net +01:39:21 snoonet http://www.snoonet.org/rules +01:39:21 freenode http://www.fosscon.org +01:39:21 snoonet http://www.snoonet.org/rules +01:39:21 freenode https://www.privateinternetaccess.com/ +01:39:21 snoonet http://www.snoonet.org/rules +01:57:54 #linuxmasterrace https://u.teknik.io/RKtbI.png +02:09:21 #linuxmasterrace http://www.youtube.com +02:09:55 #linuxmasterrace http://www.btnet.com.tr/wp-content/uploads/2017/05/wannacry_05-1024x774.png +02:22:43 #linuxmasterrace https://lutris.net/ +10:07:15 freenode http://www.freenode.net +10:07:15 freenode http://www.fosscon.org +10:07:15 freenode https://www.privateinternetaccess.com/ +10:07:15 snoonet http://www.snoonet.org/rules +10:07:15 snoonet http://www.snoonet.org/rules +10:07:15 snoonet http://www.snoonet.org/rules +10:07:15 #symfony https://github.com/symfony/symfony/blob/fb532bfc172a531bce4219e4f21db124eb972bbc/src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/RequestAttributeValueResolver.php#L38 +10:07:15 ##Gupshup https://www.youtube.com/watch?v=VkfMVVDDBM0 +10:07:15 #Islam https://www.youtube.com/c/FreeQuranEducation +10:07:15 #Islam https://www.launchgood.com/project/this_ramadan_help_revolutionize_access_to_islamic_education_using_visual_learning +10:07:15 #linuxmasterrace https://i.imgur.com/2SoEP5O.gifv +10:31:19 #linuxmasterrace http://imgur.com/a/a3YRj +11:01:04 #Islam https://pbs.twimg.com/media/C_re58BXgAA8fzx.jpg +11:11:39 #linuxmasterrace https://www.youtube.com/watch?v=Zy4G30kSPnY +11:11:46 #Islam https://www.youtube.com/watch?v=37BRBd5ns6M +11:22:27 #Islam http://productivemuslim.com/8-simple-steps-to-help-you-prepare-for-ramadan/ +11:23:22 #Islam https://twitter.com/SpreadPeacee/status/863045217355788288 +11:23:22 #Islam https://t.co/2ZywS2HDPE +11:26:45 #Islam http://thekidshouldseethis.com/post/84448815852 +11:30:28 #linuxmasterrace https://www.youtube.com/watch?v=TcqWok8AubE +11:43:47 #Islam http://tasfiyah.com/ibn-al-qayyim-three-causes-of-hearts-feeling-open-or-tight-and-the-effect-of-that-in-the-grave/ +12:03:20 #Islam http://www.mibbit.com +12:06:01 #symfony https://knpuniversity.com/screencast/alice-fixtures/processors +12:45:41 ##Gupshup http://www.kiwiirc.com/ +12:45:41 #Islam http://www.kiwiirc.com/ +12:51:56 #linuxmasterrace https://matrix.org/_matrix/media/v1/download/matrix.org/XcTZgDcFmwCrZwMXDZMHDrHK +13:01:07 #symfony http://rndnext.blogspot.com/2009/08/mutually-exclusive-html-select-elements.html +13:03:35 #linuxmasterrace https://is.gd/BlDGPc +13:11:29 #linuxmasterrace http://roll-dice-online.com/ +13:24:34 snoonet http://www.snoonet.org/rules +13:24:34 freenode http://www.freenode.net +13:24:35 snoonet http://www.snoonet.org/rules +13:24:35 freenode http://www.fosscon.org +13:24:35 freenode https://www.privateinternetaccess.com/ +13:24:35 snoonet http://www.snoonet.org/rules +14:06:26 #linuxmasterrace https://www.youtube.com/watch?v=fr0Wyom3pOg +14:09:18 #linuxmasterrace https://www.independent.co.uk/arts-entertainment/tv/news/mr-robot-season-3-premiere-date-rami-malek-bobby-cannavale-bd-wong-a7625501.html +14:14:04 #Islam https://pbs.twimg.com/media/C_re58BXgAA8fzx.jpg +14:17:03 #linuxmasterrace https://play.google.com/store/apps/details?id=com.zeapo.pwdstore +14:17:21 #linuxmasterrace https://www.passwordstore.org/ +14:20:49 #Islam https://www.google.com.au/amp/s/abdurrahman.org/2013/07/18/dua-for-increase-in-knowledge-compiled-and-translated-by-abbas-abu-yahya/amp/ +14:35:37 #linuxmasterrace https://www.youtube.com/watch?v=Syjp9lsWBhc +14:49:08 #linuxmasterrace https://www.youtube.com/watch?v=9UtRsGU6pVs +14:49:09 #linuxmasterrace https://u.teknik.io/xVTu8.png +14:50:12 #symfony http://paste.ubuntu.com/24580702/ +14:50:32 #linuxmasterrace https://u.teknik.io/AW71V.png +14:53:48 #linuxmasterrace https://u.teknik.io/AW71V.png +14:53:48 #linuxmasterrace https://u.teknik.io/xVTu8.png +15:04:03 #linuxmasterrace https://www.youtube.com/watch?v=rF9bacBwaXM +15:09:21 #linuxmasterrace https://www.youtube.com/watch?v=t6u6n0Y_5Cw diff --git a/weechat/.weechat/xfer.conf b/weechat/.weechat/xfer.conf new file mode 100644 index 0000000..c7ef602 --- /dev/null +++ b/weechat/.weechat/xfer.conf @@ -0,0 +1,46 @@ +# +# weechat -- xfer.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use /set or similar command to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[look] +auto_open_buffer = on +progress_bar_size = 20 +pv_tags = "notify_private" + +[color] +status_aborted = lightred +status_active = lightblue +status_connecting = yellow +status_done = lightgreen +status_failed = lightred +status_waiting = lightcyan +text = default +text_bg = default +text_selected = white + +[network] +blocksize = 65536 +fast_send = on +own_ip = "" +port_range = "" +speed_limit = 0 +timeout = 300 + +[file] +auto_accept_chats = off +auto_accept_files = off +auto_accept_nicks = "" +auto_check_crc32 = off +auto_rename = on +auto_resume = on +convert_spaces = on +download_path = "%h/xfer" +upload_path = "~" +use_nick_in_filename = on