--- /dev/null
+--type-add=html=.haml
+--type-add=css=.sass,.scss,.less
+--type-add=js=.rjs,.coffee
+--type-add=ruby=.erb
+--ignore-dir=vendor
+--ignore-dir=log
+--ignore-dir=tmp
+--ignore-dir=doc
+--ignore-dir=public/system
+--sort-files
+--color
+--follow
+--group
--- /dev/null
+[user]
+ name = Ben Beltran
+ email = ben@nsovocal.com
+[core]
+ editor = vim
+[color]
+ diff = auto
--- /dev/null
+OPTIONS=color
+OPTIONS=catname:Pure
+OPTIONS=dogname:Juan
+OPTIONS=horsename:Juan
+OPTIONS=!DECgraphics
+OPTIONS=IBMgraphics
let g:netrw_dirhistmax =10
-let g:netrw_dirhist_cnt =2
+let g:netrw_dirhist_cnt =3
let g:netrw_dirhist_1='/Users/benbeltran/.newsbeuter'
let g:netrw_dirhist_2='/Users/benbeltran/.vim'
+let g:netrw_dirhist_3='/Users/benbeltran/.dotfiles/tmux-powerline'
--- /dev/null
+#
+# alias.conf -- weechat v0.3.8
+#
+
+[cmd]
+AAWAY = "allserv /away"
+AME = "allchan /me"
+AMSG = "allchan /msg *"
+ANICK = "allserv /nick"
+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"
+MUB = "unban *"
+N = "names"
+Q = "query"
+REDRAW = "window refresh"
+SAY = "msg *"
+SIGNOFF = "quit"
+T = "topic"
+UB = "unban"
+V = "command core version"
+W = "who"
+WC = "window merge"
+WI = "whois"
+WII = "whois $1 $1"
+WW = "whowas"
+
+[completion]
--- /dev/null
+#
+# aspell.conf -- weechat v0.3.8
+#
+
+[look]
+color = lightred
+
+[check]
+commands = "ame,amsg,away,command,cycle,kick,kickban,me,msg,notice,part,query,quit,topic"
+default_dict = ""
+during_search = off
+real_time = off
+word_min_length = 2
+
+[dict]
+
+[option]
--- /dev/null
+#
+# buffers.conf -- weechat v0.3.8
+#
+
+[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 = yellow
+hotlist_private_bg = default
+hotlist_private_fg = lightgreen
+none_channel_bg = default
+none_channel_fg = default
+number = lightgreen
+number_char = lightgreen
+queries_default_bg = default
+queries_default_fg = default
+queries_highlight_bg = default
+queries_highlight_fg = default
+queries_message_bg = default
+queries_message_fg = 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 = 0
+hide_merged_buffers = none
+immune_detach_buffers = ""
+indenting = off
+indenting_number = on
+jump_prev_next_visited_buffer = off
+name_crop_suffix = "+"
+name_size_max = 0
+number_char = "."
+prefix = off
+prefix_empty = on
+short_names = on
+show_lag = off
+show_number = on
+sort = number
+whitelist_buffers = ""
--- /dev/null
+#
+# iset.conf -- weechat v0.3.8
+#
+
+[color]
+bg_selected = red
+help_default_value = green
+help_option_name = white
+help_text = default
+option = default
+option_selected = white
+type = brown
+type_selected = yellow
+value = cyan
+value_selected = lightcyan
+value_undef = green
+value_undef_selected = lightgreen
+
+[help]
+show_help_bar = on
+show_help_extra_info = on
+show_plugin_description = on
+
+[look]
+scroll_horiz = 10
+show_current_line = on
+value_search_char = "="
--- /dev/null
+#
+# logger.conf -- weechat v0.3.8
+#
+
+[look]
+backlog = 20
+
+[color]
+backlog_end = darkgray
+backlog_line = darkgray
+
+[file]
+auto_log = on
+flush_delay = 120
+info_lines = off
+mask = "$plugin.$name.weechatlog"
+name_lower_case = on
+path = "%h/logs/"
+replacement_char = "_"
+time_format = "%Y-%m-%d %H:%M:%S"
+
+[level]
+
+[mask]
--- /dev/null
+../beep.pl
\ No newline at end of file
--- /dev/null
+../buffers.pl
\ No newline at end of file
--- /dev/null
+../chanmon.pl
\ No newline at end of file
--- /dev/null
+../iset.pl
\ No newline at end of file
--- /dev/null
+#
+# Copyright (C) 2006-2012 Sebastien Helleu <flashcode@flashtux.org>
+# Copyright (C) 2011 Nils Görs <weechatter@arcor.de>
+# Copyright (C) 2011 ArZa <arza@arza.us>
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+#
+# Beep (terminal bell) and/or run command on highlight/private message or new DCC.
+#
+# History:
+# 2012-06-05, ldvx<ldvx@freenode>:
+# version 1.1: Added wildcard support for whitelist_nicks.
+# 2012-05-09, ldvx <ldvx@freenode>:
+# version 1.0: Added beep_pv_blacklist, beep_highlight_blacklist, blacklist_nicks,
+# and wildcard support for blacklist_nicks.
+# 2012-05-02, ldvx <ldvx@freenode>:
+# version 0.9: fix regex for nick in tags, add options "whitelist_channels"
+# and "bell_always"
+# 2012-04-19, ldvx <ldvx@freenode>:
+# version 0.8: add whitelist, trigger, use hook_process for commands,
+# rename option "beep_command" to "beep_command_pv", add help for options
+# 2011-04-16, ArZa <arza@arza.us>:
+# version 0.7: fix default beep command
+# 2011-03-11, nils_2 <weechatter@arcor.de>:
+# version 0.6: add additional command options for dcc and highlight
+# 2011-03-09, nils_2 <weechatter@arcor.de>:
+# version 0.5: add option for beep command and dcc
+# 2009-05-02, Sebastien Helleu <flashcode@flashtux.org>:
+# version 0.4: sync with last API changes
+# 2008-11-05, Sebastien Helleu <flashcode@flashtux.org>:
+# version 0.3: conversion to WeeChat 0.3.0+
+# 2007-08-10, Sebastien Helleu <flashcode@flashtux.org>:
+# version 0.2: upgraded licence to GPL 3
+# 2006-09-02, Sebastien Helleu <flashcode@flashtux.org>:
+# version 0.1: initial release
+
+use strict;
+my $SCRIPT_NAME = "beep";
+my $VERSION = "1.1";
+
+# default values in setup file (~/.weechat/plugins.conf)
+my %options_default = ('beep_pv' => ['on', 'beep on private message'],
+ 'beep_pv_whitelist' => ['off', 'turn whitelist for private messages on or off'],
+ 'beep_pv_blacklist' => ['off', 'turn blacklist for private messages on or off'],
+ 'beep_highlight' => ['on', 'beep on highlight'],
+ 'beep_highlight_whitelist' => ['off', 'turn whitelist for highlights on or off'],
+ 'beep_highlight_blacklist' => ['off', 'turn blacklist for highlights on or off'],
+ 'beep_dcc' => ['on', 'beep on dcc'],
+ 'beep_trigger_pv' => ['', 'word that will trigger execution of beep_command_pv (it empty, anything will trigger)'],
+ 'beep_trigger_highlight' => ['', 'word that will trigger execution of beep_command_highlight (if empty, anything will trigger)'],
+ 'beep_command_pv' => ['$bell', 'command for beep on private message, special value "$bell" is allowed, as well as "$bell;command"'],
+ 'beep_command_highlight' => ['$bell', 'command for beep on highlight, special value "$bell" is allowed, as well as "$bell;command"'],
+ 'beep_command_dcc' => ['$bell', 'command for beep on dcc, special value "$bell" is allowed, as well as "$bell;command"'],
+ 'beep_command_timeout' => ['30000', 'timeout for command run (in milliseconds, 0 = never kill (not recommended))'],
+ 'whitelist_nicks' => ['', 'comma-separated list of "server.nick": if not empty, only these nicks will trigger execution of commands (example: "freenode.nick1,freenode.nick2")'],
+ 'blacklist_nicks' => ['', 'comma-separated list of "server.nick": if not empty, these nicks will not be able to trigger execution of commands. Cannot be used in conjuction with whitelist (example: "freenode.nick1,freenode.nick2")'],
+ 'whitelist_channels' => ['', 'comma-separated list of "server.#channel": if not empty, only these channels will trigger execution of commands (example: "freenode.#weechat,freenode.#channel2")'],
+ 'bell_always' => ['', 'use $bell on private messages and/or highlights regardless of trigger and whitelist settings (example: "pv,highlight")'],
+);
+my %options = ();
+
+weechat::register($SCRIPT_NAME, "FlashCode <flashcode\@flashtux.org>", $VERSION,
+ "GPL3", "Beep (terminal bell) and/or run command on highlight/private message or new DCC", "", "");
+init_config();
+
+weechat::hook_config("plugins.var.perl.$SCRIPT_NAME.*", "toggle_config_by_set", "");
+weechat::hook_print("", "", "", 1, "pv_and_highlight", "");
+weechat::hook_signal("irc_dcc", "dcc", "");
+
+sub pv_and_highlight
+{
+ my ($data, $buffer, $date, $tags, $displayed, $highlight, $prefix, $message) = @_;
+
+ # return if message is filtered
+ return weechat::WEECHAT_RC_OK if ($displayed != 1);
+
+ # return if nick in message is own nick
+ my $nick = "";
+ $nick = $2 if ($tags =~ m/(^|,)nick_([^,]*)(,|$)/);
+ return weechat::WEECHAT_RC_OK if (weechat::buffer_get_string($buffer, "localvar_nick") eq $nick);
+
+ # highlight
+ if ($highlight)
+ {
+ # Always print visual bel, regardless of whitelist and trigger settings
+ # beep_command_highlight does not need to contain $bell
+ if ($options{bell_always} =~ m/(^|,)highlight(,|$)/)
+ {
+ print STDERR "\a";
+ }
+ # Channels whitelist for highlights
+ if ($options{beep_highlight} eq "on")
+ {
+ if ($options{whitelist_channels} ne "")
+ {
+ my $serverandchannel = weechat::buffer_get_string($buffer, "localvar_server"). "." .
+ weechat::buffer_get_string($buffer, "localvar_channel");
+ if ($options{beep_trigger_highlight} eq "" or $message =~ m/\b$options{beep_trigger_highlight}\b/)
+ {
+ if ($options{whitelist_channels} =~ /(^|,)$serverandchannel(,|$)/)
+ {
+ beep_exec_command($options{beep_command_highlight});
+ }
+ # What if we are highlighted and we're in a PM? For now, do nothing.
+ }
+ }
+ else
+ {
+ # Execute $bell and/or command with trigger and whitelist/blacklist settings
+ beep_trigger_whitelist_blacklist($buffer, $message, $nick, $options{beep_trigger_highlight},
+ $options{beep_highlight_whitelist}, $options{beep_highlight_blacklist},
+ $options{beep_command_highlight});
+ }
+ }
+ }
+ # private message
+ elsif (weechat::buffer_get_string($buffer, "localvar_type") eq "private" and $tags =~ m/(^|,)notify_private(,|$)/)
+ {
+ # Always print visual bel, regardless of whitelist and trigger settings
+ # beep_command_pv does not need to contain $bell
+ if ($options{bell_always} =~ m/(^|,)pv(,|$)/)
+ {
+ print STDERR "\a";
+ }
+ # Execute $bell and/or command with trigger and whitelist/blacklist settings
+ if ($options{beep_pv} eq "on")
+ {
+ beep_trigger_whitelist_blacklist($buffer, $message, $nick, $options{beep_trigger_pv},
+ $options{beep_pv_whitelist}, $options{beep_pv_blacklist},
+ $options{beep_command_pv});
+ }
+ }
+ return weechat::WEECHAT_RC_OK;
+}
+
+sub dcc
+{
+ beep_exec_command($options{beep_command_dcc}) if ($options{beep_dcc} eq "on");
+ return weechat::WEECHAT_RC_OK;
+}
+
+sub beep_trigger_whitelist_blacklist
+{
+ my ($buffer, $message, $nick, $trigger, $whitelist, $blacklist, $command) = @_;
+
+ if ($trigger eq "" or $message =~ m/\b$trigger\b/)
+ {
+ my $serverandnick = weechat::buffer_get_string($buffer, "localvar_server").".".$nick;
+ if ($whitelist eq "on" and $options{whitelist_nicks} ne "")
+ {
+ # What to do if there's a wildcard in the whitelit
+ if ($options{whitelist_nicks} =~ m/\*/ and
+ match_in_wild_card($serverandnick, $options{whitelist_nicks}))
+ {
+ beep_exec_command($command);
+ }
+ # What to do if there's no wildcard in the whitelist
+ elsif ($options{whitelist_nicks} =~ /(^|,)$serverandnick(,|$)/)
+ {
+ beep_exec_command($command);
+ }
+ }
+ elsif ($blacklist eq "on" and $options{blacklist_nicks} ne "")
+ {
+ # What to do if there's a wildcard in the blacklist
+ if ($options{blacklist_nicks} =~ m/\*/ and
+ !match_in_wild_card($serverandnick, $options{blacklist_nicks}))
+ {
+ beep_exec_command($command);
+ }
+ # What to do if there's no wildcard in the blacklist
+ elsif ($options{blacklist_nicks} !~ /(^|,)$serverandnick(,|$)/)
+ {
+ beep_exec_command($command);
+ }
+ }
+ # What to do if we are not using whitelist of blacklist feature
+ elsif ($whitelist eq "off" and $blacklist eq "off")
+ {
+ beep_exec_command($command);
+ }
+ }
+}
+
+sub beep_exec_command
+{
+ my $command = $_[0];
+ if ($command =~ /^\$bell/)
+ {
+ print STDERR "\a";
+ ($command) = $command =~ /^\$bell;(.+)$/;
+ }
+ weechat::hook_process($command, $options{beep_command_timeout}, "my_process", "") if ($command);
+}
+
+sub match_in_wild_card
+{
+ my ($serverandnick, $white_or_black) = @_;
+ my $nick_iter;
+ my @array_of_nicks = split(",", $white_or_black);
+
+ foreach $nick_iter (@array_of_nicks)
+ {
+ $nick_iter =~ s/\*/[^,]*/g;
+ if ($serverandnick =~ /$nick_iter/)
+ {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+sub my_process
+{
+ return weechat::WEECHAT_RC_OK;
+}
+
+sub toggle_config_by_set
+{
+ my ($pointer, $name, $value) = @_;
+ $name = substr($name, length("plugins.var.perl.".$SCRIPT_NAME."."), length($name));
+ $options{$name} = $value;
+ return weechat::WEECHAT_RC_OK;
+}
+
+sub init_config
+{
+ my $version = weechat::info_get("version_number", "") || 0;
+ foreach my $option (keys %options_default)
+ {
+ if (!weechat::config_is_set_plugin($option))
+ {
+ weechat::config_set_plugin($option, $options_default{$option}[0]);
+ $options{$option} = $options_default{$option}[0];
+ }
+ else
+ {
+ $options{$option} = weechat::config_get_plugin($option);
+ }
+ if ($version >= 0x00030500)
+ {
+ weechat::config_set_desc_plugin($option, $options_default{$option}[1]." (default: \"".$options_default{$option}[0]."\")");
+ }
+ }
+}
--- /dev/null
+#
+# Copyright (C) 2008-2012 Sebastien Helleu <flashcode@flashtux.org>
+# Copyright (C) 2011-2012 Nils G <weechatter@arcor.de>
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+#
+# Display sidebar with list of buffers.
+#
+# History:
+#
+# 2012-06-02, nils_2 <weechatter@arcor.de>:
+# v3.5: add values "server|channel|private|all|keepserver|none" to option "hide_merged_buffers" (suggested by dominikh).
+# 2012-05-25, nils_2 <weechatter@arcor.de>:
+# v3.4: add new option "show_lag".
+# 2012-04-07, Sebastien Helleu <flashcode@flashtux.org>:
+# v3.3: fix truncation of wide chars in buffer name (option name_size_max) (bug #36034)
+# 2012-03-15, nils_2 <weechatter@arcor.de>:
+# 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 <flashcode@flashtux.org>:
+# v3.1: fix reload of config file
+# 2012-01-29, nils_2 <weechatter@arcor.de>:
+# v3.0: fix: buffers did not update directly during window_switch (reported by FiXato)
+# 2012-01-29, nils_2 <weechatter@arcor.de>:
+# v2.9: add options "name_size_max" and "name_crop_suffix"
+# 2012-01-08, nils_2 <weechatter@arcor.de>:
+# 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 <flashcode@flashtux.org>:
+# v2.7: fix regex lookup in whitelist buffers list
+# 2011-12-04, nils_2 <weechatter@arcor.de>:
+# 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 <weechatter@arcor.de>:
+# v2.5: add new options "show_number_char" and "color_number_char",
+# add help-description for options
+# 2011-08-24, Sebastien Helleu <flashcode@flashtux.org>:
+# v2.4: add mouse support
+# 2011-06-06, nils_2 <weechatter@arcor.de>:
+# v2.3: added: missed option "color_whitelist_default"
+# 2011-03-23, Sebastien Helleu <flashcode@flashtux.org>:
+# v2.2: fix color of nick prefix with WeeChat >= 0.3.5
+# 2011-02-13, nils_2 <weechatter@arcor.de>:
+# v2.1: add options "color_whitelist_*"
+# 2010-10-05, Sebastien Helleu <flashcode@flashtux.org>:
+# v2.0: add options "sort" and "show_number"
+# 2010-04-12, Sebastien Helleu <flashcode@flashtux.org>:
+# v1.9: replace call to log() by length() to align buffer numbers
+# 2010-04-02, Sebastien Helleu <flashcode@flashtux.org>:
+# v1.8: fix bug with background color and option indenting_number
+# 2010-04-02, Helios <helios@efemes.de>:
+# v1.7: add indenting_number option
+# 2010-02-25, m4v <lambdae2@gmail.com>:
+# v1.6: add option to hide empty prefixes
+# 2010-02-12, Sebastien Helleu <flashcode@flashtux.org>:
+# v1.5: add optional nick prefix for buffers like IRC channels
+# 2009-09-30, Sebastien Helleu <flashcode@flashtux.org>:
+# v1.4: remove spaces for indenting when bar position is top/bottom
+# 2009-06-14, Sebastien Helleu <flashcode@flashtux.org>:
+# v1.3: add option "hide_merged_buffers"
+# 2009-06-14, Sebastien Helleu <flashcode@flashtux.org>:
+# v1.2: improve display with merged buffers
+# 2009-05-02, Sebastien Helleu <flashcode@flashtux.org>:
+# v1.1: sync with last API changes
+# 2009-02-21, Sebastien Helleu <flashcode@flashtux.org>:
+# v1.0: remove timer used to update bar item first time (not needed any more)
+# 2009-02-17, Sebastien Helleu <flashcode@flashtux.org>:
+# v0.9: fix bug with indenting of private buffers
+# 2009-01-04, Sebastien Helleu <flashcode@flashtux.org>:
+# v0.8: update syntax for command /set (comments)
+# 2008-10-20, Jiri Golembiovsky <golemj@gmail.com>:
+# v0.7: add indenting option
+# 2008-10-01, Sebastien Helleu <flashcode@flashtux.org>:
+# v0.6: add default color for buffers, and color for current active buffer
+# 2008-09-18, Sebastien Helleu <flashcode@flashtux.org>:
+# v0.5: fix color for "low" level entry in hotlist
+# 2008-09-18, Sebastien Helleu <flashcode@flashtux.org>:
+# v0.4: rename option "show_category" to "short_names",
+# remove option "color_slash"
+# 2008-09-15, Sebastien Helleu <flashcode@flashtux.org>:
+# v0.3: fix bug with priority in hotlist (var not defined)
+# 2008-09-02, Sebastien Helleu <flashcode@flashtux.org>:
+# 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 <flashcode@flashtux.org>:
+# 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 $version = "3.5";
+
+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", # catch all left mouse button gestures
+ "\@item(buffers):button2" => "hsignal:buffers_mouse"); # catch right mouse button
+my %options;
+my %hotlist_level = (0 => "low", 1 => "message", 2 => "private", 3 => "highlight");
+my @whitelist_buffers = ();
+my @immune_detach_buffers= ();
+my @buffers_focus = ();
+my %buffers_timer = ();
+my %Hooks = ();
+
+# --------------------------------[ init ]--------------------------------------
+weechat::register("buffers", "Sebastien Helleu <flashcode\@flashtux.org>", $version,
+ "GPL3", "Sidebar with list of buffers", "", "");
+my $weechat_version = weechat::info_get("version_number", "") || 0;
+
+buffers_config_init();
+buffers_config_read();
+
+weechat::bar_item_new("buffers", "build_buffers", "");
+weechat::bar_new("buffers", "0", "0", "root", "", "left", "horizontal",
+ "vertical", "0", "0", "default", "default", "default", "1",
+ "buffers");
+weechat::hook_signal("buffer_*", "buffers_signal_buffer", "");
+weechat::hook_signal("window_switch", "buffers_signal_buffer", "");
+weechat::hook_signal("hotlist_*", "buffers_signal_hotlist", "");
+weechat::bar_item_update("buffers");
+if ($weechat_version >= 0x00030600)
+{
+ weechat::hook_focus("buffers", "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", "");
+}
+
+ weechat::hook_config("buffers.look.show_lag", "hook_timer_lag", "");
+
+# -------------------------------- [ 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 .= $_ .",";
+ }
+ chop $buffers_list; # remove last ","
+ 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_buffer", "");
+ }
+ weechat::bar_item_update("buffers");
+ return weechat::WEECHAT_RC_OK;
+}
+
+sub hook_timer_lag
+{
+ my $lag = $_[2];
+ if ( $lag eq 0 )
+ {
+ 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("buffers");
+ 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", "", "", ""],
+);
+
+my %default_options_look =
+(
+ "show_lag" => ["show_lag","boolean","show lag behind servername. 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 differnt 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", "", "", ""],
+ "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 channel number in front of buffername", "", 0, 0,"on", "on", 0, "", "", "buffers_signal_config", "", "", ""],
+ "show_number_char" => ["number_char", "string", "display a char after channel number", "", 0, 0,".", ".", 0, "", "", "buffers_signal_config", "", "", ""],
+ "show_prefix" => ["prefix", "boolean", "show your prefix for channel", "", 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", "", "", ""],
+ "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 channel from buffers list after a specific period of time (in seconds) without action (weechat ≥ 0.3.8 required)", "", 0, 31536000,0, "number", 0, "", "", "buffers_signal_config", "", "", ""],
+ "immune_detach_buffers" => ["immune_detach_buffers", "string", "comma separated list of buffers which will not get detached automatically. Good with e.g. BitlBee", "", 0, 0,"", "", 0, "", "", "buffers_signal_config_immune_detach_buffers", "", "", ""],
+);
+ # 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]);
+ }
+}
+
+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");
+ }
+ 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;
+ $infolist = weechat::infolist_get("buffer", "", "");
+ while (weechat::infolist_next($infolist))
+ {
+ 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->{"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");
+# weechat::print("",$buffer->{"type"});
+
+ unless( grep {$_ eq $buffer->{"name"}} @immune_detach_buffers )
+ {
+ my $detach_time = weechat::config_integer( $options{"detach"});
+ my $current_time = time();
+ # 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);
+
+ # check for detach
+ unless ( $buffer->{"current_buffer"} eq 0
+ and not exists $hotlist{$buffer->{"pointer"}}
+ and $buffer->{"type"} eq "channel"
+ 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);
+ }
+ }
+ }
+ else
+ {
+ if ($active_seen)
+ {
+ push(@current2, $buffer);
+ }
+ else
+ {
+ push(@current1, $buffer);
+ }
+ }
+
+ } # while end
+
+
+ if ($max_number >= 1)
+ {
+ $max_number_digits = length(int($max_number));
+ }
+ @buffers = (@buffers, @current2, @current1);
+ weechat::infolist_free($infolist);
+
+ # sort buffers by number, name or shortname
+ my %sorted_buffers;
+ if (1)
+ {
+ my $number = 0;
+ for my $buffer (@buffers)
+ {
+ my $key;
+ if (weechat::config_integer( $options{"sort"} ) eq 1) # number = 0; name = 1
+ {
+ my $name = $buffer->{"name"};
+ $name = $buffer->{"short_name"} if (weechat::config_boolean( $options{"short_names"} ) eq 1);
+ if (weechat::config_integer($options{"name_size_max"}) >= 1){
+ $name = encode("UTF-8", substr(decode("UTF-8", $name), 0, weechat::config_integer($options{"name_size_max"})));
+ }
+ 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);
+ }
+ $sorted_buffers{$key} = $buffer;
+ $number++;
+ }
+ }
+
+ # build string with buffers
+ $old_number = -1;
+ foreach my $key (sort keys %sorted_buffers)
+ {
+ my $buffer = $sorted_buffers{$key};
+
+ if ( weechat::config_string($options{"hide_merged_buffers"}) eq "server" )
+ {
+ # buffer type "server" or merged with core?
+ if ( ($buffer->{"type"} eq "server" or $buffer->{"plugin_name"} eq "core") && (! $buffer->{"active"}) )
+ {
+ next;
+ }
+ }
+ if ( weechat::config_string($options{"hide_merged_buffers"}) eq "channel" )
+ {
+ # buffer type "channel" or merged with core?
+ if ( ($buffer->{"type"} eq "channel" or $buffer->{"plugin_name"} eq "core") && (! $buffer->{"active"}) )
+ {
+ next;
+ }
+ }
+ if ( weechat::config_string($options{"hide_merged_buffers"}) eq "private" )
+ {
+ # buffer type "private" or merged with core?
+ if ( ($buffer->{"type"} eq "private" or $buffer->{"plugin_name"} eq "core") && (! $buffer->{"active"}) )
+ {
+ next;
+ }
+ }
+ if ( weechat::config_string($options{"hide_merged_buffers"}) eq "keepserver" )
+ {
+ if ( ($buffer->{"type"} ne "server" or $buffer->{"plugin_name"} eq "core") && (! $buffer->{"active"}) )
+ {
+ next;
+ }
+ }
+ if ( weechat::config_string($options{"hide_merged_buffers"}) eq "all" )
+ {
+ if ( ! $buffer->{"active"} )
+ {
+ next;
+ }
+ }
+
+ push(@buffers_focus, $buffer); # buffer > buffers_focus, for mouse support
+ my $color = "";
+ my $bg = "";
+
+ $color = weechat::config_color( $options{"color_default_fg"} );
+ $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" )
+ {
+ $bg = weechat::config_color( $options{"queries_default_bg"} );
+ $color = weechat::config_color( $options{"queries_default_fg"} );
+ }
+ }
+ # check for core and buffer with free content
+ if ( (weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") ne "channel" ) and ( weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") ne "private") )
+ {
+ $color = 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)
+ {
+ $color = weechat::config_color( $options{"color_whitelist_default_fg"} );
+ $bg = weechat::config_color( $options{"color_whitelist_default_bg"} );
+ }
+
+ $color = "default" if ($color 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)
+ {
+ $bg = weechat::config_color( $options{"color_whitelist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_bg"} );
+ $color = weechat::config_color( $options{"color_whitelist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_fg"} );
+ }
+ 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 )
+ {
+ $bg = weechat::config_color( $options{"queries_message_bg"} );
+ $color = weechat::config_color( $options{"queries_message_fg"} );
+ }
+
+ elsif ( ($hotlist{$buffer->{"pointer"}}) == 3 )
+ {
+ $bg = weechat::config_color( $options{"queries_highlight_bg"} );
+ $color = weechat::config_color( $options{"queries_highlight_fg"} );
+ }
+ }else
+ {
+ $bg = weechat::config_color( $options{"color_hotlist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_bg"} );
+ $color = weechat::config_color( $options{"color_hotlist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_fg"} );
+ }
+ }else
+ {
+ $bg = weechat::config_color( $options{"color_hotlist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_bg"} );
+ $color = weechat::config_color( $options{"color_hotlist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_fg"} );
+ }
+ }
+
+ if ($buffer->{"current_buffer"})
+ {
+ $color = weechat::config_color( $options{"color_current_fg"} );
+ $bg = weechat::config_color( $options{"color_current_bg"} );
+ }
+ my $color_bg = "";
+ $color_bg = weechat::color(",".$bg) if ($bg ne "");
+
+ # create channel number for output
+ 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(int($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
+ {
+ my $indent = "";
+ $indent = ((" " x length($buffer->{"number"}))." ") if (($position eq "left") || ($position eq "right"));
+ $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 1 )
+ {
+ $str .= " ";
+ }
+ elsif ( (weechat::config_integer($options{"indenting"}) eq 2) and (weechat::config_integer($options{"indenting_number"}) eq 0) ) #under_name
+ {
+ if ( weechat::config_boolean( $options{"show_number"} ) eq 0 )
+ {
+ $str .= " ";
+ }else
+ {
+ $str .= ( (" " x ( $max_number_digits - length($buffer->{"number"}) ))." " );
+ }
+ }
+ }
+ }
+ if (weechat::config_boolean( $options{"show_prefix"} ) eq 1)
+ {
+ my $nickname = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_nick");
+ if ($nickname ne "")
+ {
+ # 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 ne "")
+ {
+ my $version = weechat::info_get("version_number", "");
+ $version = 0 if ($version eq "");
+ 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 ne " ") or (weechat::config_boolean( $options{"show_prefix_empty"} ) eq 1))
+ {
+ # with version >= 0.3.5, it is now a color name (for older versions: option name with color)
+ if (int($version) >= 0x00030500)
+ {
+ $str .= weechat::color(weechat::infolist_string($infolist_nick, "prefix_color"));
+ }
+ else
+ {
+ $str .= weechat::color(weechat::config_color(
+ weechat::config_get(
+ weechat::infolist_string($infolist_nick, "prefix_color"))));
+ }
+ $str .= $prefix;
+ }
+ last;
+ }
+ }
+ weechat::infolist_free($infolist_nick);
+ }
+ }
+ }
+ $str .= weechat::color($color) . weechat::color(",".$bg);
+
+ if (weechat::config_boolean( $options{"short_names"} ) eq 1)
+ {
+ if (weechat::config_integer($options{"name_size_max"}) >= 1) # check max_size of buffer name
+ {
+ $str .= encode("UTF-8", substr(decode("UTF-8", $buffer->{"short_name"}), 0, weechat::config_integer($options{"name_size_max"})));
+ $str .= weechat::color(weechat::config_color( $options{"color_number_char"})).weechat::config_string($options{"name_crop_suffix"}) if (length($buffer->{"short_name"}) > weechat::config_integer($options{"name_size_max"}));
+ }
+ else
+ {
+ $str .= $buffer->{"short_name"};
+ }
+ }
+ else
+ {
+ if (weechat::config_integer($options{"name_size_max"}) >= 1) # check max_size of buffer name
+ {
+ $str .= encode("UTF-8", substr(decode("UTF-8", $buffer->{"name"},), 0, weechat::config_integer($options{"name_size_max"})));
+ $str .= weechat::color(weechat::config_color( $options{"color_number_char"})).weechat::config_string($options{"name_crop_suffix"}) if (length($buffer->{"name"}) > weechat::config_integer($options{"name_size_max"}));
+ }
+ else
+ {
+ $str .= $buffer->{"name"};
+ }
+ }
+ 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") . ")";
+ }
+ }
+ $str .= "\n";
+ $old_number = $buffer->{"number"};
+ }
+
+ return $str;
+}
+
+sub buffers_signal_buffer
+{
+my ($data, $signal, $signal_data) = @_;
+ # check for buffer_switch and set the detach time 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};
+ }
+ }
+ if ($signal eq "buffer_opened")
+ {
+ my $current_time = time();
+ $buffers_timer{$signal_data} = $current_time;
+ }
+ if ($signal eq "buffer_closing")
+ {
+ delete $buffers_timer{$signal_data};
+ }
+ }
+
+ weechat::bar_item_update("buffers");
+ return weechat::WEECHAT_RC_OK;
+}
+
+sub buffers_signal_hotlist
+{
+ weechat::bar_item_update("buffers");
+ return weechat::WEECHAT_RC_OK;
+}
+
+
+sub buffers_signal_config_whitelist
+{
+ @whitelist_buffers = ();
+ @whitelist_buffers = split( /,/, weechat::config_string( $options{"look_whitelist_buffers"} ) );
+ weechat::bar_item_update("buffers");
+ return weechat::WEECHAT_RC_OK;
+}
+sub buffers_signal_config_immune_detach_buffers
+{
+ @immune_detach_buffers = ();
+ @immune_detach_buffers = split( /,/, weechat::config_string( $options{"immune_detach_buffers"} ) );
+ weechat::bar_item_update("buffers");
+ return weechat::WEECHAT_RC_OK;
+}
+
+sub buffers_signal_config
+{
+ weechat::bar_item_update("buffers");
+ 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 "buffers") && ($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_integer($options{"jump_prev_next_visited_buffer"}) eq 1 )
+ {
+ 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);
+ }
+ }
+ elsif ( ($hash{"_key"} eq "button2") && (weechat::config_integer($options{"jump_prev_next_visited_buffer"}) eq 1) )# right mouse button
+ {
+ if ( $current_buffer eq $hash{"number2"} )
+ {
+ weechat::command("","/input jump_next_visited_buffer");
+ }
+ }
+ else
+ {
+ move_buffer(%hash);
+ }
+}
+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 = "999999";
+ $number2 = "1" if (($hash{"_key"} =~ /gesture-left/) || ($hash{"_key"} =~ /gesture-up/));
+ }
+ my $ptrbuf = weechat::current_buffer();
+ weechat::command($hash{"pointer"}, "/buffer move ".$number2);
+}
--- /dev/null
+#
+# chanmon.pl - Channel Monitoring for weechat 0.3.0
+# Version 2.3.1
+#
+# Add 'Channel Monitor' buffer/bar that you can position to show IRC channel
+# messages in a single location without constantly switching buffers
+# i.e. In a seperate window beneath the main channel buffer
+#
+# Usage:
+# /chanmon [help] | [monitor [channel [server]]] | [dynmon] | [clean default|orphan|all]
+# Command wrapper for chanmon commands
+#
+# /chmonitor [channel] [server] is used to toggle a channel 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. /monitor #weechat freenode
+#
+# /dynmon is used to toggle 'Dynamic Channel Monitoring' on and off, this
+# will automagically stop monitoring the current active buffer, without
+# affecting regular settings (Default is off)
+#
+# /chanclean default|orphan|all will clean the config section of default 'on' entries,
+# channels you are no longer joined, or both
+#
+# /set plugins.var.perl.chanmon.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.chanmon.short_names
+# Setting this to 'on' will trim the network name from chanmon, ala buffers.pl
+#
+# /set plugins.var.perl.chanmon.merge_private
+# Setting this to 'on' will merge private messages to chanmon's display
+#
+# /set plugins.var.perl.chanmon.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.chanmon.show_aways
+# Toggles showing the Weechat away messages
+#
+# /set plugins.var.perl.chanmon.logging
+# Toggles logging status for chanmon buffer (default: off)
+#
+# /set plugins.var.perl.chanmon.output
+# Changes where output method of chanmon; takes either "bar" or "buffer" (default; buffer)
+# /set plugins.var.perl.chanmon.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.chanmon.nick_prefix
+# /set plugins.var.perl.chanmon.nick_suffix
+# Sets the prefix and suffix chars in the chanmon 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)
+#
+# Ideal set up:
+# Split the layout 70/30 (or there abouts) horizontally and load
+# Optionally, make the status and input lines only show on active windows
+#
+# /window splith 70 --> open the chanmon buffer
+# /set weechat.bar.status.conditions "active"
+# /set weechat.bar.input.conditions "active"
+
+# History:
+# 2012-04-15, KenjiE20 <longbow@longbowslair.co.uk>:
+# v2.3.1: -fix: Colour tags in bar timestamp string, bar error fixes from highmon
+# 2012-02-28, KenjiE20 <longbow@longbowslair.co.uk>:
+# v2.3: -feature: Added merge_private option to display private messages (default: off)
+# 2010-12-22, KenjiE20 <longbow@longbowslair.co.uk>:
+# v2.2: -change: Use API instead of config to find channel colours, ready for 0.3.4 and 256 colours
+# 2010-12-05, KenjiE20 <longbow@longbowslair.co.uk>:
+# v2.1.3: -change: /monitor is now /chmonitor to avoid command conflicts (thanks m4v)
+# (/chanmon monitor remains the same)
+# -fix: Add command list to inbuilt help
+# 2010-09-30, KenjiE20 <longbow@longbowslair.co.uk>:
+# v2.1.2: -fix: logging config was not correctly toggling back on (thanks to sleo for noticing)
+# 2010-09-20, m4v <lambdae2@gmail.com>:
+# v2.1.1: -fix: chanmon wasn't detecting buffers displayed on more than one window
+# 2010-08-27, KenjiE20 <longbow@longbowslair.co.uk>:
+# v2.1: -feature: Add 'nchannel' option to alignment to display buffer and name
+# 2010-04-25, KenjiE20 <longbow@longbowslair.co.uk>:
+# v2.0: Release as version 2.0
+# 2010-04-24, KenjiE20 <longbow@longbowslair.co.uk>:
+# -fix: No longer using hard-coded detection for ACTION and
+# TOPIC messages. Use config settings for ACTION printing
+# 2010-04-15, KenjiE20 <longbow@longbowslair.co.uk>:
+# v1.9: Rewrite for v2.0
+# -feature: /monitor takes arguments
+# -feature: Added /chanclean for config cleanup
+# -feature: Buffer logging option (default: off)
+# -feature: Selectable output (Bar/Buffer (default))
+# -feature: /chanmon is now a command wrapper for all commands
+# /help chanmon gives command help
+# /chanmon help gives config help
+# -code change: Made more subs to shrink the code down in places
+# -fix: Stop chanmon attempting to double load/hook
+# 2010-02-10, m4v <lambdae2@gmail.com>:
+# v1.7.1: -fix: chanmon was leaking infolists, changed how chanmon
+# detects if the buffer is displayed or not.
+# 2010-01-25, KenjiE20 <longbow@longbowslair.co.uk>:
+# v1.7: -fixture: Let chanmon be aware of nick_prefix/suffix
+# and allow custom prefix/suffix for chanmon buffer
+# (Defaults to <> if nothing set, and blank if there is)
+# -fix: Make dynamic monitoring aware of multiple windows
+# rather than just the active buffer
+# (Thanks to m4v for these)
+# 2009-09-07, KenjiE20 <longbow@longbowslair.co.uk>:
+# v1.6: -feature: colored buffer names
+# -change: chanmon version sync
+# 2009-09-05, KenjiE20 <longbow@longbowslair.co.uk>:
+# v1.5: -fix: disable buffer highlight
+# 2009-09-02, KenjiE20 <longbow@longbowslair.co.uk>:
+# v.1.4.1 -change: Stop unsightly text block on '/help'
+# 2009-08-10, KenjiE20 <longbow@longbowslair.co.uk>:
+# v1.4: -feature: In-client help added
+# -fix: Added missing help entries
+# Fix remaining ugly vars
+# 2009-07-09, KenjiE20 <longbow@longbowslair.co.uk>:
+# v.1.3.3 -fix: highlight on the channel monitor when someone /me highlights
+# 2009-07-04, KenjiE20 <longbow@longbowslair.co.uk>:
+# v.1.3.2 -fix: use new away_info tag instead of ugly regexp for away detection
+# -code: cleanup old raw callback arguement variables to nice neat named ones
+# 2009-07-04, KenjiE20 <longbow@longbowslair.co.uk>:
+# v.1.3.1 -feature(tte): Hide /away messages by default, change 'show_aways' to get them back
+# 2009-07-01, KenjiE20 <longbow@longbowslair.co.uk>:
+# v.1.3 -feature(tte): Mimic buffers.pl 'short_names'
+# 2009-06-29, KenjiE20 <longbow@longbowslair.co.uk>:
+# v.1.2.1 -fix: let the /monitor message respect the alignment setting
+# 2009-06-19, KenjiE20 <longbow@longbowslair.co.uk>:
+# v.1.2 -feature(tte): Customisable alignment
+# Thanks to 'FreakGaurd' for the idea
+# 2009-06-14, KenjiE20 <longbow@longbowslair.co.uk>:
+# v.1.1.2 -fix: don't assume chanmon buffer needs creating
+# fixes crashing with /upgrade
+# 2009-06-13, KenjiE20 <longbow@longbowslair.co.uk>:
+# v.1.1.1 -code: change from True/False to on/off for weechat consistency
+# Settings WILL NEED to be changed manually from previous versions
+# 2009-06-13, KenjiE20 <longbow@longbowslair.co.uk>:
+# v1.1: -feature: Dynamic Channel Monitoring,
+# don't display messages from active channel buffer
+# defaults to Disabled
+# Thanks to 'sjohnson' for the idea
+# -fix: don't set config entries for non-channels
+# -fix: don't assume all channels are #
+# 2009-06-12, KenjiE20 <longbow@longbowslair.co.uk>:
+# v1.0.1: -fix: glitch with tabs in IRC messages
+# 2009-06-10, KenjiE20 <longbow@longbowslair.co.uk>:
+# v1.0: Initial Public Release
+
+# Copyright (c) 2009 by KenjiE20 <longbow@longbowslair.co.uk>
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+
+@bar_lines = ();
+@bar_lines_time = ();
+# Replicate info earlier for in-client help
+$chanmonhelp = weechat::color("bold")."/chanmon [help] | [monitor [channel [server]]] | [dynmon] | [clean default|orphan|all]".weechat::color("-bold")."
+Command wrapper for chanmon commands
+
+".weechat::color("bold")."/chmonitor [channel] [server]".weechat::color("-bold")." is used to toggle a channel 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. /monitor #weechat freenode
+
+".weechat::color("bold")."/dynmon".weechat::color("-bold")." is used to toggle 'Dynamic Channel Monitoring' on and off, this will automagically stop monitoring the current active buffer, without affecting regular settings (Default is off)
+
+".weechat::color("bold")."/chanclean".weechat::color("-bold")." default|orphan|all will clean the config section of default 'on' entries, channels you are no longer joined, or both
+
+".weechat::color("bold")."/set plugins.var.perl.chanmon.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.chanmon.short_names".weechat::color("-bold")."
+ Setting this to 'on' will trim the network name from chanmon, ala buffers.pl
+
+".weechat::color("bold")."/set plugins.var.perl.chanmon.merge_private".weechat::color("-bold")."
+ Setting this to 'on' will merge private messages to chanmon's display
+
+".weechat::color("bold")."/set plugins.var.perl.chanmon.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.chanmon.show_aways".weechat::color("-bold")."
+ Toggles showing the Weechat away messages
+
+".weechat::color("bold")."/set plugins.var.perl.chanmon.logging".weechat::color("-bold")."
+ Toggles logging status for chanmon buffer (default: off)
+
+".weechat::color("bold")."/set plugins.var.perl.chanmon.output".weechat::color("-bold")."
+ Changes where output method of chanmon; takes either \"bar\" or \"buffer\" (default; buffer)
+".weechat::color("bold")."/set plugins.var.perl.chanmon.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.chanmon.nick_prefix".weechat::color("-bold")."
+".weechat::color("bold")."/set plugins.var.perl.chanmon.nick_suffix".weechat::color("-bold")."
+ Sets the prefix and suffix chars in the chanmon 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")."Ideal set up:".weechat::color("-bold")."
+Split the layout 70/30 (or there abouts) horizontally and load
+Optionally, make the status and input lines only show on active windows
+
+".weechat::color("bold")."/window splith 70 --> open the chanmon buffer".weechat::color("-bold")."
+".weechat::color("bold")."/set weechat.bar.status.conditions \"active\"".weechat::color("-bold")."
+".weechat::color("bold")."/set weechat.bar.input.conditions \"active\"".weechat::color("-bold");
+# Print verbose help
+sub print_help
+{
+ weechat::print("", "\t".weechat::color("bold")."Chanmon Help".weechat::color("-bold")."\n\n");
+ weechat::print("", "\t".$chanmonhelp);
+ return weechat::WEECHAT_RC_OK;
+}
+
+# Bar item build
+sub chanmon_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
+ foreach(@bar_lines)
+ {
+ # Find max align needed
+ $prefix_num = (index(weechat::string_remove_color($_, ""), " | "));
+ $align_num = $prefix_num if ($prefix_num > $align_num);
+ }
+ foreach(@bar_lines)
+ {
+ # Get align for this line
+ $prefix_num = (index(weechat::string_remove_color($_, ""), " | "));
+
+ # 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 chanmon_bar_open
+{
+ # Make the bar item
+ weechat::bar_item_new("chanmon", "chanmon_bar_build", "");
+
+ $chanmon_bar = weechat::bar_new ("chanmon", "off", 100, "root", "", "bottom", "vertical", "vertical", 0, 0, "default", "cyan", "default", "on", "chanmon");
+
+ return weechat::WEECHAT_RC_OK;
+}
+# Close bar
+sub chanmon_bar_close
+{
+ # Find if bar exists
+ $chanmon_bar = weechat::bar_search("chanmon");
+ # If is does, close it
+ if ($chanmon_bar ne "")
+ {
+ weechat::bar_remove($chanmon_bar);
+ }
+
+ # Find if bar item exists
+ $chanmon_bar_item = weechat::bar_item_search("chanmon_bar");
+ # If is does, close it
+ if ($chanmon_bar_item ne "")
+ {
+ weechat::bar_remove($chanmon_bar_item);
+ }
+
+ @bar_lines = ();
+ return weechat::WEECHAT_RC_OK;
+}
+
+# Make a new buffer
+sub chanmon_buffer_open
+{
+ # Search for pre-existing buffer
+ $chanmon_buffer = weechat::buffer_search("perl", "chanmon");
+
+ # Make a new buffer
+ if ($chanmon_buffer eq "")
+ {
+ $chanmon_buffer = weechat::buffer_new("chanmon", "chanmon_buffer_input", "", "chanmon_buffer_close", "");
+ }
+
+ # Turn off notify, highlights
+ if ($chanmon_buffer ne "")
+ {
+ weechat::buffer_set($chanmon_buffer, "notify", "0");
+ weechat::buffer_set($chanmon_buffer, "highlight_words", "-");
+ weechat::buffer_set($chanmon_buffer, "title", "Channel Monitor");
+ # Set no_log
+ if (weechat::config_get_plugin("logging") eq "off")
+ {
+ weechat::buffer_set($chanmon_buffer, "localvar_set_no_log", "1");
+ }
+ }
+ return weechat::WEECHAT_RC_OK;
+}
+# Buffer input has no action
+sub chanmon_buffer_input
+{
+ return weechat::WEECHAT_RC_OK;
+}
+# Close up
+sub chanmon_buffer_close
+{
+ $chanmon_buffer = "";
+ return weechat::WEECHAT_RC_OK;
+}
+
+# Chanmon command wrapper
+sub chanmon_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")
+ {
+ chanmon_toggle($data, $buffer, $arg);
+ }
+ # /dynmon command
+ elsif ($cmd eq "dynmon")
+ {
+ chanmon_dyn_toggle();
+ }
+ # /chanclean command
+ elsif ($cmd eq "clean")
+ {
+ chanmon_config_clean($data, $buffer, $arg);
+ }
+ return weechat::WEECHAT_RC_OK;
+}
+
+# Clean up config entries
+sub chanmon_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("", "\tchanmon.pl: Unknown option");
+ return weechat::WEECHAT_RC_OK;
+ }
+
+ @chans = ();
+ # Load an infolist of chanmon options
+ $infolist = weechat::infolist_get("option", "", "*chanmon*");
+ while (weechat::infolist_next($infolist))
+ {
+ $name = weechat::infolist_string($infolist, "option_name");
+ $name =~ s/perl\.chanmon\.(\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 = "\tchanmon.pl: Cleaned ".@chans." entry from the config:";
+ }
+ else
+ {
+ $str = "\tchanmon.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("", "\tchanmon.pl: No entries removed");
+ }
+ return weechat::WEECHAT_RC_OK;
+}
+
+# Check config elements
+sub chanmon_config_init
+{
+ # 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");
+ }
+
+ # Dynmon default
+ if (!(weechat::config_is_set_plugin ("dynamic")))
+ {
+ weechat::config_set_plugin("dynamic", "off");
+ }
+
+ # 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");
+ }
+
+ # Away message default
+ if (!(weechat::config_is_set_plugin ("show_aways")))
+ {
+ weechat::config_set_plugin("show_aways", "off");
+ }
+
+ # chanmon 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");
+ }
+
+ # 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 chanmon_config_cb
+{
+ $point = $_[0];
+ $name = $_[1];
+ $value = $_[2];
+
+ $name =~ s/^plugins\.var\.perl\.chanmon\.//;
+
+ # Set logging on buffer
+ if ($name eq "logging")
+ {
+ # Search for pre-existing buffer
+ $chanmon_buffer = weechat::buffer_search("perl", "chanmon");
+ if ($value eq "off")
+ {
+ weechat::buffer_set($chanmon_buffer, "localvar_set_no_log", "1");
+ }
+ else
+ {
+ weechat::buffer_set($chanmon_buffer, "localvar_del_no_log", "");
+ }
+ }
+ # Output changer
+ elsif ($name eq "output")
+ {
+ if ($value eq "bar")
+ {
+ # Search for pre-existing buffer
+ $chanmon_buffer = weechat::buffer_search("perl", "chanmon");
+ # Close if it exists
+ if ($chanmon_buffer ne "")
+ {
+ weechat::buffer_close($chanmon_buffer)
+ }
+
+ # Output bar lines default
+ if (!(weechat::config_is_set_plugin ("bar_lines")))
+ {
+ weechat::config_set_plugin("bar_lines", "10");
+ }
+ # Make a bar if doesn't exist
+ chanmon_bar_open();
+ }
+ elsif ($value eq "buffer")
+ {
+ # If a bar exists, close it
+ chanmon_bar_close();
+ # Open buffer
+ chanmon_buffer_open();
+ }
+
+ }
+ return weechat::WEECHAT_RC_OK;
+}
+
+# Toggle dynamic monitoring on/off
+sub chanmon_dyn_toggle
+{
+ if (weechat::config_get_plugin("dynamic") eq "off")
+ {
+ weechat::config_set_plugin("dynamic", "on");
+ chanmon_print("Dynamic Channel Monitoring Enabled");
+ return weechat::WEECHAT_RC_OK;
+ }
+ elsif (weechat::config_get_plugin("dynamic") eq "on")
+ {
+ weechat::config_set_plugin("dynamic", "off");
+ chanmon_print("Dynamic Channel Monitoring Disabled");
+ return weechat::WEECHAT_RC_OK;
+ }
+}
+
+# Set up weechat hooks / commands
+sub chanmon_hook
+{
+ weechat::hook_print("", "", "", 0, "chanmon_new_message", "");
+ weechat::hook_command("chmonitor", "Toggles monitoring for a channel", "[channel [server]]", " channel: What channel to toggle monitoring for\n server: Internal server name, if channel is on more than one server", "%(irc_channels) %(irc_servers)", "chanmon_toggle", "");
+ weechat::hook_command("dynmon", "Toggles 'dynamic' monitoring (auto-disable monitoring for current channel)", "", "", "", "chanmon_dyn_toggle", "");
+ weechat::hook_command("chanclean", "Chanmon 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", "chanmon_config_clean", "");
+
+ weechat::hook_command("chanmon", "Chanmon help", "[help] | [monitor [channel [server]]] | [dynmon] | [clean default|orphan|all]", " help: Print help for chanmon\n monitor: Toggles monitoring for a channel (/chmonitor)\n dynmon: Toggles 'dynamic' monitoring (auto-disable monitoring for current channel) (/dynmon)\n clean: Chanmon config clean up (/chanclean)", "help || monitor %(irc_channels) %(irc_servers) || dynmon || clean default|orphan|all", "chanmon_command_cb", "");
+
+ weechat::hook_config("plugins.var.perl.chanmon.*", "chanmon_config_cb", "");
+}
+
+# Main body, Callback for hook_print
+sub chanmon_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 messages and topic notices
+ if ($cb_tags =~ /irc_privmsg/ || $cb_tags =~ /irc_topic/)
+ {
+ # Check buffer name is an IRC channel or private message when enabled
+ $bufname = weechat::buffer_get_string($cb_bufferp, 'name');
+ if ($bufname =~ /(.*)\.([#&\+!])(.*)/ || (weechat::config_get_plugin("merge_private") eq "on" && $cb_tags =~ /notify_private/))
+ {
+ # Are we running on this channel
+ if (weechat::config_get_plugin($bufname) ne "off" && $cb_disp eq "1")
+ {
+ # Are we running dynamically
+ if (weechat::config_get_plugin("dynamic") eq "on")
+ {
+ # Check if this buffer is shown in a window somewhere
+ $window_displayed = weechat::buffer_get_integer($cb_bufferp, "num_displayed");
+ if ($window_displayed ne 0)
+ {
+ # Stop running
+ return weechat::WEECHAT_RC_OK;
+ }
+ }
+
+ # Format nick
+ # Line isn't action or topic notify
+ if (!($cb_tags =~ /irc_action/) && !($cb_tags =~ /irc_topic/))
+ {
+ # Highlight
+ if ($cb_high eq "1")
+ {
+ # 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");
+ }
+ # Normal line
+ else
+ {
+ # Format nick
+ $nick = " ".weechat::config_get_plugin("nick_prefix").$cb_prefix.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
+ {
+ # Highlight
+ if ($cb_high eq "1")
+ {
+ $uncolnick = weechat::string_remove_color($cb_prefix, "");
+ $nick = weechat::color("chat_highlight").$uncolnick.weechat::color("reset");
+ }
+ # Normal line
+ else
+ {
+ $nick = $cb_prefix.weechat::color("reset");
+ }
+ }
+ # Send to output
+ chanmon_print ($cb_msg, $cb_bufferp, $nick);
+ }
+ }
+ }
+ # Special outgoing ACTION & away_info catcher
+ elsif ($cb_tags eq "" || $cb_tags =~ /away_info/ && weechat::config_get_plugin("show_aways") eq "on" )
+ {
+ # Check buffer name is an IRC channel or private message when enabled
+ $bufname = weechat::buffer_get_string($cb_bufferp, 'name');
+ if ($bufname =~ /(.*)\.([#&\+!])(.*)/ || (weechat::config_get_plugin("merge_private") eq "on" && $cb_tags =~ /notify_private/))
+ {
+ # Are we running dynamically
+ if (weechat::config_get_plugin("dynamic") eq "on")
+ {
+ # Check if this buffer is shown in a window somewhere
+ $window_displayed = weechat::buffer_get_integer($cb_bufferp, "num_displayed");
+ if ($window_displayed eq 1)
+ {
+ # Stop running
+ return weechat::WEECHAT_RC_OK;
+ }
+ }
+
+ $net = $1;
+ $mynick = weechat::info_get("irc_nick", $net);
+ if ($cb_msg =~ $mynick)
+ {
+ $action_colour = weechat::color(weechat::config_string(weechat::config_get("weechat.color.chat_prefix_action")));
+ $action_prefix = weechat::config_string(weechat::config_get("weechat.look.prefix_action"));
+ $nick_self_colour = weechat::color(weechat::config_string(weechat::config_get("weechat.color.chat_nick_self")));
+ $nick = $action_colour.$action_prefix.$nick_self_colour.$nick.weechat::color("reset");
+ # Send to output
+ chanmon_print ($cb_msg, $cb_bufferp, $nick);
+ }
+ }
+ }
+ return weechat::WEECHAT_RC_OK;
+}
+
+# Output formatter and printer takes (msg bufpointer nick)
+sub chanmon_print
+{
+ $cb_msg = $_[0];
+ my $cb_bufferp = $_[1] if ($_[1]);
+ my $nick = $_[2] if ($_[2]);
+
+ #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;
+ }
+ }
+ # chanmon 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;
+ }
+ }
+ # chanmon 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
+ $chanmon_buffer = weechat::buffer_search("perl", "chanmon");
+ # Print
+ weechat::print($chanmon_buffer, $outstr);
+ }
+ elsif (weechat::config_get_plugin("output") eq "bar")
+ {
+ # Add time string
+ use POSIX qw(strftime);
+ $time = strftime(weechat::config_string(weechat::config_get("weechat.look.buffer_time_format")), localtime);
+ # Colourise
+ if ($time =~ /\$\{\w+\}/) # Coloured string
+ {
+ while ($time =~ /\$\{(\w+)\}/)
+ {
+ $color = weechat::color($1);
+ $time =~ s/\$\{\w+\}/$color/;
+ }
+ }
+ 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::color("reset");
+ $outstr =~ s/\t/$delim/;
+
+ push (@bar_lines, $outstr);
+ # Trigger update
+ weechat::bar_item_update("chanmon");
+ }
+}
+
+# Start the output display
+sub chanmon_start
+{
+ if (weechat::config_get_plugin("output") eq "buffer")
+ {
+ chanmon_buffer_open();
+ }
+ elsif (weechat::config_get_plugin("output") eq "bar")
+ {
+ chanmon_bar_open();
+ }
+}
+
+# Takes two optional args (channel server), toggles monitoring on/off
+sub chanmon_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
+ chanmon_print("Channel 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
+ chanmon_print("Channel 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("chanmon", "KenjiE20", "2.3.1", "GPL3", "Channel Monitor", "", ""))
+{
+ # Double load
+ weechat::print ("", "\tChanmon is already loaded");
+ return weechat::WEECHAT_RC_OK;
+}
+else
+{
+ # Start everything
+ chanmon_hook();
+ chanmon_config_init();
+ chanmon_start();
+}
\ No newline at end of file
--- /dev/null
+#
+# Copyright (C) 2008-2012 Sebastien Helleu <flashcode@flashtux.org>
+# Copyright (C) 2010-2012 Nils Görs <weechatter@arcor.de>
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+# Set WeeChat and plugins options interactively.
+#
+# History:
+#
+# 2012-03-17, Sebastien Helleu <flashcode@flashtux.org>:
+# version 2.5: fix check of sections when creating config file
+# 2012-03-09, Sebastien Helleu <flashcode@flashtux.org>:
+# version 2.4: fix reload of config file
+# 2012-02-02, nils_2 <weechatter@arcor.de>:
+# version 2.3: fixed: refresh problem with new search results and cursor was outside window.
+# : add: new option "current_line" in title bar
+# version 2.2: fixed: refresh error when toggling plugins description
+# 2011-11-05, nils_2 <weechatter@arcor.de>:
+# version 2.1: use own config file (iset.conf), fix own help color (used immediately)
+# 2011-10-16, nils_2 <weechatter@arcor.de>:
+# version 2.0: add support for left-mouse-button and more sensitive mouse gesture (for integer/color options)
+# add help text for mouse support
+# 2011-09-20, Sebastien Helleu <flashcode@flashtux.org>:
+# version 1.9: add mouse support, fix iset buffer, fix errors on first load under FreeBSD
+# 2011-07-21, nils_2 <weechatter@arcor.de>:
+# version 1.8: added: option "show_plugin_description" (alt+p)
+# fixed: typos in /help iset (lower case for alt+'x' keys)
+# 2011-05-29, nils_2 <weechatter@arcor.de>:
+# version 1.7: added: version check for future needs
+# added: new option (scroll_horiz) and usage of scroll_horiz function (weechat >= 0.3.6 required)
+# fixed: help_bar did not pop up immediately using key-shortcut
+# 2011-02-19, nils_2 <weechatter@arcor.de>:
+# version 1.6: added: display of all possible values in help bar (show_help_extra_info)
+# fixed: external user options never loaded when starting iset first time
+# 2011-02-13, Sebastien Helleu <flashcode@flashtux.org>:
+# version 1.5: use new help format for command arguments
+# 2011-02-03, nils_2 <weechatter@arcor.de>:
+# version 1.4: fixed: restore value filter after /upgrade using buffer local variable.
+# 2011-01-14, nils_2 <weechatter@arcor.de>:
+# version 1.3: added function to search for values (option value_search_char).
+# code optimization.
+# 2010-12-26, Sebastien Helleu <flashcode@flashtux.org>:
+# version 1.2: improve speed of /upgrade when iset buffer is open,
+# restore filter used after /upgrade using buffer local variable,
+# use /iset filter argument if buffer is open.
+# 2010-11-21, drubin <drubin+weechat@smartcube.co.za>:
+# version 1.1.1: fix bugs with cursor position
+# 2010-11-20, nils_2 <weechatter@arcor.de>:
+# version 1.1: cursor position set to value
+# 2010-08-03, Sebastien Helleu <flashcode@flashtux.org>:
+# version 1.0: move misplaced call to infolist_free()
+# 2010-02-02, rettub <rettub@gmx.net>:
+# version 0.9: turn all the help stuff off if option 'show_help_bar' is 'off',
+# new key binding <alt>-<v> to toggle help_bar and help stuff on/off
+# 2010-01-30, nils_2 <weechatter@arcor.de>:
+# version 0.8: fix error when option does not exist
+# 2010-01-24, Sebastien Helleu <flashcode@flashtux.org>:
+# version 0.7: display iset bar only on iset buffer
+# 2010-01-22, nils_2 <weechatter@arcor.de> and drubin:
+# version 0.6: add description in a bar, fix singular/plural bug in title bar,
+# fix selected line when switching buffer
+# 2009-06-21, Sebastien Helleu <flashcode@flashtux.org>:
+# version 0.5: fix bug with iset buffer after /upgrade
+# 2009-05-02, Sebastien Helleu <flashcode@flashtux.org>:
+# version 0.4: sync with last API changes
+# 2009-01-04, Sebastien Helleu <flashcode@flashtux.org>:
+# version 0.3: open iset buffer when /iset command is executed
+# 2009-01-04, Sebastien Helleu <flashcode@flashtux.org>:
+# version 0.2: use null values for options, add colors, fix refresh bugs,
+# use new keys to reset/unset options, sort options by name,
+# display number of options in buffer's title
+# 2008-11-05, Sebastien Helleu <flashcode@flashtux.org>:
+# version 0.1: first official version
+# 2008-04-19, Sebastien Helleu <flashcode@flashtux.org>:
+# script creation
+
+use strict;
+
+my $PRGNAME = "iset";
+my $VERSION = "2.5";
+my $DESCR = "Interactive Set for configuration options";
+my $AUTHOR = "Sebastien Helleu <flashcode\@flashtux.org>";
+my $LICENSE = "GPL3";
+my $LANG = "perl";
+my $ISET_CONFIG_FILE_NAME = "iset";
+
+my $iset_config_file;
+my $iset_buffer = "";
+my $wee_version_number = 0;
+my @iset_focus = ();
+my @options_names = ();
+my @options_types = ();
+my @options_values = ();
+my @options_is_null = ();
+my $option_max_length = 0;
+my $current_line = 0;
+my $filter = "*";
+my $description = "";
+my $options_name_copy = "";
+my $iset_filter_title = "";
+
+my %options_iset;
+
+my %mouse_keys = ("\@chat(perl.$PRGNAME):button1" => "hsignal:iset_mouse",
+ "\@chat(perl.$PRGNAME):button2*" => "hsignal:iset_mouse",
+ "\@chat(perl.$PRGNAME):wheelup" => "/repeat 5 /iset **up",
+ "\@chat(perl.$PRGNAME):wheeldown" => "/repeat 5 /iset **down");
+
+
+sub iset_title
+{
+ if ($iset_buffer ne "")
+ {
+ my $current_line_text = "";
+ $current_line_text = ($current_line + 1) . "/" if (weechat::config_boolean($options_iset{"show_current_line"}) == 1);
+ $iset_filter_title = "Filter: " if ($iset_filter_title eq "");
+ $filter = "*" if ($filter eq "");
+ my $postfix = "s";
+ my $option_txt = " option";
+ my $opt_txt = $option_txt;
+ $opt_txt = $option_txt.$postfix if (@options_names > 1);
+ my $show_plugin_descr_txt = "";
+ $show_plugin_descr_txt = " (plugins description hidden)" if (weechat::config_boolean($options_iset{"show_plugin_description"}) == 0);
+ weechat::buffer_set($iset_buffer, "title",
+ "Interactive set (iset.pl v$VERSION) | "
+ .$iset_filter_title.weechat::color("yellow").$filter.weechat::color("default")." | "
+ .$current_line_text.@options_names.$opt_txt . $show_plugin_descr_txt);
+ }
+}
+
+sub iset_filter
+{
+ $filter = $_[0];
+ $filter = "$1.*" if ($filter =~ /f (.*)/);
+ $filter = "*.$1.*" if ($filter =~ /s (.*)/);
+ if ((substr($filter, 0, 1) ne "*") && (substr($filter, -1, 1) ne "*"))
+ {
+ $filter = "*".$filter."*";
+ }
+ if ($iset_buffer ne "")
+ {
+ weechat::buffer_set($iset_buffer, "localvar_set_iset_filter", $filter);
+ }
+}
+
+sub iset_buffer_input
+{
+ my ($data, $buffer, $string) = ($_[0], $_[1], $_[2]);
+
+ my $string2 = substr($string, 0, 1);
+ if ($string2 eq weechat::config_string($options_iset{"value_search_char"}))
+ {
+ $filter = substr($string, 1);
+ iset_get_values($filter);
+ $iset_filter_title = "Filter (by value): ";
+ if ($iset_buffer ne "")
+ {
+ weechat::buffer_set($iset_buffer, "localvar_set_iset_filter", $filter);
+ }
+ }
+ else
+ {
+ $iset_filter_title = "";
+ iset_filter($string);
+ iset_get_options();
+ }
+ weechat::buffer_clear($buffer);
+ iset_title($iset_filter_title);
+ $current_line = 0;
+ iset_refresh();
+ return weechat::WEECHAT_RC_OK;
+}
+
+sub iset_buffer_close
+{
+ $iset_buffer = "";
+
+ return weechat::WEECHAT_RC_OK;
+}
+
+sub iset_init
+{
+ $current_line = 0;
+ $iset_buffer = weechat::buffer_search($LANG, $PRGNAME);
+ if ($iset_buffer eq "")
+ {
+ $iset_buffer = weechat::buffer_new($PRGNAME, "iset_buffer_input", "", "iset_buffer_close", "");
+ }
+ else
+ {
+ my $new_filter = weechat::buffer_get_string($iset_buffer, "localvar_iset_filter");
+ $filter = $new_filter if ($new_filter ne "");
+ }
+ if ($iset_buffer ne "")
+ {
+ weechat::buffer_set($iset_buffer, "type", "free");
+ iset_title();
+ weechat::buffer_set($iset_buffer, "key_bind_ctrl-L", "/iset **refresh");
+ weechat::buffer_set($iset_buffer, "key_bind_meta2-A", "/iset **up");
+ weechat::buffer_set($iset_buffer, "key_bind_meta2-B", "/iset **down");
+ weechat::buffer_set($iset_buffer, "key_bind_meta2-23~", "/iset **left");
+ weechat::buffer_set($iset_buffer, "key_bind_meta2-24~" , "/iset **right");
+ weechat::buffer_set($iset_buffer, "key_bind_meta- ", "/iset **toggle");
+ weechat::buffer_set($iset_buffer, "key_bind_meta-+", "/iset **incr");
+ weechat::buffer_set($iset_buffer, "key_bind_meta--", "/iset **decr");
+ weechat::buffer_set($iset_buffer, "key_bind_meta-imeta-r", "/iset **reset");
+ weechat::buffer_set($iset_buffer, "key_bind_meta-imeta-u", "/iset **unset");
+ weechat::buffer_set($iset_buffer, "key_bind_meta-ctrl-J", "/iset **set");
+ weechat::buffer_set($iset_buffer, "key_bind_meta-ctrl-M", "/iset **set");
+ weechat::buffer_set($iset_buffer, "key_bind_meta-meta2-1~", "/iset **scroll_top");
+ weechat::buffer_set($iset_buffer, "key_bind_meta-meta2-4~", "/iset **scroll_bottom");
+ weechat::buffer_set($iset_buffer, "key_bind_meta-v", "/iset **toggle_help");
+ weechat::buffer_set($iset_buffer, "key_bind_meta-p", "/iset **toggle_show_plugin_desc");
+ weechat::buffer_set($iset_buffer, "localvar_set_iset_filter", $filter);
+ }
+}
+
+sub iset_get_options
+{
+ @iset_focus = ();
+
+ @options_names = ();
+ @options_types = ();
+ @options_values = ();
+ @options_is_null = ();
+ $option_max_length = 0;
+ my %options_internal = ();
+ my $i = 0;
+ my $key;
+ my $iset_struct;
+ my %iset_struct;
+
+ my $infolist = weechat::infolist_get("option", "", $filter);
+ while (weechat::infolist_next($infolist))
+ {
+ $key = sprintf("%08d", $i);
+ my $name = weechat::infolist_string($infolist, "full_name");
+ next if (weechat::config_boolean($options_iset{"show_plugin_description"}) == 0 and index ($name, "plugins.desc.") != -1);
+ my $type = weechat::infolist_string($infolist, "type");
+ my $value = weechat::infolist_string($infolist, "value");
+ my $is_null = weechat::infolist_integer($infolist, "value_is_null");
+
+ $options_internal{$name}{"type"} = $type;
+ $options_internal{$name}{"value"} = $value;
+ $options_internal{$name}{"is_null"} = $is_null;
+ $option_max_length = length($name) if (length($name) > $option_max_length);
+
+ $iset_struct{$key} = $options_internal{$name};
+ push(@iset_focus, $iset_struct{$key});
+ $i++;
+ }
+ weechat::infolist_free($infolist);
+
+ foreach my $name (sort keys %options_internal)
+ {
+ push(@options_names, $name);
+ push(@options_types, $options_internal{$name}{"type"});
+ push(@options_values, $options_internal{$name}{"value"});
+ push(@options_is_null, $options_internal{$name}{"is_null"});
+ }
+}
+
+sub iset_get_values
+{
+ my $var_value = $_[0];
+ @options_names = ();
+ @options_types = ();
+ @options_values = ();
+ @options_is_null = ();
+ $option_max_length = 0;
+ my %options_internal = ();
+ my $i = 0;
+ my $infolist = weechat::infolist_get("option", "", "*");
+ $var_value =~ tr/[a-z][0-9].=-_!//cd; # kill meta chars
+ $var_value = lc($var_value);
+ while (weechat::infolist_next($infolist))
+ {
+ my $name = weechat::infolist_string($infolist, "full_name");
+ next if (weechat::config_boolean($options_iset{"show_plugin_description"}) == 0 and index ($name, "plugins.desc.") != -1);
+ my $type = weechat::infolist_string($infolist, "type");
+ my $value = weechat::infolist_string($infolist, "value");
+ my $is_null = weechat::infolist_integer($infolist, "value_is_null");
+ if (lc($value) =~ m/$var_value/)
+ {
+ $options_internal{$name}{"type"} = $type;
+ $options_internal{$name}{"value"} = $value;
+ $options_internal{$name}{"is_null"} = $is_null;
+ $option_max_length = length($name) if (length($name) > $option_max_length);
+ }
+ $i++;
+ }
+ weechat::infolist_free($infolist);
+ foreach my $name (sort keys %options_internal)
+ {
+ push(@options_names, $name);
+ push(@options_types, $options_internal{$name}{"type"});
+ push(@options_values, $options_internal{$name}{"value"});
+ push(@options_is_null, $options_internal{$name}{"is_null"});
+ }
+ weechat::buffer_set($iset_buffer, "localvar_set_iset_filter", $var_value);
+}
+
+sub iset_refresh_line
+{
+ if ($iset_buffer ne "")
+ {
+ my $y = $_[0];
+ if ($y <= $#options_names)
+ {
+ return if (! defined($options_types[$y]));
+ my $format = sprintf("%%s%%-%ds %%s %%-7s %%s %%s%%s%%s", $option_max_length);
+ my $around = "";
+ $around = "\"" if ((!$options_is_null[$y]) && ($options_types[$y] eq "string"));
+
+ my $color1 = weechat::color(weechat::config_color($options_iset{"color_option"}));
+ my $color2 = weechat::color(weechat::config_color($options_iset{"color_type"}));
+ my $color3 = "";
+ if ($options_is_null[$y])
+ {
+ $color3 = weechat::color(weechat::config_color($options_iset{"color_value_undef"}));
+ }
+ else
+ {
+ $color3 = weechat::color(weechat::config_color($options_iset{"color_value"}));
+ }
+ if ($y == $current_line)
+ {
+ $color1 = weechat::color(weechat::config_color($options_iset{"color_option_selected"}).",".weechat::config_color($options_iset{"color_bg_selected"}));
+ $color2 = weechat::color(weechat::config_color($options_iset{"color_type_selected"}).",".weechat::config_color($options_iset{"color_bg_selected"}));
+ if ($options_is_null[$y])
+ {
+ $color3 = weechat::color(weechat::config_color($options_iset{"color_value_undef_selected"}).",".weechat::config_color($options_iset{"color_bg_selected"}));
+ }
+ else
+ {
+ $color3 = weechat::color(weechat::config_color($options_iset{"color_value_selected"}).",".weechat::config_color($options_iset{"color_bg_selected"}));
+ }
+ }
+ my $value = $options_values[$y];
+ $value = "(undef)" if ($options_is_null[$y]);
+ my $strline = sprintf($format,
+ $color1, $options_names[$y],
+ $color2, $options_types[$y],
+ $color3, $around, $value, $around);
+ weechat::print_y($iset_buffer, $y, $strline);
+ }
+ }
+}
+
+sub iset_refresh
+{
+ iset_title();
+ if (($iset_buffer ne "") && ($#options_names >= 0))
+ {
+ foreach my $y (0 .. $#options_names)
+ {
+ iset_refresh_line($y);
+ }
+ }
+
+ weechat::bar_item_update("isetbar_help") if (weechat::config_boolean($options_iset{"show_help_bar"}) == 1);
+}
+
+sub iset_full_refresh
+{
+ $iset_buffer = weechat::buffer_search($LANG, $PRGNAME);
+ if ($iset_buffer ne "")
+ {
+ weechat::buffer_clear($iset_buffer);
+ # search for "*" in $filter.
+ if ($filter =~ m/\*/)
+ {
+ iset_get_options();
+ }
+ else
+ {
+ iset_get_values($filter);
+ $iset_filter_title = "Filter (by value): ";
+ }
+ if (weechat::config_boolean($options_iset{"show_plugin_description"}) == 1)
+ {
+ iset_set_current_line($current_line);
+ }else
+ {
+ $current_line = $#options_names if ($current_line > $#options_names);
+ }
+ iset_refresh();
+ weechat::command($iset_buffer, "/window refresh");
+ }
+}
+
+sub iset_set_current_line
+{
+ my $new_current_line = $_[0];
+ my $old_current_line = $current_line;
+ $current_line = $new_current_line;
+ $current_line = $#options_names if ($current_line > $#options_names);
+ if ($old_current_line != $current_line)
+ {
+ iset_refresh_line($old_current_line);
+ iset_refresh_line($current_line);
+ weechat::bar_item_update("isetbar_help") if (weechat::config_boolean($options_iset{"show_help_bar"}) == 1);
+ }
+}
+
+sub iset_signal_window_scrolled_cb
+{
+ my ($data, $signal, $signal_data) = ($_[0], $_[1], $_[2]);
+ if ($iset_buffer ne "")
+ {
+ my $infolist = weechat::infolist_get("window", $signal_data, "");
+ if (weechat::infolist_next($infolist))
+ {
+ if (weechat::infolist_pointer($infolist, "buffer") eq $iset_buffer)
+ {
+ my $old_current_line = $current_line;
+ my $new_current_line = $current_line;
+ my $start_line_y = weechat::infolist_integer($infolist, "start_line_y");
+ my $chat_height = weechat::infolist_integer($infolist, "chat_height");
+ $new_current_line += $chat_height if ($new_current_line < $start_line_y);
+ $new_current_line -= $chat_height if ($new_current_line >= $start_line_y + $chat_height);
+ $new_current_line = $start_line_y if ($new_current_line < $start_line_y);
+ $new_current_line = $start_line_y + $chat_height - 1 if ($new_current_line >= $start_line_y + $chat_height);
+ iset_set_current_line($new_current_line);
+ }
+ }
+ weechat::infolist_free($infolist);
+ }
+
+ return weechat::WEECHAT_RC_OK;
+}
+
+sub iset_get_window_number
+{
+ if ($iset_buffer ne "")
+ {
+ my $window = weechat::window_search_with_buffer($iset_buffer);
+ return "-window ".weechat::window_get_integer ($window, "number")." " if ($window ne "");
+ }
+ return "";
+}
+
+sub iset_check_line_outside_window
+{
+ if ($iset_buffer ne "")
+ {
+ undef my $infolist;
+ if ($wee_version_number >= 0x00030500)
+ {
+ my $window = weechat::window_search_with_buffer($iset_buffer);
+ $infolist = weechat::infolist_get("window", $window, "") if $window;
+ }
+ else
+ {
+ $infolist = weechat::infolist_get("window", "", "current");
+ }
+ if ($infolist)
+ {
+ if (weechat::infolist_next($infolist))
+ {
+ my $start_line_y = weechat::infolist_integer($infolist, "start_line_y");
+ my $chat_height = weechat::infolist_integer($infolist, "chat_height");
+ my $window_number = "";
+ if ($wee_version_number >= 0x00030500)
+ {
+ $window_number = "-window ".weechat::infolist_integer($infolist, "number")." ";
+ }
+ if ($start_line_y > $current_line)
+ {
+ weechat::command($iset_buffer, "/window scroll ".$window_number."-".($start_line_y - $current_line));
+ }
+ else
+ {
+ if ($start_line_y <= $current_line - $chat_height)
+ {
+ weechat::command($iset_buffer, "/window scroll ".$window_number."+".($current_line - $start_line_y - $chat_height + 1));
+ }
+ }
+ }
+ weechat::infolist_free($infolist);
+ }
+ }
+}
+
+sub iset_get_option_name_index
+{
+ my $option_name = $_[0];
+ my $index = 0;
+ while ($index <= $#options_names)
+ {
+ return -1 if ($options_names[$index] gt $option_name);
+ return $index if ($options_names[$index] eq $option_name);
+ $index++;
+ }
+ return -1;
+}
+
+sub iset_config_cb
+{
+ my ($data, $option_name, $value) = ($_[0], $_[1], $_[2]);
+
+ if ($iset_buffer ne "")
+ {
+ return weechat::WEECHAT_RC_OK if (weechat::info_get("weechat_upgrading", "") eq "1");
+
+ my $index = iset_get_option_name_index($option_name);
+ if ($index >= 0)
+ {
+ # refresh info about changed option
+ my $infolist = weechat::infolist_get("option", "", $option_name);
+ if ($infolist)
+ {
+ weechat::infolist_next($infolist);
+ if (weechat::infolist_fields($infolist))
+ {
+ $options_types[$index] = weechat::infolist_string($infolist, "type");
+ $options_values[$index] = weechat::infolist_string($infolist, "value");
+ $options_is_null[$index] = weechat::infolist_integer($infolist, "value_is_null");
+ iset_refresh_line($index);
+ iset_title($iset_filter_title) if ($option_name eq "iset.look.show_current_line");
+ }
+ else
+ {
+ iset_full_refresh();
+ }
+ weechat::infolist_free($infolist);
+ }
+ }
+ else
+ {
+ iset_full_refresh() if ($option_name ne "weechat.bar.isetbar.hidden");
+ }
+ }
+
+ return weechat::WEECHAT_RC_OK;
+}
+
+sub iset_set_option
+{
+ my $option = weechat::config_get($_[0]);
+ weechat::config_option_set($option, $_[1], 1) if ($option ne "");
+}
+
+sub iset_reset_option
+{
+ my $option = weechat::config_get($_[0]);
+ weechat::config_option_reset($option, 1) if ($option ne "");
+}
+
+sub iset_unset_option
+{
+ my $option = weechat::config_get($_[0]);
+ weechat::config_option_unset($option) if ($option ne "");
+ weechat::buffer_clear($iset_buffer);
+ iset_refresh();
+}
+
+
+sub iset_cmd_cb
+{
+ my ($data, $buffer, $args) = ($_[0], $_[1], $_[2]);
+ my $filter_set = 0;
+ if (($args ne "") && (substr($args, 0, 2) ne "**"))
+ {
+ if (substr($args, 0, 1) eq weechat::config_string($options_iset{"value_search_char"}))
+ {
+ my $var_value = substr($args, 1); # cut value_search_char
+ if ($iset_buffer ne "")
+ {
+ weechat::buffer_clear($iset_buffer);
+ weechat::command($iset_buffer, "/window refresh");
+ }
+ iset_init();
+ iset_get_values($var_value);
+ iset_refresh();
+ weechat::buffer_set($iset_buffer, "display", "1");
+ $iset_filter_title = "Filter (by value): ";
+ $filter = $var_value;
+ iset_title($iset_filter_title);
+ return weechat::WEECHAT_RC_OK;
+ }
+ else
+ {
+ iset_filter($args);
+ $filter_set = 1;
+ my $ptrbuf = weechat::buffer_search($LANG, $PRGNAME);
+ if ($ptrbuf eq "")
+ {
+ iset_init();
+ iset_get_options();
+ iset_full_refresh();
+ weechat::buffer_set(weechat::buffer_search($LANG, $PRGNAME), "display", "1");
+ return weechat::WEECHAT_RC_OK;
+ }
+ }
+ }
+
+ if ($iset_buffer eq "")
+ {
+ iset_init();
+ iset_get_options();
+ iset_refresh();
+ }
+ else
+ {
+ iset_full_refresh() if ($filter_set);
+ }
+
+ if ($args eq "")
+ {
+ weechat::buffer_set($iset_buffer, "display", "1");
+ }
+ else
+ {
+ if ($args eq "**refresh")
+ {
+ iset_full_refresh();
+ }
+ if ($args eq "**up")
+ {
+ if ($current_line > 0)
+ {
+ $current_line--;
+ iset_refresh_line($current_line + 1);
+ iset_refresh_line($current_line);
+ iset_check_line_outside_window();
+ }
+ }
+ if ($args eq "**down")
+ {
+ if ($current_line < $#options_names)
+ {
+ $current_line++;
+ iset_refresh_line($current_line - 1);
+ iset_refresh_line($current_line);
+ iset_check_line_outside_window();
+ }
+ }
+ if ($args eq "**left" && $wee_version_number >= 0x00030600)
+ {
+ weechat::command($iset_buffer, "/window scroll_horiz ".iset_get_window_number()."-".weechat::config_integer($options_iset{"scroll_horiz"})."%");
+ }
+ if ($args eq "**right" && $wee_version_number >= 0x00030600)
+ {
+ weechat::command($iset_buffer, "/window scroll_horiz ".iset_get_window_number().weechat::config_integer($options_iset{"scroll_horiz"})."%");
+ }
+ if ($args eq "**scroll_top")
+ {
+ my $old_current_line = $current_line;
+ $current_line = 0;
+ iset_refresh_line ($old_current_line);
+ iset_refresh_line ($current_line);
+ weechat::command($iset_buffer, "/window scroll_top ".iset_get_window_number());
+ }
+ if ($args eq "**scroll_bottom")
+ {
+ my $old_current_line = $current_line;
+ $current_line = $#options_names;
+ iset_refresh_line ($old_current_line);
+ iset_refresh_line ($current_line);
+ weechat::command($iset_buffer, "/window scroll_bottom ".iset_get_window_number());
+ }
+ if ($args eq "**toggle")
+ {
+ if ($options_types[$current_line] eq "boolean")
+ {
+ iset_set_option($options_names[$current_line], "toggle");
+ }
+ }
+ if ($args eq "**incr")
+ {
+ if (($options_types[$current_line] eq "integer")
+ || ($options_types[$current_line] eq "color"))
+ {
+ iset_set_option($options_names[$current_line], "++1");
+ }
+ }
+ if ($args eq "**decr")
+ {
+ if (($options_types[$current_line] eq "integer")
+ || ($options_types[$current_line] eq "color"))
+ {
+ iset_set_option($options_names[$current_line], "--1");
+ }
+ }
+ if ($args eq "**reset")
+ {
+ iset_reset_option($options_names[$current_line]);
+ }
+ if ($args eq "**unset")
+ {
+ iset_unset_option($options_names[$current_line]);
+ }
+ if ($args eq "**toggle_help")
+ {
+ if (weechat::config_boolean($options_iset{"show_help_bar"}) == 1)
+ {
+ weechat::config_option_set($options_iset{"show_help_bar"},0,1);
+ iset_show_bar(0);
+ }
+ else
+ {
+ weechat::config_option_set($options_iset{"show_help_bar"},1,1);
+ iset_show_bar(1);
+ }
+ }
+ if ($args eq "**toggle_show_plugin_desc")
+ {
+ if (weechat::config_boolean($options_iset{"show_plugin_description"}) == 1)
+ {
+ weechat::config_option_set($options_iset{"show_plugin_description"},0,1);
+ iset_full_refresh();
+ iset_check_line_outside_window();
+ }
+ else
+ {
+ weechat::config_option_set($options_iset{"show_plugin_description"},1,1);
+ iset_full_refresh();
+ iset_check_line_outside_window();
+ }
+ }
+ if ($args eq "**set")
+ {
+ my $quote = "";
+ my $value = $options_values[$current_line];
+ if ($options_is_null[$current_line])
+ {
+ $value = "null";
+ }
+ else
+ {
+ $quote = "\"" if ($options_types[$current_line] eq "string");
+ }
+ weechat::buffer_set($iset_buffer, "input", "/set ".$options_names[$current_line]." ".$quote.$value.$quote);
+ weechat::command($iset_buffer, "/input move_beginning_of_line");
+ weechat::command($iset_buffer, "/input move_next_word");
+ weechat::command($iset_buffer, "/input move_next_word");
+ weechat::command($iset_buffer, "/input move_next_char");
+ weechat::command($iset_buffer, "/input move_next_char") if ($quote ne "");
+ }
+ }
+ weechat::bar_item_update("isetbar_help") if (weechat::config_boolean($options_iset{"show_help_bar"}) == 1);
+ return weechat::WEECHAT_RC_OK;
+}
+
+sub iset_get_help
+{
+ my ($redraw) = ($_[0]);
+
+ return '' if (weechat::config_boolean($options_iset{"show_help_bar"}) == 0);
+
+ if (not defined $options_names[$current_line])
+ {
+ return "No option selected. Set a new filter using command line (use '*' to see all options)";
+ }
+ if ($options_name_copy eq $options_names[$current_line] and not defined $redraw)
+ {
+ return $description;
+ }
+ $options_name_copy = $options_names[$current_line];
+ my $optionlist ="";
+ $optionlist = weechat::infolist_get("option", "", $options_names[$current_line]);
+ weechat::infolist_next($optionlist);
+ my $full_name = weechat::infolist_string($optionlist,"full_name");
+ my $option_desc = "";
+ my $option_default_value = "";
+ my $option_range = "";
+ my $possible_values = "";
+ my $re = qq(\Q$full_name);
+ if (grep (/^$re$/,$options_names[$current_line]))
+ {
+ $option_desc = weechat::infolist_string($optionlist, "description_nls");
+ $option_desc = weechat::infolist_string($optionlist, "description") if ($option_desc eq "");
+ $option_desc = "No help found" if ($option_desc eq "");
+ $option_default_value = weechat::infolist_string($optionlist, "default_value");
+ $possible_values = weechat::infolist_string($optionlist, "string_values") if (weechat::infolist_string($optionlist, "string_values") ne "");
+ if ((weechat::infolist_string($optionlist, "type") eq "integer") && ($possible_values eq ""))
+ {
+ $option_range = weechat::infolist_integer($optionlist, "min")
+ ." .. ".weechat::infolist_integer($optionlist, "max");
+ }
+ }
+ weechat::infolist_free($optionlist);
+ iset_title();
+
+ $description = weechat::color(weechat::config_color($options_iset{"color_help_option_name"})).$options_names[$current_line]
+ .weechat::color("bar_fg").": "
+ .weechat::color(weechat::config_color($options_iset{"color_help_text"})).$option_desc;
+
+ # show additional infos like default value and possible values
+
+ if (weechat::config_boolean($options_iset{"show_help_extra_info"}) == 1)
+ {
+ $description .=
+ weechat::color("bar_delim")." ["
+ .weechat::color("bar_fg")."default: "
+ .weechat::color("bar_delim")."\""
+ .weechat::color(weechat::config_color($options_iset{"color_help_default_value"})).$option_default_value
+ .weechat::color("bar_delim")."\"";
+ if ($option_range ne "")
+ {
+ $description .= weechat::color("bar_fg").", values: ".$option_range;
+ }
+ if ($possible_values ne "")
+ {
+ $possible_values =~ s/\|/", "/g; # replace '|' to '", "'
+ $description .= weechat::color("bar_fg").", values: ". "\"" . $possible_values . "\"";
+
+ }
+ $description .= weechat::color("bar_delim")."]";
+ }
+ return $description;
+}
+
+sub iset_check_condition_isetbar_cb
+{
+ my ($data, $modifier, $modifier_data, $string) = ($_[0], $_[1], $_[2], $_[3]);
+ my $buffer = weechat::window_get_pointer($modifier_data, "buffer");
+ if ($buffer ne "")
+ {
+ if ((weechat::buffer_get_string($buffer, "plugin") eq $LANG)
+ && (weechat::buffer_get_string($buffer, "name") eq $PRGNAME))
+ {
+ return "1";
+ }
+ }
+ return "0";
+}
+
+sub iset_show_bar
+{
+ my $show = $_[0];
+ my $barhidden = weechat::config_get("weechat.bar.isetbar.hidden");
+ if ($barhidden)
+ {
+ if ($show)
+ {
+ if (weechat::config_boolean($options_iset{"show_help_bar"}) == 1)
+ {
+ if (weechat::config_boolean($barhidden))
+ {
+ weechat::config_option_set($barhidden, 0, 1);
+ }
+ }
+ }
+ else
+ {
+ if (!weechat::config_boolean($barhidden))
+ {
+ weechat::config_option_set($barhidden, 1, 1);
+ }
+ }
+ }
+}
+
+sub iset_signal_buffer_switch_cb
+{
+ my $buffer_pointer = $_[2];
+ my $show_bar = 0;
+ $show_bar = 1 if (weechat::buffer_get_integer($iset_buffer, "num_displayed") > 0);
+ iset_show_bar($show_bar);
+ iset_check_line_outside_window() if ($buffer_pointer eq $iset_buffer);
+ return weechat::WEECHAT_RC_OK;
+}
+
+sub iset_item_cb
+{
+ return iset_get_help();
+}
+
+sub iset_upgrade_ended
+{
+ iset_full_refresh();
+}
+
+sub iset_end
+{
+ # when script is unloaded, we hide bar
+ iset_show_bar(0);
+}
+
+# -------------------------------[ mouse support ]-------------------------------------
+
+sub hook_focus_iset_cb
+{
+ my %info = %{$_[1]};
+ my $bar_item_line = int($info{"_bar_item_line"});
+ undef my $hash;
+ if (($info{"_buffer_name"} eq $PRGNAME) && $info{"_buffer_plugin"} eq $LANG && ($bar_item_line >= 0) && ($bar_item_line <= $#iset_focus))
+ {
+ $hash = $iset_focus[$bar_item_line];
+ }
+ else
+ {
+ $hash = {};
+ my $hash_focus = $iset_focus[0];
+ foreach my $key (keys %$hash_focus)
+ {
+ $hash->{$key} = "?";
+ }
+ }
+ return $hash;
+}
+
+# _chat_line_y contains selected line
+sub iset_hsignal_mouse_cb
+{
+ my ($data, $signal, %hash) = ($_[0], $_[1], %{$_[2]});
+
+ if ($hash{"_buffer_name"} eq $PRGNAME && ($hash{"_buffer_plugin"} eq $LANG))
+ {
+ if ($hash{"_key"} eq "button1")
+ {
+ $current_line = $hash{"_chat_line_y"};
+ iset_refresh_line($current_line);
+ iset_refresh();
+ }
+ elsif ($hash{"_key"} eq "button2")
+ {
+ if ($options_types[$hash{"_chat_line_y"}] eq "boolean")
+ {
+ iset_set_option($options_names[$hash{"_chat_line_y"}], "toggle");
+ $current_line = $hash{"_chat_line_y"};
+ iset_refresh_line($current_line);
+ iset_refresh();
+ }
+ elsif ($options_types[$hash{"_chat_line_y"}] eq "string")
+ {
+ $current_line = $hash{"_chat_line_y"};
+ iset_refresh_line($current_line);
+ iset_refresh();
+ weechat::command("", "/$PRGNAME **set");
+ }
+ }
+ elsif ($hash{"_key"} eq "button2-gesture-left" or $hash{"_key"} eq "button2-gesture-left-long")
+ {
+ if ($options_types[$hash{"_chat_line_y"}] eq "integer" or ($options_types[$hash{"_chat_line_y"}] eq "color"))
+ {
+ $current_line = $hash{"_chat_line_y"};
+ iset_refresh_line($current_line);
+ iset_refresh();
+ my $distance = distance($hash{"_chat_line_x"},$hash{"_chat_line_x2"});
+ weechat::command("", "/repeat $distance /$PRGNAME **decr");
+ }
+ }
+ elsif ($hash{"_key"} eq "button2-gesture-right" or $hash{"_key"} eq "button2-gesture-right-long")
+ {
+ if ($options_types[$hash{"_chat_line_y"}] eq "integer" or ($options_types[$hash{"_chat_line_y"}] eq "color"))
+ {
+ $current_line = $hash{"_chat_line_y"};
+ iset_refresh_line($current_line);
+ iset_refresh();
+ my $distance = distance($hash{"_chat_line_x"},$hash{"_chat_line_x2"});
+ weechat::command("", "/repeat $distance /$PRGNAME **incr");
+ }
+ }
+ }
+}
+sub distance
+{
+ my ($x1,$x2) = ($_[0], $_[1]);
+ my $distance;
+ $distance = $x1 - $x2;
+ $distance = abs($distance);
+ if ($distance > 0)
+ {
+ use integer;
+ $distance = $distance / 3;
+ $distance = 1 if ($distance == 0);
+ }
+ elsif ($distance == 0)
+ {
+ $distance = 1;
+ }
+ return $distance;
+}
+
+# -----------------------------------[ config ]---------------------------------------
+
+sub iset_config_init
+{
+ $iset_config_file = weechat::config_new($ISET_CONFIG_FILE_NAME,"iset_config_reload_cb","");
+ return if ($iset_config_file eq "");
+
+ # section "color"
+ my $section_color = weechat::config_new_section($iset_config_file,"color", 0, 0, "", "", "", "", "", "", "", "", "", "");
+ if ($section_color eq "")
+ {
+ weechat::config_free($iset_config_file);
+ return;
+ }
+ $options_iset{"color_option"} = weechat::config_new_option(
+ $iset_config_file, $section_color,
+ "option", "color", "Color for option name in iset buffer", "", 0, 0,
+ "default", "default", 0, "", "", "full_refresh_cb", "", "", "");
+ $options_iset{"color_option_selected"} = weechat::config_new_option(
+ $iset_config_file, $section_color,
+ "option_selected", "color", "Color for selected option name in iset buffer", "", 0, 0,
+ "white", "white", 0, "", "", "full_refresh_cb", "", "", "");
+ $options_iset{"color_type"} = weechat::config_new_option(
+ $iset_config_file, $section_color,
+ "type", "color", "Color for option type (integer, boolean, string)", "", 0, 0,
+ "brown", "brown", 0, "", "", "full_refresh_cb", "", "", "");
+ $options_iset{"color_type_selected"} = weechat::config_new_option(
+ $iset_config_file, $section_color,
+ "type_selected", "color", "Color for selected option type (integer, boolean, string)", "", 0, 0,
+ "yellow", "yellow", 0, "", "", "full_refresh_cb", "", "", "");
+ $options_iset{"color_value"} = weechat::config_new_option(
+ $iset_config_file, $section_color,
+ "value", "color", "Color for option value", "", 0, 0,
+ "cyan", "cyan", 0, "", "", "full_refresh_cb", "", "", "");
+ $options_iset{"color_value_selected"} = weechat::config_new_option(
+ $iset_config_file, $section_color,
+ "value_selected", "color", "Color for selected option value", "", 0, 0,
+ "lightcyan", "lightcyan", 0, "", "", "full_refresh_cb", "", "", "");
+ $options_iset{"color_value_undef"} = weechat::config_new_option(
+ $iset_config_file, $section_color,
+ "value_undef", "color", "Color for option value undef", "", 0, 0,
+ "green", "green", 0, "", "", "full_refresh_cb", "", "", "");
+ $options_iset{"color_value_undef_selected"} = weechat::config_new_option(
+ $iset_config_file, $section_color,
+ "value_undef_selected", "color", "Color for selected option value undef", "", 0, 0,
+ "lightgreen", "lightgreen", 0, "", "", "full_refresh_cb", "", "", "");
+ $options_iset{"color_bg_selected"} = weechat::config_new_option(
+ $iset_config_file, $section_color,
+ "bg_selected", "color", "Background color for current selected option", "", 0, 0,
+ "red", "red", 0, "", "", "full_refresh_cb", "", "", "");
+ $options_iset{"color_help_option_name"} = weechat::config_new_option(
+ $iset_config_file, $section_color,
+ "help_option_name", "color", "Color for option name in help-bar", "", 0, 0,
+ "white", "white", 0, "", "", "bar_refresh", "", "", "");
+ $options_iset{"color_help_text"} = weechat::config_new_option(
+ $iset_config_file, $section_color,
+ "help_text", "color", "Color for option description in help-bar", "", 0, 0,
+ "default", "default", 0, "", "", "bar_refresh", "", "", "");
+ $options_iset{"color_help_default_value"} = weechat::config_new_option(
+ $iset_config_file, $section_color,
+ "help_default_value", "color", "Color for default option value in help-bar", "", 0, 0,
+ "green", "green", 0, "", "", "bar_refresh", "", "", "");
+
+ # section "help"
+ my $section_help = weechat::config_new_section($iset_config_file,"help", 0, 0, "", "", "", "", "", "", "", "", "", "");
+ if ($section_help eq "")
+ {
+ weechat::config_free($iset_config_file);
+ return;
+ }
+ $options_iset{"show_help_bar"} = weechat::config_new_option(
+ $iset_config_file, $section_help,
+ "show_help_bar", "boolean", "Show help bar", "", 0, 0,
+ "on", "on", 0, "", "", "toggle_help_cb", "", "", "");
+ $options_iset{"show_help_extra_info"} = weechat::config_new_option(
+ $iset_config_file, $section_help,
+ "show_help_extra_info", "boolean", "Show additional information in help bar (default value, max./min. value) ", "", 0, 0,
+ "on", "on", 0, "", "", "", "", "", "");
+ $options_iset{"show_plugin_description"} = weechat::config_new_option(
+ $iset_config_file, $section_help,
+ "show_plugin_description", "boolean", "Show plugin description in iset buffer", "", 0, 0,
+ "on", "on", 0, "", "", "full_refresh_cb", "", "", "");
+
+ # section "look"
+ my $section_look = weechat::config_new_section($iset_config_file, "look", 0, 0, "", "", "", "", "", "", "", "", "", "");
+ if ($section_look eq "")
+ {
+ weechat::config_free($iset_config_file);
+ return;
+ }
+ $options_iset{"value_search_char"} = weechat::config_new_option(
+ $iset_config_file, $section_look,
+ "value_search_char", "string", "Trigger char to tell iset to search for value instead of option (for example: =red)", "", 0, 0,
+ "=", "=", 0, "", "", "", "", "", "");
+ $options_iset{"scroll_horiz"} = weechat::config_new_option(
+ $iset_config_file, $section_look,
+ "scroll_horiz", "integer", "scroll content of iset buffer n%", "", 1, 100,
+ "10", "10", 0, "", "", "", "", "", "");
+ $options_iset{"show_current_line"} = weechat::config_new_option(
+ $iset_config_file, $section_look,
+ "show_current_line", "boolean", "show current line in title bar.", "", 0, 0,
+ "on", "on", 0, "", "", "", "", "", "");
+}
+
+sub iset_config_reload_cb
+{
+ my ($data,$config_file) = ($_[0], $_[1]);
+ return weechat::config_reload($config_file)
+}
+
+sub iset_config_read
+{
+ return weechat::config_read($iset_config_file) if ($iset_config_file ne "");
+}
+
+sub iset_config_write
+{
+ return weechat::config_write($iset_config_file) if ($iset_config_file ne "");
+}
+
+sub full_refresh_cb
+{
+ iset_full_refresh();
+ return weechat::WEECHAT_RC_OK;
+}
+
+sub bar_refresh
+{
+ iset_get_help(1);
+ weechat::bar_item_update("isetbar_help") if (weechat::config_boolean($options_iset{"show_help_bar"}) == 1);
+ return weechat::WEECHAT_RC_OK;
+}
+
+sub toggle_help_cb
+{
+ my $value = weechat::config_boolean($options_iset{"show_help_bar"});
+ iset_show_bar($value);
+ return weechat::WEECHAT_RC_OK;
+}
+
+# -----------------------------------[ main ]-----------------------------------------
+
+weechat::register($PRGNAME, $AUTHOR, $VERSION, $LICENSE,
+ $DESCR, "iset_end", "");
+
+$wee_version_number = weechat::info_get("version_number", "") || 0;
+
+iset_config_init();
+iset_config_read();
+
+weechat::hook_command($PRGNAME, "Interactive set", "f <file> || s <section> || [=]<text>",
+ "f file : show options for a file\n".
+ "s section : show options for a section\n".
+ "text : show options with 'text' in name\n".
+ weechat::config_string($options_iset{"value_search_char"})."text : show options with 'text' in value\n\n".
+ "Keys for iset buffer:\n".
+ "f11,f12 : move iset content left/right\n".
+ "up,down : move one option up/down\n".
+ "pgup,pdwn : move one page up/down\n".
+ "home,end : move to first/last option\n".
+ "ctrl+'L' : refresh options and screen\n".
+ "alt+space : toggle boolean on/off\n".
+ "alt+'+' : increase value (for integer or color)\n".
+ "alt+'-' : decrease value (for integer or color)\n".
+ "alt+'i',alt+'r': reset value of option\n".
+ "alt+'i',alt+'u': unset option\n".
+ "alt+enter : set new value for option (edit it with command line)\n".
+ "text,enter : set a new filter using command line (use '*' to see all options)\n".
+ "alt+'v' : toggle help bar on/off\n".
+ "alt+'p' : toggle option \"show_plugin_description\" on/off\n".
+ "\n".
+ "standard mouse actions:\n".
+ "wheel up / wheel down : move option up/down\n".
+ "left-mouse-button : select an option from list\n".
+ "right-mouse-button : toggle boolean (on/off) or set a new value for option (edit it with command line)\n".
+ "right-mouse-button + gesture left/right: increase/decrease value (for integer or color)\n".
+ "\n".
+ "Examples:\n".
+ " show options for file 'weechat'\n".
+ " /iset f weechat\n".
+ " show options for file 'irc'\n".
+ " /iset f irc\n".
+ " show options for section 'look'\n".
+ " /iset s look\n".
+ " show all options with text 'nicklist' in name\n".
+ " /iset nicklist\n".
+ " show all values which contain 'red'. '" . weechat::config_string($options_iset{"value_search_char"}) . "' is a trigger char.\n".
+ " /iset ". weechat::config_string($options_iset{"value_search_char"}) ."red\n",
+ "", "iset_cmd_cb", "");
+weechat::hook_signal("upgrade_ended", "iset_upgrade_ended", "");
+weechat::hook_signal("window_scrolled", "iset_signal_window_scrolled_cb", "");
+weechat::hook_signal("buffer_switch", "iset_signal_buffer_switch_cb","");
+weechat::bar_item_new("isetbar_help", "iset_item_cb", "");
+weechat::bar_new("isetbar", "on", "0", "window", "", "top", "horizontal",
+ "vertical", "3", "3", "default", "cyan", "default", "1",
+ "isetbar_help");
+weechat::hook_modifier("bar_condition_isetbar", "iset_check_condition_isetbar_cb", "");
+weechat::hook_config("*", "iset_config_cb", "");
+$iset_buffer = weechat::buffer_search($LANG, $PRGNAME);
+iset_init() if ($iset_buffer ne "");
+
+if ($wee_version_number >= 0x00030600)
+{
+ weechat::hook_focus("chat", "hook_focus_iset_cb", "");
+ weechat::hook_hsignal($PRGNAME."_mouse", "iset_hsignal_mouse_cb", "");
+ weechat::key_bind("mouse", \%mouse_keys);
+}
--- /dev/null
+#
+# plugins.conf -- weechat v0.3.8
+#
+
+[var]
+fifo.fifo = "on"
+guile.check_license = "on"
+lua.check_license = "on"
+perl.beep.beep_command_dcc = "growlnotify -m 'Someone sent you DCC' IRC DCC"
+perl.beep.beep_command_highlight = "growlnotify -m 'Someone mentioned your name on weechat' IRC Highlight"
+perl.beep.beep_command_pv = "growlnotify -m 'Someone sent you a private message' IRC Private Message"
+perl.beep.beep_command_timeout = "30000"
+perl.beep.beep_dcc = "on"
+perl.beep.beep_highlight = "on"
+perl.beep.beep_highlight_blacklist = "off"
+perl.beep.beep_highlight_whitelist = "off"
+perl.beep.beep_pv = "on"
+perl.beep.beep_pv_blacklist = "off"
+perl.beep.beep_pv_whitelist = "off"
+perl.beep.beep_trigger_highlight = ""
+perl.beep.beep_trigger_pv = ""
+perl.beep.bell_always = ""
+perl.beep.blacklist_nicks = ""
+perl.beep.whitelist_channels = ""
+perl.beep.whitelist_nicks = ""
+perl.chanmon.alignment = "nchannel"
+perl.chanmon.bar_lines = "10"
+perl.chanmon.color_buf = "on"
+perl.chanmon.dynamic = "off"
+perl.chanmon.logging = "off"
+perl.chanmon.merge_private = "on"
+perl.chanmon.nick_prefix = "<"
+perl.chanmon.nick_suffix = ">"
+perl.chanmon.output = "bar"
+perl.chanmon.short_names = "on"
+perl.chanmon.show_aways = "off"
+perl.check_license = "on"
+python.check_license = "on"
+python.screen_away.away_suffix = "[away]"
+python.screen_away.command_on_attach = ""
+python.screen_away.command_on_detach = ""
+python.screen_away.interval = "5"
+python.screen_away.message = "Detached from tmux"
+tcl.check_license = "on"
+
+[desc]
+perl.beep.beep_command_dcc = "command for beep on dcc, special value "$bell" is allowed, as well as "$bell;command" (default: "$bell")"
+perl.beep.beep_command_highlight = "command for beep on highlight, special value "$bell" is allowed, as well as "$bell;command" (default: "$bell")"
+perl.beep.beep_command_pv = "command for beep on private message, special value "$bell" is allowed, as well as "$bell;command" (default: "$bell")"
+perl.beep.beep_command_timeout = "timeout for command run (in milliseconds, 0 = never kill (not recommended)) (default: "30000")"
+perl.beep.beep_dcc = "beep on dcc (default: "on")"
+perl.beep.beep_highlight = "beep on highlight (default: "on")"
+perl.beep.beep_highlight_blacklist = "turn blacklist for highlights on or off (default: "off")"
+perl.beep.beep_highlight_whitelist = "turn whitelist for highlights on or off (default: "off")"
+perl.beep.beep_pv = "beep on private message (default: "on")"
+perl.beep.beep_pv_blacklist = "turn blacklist for private messages on or off (default: "off")"
+perl.beep.beep_pv_whitelist = "turn whitelist for private messages on or off (default: "off")"
+perl.beep.beep_trigger_highlight = "word that will trigger execution of beep_command_highlight (if empty, anything will trigger) (default: "")"
+perl.beep.beep_trigger_pv = "word that will trigger execution of beep_command_pv (it empty, anything will trigger) (default: "")"
+perl.beep.bell_always = "use $bell on private messages and/or highlights regardless of trigger and whitelist settings (example: "pv,highlight") (default: "")"
+perl.beep.blacklist_nicks = "comma-separated list of "server.nick": if not empty, these nicks will not be able to trigger execution of commands. Cannot be used in conjuction with whitelist (example: "freenode.nick1,freenode.nick2") (default: "")"
+perl.beep.whitelist_channels = "comma-separated list of "server.#channel": if not empty, only these channels will trigger execution of commands (example: "freenode.#weechat,freenode.#channel2") (default: "")"
+perl.beep.whitelist_nicks = "comma-separated list of "server.nick": if not empty, only these nicks will trigger execution of commands (example: "freenode.nick1,freenode.nick2") (default: "")"
--- /dev/null
+../screen_away.py
\ No newline at end of file
--- /dev/null
+../upside_down.py
\ No newline at end of file
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009-2012 Sebastien Helleu <flashcode@flashtux.org>
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+
+#
+# WeeChat scripts manager.
+# (this script requires WeeChat >= 0.3.0 and python >= 2.6)
+#
+# History:
+#
+# 2012-03-09, Sebastien Helleu <flashcode@flashtux.org>:
+# version 1.8: fix reload of config file
+# 2012-02-27, Sebastien Helleu <flashcode@flashtux.org>:
+# version 1.7: add support of scheme scripts
+# 2012-02-05, Sebastien Helleu <flashcode@flashtux.org>:
+# version 1.6: use URL transfer from API (for WeeChat >= 0.3.7)
+# 2012-01-03, Sebastien Helleu <flashcode@flashtux.org>:
+# version 1.5: make script compatible with Python 3.x
+# 2011-03-25, Sebastien Helleu <flashcode@flashtux.org>:
+# version 1.4: add completion with installed scripts for action "remove"
+# 2011-03-10, Sebastien Helleu <flashcode@flashtux.org>:
+# version 1.3: add script extension in script name completion and a new
+# completion with tags for actions "list" and "listinstalled"
+# 2011-02-13, Sebastien Helleu <flashcode@flashtux.org>:
+# version 1.2: use new help format for command arguments
+# 2010-11-08, Sebastien Helleu <flashcode@flashtux.org>:
+# version 1.1: get python 2.x binary for hook_process (fix problem
+# when python 3.x is default python version, requires
+# WeeChat >= 0.3.4)
+# 2010-02-22, Blake Winton <bwinton@latte.ca>:
+# version 1.0: add action "listinstalled" for command /weeget
+# 2010-01-25, Sebastien Helleu <flashcode@flashtux.org>:
+# version 0.9: fix "running" status of scripts with /weeget check
+# 2009-09-30, Sebastien Helleu <flashcode@flashtux.org>:
+# version 0.8: fix bugs and add missing info in "/weeget show",
+# display warning if url for plugins.xml.gz is old site
+# 2009-09-07, Sebastien Helleu <flashcode@flashtux.org>:
+# version 0.7: update weechat site with new URL
+# 2009-05-02, Sebastien Helleu <flashcode@flashtux.org>:
+# version 0.6: sync with last API changes
+# 2009-04-15, Sebastien Helleu <flashcode@flashtux.org>:
+# version 0.5: display missing module(s) when import failed
+# 2009-04-11, Sebastien Helleu <flashcode@flashtux.org>:
+# version 0.4: use new completion for command arguments
+# 2009-04-07, Sebastien Helleu <flashcode@flashtux.org>:
+# version 0.3: fix bug with install/upgrade when weeget is updated with
+# other scripts: ensure that weeget is always the last
+# installed script
+# 2009-04-07, Sebastien Helleu <flashcode@flashtux.org>:
+# version 0.2: add author's mail in script description
+# 2009-04-05, Sebastien Helleu <flashcode@flashtux.org>:
+# version 0.1: initial release
+#
+
+SCRIPT_NAME = "weeget"
+SCRIPT_AUTHOR = "Sebastien Helleu <flashcode@flashtux.org>"
+SCRIPT_VERSION = "1.8"
+SCRIPT_LICENSE = "GPL3"
+SCRIPT_DESC = "WeeChat scripts manager"
+
+SCRIPT_COMMAND = "weeget"
+
+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
+
+try:
+ import sys, os, stat, time, gzip, hashlib, xml.dom.minidom
+except ImportError as message:
+ print("Missing package(s) for %s: %s" % (SCRIPT_NAME, message))
+ import_ok = False
+
+CONFIG_FILE_NAME = "wg"
+
+SCRIPT_EXTENSION = {
+ "perl" : "pl",
+ "python": "py",
+ "ruby" : "rb",
+ "lua" : "lua",
+ "tcl" : "tcl",
+ "guile" : "scm",
+}
+
+# timeout for download of plugins.xml.gz
+TIMEOUT_UPDATE = 60 * 1000
+
+# timeout for download of a script
+TIMEOUT_SCRIPT = 60 * 1000
+
+# config file and options
+wg_config_file = ""
+wg_config_option = {}
+
+# action (install, remove, ..) and arguments
+wg_action = ""
+wg_action_args = ""
+
+# loaded scripts
+wg_loaded_scripts = {}
+
+# hook process and stdout
+wg_hook_process = { "update": "", "script": "" }
+wg_stdout = { "update": "", "script": "" }
+
+# scripts read from plugins.xml.gz
+wg_scripts = {}
+
+# list of script to install, and script currently installing
+wg_scripts_to_install = []
+wg_current_script_install = {}
+
+# =================================[ config ]=================================
+
+def wg_config_init():
+ """
+ Initialization of configuration file.
+ Sections: color, scripts.
+ """
+ global wg_config_file, wg_config_option
+ wg_config_file = weechat.config_new(CONFIG_FILE_NAME,
+ "wg_config_reload_cb", "")
+ if wg_config_file == "":
+ return
+
+ # section "color"
+ section_color = weechat.config_new_section(
+ wg_config_file, "color", 0, 0, "", "", "", "", "", "", "", "", "", "")
+ if section_color == "":
+ weechat.config_free(wg_config_file)
+ return
+ wg_config_option["color_script"] = weechat.config_new_option(
+ wg_config_file, section_color,
+ "script", "color", "Color for script names", "", 0, 0,
+ "cyan", "cyan", 0, "", "", "", "", "", "")
+ wg_config_option["color_installed"] = weechat.config_new_option(
+ wg_config_file, section_color,
+ "installed", "color", "Color for \"installed\" indicator", "", 0, 0,
+ "yellow", "yellow", 0, "", "", "", "", "", "")
+ wg_config_option["color_running"] = weechat.config_new_option(
+ wg_config_file, section_color,
+ "running", "color", "Color for \"running\" indicator", "", 0, 0,
+ "lightgreen", "lightgreen", 0, "", "", "", "", "", "")
+ wg_config_option["color_obsolete"] = weechat.config_new_option(
+ wg_config_file, section_color,
+ "obsolete", "color", "Color for \"obsolete\" indicator", "", 0, 0,
+ "lightmagenta", "lightmagenta", 0, "", "", "", "", "", "")
+ wg_config_option["color_unknown"] = weechat.config_new_option(
+ wg_config_file, section_color,
+ "unknown", "color", "Color for \"unknown status\" indicator", "", 0, 0,
+ "lightred", "lightred", 0, "", "", "", "", "", "")
+ wg_config_option["color_language"] = weechat.config_new_option(
+ wg_config_file, section_color,
+ "language", "color", "Color for language names", "", 0, 0,
+ "lightblue", "lightblue", 0, "", "", "", "", "", "")
+
+ # section "scripts"
+ section_scripts = weechat.config_new_section(
+ wg_config_file, "scripts", 0, 0, "", "", "", "", "", "", "", "", "", "")
+ if section_scripts == "":
+ weechat.config_free(wg_config_file)
+ return
+ wg_config_option["scripts_url"] = weechat.config_new_option(
+ wg_config_file, section_scripts,
+ "url", "string", "URL for file with list of plugins", "", 0, 0,
+ "http://www.weechat.org/files/plugins.xml.gz",
+ "http://www.weechat.org/files/plugins.xml.gz", 0, "", "", "", "", "", "")
+ wg_config_option["scripts_dir"] = weechat.config_new_option(
+ wg_config_file, section_scripts,
+ "dir", "string", "Local cache directory for" + SCRIPT_NAME, "", 0, 0,
+ "%h/" + SCRIPT_NAME, "%h/" + SCRIPT_NAME, 0, "", "", "", "", "", "")
+ wg_config_option["scripts_cache_expire"] = weechat.config_new_option(
+ wg_config_file, section_scripts,
+ "cache_expire", "integer", "Local cache expiration time, in minutes "
+ "(-1 = never expires, 0 = always expires)", "",
+ -1, 60*24*365, "60", "60", 0, "", "", "", "", "", "")
+
+def wg_config_reload_cb(data, config_file):
+ """ Reload configuration file. """
+ return weechat.config_reload(config_file)
+
+def wg_config_read():
+ """ Read configuration file. """
+ global wg_config_file
+ return weechat.config_read(wg_config_file)
+
+def wg_config_write():
+ """ Write configuration file. """
+ global wg_config_file
+ return weechat.config_write(wg_config_file)
+
+def wg_config_color(color):
+ """ Get a color from configuration. """
+ global wg_config_option
+ option = wg_config_option.get("color_" + color, "")
+ if option == "":
+ return ""
+ return weechat.color(weechat.config_string(option))
+
+def wg_config_get_dir():
+ """ Return weeget directory, with expanded WeeChat home dir. """
+ global wg_config_option
+ return weechat.config_string(
+ wg_config_option["scripts_dir"]).replace("%h",
+ weechat.info_get("weechat_dir", ""))
+
+def wg_config_create_dir():
+ """ Create weeget directory. """
+ dir = wg_config_get_dir()
+ if not os.path.isdir(dir):
+ os.makedirs(dir, mode=0o700)
+
+def wg_config_get_cache_filename():
+ """ Get local cache filename, based on URL. """
+ global wg_config_option
+ return wg_config_get_dir() + os.sep + \
+ os.path.basename(weechat.config_string(wg_config_option["scripts_url"]))
+
+# =============================[ download file ]==============================
+
+def wg_download_file(url, filename, timeout, callback, callback_data):
+ """Download a file with an URL. Return hook_process created."""
+ version = weechat.info_get("version_number", "") or 0
+ if int(version) >= 0x00030700:
+ return weechat.hook_process_hashtable("url:%s" % url,
+ { "file_out": filename },
+ timeout,
+ callback, callback_data)
+ else:
+ script = [ "import sys",
+ "try:",
+ " if sys.version_info >= (3,):",
+ " import urllib.request",
+ " response = urllib.request.urlopen('%s')" % url,
+ " else:",
+ " import urllib2",
+ " response = urllib2.urlopen(urllib2.Request('%s'))" % url,
+ " f = open('%s', 'wb')" % filename,
+ " f.write(response.read())",
+ " response.close()",
+ " f.close()",
+ "except Exception as e:",
+ " print('error:' + str(e))" ]
+ return weechat.hook_process("python -c \"%s\"" % "\n".join(script),
+ timeout,
+ callback, callback_data)
+
+# ================================[ scripts ]=================================
+
+def wg_search_script_by_name(name):
+ """
+ Search a script in list by name.
+ Name can be short name ('weeget') or full name ('weeget.py').
+ """
+ global wg_scripts
+ for id, script in wg_scripts.items():
+ if script["name"] == name or script["full_name"] == name:
+ return script
+ return None
+
+def wg_get_loaded_scripts():
+ """
+ Get python dictionary with loaded scripts.
+ Keys are filenames and values are path to script, for example:
+ 'weeget.py': '/home/xxx/.weechat/python/weeget.py'
+ """
+ global wg_loaded_scripts
+ wg_loaded_scripts = {}
+ for language in SCRIPT_EXTENSION.keys():
+ infolist = weechat.infolist_get(language + "_script", "", "")
+ while weechat.infolist_next(infolist):
+ filename = weechat.infolist_string(infolist, "filename")
+ if filename != "":
+ wg_loaded_scripts[os.path.basename(filename)] = filename
+ weechat.infolist_free(infolist)
+
+def wg_is_local_script_loaded(filename):
+ """ Check if a script filename (like 'python/weeget.py') is loaded. """
+ global wg_loaded_scripts
+ filename2 = filename
+ if filename2.startswith("autoload/"):
+ filename2 = filename2[9:]
+ for name, path in wg_loaded_scripts.items():
+ if path.endswith(filename) or path.endswith(filename2):
+ return True
+ return False
+
+def wg_get_local_script_status(script):
+ """
+ Check if a script is installed.
+ 'script' is a dictionary retrieved from scripts xml list.
+ """
+ global wg_loaded_scripts
+ status = { "installed": "", "obsolete": "", "running": "" }
+ local_dir = weechat.info_get("weechat_dir", "") + os.sep + script["language"]
+ local_name = local_dir + os.sep + "autoload" + os.sep + script["full_name"]
+ if not os.path.isfile(local_name):
+ local_name = local_dir + os.sep + script["full_name"]
+ if os.path.isfile(local_name):
+ status["installed"] = "1"
+ f = open(local_name, "rb")
+ md5 = hashlib.md5()
+ md5.update(f.read())
+ f.close()
+ local_md5 = md5.hexdigest()
+ if local_md5 != script["md5sum"]:
+ status["obsolete"] = "1"
+ if script["full_name"] in wg_loaded_scripts.keys():
+ status["running"] = "1"
+ return status
+
+def wg_get_local_scripts():
+ """
+ Get list of all local scripts (in languages and autoload dirs).
+ Return a dictionary with language as key and list of paths as value,
+ with autoloaded scripts at beginning of list, for example:
+ { 'perl': [ 'autoload/buffers.pl',
+ 'autoload/weetris.pl',
+ 'beep.pl',
+ 'launcher.pl' ],
+ 'python': [ 'autoload/weeget.py',
+ 'go.py',
+ 'vdm.py' ]
+ }
+ """
+ files = {}
+ for language in SCRIPT_EXTENSION.keys():
+ files[language] = []
+ autoloaded_files = []
+ rootdir = weechat.info_get("weechat_dir", "") + os.sep + language
+ for root, dirs, listfiles in os.walk(rootdir):
+ if root == rootdir:
+ files[language] = listfiles
+ elif root == rootdir + os.sep + "autoload":
+ autoloaded_files = listfiles
+ for file in autoloaded_files:
+ if file in files[language]:
+ files[language].remove(file)
+ files[language].insert(0, "autoload" + os.sep + file)
+ return files
+
+def wg_get_local_scripts_status():
+ """
+ Return list of all local scripts with status (unknown/obsolete/running).
+ For example:
+ [ 'perl/weetris.pl': { 'unknown': '', 'obsolete': '1', 'running': '' },
+ 'python/weeget.py': { 'unknown': '', 'obsolete': '', 'running': '1' }
+ ]
+ """
+ local_scripts_status = []
+ local_scripts = wg_get_local_scripts()
+ if len(local_scripts) > 0:
+ for language, files in local_scripts.items():
+ for file in files:
+ script_status = { "unknown": "", "obsolete": "", "running": "" }
+ name_with_ext = os.path.basename(file)
+ script = wg_search_script_by_name(os.path.basename(file))
+ if script == None:
+ script_status["unknown"] = "1"
+ else:
+ status = wg_get_local_script_status(script)
+ if status["obsolete"]:
+ script_status["obsolete"] = "1"
+ if wg_is_local_script_loaded(file):
+ script_status["running"] = "1"
+ local_scripts_status.append((language + os.sep + file,
+ script_status))
+ return local_scripts_status
+
+def wg_search_scripts(search):
+ """ Search word in scripts, return list of matching scripts. """
+ global wg_scripts
+ if search == "":
+ return wg_scripts
+ scripts_matching = {}
+ for id, script in wg_scripts.items():
+ if script["name"].lower().find(search) >= 0 \
+ or script["language"].lower().find(search) >= 0 \
+ or script["desc_en"].lower().find(search) >= 0 \
+ or script["desc_fr"].lower().find(search) >= 0 \
+ or script["tags"].lower().find(search) >= 0:
+ scripts_matching[id] = script
+ return scripts_matching
+
+def wg_list_scripts(search, installed=False):
+ """
+ List all scripts (with optional search string).
+ If installed == True, then list only installed scripts.
+ For each script, display status (installed/running/new version available),
+ name of script, language and description.
+ For example:
+ ir buffers pl Sidebar with list of buffers.
+ i N go py Quick jump to buffers.
+ i weetris pl Tetris-like game.
+ """
+ global wg_scripts
+ search = search.strip().lower()
+ scripts_matching = wg_search_scripts(search)
+ if len(scripts_matching) == 0:
+ weechat.prnt("", "%s: no script found" % SCRIPT_NAME)
+ else:
+ weechat.prnt("", "")
+ if search != "":
+ if installed:
+ weechat.prnt("", "Scripts installed matching \"%s\":" % search)
+ else:
+ weechat.prnt("", "Scripts for WeeChat %s matching \"%s\":"
+ % (weechat.info_get("version", ""),
+ search))
+ else:
+ if installed:
+ weechat.prnt("", "Scripts installed:")
+ else:
+ weechat.prnt("", "Scripts for WeeChat %s:"
+ % weechat.info_get("version", ""))
+ sorted_scripts = sorted(scripts_matching.items(),
+ key=lambda s: s[1]["name"])
+ length_max_name = 0
+ for item in sorted_scripts:
+ length = len(item[1]["name"])
+ if length > length_max_name:
+ length_max_name = length
+ str_format = "%%s%%s%%s%%s%%s%%s%%s %%s%%-%ds %%s%%-3s %%s%%s" \
+ % length_max_name
+ for item in sorted_scripts:
+ script = item[1]
+ str_installed = " "
+ str_running = " "
+ str_obsolete = " "
+ status = wg_get_local_script_status(script)
+ if installed and not status["installed"]:
+ continue
+ if status["installed"]:
+ str_installed = "i"
+ if status["running"]:
+ str_running = "r"
+ if status["obsolete"]:
+ str_obsolete = "N"
+ weechat.prnt("", str_format
+ % (wg_config_color("installed"),
+ str_installed,
+ wg_config_color("running"),
+ str_running,
+ wg_config_color("obsolete"),
+ str_obsolete,
+ weechat.color("chat"),
+ wg_config_color("script"),
+ script["name"],
+ wg_config_color("language"),
+ SCRIPT_EXTENSION[script["language"]],
+ weechat.color("chat"),
+ script["desc_en"]))
+
+def wg_show_script(name):
+ """
+ Show detailed info about a script (in repository).
+ For example:
+ Script: weeget.py, version 0.7, license: GPL3
+ Author: Sebastien Helleu <flashcode [at] flashtux [dot] org>
+ Status: installed, running
+ Date: added: 2009-04-05, updated: 2009-09-07
+ URL: http://www.weechat.org/files/scripts/weeget.py
+ MD5: 4b0458dd5cc5c9a09ba8078f89830869
+ Desc: Scripts manager.
+ Tags: scripts
+ Requires: python 2.5
+ Min: 0.3.0
+ """
+ if len(wg_scripts) == 0:
+ return
+ script = wg_search_script_by_name(name)
+ if script == None:
+ weechat.prnt("", "%s: script \"%s%s%s\" not found"
+ % (SCRIPT_NAME,
+ wg_config_color("script"),
+ name,
+ weechat.color("chat")))
+ else:
+ weechat.prnt("", "")
+ weechat.prnt("", " Script: %s%s%s, version %s, license: %s"
+ % (wg_config_color("script"),
+ script["full_name"],
+ weechat.color("chat"),
+ script["version"],
+ script["license"]))
+ weechat.prnt("", " Author: %s <%s>" % (script["author"], script["mail"]))
+ status = wg_get_local_script_status(script)
+ str_status = "not installed"
+ if status["installed"]:
+ str_status = "installed"
+ if status["running"]:
+ str_status += ", running"
+ else:
+ str_status += ", not running"
+ if status["obsolete"]:
+ str_status += " (new version available)"
+ weechat.prnt("", " Status: %s" % str_status)
+ date_added = script.get("added", "")[:10]
+ str_updated = script.get("updated", "")
+ if str_updated != "":
+ date_updated = script["updated"][:10]
+ if date_updated == "0000-00-00" or date_updated == date_added:
+ str_updated = ""
+ if str_updated != "":
+ weechat.prnt("", " Date: added: %s, updated: %s"
+ % (date_added, date_updated))
+ else:
+ weechat.prnt("", " Date: added: %s" % date_added)
+ weechat.prnt("", " URL: %s" % script.get("url", ""))
+ weechat.prnt("", " MD5: %s" % script.get("md5sum", ""))
+ weechat.prnt("", " Desc: %s" % script.get("desc_en", ""))
+ weechat.prnt("", " Tags: %s" % script.get("tags", ""))
+ str_requires = script.get("requirements", "")
+ if str_requires == "":
+ str_requires = "(nothing)"
+ weechat.prnt("", "Requires: %s" % str_requires)
+ vmin = script.get("min_weechat", "")
+ vmax = script.get("max_weechat", "")
+ if vmin != "":
+ weechat.prnt("", " Min: %s" % vmin)
+ if vmax != "":
+ weechat.prnt("", " Max: %s" % vmax)
+
+def wg_install_next_script():
+ """
+ Install first script in list wg_scripts_to_install and remove it from
+ list.
+ """
+ global wg_scripts, wg_scripts_to_install, wg_current_script_install
+ global wg_hook_process
+ if len(wg_scripts) == 0:
+ return
+ # be sure weeget is ALWAYS last script to install/update
+ # otherwise we'll lose end of list when weeget is unloaded by WeeChat
+ if SCRIPT_NAME in wg_scripts_to_install:
+ wg_scripts_to_install.remove(SCRIPT_NAME)
+ wg_scripts_to_install.append(SCRIPT_NAME)
+ # loop until a script is installed, or end if list is empty
+ while len(wg_scripts_to_install) > 0:
+ name = wg_scripts_to_install.pop(0)
+ script = wg_search_script_by_name(name)
+ if script == None:
+ weechat.prnt("", "%s: script \"%s%s%s\" not found"
+ % (SCRIPT_NAME,
+ wg_config_color("script"),
+ name,
+ weechat.color("chat")))
+ else:
+ status = wg_get_local_script_status(script)
+ if status["installed"] and not status["obsolete"]:
+ weechat.prnt("",
+ "%s: script \"%s%s%s\" is already "
+ "installed and up to date"
+ % (SCRIPT_NAME,
+ wg_config_color("script"),
+ script["full_name"],
+ weechat.color("chat")))
+ else:
+ weechat.prnt("", "%s: downloading \"%s%s%s\"..."
+ % (SCRIPT_NAME,
+ wg_config_color("script"),
+ script["full_name"],
+ weechat.color("chat")))
+ if wg_hook_process["script"] != "":
+ weechat.unhook(wg_hook_process["script"])
+ wg_hook_process["script"] = ""
+ wg_current_script_install = script
+ filename = wg_config_get_dir() + os.sep + script["full_name"]
+ wg_hook_process["script"] = wg_download_file(script["url"], filename, TIMEOUT_SCRIPT,
+ "wg_process_script_cb", "")
+ # this function will be called again when script will be
+ # downloaded
+ return
+
+def wg_install_scripts(names):
+ """ Install scripts. """
+ global wg_scripts_to_install
+ for name in names.split(" "):
+ wg_scripts_to_install.append(name)
+ wg_install_next_script()
+
+def wg_process_script_cb(data, command, rc, stdout, stderr):
+ """ Callback when reading a script from website. """
+ global wg_hook_process, wg_stdout, wg_current_script_install, wg_loaded_scripts
+ if stdout != "":
+ wg_stdout["script"] += stdout
+ if stderr != "":
+ wg_stdout["script"] += stderr
+ if int(rc) >= 0:
+ if wg_stdout["script"].startswith("error:"):
+ weechat.prnt("", "%s%s: error downloading script (%s)"
+ % (weechat.prefix("error"), SCRIPT_NAME,
+ wg_stdout["update"][6:].strip()))
+ else:
+ # ask C plugin to install/load script
+ weechat.hook_signal_send(wg_current_script_install["language"] + "_script_install",
+ weechat.WEECHAT_HOOK_SIGNAL_STRING,
+ wg_config_get_dir() + os.sep + wg_current_script_install["full_name"])
+ wg_hook_process["script"] = ""
+ wg_install_next_script()
+ return weechat.WEECHAT_RC_OK
+
+def wg_check_scripts():
+ """
+ Check status of local script(s).
+ For each script found, display status (unknown/running/new version available).
+ For example:
+ r python/autoload/vdm.py
+ ?r python/autoload/dummy.py
+ rN python/shell.py
+ perl/buffers.pl
+ """
+ local_scripts_status = wg_get_local_scripts_status()
+ if len(local_scripts_status) == 0:
+ return
+ weechat.prnt("", "")
+ weechat.prnt("", "Local scripts:")
+ for file, status in local_scripts_status:
+ str_unknown = " "
+ str_running = " "
+ str_obsolete = " "
+ if status["unknown"]:
+ str_unknown = "?"
+ if status["running"]:
+ str_running = "r"
+ if status["obsolete"]:
+ str_obsolete = "N"
+ weechat.prnt("", "%s%s%s%s%s%s%s %s%s%s%s"
+ % (wg_config_color("unknown"), str_unknown,
+ wg_config_color("running"), str_running,
+ wg_config_color("obsolete"), str_obsolete,
+ weechat.color("chat"),
+ os.path.dirname(file),
+ os.sep,
+ wg_config_color("script"),
+ os.path.basename(file)))
+
+def wg_upgrade_scripts():
+ """ Upgrade scripts. """
+ global wg_scripts, wg_scripts_to_install
+ if len(wg_scripts) == 0:
+ return
+ scripts_to_upgrade = []
+ for id, script in wg_scripts.items():
+ status = wg_get_local_script_status(script)
+ if status["installed"] and status["obsolete"]:
+ scripts_to_upgrade.append(script["name"])
+ if len(scripts_to_upgrade) == 0:
+ weechat.prnt("", "%s: all scripts are up to date" % SCRIPT_NAME)
+ else:
+ wg_scripts_to_install.extend(scripts_to_upgrade)
+ wg_install_next_script()
+
+def wg_remove_scripts(names):
+ """ Remove scripts. """
+ if len(wg_scripts) == 0:
+ return
+ list_names = names.split(" ")
+ scripts_to_remove = {}
+ for language in SCRIPT_EXTENSION.keys():
+ scripts_to_remove[language] = []
+ for name in list_names:
+ script = wg_search_script_by_name(name)
+ if script == None:
+ weechat.prnt("", "%s: script \"%s%s%s\" not found"
+ % (SCRIPT_NAME,
+ wg_config_color("script"),
+ name,
+ weechat.color("chat")))
+ else:
+ if script["full_name"] not in scripts_to_remove[script["language"]]:
+ scripts_to_remove[script["language"]].append(script["full_name"])
+ for language in SCRIPT_EXTENSION.keys():
+ if len(scripts_to_remove[language]) > 0:
+ # ask C plugin to remove script file(s)
+ weechat.hook_signal_send(language + "_script_remove",
+ weechat.WEECHAT_HOOK_SIGNAL_STRING,
+ ",".join(scripts_to_remove[language]))
+
+# ==================================[ xml ]===================================
+
+def wg_execute_action():
+ """ Execute action. """
+ global wg_action, wg_action_args, wg_loaded_scripts
+ if wg_action != "":
+ wg_get_loaded_scripts()
+ if wg_action == "list":
+ wg_list_scripts(wg_action_args)
+ elif wg_action == "listinstalled":
+ wg_list_scripts(wg_action_args, installed=True)
+ elif wg_action == "show":
+ wg_show_script(wg_action_args)
+ elif wg_action == "install":
+ wg_install_scripts(wg_action_args)
+ elif wg_action == "check":
+ wg_check_scripts()
+ elif wg_action == "upgrade":
+ wg_upgrade_scripts()
+ elif wg_action == "remove":
+ wg_remove_scripts(wg_action_args)
+ else:
+ weechat.prnt("", "%s%s: unknown action \"%s\""
+ % (weechat.prefix("error"), SCRIPT_NAME, wg_action))
+
+ # reset action
+ wg_action = ""
+ wg_action_args = ""
+ wg_loaded_scripts = {}
+
+def wg_check_version(script):
+ """ Check if a script is designed for current running WeeChat version."""
+ version = weechat.info_get("version", "")
+ version = version.split("-", 1)[0]
+ vmin = script.get("min_weechat", "")
+ vmax = script.get("max_weechat", "")
+ if vmin != "" and version < vmin:
+ return False
+ if vmax != "" and version > vmax:
+ return False
+ return True
+
+def wg_parse_xml():
+ """
+ Parse XML scripts list and return dictionary with list, with key 'id'.
+ Example of item return in dictionary :
+ '119': { 'name' : 'weeget',
+ 'version' : '0.1',
+ 'url' : 'http://www.weechat.org/files/scripts/weeget.py',
+ 'language' : 'python',
+ 'license' : 'GPL3',
+ 'md5sum' : 'd500714fc19b0e10cc4e339e70739e4ad500714fc19b0e10cc4e339e70739e4a',
+ 'tags' : 'scripts',
+ 'desc_en' : 'Scripts manager.',
+ 'desc_fr' : 'Gestionnaire de scripts.',
+ 'requirements': 'python 2.5',
+ 'min_weechat' : '0.3.0',
+ 'max_weechat' : '',
+ 'author' : 'FlashCode',
+ 'mail' : 'flashcode [at] flashtux [dot] org',
+ 'added' : '2009-04-05 22:39:18',
+ 'updated' : '0000-00-00 00:00:00' }
+ """
+ global wg_scripts, wg_action, wg_action_args
+ wg_scripts = {}
+ try:
+ f = gzip.open(wg_config_get_cache_filename(), "rb")
+ string = f.read()
+ f.close()
+ except:
+ weechat.prnt("", "%s%s: unable to read xml file"
+ % (weechat.prefix("error"), SCRIPT_NAME))
+ else:
+ try:
+ dom = xml.dom.minidom.parseString(string)
+ except:
+ weechat.prnt("",
+ "%s%s: unable to parse xml list of scripts"
+ % (weechat.prefix("error"), SCRIPT_NAME))
+ # discard action
+ wg_action = ""
+ wg_action_args = ""
+ else:
+ for scriptNode in dom.getElementsByTagName("plugin"):
+ id = scriptNode.getAttribute("id")
+ script = {}
+ for node in scriptNode.childNodes:
+ if node.nodeType == node.ELEMENT_NODE:
+ if node.firstChild != None:
+ nodename = node.nodeName
+ value = node.firstChild.data
+ if sys.version_info < (3,):
+ # python 2.x: convert unicode to str (in python 3.x, id and text are already strings)
+ nodename = nodename.encode("utf-8")
+ value = value.encode("utf-8")
+ script[nodename] = value
+ if script["language"] in SCRIPT_EXTENSION:
+ script["full_name"] = script["name"] + "." + SCRIPT_EXTENSION[script["language"]]
+ if wg_check_version(script):
+ wg_scripts[id] = script
+ wg_execute_action()
+
+def wg_process_update_cb(data, command, rc, stdout, stderr):
+ """ Callback when reading XML cache file from website. """
+ global wg_hook_process, wg_stdout, wg_scripts
+ if stdout != "":
+ wg_stdout["update"] += stdout
+ if stderr != "":
+ wg_stdout["update"] += stderr
+ if int(rc) >= 0:
+ if wg_stdout["update"].startswith("error:"):
+ weechat.prnt("", "%s%s: error downloading scripts (%s)"
+ % (weechat.prefix("error"), SCRIPT_NAME,
+ wg_stdout["update"][6:].strip()))
+ else:
+ weechat.prnt("", "%s: scripts downloaded" % SCRIPT_NAME)
+ wg_parse_xml()
+ wg_hook_process["update"] = ""
+ return weechat.WEECHAT_RC_OK
+
+def wg_update_cache():
+ """ Download list of scripts and update local cache. """
+ global wg_config_option, wg_hook_process, wg_stdout
+ # get data from website, via hook_process
+ if wg_hook_process["update"] != "":
+ weechat.unhook(wg_hook_process["update"])
+ wg_hook_process["update"] = ""
+ weechat.prnt("", "%s: downloading list of scripts..." % SCRIPT_NAME)
+ wg_stdout["update"] = ""
+ wg_config_create_dir()
+ url = weechat.config_string(wg_config_option["scripts_url"])
+ filename = wg_config_get_cache_filename()
+ wg_hook_process["update"] = wg_download_file(url, filename, TIMEOUT_UPDATE,
+ "wg_process_update_cb", "")
+
+def wg_read_scripts(download_list=True):
+ """ Read scripts list (download list if needed and asked). """
+ global wg_scripts
+ cache_file = wg_config_get_cache_filename()
+ if os.path.isfile(cache_file):
+ # check if local cache file is too old
+ cache_expire = weechat.config_integer(wg_config_option["scripts_cache_expire"]) * 60
+ if cache_expire >= 0:
+ diff_time = time.time() - os.stat(cache_file)[stat.ST_MTIME]
+ if download_list and diff_time >= cache_expire:
+ os.unlink(cache_file)
+ wg_scripts.clear()
+ if len(wg_scripts) > 0:
+ wg_execute_action()
+ else:
+ if os.path.isfile(cache_file):
+ wg_parse_xml()
+ elif download_list:
+ wg_update_cache()
+
+# ================================[ command ]=================================
+
+def wg_cmd(data, buffer, args):
+ """ Callback for /weeget command. """
+ global wg_action, wg_action_args
+ if args == "":
+ weechat.command("", "/help %s" % SCRIPT_COMMAND)
+ return weechat.WEECHAT_RC_OK
+ argv = args.strip().split(" ", 1)
+ if len(argv) == 0:
+ return weechat.WEECHAT_RC_OK
+
+ wg_action = ""
+ wg_action_args = ""
+
+ # check arguments
+ if len(argv) < 2:
+ if argv[0] == "show" or \
+ argv[0] == "install" or \
+ argv[0] == "remove":
+ weechat.prnt("", "%s: too few arguments for action \"%s\""
+ % (SCRIPT_NAME, argv[0]))
+ return weechat.WEECHAT_RC_OK
+
+ # execute asked action
+ if argv[0] == "update":
+ wg_update_cache()
+ else:
+ wg_action = argv[0]
+ wg_action_args = ""
+ if len(argv) > 1:
+ wg_action_args = argv[1]
+ wg_read_scripts()
+
+ return weechat.WEECHAT_RC_OK
+
+def wg_completion_scripts_cb(data, completion_item, buffer, completion):
+ """ Complete with known script names, for command '/weeget'. """
+ global wg_scripts
+ wg_read_scripts(download_list=False)
+ if len(wg_scripts) > 0:
+ for id, script in wg_scripts.items():
+ weechat.hook_completion_list_add(completion, script["full_name"],
+ 0, weechat.WEECHAT_LIST_POS_SORT)
+ return weechat.WEECHAT_RC_OK
+
+def wg_completion_scripts_installed_cb(data, completion_item, buffer, completion):
+ """ Complete with names of scripts installed, for command '/weeget'. """
+ global wg_scripts
+ wg_read_scripts(download_list=False)
+ if len(wg_scripts) > 0:
+ for id, script in wg_scripts.items():
+ status = wg_get_local_script_status(script)
+ if status["installed"]:
+ weechat.hook_completion_list_add(completion, script["full_name"],
+ 0, weechat.WEECHAT_LIST_POS_SORT)
+ return weechat.WEECHAT_RC_OK
+
+def wg_completion_scripts_tags_cb(data, completion_item, buffer, completion):
+ """ Complete with known tags, for command '/weeget'. """
+ global wg_scripts
+ wg_read_scripts(download_list=False)
+ if len(wg_scripts) > 0:
+ for id, script in wg_scripts.items():
+ if script["tags"]:
+ for tag in script["tags"].split(","):
+ weechat.hook_completion_list_add(completion, tag,
+ 0, weechat.WEECHAT_LIST_POS_SORT)
+ return weechat.WEECHAT_RC_OK
+
+# ==================================[ main ]==================================
+
+if __name__ == "__main__" and import_ok:
+ if weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE,
+ SCRIPT_DESC, "wg_unload_script", ""):
+ wg_config_init()
+ wg_config_read()
+ if weechat.config_string(wg_config_option["scripts_url"]).find("weechat.flashtux.org") >= 0:
+ weechat.prnt("", "%sWarning: old site still used in URL for plugins.xml.gz, you should do: /unset wg.scripts.url"
+ % weechat.prefix("error"))
+ str_installed = wg_config_color("installed") + "i" + weechat.color("chat")
+ str_unknown = wg_config_color("unknown") + "?" + weechat.color("chat")
+ str_running = wg_config_color("running") + "r" + weechat.color("chat")
+ str_obsolete = wg_config_color("obsolete") + "N" + weechat.color("chat")
+ weechat.hook_command(SCRIPT_COMMAND,
+ "WeeChat scripts manager",
+ "list|listinstalled [<text>|<tag>] || show <script>"
+ " || install|remove <script> [<script>...] || check|update|upgrade",
+ " list: list scripts (search text if given)\n"
+ "listinstalled: list installed scripts (search text if given)\n"
+ " show: show detailed information about a script (in repository)\n"
+ " install: install/upgrade script(s)\n"
+ " check: check if local scripts needs upgrade\n"
+ " update: update local scripts cache\n"
+ " upgrade: upgrade all local scripts if they are obsolete\n"
+ " remove: remove script(s)\n\n"
+ "Indicators in lists (first column):\n"
+ " " + str_installed + " script is installed\n"
+ " " + str_unknown + " unknown script\n"
+ " " + str_running + " script is running (loaded)\n"
+ " " + str_obsolete + " script is obsolete (new version available)\n\n"
+ "Examples:\n"
+ " /" + SCRIPT_COMMAND + " list => list all scripts\n"
+ " /" + SCRIPT_COMMAND + " list game => list all scripts with text/tag \"game\"\n"
+ " /" + SCRIPT_COMMAND + " install beep.pl => install script beep.pl\n"
+ " /" + SCRIPT_COMMAND + " remove beep.pl => remove script beep.pl",
+ "list %(weeget_scripts_tags)"
+ " || listinstalled %(weeget_scripts_tags)"
+ " || show %(weeget_scripts)"
+ " || install %(weeget_scripts)|%*"
+ " || remove %(weeget_scripts_installed)|%*"
+ " || check"
+ " || update"
+ " || upgrade",
+ "wg_cmd", "")
+ weechat.hook_completion("weeget_scripts", "list of scripts in repository",
+ "wg_completion_scripts_cb", "")
+ weechat.hook_completion("weeget_scripts_installed", "list of scripts installed",
+ "wg_completion_scripts_installed_cb", "")
+ weechat.hook_completion("weeget_scripts_tags", "tags of scripts in repository",
+ "wg_completion_scripts_tags_cb", "")
+
+# ==================================[ end ]===================================
+
+def wg_unload_script():
+ """ Function called when script is unloaded. """
+ wg_config_write()
+ return weechat.WEECHAT_RC_OK
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2009 by xt <xt@bash.no>
+# Copyright (c) 2009 by penryu <penryu@gmail.com>
+# Copyright (c) 2010 by Blake Winton <bwinton@latte.ca>
+# Copyright (c) 2010 by Aron Griffis <agriffis@n01se.net>
+# Copyright (c) 2010 by Jani Kesänen <jani.kesanen@gmail.com>
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+
+#
+# (this script requires WeeChat 0.3.0 or newer)
+#
+# History:
+# 2010-08-07, Filip H.F. "FiXato" Slagter <fixato@gmail.com>
+# version 0.8: add command on attach feature
+# 2010-05-07, Jani Kesänen <jani.kesanen@gmail.com>
+# version 0.7: add command on detach feature
+# 2010-03-07, Aron Griffis <agriffis@n01se.net>
+# version 0.6: move socket check to register,
+# add hook_config for interval,
+# reduce default interval from 60 to 5
+# 2010-02-19, Blake Winton <bwinton@latte.ca>
+# version 0.5: add option to change nick when away
+# 2010-01-18, xt
+# version 0.4: only update servers that are connected
+# 2009-11-30, xt <xt@bash.no>
+# version 0.3: do not touch servers that are manually set away
+# 2009-11-27, xt <xt@bash.no>
+# version 0.2: code for TMUX from penryu
+# 2009-11-27, xt <xt@bash.no>
+# version 0.1: initial release
+
+import weechat as w
+import re
+import os
+
+SCRIPT_NAME = "screen_away"
+SCRIPT_AUTHOR = "xt <xt@bash.no>"
+SCRIPT_VERSION = "0.8"
+SCRIPT_LICENSE = "GPL3"
+SCRIPT_DESC = "Set away status on screen detach"
+
+settings = {
+ 'message': 'Detached from screen',
+ 'interval': '5', # How often in seconds to check screen status
+ 'away_suffix': '', # What to append to your nick when you're away.
+ 'command_on_attach': '', # Command to execute on attach
+ 'command_on_detach': '' # Command to execute on detach
+}
+
+TIMER = None
+SOCK = None
+AWAY = False
+
+def set_timer():
+ '''Update timer hook with new interval'''
+
+ global TIMER
+ if TIMER:
+ w.unhook(TIMER);
+ TIMER = w.hook_timer(int(w.config_get_plugin('interval')) * 1000,
+ 0, 0, "screen_away_timer_cb", '')
+
+def screen_away_config_cb(data, option, value):
+ if option.endswith(".interval"):
+ set_timer()
+ return w.WEECHAT_RC_OK
+
+def get_servers():
+ '''Get the servers that are not away, or were set away by this script'''
+
+ infolist = w.infolist_get('irc_server','','')
+ buffers = []
+ while w.infolist_next(infolist):
+ if not w.infolist_integer(infolist, 'is_connected') == 1:
+ continue
+ if not w.infolist_integer(infolist, 'is_away') or \
+ w.infolist_string(infolist, 'away_message') == \
+ w.config_get_plugin('message'):
+ buffers.append((w.infolist_pointer(infolist, 'buffer'),
+ w.infolist_string(infolist, 'nick')))
+ w.infolist_free(infolist)
+ return buffers
+
+def screen_away_timer_cb(buffer, args):
+ '''Check if screen is attached, update awayness'''
+
+ global AWAY, SOCK
+
+ suffix = w.config_get_plugin('away_suffix')
+ attached = os.access(SOCK, os.X_OK) # X bit indicates attached
+
+ if attached and AWAY:
+ w.prnt('', '%s: Screen attached. Clearing away status' % SCRIPT_NAME)
+ for server, nick in get_servers():
+ w.command(server, "/away")
+ if suffix and nick.endswith(suffix):
+ nick = nick[:-len(suffix)]
+ w.command(server, "/nick %s" % nick)
+ AWAY = False
+ if w.config_get_plugin("command_on_attach"):
+ w.command("", w.config_get_plugin("command_on_attach"))
+
+ elif not attached and not AWAY:
+ w.prnt('', '%s: Screen detached. Setting away status' % SCRIPT_NAME)
+ for server, nick in get_servers():
+ if suffix:
+ w.command(server, "/nick %s%s" % (nick, suffix));
+ w.command(server, "/away %s" % w.config_get_plugin('message'));
+ AWAY = True
+ if w.config_get_plugin("command_on_detach"):
+ w.command("", w.config_get_plugin("command_on_detach"))
+
+ return w.WEECHAT_RC_OK
+
+
+if w.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE,
+ SCRIPT_DESC, "", ""):
+ for option, default_value in settings.iteritems():
+ if not w.config_is_set_plugin(option):
+ w.config_set_plugin(option, default_value)
+
+ if 'STY' in os.environ.keys():
+ # We are running under screen
+ cmd_output = os.popen('env LC_ALL=C screen -ls').read()
+ match = re.search(r'Sockets? in (/.+)\.', cmd_output)
+ if match:
+ SOCK = os.path.join(match.group(1), os.environ['STY'])
+
+ if not SOCK and 'TMUX' in os.environ.keys():
+ # We are running under tmux
+ socket_data = os.environ['TMUX']
+ SOCK = socket_data.rsplit(',',2)[0]
+
+ if SOCK:
+ set_timer()
+ w.hook_config("plugins.var.python." + SCRIPT_NAME + ".*",
+ "screen_away_config_cb", "")
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2009 by xt <xt@bash.no>
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+#
+#
+# USAGE: Bind a key to command /flip . Then write some text at input line
+# press your key to transform it to upside down.
+
+#
+# (this script requires WeeChat 0.3.0 or newer)
+#
+# History:
+# 2010-01-14, xt
+# version 0.3: steal more chars from m4v
+# 2010-01-06, xt <xt@bash.no>
+# version 0.2: fix idiotic programming
+# 2009-11-12, xt <xt@bash.no>
+# version 0.1: initial release
+
+import weechat as w
+import re
+
+SCRIPT_NAME = "upside_down"
+SCRIPT_AUTHOR = "xt <xt@bash.no>"
+SCRIPT_VERSION = "0.3"
+SCRIPT_LICENSE = "GPL3"
+SCRIPT_DESC = "Replaces text you write with upside down text"
+
+settings = {}
+
+replacements = {
+# Upper case
+ u'A' : u'\N{FOR ALL}',
+ u'B' : u'\N{GREEK SMALL LETTER XI}',
+ u'C' : u'\N{ROMAN NUMERAL REVERSED ONE HUNDRED}',
+ u'D' : u'\N{LEFT HALF BLACK CIRCLE}',
+ u'E' : u'\N{LATIN CAPITAL LETTER REVERSED E}',
+ u'F' : u'\N{TURNED CAPITAL F}',
+ u'G' : u'\N{TURNED SANS-SERIF CAPITAL G}',
+ u'J' : u'\N{LATIN SMALL LETTER LONG S}',
+ u'K' : u'\N{RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT}',
+ u'L' : u'\ua780',
+ u'M' : u'W',
+ u'N' : u'\N{LATIN LETTER SMALL CAPITAL REVERSED N}',
+ u'P' : u'\N{CYRILLIC CAPITAL LETTER KOMI DE}',
+ u'Q' : u'\N{GREEK CAPITAL LETTER OMICRON WITH TONOS}',
+ u'R' : u'\N{LATIN LETTER SMALL CAPITAL TURNED R}',
+ u'T' : u'\N{UP TACK}',
+ u'U' : u'\N{INTERSECTION}',
+ u'V' : u'\u0245',
+ u'Y' : u'\N{TURNED SANS-SERIF CAPITAL Y}',
+ 'a' : u"\u0250",
+ 'b' : u'q',
+ 'c' : u"\u0254",
+ 'd' : u'p',
+ 'e' : u"\u01DD",
+ 'f' : u"\u025F",
+ 'g' : u"\u0183",
+ 'h' : u'\u0265',
+ 'i' : u'\u0131',
+ 'j' : u'\u027E',
+ 'k' : u'\u029E',
+ 'm' : u'\u026F',
+ 'n' : u'u',
+ 'r' : u'\u0279',
+ 't' : u'\u0287',
+ 'p' : u'd',
+ 'u' : u'n',
+ 'q' : u'b',
+ 'v' : u'\u028C',
+ 'w' : u'\u028D',
+ 'y' : u'\u028E',
+ '.' : u'\u02D9',
+ '[' : u']',
+ '(' : u')',
+ '{' : u'}',
+ '?' : u'\u00BF',
+ '!' : u'\u00A1',
+ "\'" :u',',
+ '>' : u'<',
+ '<' : u'>',
+ '_' : u'\u203E',
+ ';' : u'\u061B',
+ '\u203F' : u'\u2040',
+ '\u2045' : u'\u2046',
+ '\u2234' : u'\u2235',
+}
+
+
+
+if w.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE,
+ SCRIPT_DESC, "", ""):
+ for option, default_value in settings.iteritems():
+ if not w.config_is_set_plugin(option):
+ w.config_set_plugin(option, default_value)
+ w.hook_command("flip",
+ SCRIPT_DESC,
+ "[text]",
+ "text: text to be flipped\n"
+ "",
+ "", "flip_cmd_cb", "")
+
+
+def flip_cmd_cb(data, buffer, args):
+ ''' Command /flip '''
+ translate_input = args
+ if not translate_input:
+ translate_input = w.buffer_get_string(w.current_buffer(), "input")
+ outstring = ''
+ for char in translate_input:
+ if char in replacements:
+ char = replacements[char]
+ outstring += char
+ outstring = outstring.encode('UTF-8')
+ w.buffer_set(w.current_buffer(), 'input', outstring)
+ return w.WEECHAT_RC_OK
--- /dev/null
+#
+# relay.conf -- weechat v0.3.8
+#
+
+[look]
+auto_open_buffer = on
+raw_messages = 256
+
+[color]
+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]
+allowed_ips = ""
+bind_address = ""
+compression_level = 6
+max_clients = 5
+password = ""
+
+[port]
--- /dev/null
+#
+# rmodifier.conf -- weechat v0.3.8
+#
+
+[look]
+hide_char = "*"
+
+[modifier]
+nickserv = "history_add,input_text_display;^(/(msg|quote) +nickserv +(identify|ghost \S+) +)(.*);1,4*"
+oper = "history_add,input_text_display;^(/oper +\S+ +)(.*);1,2*"
+set_pass = "history_add;^(/set +\S*password\S* +)(.*);1,2*"
--- /dev/null
+#
+# weechat.conf -- weechat v0.3.8
+#
+
+[debug]
+
+[startup]
+command_after_plugins = ""
+command_before_plugins = ""
+display_logo = on
+display_version = on
+
+[look]
+align_end_of_lines = message
+bar_more_down = "++"
+bar_more_left = "<<"
+bar_more_right = ">>"
+bar_more_up = "--"
+buffer_notify_default = all
+buffer_time_format = "%H:%M:%S"
+color_basic_force_bold = off
+color_inactive_buffer = off
+color_inactive_message = on
+color_inactive_prefix = on
+color_inactive_prefix_buffer = on
+color_inactive_time = off
+color_inactive_window = off
+color_pairs_auto_reset = 5
+color_real_white = off
+command_chars = ""
+confirm_quit = off
+day_change = on
+day_change_time_format = "%a, %d %b %Y"
+eat_newline_glitch = off
+highlight = ""
+highlight_regex = ""
+highlight_tags = ""
+hotlist_add_buffer_if_away = on
+hotlist_buffer_separator = ", "
+hotlist_count_max = 2
+hotlist_count_min_msg = 2
+hotlist_names_count = 3
+hotlist_names_length = 0
+hotlist_names_level = 12
+hotlist_names_merged_buffers = off
+hotlist_short_names = on
+hotlist_sort = group_time_asc
+hotlist_unique_numbers = on
+input_cursor_scroll = 20
+input_share = none
+input_share_overwrite = off
+input_undo_max = 32
+item_buffer_filter = "*"
+item_time_format = "%H:%M"
+jump_current_to_previous_buffer = on
+jump_previous_buffer_when_closing = on
+mouse = off
+mouse_timer_delay = 100
+nickmode = on
+nickmode_empty = off
+paste_bracketed = off
+paste_bracketed_timer_delay = 10
+paste_max_lines = 3
+prefix_action = " *"
+prefix_align = right
+prefix_align_max = 0
+prefix_align_min = 0
+prefix_align_more = "+"
+prefix_buffer_align = right
+prefix_buffer_align_max = 0
+prefix_buffer_align_more = "+"
+prefix_error = "=!="
+prefix_join = "-->"
+prefix_network = "--"
+prefix_quit = "<--"
+prefix_same_nick = ""
+prefix_suffix = "|"
+read_marker = line
+read_marker_always_show = off
+read_marker_string = "- "
+save_config_on_exit = on
+save_layout_on_exit = none
+scroll_amount = 3
+scroll_bottom_after_switch = off
+scroll_page_percent = 100
+search_text_not_found_alert = on
+separator_horizontal = "-"
+separator_vertical = ""
+set_title = on
+time_format = "%a, %d %b %Y %T"
+
+[palette]
+
+[color]
+bar_more = lightmagenta
+chat = default
+chat_bg = default
+chat_buffer = white
+chat_channel = white
+chat_delimiters = green
+chat_highlight = yellow
+chat_highlight_bg = magenta
+chat_host = cyan
+chat_inactive_buffer = darkgray
+chat_inactive_window = darkgray
+chat_nick = lightcyan
+chat_nick_colors = "cyan,magenta,green,brown,lightblue,default,lightcyan,lightmagenta,lightgreen,blue"
+chat_nick_other = cyan
+chat_nick_self = white
+chat_prefix_action = white
+chat_prefix_buffer = brown
+chat_prefix_buffer_inactive_buffer = darkgray
+chat_prefix_error = yellow
+chat_prefix_join = lightgreen
+chat_prefix_more = lightmagenta
+chat_prefix_network = magenta
+chat_prefix_quit = lightred
+chat_prefix_suffix = green
+chat_read_marker = magenta
+chat_read_marker_bg = default
+chat_server = brown
+chat_tags = red
+chat_text_found = yellow
+chat_text_found_bg = lightmagenta
+chat_time = default
+chat_time_delimiters = brown
+chat_value = cyan
+input_actions = lightgreen
+input_text_not_found = red
+nicklist_away = cyan
+nicklist_group = green
+nicklist_offline = blue
+separator = blue
+status_count_highlight = magenta
+status_count_msg = brown
+status_count_other = default
+status_count_private = green
+status_data_highlight = lightmagenta
+status_data_msg = yellow
+status_data_other = default
+status_data_private = lightgreen
+status_filter = green
+status_more = yellow
+status_name = white
+status_name_ssl = lightgreen
+status_number = yellow
+status_time = default
+
+[completion]
+base_word_until_cursor = on
+default_template = "%(nicks)|%(irc_channels)"
+nick_add_space = on
+nick_completer = ":"
+nick_first_only = off
+nick_ignore_chars = "[]`_-^"
+partial_completion_alert = on
+partial_completion_command = off
+partial_completion_command_arg = off
+partial_completion_count = on
+partial_completion_other = off
+
+[history]
+display_default = 5
+max_buffer_lines_minutes = 0
+max_buffer_lines_number = 4096
+max_commands = 100
+max_visited_buffers = 50
+
+[proxy]
+
+[network]
+connection_timeout = 60
+gnutls_ca_file = "/etc/ssl/certs/ca-certificates.crt"
+gnutls_handshake_timeout = 30
+
+[plugin]
+autoload = "*"
+debug = off
+extension = ".so"
+path = "%h/plugins"
+save_config_on_unload = on
+
+[bar]
+buffers.color_bg = default
+buffers.color_delim = default
+buffers.color_fg = default
+buffers.conditions = ""
+buffers.filling_left_right = vertical
+buffers.filling_top_bottom = horizontal
+buffers.hidden = off
+buffers.items = "buffers"
+buffers.position = left
+buffers.priority = 0
+buffers.separator = on
+buffers.size = 0
+buffers.size_max = 0
+buffers.type = root
+chanmon.color_bg = default
+chanmon.color_delim = cyan
+chanmon.color_fg = default
+chanmon.conditions = ""
+chanmon.filling_left_right = vertical
+chanmon.filling_top_bottom = vertical
+chanmon.hidden = off
+chanmon.items = "chanmon"
+chanmon.position = bottom
+chanmon.priority = 100
+chanmon.separator = on
+chanmon.size = 0
+chanmon.size_max = 0
+chanmon.type = root
+input.color_bg = default
+input.color_delim = cyan
+input.color_fg = default
+input.conditions = ""
+input.filling_left_right = vertical
+input.filling_top_bottom = horizontal
+input.hidden = off
+input.items = "[input_prompt]+(away),[input_search],[input_paste],input_text"
+input.position = bottom
+input.priority = 1000
+input.separator = off
+input.size = 1
+input.size_max = 0
+input.type = window
+isetbar.color_bg = default
+isetbar.color_delim = cyan
+isetbar.color_fg = default
+isetbar.conditions = ""
+isetbar.filling_left_right = vertical
+isetbar.filling_top_bottom = horizontal
+isetbar.hidden = on
+isetbar.items = "isetbar_help"
+isetbar.position = top
+isetbar.priority = 0
+isetbar.separator = on
+isetbar.size = 3
+isetbar.size_max = 3
+isetbar.type = window
+nicklist.color_bg = default
+nicklist.color_delim = cyan
+nicklist.color_fg = default
+nicklist.conditions = "nicklist"
+nicklist.filling_left_right = vertical
+nicklist.filling_top_bottom = columns_vertical
+nicklist.hidden = off
+nicklist.items = "buffer_nicklist"
+nicklist.position = right
+nicklist.priority = 200
+nicklist.separator = on
+nicklist.size = 0
+nicklist.size_max = 0
+nicklist.type = window
+status.color_bg = blue
+status.color_delim = cyan
+status.color_fg = default
+status.conditions = ""
+status.filling_left_right = vertical
+status.filling_top_bottom = horizontal
+status.hidden = off
+status.items = "[time],[buffer_count],[buffer_plugin],buffer_number+:+buffer_name+{buffer_nicklist_count}+buffer_filter,[lag],[hotlist],completion,scroll"
+status.position = bottom
+status.priority = 500
+status.separator = off
+status.size = 1
+status.size_max = 0
+status.type = window
+title.color_bg = blue
+title.color_delim = cyan
+title.color_fg = default
+title.conditions = ""
+title.filling_left_right = vertical
+title.filling_top_bottom = horizontal
+title.hidden = off
+title.items = "buffer_title"
+title.position = top
+title.priority = 500
+title.separator = off
+title.size = 1
+title.size_max = 0
+title.type = window
+
+[layout]
+
+[notify]
+
+[filter]
+
+[key]
+ctrl-? = "/input delete_previous_char"
+ctrl-A = "/input move_beginning_of_line"
+ctrl-B = "/input move_previous_char"
+ctrl-Cb = "/input insert \x02"
+ctrl-Cc = "/input insert \x03"
+ctrl-Ci = "/input insert \x1D"
+ctrl-Co = "/input insert \x0F"
+ctrl-Cr = "/input insert \x12"
+ctrl-Cu = "/input insert \x15"
+ctrl-D = "/input delete_next_char"
+ctrl-E = "/input move_end_of_line"
+ctrl-F = "/input move_next_char"
+ctrl-H = "/input delete_previous_char"
+ctrl-I = "/input complete_next"
+ctrl-J = "/input return"
+ctrl-K = "/input delete_end_of_line"
+ctrl-L = "/window refresh"
+ctrl-M = "/input return"
+ctrl-N = "/buffer +1"
+ctrl-P = "/buffer -1"
+ctrl-R = "/input search_text"
+ctrl-Sctrl-U = "/input set_unread"
+ctrl-T = "/input transpose_chars"
+ctrl-U = "/input delete_beginning_of_line"
+ctrl-W = "/input delete_previous_word"
+ctrl-X = "/input switch_active_buffer"
+ctrl-Y = "/input clipboard_paste"
+meta-meta2-1~ = "/window scroll_top"
+meta-meta2-23~ = "/bar scroll nicklist * b"
+meta-meta2-24~ = "/bar scroll nicklist * e"
+meta-meta2-4~ = "/window scroll_bottom"
+meta-meta2-5~ = "/window scroll_up"
+meta-meta2-6~ = "/window scroll_down"
+meta-meta2-7~ = "/window scroll_top"
+meta-meta2-8~ = "/window scroll_bottom"
+meta-meta2-A = "/buffer -1"
+meta-meta2-B = "/buffer +1"
+meta-meta2-C = "/buffer +1"
+meta-meta2-D = "/buffer -1"
+meta-0 = "/buffer *10"
+meta-1 = "/buffer *1"
+meta-2 = "/buffer *2"
+meta-3 = "/buffer *3"
+meta-4 = "/buffer *4"
+meta-5 = "/buffer *5"
+meta-6 = "/buffer *6"
+meta-7 = "/buffer *7"
+meta-8 = "/buffer *8"
+meta-9 = "/buffer *9"
+meta-< = "/input jump_previously_visited_buffer"
+meta-= = "/filter toggle"
+meta-> = "/input jump_next_visited_buffer"
+meta-OA = "/input history_global_previous"
+meta-OB = "/input history_global_next"
+meta-OC = "/input move_next_word"
+meta-OD = "/input move_previous_word"
+meta-OF = "/input move_end_of_line"
+meta-OH = "/input move_beginning_of_line"
+meta-Oa = "/input history_global_previous"
+meta-Ob = "/input history_global_next"
+meta-Oc = "/input move_next_word"
+meta-Od = "/input move_previous_word"
+meta2-15~ = "/buffer -1"
+meta2-17~ = "/buffer +1"
+meta2-18~ = "/window -1"
+meta2-19~ = "/window +1"
+meta2-1;3A = "/buffer -1"
+meta2-1;3B = "/buffer +1"
+meta2-1;3C = "/buffer +1"
+meta2-1;3D = "/buffer -1"
+meta2-1;5A = "/input history_global_previous"
+meta2-1;5B = "/input history_global_next"
+meta2-1~ = "/input move_beginning_of_line"
+meta2-20~ = "/bar scroll title * -30%"
+meta2-21~ = "/bar scroll title * +30%"
+meta2-23~ = "/bar scroll nicklist * -100%"
+meta2-24~ = "/bar scroll nicklist * +100%"
+meta2-3~ = "/input delete_next_char"
+meta2-4~ = "/input move_end_of_line"
+meta2-5;3~ = "/window scroll_up"
+meta2-5~ = "/window page_up"
+meta2-6;3~ = "/window scroll_down"
+meta2-6~ = "/window page_down"
+meta2-7~ = "/input move_beginning_of_line"
+meta2-8~ = "/input move_end_of_line"
+meta2-A = "/input history_previous"
+meta2-B = "/input history_next"
+meta2-C = "/input move_next_char"
+meta2-D = "/input move_previous_char"
+meta2-F = "/input move_end_of_line"
+meta2-G = "/window page_down"
+meta2-H = "/input move_beginning_of_line"
+meta2-I = "/window page_up"
+meta2-Z = "/input complete_previous"
+meta2-[E = "/buffer -1"
+meta-_ = "/input redo"
+meta-a = "/input jump_smart"
+meta-b = "/input move_previous_word"
+meta-d = "/input delete_next_word"
+meta-f = "/input move_next_word"
+meta-h = "/input hotlist_clear"
+meta-jmeta-l = "/input jump_last_buffer"
+meta-jmeta-r = "/server raw"
+meta-jmeta-s = "/server jump"
+meta-j01 = "/buffer 1"
+meta-j02 = "/buffer 2"
+meta-j03 = "/buffer 3"
+meta-j04 = "/buffer 4"
+meta-j05 = "/buffer 5"
+meta-j06 = "/buffer 6"
+meta-j07 = "/buffer 7"
+meta-j08 = "/buffer 8"
+meta-j09 = "/buffer 9"
+meta-j10 = "/buffer 10"
+meta-j11 = "/buffer 11"
+meta-j12 = "/buffer 12"
+meta-j13 = "/buffer 13"
+meta-j14 = "/buffer 14"
+meta-j15 = "/buffer 15"
+meta-j16 = "/buffer 16"
+meta-j17 = "/buffer 17"
+meta-j18 = "/buffer 18"
+meta-j19 = "/buffer 19"
+meta-j20 = "/buffer 20"
+meta-j21 = "/buffer 21"
+meta-j22 = "/buffer 22"
+meta-j23 = "/buffer 23"
+meta-j24 = "/buffer 24"
+meta-j25 = "/buffer 25"
+meta-j26 = "/buffer 26"
+meta-j27 = "/buffer 27"
+meta-j28 = "/buffer 28"
+meta-j29 = "/buffer 29"
+meta-j30 = "/buffer 30"
+meta-j31 = "/buffer 31"
+meta-j32 = "/buffer 32"
+meta-j33 = "/buffer 33"
+meta-j34 = "/buffer 34"
+meta-j35 = "/buffer 35"
+meta-j36 = "/buffer 36"
+meta-j37 = "/buffer 37"
+meta-j38 = "/buffer 38"
+meta-j39 = "/buffer 39"
+meta-j40 = "/buffer 40"
+meta-j41 = "/buffer 41"
+meta-j42 = "/buffer 42"
+meta-j43 = "/buffer 43"
+meta-j44 = "/buffer 44"
+meta-j45 = "/buffer 45"
+meta-j46 = "/buffer 46"
+meta-j47 = "/buffer 47"
+meta-j48 = "/buffer 48"
+meta-j49 = "/buffer 49"
+meta-j50 = "/buffer 50"
+meta-j51 = "/buffer 51"
+meta-j52 = "/buffer 52"
+meta-j53 = "/buffer 53"
+meta-j54 = "/buffer 54"
+meta-j55 = "/buffer 55"
+meta-j56 = "/buffer 56"
+meta-j57 = "/buffer 57"
+meta-j58 = "/buffer 58"
+meta-j59 = "/buffer 59"
+meta-j60 = "/buffer 60"
+meta-j61 = "/buffer 61"
+meta-j62 = "/buffer 62"
+meta-j63 = "/buffer 63"
+meta-j64 = "/buffer 64"
+meta-j65 = "/buffer 65"
+meta-j66 = "/buffer 66"
+meta-j67 = "/buffer 67"
+meta-j68 = "/buffer 68"
+meta-j69 = "/buffer 69"
+meta-j70 = "/buffer 70"
+meta-j71 = "/buffer 71"
+meta-j72 = "/buffer 72"
+meta-j73 = "/buffer 73"
+meta-j74 = "/buffer 74"
+meta-j75 = "/buffer 75"
+meta-j76 = "/buffer 76"
+meta-j77 = "/buffer 77"
+meta-j78 = "/buffer 78"
+meta-j79 = "/buffer 79"
+meta-j80 = "/buffer 80"
+meta-j81 = "/buffer 81"
+meta-j82 = "/buffer 82"
+meta-j83 = "/buffer 83"
+meta-j84 = "/buffer 84"
+meta-j85 = "/buffer 85"
+meta-j86 = "/buffer 86"
+meta-j87 = "/buffer 87"
+meta-j88 = "/buffer 88"
+meta-j89 = "/buffer 89"
+meta-j90 = "/buffer 90"
+meta-j91 = "/buffer 91"
+meta-j92 = "/buffer 92"
+meta-j93 = "/buffer 93"
+meta-j94 = "/buffer 94"
+meta-j95 = "/buffer 95"
+meta-j96 = "/buffer 96"
+meta-j97 = "/buffer 97"
+meta-j98 = "/buffer 98"
+meta-j99 = "/buffer 99"
+meta-k = "/input grab_key_command"
+meta-m = "/mouse toggle"
+meta-n = "/window scroll_next_highlight"
+meta-p = "/window scroll_previous_highlight"
+meta-r = "/input delete_line"
+meta-u = "/input scroll_unread"
+meta-wmeta-meta2-A = "/window up"
+meta-wmeta-meta2-B = "/window down"
+meta-wmeta-meta2-C = "/window right"
+meta-wmeta-meta2-D = "/window left"
+meta-wmeta2-1;3A = "/window up"
+meta-wmeta2-1;3B = "/window down"
+meta-wmeta2-1;3C = "/window right"
+meta-wmeta2-1;3D = "/window left"
+meta-wmeta-b = "/window balance"
+meta-wmeta-s = "/window swap"
+meta-z = "/window zoom"
+ctrl-_ = "/input undo"
+
+[key_search]
+ctrl-J = "/input search_stop"
+ctrl-M = "/input search_stop"
+ctrl-R = "/input search_switch_case"
+meta2-A = "/input search_previous"
+meta2-B = "/input search_next"
+
+[key_cursor]
+ctrl-J = "/cursor stop"
+ctrl-M = "/cursor stop"
+meta-meta2-A = "/cursor move area_up"
+meta-meta2-B = "/cursor move area_down"
+meta-meta2-C = "/cursor move area_right"
+meta-meta2-D = "/cursor move area_left"
+meta2-1;3A = "/cursor move area_up"
+meta2-1;3B = "/cursor move area_down"
+meta2-1;3C = "/cursor move area_right"
+meta2-1;3D = "/cursor move area_left"
+meta2-A = "/cursor move up"
+meta2-B = "/cursor move down"
+meta2-C = "/cursor move right"
+meta2-D = "/cursor move left"
+@item(buffer_nicklist):K = "/window ${_window_number};/kickban ${nick}"
+@item(buffer_nicklist):b = "/window ${_window_number};/ban ${nick}"
+@item(buffer_nicklist):k = "/window ${_window_number};/kick ${nick}"
+@item(buffer_nicklist):q = "/window ${_window_number};/query ${nick};/cursor stop"
+@item(buffer_nicklist):w = "/window ${_window_number};/whois ${nick}"
+@chat:Q = "hsignal:chat_quote_time_prefix_message;/cursor stop"
+@chat:m = "hsignal:chat_quote_message;/cursor stop"
+@chat:q = "hsignal:chat_quote_prefix_message;/cursor stop"
+
+[key_mouse]
+@bar(input):button2 = "/input grab_mouse_area"
+@bar(nicklist):button1-gesture-down = "/bar scroll nicklist ${_window_number} +100%"
+@bar(nicklist):button1-gesture-down-long = "/bar scroll nicklist ${_window_number} e"
+@bar(nicklist):button1-gesture-up = "/bar scroll nicklist ${_window_number} -100%"
+@bar(nicklist):button1-gesture-up-long = "/bar scroll nicklist ${_window_number} b"
+@chat(perl.iset):button1 = "hsignal:iset_mouse"
+@chat(perl.iset):button2* = "hsignal:iset_mouse"
+@chat(perl.iset):wheeldown = "/repeat 5 /iset **down"
+@chat(perl.iset):wheelup = "/repeat 5 /iset **up"
+@item(buffer_nicklist):button1 = "/window ${_window_number};/query ${nick}"
+@item(buffer_nicklist):button1-gesture-left = "/window ${_window_number};/kick ${nick}"
+@item(buffer_nicklist):button1-gesture-left-long = "/window ${_window_number};/kickban ${nick}"
+@item(buffer_nicklist):button2 = "/window ${_window_number};/whois ${nick}"
+@item(buffer_nicklist):button2-gesture-left = "/window ${_window_number};/ban ${nick}"
+@item(buffers):button1* = "hsignal:buffers_mouse"
+@item(buffers):button2 = "hsignal:buffers_mouse"
+@bar:wheeldown = "/bar scroll ${_bar_name} ${_window_number} +20%"
+@bar:wheelup = "/bar scroll ${_bar_name} ${_window_number} -20%"
+@chat:button1 = "/window ${_window_number}"
+@chat:button1-gesture-left = "/window ${_window_number};/buffer -1"
+@chat:button1-gesture-left-long = "/window ${_window_number};/buffer 1"
+@chat:button1-gesture-right = "/window ${_window_number};/buffer +1"
+@chat:button1-gesture-right-long = "/window ${_window_number};/input jump_last_buffer"
+@chat:wheeldown = "/window scroll_down -window ${_window_number}"
+@chat:wheelup = "/window scroll_up -window ${_window_number}"
+@*:button3 = "/cursor go ${_x},${_y}"
--- /dev/null
+[2012-07-26 09:25:30] weechat 0.3.8 (compiled on Jun 21 2012 18:16:51)
+[2012-07-26 09:25:30] Reading configuration file weechat.conf
+[2012-07-26 09:25:30] Reading configuration file plugins.conf
+[2012-07-26 09:25:30] Reading configuration file alias.conf
+[2012-07-26 09:25:30] Reading configuration file aspell.conf
+[2012-07-26 09:25:30] Reading configuration file irc.conf
+[2012-07-26 09:25:30] Reading configuration file logger.conf
+[2012-07-26 09:25:31] Reading configuration file buffers.conf
+[2012-07-26 09:25:31] Reading configuration file iset.conf
+[2012-07-26 09:25:32] Reading configuration file wg.conf
+[2012-07-26 09:25:32] Reading configuration file relay.conf
+[2012-07-26 09:25:32] Reading configuration file rmodifier.conf
+[2012-07-26 09:25:32] Reading configuration file xfer.conf
+[2012-07-26 09:27:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-26 09:28:18] irc: connecting to server chat.freenode.net/6667...
+[2012-07-26 22:37:03] irc: connecting to server chat.freenode.net/6667...
+[2012-07-26 22:37:23] irc: connecting to server chat.freenode.net/6667...
+[2012-07-26 22:37:49] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-26 22:38:03] irc: connecting to server chat.freenode.net/6667...
+[2012-07-26 22:38:09] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-26 22:38:49] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-26 22:39:23] irc: connecting to server chat.freenode.net/6667...
+[2012-07-26 22:40:09] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-26 22:42:03] irc: connecting to server chat.freenode.net/6667...
+[2012-07-26 22:42:49] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-26 22:47:23] irc: connecting to server chat.freenode.net/6667...
+[2012-07-26 22:48:09] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-26 22:58:03] irc: connecting to server chat.freenode.net/6667...
+[2012-07-26 22:58:49] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-26 23:19:23] irc: connecting to server chat.freenode.net/6667...
+[2012-07-26 23:20:09] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-27 08:35:38] irc: connecting to server chat.freenode.net/6667...
+[2012-07-27 08:35:38] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-27 09:05:38] irc: connecting to server chat.freenode.net/6667...
+[2012-07-27 09:05:38] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-27 23:14:13] irc: connecting to server chat.freenode.net/6667...
+[2012-07-27 23:14:33] irc: connecting to server chat.freenode.net/6667...
+[2012-07-27 23:15:14] irc: connecting to server chat.freenode.net/6667...
+[2012-07-27 23:16:34] irc: connecting to server chat.freenode.net/6667...
+[2012-07-27 23:17:23] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-27 23:17:43] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-27 23:18:23] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-27 23:19:14] irc: connecting to server chat.freenode.net/6667...
+[2012-07-27 23:19:43] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-27 23:22:23] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-27 23:24:34] irc: connecting to server chat.freenode.net/6667...
+[2012-07-27 23:27:43] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-27 23:35:14] irc: connecting to server chat.freenode.net/6667...
+[2012-07-27 23:38:23] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-27 23:56:34] irc: connecting to server chat.freenode.net/6667...
+[2012-07-27 23:59:43] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-28 00:26:34] irc: connecting to server chat.freenode.net/6667...
+[2012-07-28 00:29:43] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-28 00:56:34] irc: connecting to server chat.freenode.net/6667...
+[2012-07-28 00:59:43] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-28 01:26:34] irc: connecting to server chat.freenode.net/6667...
+[2012-07-28 01:29:43] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-28 01:56:34] irc: connecting to server chat.freenode.net/6667...
+[2012-07-28 01:59:43] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-28 02:26:34] irc: connecting to server chat.freenode.net/6667...
+[2012-07-28 02:29:43] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-28 02:56:34] irc: connecting to server chat.freenode.net/6667...
+[2012-07-28 02:59:43] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-28 10:02:53] irc: connecting to server chat.freenode.net/6667...
+[2012-07-28 10:02:53] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-28 10:32:53] irc: connecting to server chat.freenode.net/6667...
+[2012-07-28 10:32:53] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-28 21:39:50] irc: connecting to server chat.freenode.net/6667...
+[2012-07-28 21:39:50] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-28 23:35:07] irc: connecting to server chat.freenode.net/6667...
+[2012-07-28 23:35:07] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-29 00:05:07] irc: connecting to server chat.freenode.net/6667...
+[2012-07-29 00:05:07] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-29 00:35:07] irc: connecting to server chat.freenode.net/6667...
+[2012-07-29 00:35:07] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-29 01:05:07] irc: connecting to server chat.freenode.net/6667...
+[2012-07-29 01:05:07] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-29 01:35:07] irc: connecting to server chat.freenode.net/6667...
+[2012-07-29 01:35:07] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-29 11:11:19] irc: connecting to server chat.freenode.net/6667...
+[2012-07-29 11:11:19] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-29 11:41:19] irc: connecting to server chat.freenode.net/6667...
+[2012-07-29 11:41:19] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-29 23:20:57] irc: connecting to server chat.freenode.net/6667...
+[2012-07-29 23:20:57] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-29 23:50:57] irc: connecting to server chat.freenode.net/6667...
+[2012-07-29 23:50:57] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-30 08:40:19] irc: connecting to server chat.freenode.net/6667...
+[2012-07-30 08:40:19] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-30 09:10:19] irc: connecting to server chat.freenode.net/6667...
+[2012-07-30 09:10:19] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-31 08:40:33] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-31 08:43:30] irc: connecting to server chat.freenode.net/6667...
+[2012-07-31 20:19:20] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-31 20:19:40] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-07-31 20:20:20] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-01 08:45:15] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-01 08:45:53] irc: connecting to server chat.freenode.net/6667...
+[2012-08-01 08:47:55] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-01 09:05:31] irc: connecting to server chat.freenode.net/6667...
+[2012-08-01 09:05:34] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-01 09:05:38] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-01 20:42:49] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-01 20:43:10] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-01 21:16:07] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-01 21:17:29] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-01 21:18:40] irc: connecting to server chat.freenode.net/6667...
+[2012-08-01 21:19:00] irc: connecting to server chat.freenode.net/6667...
+[2012-08-01 21:19:40] irc: connecting to server chat.freenode.net/6667...
+[2012-08-01 21:20:09] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-01 21:21:00] irc: connecting to server chat.freenode.net/6667...
+[2012-08-01 21:23:40] irc: connecting to server chat.freenode.net/6667...
+[2012-08-01 21:25:29] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-01 21:39:37] irc: connecting to server chat.freenode.net/6667...
+[2012-08-01 21:39:37] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-01 21:50:17] irc: connecting to server chat.freenode.net/6667...
+[2012-08-01 22:00:57] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-01 22:11:37] irc: connecting to server chat.freenode.net/6667...
+[2012-08-01 22:30:57] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-01 22:41:37] irc: connecting to server chat.freenode.net/6667...
+[2012-08-01 23:00:57] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-01 23:11:37] irc: connecting to server chat.freenode.net/6667...
+[2012-08-01 23:30:57] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-01 23:41:37] irc: connecting to server chat.freenode.net/6667...
+[2012-08-02 08:40:31] irc: connecting to server chat.freenode.net/6667...
+[2012-08-02 08:40:31] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-02 09:10:31] irc: connecting to server chat.freenode.net/6667...
+[2012-08-02 09:10:31] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-02 19:02:16] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-02 19:02:21] irc: connecting to server chat.freenode.net/6667...
+[2012-08-02 19:02:36] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-02 19:02:41] irc: connecting to server chat.freenode.net/6667...
+[2012-08-02 19:03:16] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-02 19:03:21] irc: connecting to server chat.freenode.net/6667...
+[2012-08-02 19:04:36] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-02 19:04:41] irc: connecting to server chat.freenode.net/6667...
+[2012-08-02 19:07:16] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-02 19:07:21] irc: connecting to server chat.freenode.net/6667...
+[2012-08-02 19:12:36] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-02 19:12:41] irc: connecting to server chat.freenode.net/6667...
+[2012-08-02 19:23:16] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-02 19:23:21] irc: connecting to server chat.freenode.net/6667...
+[2012-08-02 19:44:36] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-02 19:44:41] irc: connecting to server chat.freenode.net/6667...
+[2012-08-02 20:14:36] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-02 20:14:41] irc: connecting to server chat.freenode.net/6667...
+[2012-08-03 05:59:39] irc: connecting to server chat.freenode.net/6667...
+[2012-08-03 05:59:39] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-03 08:33:53] irc: connecting to server chat.freenode.net/6667...
+[2012-08-03 08:33:53] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-03 09:03:53] irc: connecting to server chat.freenode.net/6667...
+[2012-08-03 09:03:53] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-03 19:12:15] irc: connecting to server chat.freenode.net/6667...
+[2012-08-03 19:12:35] irc: connecting to server chat.freenode.net/6667...
+[2012-08-03 19:13:15] irc: connecting to server chat.freenode.net/6667...
+[2012-08-03 19:13:39] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-03 19:13:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-03 19:14:35] irc: connecting to server chat.freenode.net/6667...
+[2012-08-03 19:14:39] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-03 19:15:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-03 19:17:15] irc: connecting to server chat.freenode.net/6667...
+[2012-08-03 19:18:39] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-03 19:22:48] irc: connecting to server chat.freenode.net/6667...
+[2012-08-03 19:23:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-03 19:33:28] irc: connecting to server chat.freenode.net/6667...
+[2012-08-03 19:34:39] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-03 19:54:48] irc: connecting to server chat.freenode.net/6667...
+[2012-08-03 19:55:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-03 20:24:48] irc: connecting to server chat.freenode.net/6667...
+[2012-08-03 20:25:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-03 20:54:48] irc: connecting to server chat.freenode.net/6667...
+[2012-08-03 20:55:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-03 22:32:51] irc: connecting to server chat.freenode.net/6667...
+[2012-08-03 22:32:51] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-04 09:59:52] irc: connecting to server chat.freenode.net/6667...
+[2012-08-04 09:59:52] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-04 10:29:52] irc: connecting to server chat.freenode.net/6667...
+[2012-08-04 10:29:52] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-04 10:59:52] irc: connecting to server chat.freenode.net/6667...
+[2012-08-04 10:59:52] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-04 11:29:52] irc: connecting to server chat.freenode.net/6667...
+[2012-08-04 11:29:52] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-04 11:59:52] irc: connecting to server chat.freenode.net/6667...
+[2012-08-04 11:59:52] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-04 12:29:52] irc: connecting to server chat.freenode.net/6667...
+[2012-08-04 12:29:52] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-04 13:04:08] irc: connecting to server chat.freenode.net/6667...
+[2012-08-04 13:04:08] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-04 13:34:08] irc: connecting to server chat.freenode.net/6667...
+[2012-08-04 13:34:08] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-04 19:37:58] irc: connecting to server chat.freenode.net/6667...
+[2012-08-04 19:37:58] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-04 20:30:27] irc: connecting to server chat.freenode.net/6667...
+[2012-08-04 20:30:27] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-05 18:32:27] irc: connecting to server chat.freenode.net/6667...
+[2012-08-05 18:32:27] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-06 00:04:12] irc: connecting to server chat.freenode.net/6667...
+[2012-08-06 00:04:12] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-06 08:55:44] irc: connecting to server chat.freenode.net/6667...
+[2012-08-06 08:55:44] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-06 09:26:21] irc: connecting to server chat.freenode.net/6667...
+[2012-08-06 09:26:22] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-06 09:56:23] irc: connecting to server chat.freenode.net/6667...
+[2012-08-06 09:56:23] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-06 13:43:18] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-06 13:44:29] irc: connecting to server chat.freenode.net/6667...
+[2012-08-06 18:59:10] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-06 18:59:30] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-06 18:59:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-06 19:00:10] irc: connecting to server chat.freenode.net/6667...
+[2012-08-06 19:00:10] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-06 19:00:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-06 19:01:30] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-06 19:02:10] irc: connecting to server chat.freenode.net/6667...
+[2012-08-06 19:04:10] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-06 19:04:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-06 19:09:30] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-06 19:10:10] irc: connecting to server chat.freenode.net/6667...
+[2012-08-06 19:20:10] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-06 19:20:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-06 22:11:43] irc: connecting to server chat.freenode.net/6667...
+[2012-08-06 22:11:43] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-06 22:41:43] irc: connecting to server chat.freenode.net/6667...
+[2012-08-06 22:41:43] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-06 23:11:43] irc: connecting to server chat.freenode.net/6667...
+[2012-08-06 23:11:43] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-06 23:41:43] irc: connecting to server chat.freenode.net/6667...
+[2012-08-06 23:41:43] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-07 00:11:43] irc: connecting to server chat.freenode.net/6667...
+[2012-08-07 00:11:43] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-07 00:41:43] irc: connecting to server chat.freenode.net/6667...
+[2012-08-07 00:41:43] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-07 08:45:18] irc: connecting to server chat.freenode.net/6667...
+[2012-08-07 08:45:18] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-07 09:09:23] irc: connecting to server chat.freenode.net/6667...
+[2012-08-07 09:15:18] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-07 19:03:32] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-07 19:06:09] irc: connecting to server chat.freenode.net/6667...
+[2012-08-07 19:20:16] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-07 19:20:36] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-07 19:21:16] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-07 19:21:31] irc: connecting to server chat.freenode.net/6667...
+[2012-08-07 19:21:51] irc: connecting to server chat.freenode.net/6667...
+[2012-08-07 19:22:31] irc: connecting to server chat.freenode.net/6667...
+[2012-08-07 19:22:36] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-07 19:23:51] irc: connecting to server chat.freenode.net/6667...
+[2012-08-07 19:25:16] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-07 19:26:31] irc: connecting to server chat.freenode.net/6667...
+[2012-08-07 19:30:36] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-07 19:31:51] irc: connecting to server chat.freenode.net/6667...
+[2012-08-07 19:41:16] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-07 19:42:31] irc: connecting to server chat.freenode.net/6667...
+[2012-08-07 20:02:36] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-07 20:03:51] irc: connecting to server chat.freenode.net/6667...
+[2012-08-07 20:32:36] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-07 20:33:51] irc: connecting to server chat.freenode.net/6667...
+[2012-08-07 21:02:36] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-07 21:03:51] irc: connecting to server chat.freenode.net/6667...
+[2012-08-07 21:32:36] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-07 21:33:51] irc: connecting to server chat.freenode.net/6667...
+[2012-08-07 22:02:36] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-07 22:03:51] irc: connecting to server chat.freenode.net/6667...
+[2012-08-07 22:32:36] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-07 22:33:51] irc: connecting to server chat.freenode.net/6667...
+[2012-08-07 23:02:36] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-07 23:03:51] irc: connecting to server chat.freenode.net/6667...
+[2012-08-07 23:32:36] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-07 23:33:51] irc: connecting to server chat.freenode.net/6667...
+[2012-08-08 07:41:16] irc: connecting to server chat.freenode.net/6667...
+[2012-08-08 07:41:16] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-08 08:48:04] irc: connecting to server chat.freenode.net/6667...
+[2012-08-08 08:48:04] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-08 09:18:04] irc: connecting to server chat.freenode.net/6667...
+[2012-08-08 09:18:04] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-08 20:48:53] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-08 20:49:15] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-08 20:49:31] irc: connecting to server chat.freenode.net/6667...
+[2012-08-08 20:49:51] irc: connecting to server chat.freenode.net/6667...
+[2012-08-08 20:49:55] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-08 20:50:31] irc: connecting to server chat.freenode.net/6667...
+[2012-08-08 20:51:15] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-08 20:51:51] irc: connecting to server chat.freenode.net/6667...
+[2012-08-08 20:53:55] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-08 20:54:31] irc: connecting to server chat.freenode.net/6667...
+[2012-08-08 20:59:15] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-08 20:59:51] irc: connecting to server chat.freenode.net/6667...
+[2012-08-08 21:09:55] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-08 21:10:31] irc: connecting to server chat.freenode.net/6667...
+[2012-08-08 21:31:15] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-08 21:31:51] irc: connecting to server chat.freenode.net/6667...
+[2012-08-08 22:01:15] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-08 22:01:51] irc: connecting to server chat.freenode.net/6667...
+[2012-08-09 08:54:59] irc: connecting to server chat.freenode.net/6667...
+[2012-08-09 08:54:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-09 09:24:59] irc: connecting to server chat.freenode.net/6667...
+[2012-08-09 09:24:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-09 18:48:22] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-09 18:48:29] irc: connecting to server chat.freenode.net/6667...
+[2012-08-09 18:48:42] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-09 18:48:49] irc: connecting to server chat.freenode.net/6667...
+[2012-08-09 18:49:22] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-09 18:49:29] irc: connecting to server chat.freenode.net/6667...
+[2012-08-09 18:50:42] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-09 18:50:49] irc: connecting to server chat.freenode.net/6667...
+[2012-08-09 18:53:22] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-09 18:53:29] irc: connecting to server chat.freenode.net/6667...
+[2012-08-09 20:21:43] irc: connecting to server chat.freenode.net/6667...
+[2012-08-09 20:21:43] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-09 20:32:23] irc: connecting to server chat.freenode.net/6667...
+[2012-08-09 20:32:23] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-09 20:50:08] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-09 20:50:20] irc: connecting to server chat.freenode.net/6667...
+[2012-08-09 20:50:30] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-09 20:50:40] irc: connecting to server chat.freenode.net/6667...
+[2012-08-09 20:51:10] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-09 20:51:20] irc: connecting to server chat.freenode.net/6667...
+[2012-08-09 20:52:30] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-09 20:52:40] irc: connecting to server chat.freenode.net/6667...
+[2012-08-09 20:55:10] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-09 20:55:20] irc: connecting to server chat.freenode.net/6667...
+[2012-08-09 21:00:30] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-09 21:00:40] irc: connecting to server chat.freenode.net/6667...
+[2012-08-09 21:11:10] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-09 21:11:20] irc: connecting to server chat.freenode.net/6667...
+[2012-08-09 21:32:30] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-09 21:32:40] irc: connecting to server chat.freenode.net/6667...
+[2012-08-09 22:02:32] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-09 22:02:40] irc: connecting to server chat.freenode.net/6667...
+[2012-08-09 22:32:32] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-09 22:32:40] irc: connecting to server chat.freenode.net/6667...
+[2012-08-09 23:02:32] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-09 23:02:40] irc: connecting to server chat.freenode.net/6667...
+[2012-08-09 23:32:32] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-09 23:32:40] irc: connecting to server chat.freenode.net/6667...
+[2012-08-10 08:38:30] irc: connecting to server chat.freenode.net/6667...
+[2012-08-10 08:38:30] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-10 09:08:30] irc: connecting to server chat.freenode.net/6667...
+[2012-08-10 09:08:30] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-10 20:29:03] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-10 20:29:19] irc: connecting to server chat.freenode.net/6667...
+[2012-08-10 20:29:23] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-10 20:29:39] irc: connecting to server chat.freenode.net/6667...
+[2012-08-10 20:30:03] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-10 20:30:19] irc: connecting to server chat.freenode.net/6667...
+[2012-08-10 20:31:23] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-10 20:31:39] irc: connecting to server chat.freenode.net/6667...
+[2012-08-10 20:34:03] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-10 20:34:19] irc: connecting to server chat.freenode.net/6667...
+[2012-08-10 20:39:23] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-10 20:39:39] irc: connecting to server chat.freenode.net/6667...
+[2012-08-10 21:48:14] irc: connecting to server chat.freenode.net/6667...
+[2012-08-10 21:48:14] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-10 22:09:34] irc: connecting to server chat.freenode.net/6667...
+[2012-08-10 22:09:34] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-10 22:39:34] irc: connecting to server chat.freenode.net/6667...
+[2012-08-10 22:39:34] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-10 23:09:34] irc: connecting to server chat.freenode.net/6667...
+[2012-08-10 23:09:34] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-10 23:39:34] irc: connecting to server chat.freenode.net/6667...
+[2012-08-10 23:39:34] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-11 00:21:45] irc: connecting to server chat.freenode.net/6667...
+[2012-08-11 00:21:45] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-11 01:22:15] irc: connecting to server chat.freenode.net/6667...
+[2012-08-11 01:22:15] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-11 10:21:57] irc: connecting to server chat.freenode.net/6667...
+[2012-08-11 10:21:57] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-11 10:51:57] irc: connecting to server chat.freenode.net/6667...
+[2012-08-11 10:51:57] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-11 11:21:57] irc: connecting to server chat.freenode.net/6667...
+[2012-08-11 11:21:57] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-11 11:51:57] irc: connecting to server chat.freenode.net/6667...
+[2012-08-11 11:51:57] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-11 12:21:57] irc: connecting to server chat.freenode.net/6667...
+[2012-08-11 12:21:57] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-11 12:51:57] irc: connecting to server chat.freenode.net/6667...
+[2012-08-11 12:51:57] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-11 13:21:57] irc: connecting to server chat.freenode.net/6667...
+[2012-08-11 13:21:57] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-11 13:51:57] irc: connecting to server chat.freenode.net/6667...
+[2012-08-11 13:51:57] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-11 22:58:08] irc: connecting to server chat.freenode.net/6667...
+[2012-08-11 22:58:08] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-11 23:28:08] irc: connecting to server chat.freenode.net/6667...
+[2012-08-11 23:28:08] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-11 23:58:08] irc: connecting to server chat.freenode.net/6667...
+[2012-08-11 23:58:08] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-12 00:28:08] irc: connecting to server chat.freenode.net/6667...
+[2012-08-12 00:28:08] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-12 00:58:08] irc: connecting to server chat.freenode.net/6667...
+[2012-08-12 00:58:08] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-12 01:28:08] irc: connecting to server chat.freenode.net/6667...
+[2012-08-12 01:28:08] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-12 16:27:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-12 16:27:50] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-12 16:57:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-12 16:57:50] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-12 17:27:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-12 17:27:50] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-12 17:57:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-12 17:57:50] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-12 18:27:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-12 18:27:50] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-12 18:57:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-12 18:57:50] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-12 19:27:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-12 19:27:50] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-12 19:57:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-12 19:57:50] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-12 20:27:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-12 20:27:50] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-12 20:57:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-12 20:57:50] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-12 21:27:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-12 21:27:50] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-12 21:57:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-12 21:57:50] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-12 22:27:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-12 22:27:50] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-12 22:57:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-12 22:57:50] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-12 23:27:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-12 23:27:50] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-12 23:57:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-12 23:57:50] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-13 08:35:39] irc: connecting to server chat.freenode.net/6667...
+[2012-08-13 08:35:39] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-13 09:05:39] irc: connecting to server chat.freenode.net/6667...
+[2012-08-13 09:05:39] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-13 13:38:46] irc: connecting to server chat.freenode.net/6667...
+[2012-08-13 13:38:53] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-13 13:39:36] irc: connecting to server chat.freenode.net/6667...
+[2012-08-13 13:39:43] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-13 18:52:31] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-13 18:52:51] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-13 18:53:31] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-13 18:53:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-13 18:54:10] irc: connecting to server chat.freenode.net/6667...
+[2012-08-13 18:54:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-13 18:54:51] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-13 18:56:10] irc: connecting to server chat.freenode.net/6667...
+[2012-08-13 18:57:31] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-13 18:58:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-13 19:02:51] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-13 19:04:10] irc: connecting to server chat.freenode.net/6667...
+[2012-08-13 20:34:13] irc: connecting to server chat.freenode.net/6667...
+[2012-08-13 20:34:13] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-13 21:31:18] irc: connecting to server chat.freenode.net/6667...
+[2012-08-13 21:31:18] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-13 22:01:18] irc: connecting to server chat.freenode.net/6667...
+[2012-08-13 22:01:18] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-13 22:31:18] irc: connecting to server chat.freenode.net/6667...
+[2012-08-13 22:31:18] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-13 23:01:18] irc: connecting to server chat.freenode.net/6667...
+[2012-08-13 23:01:18] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-13 23:31:18] irc: connecting to server chat.freenode.net/6667...
+[2012-08-13 23:31:18] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-14 08:37:31] irc: connecting to server chat.freenode.net/6667...
+[2012-08-14 08:37:31] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-14 09:07:31] irc: connecting to server chat.freenode.net/6667...
+[2012-08-14 09:07:31] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-14 19:00:02] irc: connecting to server chat.freenode.net/6667...
+[2012-08-14 19:00:22] irc: connecting to server chat.freenode.net/6667...
+[2012-08-14 19:00:33] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-14 19:00:53] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-14 19:01:02] irc: connecting to server chat.freenode.net/6667...
+[2012-08-14 19:01:33] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-14 19:02:22] irc: connecting to server chat.freenode.net/6667...
+[2012-08-14 19:02:53] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-14 19:05:02] irc: connecting to server chat.freenode.net/6667...
+[2012-08-14 19:05:33] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-14 19:10:22] irc: connecting to server chat.freenode.net/6667...
+[2012-08-14 19:10:53] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-14 19:21:02] irc: connecting to server chat.freenode.net/6667...
+[2012-08-14 19:21:33] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-14 19:42:22] irc: connecting to server chat.freenode.net/6667...
+[2012-08-14 19:42:53] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-14 20:12:22] irc: connecting to server chat.freenode.net/6667...
+[2012-08-14 20:12:53] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-14 20:42:23] irc: connecting to server chat.freenode.net/6667...
+[2012-08-14 20:42:53] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-14 21:12:23] irc: connecting to server chat.freenode.net/6667...
+[2012-08-14 22:12:37] irc: connecting to server chat.freenode.net/6667...
+[2012-08-14 22:12:37] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-15 08:45:37] irc: connecting to server chat.freenode.net/6667...
+[2012-08-15 08:45:37] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-15 09:15:37] irc: connecting to server chat.freenode.net/6667...
+[2012-08-15 09:15:37] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-15 19:06:47] irc: connecting to server chat.freenode.net/6667...
+[2012-08-15 19:06:48] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-15 19:07:07] irc: connecting to server chat.freenode.net/6667...
+[2012-08-15 19:07:08] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-15 19:07:47] irc: connecting to server chat.freenode.net/6667...
+[2012-08-15 19:07:48] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-15 19:09:07] irc: connecting to server chat.freenode.net/6667...
+[2012-08-15 19:09:08] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-15 19:11:47] irc: connecting to server chat.freenode.net/6667...
+[2012-08-15 19:11:48] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-15 19:17:07] irc: connecting to server chat.freenode.net/6667...
+[2012-08-15 19:17:08] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-15 19:27:47] irc: connecting to server chat.freenode.net/6667...
+[2012-08-15 19:27:48] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-15 20:33:38] irc: connecting to server chat.freenode.net/6667...
+[2012-08-15 20:33:38] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-15 21:03:38] irc: connecting to server chat.freenode.net/6667...
+[2012-08-15 21:03:38] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-15 21:33:38] irc: connecting to server chat.freenode.net/6667...
+[2012-08-15 21:33:38] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-15 22:03:38] irc: connecting to server chat.freenode.net/6667...
+[2012-08-15 22:03:38] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-15 22:36:04] irc: connecting to server chat.freenode.net/6667...
+[2012-08-15 22:36:04] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-15 23:06:04] irc: connecting to server chat.freenode.net/6667...
+[2012-08-15 23:06:04] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-15 23:36:04] irc: connecting to server chat.freenode.net/6667...
+[2012-08-15 23:36:04] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-16 00:06:04] irc: connecting to server chat.freenode.net/6667...
+[2012-08-16 00:06:04] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-16 00:36:04] irc: connecting to server chat.freenode.net/6667...
+[2012-08-16 00:36:04] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-16 01:06:04] irc: connecting to server chat.freenode.net/6667...
+[2012-08-16 01:06:04] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-16 08:35:38] irc: connecting to server chat.freenode.net/6667...
+[2012-08-16 08:35:38] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-16 09:05:38] irc: connecting to server chat.freenode.net/6667...
+[2012-08-16 09:05:38] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-16 20:03:48] irc: connecting to server chat.freenode.net/6667...
+[2012-08-16 20:04:08] irc: connecting to server chat.freenode.net/6667...
+[2012-08-16 20:04:48] irc: connecting to server chat.freenode.net/6667...
+[2012-08-16 20:05:24] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-16 20:05:44] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-16 20:06:08] irc: connecting to server chat.freenode.net/6667...
+[2012-08-16 20:06:24] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-16 20:07:44] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-16 20:08:48] irc: connecting to server chat.freenode.net/6667...
+[2012-08-16 20:10:24] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-16 20:14:08] irc: connecting to server chat.freenode.net/6667...
+[2012-08-16 20:15:44] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-16 20:24:48] irc: connecting to server chat.freenode.net/6667...
+[2012-08-16 20:26:24] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-16 20:46:08] irc: connecting to server chat.freenode.net/6667...
+[2012-08-16 20:47:44] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-16 21:26:29] irc: connecting to server chat.freenode.net/6667...
+[2012-08-16 21:26:29] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-16 21:56:29] irc: connecting to server chat.freenode.net/6667...
+[2012-08-16 21:56:29] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-16 22:26:29] irc: connecting to server chat.freenode.net/6667...
+[2012-08-16 22:26:29] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-17 09:01:08] irc: connecting to server chat.freenode.net/6667...
+[2012-08-17 09:01:08] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-17 09:07:39] irc: connecting to server chat.freenode.net/6667...
+[2012-08-17 09:31:08] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-17 20:29:21] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-17 20:29:42] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-17 20:30:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-17 20:30:22] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-17 20:30:25] irc: connecting to server chat.freenode.net/6667...
+[2012-08-17 20:31:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-17 20:31:42] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-17 20:32:25] irc: connecting to server chat.freenode.net/6667...
+[2012-08-17 20:34:22] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-17 20:35:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-17 20:39:42] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-17 20:40:25] irc: connecting to server chat.freenode.net/6667...
+[2012-08-17 20:50:22] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-17 20:51:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-17 21:21:00] irc: connecting to server chat.freenode.net/6667...
+[2012-08-17 21:21:00] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-17 22:16:16] irc: connecting to server chat.freenode.net/6667...
+[2012-08-17 22:16:16] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-17 22:50:49] irc: connecting to server chat.freenode.net/6667...
+[2012-08-17 22:50:49] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-17 23:20:49] irc: connecting to server chat.freenode.net/6667...
+[2012-08-17 23:20:49] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-17 23:50:49] irc: connecting to server chat.freenode.net/6667...
+[2012-08-17 23:50:49] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-18 11:58:01] irc: connecting to server chat.freenode.net/6667...
+[2012-08-18 11:58:01] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-18 17:14:46] irc: connecting to server chat.freenode.net/6667...
+[2012-08-18 17:14:46] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-19 15:04:03] irc: connecting to server chat.freenode.net/6667...
+[2012-08-19 15:04:03] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-19 15:34:03] irc: connecting to server chat.freenode.net/6667...
+[2012-08-19 15:34:03] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-19 16:04:03] irc: connecting to server chat.freenode.net/6667...
+[2012-08-19 16:04:03] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-19 16:34:03] irc: connecting to server chat.freenode.net/6667...
+[2012-08-19 16:34:03] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-19 17:06:38] irc: connecting to server chat.freenode.net/6667...
+[2012-08-19 17:06:38] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-19 17:36:38] irc: connecting to server chat.freenode.net/6667...
+[2012-08-19 17:36:38] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-19 18:06:38] irc: connecting to server chat.freenode.net/6667...
+[2012-08-19 18:06:38] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-19 18:36:38] irc: connecting to server chat.freenode.net/6667...
+[2012-08-19 18:36:38] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-19 19:06:38] irc: connecting to server chat.freenode.net/6667...
+[2012-08-19 19:06:38] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-19 19:36:38] irc: connecting to server chat.freenode.net/6667...
+[2012-08-19 19:36:38] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-19 20:06:38] irc: connecting to server chat.freenode.net/6667...
+[2012-08-19 20:06:38] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-19 20:36:38] irc: connecting to server chat.freenode.net/6667...
+[2012-08-19 20:36:38] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-19 23:13:58] irc: connecting to server chat.freenode.net/6667...
+[2012-08-19 23:13:58] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-19 23:44:31] irc: connecting to server chat.freenode.net/6667...
+[2012-08-19 23:44:31] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-20 00:14:31] irc: connecting to server chat.freenode.net/6667...
+[2012-08-20 00:14:31] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-20 00:44:31] irc: connecting to server chat.freenode.net/6667...
+[2012-08-20 00:44:31] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-20 01:14:31] irc: connecting to server chat.freenode.net/6667...
+[2012-08-20 01:14:31] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-20 08:46:45] irc: connecting to server chat.freenode.net/6667...
+[2012-08-20 08:46:47] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-20 09:16:47] irc: connecting to server chat.freenode.net/6667...
+[2012-08-20 09:16:47] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-20 22:30:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-20 22:31:01] irc: connecting to server chat.freenode.net/6667...
+[2012-08-20 22:31:19] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-20 22:31:21] irc: connecting to server chat.freenode.net/6667...
+[2012-08-20 22:31:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-20 22:32:01] irc: connecting to server chat.freenode.net/6667...
+[2012-08-20 22:33:19] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-20 22:33:21] irc: connecting to server chat.freenode.net/6667...
+[2012-08-20 22:35:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-20 22:36:01] irc: connecting to server chat.freenode.net/6667...
+[2012-08-20 22:41:19] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-20 22:41:21] irc: connecting to server chat.freenode.net/6667...
+[2012-08-20 22:51:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-20 22:52:01] irc: connecting to server chat.freenode.net/6667...
+[2012-08-21 08:42:43] irc: connecting to server chat.freenode.net/6667...
+[2012-08-21 08:42:43] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-21 09:12:43] irc: connecting to server chat.freenode.net/6667...
+[2012-08-21 09:12:43] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-21 15:45:46] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-21 15:46:06] irc: connecting to server chat.freenode.net/6667...
+[2012-08-21 15:46:36] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-21 15:46:56] irc: connecting to server chat.freenode.net/6667...
+[2012-08-21 15:47:46] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-21 15:48:06] irc: connecting to server chat.freenode.net/6667...
+[2012-08-21 18:42:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-21 18:43:19] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-21 18:43:37] irc: connecting to server chat.freenode.net/6667...
+[2012-08-21 18:43:57] irc: connecting to server chat.freenode.net/6667...
+[2012-08-21 18:43:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-21 18:44:37] irc: connecting to server chat.freenode.net/6667...
+[2012-08-21 18:45:19] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-21 18:45:57] irc: connecting to server chat.freenode.net/6667...
+[2012-08-21 18:47:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-21 18:48:37] irc: connecting to server chat.freenode.net/6667...
+[2012-08-21 18:53:19] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-22 08:45:29] irc: connecting to server chat.freenode.net/6667...
+[2012-08-22 08:45:29] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-22 08:56:09] irc: connecting to server chat.freenode.net/6667...
+[2012-08-22 09:06:49] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-22 12:28:51] irc: connecting to server chat.freenode.net/6667...
+[2012-08-22 18:39:42] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-22 18:40:02] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-22 18:40:16] irc: connecting to server chat.freenode.net/6667...
+[2012-08-22 18:40:36] irc: connecting to server chat.freenode.net/6667...
+[2012-08-22 18:40:42] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-22 18:41:16] irc: connecting to server chat.freenode.net/6667...
+[2012-08-22 18:42:02] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-22 18:42:36] irc: connecting to server chat.freenode.net/6667...
+[2012-08-22 18:44:42] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-22 18:45:16] irc: connecting to server chat.freenode.net/6667...
+[2012-08-22 18:50:02] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-22 18:50:36] irc: connecting to server chat.freenode.net/6667...
+[2012-08-22 19:00:42] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-22 19:01:16] irc: connecting to server chat.freenode.net/6667...
+[2012-08-22 19:22:02] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-22 19:22:36] irc: connecting to server chat.freenode.net/6667...
+[2012-08-22 19:52:02] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-22 19:52:36] irc: connecting to server chat.freenode.net/6667...
+[2012-08-22 20:22:02] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-22 20:22:36] irc: connecting to server chat.freenode.net/6667...
+[2012-08-22 20:52:02] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-22 20:52:36] irc: connecting to server chat.freenode.net/6667...
+[2012-08-22 21:22:02] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-22 21:22:36] irc: connecting to server chat.freenode.net/6667...
+[2012-08-22 21:52:02] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-22 21:52:36] irc: connecting to server chat.freenode.net/6667...
+[2012-08-22 22:22:02] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-22 22:22:36] irc: connecting to server chat.freenode.net/6667...
+[2012-08-22 22:52:02] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-22 22:52:36] irc: connecting to server chat.freenode.net/6667...
+[2012-08-22 23:22:02] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-22 23:22:36] irc: connecting to server chat.freenode.net/6667...
+[2012-08-22 23:52:02] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-22 23:52:36] irc: connecting to server chat.freenode.net/6667...
+[2012-08-23 00:22:02] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-23 00:22:36] irc: connecting to server chat.freenode.net/6667...
+[2012-08-23 00:52:02] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-23 00:52:36] irc: connecting to server chat.freenode.net/6667...
+[2012-08-23 08:10:08] irc: connecting to server chat.freenode.net/6667...
+[2012-08-23 08:10:08] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-23 08:45:57] irc: connecting to server chat.freenode.net/6667...
+[2012-08-23 08:45:57] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-23 09:15:57] irc: connecting to server chat.freenode.net/6667...
+[2012-08-23 09:15:57] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-24 08:43:41] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-24 08:44:00] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 12:42:36] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 12:42:56] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 12:43:23] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-25 12:43:36] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 12:43:43] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-25 12:44:23] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-25 12:44:56] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 12:45:43] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-25 12:47:36] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 12:48:23] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-25 12:57:40] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 12:57:40] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-25 15:55:43] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 15:55:45] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-25 16:17:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 16:17:05] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-25 16:47:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 16:47:05] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-25 17:17:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 17:17:05] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-25 17:47:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 17:47:05] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-25 18:17:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 18:17:05] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-25 18:47:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 18:47:05] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-25 19:17:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 19:17:05] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-25 19:47:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 19:47:05] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-25 20:17:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 20:17:05] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-25 20:47:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 20:47:05] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-25 21:17:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 21:17:05] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-25 21:47:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 21:47:05] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-25 22:17:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 22:17:05] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-25 22:47:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 22:47:05] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-25 23:17:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 23:17:05] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-25 23:47:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-25 23:47:05] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-26 00:17:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-26 00:17:05] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-26 00:47:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-26 00:47:05] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-26 01:17:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-26 01:17:05] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-26 01:47:05] irc: connecting to server chat.freenode.net/6667...
+[2012-08-26 01:47:05] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-26 09:41:11] irc: connecting to server chat.freenode.net/6667...
+[2012-08-26 09:41:11] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-26 17:00:59] irc: connecting to server chat.freenode.net/6667...
+[2012-08-26 17:00:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-26 17:30:59] irc: connecting to server chat.freenode.net/6667...
+[2012-08-26 17:30:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-26 18:00:59] irc: connecting to server chat.freenode.net/6667...
+[2012-08-26 18:00:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-26 18:30:59] irc: connecting to server chat.freenode.net/6667...
+[2012-08-26 18:30:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-26 19:00:59] irc: connecting to server chat.freenode.net/6667...
+[2012-08-26 19:00:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-26 19:30:59] irc: connecting to server chat.freenode.net/6667...
+[2012-08-26 19:30:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-26 20:00:59] irc: connecting to server chat.freenode.net/6667...
+[2012-08-26 20:00:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-26 20:30:59] irc: connecting to server chat.freenode.net/6667...
+[2012-08-26 20:30:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-26 21:00:59] irc: connecting to server chat.freenode.net/6667...
+[2012-08-26 21:00:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-26 21:30:59] irc: connecting to server chat.freenode.net/6667...
+[2012-08-26 21:30:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-26 22:00:59] irc: connecting to server chat.freenode.net/6667...
+[2012-08-26 22:00:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-26 22:30:59] irc: connecting to server chat.freenode.net/6667...
+[2012-08-26 22:30:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-26 23:00:59] irc: connecting to server chat.freenode.net/6667...
+[2012-08-26 23:00:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-26 23:30:59] irc: connecting to server chat.freenode.net/6667...
+[2012-08-26 23:30:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-27 00:00:59] irc: connecting to server chat.freenode.net/6667...
+[2012-08-27 00:00:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-27 00:30:59] irc: connecting to server chat.freenode.net/6667...
+[2012-08-27 00:30:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-27 08:36:06] irc: connecting to server chat.freenode.net/6667...
+[2012-08-27 08:36:06] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-27 09:06:06] irc: connecting to server chat.freenode.net/6667...
+[2012-08-27 09:06:06] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-27 20:51:27] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-27 20:51:49] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-27 20:52:26] irc: connecting to server chat.freenode.net/6667...
+[2012-08-27 20:52:29] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-27 20:52:46] irc: connecting to server chat.freenode.net/6667...
+[2012-08-27 20:53:26] irc: connecting to server chat.freenode.net/6667...
+[2012-08-27 20:53:49] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-27 20:54:46] irc: connecting to server chat.freenode.net/6667...
+[2012-08-27 20:56:29] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-27 20:57:26] irc: connecting to server chat.freenode.net/6667...
+[2012-08-27 21:01:49] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-27 21:02:46] irc: connecting to server chat.freenode.net/6667...
+[2012-08-27 21:12:29] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-27 21:13:26] irc: connecting to server chat.freenode.net/6667...
+[2012-08-28 08:52:39] irc: connecting to server chat.freenode.net/6667...
+[2012-08-28 08:52:39] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-28 09:22:39] irc: connecting to server chat.freenode.net/6667...
+[2012-08-28 09:22:39] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-28 20:56:21] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-28 20:56:41] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-28 20:57:21] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-28 20:57:26] irc: connecting to server chat.freenode.net/6667...
+[2012-08-28 20:57:46] irc: connecting to server chat.freenode.net/6667...
+[2012-08-28 20:58:26] irc: connecting to server chat.freenode.net/6667...
+[2012-08-28 20:58:41] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-28 20:59:46] irc: connecting to server chat.freenode.net/6667...
+[2012-08-28 21:01:21] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-28 21:02:26] irc: connecting to server chat.freenode.net/6667...
+[2012-08-28 21:06:41] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-28 21:07:46] irc: connecting to server chat.freenode.net/6667...
+[2012-08-28 21:21:40] irc: connecting to server chat.freenode.net/6667...
+[2012-08-28 21:21:40] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-29 07:41:13] irc: connecting to server chat.freenode.net/6667...
+[2012-08-29 07:41:13] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-29 08:41:10] irc: connecting to server chat.freenode.net/6667...
+[2012-08-29 08:41:10] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-29 09:19:14] irc: connecting to server chat.freenode.net/6667...
+[2012-08-29 09:19:14] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-29 09:31:01] irc: connecting to server chat.freenode.net/6667...
+[2012-08-29 09:31:09] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-30 08:43:47] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-30 08:45:13] irc: connecting to server chat.freenode.net/6667...
+[2012-08-30 20:00:48] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-30 20:01:08] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-30 20:01:48] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-30 20:03:08] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-30 20:05:02] irc: connecting to server chat.freenode.net/6667...
+[2012-08-30 20:05:22] irc: connecting to server chat.freenode.net/6667...
+[2012-08-30 20:05:48] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-30 20:06:02] irc: connecting to server chat.freenode.net/6667...
+[2012-08-30 20:07:22] irc: connecting to server chat.freenode.net/6667...
+[2012-08-30 20:10:02] irc: connecting to server chat.freenode.net/6667...
+[2012-08-30 20:11:08] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-30 20:15:22] irc: connecting to server chat.freenode.net/6667...
+[2012-08-30 20:21:48] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-31 07:51:01] irc: connecting to server chat.freenode.net/6667...
+[2012-08-31 07:51:01] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-31 08:42:20] irc: connecting to server chat.freenode.net/6667...
+[2012-08-31 08:42:20] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-31 09:12:20] irc: connecting to server chat.freenode.net/6667...
+[2012-08-31 09:12:20] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-31 19:35:46] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-31 19:36:06] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-31 19:36:30] irc: connecting to server chat.freenode.net/6667...
+[2012-08-31 19:36:46] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-31 19:36:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-31 19:37:30] irc: connecting to server chat.freenode.net/6667...
+[2012-08-31 19:38:06] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-31 19:38:50] irc: connecting to server chat.freenode.net/6667...
+[2012-08-31 19:40:46] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-31 19:41:30] irc: connecting to server chat.freenode.net/6667...
+[2012-08-31 19:46:06] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-08-31 19:46:50] irc: connecting to server chat.freenode.net/6667...
+[2012-09-03 08:40:52] irc: connecting to server chat.freenode.net/6667...
+[2012-09-03 08:40:53] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-03 09:02:14] irc: connecting to server chat.freenode.net/6667...
+[2012-09-03 09:02:15] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-04 07:49:20] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-04 07:49:40] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-04 07:49:42] irc: connecting to server chat.freenode.net/6667...
+[2012-09-04 07:50:02] irc: connecting to server chat.freenode.net/6667...
+[2012-09-04 07:50:20] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-04 07:50:42] irc: connecting to server chat.freenode.net/6667...
+[2012-09-04 07:51:40] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-04 07:52:02] irc: connecting to server chat.freenode.net/6667...
+[2012-09-04 07:54:20] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-04 07:54:42] irc: connecting to server chat.freenode.net/6667...
+[2012-09-04 07:59:40] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-04 08:00:02] irc: connecting to server chat.freenode.net/6667...
+[2012-09-04 09:04:04] irc: connecting to server chat.freenode.net/6667...
+[2012-09-04 09:04:04] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-04 09:56:25] irc: connecting to server chat.freenode.net/6667...
+[2012-09-04 09:56:25] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-04 09:56:52] irc: connecting to server chat.freenode.net/6667...
+[2012-09-04 09:57:00] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-04 19:24:24] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-04 19:24:44] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-04 19:25:15] irc: connecting to server chat.freenode.net/6667...
+[2012-09-04 19:25:24] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-04 19:25:35] irc: connecting to server chat.freenode.net/6667...
+[2012-09-04 19:26:15] irc: connecting to server chat.freenode.net/6667...
+[2012-09-04 19:26:44] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-04 19:27:35] irc: connecting to server chat.freenode.net/6667...
+[2012-09-04 19:29:24] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-04 19:30:15] irc: connecting to server chat.freenode.net/6667...
+[2012-09-04 19:34:44] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-04 19:35:35] irc: connecting to server chat.freenode.net/6667...
+[2012-09-04 21:05:32] irc: connecting to server chat.freenode.net/6667...
+[2012-09-04 21:05:32] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-05 08:43:20] irc: connecting to server chat.freenode.net/6667...
+[2012-09-05 08:43:20] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-05 09:13:23] irc: connecting to server chat.freenode.net/6667...
+[2012-09-05 09:13:23] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-05 19:19:58] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-05 19:20:19] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-05 19:20:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-05 19:21:16] irc: connecting to server chat.freenode.net/6667...
+[2012-09-05 19:21:36] irc: connecting to server chat.freenode.net/6667...
+[2012-09-05 19:22:16] irc: connecting to server chat.freenode.net/6667...
+[2012-09-05 19:22:19] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-05 19:23:36] irc: connecting to server chat.freenode.net/6667...
+[2012-09-05 19:24:59] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-05 19:26:16] irc: connecting to server chat.freenode.net/6667...
+[2012-09-05 19:30:19] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-05 19:31:36] irc: connecting to server chat.freenode.net/6667...
+[2012-09-06 08:47:02] irc: connecting to server chat.freenode.net/6667...
+[2012-09-06 08:47:02] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-06 09:08:22] irc: connecting to server chat.freenode.net/6667...
+[2012-09-06 09:08:24] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-06 09:50:07] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-06 09:50:14] irc: connecting to server chat.freenode.net/6667...
+[2012-09-06 09:50:31] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-06 09:51:04] irc: connecting to server chat.freenode.net/6667...
+[2012-09-06 09:51:20] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-06 09:52:14] irc: connecting to server chat.freenode.net/6667...
+[2012-09-06 10:30:16] irc: connecting to server chat.freenode.net/6667...
+[2012-09-06 10:30:34] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-06 10:30:54] irc: connecting to server chat.freenode.net/6667...
+[2012-09-06 10:30:54] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-06 10:34:42] irc: connecting to server chat.freenode.net/6667...
+[2012-09-06 10:35:32] irc: connecting to server chat.freenode.net/6667...
+[2012-09-06 10:35:48] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-06 10:50:40] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-06 10:51:33] irc: connecting to server chat.freenode.net/6667...
+[2012-09-06 11:26:02] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-06 11:27:21] irc: connecting to server chat.freenode.net/6667...
+[2012-09-06 14:30:18] irc: connecting to server chat.freenode.net/6667...
+[2012-09-06 14:31:08] irc: connecting to server chat.freenode.net/6667...
+[2012-09-06 14:31:16] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-06 14:32:06] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-06 14:32:18] irc: connecting to server chat.freenode.net/6667...
+[2012-09-06 14:33:16] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-06 14:34:08] irc: connecting to server chat.freenode.net/6667...
+[2012-09-06 14:35:06] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-06 14:35:57] irc: connecting to server chat.freenode.net/6667...
+[2012-09-06 14:36:47] irc: connecting to server chat.freenode.net/6667...
+[2012-09-06 14:37:57] irc: connecting to server chat.freenode.net/6667...
+[2012-09-06 14:38:16] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-06 14:39:47] irc: connecting to server chat.freenode.net/6667...
+[2012-09-06 14:42:57] irc: connecting to server chat.freenode.net/6667...
+[2012-09-06 14:44:06] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-06 14:48:47] irc: connecting to server chat.freenode.net/6667...
+[2012-09-06 14:55:16] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-07 08:50:16] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-07 08:54:41] irc: connecting to server chat.freenode.net/6667...
+[2012-09-07 08:56:30] irc: connecting to server gameservers.nj.us.quakenet.org/6667...
+[2012-09-07 11:06:44] Writing configuration file plugins.conf
+[2012-09-07 11:06:44] Writing configuration file xfer.conf
+[2012-09-07 11:06:45] Writing configuration file rmodifier.conf
+[2012-09-07 11:06:45] Writing configuration file relay.conf
+[2012-09-07 11:06:45] Writing configuration file wg.conf
+[2012-09-07 11:06:45] Writing configuration file wg.conf
+[2012-09-07 11:06:45] Writing configuration file buffers.conf
+[2012-09-07 11:06:46] Writing configuration file iset.conf
+[2012-09-07 11:06:46] Writing configuration file logger.conf
+[2012-09-07 11:06:46] Writing configuration file irc.conf
+[2012-09-07 11:06:47] Writing configuration file aspell.conf
+[2012-09-07 11:06:47] Writing configuration file alias.conf
+[2012-09-07 11:06:47] Writing configuration file weechat.conf
--- /dev/null
+#
+# wg.conf -- weechat v0.3.8
+#
+
+[color]
+installed = yellow
+language = lightblue
+obsolete = lightmagenta
+running = lightgreen
+script = cyan
+unknown = lightred
+
+[scripts]
+cache_expire = 60
+dir = "%h/weeget"
+url = "http://www.weechat.org/files/plugins.xml.gz"
--- /dev/null
+#
+# xfer.conf -- weechat v0.3.8
+#
+
+[look]
+auto_open_buffer = on
+progress_bar_size = 20
+
+[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_rename = on
+auto_resume = on
+convert_spaces = on
+download_path = "%h/xfer"
+upload_path = "~"
+use_nick_in_filename = on