# shitlist.pl remake use strict; use Irssi; use Irssi::Irc; my @greetlist = (); my $greet_file = "$ENV{HOME}/.irssi/greetlist"; Irssi::theme_register([ 'greetlist_add', '$0 added to greetlist', 'greetlist_del', '$0 removed from greetlist', 'greetlist_nosuchitem', 'No such item in greetlist', 'greetlist_line', '[%W$[!-2]0%n]%| $[34]1 $2 %: $3' ]); sub event_join { my ($server, $channel, $nick, $host) = @_; $channel =~ s/^://; foreach my $greet (@greetlist) { if ((exists $greet->{channels}->{'*'} || exists $greet->{channels}->{$channel}) && Irssi::mask_match_address($greet->{nickmask}, $nick, $host)) { $server->send_raw("PRIVMSG $channel :[$nick] $greet->{reason}"); last; } } } sub new_greet { my $greet = {}; $greet->{nickmask} = shift; $greet->{reason} = shift; for (my $c = 0; $c < @_; ++$c) { $greet->{channels}->{$_[$c]} = 1; } return $greet; } sub load_greetlist { @greetlist = (); if (-e $greet_file) { local *F; open(F, "<$greet_file"); local $/ = "\n"; while () { chop; my $new_greet = new_greet(split("\t")); if ($new_greet->{nickmask} ne "") { push(@greetlist, $new_greet); } else { Irssi::print("Skipping $new_greet", MSGLEVEL_CLIENTERROR); } } close(F); } Irssi::print(">> Loaded " . scalar(@greetlist) . " items to greetlist from file"); } sub get_greet_channels { return keys(%{$_[0]->{channels}}); } sub save_greetlist { local *F; open(F, ">$greet_file") or die "Couldn't open file for writing"; for (my $c = 0; $c < @greetlist; ++$c) { print(F join("\t", $greetlist[$c]->{nickmask}, $greetlist[$c]->{reason}, get_greet_channels($greetlist[$c])) . "\n"); } close(F); } # /ADDgreet [<* | #chan1,#chan2,...> [greetlevel] [reason]]] sub cmd_addgreet { my $data = shift; my ($nickmask, $channels, $reason) = split (" ", $data, 3); if ($nickmask eq "") { Irssi::print('Not enough arguments. Usage: /ADDGREET [<* | #chan1,#chan2,...> [reason]]'); return; } $channels = "*" if ($channels eq ""); Irssi::printformat(MSGLEVEL_CLIENTNOTICE, 'greetlist_add', $nickmask); push(@greetlist, new_greet($nickmask, $reason, split(",", $channels))); save_greetlist(); } sub cmd_delgreet { my ($index) = split(" ", $_[0], 1); if ($index eq "") { Irssi::print("Not enough arguments. Usage: /DELGREET "); return; } my $greet = splice(@greetlist, $index, 1); if ($greet) { Irssi::print("$greet->{nickmask} removed from greetlist"); save_greetlist(); } else { Irssi::printformat(MSGLEVEL_CLIENTNOTICE, 'greetlist_nosuchitem'); } } sub cmd_greetlist { if (@greetlist == 0) { Irssi::print(">> Nothing in greetlist"); } else { for (my $c = 0; $c < @greetlist ; ++$c) { Irssi::printformat(MSGLEVEL_CRAP, 'greetlist_line', $c, $greetlist[$c]->{nickmask}, join(",", get_greet_channels($greetlist[$c])), $greetlist[$c]->{reason}); } } } load_greetlist(); Irssi::signal_add_last('event join', 'event_join'); Irssi::command_bind('addgreet', 'cmd_addgreet'); Irssi::command_bind('delgreet', 'cmd_delgreet'); Irssi::command_bind('ungreet', 'cmd_delgreet'); Irssi::command_bind('greetlist', 'cmd_greetlist');