2018-07-31 22:29:52 +02:00
2019-09-01 20:01:18 +02:00
package Plugins::RelayUnreg ;
2018-07-31 22:29:52 +02:00
use warnings ;
use strict ;
2019-07-11 03:40:53 +02:00
use feature 'unicode_strings' ;
2018-07-31 22:29:52 +02:00
use Carp ( ) ;
2018-08-01 01:20:49 +02:00
use Time::HiRes qw/gettimeofday/ ;
2018-07-31 22:29:52 +02:00
sub new {
Carp:: croak ( "Options to " . __FILE__ . " should be key/value pairs, not hash reference" ) if ref $ _ [ 1 ] eq 'HASH' ;
my ( $ class , % conf ) = @ _ ;
my $ self = bless { } , $ class ;
$ self - > initialize ( % conf ) ;
return $ self ;
}
sub initialize {
my ( $ self , % conf ) = @ _ ;
$ self - > { pbot } = delete $ conf { pbot } // Carp:: croak ( "Missing pbot reference to " . __FILE__ ) ;
$ self - > { pbot } - > { event_dispatcher } - > register_handler ( 'irc.public' , sub { $ self - > on_public ( @ _ ) } ) ;
2018-08-01 01:20:49 +02:00
$ self - > { queue } = [] ;
2018-08-13 23:23:13 +02:00
$ self - > { notified } = { } ;
2018-08-06 05:04:03 +02:00
$ self - > { pbot } - > { timer } - > register ( sub { $ self - > check_queue } , 1 , 'RelayUnreg' ) ;
2018-07-31 22:29:52 +02:00
}
sub unload {
my $ self = shift ;
2018-08-06 05:04:03 +02:00
$ self - > { pbot } - > { timer } - > unregister ( 'RelayUnreg' ) ;
2018-07-31 22:29:52 +02:00
}
sub on_public {
my ( $ self , $ event_type , $ event ) = @ _ ;
my ( $ nick , $ user , $ host , $ msg ) = ( $ event - > { event } - > nick , $ event - > { event } - > user , $ event - > { event } - > host , $ event - > { event } - > args ) ;
my $ channel = lc $ event - > { event } - > { to } [ 0 ] ;
2018-08-13 23:23:13 +02:00
$ msg =~ s/^\s+|\s+$//g ;
return 0 if not length $ msg ;
2018-07-31 22:29:52 +02:00
# exit if channel hasn't muted $~a
return 0 if not exists $ self - > { pbot } - > { bantracker } - > { banlist } - > { $ channel } - > { '+q' } - > { '$~a' } ;
2018-08-06 07:50:22 +02:00
# exit if channel isn't +z
my $ chanmodes = $ self - > { pbot } - > { channels } - > get_meta ( $ channel , 'MODE' ) ;
return 0 if not defined $ chanmodes or not $ chanmodes =~ m/z/ ;
2018-07-31 22:29:52 +02:00
my $ account = $ self - > { pbot } - > { messagehistory } - > { database } - > get_message_account ( $ nick , $ user , $ host ) ;
my $ nickserv = $ self - > { pbot } - > { messagehistory } - > { database } - > get_current_nickserv_account ( $ account ) ;
2018-08-01 01:20:49 +02:00
# debug
# my $nickserv_text = $nickserv ? "is logged into $nickserv" : "is not logged in";
2018-08-06 05:04:03 +02:00
# $self->{pbot}->{logger}->log("RelayUnreg: $nick!$user\@$host ($account) $nickserv_text.\n");
2018-07-31 22:29:52 +02:00
2018-08-01 01:20:49 +02:00
# exit if user is identified
2018-07-31 22:29:52 +02:00
return 0 if defined $ nickserv && length $ nickserv ;
my @ filters = (
qr{ https://bryanostergaard.com/ } ,
qr{ https://encyclopediadramatica.rs/Freenodegate } ,
qr{ https://MattSTrout.com/ } ,
qr{ Contact me on twitter } ,
qr{ At the beginning there was only Chaos } ,
qr{ https://williampitcock.com/ } ,
2018-08-03 16:30:07 +02:00
qr{ Achievement Method } ,
qr{ perceived death signal } ,
2018-07-31 22:29:52 +02:00
qr{ efnet } ,
2018-08-06 05:04:03 +02:00
qr{ https://evestigatorsucks.com } ,
qr{ eVestigator } ,
2018-07-31 22:29:52 +02:00
) ;
2018-08-06 07:50:22 +02:00
# don't notify/relay for spammers
2018-07-31 22:29:52 +02:00
foreach my $ filter ( @ filters ) {
if ( $ msg =~ m/$filter/i ) {
2018-08-06 05:04:03 +02:00
$ self - > { pbot } - > { logger } - > log ( "RelayUnreg: Ignoring filtered message.\n" ) ;
2018-07-31 22:29:52 +02:00
return 0 ;
}
}
2018-08-06 07:50:22 +02:00
# don't notify/relay for spammers
2018-08-06 20:01:58 +02:00
return 0 if $ self - > { pbot } - > { antispam } - > is_spam ( $ channel , $ msg , 1 ) ;
2018-08-06 07:50:22 +02:00
# don't notify/relay if user is voiced
2018-08-03 21:32:16 +02:00
return 0 if $ self - > { pbot } - > { nicklist } - > get_meta ( $ channel , $ nick , '+v' ) ;
2018-08-13 23:23:13 +02:00
unless ( exists $ self - > { notified } - > { lc $ nick } ) {
$ self - > { pbot } - > { logger } - > log ( "RelayUnreg: Notifying $nick to register with NickServ in $channel.\n" ) ;
$ event - > { conn } - > privmsg ( $ nick , "Please register your nick to speak in $channel. See https://freenode.net/kb/answer/registration and https://freenode.net/kb/answer/sasl" ) ;
$ self - > { notified } - > { lc $ nick } = gettimeofday ;
}
2018-07-31 22:29:52 +02:00
# don't relay unregistered chat unless enabled
return 0 if not $ self - > { pbot } - > { registry } - > get_value ( $ channel , 'relay_unregistered_chat' ) ;
2018-08-01 01:20:49 +02:00
# add message to delay send queue to see if Sigyn kills them first (or if they leave)
2018-08-06 05:04:03 +02:00
$ self - > { pbot } - > { logger } - > log ( "RelayUnreg: Queuing unregistered message for $channel: <$nick> $msg\n" ) ;
2018-08-03 16:30:07 +02:00
push @ { $ self - > { queue } } , [ gettimeofday + 10 , $ channel , $ nick , $ user , $ host , $ msg ] ;
2018-07-31 22:29:52 +02:00
return 0 ;
}
2018-08-01 01:20:49 +02:00
sub check_queue {
my $ self = shift ;
my $ now = gettimeofday ;
2018-08-14 05:05:42 +02:00
if ( @ { $ self - > { queue } } ) {
my ( $ time , $ channel , $ nick , $ user , $ host , $ msg ) = @ { $ self - > { queue } - > [ 0 ] } ;
if ( $ now >= $ time ) {
# if nick is still present in channel, send the message
if ( $ self - > { pbot } - > { nicklist } - > is_present ( $ channel , $ nick ) ) {
# ensure they're not banned (+z allows us to see +q/+b messages as normal ones)
my $ banned = $ self - > { pbot } - > { bantracker } - > is_banned ( $ nick , $ user , $ host , $ channel ) ;
$ self - > { pbot } - > { logger } - > log ( "[RelayUnreg] $nick!$user\@$host $banned->{mode} as $banned->{banmask} in $banned->{channel} by $banned->{owner}, not relaying unregistered message\n" ) if $ banned ;
$ self - > { pbot } - > { conn } - > privmsg ( $ channel , "(unreg) <$nick> $msg" ) unless $ banned ;
}
shift @ { $ self - > { queue } } ;
2018-08-01 01:20:49 +02:00
}
}
2018-08-13 23:23:13 +02:00
# check notification timeouts here too, why not?
2018-08-14 05:05:42 +02:00
if ( keys % { $ self - > { notified } } ) {
my $ timeout = gettimeofday - 60 * 15 ;
foreach my $ nick ( keys % { $ self - > { notified } } ) {
if ( $ self - > { notified } - > { $ nick } <= $ timeout ) {
delete $ self - > { notified } - > { $ nick } ;
}
2018-08-13 23:23:13 +02:00
}
}
2018-08-01 01:20:49 +02:00
}
2018-07-31 22:29:52 +02:00
1 ;