Advertisement
Guest User

Untitled

a guest
Jul 24th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 8.20 KB | None | 0 0
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use POE;
  5. use POE::Component::IRC;
  6. use POE::Component::IRC::Common;
  7. use POE::Component::IRC::Qnet;
  8. use POE::Component::IRC::Qnet::State;
  9. use Date::Calc;
  10. use Net::MySQL;
  11.  
  12.  
  13. #Config:
  14.  
  15. #Bot Nickname
  16. my $botnick = 'TheCynicalTest';
  17.  
  18. #Server Information
  19. my $botserver = 'irc.quakenet.org';
  20. my $botport = '6667';
  21. my $botpass = '';
  22.  
  23. #MySQL
  24. my $sqlhost = 'localhost';
  25. my $sqldatabase = 'ralth';
  26. my $sqluser = 'ralth';
  27. my $sqlpassword = 'nosoupforyou';
  28.  
  29. #Channels to join
  30. #Main Channel First
  31. my @channels = ('#cynicalbrit', '#cynicaltest');
  32.  
  33. #Initiate IP-nick buffer
  34. my %buffer = ();
  35.  
  36.  
  37. #TBNameCheck
  38. my $tbnickcheck = 1;
  39.  
  40. #End of Config
  41.  
  42.  
  43. #Starting Session
  44. my ($irc) = POE::Component::IRC::Qnet::State->spawn();
  45.  
  46. #Connect to MySQL Database
  47. print "Connecting to MySQL Database\n";
  48. my $mysql = Net::MySQL->new(
  49.       hostname => $sqlhost,
  50.       database => $sqldatabase,
  51.       user     => $sqluser,
  52.       password => $sqlpassword
  53.   );
  54.  
  55. #Register subroutines
  56. POE::Session->create(
  57.   inline_states => {
  58.     _start     => \&bot_start,
  59.     irc_001    => \&on_connect,
  60.     irc_public => \&on_public,
  61.     irc_join   => \&on_join,
  62.     irc_nick_sync => \&synced,
  63.     irc_invite => \&invite,
  64.     irc_ctcp_action => \&action,
  65.     irc_nick  => \&nick,
  66.     irc_mode  => \&mode,
  67.     irc_msg   => \&command,
  68.     irc_kick  => \&kick,    
  69.     irc_topic => \&topic,
  70.     heartbeat => \&heartbeat,
  71.     irc_disconnected => \&shutdown,
  72.   },
  73. );
  74.  
  75. #Connect to Server
  76. sub bot_start {
  77.   $irc->yield(register => "all");
  78.   $irc->yield(
  79.     connect => {
  80.       Nick     => $botnick,
  81.       Username => $botnick,
  82.       Ircname  => 'PerlBot written by Kiskae',
  83.       Server   => $botserver,
  84.       Port     => $botport,
  85.       Password => $botpass,
  86.     }
  87.   );
  88.  print "Connected to $botserver....\n";
  89. }
  90.  
  91. #Join Channels
  92. sub on_connect {
  93.   foreach my $channel (@channels) {
  94.     $irc->yield(join => $channel);
  95.     print "Joining " . $channel . "\n";
  96.   }
  97. }
  98.  
  99. #Timer
  100. sub heartbeat {
  101.     $_[KERNEL]->delay(heartbeat => 15);
  102. }
  103.  
  104. #Subroutine Variables
  105. #Bot should be fully functional from this point forward
  106.  
  107. #onKick Messages
  108. my @kicks = ('Good job, Sir', 'He got served!', 'Piss off you lower form of life.', 'You are the weakest link, goodbye.', 'Hey look, there is a troll on your face', "I don't like you", 'Want a cookie? Too bad.');
  109.  
  110.  
  111. #Subroutines
  112.  
  113. sub on_public {
  114.   my ($kernel, $who, $where, $msg) = @_[KERNEL, ARG0, ARG1, ARG2];
  115.   my $nick    = (split /!/, $who)[0];
  116.   my $channel = $where->[0];
  117.   my $ts      = scalar localtime;
  118.   print " [$ts] <$channel> <$nick> $msg\n";
  119.    
  120.   if ($msg =~ /^!song$/i) {
  121.         $irc->yield(privmsg => '#cynical.shoutcast' => '!song ' . $nick . '');
  122.     }
  123.  
  124.   if (($channel eq '#cynical.shoutcast') && ($who =~ /\*\@\*dyneslott\.com/)) {
  125.         $irc->yield(privmsg => '#cynicalbrit' => $msg);
  126.     }
  127.  
  128.   if ($irc->is_channel_operator($channel, $nick)) {
  129.      if ($msg =~ /^!peak$/i || $msg =~ /^!listeners$/i) {
  130.          $irc->yield(privmsg => '#cynical.shoutcast' => $msg);
  131.         };
  132.     };
  133.  }
  134.  
  135. sub on_join {
  136.   my ($kernel, $who, $channel) = @_[KERNEL, ARG0, ARG1];
  137.   my $nick    = (split /!/, $who)[0];
  138.   my $ip      = (split /@/, $who)[1];
  139.   my $ts      = scalar localtime;
  140.   print " [$ts] <$channel> $nick joined\n";
  141.  
  142.  
  143.  
  144. }
  145.  
  146. sub synced {
  147.   my ($kernel, $nick, $channel) = @_[KERNEL, ARG0, ARG1];
  148.   my $ts      = scalar localtime;
  149.   my $who     = $irc->nick_long_form($nick);  
  150.   my $ip      = (split /@/, $who)[1];
  151.   my $qname   = $irc->is_nick_authed($nick);
  152.  
  153.   if ($tbnickcheck) {
  154.          if ((!$qname) || ($qname ne 'TotalBiscuit')) {
  155.              if (($nick =~ /^Total/i) || ($nick =~ /Bain/i) || ($nick =~ /Biscuit/i)) {
  156.              $irc->yield(kick => $channel => $nick => 'You are not TotalBiscuit');
  157.             }
  158.         }
  159.     }
  160.    
  161.  
  162.  
  163. #Adding new user to the database
  164. if ($qname) {
  165.   $mysql->query('SELECT qname, ip, flags, onjoin FROM cynicalbrit WHERE qname = \'' . $qname . '\'');
  166. } elsif ($ip) {
  167.   $mysql->query('SELECT qname, ip, flags, onjoin FROM cynicalbrit WHERE ip = \'' . $ip . '\'');
  168. }
  169.     if (($mysql->has_selected_record) && ($mysql->get_affected_rows_length >= '1')) {
  170.       print "MYSQL has records selected\n";
  171.     } else {
  172.       print "MYSQL couldn't find the records\n";
  173.         if ($qname) {
  174.                if ($ip) {
  175.                 if ($mysql->query('INSERT INTO cynicalbrit (qname, ip, lastknownnick) VALUES (\'' . $qname . '\', \'' . $ip . '\', \'' . $nick . '\')')) {
  176.                      print "Someone with qname inserted into table\n";
  177.                     }
  178.                } else {
  179.                 if ($mysql->query('INSERT INTO cynicalbrit (qname, ip, lastknownnick) VALUES (\'' . $qname . '\', \'' . $qname . '.users.quakenet.org\', \'' . $nick . '\')')) {
  180.                      print "Someone with qname inserted into table\n";
  181.                     }
  182.                }                
  183.         } else {
  184.             if ($mysql->query('INSERT INTO cynicalbrit (ip, lastknownnick) VALUES (\'' . $ip . '\', \'' . $nick . '\')')) {
  185.                  print "Someone without qname inserted into table\n";
  186.             }
  187.         }
  188.      }
  189. }
  190.  
  191. sub nick {
  192.   my ($kernel, $who, $newnick) = @_[KERNEL, ARG0, ARG1];
  193.   my $nick    = (split /!/, $who)[0];
  194.   my $ts      = scalar localtime;
  195.   my $channel = $channels[0];  
  196.  
  197.   my $qname   = $irc->is_nick_authed($newnick);
  198.  
  199.   if ($tbnickcheck) {
  200.          if ((!$qname) || ($qname ne 'TotalBiscuit')) {
  201.              if (($newnick =~ /^Total/i) || ($newnick =~ /Bain/i) || ($newnick =~ /Biscuit/i)) {
  202.              $irc->yield(kick => $channel => $nick => 'You are not TotalBiscuit');
  203.             }
  204.         }
  205.     }
  206.  
  207. }
  208.  
  209. sub invite {
  210.   my ($kernel, $who, $channel) = @_[KERNEL, ARG0, ARG1];
  211.   my $nick    = (split /!/, $who)[0];
  212.   my $ts      = scalar localtime;
  213.  
  214.   my $qname   = $irc->is_nick_authed($nick);
  215.  
  216.   # Stafftitle, decrepated
  217.   #if (!$qname) {
  218.   #   $irc->yield(notice => $nick => 'You do not have necessary permissions to use invite, if you are staff, please log in or fuck off.');
  219.   #} elsif ($qname) {
  220.   # foreach my $staff (keys %stafftitle) {
  221.   #  if ($qname eq $staff) {
  222.   #   $irc->yield(join => $channel);
  223. #    $irc->yield(notice => $nick => 'Joining ' . $channel . '.');
  224. #    print "Joining $channel\n";
  225.  #   }
  226.   # }
  227.   #}
  228. }
  229.  
  230. sub action {
  231.   my ($kernel, $who, $where, $action) = @_[KERNEL, ARG0, ARG1, ARG2];
  232.   my $nick    = (split /!/, $who)[0];
  233.   my $channel = $where->[0];
  234.   my $ts      = scalar localtime;
  235.   print " [$ts] <$channel> *$nick $action\n";
  236.  
  237.   if ($action =~ /^slaps/i) {
  238.          $irc->yield(kick => $channel => $nick => 'Use of the slap command is prohibited.');
  239.     }
  240. }
  241.  
  242. sub topic {
  243.   my ($kernel, $who, $where, $topicscast) = @_[KERNEL, ARG0, ARG1, ARG2];
  244.   my $nick    = (split /!/, $who)[0];
  245.  
  246.    if ($where eq '#cynical.shoutcast') {
  247.         $irc->yield(topic => '#cynicalbrit' => $topicscast);
  248.     }
  249. }  
  250.  
  251. sub mode {
  252.   my ($kernel, $who, $channel, $mode, @victim) = @_[KERNEL, ARG0, ARG1, ARG2, ARG3 .. $#_];
  253.   my $nick    = (split /!/, $who)[0];
  254.   my $ts      = scalar localtime;
  255.  
  256.     foreach my $victim (@victim) {
  257.          print " [$ts] <$channel> $nick applies $mode $victim\n";
  258.     }
  259. }
  260.  
  261. sub command {
  262.   my ($kernel, $who, $msg) = @_[KERNEL, ARG0, ARG2];
  263.   my $nick    = (split /!/, $who)[0];
  264.   my $ts      = scalar localtime;
  265.   my $qname   = $irc->is_nick_authed($nick);
  266.  
  267.   print " [$ts] <Private Command> <$nick> $msg\n";
  268.  
  269.   if (($qname eq 'Raltharg') && ($msg eq '!die')) {
  270.      $irc->yield(notice => $nick => 'Shutting down');
  271.      $irc->yield(quit => 'Shutdown ordered by ' . $nick . '');
  272.      print " [$ts] Shutdown ordered by $nick\n";
  273.   }
  274.  
  275. }
  276.  
  277. sub kick {
  278.   my ($kernel, $who, $channel, $victim, $why) = @_[KERNEL, ARG0, ARG1, ARG2, ARG3];
  279.   my $nick    = (split /!/, $who)[0];
  280.   my $ts      = scalar localtime;
  281.   my $qname   = $irc->is_nick_authed($nick);
  282.  
  283.   print " [$ts] <$channel> $nick has kicked $victim ($why)\n";
  284.  
  285.   # Stafftitle, decrepated
  286.   #if ($qname) {
  287.    #foreach my $staff (keys %stafftitle) {
  288.     #if ($qname eq $staff) {
  289.     #   $irc->yield(privmsg => $channel => $kicks[int rand($#kicks+1)]);
  290.     #}
  291.    #}
  292.   #}
  293.    
  294. }
  295.  
  296. sub shutdown {
  297.   my ($kernel, $qserver) = @_[KERNEL, ARG0];
  298.   my $ts      = scalar localtime;
  299.   print " [$ts] Disconnecting from $qserver\n";
  300.   $irc->yield(shutdown => 'Shutdown');
  301.   exit 0;
  302. }
  303.  
  304. #Experimental - Console Input
  305.  
  306. #chomp (my $input = <>);
  307. #if (my ($msg) = $input =~ /^say (.+)/) {
  308. #   $irc->yield(privmsg => $channels[0] => $msg);
  309. #}
  310.  
  311. #Closing
  312. $poe_kernel->run();
  313. exit 0;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement