From 8c0412269bd4a90145ec74cca00b337c571d3fb8 Mon Sep 17 00:00:00 2001 From: Ryan Kavanagh Date: Wed, 21 Mar 2018 11:39:59 -0400 Subject: Update irssi config --- .irssi/config | 11 +- .irssi/envy.theme | 2 +- .irssi/scripts/autoaway.pl | 133 ++++ .irssi/scripts/autorun/autoaway.pl | 1 + .irssi/scripts/autorun/tmux_away.pl | 1 + .irssi/scripts/autorun/trackbar.pl | 1 + .irssi/scripts/autorun/trackbar22.pl | 1 - .irssi/scripts/nickcolor.pl | 122 +++- .irssi/scripts/old/nickcolor.pl.old | 145 ++++ .irssi/scripts/old/trackbar22.pl.old | 508 ++++++++++++++ .irssi/scripts/scriptassist.pl | 1229 ++++++++++++++++++++++++++++++++++ .irssi/scripts/tmux_away.pl | 202 ++++++ .irssi/scripts/trackbar.pl | 579 ++++++++++++++++ .irssi/scripts/trackbar22.pl | 508 -------------- 14 files changed, 2924 insertions(+), 519 deletions(-) create mode 100644 .irssi/scripts/autoaway.pl create mode 120000 .irssi/scripts/autorun/autoaway.pl create mode 120000 .irssi/scripts/autorun/tmux_away.pl create mode 120000 .irssi/scripts/autorun/trackbar.pl delete mode 120000 .irssi/scripts/autorun/trackbar22.pl create mode 100644 .irssi/scripts/old/nickcolor.pl.old create mode 100644 .irssi/scripts/old/trackbar22.pl.old create mode 100644 .irssi/scripts/scriptassist.pl create mode 100644 .irssi/scripts/tmux_away.pl create mode 100644 .irssi/scripts/trackbar.pl delete mode 100644 .irssi/scripts/trackbar22.pl diff --git a/.irssi/config b/.irssi/config index a707392..78cb476 100644 --- a/.irssi/config +++ b/.irssi/config @@ -334,8 +334,9 @@ settings = { twtopic_min_scroll = "no"; twtopic_ar_padding = "0"; twtopic_init_pause = "200"; - recdep_channels = "Freenode/ OFTC/"; + recdep_channels = "Freenode/ OFTC/ snoonet/"; recdep_period = "3600"; + autoaway_timeout = "300"; }; "irc/core" = { alternate_nick = "ryanakca_"; }; }; @@ -380,7 +381,13 @@ channels = ( autojoin = "yes"; }, { name = "#sml"; chatnet = "Freenode"; autojoin = "yes"; }, - { name = "#personalfinance"; chatnet = "snoonet"; autojoin = "yes"; } + { name = "#personalfinance"; chatnet = "snoonet"; }, + { name = "#debian-haskell"; chatnet = "OFTC"; autojoin = "yes"; }, + { name = "#beer"; chatnet = "snoonet"; }, + { name = "#canada"; chatnet = "snoonet"; }, + { name = "#news"; chatnet = "snoonet"; autojoin = "yes"; }, + { name = "#reddit"; chatnet = "snoonet"; autojoin = "yes"; }, + { name = "#russian"; chatnet = "snoonet"; } ); windows = { 1 = { immortal = "yes"; name = "(status)"; level = "ALL"; }; diff --git a/.irssi/envy.theme b/.irssi/envy.theme index cef0c30..557ee02 100644 --- a/.irssi/envy.theme +++ b/.irssi/envy.theme @@ -304,7 +304,7 @@ formats = { set_not_boolean = "%r:%K:: Setting {hilight $0} isn't boolean, use /SET"; translation_not_found = "%r:%K:: %rError%K opening translation table file $0: $1"; translation_file_error = "%r:%K:: %rError%K parsing translation table file $0"; - pubmsg = "{pubmsgnick $2 {pubnick \00313$0}}$1"; + pubmsg = "{pubmsgnick $2 {pubnick \00311$[0]0}}$1"; }; "fe-common/irc/dcc" = { dcc_list_header = "{line_start_irssi}{dcc DCC connections:}"; diff --git a/.irssi/scripts/autoaway.pl b/.irssi/scripts/autoaway.pl new file mode 100644 index 0000000..ef3c485 --- /dev/null +++ b/.irssi/scripts/autoaway.pl @@ -0,0 +1,133 @@ +# /AUTOAWAY - Mark user away after seconds of inactivity +# /AWAY - play nice with autoaway +# New, brighter, whiter version of my autoaway script. Actually works :) +# (c) 2000 Larry Daffner (vizzie@airmail.net) +# You may freely use, modify and distribute this script, as long as +# 1) you leave this notice intact +# 2) you don't pretend my code is yours +# 3) you don't pretend your code is mine +# +# share and enjoy! + +# A simple script. /autoaway will mark you as away automatically if +# you have not typed any commands in seconds. (=0 disables the feature) +# It will also automatically unmark you away the next time you type a command. +# Note that using the /away command will disable the autoaway mechanism, as +# well as the autoreturn. (when you unmark yourself, the autoaway wil +# restart again) + +# Thanks to Adam Monsen for multiserver and config file fix + +use strict; +use Irssi; +use Irssi::Irc; + +use vars qw($VERSION %IRSSI); +$VERSION = "0.4"; +%IRSSI = ( + authors => 'Larry "Vizzie" Daffner', + contact => 'vizzie@airmail.net', + name => 'Automagic away setting', + description => 'Automatically goes away after defined inactivity', + license => 'BSD', + url => 'http://www.flamingpackets.net/~vizzie/irssi/', + changed => 'Tue Apr 26 19:30:00 CDT 2016', + changes => 'Applied multiserver/store config patch from Adam Monsen' +); + +my ($autoaway_sec, $autoaway_to_tag, $autoaway_state); +$autoaway_state = 0; + +# +# /AUTOAWAY - set the autoaway timeout +# +sub cmd_autoaway { + my ($data, $server, $channel) = @_; + + if (!($data =~ /^[0-9]+$/)) { + Irssi::print("autoaway: usage: /autoaway "); + return 1; + } + + $autoaway_sec = $data; + + if ($autoaway_sec) { + Irssi::settings_set_int("autoaway_timeout", $autoaway_sec); + Irssi::print("autoaway timeout set to $autoaway_sec seconds"); + } else { + Irssi::print("autoway disabled"); + } + + if (defined($autoaway_to_tag)) { + Irssi::timeout_remove($autoaway_to_tag); + $autoaway_to_tag = undef; + } + + if ($autoaway_sec) { + $autoaway_to_tag = + Irssi::timeout_add($autoaway_sec*1000, "auto_timeout", ""); + } +} + +# +# away = Set us away or back, within the autoaway system +sub cmd_away { + my ($data, $server, $channel) = @_; + + if ($data eq "") { + $autoaway_state = 0; + } else { + if ($autoaway_state eq 0) { + Irssi::timeout_remove($autoaway_to_tag); + $autoaway_to_tag = undef; + $autoaway_state = 2; + } + } +} + +sub auto_timeout { + my ($data, $server) = @_; + + # we're in the process.. don't touch anything. + $autoaway_state = 3; + foreach my $server (Irssi::servers()) { + $server->command("/AWAY autoaway after $autoaway_sec seconds"); + } + + Irssi::timeout_remove($autoaway_to_tag); + $autoaway_state = 1; +} + +sub reset_timer { + if ($autoaway_state eq 1) { + $autoaway_state = 3; + foreach my $server (Irssi::servers()) { + $server->command("/AWAY"); + } + + $autoaway_state = 0; + } + if ($autoaway_state eq 0) { + if (defined($autoaway_to_tag)) { + Irssi::timeout_remove($autoaway_to_tag); + $autoaway_to_tag = undef(); + } + if ($autoaway_sec) { + $autoaway_to_tag = Irssi::timeout_add($autoaway_sec*1000 + , "auto_timeout", ""); + } + } +} + +Irssi::settings_add_int("misc", "autoaway_timeout", 0); + +my $autoaway_default = Irssi::settings_get_int("autoaway_timeout"); +if ($autoaway_default) { + $autoaway_to_tag = + Irssi::timeout_add($autoaway_default*1000, "auto_timeout", ""); + +} + +Irssi::command_bind('autoaway', 'cmd_autoaway'); +Irssi::command_bind('away', 'cmd_away'); +Irssi::signal_add('send command', 'reset_timer'); diff --git a/.irssi/scripts/autorun/autoaway.pl b/.irssi/scripts/autorun/autoaway.pl new file mode 120000 index 0000000..a6c9910 --- /dev/null +++ b/.irssi/scripts/autorun/autoaway.pl @@ -0,0 +1 @@ +../autoaway.pl \ No newline at end of file diff --git a/.irssi/scripts/autorun/tmux_away.pl b/.irssi/scripts/autorun/tmux_away.pl new file mode 120000 index 0000000..70df40e --- /dev/null +++ b/.irssi/scripts/autorun/tmux_away.pl @@ -0,0 +1 @@ +../tmux_away.pl \ No newline at end of file diff --git a/.irssi/scripts/autorun/trackbar.pl b/.irssi/scripts/autorun/trackbar.pl new file mode 120000 index 0000000..8c5a483 --- /dev/null +++ b/.irssi/scripts/autorun/trackbar.pl @@ -0,0 +1 @@ +../trackbar.pl \ No newline at end of file diff --git a/.irssi/scripts/autorun/trackbar22.pl b/.irssi/scripts/autorun/trackbar22.pl deleted file mode 120000 index 09c98ff..0000000 --- a/.irssi/scripts/autorun/trackbar22.pl +++ /dev/null @@ -1 +0,0 @@ -../trackbar22.pl \ No newline at end of file diff --git a/.irssi/scripts/nickcolor.pl b/.irssi/scripts/nickcolor.pl index ff9915d..95b7b63 100644 --- a/.irssi/scripts/nickcolor.pl +++ b/.irssi/scripts/nickcolor.pl @@ -1,24 +1,36 @@ use strict; use Irssi 20020101.0250 (); -use vars qw($VERSION %IRSSI); -$VERSION = "2"; +use vars qw($VERSION %IRSSI); +$VERSION = "2.1"; %IRSSI = ( - authors => "Timo Sirainen, Ian Peters, David Leadbeater", - contact => "tss\@iki.fi", + authors => "Timo Sirainen, Ian Peters, David Leadbeater, Bruno Cattáneo", + contact => "tss\@iki.fi", name => "Nick Color", description => "assign a different color for each nick", license => "Public Domain", url => "http://irssi.org/", - changed => "Sun 15 Jun 19:10:44 BST 2014", + changed => "Mon 08 Jan 21:28:53 BST 2018", ); # Settings: # nickcolor_colors: List of color codes to use. # e.g. /set nickcolor_colors 2 3 4 5 6 7 9 10 11 12 13 # (avoid 8, as used for hilights in the default theme). +# +# nickcolor_enable_prefix: Enables prefix for same nick. +# +# nickcolor_enable_truncate: Enables nick truncation. +# +# nickcolor_prefix_text: Prefix text for succesive messages. +# e.g. /set nickcolor_prefix_text - +# +# nickcolor_truncate_value: Truncate nick value. +# e.g. /set nickcolor_truncate_value -7 +# This will truncate nicknames at 7 characters and make them right aligned my %saved_colors; my %session_colors = {}; +my %saved_nicks; # To store each channel's last nickname sub load_colors { open my $color_fh, "<", "$ENV{HOME}/.irssi/saved_colors"; @@ -75,9 +87,21 @@ sub simple_hash { return $counter; } +# process public (others) messages sub sig_public { my ($server, $msg, $nick, $address, $target) = @_; + my $enable_prefix = Irssi::settings_get_bool('nickcolor_enable_prefix'); + my $enable_truncate = Irssi::settings_get_bool('nickcolor_enable_truncate'); + my $prefix_text = Irssi::settings_get_str('nickcolor_prefix_text'); + my $truncate_value = Irssi::settings_get_int('nickcolor_truncate_value'); + + # Reference for server/channel + my $tagtarget = "$server->{tag}/$target"; + + # Set default nick truncate value to 0 if option is disabled + $truncate_value = 0 if (!$enable_truncate); + # Has the user assigned this nick a color? my $color = $saved_colors{$nick}; @@ -93,7 +117,84 @@ sub sig_public { } $color = sprintf "\003%02d", $color; - $server->command('/^format pubmsg {pubmsgnick $2 {pubnick ' . $color . '$0}}$1'); + + # Optional: We check if it's the same nickname for current target + if ($saved_nicks{$tagtarget} eq $nick && $enable_prefix) + { + # Grouped message + Irssi::command('/^format pubmsg ' . $prefix_text . '$1'); + } + else + { + # Normal message + Irssi::command('/^format pubmsg {pubmsgnick $2 {pubnick ' . $color . '$[' . $truncate_value . ']0}}$1'); + + # Save nickname for next message + $saved_nicks{$tagtarget} = $nick; + } + +} + +# process public (me) messages +sub sig_me { + my ($server, $msg, $target) = @_; + my $nick = $server->{nick}; + + my $enable_prefix = Irssi::settings_get_bool('nickcolor_enable_prefix'); + my $enable_truncate = Irssi::settings_get_bool('nickcolor_enable_truncate'); + my $prefix_text = Irssi::settings_get_str('nickcolor_prefix_text'); + my $truncate_value = Irssi::settings_get_int('nickcolor_truncate_value'); + + # Reference for server/channel + my $tagtarget = "$server->{tag}/$target"; + + # Set default nick truncate value to 0 if option is disabled + $truncate_value = 0 if (!$enable_truncate); + + # Optional: We check if it's the same nickname for current target + if ($saved_nicks{$tagtarget} eq $nick && $enable_prefix) + { + # Grouped message + Irssi::command('/^format own_msg ' . $prefix_text . '$1'); + } + else + { + # Normal message + Irssi::command('/^format own_msg {ownmsgnick $2 {ownnick $[' . $truncate_value . ']0}}$1'); + + # Save nickname for next message + $saved_nicks{$tagtarget} = $nick; + } + +} + +# process public (others) actions +sub sig_action_public { + my ($server, $msg, $nick, $address, $target) = @_; + + my $enable_prefix = Irssi::settings_get_bool('nickcolor_enable_prefix'); + + # Reference for server/channel + my $tagtarget = "$server->{tag}/$target"; + + # Empty current target nick if prefix option is enabled + $saved_nicks{$tagtarget} = '' if ($enable_prefix); + +} + +# process public (me) actions +sub sig_action_me { + my ($server, $msg, $target) = @_; + my $nick = $server->{nick}; + + my $enable_prefix = Irssi::settings_get_bool('nickcolor_enable_prefix'); + + # Reference for server/channel + my $tagtarget = "$server->{tag}/$target"; + + # Empty current target nick if prefix option is enabled + $saved_nicks{$tagtarget} = '' if ($enable_prefix); + } sub cmd_color { @@ -125,7 +226,7 @@ sub cmd_color { } elsif ($op eq "list") { Irssi::print ("\nSaved Colors:"); foreach my $nick (keys %saved_colors) { - Irssi::print (chr (3) . "$saved_colors{$nick}$nick" . + Irssi::print (chr (3) . sprintf("%02d", $saved_colors{$nick}) . "$nick" . chr (3) . "1 ($saved_colors{$nick})"); } } elsif ($op eq "preview") { @@ -139,7 +240,14 @@ sub cmd_color { load_colors; Irssi::settings_add_str('misc', 'nickcolor_colors', '2 3 4 5 6 7 9 10 11 12 13'); +Irssi::settings_add_bool('misc', 'nickcolor_enable_prefix', 0); +Irssi::settings_add_bool('misc', 'nickcolor_enable_truncate', 0); +Irssi::settings_add_str('misc', 'nickcolor_prefix_text' => '- '); +Irssi::settings_add_int('misc', 'nickcolor_truncate_value' => 0); Irssi::command_bind('color', 'cmd_color'); Irssi::signal_add('message public', 'sig_public'); +Irssi::signal_add('message own_public', 'sig_me'); +Irssi::signal_add('message irc action', 'sig_action_public'); +Irssi::signal_add('message irc own_action', 'sig_action_me'); Irssi::signal_add('event nick', 'sig_nick'); diff --git a/.irssi/scripts/old/nickcolor.pl.old b/.irssi/scripts/old/nickcolor.pl.old new file mode 100644 index 0000000..ff9915d --- /dev/null +++ b/.irssi/scripts/old/nickcolor.pl.old @@ -0,0 +1,145 @@ +use strict; +use Irssi 20020101.0250 (); +use vars qw($VERSION %IRSSI); +$VERSION = "2"; +%IRSSI = ( + authors => "Timo Sirainen, Ian Peters, David Leadbeater", + contact => "tss\@iki.fi", + name => "Nick Color", + description => "assign a different color for each nick", + license => "Public Domain", + url => "http://irssi.org/", + changed => "Sun 15 Jun 19:10:44 BST 2014", +); + +# Settings: +# nickcolor_colors: List of color codes to use. +# e.g. /set nickcolor_colors 2 3 4 5 6 7 9 10 11 12 13 +# (avoid 8, as used for hilights in the default theme). + +my %saved_colors; +my %session_colors = {}; + +sub load_colors { + open my $color_fh, "<", "$ENV{HOME}/.irssi/saved_colors"; + while (<$color_fh>) { + chomp; + my($nick, $color) = split ":"; + $saved_colors{$nick} = $color; + } +} + +sub save_colors { + open COLORS, ">", "$ENV{HOME}/.irssi/saved_colors"; + + foreach my $nick (keys %saved_colors) { + print COLORS "$nick:$saved_colors{$nick}\n"; + } + + close COLORS; +} + +# If someone we've colored (either through the saved colors, or the hash +# function) changes their nick, we'd like to keep the same color associated +# with them (but only in the session_colors, ie a temporary mapping). + +sub sig_nick { + my ($server, $newnick, $nick, $address) = @_; + my $color; + + $newnick = substr ($newnick, 1) if ($newnick =~ /^:/); + + if ($color = $saved_colors{$nick}) { + $session_colors{$newnick} = $color; + } elsif ($color = $session_colors{$nick}) { + $session_colors{$newnick} = $color; + } +} + +# This gave reasonable distribution values when run across +# /usr/share/dict/words + +sub simple_hash { + my ($string) = @_; + chomp $string; + my @chars = split //, $string; + my $counter; + + foreach my $char (@chars) { + $counter += ord $char; + } + + my @colors = split / /, Irssi::settings_get_str('nickcolor_colors'); + $counter = $colors[$counter % @colors]; + + return $counter; +} + +sub sig_public { + my ($server, $msg, $nick, $address, $target) = @_; + + # Has the user assigned this nick a color? + my $color = $saved_colors{$nick}; + + # Have -we- already assigned this nick a color? + if (!$color) { + $color = $session_colors{$nick}; + } + + # Let's assign this nick a color + if (!$color) { + $color = simple_hash $nick; + $session_colors{$nick} = $color; + } + + $color = sprintf "\003%02d", $color; + $server->command('/^format pubmsg {pubmsgnick $2 {pubnick ' . $color . '$0}}$1'); +} + +sub cmd_color { + my ($data, $server, $witem) = @_; + my ($op, $nick, $color) = split " ", $data; + + $op = lc $op; + + if (!$op) { + Irssi::print ("No operation given (save/set/clear/list/preview)"); + } elsif ($op eq "save") { + save_colors; + } elsif ($op eq "set") { + if (!$nick) { + Irssi::print ("Nick not given"); + } elsif (!$color) { + Irssi::print ("Color not given"); + } elsif ($color < 2 || $color > 14) { + Irssi::print ("Color must be between 2 and 14 inclusive"); + } else { + $saved_colors{$nick} = $color; + } + } elsif ($op eq "clear") { + if (!$nick) { + Irssi::print ("Nick not given"); + } else { + delete ($saved_colors{$nick}); + } + } elsif ($op eq "list") { + Irssi::print ("\nSaved Colors:"); + foreach my $nick (keys %saved_colors) { + Irssi::print (chr (3) . "$saved_colors{$nick}$nick" . + chr (3) . "1 ($saved_colors{$nick})"); + } + } elsif ($op eq "preview") { + Irssi::print ("\nAvailable colors:"); + foreach my $i (2..14) { + Irssi::print (chr (3) . "$i" . "Color #$i"); + } + } +} + +load_colors; + +Irssi::settings_add_str('misc', 'nickcolor_colors', '2 3 4 5 6 7 9 10 11 12 13'); +Irssi::command_bind('color', 'cmd_color'); + +Irssi::signal_add('message public', 'sig_public'); +Irssi::signal_add('event nick', 'sig_nick'); diff --git a/.irssi/scripts/old/trackbar22.pl.old b/.irssi/scripts/old/trackbar22.pl.old new file mode 100644 index 0000000..0d10882 --- /dev/null +++ b/.irssi/scripts/old/trackbar22.pl.old @@ -0,0 +1,508 @@ +# trackbar.pl +# +# This little script will do just one thing: it will draw a line each time you +# switch away from a window. This way, you always know just upto where you've +# been reading that window :) It also removes the previous drawn line, so you +# don't see double lines. +# +# redraw trackbar only works on irssi 0.8.17 or higher. +# +# +# Usage: +# +# The script works right out of the box, but if you want you can change +# the working by /set'ing the following variables: +# +# Setting: trackbar_style +# Description: This setting will be the color of your trackbar line. +# By default the value will be '%K', only Irssi color +# formats are allowed. If you don't know the color formats +# by heart, you can take a look at the formats documentation. +# You will find the proper docs on http://www.irssi.org/docs. +# +# Setting: trackbar_string +# Description: This is the string that your line will display. This can +# be multiple characters or just one. For example: '~-~-' +# The default setting is '-'. +# +# Setting: trackbar_use_status_window +# Description: If this setting is set to OFF, Irssi won't print a trackbar +# in the statuswindow +# +# Setting: trackbar_ignore_windows +# Description: A list of windows where no trackbar should be printed +# +# Setting: trackbar_print_timestamp +# Description: If this setting is set to ON, Irssi will print the formatted +# timestamp in front of the trackbar. +# +# Setting: trackbar_require_seen +# Description: Only clear the trackbar if it has been scrolled to. +# +# /mark is a command that will redraw the line at the bottom. +# +# Command: /trackbar, /trackbar goto +# Description: Jump to where the trackbar is, to pick up reading +# +# Command: /trackbar keep +# Description: Keep this window's trackbar where it is the next time +# you switch windows (then this flag is cleared again) +# +# Command: /mark, /trackbar mark +# Description: Remove the old trackbar and mark the bottom of this +# window with a new trackbar +# +# Command: /trackbar markvisible +# Description: Like mark for all visible windows +# +# Command: /trackbar markall +# Description: Like mark for all windows +# +# Command: /trackbar remove +# Description: Remove this window's trackbar +# +# Command: /trackbar removeall +# Description: Remove all windows' trackbars +# +# Command: /trackbar redraw +# Description: Force redraw of trackbars +# + + +# For bugreports and other improvements contact one of the authors. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this script; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +## + +use strict; +use warnings; +use Irssi; +use Irssi::TextUI; +use Encode; + +use POSIX qw(strftime); +use vars qw($VERSION %IRSSI); + +$VERSION = "2.4"; # 1ca8fa9f28b9586 + +%IRSSI = ( + authors => 'Peter Leurs and Geert Hauwaerts', + contact => 'peter@pfoe.be', + patchers => 'Johan Kiviniemi (UTF-8), Uwe Dudenhoeffer (on-upgrade-remove-line)', + name => 'trackbar', + description => 'Shows a bar where you have last read a window.', + license => 'GNU General Public License', + url => 'http://www.pfoe.be/~peter/trackbar/', + commands => 'trackbar', +); + +## Comments and remarks. +# +# This script uses settings. +# Use /SET to change the value or /TOGGLE to switch it on or off. +# +# +# Tip: The command 'trackbar' is very usefull if you bind that to a key, +# so you can easily jump to the trackbar. Please see 'help bind' for +# more information about keybindings in Irssi. +# +# Command: /BIND meta2-P key F1 +# /BIND F1 command trackbar +# +## + +## Bugfixes and new items in this rewrite. +# +# * Remove all the trackbars before upgrading. +# * New setting trackbar_use_status_window to control the statuswindow trackbar. +# * New setting trackbar_print_timestamp to print a timestamp or not. +# * New command 'trackbar' to scroll up to the trackbar. +# * When resizing your terminal, Irssi will update all the trackbars to the new size. +# * When changing trackbar settings, change all the trackbars to the new settings. +# * New command 'trackbar mark' to draw a new trackbar (The old '/mark'). +# * New command 'trackbar markall' to draw a new trackbar in each window. +# * New command 'trackbar remove' to remove the trackbar from the current window. +# * New command 'trackbar removeall' to remove all the trackbars. +# * Don't draw a trackbar in empty windows. +# * Added a version check to prevent Irssi redraw errors. +# * Fixed a bookmark NULL versus 0 bug. +# * Fixed a remove-line bug in Uwe Dudenhoeffer his patch. +# * New command 'help trackbar' to display the trackbar commands. +# * Fixed an Irssi startup bug, now processing each auto-created window. +# +## + +## Known bugs and the todolist. +# +# Todo: * Instead of drawing a line, invert the line. +# +## + +sub cmd_help { + my ($args) = @_; + if ($args =~ /^trackbar *$/i) { + print CLIENTCRAP <>%n %_Scriptinfo:%_ Loaded $0 version $1 by $2.', + 'trackbar_wrong_version', '%R>>%n %_Trackbar:%_ Please upgrade your client to 0.8.17 or above if you would like to use this feature of trackbar.', + 'trackbar_all_removed', '%R>>%n %_Trackbar:%_ All the trackbars have been removed.', + 'trackbar_not_found', '%R>>%n %_Trackbar:%_ No trackbar found in this window.', +]); + +my $old_irssi = Irssi::version < 20140701; +sub check_version { + if ($old_irssi) { + Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'trackbar_wrong_version'); + return; + } else { + return 1; + } +} + +sub is_utf8 { + lc Irssi::settings_get_str('term_charset') eq 'utf-8' +} + +my (%config, %keep_trackbar, %unseen_trackbar); + +sub remove_one_trackbar { + my $win = shift; + my $view = shift || $win->view; + my $line = $view->get_bookmark('trackbar'); + if (defined $line) { + my $bottom = $view->{bottom}; + $view->remove_line($line); + $win->command('^scrollback end') if $bottom && !$win->view->{bottom}; + $view->redraw; + } +} + +sub add_one_trackbar { + my $win = shift; + my $view = shift || $win->view; + $win->print(line($win->{width}), MSGLEVEL_NEVER); + $view->set_bookmark_bottom('trackbar'); + $unseen_trackbar{ $win->{_irssi} } = 1; + Irssi::signal_emit("window trackbar added", $win); + $view->redraw; +} + +sub update_one_trackbar { + my $win = shift; + my $view = shift || $win->view; + my $force = shift; + my $ignored = win_ignored($win, $view); + remove_one_trackbar($win, $view) + if $force || !defined $force || !$ignored; + add_one_trackbar($win, $view) + if $force || !$ignored; +} + +sub win_ignored { + my $win = shift; + my $view = shift || $win->view; + return 1 unless $view->{buffer}{lines_count}; + return 1 if $win->{name} eq '(status)' && !$config{use_status_window}; + no warnings 'uninitialized'; + return 1 if grep { $win->{name} eq $_ || $win->{refnum} eq $_ + || $win->get_active_name eq $_ } @{ $config{ignore_windows} }; + return 0; +} + +sub sig_window_changed { + my ($newwindow, $oldwindow) = @_; + return unless $oldwindow; + redraw_trackbars($newwindow); + trackbar_update_seen($newwindow); + return if delete $keep_trackbar{ $oldwindow->{_irssi} }; + trackbar_update_seen($oldwindow); + return if $config{require_seen} && $unseen_trackbar{ $oldwindow->{_irssi } }; + update_one_trackbar($oldwindow, undef, 0); +} + +sub trackbar_update_seen { + my $win = shift; + return unless $win; + return unless $unseen_trackbar{ $win->{_irssi} }; + + my $view = $win->view; + my $line = $view->get_bookmark('trackbar'); + unless ($line) { + delete $unseen_trackbar{ $win->{_irssi} }; + Irssi::signal_emit("window trackbar seen", $win); + return; + } + my $startline = $view->{startline}; + return unless $startline; + + if ($startline->{info}{time} < $line->{info}{time} + || $startline->{_irssi} == $line->{_irssi}) { + delete $unseen_trackbar{ $win->{_irssi} }; + Irssi::signal_emit("window trackbar seen", $win); + } +} + +sub screen_length; +{ local $@; + eval { require Text::CharWidth; }; + unless ($@) { + *screen_length = sub { Text::CharWidth::mbswidth($_[0]) }; + } + else { + *screen_length = sub { + my $temp = shift; + if (is_utf8()) { + Encode::_utf8_on($temp); + } + length($temp) + }; + } +} + +{ my %strip_table = ( + (map { $_ => '' } (split //, '04261537' . 'kbgcrmyw' . 'KBGCRMYW' . 'U9_8I:|FnN>#[' . 'pP')), + (map { $_ => $_ } (split //, '{}%')), + ); + sub c_length { + my $o = Irssi::strip_codes($_[0]); + $o =~ s/(%(%|Z.{6}|z.{6}|X..|x..|.))/exists $strip_table{$2} ? $strip_table{$2} : + $2 =~ m{x(?:0[a-f]|[1-6][0-9a-z]|7[a-x])|z[0-9a-f]{6}}i ? '' : $1/gex; + screen_length($o) + } +} + +sub line { + my ($width, $time) = @_; + my $string = $config{string}; + $string = ' ' unless length $string; + $time ||= time; + + Encode::_utf8_on($string); + my $length = c_length($string); + + my $format = ''; + if ($config{print_timestamp}) { + $format = $config{timestamp_str}; + $format =~ y/%/\01/; + $format =~ s/\01\01/%/g; + $format = strftime($format, localtime $time); + $format =~ y/\01/%/; + } + + my $times = $width / $length; + $times += 1 if $times != int $times; + $format .= $config{style}; + $width -= c_length($format); + $string x= $times; + chop $string while length $string && c_length($string) > $width; + return $format . $string; +} + +sub remove_all_trackbars { + for my $window (Irssi::windows) { + next unless ref $window; + remove_one_trackbar($window); + } +} + +sub UNLOAD { + remove_all_trackbars(); +} + +sub redraw_trackbars { + return unless check_version(); + for my $win (@_ ? @_ : Irssi::windows) { + next unless ref $win; + my $view = $win->view; + my $line = $view->get_bookmark('trackbar'); + next unless $line; + my $bottom = $view->{bottom}; + $win->print_after($line, MSGLEVEL_NEVER, line($win->{width}, $line->{info}{time}), + $line->{info}{time}); + $view->set_bookmark('trackbar', $win->last_line_insert); + $view->redraw; + $view->remove_line($line); + $win->command('^scrollback end') if $bottom && !$win->view->{bottom}; + $view->redraw; + } +} + +sub goto_trackbar { + my $win = Irssi::active_win; + my $line = $win->view->get_bookmark('trackbar'); + + if ($line) { + $win->command("scrollback goto ". strftime("%d %H:%M:%S", localtime($line->{info}{time}))); + } else { + $win->printformat(MSGLEVEL_CLIENTCRAP, 'trackbar_not_found'); + } +} + +sub cmd_mark { + update_one_trackbar(Irssi::active_win, undef, 1); +} + +sub cmd_markall { + for my $window (Irssi::windows) { + next unless ref $window; + update_one_trackbar($window); + } +} + +sub signal_stop { + Irssi::signal_stop; +} + +sub cmd_markvisible { + my @wins = Irssi::windows; + my $awin = + my $bwin = Irssi::active_win; + my $awin_counter = 0; + Irssi::signal_add_priority('window changed' => 'signal_stop', -99); + do { + Irssi::active_win->command('window up'); + $awin = Irssi::active_win; + update_one_trackbar($awin); + ++$awin_counter; + } until ($awin->{refnum} == $bwin->{refnum} || $awin_counter >= @wins); + Irssi::signal_remove('window changed' => 'signal_stop'); +} + +sub cmd_trackbar_remove_one { + remove_one_trackbar(Irssi::active_win); +} + +sub cmd_remove_all_trackbars { + remove_all_trackbars(); + Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'trackbar_all_removed'); +} + +sub cmd_keep_once { + $keep_trackbar{ Irssi::active_win->{_irssi} } = 1; +} + +sub trackbar_runsub { + my ($data, $server, $item) = @_; + $data =~ s/\s+$//g; + + if ($data) { + Irssi::command_runsub('trackbar', $data, $server, $item); + } else { + goto_trackbar(); + } +} + +sub update_config { + my $was_status_window = $config{use_status_window}; + $config{style} = Irssi::settings_get_str('trackbar_style'); + $config{string} = Irssi::settings_get_str('trackbar_string'); + $config{require_seen} = Irssi::settings_get_bool('trackbar_require_seen'); + $config{ignore_windows} = [ split /[,\s]+/, Irssi::settings_get_str('trackbar_ignore_windows') ]; + $config{use_status_window} = Irssi::settings_get_bool('trackbar_use_status_window'); + $config{print_timestamp} = Irssi::settings_get_bool('trackbar_print_timestamp'); + if (defined $was_status_window && $was_status_window != $config{use_status_window}) { + if (my $swin = Irssi::window_find_name('(status)')) { + if ($config{use_status_window}) { + update_one_trackbar($swin); + } + else { + remove_one_trackbar($swin); + } + } + } + if ($config{print_timestamp}) { + my $ts_format = Irssi::settings_get_str('timestamp_format'); + my $ts_theme = Irssi::current_theme->get_format('fe-common/core', 'timestamp'); + my $render_str = Irssi::current_theme->format_expand($ts_theme); + (my $ts_escaped = $ts_format) =~ s/([%\$])/$1$1/g; + $render_str =~ s/(?|\$(.)(?!\w)|\$\{(\w+)\})/$1 eq 'Z' ? $ts_escaped : $1/ge; + $config{timestamp_str} = $render_str; + } + redraw_trackbars() unless $old_irssi; +} + +Irssi::settings_add_str('trackbar', 'trackbar_string', is_utf8() ? "\x{2500}" : '-'); +Irssi::settings_add_str('trackbar', 'trackbar_style', '%K'); +Irssi::settings_add_str('trackbar', 'trackbar_ignore_windows', ''); +Irssi::settings_add_bool('trackbar', 'trackbar_use_status_window', 1); +Irssi::settings_add_bool('trackbar', 'trackbar_print_timestamp', 0); +Irssi::settings_add_bool('trackbar', 'trackbar_require_seen', 0); + +update_config(); + +Irssi::signal_add_last( 'mainwindow resized' => 'redraw_trackbars') + unless $old_irssi; + +Irssi::signal_register({'window trackbar added' => [qw/Irssi::UI::Window/]}); +Irssi::signal_register({'window trackbar seen' => [qw/Irssi::UI::Window/]}); +Irssi::signal_register({'gui page scrolled' => [qw/Irssi::UI::Window/]}); +Irssi::signal_add_last('gui page scrolled' => 'trackbar_update_seen'); + +Irssi::signal_add('setup changed' => 'update_config'); +Irssi::signal_add_priority('session save' => 'remove_all_trackbars', Irssi::SIGNAL_PRIORITY_HIGH-1); + +Irssi::signal_add('window changed' => 'sig_window_changed'); + +Irssi::command_bind('trackbar goto' => 'goto_trackbar'); +Irssi::command_bind('trackbar keep' => 'cmd_keep_once'); +Irssi::command_bind('trackbar mark' => 'cmd_mark'); +Irssi::command_bind('trackbar markvisible' => 'cmd_markvisible'); +Irssi::command_bind('trackbar markall' => 'cmd_markall'); +Irssi::command_bind('trackbar remove' => 'cmd_trackbar_remove_one'); +Irssi::command_bind('trackbar removeall' => 'cmd_remove_all_trackbars'); +Irssi::command_bind('trackbar redraw' => 'redraw_trackbars'); +Irssi::command_bind('trackbar' => 'trackbar_runsub'); +Irssi::command_bind('mark' => 'cmd_mark'); +Irssi::command_bind_last('help' => 'cmd_help'); + +Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'trackbar_loaded', $IRSSI{name}, $VERSION, $IRSSI{authors}); diff --git a/.irssi/scripts/scriptassist.pl b/.irssi/scripts/scriptassist.pl new file mode 100644 index 0000000..6870894 --- /dev/null +++ b/.irssi/scripts/scriptassist.pl @@ -0,0 +1,1229 @@ +# by Stefan "tommie" Tomanek +# +# scriptassist.pl + + +use strict; + +our $VERSION = '2003020806'; +our %IRSSI = ( + authors => 'Stefan \'tommie\' Tomanek', + contact => 'stefan@pico.ruhr.de', + name => 'scriptassist', + description => 'keeps your scripts on the cutting edge', + license => 'GPLv2', + url => 'http://irssi.org/scripts/', + modules => 'Data::Dumper LWP::UserAgent (GnuPG)', + commands => "scriptassist" +); + +our ($forked, %remote_db, $have_gpg, @complist); + +use Irssi 20020324; +use Data::Dumper; +use LWP::UserAgent; +use POSIX; + +# GnuPG is not always needed +$have_gpg = 0; +eval "use GnuPG qw(:algo :trust);"; +$have_gpg = 1 if not ($@); + +sub show_help { + my $help = "scriptassist $VERSION +/scriptassist check + Check all loaded scripts for new available versions +/scriptassist update + Update the selected or all script to the newest version +/scriptassist search + Search the script database +/scriptassist info + Display information about +".#/scriptassist ratings +# Retrieve the average ratings of the the scripts +#/scriptassist top +# Retrieve the first top rated scripts +"/scriptassist new + Display the newest scripts +".#/scriptassist rate