diff options
| author | dedeibel | 2017-01-17 20:26:41 +0100 | 
|---|---|---|
| committer | dedeibel | 2017-01-20 09:43:48 +0100 | 
| commit | dd9f917353b3486195ffc11026ccdd95beb93d07 (patch) | |
| tree | 303323dd5095b959522683450a48caa2d5e70aaa /scripts/invitejoin.pl | |
| parent | 6342d84f5f6871442f61b4f0c7c262eb7cf4c474 (diff) | |
| download | scripts.irssi.org-dd9f917353b3486195ffc11026ccdd95beb93d07.tar.bz2 | |
Invitejoin refactoring of the load and save functionallity as of the nickserv script. Added nicklist empty notice. Validated nick name against being empty.
Diffstat (limited to 'scripts/invitejoin.pl')
| -rw-r--r-- | scripts/invitejoin.pl | 162 | 
1 files changed, 111 insertions, 51 deletions
| diff --git a/scripts/invitejoin.pl b/scripts/invitejoin.pl index 38205c2..d3b5871 100644 --- a/scripts/invitejoin.pl +++ b/scripts/invitejoin.pl @@ -24,7 +24,7 @@ use strict;  use Irssi;  use vars qw($VERSION %IRSSI); -$VERSION = "0.02"; +$VERSION = '0.02';  %IRSSI = (      authors     => 'Geert Hauwaerts', @@ -32,8 +32,8 @@ $VERSION = "0.02";      name        => 'invitejoin.pl',      description => 'This script will join a channel if somebody invites you to it.',      license     => 'Public Domain', -    url         => 'http://irssi.hauwaerts.be/invitejoin.pl', -    changed     => 'Di 3. Jan 19:46:51 CET 2017', +    url         => 'https://github.com/irssi/scripts.irssi.org/blob/master/scripts/invitejoin.pl', +    changed     => 'Di 17. Jan 19:32:45 CET 2017',  );  my $help = <<EOF; @@ -74,62 +74,107 @@ Irssi::theme_register([      '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%_.', +    'nick_already_present', '%R>>%n %_Invitejoin:%_ Nick already present.',      '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_empty', '%R>>%n %_Invitejoin:%_ Your allowed nick list is empty. All invites will be followed.',      '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 load_allowed_nicks {      my ($file) = @_; -    @allowed_nicks = (); + +    @allowed_nicks = load_file($file, sub { +        my $new_allowed = new_allowed_nick(@_); + +        return undef if ($new_allowed->{net} eq '' || $new_allowed->{nick} eq ''); +        return $new_allowed; +    }); +} + +sub save_allowed_nicks { +    my ($file) = @_; +    save_file($file, \@allowed_nicks, \&allowed_nick_to_list); +} + +sub allowed_nick_to_list { +    my $allowed_nick = shift; + +    return ( +        $allowed_nick->{net}, +        $allowed_nick->{nick} +    ); +} + +sub new_allowed_nick { +    return { +        net   => shift, +        nick  => shift +    }; +} + +# file: filename to be read +# parse_line_fn: receives array of entries of a single line as input, should +#     return parsed data object or undef in the data is incomplete +# returns: parsed data array +sub load_file { +    my ($file, $parse_line_fn) = @_; +    my @parsed_data = (); +      if (-e $file) {          open(my $fh, "<", $file);          local $/ = "\n";          while (<$fh>) {              chomp; -            my $new_allowed = new_allowed_nick(split("\t")); -            if (($new_allowed->{net} ne "") && ($new_allowed->{nick} ne "")) { -                push(@allowed_nicks, $new_allowed); -            } +            my $data = $parse_line_fn->(split("\t")); +            push(@parsed_data, $data) if $data;          } +          close($fh);      } + +    return @parsed_data;  } -sub save_allowed_nicks { -    my ($file) = @_; +# file: filename to be written, is created accessable only by the user +# data_ref: array ref of data entries +# serialize_fn: receives a data reference and should return an array or tuples +#     for that data that will be serialized into one line +sub save_file { +    my ($file, $data_ref, $serialize_fn) = @_; + +    create_private_file($file) unless -e $file; +      open(my $fh, ">", $file) or die "Can't create $file. Reason: $!"; -    for my $allowed (@allowed_nicks) { -      print($fh join("\t", $allowed->{net}, $allowed->{nick}) . "\n"); +    for my $data (@$data_ref) { +        print($fh join("\t", $serialize_fn->($data)), "\n");      }      close($fh);  } -sub new_allowed_nick { -    my $anick = {}; - -    $anick->{net}  = shift; -    $anick->{nick} = shift; - -    return $anick; +sub create_private_file { +    my ($file) = @_; +    my $umask = umask 0077; # save old umask +    open(my $fh, ">", $file) or die "Can't create $file. Reason: $!"; +    close($fh); +    umask $umask;  }  sub add_allowed_nick {      my ($network, $nick) = split(" ", $_[0], 2);      my ($correct_net); -     -    if ($network eq "" || $nick eq "") { + +    if ($network eq '' || $nick eq '') {          Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'invitejoin_usage_add_nick');          return;      } -     +      if ($network) {          my ($ircnet) = Irssi::chatnet_find($network);          if (!$ircnet) { @@ -139,11 +184,16 @@ sub add_allowed_nick {              $correct_net = 1;          }      } -  +      if ($correct_net && $nick) { +        if (is_nick_in_list($network, $nick)) { +            Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'nick_already_present'); +            return; +        } +          push(@allowed_nicks, new_allowed_nick($network, $nick));          save_allowed_nicks("$irssidir/$allowed_nicks_file"); -             +          Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'saved_nick', $network, $nick);      }  } @@ -151,7 +201,7 @@ sub add_allowed_nick {  sub del_allowed_nick {      my ($ircnet, $nick) = split(" ", $_[0], 2); -    if ($ircnet eq "") { +    if ($ircnet eq '' || $nick eq '') {          Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'invitejoin_delusage');          return;      } @@ -159,17 +209,20 @@ sub del_allowed_nick {      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);      } + +    if ($size_after == 0) { +        Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'allowed_nicks_empty'); +    }  }  sub list_allowed_nicks { -          if (@allowed_nicks == 0) {          Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'allowed_nicks_empty');      } else { @@ -182,10 +235,9 @@ sub list_allowed_nicks {  }  sub invitejoin_runsub { -          my ($data, $server, $item) = @_;      $data =~ s/\s+$//g; -     +      if ($data) {          Irssi::command_runsub('invitejoin', $data, $server, $item);      } else { @@ -193,17 +245,25 @@ sub invitejoin_runsub {      }  } +sub is_nick_in_list { +    my ($net, $nick) = @_; + +    return (grep { +        $_->{net}  eq $net && +        $_->{nick} eq $nick +    } @allowed_nicks) > 0; +} +  sub is_allowed_nick { -  my ($server, $nick) = @_; +    my ($net, $nick) = @_; -  # If no allowed nicks are specified (initial configuration) accept -  # all invite requests, which mimics previous behavior of this script -  return 1 if @allowed_nicks == 0; +    # If no allowed nicks are specified (initial configuration) accept +    # all invite requests. +    # # (This mimics previous behavior of this script +    # before there was an allowed list) +    return 1 if @allowed_nicks == 0; -  return (grep { -    $_->{net}  eq $server->{tag} && -    $_->{nick} eq $nick -  } @allowed_nicks) > 0; +    return is_nick_in_list($net, $nick);  }  sub invitejoin { @@ -211,15 +271,15 @@ sub invitejoin {      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); -      } +        if (is_allowed_nick($server->{tag}, $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); +        }      }  } @@ -229,10 +289,10 @@ 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',           '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}); | 
