]> git.99rst.org Git - irssi-scripts.irssi.org.git/commitdiff
Added allowed users list to invitejoin script
authordedeibel <redacted>
Tue, 3 Jan 2017 20:10:02 +0000 (21:10 +0100)
committerdedeibel <redacted>
Tue, 17 Jan 2017 21:19:01 +0000 (22:19 +0100)
scripts/invitejoin.pl

index c69ed01e612c5f4e0e59f8d1413cb6801a53d0e7..f873dd5b8d9e7d51dd327e5a3f11068ea5f2c511 100644 (file)
@@ -24,7 +24,7 @@ use strict;
 use Irssi;
 use vars qw($VERSION %IRSSI);
 
-$VERSION = "0.01";
+$VERSION = "0.02";
 
 %IRSSI = (
     authors     => 'Geert Hauwaerts',
@@ -33,36 +33,200 @@ $VERSION = "0.01";
     description => 'This script will join a channel if somebody invites you to it.',
     license     => 'Public Domain',
     url         => 'http://irssi.hauwaerts.be/invitejoin.pl',
-    changed     => 'Sun Apr 11 12:38:18 2004',
+    changed     => 'Di 3. Jan 19:46:51 CET 2017',
 );
 
-## Comments and remarks.
-#
-# This script uses settings.
-# Use /SET to change the value or /TOGGLE to switch it on or off.
-#
-#    Setting:     invitejoin
-#    Description: If this setting is turned on, you will join the channel
-#                 when invite to.
-#
-##
+my $help = <<EOF;
+
+/SET    invitejoin 0|1
+/TOGGLE invitejoin
+          Description: If this setting is turned on, you will join the channel
+          when invited to.
+
+Default is to follow every invite, you can specify a list of allowed nicks.
+
+/INVITEJOIN [addnick <ircnet> <nick>]
+            [delnick <ircnet> <nick>]
+            [listnick]
+            [help]
 
+addnick:     Add a new nickname on the given net as allowed autoinvite source.
+delnick:     Delete a nickname from the allowed list.
+listnick:    Display the contents of the allowed nickname list.
+help:        Display this useful little helptext.
+
+Examples: (all on one line)
+/INVITEJOIN addnick Freenode ChanServ
+
+Note: This script doesn't allow wildcards
+EOF
+
+my @allowed_nicks = ();
+my $allowed_nicks_file = "invitejoin.nicks";
+
+my $irssidir = Irssi::get_irssi_dir();
 
 Irssi::theme_register([
+    'invitejoin_usage', '%R>>%n %_Invitejoin:%_ Insufficient parameters: Use "%_/INVITEJOIN help%_" for further instructions.',
+    'invitejoin_help', '$0',
     'invitejoin_loaded', '%R>>%n %_Scriptinfo:%_ Loaded $0 version $1 by $2.',
-    'invitejoin_invited', '%R>>%n %_Invitejoin:%_ Joined $1 (Invited by $0).'
+    'invitejoin_invited', '%R>>%n %_Invitejoin:%_ Joined $1 (Invited by $0).',
+    'invitejoin_usage_add_nick', '%R>>%n %_Invitejoin:%_ Insufficient parameters: Usage "%_/INVITEJOIN addnick ircnet ChanServ%_".',
+    'invitejoin_no_net', '%R>>%n %_Invitejoin:%_ Unknown Irssi ircnet %_$0%_.',
+    'saved_nick', '%R>>%n %_Invitejoin:%_ Added allowed nick "%_$1%_" on %_$0%_.',
+    'invitejoin_delusage', '%R>>%n %_Invitejoin:%_ Insufficient parameters: Usage "%_/INVITEJOIN delnick ircnet nick%_".',
+    'invitejoin_delled', '%R>>%n %_Invitejoin:%_ Deleted %_$1%_ on %_$0%_ from allowed list.',
+    'invitejoin_nfound', '%R>>%n %_Invitejoin:%_ The nick %_$1%_ on %_$0%_ could not be found.',
+    'allowed_nicks_info', '%_Ircnet             Nick%_',
+    'allowed_nicks_empty', '%R>>%n %_Invitejoin:%_ Your allowed nick list is empty.',
+    'allowed_nicks_print', '$[18]0 $1',
+    'invite_denied', '%R>>%n %_Invitejoin:%_ Invite from nick %_$1%_ on %_$0%_ to %_$2%_ not followed because it is not in the allowed list.',
 ]);
 
-sub invitejoin {
+sub load_allowed_nicks {
+    my ($file) = @_;
+    @allowed_nicks = ();
+    if (-e $file) {
+        local *F;
+        open(F, "<", $file);
+        local $/ = "\n";
+
+        while (<F>) {
+            chomp;
+            my $new_allowed = new_allowed_nick(split("\t"));
+            if (($new_allowed->{net} ne "") && ($new_allowed->{nick} ne "")) {
+                push(@allowed_nicks, $new_allowed);
+            }
+        }
+        close(F);
+    }
+}
+
+sub save_allowed_nicks {
+    my ($file) = @_;
+
+    if (-e $file) {
+        local *F;
+        open(F, ">", $file);
+
+        for my $allowed (@allowed_nicks) {
+            print(F join("\t", $allowed->{net}, $allowed->{nick}) . "\n");
+        }
+    
+        close(F);
+    } else {
+      open(F, ">", $file) or die "Can't create $file. Reason: $!";
+      close(F);
+      save_allowed_nicks($file);
+    }
+}
+
+sub new_allowed_nick {
+    my $anick = {};
+
+    $anick->{net}  = shift;
+    $anick->{nick} = shift;
+
+    return $anick;
+}
+
+sub add_allowed_nick {
+    my ($network, $nick) = split(" ", $_[0], 2);
+    my ($correct_net);
+    
+    if ($network eq "" || $nick eq "") {
+        Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'invitejoin_usage_add_nick');
+        return;
+    }
     
+    if ($network) {
+        my ($ircnet) = Irssi::chatnet_find($network);
+        if (!$ircnet) {
+            Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'invitejoin_no_net', $network);
+            return;
+        } else {
+            $correct_net = 1;
+        }
+    }
+    if ($correct_net && $nick) {
+        push(@allowed_nicks, new_allowed_nick($network, $nick));
+        save_allowed_nicks("$irssidir/$allowed_nicks_file");
+            
+        Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'saved_nick', $network, $nick);
+    }
+}
+
+sub del_allowed_nick {
+    my ($ircnet, $nick) = split(" ", $_[0], 2);
+
+    if ($ircnet eq "") {
+        Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'invitejoin_delusage');
+        return;
+    }
+
+    my $size_before = scalar(@allowed_nicks);
+    @allowed_nicks = grep { ! ($_->{net} eq $ircnet && $_->{nick} eq $nick) } @allowed_nicks;
+    my $size_after = scalar(@allowed_nicks);
+    
+    if ($size_after != $size_before) {
+        Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'invitejoin_delled', $ircnet, $nick);
+        save_allowed_nicks("$irssidir/$allowed_nicks_file");
+    } else {
+        Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'invitejoin_nfound', $ircnet, $nick);
+    }
+}
+
+sub list_allowed_nicks {
+    
+    if (@allowed_nicks == 0) {
+        Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'allowed_nicks_empty');
+    } else {
+        Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'allowed_nicks_info');
+
+        for my $allowed (@allowed_nicks) {
+            Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'allowed_nicks_print', $allowed->{net}, $allowed->{nick});
+        }
+    }
+}
+
+sub invitejoin_runsub {
+    
+    my ($data, $server, $item) = @_;
+    $data =~ s/\s+$//g;
+    
+    if ($data) {
+        Irssi::command_runsub('invitejoin', $data, $server, $item);
+    } else {
+        Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'invitejoin_usage');
+    }
+}
+
+sub is_allowed_nick {
+  my ($server, $nick) = @_;
+
+  return 1 unless @allowed_nicks < 1;
+
+  return (grep {
+    $_->{net}  eq $server->{tag} &&
+    $_->{nick} eq $nick
+  } @allowed_nicks) > 0;
+}
+
+sub invitejoin {
     my ($server, $channel, $nick, $address) = @_;
     my $invitejoin = Irssi::settings_get_bool('invitejoin');
 
     if ($invitejoin) {
+      if (is_allowed_nick($server, $nick)) {
         $server->command("join $channel");
         
         Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'invitejoin_invited', $nick, $channel);
         Irssi::signal_stop();
+      }
+      else {
+        Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'invite_denied', $server->{tag}, $nick, $channel);
+      }
     }
 }
 
@@ -70,4 +234,12 @@ Irssi::signal_add('message invite', 'invitejoin');
 
 Irssi::settings_add_bool('invitejoin', 'invitejoin' => 1);
 
+load_allowed_nicks("$irssidir/$allowed_nicks_file");
+
+Irssi::command_bind('invitejoin', 'invitejoin_runsub');
+Irssi::command_bind('invitejoin addnick',  'add_allowed_nick');
+Irssi::command_bind('invitejoin delnick',  'del_allowed_nick');
+Irssi::command_bind('invitejoin listnick', 'list_allowed_nicks');
+Irssi::command_bind('invitejoin help' => sub { Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'invitejoin_help', $help) });
+
 Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'invitejoin_loaded', $IRSSI{name}, $VERSION, $IRSSI{authors});
git clone https://git.99rst.org/PROJECT