diff options
Diffstat (limited to 'modules/event.pl')
| -rw-r--r-- | modules/event.pl | 264 |
1 files changed, 264 insertions, 0 deletions
diff --git a/modules/event.pl b/modules/event.pl new file mode 100644 index 0000000..77583e4 --- /dev/null +++ b/modules/event.pl @@ -0,0 +1,264 @@ +use warnings; +use strict; + +use Text::LevenshteinXS qw(distance); + +sub on_connect { + my ($conn, $event) = @_; # need to check for no services + $conn->privmsg( 'NickServ', "ghost $::settings->{nick} $::pass" ) if lc $event->{args}->[0] ne lc $::settings->{nick}; +} + +my @leven = (); + +sub on_join { + my ($conn, $event) = @_; + my $nick = lc $event->{nick}; + my $chan = lc $event->{to}->[0]; + if ( leq($conn->{_nick}, $nick) ) { + $::sc{$chan} = {}; + $conn->privmsg('ChanServ', "op $chan" ) if (defined cs($chan)->{op}) && (cs($chan)->{op} eq 'yes'); + } + $::sc{$chan}{users}{$nick} = {}; + $::sc{$chan}{users}{$nick}{hostmask} = $event->{userhost}; + $::sc{$chan}{users}{$nick}{op} = 0; + $::sc{$chan}{users}{$nick}{voice} = 0; + inspect( $conn, $event ); + logg( $event ); + if ( $#leven ne -1 ) { + my $ld = ( ( maxlen($nick, $leven[0]) - distance($nick, $leven[0]) ) / maxlen($nick, $leven[0]) ); + my $mx = $leven[0]; + foreach my $item ( @leven ) { + next if $nick eq $item; # avoid dups + my $tld = ( ( maxlen($nick, $item) - distance($nick, $item) ) / maxlen($nick, $item) ); + if ($tld > $ld) { + $ld = $tld; + $mx = $item; + } + } + print "Best match for $nick was $mx with $ld\n" + } + push(@leven, $nick); + shift @leven if $#leven > 5; +} + +sub on_part +{ + my ($conn, $event) = @_; + inspect( $conn, $event ); + my $nick = lc $event->{nick}; + logg( $event ); + if ( leq( $conn->{_nick}, $nick ) ) + { + delete( $::sc{lc $event->{to}->[0]} ); + } + else + { + delete( $::sc{lc $event->{to}->[0]}{users}{$nick} ); + } +} + +sub on_msg +{ + my ($conn, $event) = @_; + do_command ($conn, $event) +} + +sub on_public +{ + my ($conn, $event) = @_; + inspect( $conn, $event ); + logg( $event ); + do_command( $conn, $event ) +} + +sub on_notice +{ + my ($conn, $event) = @_; + inspect( $conn, $event ); + logg( $event ); + doServices($conn, $event); +} + +sub on_errnickinuse +{ + my ($conn, $event) = @_; + $_ = ${$::settings->{altnicks}}[rand @{$::settings->{altnicks}}]; + print "Nick is in use, trying $_\n"; + $conn->nick($_); +} + +sub on_quit +{ + my ($conn, $event) = @_; + my @channels=(); + for ( keys %::sc ) { + push ( @channels, $_ ) if delete $::sc{lc $_}{users}{lc $event->{nick}}; + } + $event->{to} = \@channels; + inspect( $conn, $event ); + logg ( $event ); +} + +sub blah +{ + my ($self, $event) = @_; + inspect($self, $event); +} + +sub irc_users +{ + my ( $channel, @users ) = @_; + for (@users) + { + my ( $op, $voice ); + $op = 0; $voice = 0; + $op = 1 if s/^\@//; + $voice = 1 if s/^\+//; + $::sc{lc $channel}{users}{lc $_} = {}; + $::sc{lc $channel}{users}{lc $_}{op} = $op; + $::sc{lc $channel}{users}{lc $_}{voice} = $voice; + } +} + +sub on_names { + my ($conn, $event) = @_; + irc_users( $event->{args}->[2], split(/ /, $event->{args}->[3]) ) if ($event->{type} eq 'namreply'); +} + +sub irc_topic { + my ($conn, $event) = @_; + inspect($conn, $event) if ($event->{format} ne 'server'); + if ($event->{format} eq 'server') + { + if ($event->{type} eq 'topic') + { + $::sc{lc $event->{args}->[1]}{topic}{text} = $event->{args}->[2]; + } + elsif ($event->{type} eq 'topicinfo') + { + $::sc{lc $event->{args}->[1]}{topic}{time} = $event->{args}->[3]; + $::sc{lc $event->{args}->[1]}{topic}{by} = $event->{args}->[2]; + } + } + else + { + if ($event->{type} eq 'topic') + { + $::sc{lc $event->{to}->[0]}{topic}{text} = $event->{args}->[0]; + } + logg($event); + } +} + +sub on_nick { + my ($conn, $event) = @_; + my @channels=(); + for ( keys %::sc ) + { + if ( defined $::sc{lc $_}{users}{lc $event->{nick}} ) + { + $::sc{lc $_}{users}{lc $event->{args}->[0]} = $::sc{lc $_}{users}{lc $event->{nick}}; + delete( $::sc{lc $_}{users}{lc $event->{nick}} ); + push ( @channels, lc $_ ); + } + } + $event->{to} = \@channels; + inspect($conn, $event); + logg($event) +} + +sub on_kick { + my ($conn, $event) = @_; + if (lc $event->{to}->[0] eq lc $::settings->{nick}) { + $conn->join($event->{args}->[0]); + } + logg( $event ); +} + +sub on_mode +{ + my ($conn, $event) = @_; + my $chan = lc $event->{to}->[0]; + if ($chan =~ /^#/) { + my @modes = @{parse_modes($event->{args})}; + foreach my $line ( @modes ) { + my @ex = @{$line}; + if ( $ex[0] eq '+o' ) { + $::sc{$chan}{users}{lc $ex[1]}{op}=1; + if (lc $ex[1] eq lc $::settings->{nick}) { + doQueue($conn, $chan); + if ( $::channels->{channel}->{$chan}->{op} eq "when" ) { + $conn->schedule(600, sub { print "Deop timer called!\n"; $conn->privmsg('ChanServ', "op $chan -". $::settings->{nick})}); + } + } + } + elsif ( $ex[0] eq '-o' ) { + $::sc{$chan}{users}{lc $ex[1]}{op}=0; + } + elsif ( $ex[0] eq '+v' ) { + $::sc{$chan}{users}{lc $ex[1]}{voice}=1; + } + elsif ( $ex[0] eq '-v' ) { + $::sc{$chan}{users}{lc $ex[1]}{voice}=0; + } + } + logg($event); + } +} + +sub on_ctcp +{ + my ($conn, $event) = @_; + inspect($conn, $event); +} + +sub whois_identified { + my ($conn, $event2) = @_; + my $who = lc $event2->{args}->[1]; + if ( (defined( $::idqueue{$who} )) && ( @{$::idqueue{$who}} ) ) { + foreach my $item (@{$::idqueue{$who}}) { + my ($cmd, $command, $event) = @{$item}; + if ( $cmd =~ /$command->{cmd}/ ){ + print "$event->{from} told me $cmd \n"; + eval $command->{content}; + warn $@ if $@; + } + } + $::idqueue{$who} = []; + } +} + +sub whois_end { + my ($conn, $event) = @_; + my $who = lc $event->{args}->[1]; + $::idqueue{$who} = []; +} + +sub on_bannedfromchan { + my ($conn, $event) = @_; + $conn->privmsg('ChanServ', "unban $event->{args}->[1]"); +} + +sub Event::killsub { + undef &on_connect; + undef &on_join; + undef &on_part; + undef &on_msg; + undef &on_notice; + undef &on_errnickinuse; + undef &on_quit; + undef &on_names; + undef &on_nick; + undef &on_kick; + undef &on_mode; + undef &on_ctcp; + undef &on_bannedfromchan; + undef &blah; + undef &irc_users; + undef &irc_topic; + undef &whois_identified; + undef &whois_end; + undef &on_public; +} + +return 1; |
