summaryrefslogtreecommitdiff
path: root/archive/.irssi/scripts/autorun/auto_bleh.pl
diff options
context:
space:
mode:
Diffstat (limited to 'archive/.irssi/scripts/autorun/auto_bleh.pl')
-rw-r--r--archive/.irssi/scripts/autorun/auto_bleh.pl293
1 files changed, 293 insertions, 0 deletions
diff --git a/archive/.irssi/scripts/autorun/auto_bleh.pl b/archive/.irssi/scripts/autorun/auto_bleh.pl
new file mode 100644
index 00000000..9c00b2fa
--- /dev/null
+++ b/archive/.irssi/scripts/autorun/auto_bleh.pl
@@ -0,0 +1,293 @@
+use Irssi;
+use Irssi::Irc;
+use strict;
+use vars qw($VERSION %IRSSI $DEBUG);
+
+$VERSION = q$Revision: 1.1 $;
+%IRSSI = (authors => 'tomaw, based on auto_bleh.pl by Don Armstrong',
+ name => 'auto_bleh',
+ description => 'Provides /ak /aq /ab /abr /abrn /arn /amb /amr /at',
+ license => 'GPL',
+ changed => q$Id: auto_bleh.pl,v 1.1 2005/03/17 08:19:53 don Exp $,
+);
+
+#$DEBUG = 1 unless defined $DEBUG;
+
+my ($actions, %defaults);
+
+%defaults = (GET_OP => 1, # Should we try to get opped when we auto_bleh?
+ USE_CHANSERV => 1, # Should we use chanserv to get opped?
+ EXPIRE => 6000, # Do not try to do anything if the action is more than 6000 seconds old.
+ TIMEOUT => 10, # Timeout /at bans after 10 minutes
+);
+
+my %command_bindings = (ak => 'cmd_ak',
+ ab => 'cmd_ab',
+ aq => 'cmd_aq',
+ ar => 'cmd_ar',
+ abr => 'cmd_abr',
+ abk => 'cmd_abk',
+ abrn => 'cmd_abrn',
+ abk => 'cmd_abkn',
+ arn => 'cmd_arn',
+ amb => 'cmd_amb',
+ amr => 'cmd_amr',
+ at => 'cmd_at',
+);
+
+my %bans_to_remove;
+
+sub cmd_at {
+ my ($data, $server, $witem) = @_;
+ return do_auto_bleh('timeout',$data,$server,$witem);
+}
+
+sub cmd_ak {
+ my ($data, $server, $witem) = @_;
+ return do_auto_bleh('kick',$data,$server,$witem);
+}
+
+sub cmd_abk {
+ my ($data, $server, $witem) = @_;
+ return do_auto_bleh('kick,ban',$data,$server,$witem);
+}
+sub cmd_abkn {
+ my ($data, $server, $witem) = @_;
+ return do_auto_bleh('kick,ban,notice',$data,$server,$witem);
+}
+
+sub cmd_amb{
+ my ($data, $server, $witem) = @_;
+ my @nicks = split /\s+/, $data;
+ for (@nicks) {
+ next unless /\w/;
+ do_auto_bleh('ban',$_,$server,$witem);
+ }
+}
+
+sub cmd_ab {
+ my ($data, $server, $witem) = @_;
+ return do_auto_bleh('ban',$data,$server,$witem);
+}
+
+sub cmd_aq {
+ my ($data, $server, $witem) = @_;
+ return do_auto_bleh('quiet',$data,$server,$witem);
+}
+
+
+sub cmd_amr{
+ my ($data, $server, $witem) = @_;
+ my @nicks = split /\s+/, $data;
+ for (@nicks) {
+ next unless /\w/;
+ do_auto_bleh('remove',$_,$server,$witem);
+ }
+}
+
+sub cmd_ar {
+ my ($data, $server, $witem) = @_;
+ return do_auto_bleh('remove',$data,$server,$witem);
+}
+sub cmd_abr{
+ my ($data, $server, $witem) =@_;
+ return do_auto_bleh('remove,ban',$data,$server,$witem);
+}
+sub cmd_abrn{
+ my ($data, $server, $witem) =@_;
+ return do_auto_bleh('remove,ban,notice',$data,$server,$witem);
+}
+sub cmd_arn{
+ my ($data, $server, $witem) =@_;
+ return do_auto_bleh('remove,notice',$data,$server,$witem);
+}
+
+
+sub do_auto_bleh {
+ my ($cmd, $data, $server, $witem, $duration) = @_;
+
+ if (!$server || !$server->{connected}) {
+ Irssi::print("Not connected to server");
+ return;
+ }
+
+ if ($witem->{type} ne 'CHANNEL') {
+ Irssi::print("Can't autokick on a non-channel. [$witem->{type}]");
+ return;
+ }
+
+ # set the network that we're on, the channel and the nick to kick
+ # once we've been opped
+
+ $data =~ /^\s*([^\s]+)\s*(\d+)?\s*(.+?|)\s*$/;
+ my $nick = $1;
+ my $timeout = $2;
+ my $reason = $3;
+ $timeout = $defaults{TIMEOUT} if not defined $timeout or $timeout eq '';
+ $reason = 'you should know better' if not defined $reason or $reason eq '';
+
+ my $nick_rec = $witem->nick_find($nick);
+ if (not defined $nick_rec) {
+ Irssi::print("Unable to find nick: $nick");
+ return;
+ }
+
+ my $hostname = $nick_rec->{host} if defined $nick_rec;
+ Irssi::print("Unable to find hostname for $nick") if not defined $hostname or $hostname eq '';
+ $hostname =~ s/.+\@//;
+
+ Irssi::print("Nick set to '$nick' from '$data', reason set to '$reason'.") if $DEBUG;
+ my $action = {type => $cmd,
+ nick => $nick,
+ nick_rec => $nick_rec,
+ network => $witem->{server}->{chatnet},
+ server => $witem->{server},
+ completed => 0,
+ inserted => time,
+ channel => $witem->{name},
+ reason => $reason,
+ hostname => $hostname,
+ timeout => $timeout,
+ };
+ Irssi::print(i_want($action)) if $DEBUG;
+ if ($witem->{chanop}) {
+ take_action($action,$server,$witem);
+ }
+ else {
+ $actions->{$data.$action->{inserted}}=$action;
+ get_op($server, $action->{channel}) if $defaults{GET_OP};
+ }
+}
+
+sub get_op {
+ my ($server,$channel) = @_;
+
+ Irssi::print("QUOTE CS op $channel") if $DEBUG;
+ $server->command("QUOTE CS op $channel") if $defaults{USE_CHANSERV};
+}
+
+sub i_want {
+ my $action = shift;
+ return "I've wanted to $action->{type} $action->{nick} off $action->{channel} on $action->{network} since $action->{inserted}";
+}
+
+sub take_action {
+ my ($action,$server,$channel) = @_;
+
+ local $_ = $action->{type};
+ # Now support multiple actions against a single nick (to FE, kick ban, or remove ban). See /abr foo
+ if (/timeout/) {
+ Irssi::print("Quieting $action->{nick} on $action->{channel} with hostname $action->{hostname} for $action->{timeout} minutes") if $DEBUG;
+ $channel->command("/quote MODE $action->{channel} +q *!*@".$action->{hostname}) if $action->{hostname} ne ''; #quiet hostname
+ $bans_to_remove{"$action->{nick}$action->{inserted}"} = $action;
+ }
+ if (/quiet/) {
+ Irssi::print("Quieting $action->{nick} on $action->{channel} with hostname $action->{hostname}") if $DEBUG;
+ # Find hostname
+ $channel->command("/quote MODE $action->{channel} +q *!*@".$action->{hostname}) if $action->{hostname} ne ''; #quiet hostname
+ }
+ if (/ban/) {
+ Irssi::print("Banning $action->{nick} from $action->{channel} with hostname $action->{hostname}") if $DEBUG;
+ $channel->command("/quote MODE $action->{channel} +b *!*@".$action->{hostname}) if $action->{hostname} ne ''; # ban hostname
+ }
+ if (/kick/) {
+ Irssi::print("Kicking $action->{nick} from $action->{channel}") if $DEBUG;
+ if ($action->{reason} =~ /\s/) {
+ $channel->command("/quote KICK $action->{channel} $action->{nick} :$action->{reason}");
+ }
+ else {
+ $channel->command("/quote REMOVE $action->{channel} $action->{nick} $action->{reason}");
+ }
+ }
+ if (/remove/) {
+ Irssi::print("Removing $action->{nick} from $action->{channel}") if $DEBUG;
+ if ($action->{reason} =~ /\s/) {
+ $channel->command("/quote REMOVE $action->{channel} $action->{nick} :$action->{reason}");
+ } else {
+ $channel->command("/quote REMOVE $action->{channel} $action->{nick} $action->{reason}");
+ }
+ }
+ if (/notice/) {
+ Irssi::print("Noticing $action->{nick} with $action->{reason}") if $DEBUG;
+ $channel->command("/NOTICE $action->{nick} $action->{reason}");
+ }
+ if (/teiuq/) {
+ Irssi::print("Unquieting $action->{nick} on $action->{channel} with hostname $action->{hostname}") if $DEBUG;
+ $channel->command("/quote MODE $action->{channel} -q *!*@".$action->{hostname});
+ }
+ return; #for now.
+}
+
+sub deop_us {
+ my ($rec) = @_;
+ my $channel = $rec->{channel};
+ my $server = $rec->{server};
+
+ Irssi::print("MODE $channel->{name} -o $channel->{ownnick}->{nick}") if $DEBUG;
+ $channel->command("/deop $channel->{ownnick}->{nick}");
+}
+
+sub sig_mode_change {
+ my ($channel,$nick) = @_;
+
+ # Are there any actions to process?
+ # See if we got opped.
+ return if scalar(keys %$actions) eq 0;
+
+ my @deop_array;
+ if ($channel->{server}->{nick} eq $nick->{nick} and $nick->{op}) {
+ Irssi::print("We've been opped") if $DEBUG;
+ foreach (keys %$actions) {
+ # See if this action is too old
+ if (time - $actions->{$_}->{inserted} > $defaults{EXPIRE}) {
+ Irssi::print("Expiring action: \"".i_want($actions->{$_})."\" because of time") if $DEBUG;
+ delete $actions->{$_};
+ next;
+ }
+ Irssi::print(i_want($actions->{$_})) if $DEBUG;
+ # Find the server to take action on
+ my $server = $actions->{$_}->{server};
+ Irssi::print("Unable to find server for chatnet: $actions->{$_}->{network}") and return if not defined $server;
+ Irssi::print("Found server for chatnet: $actions->{$_}->{network}") if $DEBUG;
+ # Find the channel to take action on
+ my $channel = $server->channel_find($actions->{$_}->{channel});
+ Irssi::print("Unable to find channel for channel: $actions->{$_}->{channel}") and return if not defined $channel;
+ Irssi::print("Found channel for channel: $actions->{$_}->{channel}") if $DEBUG;
+ Irssi::print("We are opped on the channel!") if $DEBUG;
+ take_action($actions->{$_},$server,$channel);
+ push @deop_array,{server=>$server,channel=>$channel} if Irssi::settings_get_bool('auto_bleh_deop_after_action');
+ delete $actions->{$_}; # Do not repeat this action.
+ }
+ foreach (@deop_array) {
+ deop_us($_);
+ }
+ } else {
+ Irssi::print("Fooey. Not opped.") if $DEBUG;
+ }
+}
+
+sub try_to_remove_bans {
+ return unless keys %bans_to_remove;
+ for my $key (keys %bans_to_remove) {
+ if (($bans_to_remove{$key}{inserted} + $bans_to_remove{$key}{timeout}*60) < time) {
+ $bans_to_remove{$key}{type} = 'teiuq'; #unquiet
+ $actions->{$key} = $bans_to_remove{$key};
+ delete $bans_to_remove{$key};
+ get_op($actions->{$key}{server}, $actions->{$key}{channel}) if $defaults{GET_OP};
+ }
+ }
+}
+
+# call the try to remove bans function every minute
+Irssi::timeout_add(1000*60,'try_to_remove_bans',undef);
+Irssi::signal_add_last('nick mode changed','sig_mode_change');
+my ($command,$function);
+
+while (($command,$function) = each %command_bindings) {
+ Irssi::command_bind($command,$function, 'auto_bleh');
+}
+
+Irssi::settings_add_bool($IRSSI{name}, 'auto_bleh_deop_after_action', 1);
+
+1;
+