Advertisement
m4ly

ircbot

Dec 3rd, 2015
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 10.68 KB | None | 0 0
  1. #!/usr/bin/perl -w
  2.  
  3. # Autor: Dawid Mocek <dawid.mocek@gmail.com>
  4. # Day-trader.pl Simple IRC  Bot
  5. # Version 2012-10
  6.  
  7. use warnings;
  8. use strict;
  9. #use Data::Dumper;
  10. use POE qw(Component::Schedule Component::IRC Component::IRC::Plugin::BotCommand Component::IRC::Plugin::Connector);
  11. #use LWP::Simple;
  12. #use XML::Simple;
  13. use DBI;
  14. use DateTime;
  15. use DateTime::Set;
  16. use IRC::Utils qw(PINK NORMAL RED BROWN ORANGE TEAL YELLOW BLUE LIGHT_CYAN LIGHT_GREEN PURPLE LIGHT_BLUE);
  17.  
  18. #my $pid = $$;
  19. #open my $fd, '>', "/home/dawid/irbcot/traderbot.pid" or die $!;
  20. #print $fd $pid;
  21. #close $pid or die $!;
  22.  
  23.  
  24. my $sqlu = "";
  25. my $sqlpass = "";
  26. my $sqldb = "";
  27. my $sqlquotetable = "market_data";
  28.  
  29. my $debuglogfile = "TraderBot.debug.txt";
  30. my $nickpass = "";
  31.  
  32. my $dbh = DBI->connect('DBI:mysql:' . $sqldb, $sqlu, $sqlpass);
  33. $dbh->{mysql_auto_reconnect} = 1;
  34.  
  35. my $stmttop10vol = $dbh->prepare("SELECT ticker, volume FROM " . $sqlquotetable ." order by volume desc limit 10");
  36. my $stmttickerinfo = $dbh->prepare("SELECT * FROM " . $sqlquotetable ." WHERE ticker = ?");
  37. my $stmtearnings = $dbh->prepare("SELECT GROUP_CONCAT(earnings_whispers.ticker SEPARATOR ', ') as tickers FROM earnings_whispers LEFT JOIN market_data ON market_data.ticker = earnings_whispers.ticker WHERE DATE(earnings_whispers.earn_time) = CURDATE() AND stage = ? ORDER BY market_data.avgdailyvolume DESC");
  38. my $stmttop10gainers = $dbh->prepare("SELECT ticker,perchange FROM ". $sqlquotetable. " WHERE volume >= ? ORDER BY perchange DESC LIMIT 10");
  39. my $stmttop10losers = $dbh->prepare("SELECT ticker,perchange FROM ". $sqlquotetable. " WHERE volume >= ? ORDER BY perchange ASC LIMIT 10");
  40. my $stmtbyspreadasc = $dbh->prepare("SELECT ticker FROM ".$sqlquotetable." WHERE volume >= ? ORDER BY spread ASC LIMIT 25");
  41. my $stmtbyspreaddesc = $dbh->prepare("SELECT ticker FROM ".$sqlquotetable." WHERE volume >= ? ORDER BY spread DESC LIMIT 25");
  42. my $stmtevents = $dbh->prepare("SELECT wiadomosc FROM irc_events WHERE czas = ?");
  43. my $stmttradehalts = $dbh->prepare("SELECT issue_symbol, halt_datetime, reason_code, pause_price, res_date, res_trade_time FROM trade_halts limit 25");
  44. my $stmtlatestipo = $dbh->prepare("SELECT data, ticker, exchange, companyname FROM symbols_update WHERE action='added' ORDER BY id DESC LIMIT 10");
  45. my $stmtdivs = $dbh->prepare("SELECT GROUP_CONCAT(ticker SEPARATOR ', ') FROM thestreetdivs WHERE exdate = CURDATE()");
  46. my ($irc) = POE::Component::IRC->spawn();
  47.  
  48. my $poe_session = POE::Session->create(
  49.     inline_states => {
  50.     _start => \&bot_start,
  51.     irc_001 => \&irc_001,
  52.     irc_255 => \&irc_255,
  53.     irc_notice => \&irc_notice,
  54.     irc_msg => \&on_msg,
  55.     irc_public => \&irc_public,
  56. #   _default => \&handle_default,
  57.     irc_botcmd_tickerinfo => \&irc_botcmd_tickerinfo,
  58.     irc_botcmd_earnings => \&irc_botcmd_earnings,
  59.     irc_botcmd_top10 => \&irc_botcmd_top10,
  60.     irc_botcmd_slap => \&irc_botcmd_slap,
  61.     irc_botcmd_top10vol => \&irc_botcmd_top10vol,
  62.     irc_botcmd_tradehalts => \&irc_botcmd_tradehalts,
  63.     irc_botcmd_latestipo => \&irc_botcmd_latestipo,
  64.     irc_botcmd_divs => \&irc_botcmd_divs,
  65.     tick => \&tick,
  66.     },
  67.     );
  68.    
  69. sub bot_start {
  70.     my($kernel, $heap) = @_[KERNEL, HEAP];
  71.  
  72.     $heap->{sched} = POE::Component::Schedule->add(
  73.             $_[SESSION],
  74.              tick => DateTime::Set->from_recurrence(
  75.                 after => DateTime->now,
  76.                 #before => DateTime->now->add(seconds => 60),
  77.                 recurrence => sub {
  78.                         return $_[0]->truncate(to => 'second')->add( seconds => 1 )
  79.             },
  80.             ),
  81.         );
  82.     $kernel->delay('tick', 10);
  83.            
  84.     $heap->{connector} = POE::Component::IRC::Plugin::Connector->new();
  85.  
  86.     $irc->plugin_add('Connector' => $heap->{connector});
  87.     $irc->plugin_add('BotCommand', POE::Component::IRC::Plugin::BotCommand->new(
  88.             Commands => {
  89.                 slap => 'Takes one argument: a nickname to slap.',
  90.                 tickerinfo => 'Takes one argument: symbol.',
  91.                 earnings => 'Takes one argument: bmo or amc. bmo = before market open, amc = after market close.',
  92.                 top10 => 'Takes two arguments: first, minimum current volume; second gainers or losers.',
  93.                 top10vol => 'Top ten volume',
  94.                 tradehalts => 'Trade halts.',
  95.                 latestipo => '10 latest IPO.',
  96.                 divs => 'List of dividends for today.',
  97.                 },
  98.                 In_channnels => 0,
  99.                 In_private => 1,
  100.                 Ignore_unknow => 1,
  101.                 Method => 'privmsg',
  102.                
  103.             ));
  104.     $irc->yield(register => "all");
  105.     $irc->yield(
  106.     connect => {
  107.     Nick => "nina",
  108.     Username => "ninabot",
  109.     Ircname => "Nina the Trader Bot",
  110.     Server => "irc.pirc.pl",
  111. #   Server => "212.106.159.129",
  112.     Port => 6667,
  113.     Flood => 0,
  114. #   Bitmode => 2,
  115.     NoDNS => 1,
  116. #   Raw => 0,
  117.    
  118.     }
  119.     );
  120.     $kernel->delay('lag_o_meter' => 60);
  121.     return;
  122. }
  123.  
  124. sub irc_001 {
  125.  my($kernel, $sender) = @_[KERNEL, SENDER];
  126.  
  127. }
  128.  
  129. sub irc_255 {
  130.     $_[KERNEL]->post($irc => join => "#day-trader.pl");
  131.     $_[KERNEL]->post($irc => 'mode' => "nina" => "+B+i");
  132. #   $_[KERNEL]->post($irc => join => "#exchange");
  133.   }
  134.  
  135. sub irc_notice {
  136.   my $msg = $_[ARG2];
  137.   if($msg =~ m!/msg.*(NickServ).*(IDENTIFY)!i) {
  138.     $_[KERNEL]->post($irc => privmsg =>  $1, "$2 $nickpass");
  139.     }
  140. }
  141.  
  142. sub irc_public {
  143.     my $kernel = $_[KERNEL];
  144.     my $nick = (split /!/, $_[ARG0])[0];
  145.     my $channel = $_[ARG1]->[0];
  146.     my $msg = $_[ARG2];
  147.  
  148.  
  149.     if($msg =~ /^!killnina/i) {
  150.     exit 0;
  151.     }
  152.     if($msg =~ /where\s+long|where\s+short/i) {
  153.           $kernel->post($irc => privmsg => $channel, "$nick, honey its time to use your brain.... or F13 button ;-)");
  154.     }
  155.     if($msg =~ /szmata|szmato|dziwko|dziwka|piczka/i) {
  156.           $kernel->post($irc => privmsg => $channel, "$nick: foch.");
  157.     }
  158.     if($msg =~ /ladnie\s+wyglada|ladny\s+long|ladny\s+short|\s+nice long/i) {
  159.           $kernel->post($irc => privmsg => $channel, "$nick: my tits re still better :-)");
  160.     }
  161.     if($msg =~ /payout\s+([0-9]{2})%/i) {
  162.      my $payout = $1;
  163.      
  164.           if(sprintf("%i", $payout) <= 95) {
  165.           $kernel->post($irc => privmsg => $channel, "$nick, payout $payout% ? what a loser!");
  166.           }
  167.           else {
  168.           $kernel->post($irc => privmsg => $channel, "$nick, u ve $payout% payout? Will u mary me ?");
  169.           }
  170.     }
  171.    
  172. }
  173.  
  174. sub on_msg {
  175.     my($kernel, $who, $where, $msg) = @_[KERNEL, ARG0, ARG1, ARG2];
  176.     my $nick = ( split /!/, $who )[0];
  177. }
  178.  
  179. sub irc_botcmd_slap {
  180.     my $nick = (split /!/, $_[ARG0])[0];
  181.     my ($where, $arg) = @_[ARG1, ARG2];
  182.     $irc->yield(ctcp => $where, "ACTION slaps $arg");
  183.     return;
  184. }
  185.  
  186. sub irc_botcmd_tickerinfo {
  187.     my $nick = (split /!/, $_[ARG0])[0];
  188.     my ($where, $arg) = @_[ARG1, ARG2];
  189.     if($arg =~ /^([a-z]{1,6})$/i) {
  190.     $stmttickerinfo->execute($1);
  191.         my $res = $stmttickerinfo->fetchrow_hashref;
  192.     delete($res->{id});
  193.         foreach my $f ( keys(%$res) ) {
  194.         $irc->yield(privmsg => $nick, uc($f) .": ". $res->{$f} );
  195.     }
  196.     }
  197. }
  198. sub irc_botcmd_earnings {
  199.     my $nick = (split /!/, $_[ARG0])[0];
  200.     my ($where, $arg) = @_[ARG1, ARG2];
  201.     if($arg =~ /^(bmo|amc)$/i) {
  202.         $stmtearnings->execute(uc($1));
  203.         my $res = $stmtearnings->fetchrow_hashref;
  204.         $irc->yield(privmsg => $nick, $res->{tickers} );
  205.     }
  206. }
  207.  
  208. sub irc_botcmd_top10 {
  209.     my $nick = (split /!/, $_[ARG0])[0];
  210.     my ($where, $arg) = @_[ARG1, ARG2];
  211.  
  212.     if($arg =~ /^([^0][0-9]{2,12})\s+(gainers|losers)$/i) {
  213.     my $volume = $1;
  214.     my $userside = $2;
  215.     if($userside =~ /^gainers$/) {
  216.     $stmttop10gainers->execute($volume);
  217.         while( my @row = $stmttop10gainers->fetchrow_array) {
  218.         $irc->yield(privmsg => $nick, $row[0] . " " .$row[1] . "%");
  219.         }
  220.     }
  221.     if($userside =~ /^losers$/) {
  222.     $stmttop10losers->execute($volume);
  223.         while( my @row = $stmttop10losers->fetchrow_array) {
  224.         $irc->yield(privmsg => $nick, $row[0] . " " .$row[1] . "%");
  225.         }
  226.     }
  227.    
  228.     }
  229. }
  230.  
  231. sub irc_botcmd_top10vol {
  232.     my $nick = (split /!/, $_[ARG0])[0];
  233.     my ($where, $arg) = @_[ARG1, ARG2];
  234.     $stmttop10vol->execute;
  235.     while( my @row = $stmttop10vol->fetchrow_array) {
  236.       $irc->yield(privmsg => $nick, $row[0] . " " .$row[1]);
  237.     }
  238. }
  239.  
  240. sub irc_botcmd_byspread  {
  241.     my $nick = (split /!/, $_[ARG0])[0];
  242.     my ($where, $arg) = @_[ARG1, ARG2];
  243.    
  244.     if($arg =~ /^([^0][0-9]{2,12})\s+(asc|desc)$/i) {
  245.      my $side = $2;
  246.      if($side =~ /^asc$/) {}
  247.      if($side =~ /^desc$/) {}
  248.     }
  249. }
  250. sub irc_botcmd_tradehalts {
  251.     my $nick = (split /!/, $_[ARG0])[0];
  252.     my ($where, $arg) = @_[ARG1, ARG2];
  253.  
  254.         $stmttradehalts->execute();
  255.         $irc->yield(privmsg => $nick, PINK."Symbol".ORANGE." Halt date          ". BROWN ." Reason". TEAL." Pause price" . ORANGE ." Resume date");
  256.         while( my @row = $stmttradehalts->fetchrow_array) {
  257.        
  258.         $irc->yield(privmsg => $nick,  PINK . addspaces($row[0],6) ." ".ORANGE. $row[1] ." ".BROWN . addspaces($row[2],6) . " ".TEAL . addspaces($row[3],10)." ". ORANGE ." ".$row[4] . " ". $row[5]);
  259.     }
  260.     }
  261. sub irc_botcmd_latestipo {
  262.     my $nick = (split /!/, $_[ARG0])[0];
  263.     my ($where, $arg) = @_[ARG1, ARG2];
  264.     $stmtlatestipo->execute();
  265.     $irc->yield(privmsg => $nick,  ORANGE."Added date ".PINK."Symbol ".LIGHT_CYAN."Market ".LIGHT_GREEN."Name");
  266.     while( my @row = $stmtlatestipo->fetchrow_array) {
  267.     $irc->yield(privmsg => $nick, ORANGE.$row[0]." ".PINK.$row[1] ." ".LIGHT_CYAN.$row[2]." ".LIGHT_GREEN.$row[3]);
  268.     }
  269. }
  270.  
  271. sub irc_botcmd_divs {
  272.     my $nick = (split /!/, $_[ARG0])[0];
  273.     my ($where, $arg) = @_[ARG1, ARG2];
  274.    
  275.     $stmtdivs->execute();
  276.      my $row = $stmtdivs->fetchrow_array;
  277.      if(defined($row)) {
  278.          $irc->yield(privmsg => $where, $row);
  279.         }
  280.    
  281. }
  282. sub tick {
  283.           my($kernel, $heap) = @_[KERNEL, HEAP];
  284.           my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime(time);
  285.           my $date  = sprintf("%4d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
  286.           $stmtevents->execute($date);
  287.       #    if($stmtevents->{NUM_OF_FIELDS} > 0) {
  288.             while(my @row = $stmtevents->fetchrow_array()) {
  289.              $kernel->post($irc => notice => "#day-trader.pl", $row[0]);
  290.        #     }
  291.           }
  292. }
  293.  
  294. sub lag_o_meter {
  295.     my($kernel, $heap) = @_[KERNEL, HEAP];
  296.     $kernel->delay(lag_o_meter => 60);
  297.      return;
  298. }
  299.  
  300. sub handle_default {
  301.   my($event, $args) = @_[ARG0 .. $#_];
  302.   print  "Unhandled $event\n";
  303.   my $arg_number = 0;
  304.   foreach(@$args) {
  305.     print  " ARG$arg_number = ";
  306.     if(ref($_) eq 'ARRAY') {
  307.     print  "$_ = [", join(", ", @$_), "]\n";
  308.     }
  309.     else {
  310.     print  "'$_'\n";
  311.     }
  312.     $arg_number++;
  313.   }
  314.   return 0;
  315. }
  316.  
  317.  
  318. sub addspaces {
  319.  
  320.  my $text = $_[0];
  321.  #if($text =~ /^0000-00-00$/){ $text = ""; }
  322.  #if($text =~ /^00:00:00$/){ $text = ""; }
  323. # if($text =~ /^0\.0000$/){ $text = ""; }
  324.  my $max_len = $_[1];
  325.  my $cnt = $max_len - length $text;
  326.  
  327.  return sprintf("%s%".$cnt."s", $text, " ");
  328.  }
  329. $poe_kernel->run();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement