summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--scripts/bitlbee_hide_password.pl64
-rw-r--r--scripts/chansort_configurable.pl144
-rw-r--r--scripts/msg2notice_regex.pl56
-rw-r--r--scripts/munge_own_nickname_to_username.pl79
-rw-r--r--scripts/slack_strip_auto_cc.pl35
5 files changed, 378 insertions, 0 deletions
diff --git a/scripts/bitlbee_hide_password.pl b/scripts/bitlbee_hide_password.pl
new file mode 100644
index 0000000..feb86b2
--- /dev/null
+++ b/scripts/bitlbee_hide_password.pl
@@ -0,0 +1,64 @@
+use strict;
+use warnings;
+use Irssi;
+
+our $VERSION = '1.0';
+our %IRSSI = (
+ authors => 'Ævar Arnfjörð Bjarmason',
+ contact => 'avarab@gmail.com',
+ name => 'bitlbee_hide_password.pl',
+ description => 'Hide your REGISTER and IDENTIFY password lines in &bitlbee from screen & logs ',
+ license => 'Public Domain',
+ url => 'http://scripts.irssi.org & https://github.com/avar/dotfiles/blob/master/.irssi/scripts/bitlbee_hide_password.pl',
+);
+
+# HOWTO:
+#
+# /load bitlbee_hide_password.pl
+#
+# When you're using Bitlbee and do either:
+#
+# REGISTER <password>
+#
+# or:
+#
+# IDENTIFY <password>
+#
+# Your password will be shown on screen, and more importantly logged
+# in your logfiles. This extension intercepts these commands in your
+# &bitlbee channel and hides it from screen & logs.
+#
+# Note: You can avoid the password going into the log without this
+# plugin by doing:
+#
+# IDENTIFY
+# /OPER
+#
+# But this script also makes sure that your REGISTER commands will be
+# hidden, and of course "IDENTIFY <password>" commands if you ever
+# forget to IDENTIFY with /OPER.
+
+sub msg_intercept_bitlbee_password_lines {
+ my ($tdest, $data, $stripped) = @_;
+
+ # The $tdest object has various other things, like ->{target},
+ # ->{window} (object) etc.
+ my $server = $tdest->{server};
+
+ # Some events just have ->{window} and no ->{server}, we can
+ # ignore those
+ return unless $server;
+
+ # We only care about the &bitlbee control channel
+ my $target = $tdest->{target};
+ return unless $target eq '&bitlbee';
+
+ # We're matching against $stripped but replacing both because the
+ # $data thing is escaped and much harder to match against.
+ if ($stripped =~ /^<.?[^>]+> (?:register|identify) .+/si) {
+ s/(identify|register) .+/$1 <password stripped by $IRSSI{name}>/i for $data, $stripped;
+ Irssi::signal_continue($tdest, $data, $stripped);
+ }
+}
+
+Irssi::signal_add_first('print text', 'msg_intercept_bitlbee_password_lines');
diff --git a/scripts/chansort_configurable.pl b/scripts/chansort_configurable.pl
new file mode 100644
index 0000000..639b822
--- /dev/null
+++ b/scripts/chansort_configurable.pl
@@ -0,0 +1,144 @@
+use strict;
+use warnings;
+use Irssi;
+use File::Spec::Functions qw(catdir catfile);
+
+our $VERSION = '1.0';
+our %IRSSI = (
+ authors => 'Ævar Arnfjörð Bjarmason',
+ contact => 'avarab@gmail.com',
+ name => 'chansort_configurable',
+ description => "Sort channels & query windows in a configurable way, based on Peder Stray's chansort.pl",
+ license => 'GPL',
+ url => 'http://scripts.irssi.org & https://github.com/avar/dotfiles/blob/master/.irssi/scripts/chansort_configurable.pl',
+);
+
+# HOWTO:
+#
+# /load chansort_configurable.pl
+# /set chansort_configurable_autosort ON
+#
+# This is a plugin that allows you to sort your windows in any
+# arbitrary way using a callback you provide. I originally forked this
+# from chansort.pl on https://scripts.irssi.org which is a similar
+# plugin that just sorts the windows in a pre-determined order.
+#
+# By default this plugin will sort things in a pre-determined order,
+# but you can create a
+# ~/.irssi/scripts/chansort_configurable_callback.pl file with a
+# subroutine that we'll call inside sort() (so the $a and $b sort
+# variables are available). E.g. creating the file as:
+#
+# use strict;
+# use warnings;
+#
+# sub {
+# rand() <=> rand()
+# }
+#
+# Would sort your windows in a random order. This would be somewhat
+# more useful:
+#
+# use strict;
+# use warnings;
+#
+# my $n = -9001;
+# my %hardcoded_positioning = (
+# freenode => {
+# '#irssi' => $n++, # 2
+# '#freenode' => $n++, # 3
+# },
+# );
+#
+# sub {
+# # Provide a default sorter with some sane defaults
+# exists($a->{chatnet}) <=> exists($b->{chatnet})
+# ||
+# # "CHANNEL" will sort before "QUERY"
+# $a->{type} cmp $b->{type}
+# ||
+# # Cluster chatnets alphabetically
+# $a->{chatnet} cmp $b->{chatnet}
+# ||
+# # Put & channels like &bitlbee before normal channels
+# ($b->{name} =~ /^&/) <=> ($a->{name} =~ /^&/)
+# ||
+# # Allow for hardcoding the positioning of channels
+# # within a network
+# ($hardcoded_positioning{$a->{chatnet}}->{$a->{name}} || 0) <=> ($hardcoded_positioning{$b->{chatnet}}->{$b->{name}} || 0)
+# ||
+# # Default to sorting alphabetically
+# $a->{name} cmp $b->{name}
+# };
+#
+# The above sorter will sort channels before queries, and networks
+# alphabetically, but will sort make the #irssi channel be the first
+# channel on the freenode network.
+
+my $sort_callback_file = catfile(catdir(Irssi::get_irssi_dir(), 'scripts'), 'chansort_configurable_callback.pl');
+my $sort_callback = do $sort_callback_file;
+
+sub cmd_chansort_configurable {
+ my @windows;
+
+ for my $window (Irssi::windows()) {
+ my $active = $window->{active};
+
+ push @windows => {
+ # Extract these to the top-level for easy extraction
+ refnum => $window->{refnum},
+ (exists $active->{server}
+ # This is for everything except the (status) window
+ ? (
+ name => $active->{name},
+ type => $active->{type},
+ chatnet => $active->{server}->{chatnet},
+ )
+ : ()),
+ # The raw window object with all the details.
+ window => $window,
+ };
+ }
+
+ @windows = sort {
+ (
+ $sort_callback
+ ? ($sort_callback->())
+ : (
+ # Provide a default sorter with some sane defaults
+ exists($a->{chatnet}) <=> exists($b->{chatnet})
+ ||
+ # "CHANNEL" will sort before "QUERY"
+ $a->{type} cmp $b->{type}
+ ||
+ # Cluster chatnets alphabetically
+ $a->{chatnet} cmp $b->{chatnet}
+ ||
+ # Put & channels like &bitlbee before normal channels
+ ($b->{name} =~ /^&/) <=> ($a->{name} =~ /^&/)
+ ||
+ # Default to sorting alphabetically
+ $a->{name} cmp $b->{name}
+ )
+ )
+ } @windows;
+
+ my $i = 0;
+ for my $window (@windows) {
+ $i++;
+ $window->{window}->command("WINDOW MOVE $i");
+ }
+
+ return;
+}
+
+sub sig_chansort_configurable_trigger {
+ return unless Irssi::settings_get_bool('chansort_configurable_autosort');
+ cmd_chansort_configurable();
+}
+
+Irssi::command_bind('chansort_configurable', 'cmd_chansort_configurable');
+Irssi::settings_add_bool('chansort_configurable', 'chansort_configurable_autosort', 0);
+Irssi::signal_add_last('window item name changed', 'sig_chansort_configurable_trigger');
+Irssi::signal_add_last('channel created', 'sig_chansort_configurable_trigger');
+Irssi::signal_add_last('query created', 'sig_chansort_configurable_trigger');
diff --git a/scripts/msg2notice_regex.pl b/scripts/msg2notice_regex.pl
new file mode 100644
index 0000000..9ecedf6
--- /dev/null
+++ b/scripts/msg2notice_regex.pl
@@ -0,0 +1,56 @@
+use strict;
+use warnings;
+use Irssi;
+
+our $VERSION = '1.0';
+our %IRSSI = (
+ authors => 'Fernando Vezzosi & Ævar Arnfjörð Bjarmason',
+ contact => 'irssi@repnz.net & avarab@gmail.com',
+ name => 'msg2notice_regex.pl',
+ description => 'For a configured list of nicks or nicks matching a regex, convert all their messages to a notices',
+ license => 'Public Domain',
+ url => 'http://scripts.irssi.org & https://github.com/avar/dotfiles/blob/master/.irssi/scripts/msg2notice_regex.pl & https://github.com/bucciarati/irssi-script-msg_to_notice',
+);
+
+# HOWTO:
+#
+# /load msg2notice_regex.pl
+# /set noticeable_nicks ~\[bot\]$,~mon-[0-9]+$,~^mon-.*-[0-9]+$,root,deploy,log,jenkins,nagmetoo
+#
+# The nicks that match will be turned into notices, useful for marking
+# bots as such. Note that if the nicks start with ~ the rest is taken
+# to be a regex. Due to limitations of our dummy parser you can't use
+# {x,y} character classes or other regex constructs that require a
+# comma, but usually that's something you can work around.
+
+sub privmsg_msg2notice_regex {
+ use Data::Dumper;
+ my ($server, $data, $nick, $nick_and_address) = @_;
+ my ($target, $message) = split /:/, $data, 2;
+
+ # Irssi::print("server<$server> data<$data>[$target:$message] nick<$nick> mask<$nick_and_address>");
+ my $is_noticeable = 0;
+ for my $noticeable_nick ( split /[\s,]+/, Irssi::settings_get_str('noticeable_nicks') ) {
+ $noticeable_nick =~ s/\A \s+//x;
+ $noticeable_nick =~ s/\s+ \z//x;
+ my $is_regexp; $is_regexp = 1 if $noticeable_nick =~ s/^~//;
+
+ # Irssi::print("Checking <$nick> to <$noticeable_nick> via <" . ($is_regexp ? "rx" : "eq") . ">");
+ if ( $is_regexp and $nick =~ $noticeable_nick ) {
+ # Irssi::print("Matched <$nick> to <$noticeable_nick> via <rx>");
+ $is_noticeable = 1;
+ last;
+ } elsif ( not $is_regexp and lc $noticeable_nick eq lc $nick ){
+ # Irssi::print("Matched <$nick> to <$noticeable_nick> via <eq>");
+ $is_noticeable = 1;
+ last;
+ }
+ }
+ return unless $is_noticeable;
+
+ Irssi::signal_emit('event notice', $server, $data, $nick, $nick_and_address);
+ Irssi::signal_stop();
+}
+
+Irssi::settings_add_str('msg_to_notice', 'noticeable_nicks', '~\[bot\]$,root,deploy');
+Irssi::signal_add('event privmsg', 'privmsg_msg2notice_regex');
diff --git a/scripts/munge_own_nickname_to_username.pl b/scripts/munge_own_nickname_to_username.pl
new file mode 100644
index 0000000..85e9328
--- /dev/null
+++ b/scripts/munge_own_nickname_to_username.pl
@@ -0,0 +1,79 @@
+use strict;
+use warnings;
+use Irssi;
+
+our $VERSION = '1.0';
+our %IRSSI = (
+ authors => 'Ævar Arnfjörð Bjarmason',
+ contact => 'avarab@gmail.com',
+ name => 'munge_own_nickname_to_username.pl',
+ description => 'Changes messages from myself to appear to come from my username, not my nickname',
+ license => 'Public Domain',
+ url => 'http://scripts.irssi.org & https://github.com/avar/dotfiles/blob/master/.irssi/scripts/munge_own_nickname_to_username.pl',
+);
+
+# HOWTO:
+#
+# /load munge_own_nickname_to_username.pl
+#
+# This is for use on servers where your NICK is forced upon you,
+# e.g. when connecting to some corporate maintained Bitlbee server
+# that has LDAP-connected accounts.
+#
+# In that case your NICK may not be what you're used to. This
+# intercepts "print text" events from irssi and rewrites them so that
+# they appear to come from the "nick" configured in
+# settings.core.user_name instead of whatever your nickname is on the
+# server.
+#
+# The result is that you'll appear to yourself to have your "correct"
+# nickname. The illusion goes pretty far, even down to your IRC logs,
+# but of course everyone else will see you as your real nickname, or
+# maybe your username (I use this for a IRC->Slack/Bitlee gateway).
+#
+# This should just automatically work, it'll detect what your nick is,
+# what you're username is, and automatically substitute
+# s/nick/username/ if applicable.
+#
+# Note that if your theme adjusts the msgnick rendering this may not
+# work, because we try to match "< yournick>" in the line. We could
+# potentially do better, please contact the author if you run into
+# issues with this.
+
+sub msg_rename_myself_in_printed_text {
+ my ($tdest, $data, $stripped) = @_;
+
+ # The $tdest object has various other things, like ->{target},
+ # ->{window} (object) etc.
+ my $server = $tdest->{server};
+
+ # Some events just have ->{window} and no ->{server}, we can
+ # ignore those
+ return unless $server;
+
+ # Unpack our configuration from $server.
+ my $server_username = $server->{username};
+ my $server_nick = $server->{nick};
+
+ # We have nothing to do here, our nick is already the same as our
+ # username.
+ return if $server_username eq $server_nick;
+
+ # We're matching against $stripped but replacing both because the
+ # $data thing is escaped and much harder to match against.
+ #
+ # We're just replacing nick mentions, so e.g. if you say "Hi I'm
+ # bob here but my username is bobby" it won't turn into "Hi I'm
+ # bobby here but my username is bobby".
+ #
+ # The illusion here isn't complete, e.g. if you do /NAMES your
+ # nick will show up and not your username, but I consider that a
+ # feature.
+ if ($stripped =~ /^<.?\Q$server_nick\E> /s) {
+ s/\Q$server_nick\E/$server_username/ for $data, $stripped;
+
+ Irssi::signal_continue($tdest, $data, $stripped);
+ }
+}
+
+Irssi::signal_add_first('print text', 'msg_rename_myself_in_printed_text');
diff --git a/scripts/slack_strip_auto_cc.pl b/scripts/slack_strip_auto_cc.pl
new file mode 100644
index 0000000..b4fac4e
--- /dev/null
+++ b/scripts/slack_strip_auto_cc.pl
@@ -0,0 +1,35 @@
+use strict;
+use warnings;
+use Irssi;
+
+our $VERSION = '1.0';
+our %IRSSI = (
+ authors => 'Ævar Arnfjörð Bjarmason',
+ contact => 'avarab@gmail.com',
+ name => 'slack_strip_auto_cc.pl',
+ description => 'Strips the annoying mentions of your nickname on Slack via [cc: <you>]',
+ license => 'Public Domain',
+ url => 'http://scripts.irssi.org & https://github.com/avar/dotfiles/blob/master/.irssi/scripts/slack_strip_auto_cc.pl',
+);
+
+# HOWTO:
+#
+# /load slack_strip_auto_cc.pl
+#
+# This should just automatically work, it'll detect if you're using
+# the slack IRC gateway and auto-detect the nick it should be
+# stripping as well.
+
+sub privmsg_slack_strip_auto_cc {
+ my ($server, $data, $nick, $nick_and_address) = @_;
+ my ($target, $message) = split /:/, $data, 2;
+
+ return unless $server->{address} =~ /irc\.slack\.com$/s;
+ my $wanted_nick = $server->{wanted_nick};
+ return unless $message =~ s/ \[cc: \Q$wanted_nick\E\]$//s;
+
+ my $new_data = "$target:$message";
+ Irssi::signal_continue($server, $new_data, $nick, $nick_and_address);
+}
+
+Irssi::signal_add('event privmsg', 'privmsg_slack_strip_auto_cc');