# # Serial plugin for BRenBot 1.52.1 by gkl21 # Designed for Adad's and Hex's Serial.dll # Version 1.06 # #Define the package name package serial; #Define Perl Plugins use POE; use plugin; use DBI; #Required our $plugin_name; our %config; #Global Variable our $serialserialdbh; my $currentVersion = 1.06; #These commands are pointers to subs. our %additional_events = ( "rl_playerserial" => "rl_playerserial", "rl_serial" => "rl_serial", "cmd_sban" => "cmd_sban", "cmd_gethash" => "cmd_gethash", "cmd_banhash" => "cmd_banhash", "1" => "1" ); #Initialize the plugin sub start { my ( $session, $heap, $args ) = @_[ SESSION, HEAP, ARG0 ]; my $kernel = $_[KERNEL]; #Force the current directory to BRenBot opendir( DIR, '.' ); #Check to see if the ban.dat file exists, if not, create it, else just load it. if ( -e "serial.dat" ) #Does not exist { $serialdbh = DBI->connect("dbi:SQLite2:dbname=serial.dat","",""); } else { $serialdbh = DBI->connect("dbi:SQLite2:dbname=serial.dat","",""); $serialdbh->do( "create table serials (id INTEGER PRIMARY KEY ,name char(128) ,serial char(40))"); $serialdbh->do( "create table bans (id INTEGER PRIMARY KEY ,serial char(40) ,reason char(1024) ,banner char(50))"); } #Close the directory handle. closedir DIR; my $dbVersion = plugin::get_global ( "version_plugin_serial" ); if ( !$dbVersion ) { $dbVersion = 1.0; } if ( $dbVersion != $currentVersion ) { plugin::set_global ( "version_plugin_serial", $currentVersion ); } } sub stop { my ( $session, $heap, $args ) = @_[ SESSION, HEAP, ARG0 ]; my $kernel = $_[KERNEL]; #Ensure the database link is disconnected. $serialdbh->disconnect; } #AddSlahes() - Attempt to prevent SQL Injection. sub AddSlashes { my $text = shift; ## Make sure to do the backslash first! $text =~ s/\\/\\\\/g; $text =~ s/'/\\'/g; $text =~ s/"/\\"/g; $text =~ s/\0/\\\0/g; return $text; } #[STSF] Serial of player player (1) retrieved: 00000000000000000000000000000000 sub rl_playerserial { my ( $session, $heap, $args ) = @_[ SESSION, HEAP, ARG0 ]; my $kernel = $_[KERNEL]; my $line = $args->{line}; my $playername; my $spass = ""; my $shash = ""; if ($line =~ m/^\s*\[STSF\]\s(.+)/i { $line =~ m/^\s*\[STSF\]\s(.+)/i; $spass = $1; $shash = $2; } else { $line =~ m/^\s*\[STSF\]\s(.+)/i; $spass = $1; $shash = $2; } importserial( $spass, $shash ); } #_Serial ID: 1 Serial: 00000000000000000000aaaaaaaaaaaaaaaaaaaa IP: x.x.x.x Name: xyz #_Serial Serial for player 1 is 00000000000000000000aaaaaaaaaaaaaaaaaaaa sub rl_serial { my ( $session, $heap, $args ) = @_[ SESSION, HEAP, ARG0 ]; my $kernel = $_[KERNEL]; my $line = $args->{line}; my $playername; my $spass = ""; my $shash = ""; if ($line =~ m/^_Serial\sID.+Serial.+IP.+Name/) { $line =~ /^_Serial\sID.+Serial.\s(.+)\sIP.+Name.\s(.+)/; $spass = $2; $shash = $1; } else { $line =~ /^_Serial\sSerial\sfor\splayer\s(\d+)\sis\s(.+)/; $spass = $1; $shash = $2; } importserial( $spass, $shash ); } sub importserial { my ( $nickname, $serial ) = @_; my $playername = ""; if (($nickname =~ m/^\d+$/) && (length($nickname) <= 2)) { #Get the player name associated with this id. if ( $main::version > 1.50 ) { my ( $result, %player ) = plugin::getPlayerData( $nickname ); if ( $result == 1) { $playername = "$player{name}"; } } else { my ( $result, $error, $player ) = plugin::PlayerInGame ( $nickname ); if ( $result == 1) { $playername = "$player->{name}"; } } } else { $playername = $nickname; } #print "Serial Plugin: ".$playername." -- ".$serial." -- ".$nickname."\n"; #If a playername and serial is set. if (( $playername ) && ( $serial )) { my $query; my @row; $query = $serialdbh->prepare ( "SELECT * FROM serials WHERE name='".$playername."' AND serial='".$serial."'" ); $query->execute(); if ( @row = $query->fetchrow_array ) { #Already in the database. Do Nothing. } else { #print "Imported New Serial: ".$playername." -- ".$serial."\n"; $serialdbh->do ( "INSERT INTO serials ([name], [serial]) VALUES ('".$playername."','".$serial."')" ); } checkserial( $playername, $serial ); } } sub playerjoin { my ( $session, $heap, $args ) = @_[ SESSION, HEAP, ARG0 ]; my $kernel = $_[KERNEL]; my %args = %{$args}; if ( $config{'queryOnJoin'} ) { if ($args{id}) { plugin::RenRemCMD( "".$config{'queryCmd'}." ".$args{id}."" ); } } } sub checkserial { my ($nickname, $serial) = @_; if ( $nickname ) { if ( $serial ) { my $query; my @row; $query = $serialdbh->prepare ( "SELECT serial, reason, banner FROM bans WHERE serial='".$serial."'" ); $query->execute(); if ( @row = $query->fetchrow_array ) { $reason = $row[1]; $banner = $row[2]; #plugin::ircmsg( "kb $nickname $reason (Hash Ban)" , "A" ); plugin::call_command ( "$banner", "kb $nickname $reason (Hash Ban)" ); } } } } #command() - !irc commands sub command { # trigger on !commands my ( $session, $heap, $args ) = @_[ SESSION, HEAP, ARG0 ]; my $kernel = $_[KERNEL]; my %args = %{$args}; if ($args{command}) #command name in xml file { $kernel->yield("cmd_".$args{command} => \%args); #sub routing name } } sub cmd_gethash { my ( $session, $heap, $args ) = @_[ SESSION, HEAP, ARG0 ]; my $kernel = $_[KERNEL]; my %args = %{$args}; if ( !$args{arg1} ) { plugin::ircmsg( "Usage: !gethash " , $args{'ircChannelCode'} ); } else { my $results = "false"; my $resnum = 0; my $playername = AddSlashes($args{arg1}); $query = $serialdbh->prepare ( "SELECT * FROM serials WHERE name LIKE '%".$playername."%' ORDER BY name LIMIT 8" ); $query->execute(); while ( @row = $query->fetchrow_array ) { $results = "true"; plugin::ircmsg( "Hash found for ".$row[1].": ".$row[2] , $args{'ircChannelCode'} ); $resnum = $resnum + 1; if ($resnum >= 8) { plugin::ircmsg( "Maximum 8 records showing. Please be more specific." , $args{'ircChannelCode'} ); } } if ( $results eq "false" ) { plugin::ircmsg( "No hash for ".$playername." found." , $args{'ircChannelCode'} ); } } } sub cmd_banhash { my ( $session, $heap, $args ) = @_[ SESSION, HEAP, ARG0 ]; my $kernel = $_[KERNEL]; my %args = %{$args}; if ( !$args{arg3} ) { plugin::ircmsg( "Usage: !banhash " , $args{'ircChannelCode'} ); } elsif ( length($args{arg2}) != 40 ) { plugin::ircmsg( "Invalid Serial Hash Length. Must be 40 characters long." , $args{'ircChannelCode'} ); } else { my $query; #SQL Query my @row; #SQL Data Row my $name = AddSlashes($args{arg1}); my $serial = $args{arg2}; my $banner = $args{nick}; #Get the reason for the ban by locating where the ban reason starts my $reason = AddSlashes($args{arg}); my $temp1 = length($args{arg1}); my $temp2 = length($args{arg2}); my $temp3 = length($args{arg}); $reason = substr($reason, ($temp1 + $temp2 + 10), ($temp3 - ($temp1 + $temp2)) ); #See if the record exists $query = $serialdbh->prepare ( "SELECT serial FROM bans WHERE serial='".$serial."'" ); $query->execute(); if ( @row = $query->fetchrow_array ) { #A record was found. Do not add a new one. plugin::ircmsg( "[Hash Ban] ".$name."'s serial is already banned." , $args{'ircChannelCode'} ); } else { my $query2; #SQL Query my @row2; #SQL Data Row #Check for player in serials table. $query2 = $serialdbh->prepare ( "SELECT serial FROM serials WHERE name='".$name."'" ); $query2->execute(); if ( @row2 = $query2->fetchrow_array ) { #Found, do nothing. } else { #Add serial into the serials table. $serialdbh->do ( "INSERT INTO serials ([name], [serial]) VALUES ('".$name."','".$serial."')" ); } #Add a new ban. $serialdbh->do ( "INSERT INTO bans ([serial], [reason], [banner]) VALUES ('".$serial."','".$reason."','".$banner."')" ); plugin::ircmsg( "[Hash Ban] ".$name." has been hashed ban." , $args{'ircChannelCode'} ); } } } sub cmd_sban { my ( $session, $heap, $args ) = @_[ SESSION, HEAP, ARG0 ]; my $kernel = $_[KERNEL]; my %args = %{$args}; if ( !$args{arg2} ) { plugin::ircmsg( "Usage: !sban " , $args{'ircChannelCode'} ); } else { if ( $args{arg1} eq "add" ) { if ( !$args{arg3} ) { plugin::ircmsg( "Usage: !sban " , $args{'ircChannelCode'} ); } else { #Get the reason for the ban by locating where the ban reason starts my $reason = AddSlashes($args{arg}); my $temp1 = length($args{arg1}); my $temp2 = length($args{arg2}); my $temp3 = length($args{arg}); #Take the full length of the command, minus the '!sban add nickname' to locate the start position, then use that number, minus the entire length to get the rest of the line, aka reason. $reason = substr($reason, ($temp1 + $temp2 + 7), ($temp3 - ($temp1 + $temp2)) ); my $query; #SQL Query my @row; #SQL Data Row my $serial; #Serial associated with player my $banner = $args{nick}; my $valid = "false"; #Get the serial. $query = $serialdbh->prepare ( "SELECT serial FROM serials WHERE name='".$args{arg2}."'" ); $query->execute(); while ( @row = $query->fetchrow_array ) { $serial = $row[0]; $valid = "true"; my $query2; #SQL Query my @row2; #SQL Data Row #See if the record exists $query2 = $serialdbh->prepare ( "SELECT serial FROM bans WHERE serial='".$serial."'" ); $query2->execute(); if ( @row2 = $query2->fetchrow_array ) { #A record was found. Do not add a new one. plugin::ircmsg( "[Hash Ban] A record was already found for ".$args{arg2}."." , $args{'ircChannelCode'} ); } else { #Add a new ban. $serialdbh->do ( "INSERT INTO bans ([serial], [reason], [banner]) VALUES ('".$serial."','".$reason."','".$banner."')" ); plugin::ircmsg( "[Hash Ban] ".$args{arg2}." has been hashed ban." , $args{'ircChannelCode'} ); } } if ( $valid eq "false" ) { plugin::ircmsg( "[Hash Ban] No record for ".$args{arg2}." found." , $args{'ircChannelCode'} ); } } } elsif ( $args{arg1} eq "del" ) { my $query; #SQL Query my @row; #SQL Data Row my $serial; #Serial associated with player my $banner = $args{nick}; my $valid = "false"; #Get the serial. $query = $serialdbh->prepare ( "SELECT serial FROM serials WHERE name='".$args{arg2}."'" ); $query->execute(); while ( @row = $query->fetchrow_array ) { $serial = $row[0]; $valid = "true"; my $query2; #SQL Query my @row2; #SQL Data Row #See if the record exists $query2 = $serialdbh->prepare ( "SELECT serial FROM bans WHERE serial='".$serial."'" ); $query2->execute(); if ( @row2 = $query2->fetchrow_array ) { #A record was found. Delete it. $serialdbh->do ( "DELETE FROM bans WHERE serial='".$serial."'" ); plugin::ircmsg( "[Hash Ban] ".$args{arg2}." is no longer hash banned." , $args{'ircChannelCode'} ); } else { #No hash ban found. plugin::ircmsg( "[Hash Ban] No hash ban found for ".$args{arg2}."." , $args{'ircChannelCode'} ); } } if ( $valid eq "false" ) { plugin::ircmsg( "[Hash Ban] No record for ".$args{arg2}." found." , $args{'ircChannelCode'} ); } } elsif ( $args{arg1} eq "lookup" ) { my $query; #SQL Query my @row; #SQL Data Row my $serial; #Serial associated with player my $banner = $args{nick}; my $valid = "false"; #Get the serial. $query = $serialdbh->prepare ( "SELECT serial FROM serials WHERE name='".$args{arg2}."'" ); $query->execute(); while ( @row = $query->fetchrow_array ) { $serial = $row[0]; $valid = "true"; my $query2; #SQL Query my @row2; #SQL Data Row #See if the record exists $query2 = $serialdbh->prepare ( "SELECT reason, banner FROM bans WHERE serial='".$serial."'" ); $query2->execute(); if ( @row2 = $query2->fetchrow_array ) { #A record was found. plugin::ircmsg( "[Hash Ban] ".$args{arg2}." is hash banned by ".$row2[1]." for: ".$row2[0]."." , $args{'ircChannelCode'} ); } else { #No hash ban found. plugin::ircmsg( "[Hash Ban] No hash ban found for ".$args{arg2}."." , $args{'ircChannelCode'} ); } } if ( $valid eq "false" ) { plugin::ircmsg( "[Hash Ban] No record for ".$args{arg2}." found." , $args{'ircChannelCode'} ); } } } } 1;