summaryrefslogtreecommitdiffstats
path: root/scripts/chanact.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/chanact.pl')
-rw-r--r--scripts/chanact.pl181
1 files changed, 107 insertions, 74 deletions
diff --git a/scripts/chanact.pl b/scripts/chanact.pl
index ee6ef3c..4a42364 100644
--- a/scripts/chanact.pl
+++ b/scripts/chanact.pl
@@ -1,20 +1,25 @@
use Irssi 20020101.0001 ();
+
use strict;
-# FIXME use warning;
+use warnings;
+
use Irssi::TextUI;
use vars qw($VERSION %IRSSI);
-$VERSION = "0.5.15";
+$VERSION = "0.6.0";
%IRSSI = (
- authors => 'BC-bd, Veli',
- contact => 'bd@bc-bd.org, veli@piipiip.net',
+ authors => 'BC-bd',
+ contact => 'bd@bc-bd.org',
name => 'chanact',
description => 'Adds new powerful and customizable [Act: ...] item (chanelnames,modes,alias). Lets you give alias characters to windows so that you can select those with meta-<char>',
license => 'GNU GPLv2 or later',
- url => 'https://bc-bd.org/svn/repos/irssi/chanact'
+ url => 'http://bc-bd.org/blog/irssi/'
);
+# Please send patches / pull requests to the email listed unter contact above
+# and not to the irssi/scripts.irssi.org repository on github.
+
# Adds new powerful and customizable [Act: ...] item (chanelnames,modes,alias).
# Lets you give alias characters to windows so that you can select those with
# meta-<char>.
@@ -27,19 +32,22 @@ $VERSION = "0.5.15";
# Contributors
#########
#
-# veli@piipiip.net /window_alias code
-# qrczak@knm.org.pl chanact_abbreviate_names
-# qerub@home.se Extra chanact_show_mode and chanact_chop_status
+# veli@piipiip.net original /window_alias code
+# qrczak@knm.org.pl chanact_abbreviate_names
+# qerub@home.se Extra chanact_show_mode and chanact_chop_status
# madduck@madduck.net Better channel aliasing (case-sensitive, cross-network)
# chanact_filter_windowlist basis
-# Jan 'jast' Krueger <jast@heapsort.de>, 2004-06-22
-# Ivo Timmermans <ivo@o2w.nl> win->{hilight} patch
-# Trevor 'tee' Slocum <tslocum@gmail.com> Case-insensitive aliases, bugfix
-#
+# jast@heapsort.de Updated documentation
+# ivo@o2w.nl win->{hilight} patch
+# Bazerka base patch for sorting by level change
+# updated documentation
+# mrtnpaolo@gmail.com rename commands
+# tslocum@gmail.com Case-insensitive aliases
+#
#########
# USAGE
###
-#
+#
# copy the script to ~/.irssi/scripts/
#
# In irssi:
@@ -61,11 +69,11 @@ $VERSION = "0.5.15";
# aliases to your windows. Go to the window you want to give the alias to
# and say:
#
-# /window_alias <alias char>
+# /chanact_window_alias <alias char>
#
# You can remove the aliases with from an aliased window:
#
-# /window_unalias
+# /chanact_window_unalias
#
# To see a list of your windows use:
#
@@ -100,11 +108,11 @@ $VERSION = "0.5.15";
# $H : Start highlightning
# $S : Stop highlightning
# * example:
-#
+#
# /set chanact_display $H$N:$M.$S$C
-#
+#
# will give you on #irssi.de if you have voice
-#
+#
# [3:+.#irssi.de]
#
# with '3:+.' highlighted and the channel name printed in regular color
@@ -113,12 +121,26 @@ $VERSION = "0.5.15";
# * ON : Aliases are case-sensitive
# * OFF : Aliases are case-insensitive
#
-# Existing aliases must be reapplied after switching to case-insensitive.
+# Existing aliases must be reapplied after changing this option
+#
+# Switching from OFF to ON _after_ aliases have been defined, and
+# then redefining or changing an existing alias will leave some
+# bindings behind, e.g.
+#
+# /set chanact_case_sensitive OFF
+# /chanact_window_alias x
+#
+# -> window reachable with meta-x/meta-X
+#
+# /set chanact_case_sensitive ON
+# /chanact_window_alias y
+#
+# -> window reachable with meta-y/meta-X
#
# /set chanact_display_alias <string>
# as 'chanact_display' but is used if the window has an alias and
# 'chanact_show_alias' is set to on.
-#
+#
# /set chanact_show_names <ON|OFF>
# * ON : show the channelnames after the number/alias
# * OFF : don't show the names
@@ -141,7 +163,7 @@ $VERSION = "0.5.15";
#
# /set chanact_autorenumber <ON|OFF>
# * ON : Move the window automatically to first available slot
-# starting from "chanact_renumber_start" when assigning
+# starting from "chanact_renumber_start" when assigning
# an alias to window. Also moves the window back to a
# first available slot from refnum 1 when the window
# loses it's alias.
@@ -160,7 +182,7 @@ $VERSION = "0.5.15";
# beginning of the channel name.
# * example :
# To shorten a lot of debian channels:
-#
+#
# /set chanact_remove_prefix deb(ian.(devel-)?)?
#
# /set chanact_filter <int>
@@ -174,7 +196,7 @@ $VERSION = "0.5.15";
# * <string> : space-separated list of windows for which to use
# chanact_filter_windowlist_level instead of
# chanact_filter.
-#
+#
# Alternatively, an entry can be postfixed with
# a comma (',') and the level to use for that
# window.
@@ -232,15 +254,14 @@ sub expand {
# but we dont need to recreate the item every time so we first
# check if something has changed and only then we recreate the string
# this might just save some cycles
-# FIXME implement $get_size_only check, and user $item->{min|max-size}
sub chanact {
my ($item, $get_size_only) = @_;
if ($needRemake) {
remake();
}
-
- $item->default_handler($get_size_only, $actString, undef, 1);
+
+ $item->default_handler($get_size_only, $actString, "", 1);
}
# build a hash to easily access special levels based on
@@ -268,13 +289,13 @@ sub calculate_levels(@) {
my %levels;
foreach my $win (@windows) {
- # FIXME we could use the next statements to weed out entries in
- # @windows that we will not need later on
!ref($win) && next;
my $name = $win->get_active_name;
+ # skip nameless windows
+ next unless $name;
- if (exists($matches{$name})) {
+ if ($name && exists($matches{$name})) {
$levels{$name} = $matches{$name};
} else {
$levels{$name} = $default;
@@ -293,7 +314,7 @@ sub calculate_levels(@) {
# this is the real creation method
sub remake() {
my ($afternumber,$finish,$hilight,$mode,$number,$display,@windows);
- my $separator = Irssi::settings_get_str('chanact_separator');
+ my $separator = Irssi::settings_get_str('chanact_separator');
my $abbrev = Irssi::settings_get_int('chanact_abbreviate_names');
my $remove_prefix = Irssi::settings_get_str('chanact_remove_prefix');
my $remove_hash = Irssi::settings_get_bool('chanact_remove_hash');
@@ -317,6 +338,8 @@ sub remake() {
$type = $active->{type} if $active;
my $name = $win->get_active_name;
+ # skip windows without a name
+ next unless $name;
my $filter_level =
$type eq 'QUERY' ? $levels{'@QUERIES'} : $levels{$name};
@@ -334,7 +357,7 @@ sub remake() {
&& $name eq "(status)") {
$name = "S";
}
-
+
# check if we should show the mode
$mode = "";
if ($type eq "CHANNEL") {
@@ -346,7 +369,7 @@ sub remake() {
my $nick = $channel->nick_find($server->{nick});
!ref($nick) && next;
-
+
if ($nick->{op}) {
$mode = "@";
} elsif ($nick->{voice}) {
@@ -377,13 +400,13 @@ sub remake() {
$name =~ s/^[&#+!=]//;
}
- if (Irssi::settings_get_bool('chanact_show_alias') == 1 &&
+ if (Irssi::settings_get_bool('chanact_show_alias') == 1 &&
$win->{name} =~ /^([a-zA-Z+]):(.+)$/) {
$number = "$1";
- $display = Irssi::settings_get_str('chanact_display_alias');
+ $display = Irssi::settings_get_str('chanact_display_alias');
} else {
$number = $win->{refnum};
- $display = Irssi::settings_get_str('chanact_display');
+ $display = Irssi::settings_get_str('chanact_display');
}
# fixup { and } in nicks, those are used by irssi themes
@@ -396,7 +419,7 @@ sub remake() {
if ($actString ne "") {
# Remove the last separator
$actString =~ s/$separator$//;
-
+
$actString = "{sb ".Irssi::settings_get_str('chanact_header').$actString."}";
}
@@ -429,12 +452,33 @@ sub setup_changed {
chanactHasChanged();
}
+# Remove key binding for current window
+sub unbind {
+ my ($name, $server) = @_;
+
+ # chanact'ified windows have a name like this: X:servertag/name. if we
+ # can't find anything like this we return and do not unbind nor renumber
+ # anything
+ my ($key, $tag) = split(/:/, $name);
+ return unless $tag;
+
+ ($tag, $name) = split('/', $tag);
+ return unless (length($key) == 1);
+
+ if (Irssi::settings_get_bool('chanact_case_sensitive')) {
+ $server->command("/bind -delete meta-$key");
+ } else {
+ $server->command("/bind -delete meta-" . lc($key));
+ $server->command("/bind -delete meta-" . uc($key));
+ }
+}
+
# Remove alias
sub cmd_window_unalias {
- my ($data, $server, $witem, $internal) = @_;
+ my ($data, $server, $witem) = @_;
- if ($data ne '' && !$internal) {
- Irssi::print("chanact: /window_unalias does not take any ".
+ if ($data ne '') {
+ Irssi::print("chanact: /chanact_window_unalias does not take any ".
"parameters, Run it in the window you want to unalias");
return;
}
@@ -442,24 +486,7 @@ sub cmd_window_unalias {
my $win = Irssi::active_win();
my $name = Irssi::active_win()->{name};
- # chanact'ified windows have a name like this: X:servertag/name
- my ($key, $tag) = split(/:/, $name);
- ($tag, $name) = split('/', $tag);
-
- # remove alias only of we have a single character keybinding, if we
- # haven't the name was not set by chanact, so we won't blindly unset
- # stuff
- if (length($key) == 1) {
- if (Irssi::settings_get_bool('chanact_case_sensitive')) {
- $server->command("/bind -delete meta-$data");
- } else {
- $server->command("/bind -delete meta-" . lc($data));
- $server->command("/bind -delete meta-" . uc($data));
- }
- } elsif (!$internal) {
- Irssi::print("chanact: could not determine keybinding. ".
- "Won't unbind anything");
- }
+ unbind($name, $server);
# set the windowname back to it's old one. We don't bother checking
# for a vaild name here, as we want to remove the current one and if
@@ -472,7 +499,7 @@ sub cmd_window_unalias {
# we are renumbering, so move the window to the lowest available
# refnum.
my $refnum = 1;
- while (Irssi::window_find_refnum($refnum) ne "") {
+ while (Irssi::window_find_refnum($refnum)) {
$refnum++;
}
@@ -480,14 +507,13 @@ sub cmd_window_unalias {
Irssi::print("chanact: moved wintow to refnum $refnum");
}
-# function by veli@piipiip.net
# Make an alias
sub cmd_window_alias {
my ($data, $server, $witem) = @_;
my $rn_start = Irssi::settings_get_int('chanact_renumber_start');
unless ($data =~ /^[a-zA-Z+]$/) {
- Irssi::print("Usage: /window_alias <char>");
+ Irssi::print("Usage: /chanact_window_alias <char>");
return;
}
@@ -508,23 +534,23 @@ sub cmd_window_alias {
$winname = $window->{name};
}
- cmd_window_unalias($data, $server, $witem, 1);
+ unbind($window->{name}, $server);
my $winnum = $window->{refnum};
-
+
if (Irssi::settings_get_bool('chanact_autorenumber') == 1 &&
$window->{refnum} < $rn_start) {
my $old_refnum = $window->{refnum};
$winnum = $rn_start;
-
+
# Find the first available slot and move the window
- while (Irssi::window_find_refnum($winnum) ne "") { $winnum++; }
+ while (Irssi::window_find_refnum($winnum)) { $winnum++; }
$window->set_refnum($winnum);
-
+
Irssi::print("Moved the window from $old_refnum to $winnum");
}
-
+
my $winserver = $window->{active_server}->{tag};
my $winhandle = "$winserver/$winname";
# cmd_window_unalias relies on a certain format here
@@ -543,8 +569,8 @@ sub cmd_window_alias {
$needRemake = 1;
# Window alias command
-Irssi::command_bind('window_alias','cmd_window_alias');
-Irssi::command_bind('window_unalias','cmd_window_unalias');
+Irssi::command_bind('chanact_window_alias','cmd_window_alias');
+Irssi::command_bind('chanact_window_unalias','cmd_window_unalias');
# our config item
Irssi::settings_add_str('chanact', 'chanact_display', '$H$N:$M$C$S');
@@ -587,8 +613,15 @@ Irssi::signal_add('nick mode changed', 'chanactHasChanged');
#
# Changelog
#
-# 0.5.15
-# - fixed unbind error when aliasing a previously un-aliased window
+# 0.6.0
+# - fixed URL
+# - now with 'use warnings'
+# - fix cmd_window_unalias call from cmd_window_alias
+# - fix Use of uninitialized value $name in hash element warnings
+# - return from cmd_window_unalias if the window has no valid
+# chanact'ified name
+# - rename /window_(un)alias to /chanact_window_(un)alias
+# - fix refnum renumber race
# - added setting to allow case-insensitive window aliases
#
# 0.5.14
@@ -645,10 +678,10 @@ Irssi::signal_add('nick mode changed', 'chanactHasChanged');
#
# 0.5.6
# - fixed a bug (#1) reported by Wouter Coekaert
-#
+#
# 0.5.5
# - some speedups from David Leadbeater <dgl@dgl.cx>
-#
+#
#
# 0.5.4
# - added help for chanact_display_alias
@@ -662,7 +695,7 @@ Irssi::signal_add('nick mode changed', 'chanactHasChanged');
# - removed unused chanact_show_name settings (thx to Qerub)
# - fixed $mode display
# - guarded reference operations to (hopefully) fix errors on server disconnect
-#
+#
# 0.5.1
# - small typo fixed
#
@@ -670,7 +703,7 @@ Irssi::signal_add('nick mode changed', 'chanactHasChanged');
# - changed chanact_show_mode to chanact_display. reversed changes from
# Qerub through that, but kept funcionality.
# - removed chanact_color_all since it is no longer needed
-#
+#
# 0.4.3
# - changes by Qerub
# + added chanact_show_mode to show the mode just before the channel name