]> git.99rst.org Git - irssi-scripts.irssi.org.git/commitdiff
Submit my collection of scripts from my dotfiles.git
authorÆvar Arnfjörð Bjarmason <redacted>
Tue, 15 Mar 2016 17:52:13 +0000 (17:52 +0000)
committerÆvar Arnfjörð Bjarmason <redacted>
Wed, 16 Mar 2016 11:07:11 +0000 (11:07 +0000)
These are all irssi scripts that I maintain & use myself that I think
are useful for general use, none of this has anything hardcoded related
to me and when applicable has a configurable interface.

scripts/bitlbee_hide_password.pl [new file with mode: 0644]
scripts/chansort_configurable.pl [new file with mode: 0644]
scripts/msg2notice_regex.pl [new file with mode: 0644]
scripts/munge_own_nickname_to_username.pl [new file with mode: 0644]
scripts/slack_strip_auto_cc.pl [new file with mode: 0644]

diff --git a/scripts/bitlbee_hide_password.pl b/scripts/bitlbee_hide_password.pl
new file mode 100644 (file)
index 0000000..feb86b2
--- /dev/null
@@ -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 (file)
index 0000000..639b822
--- /dev/null
@@ -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 (file)
index 0000000..9ecedf6
--- /dev/null
@@ -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 (file)
index 0000000..85e9328
--- /dev/null
@@ -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 (file)
index 0000000..b4fac4e
--- /dev/null
@@ -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');
git clone https://git.99rst.org/PROJECT