#!/usr/bin/perl

$SIG{INT}=\&sigint;
if ($^O !~ /win/i) {
  open STDERR, '>>/home/unibot/radar/radar_error.log';
}

use omnibot;
use gclient;
use Text::Unidecode;

my $irc=omnibot::init();

$irc->{server}="141.138.137.123";
$irc->{port}=6661;
$irc->{servername}="LichtSnel IRC Community";
$irc->{nick}="Radar";
$irc->{altnick}="Radar_";
# $irc->{channels} = [ '#test','#radio' ];
$irc->{channels} = [ '#112','#112-groningen' ];
$irc->{ident}="Radar";
$irc->{desc}="LichtSnel 112 Alarmerings Botje";

$irc->{nickserv}="NickServ!nickserv\@services.lichtsnel.nl";
#$irc->{nickserv}=undef;
$irc->{password}="r0z3b33rtj3";
$irc->{autoreg}=1;

$irc->{gaininfo}=0;
$irc->{antiflood}=0;

$irc->{verbose}=1;
$irc->{verboseoutput}=0;
$irc->{verbosepong}=0;
$irc->{verboseevents}=0;
$irc->{verbosewhois}=0;
$irc->{verbosemotd}=0;
$irc->{verboseprivmsg}=0;

$irc->{events}{joined}=\&event_joined;
$irc->{events}{join}=\&event_join;
$irc->{events}{connect}=\&event_connect;
$irc->{events}{disconnect}=\&event_disconnect;
$irc->{events}{privmsg}=\&event_privmsg;
$irc->{events}{whois}=\&event_whois;
$irc->{events}{notice}=\&event_notice;

my $LAST;
$irc->addtimer("112",2,0,10,\&getdata);

$irc->start();

sub sigint {
  $irc->quit;
  exit 1
}

#############################################################################
#         TIMERS                                                            #
#############################################################################

sub getdata {
  print "** GETDATA **\n";
  my $cont=gclient::website("http://feeds.livep2000.nl");
  # foreach my $k (sort keys %{$cont->{header}}) { print "$k => ",$cont->{header}{$k},"\n" }
  my $dat=$cont->{content};
  # print substr($dat,0,1000),"\n";
  my @blocks=split(/\<item\>/,$dat); shift @blocks;
  my $first; my $cnt=0; my @buf=();
  foreach $block (@blocks) {
    print "$block\n";
    my $tit; my $guid; my $desc;
    if ($block =~ /\<guid\>(.+)\<\/guid\>/) {
      $guid=$1
    }
    if (!$first) { $first=$guid };
    if ($guid eq $LAST) { $LAST=$first; printbuf(@buf); return }
    if ($block =~ /\<title\>(.+)\<\/title\>/) {
      $tit=$1;
      if ($tit =~ /CDATA\[(.+)\]\]/) {
        $tit=$1
      }
      $tit =~ s/[\r\n\t]/ /g; $tit =~ s/^\s+//; $tit =~ s/[\s\~]+$//;   
    }
    if ($block =~ /\<description\>(.+)\<\/description\>/) {
      $desc=$1;
      if ($desc =~ /CDATA\[(.+)\]\]/) {
        $desc=$1
      }
      $desc =~ s/\<br\/\>/ /g;
      $desc =~ s/\<i .+\>(.+)\<\/i\>/$1/g;
      $desc =~ s/[\r\n\t]/ /g; $desc =~ s/^\s+//; $desc =~ s/[\s\~]+$//; $desc =~ s/\s\s/ /g;
    }
    unshift @buf,"$tit ($desc)";
    $cnt++; if ($cnt==10) { last }
  }
  printbuf(@buf);
  $LAST=$first;
}

sub printbuf {
  foreach my $t (@_) {
    print "- $t\n";
    $irc->msg("#112",$t);
    if ($t =~ /groningen/i) { $irc->msg("#112-groningen",$t) }
  }
}
#############################################################################
#         EVENTS                                                            #
#############################################################################

sub event_connect {
  print STDOUT "*~*~* Welkom bij 112-alarmerings-bot Radar *~*~*\n";
}

sub event_disconnect {
  print STDOUT "*~*~* Tot ziens! *~*~*\n";
}

sub event_privmsg {
  my ($client,$level,$message,$channel,$nick,$ident,$host) = @_;
  if ($message =~ /^\!uptime$/i) { handle_uptime($channel) }
  if ($channel eq 'Chaosje') { handle_private($channel,$message) }
}

sub event_notice {
  my ($client,$level,$message,$channel,$nick,$ident,$host) = @_;
}

sub event_joined {
  my ($client,$level,$channel,$nick) = @_;
}

sub event_join {
  my ($client,$level,$channel,$nick) = @_;
#  $irc->msg($channel,"\0032Welkom $nick! Je kunt hier niets zeggen maar geniet van de nieuws-flood.")
}

sub event_whois {
  my ($client,$level,$message,$channel,$nick,$ident,$host) = @_;
}

#############################################################################
#         HANDLES                                                           #
#############################################################################

sub handle_private {
  my ($channel,$message) = @_;
  print "* PRIVATE = $message\n";
  if ($message =~ /^help/i) {
    $irc->msg($channel,"\002quit\002 Restart het botje \002whois IP/Host\002 Zie welke nick iemand heeft \002say #channel/nick text\002 Laat Pegasos iets zeggen")
  }
  if ($message =~ /^quit$/i) {
    $irc->msg($channel,"Now Quitting..");
    $irc->{quitmessage}="Pegasos is ff updaten, zo terug!"; $irc->{quit}=1
  }
  elsif ($message =~ /^quit\s(.+)$/i) { $irc->{quitmessage}=$1; $irc->{quit}=1 }
  if ($message =~ /^say\s(.+)$/i) {
    my $msg=$1;
    my @list=split(/\s/,$msg);
    my $chan=shift @list;
    $irc->msg($chan,join(" ",@list))
  }
}

sub handle_uptime {
  my ($channel) = @_;
  my $sec=gettimeofday()-$STARTTIME;
  my $out="Ik ben online voor ";
  if ($sec>86400) {
    my $days=($sec/86400)>>0;
    $sec=$sec % 86400;
    $out.="$days dagen, "
  }
  if ($sec>3600) {
    my $hr=($sec/3600)>>0;
    $sec=$sec % 3600;
    $out.="$hr uur, "
  }
  if ($sec>60) {
    my $min=($sec/60)>>0;
    $sec=$sec % 60;
    $out.="$min minuten, "
  }
  $out.="$sec seconden";
  $irc->msg($channel,$out)
}

############################################################################
#              NIEUWS                                                      #
############################################################################

sub filter {
  my ($desc)=@_;
  if ($desc =~ /\[CDATA\[(.+)\]\]/) {
    $desc=$1
  }
  if ($desc =~ /\<p\>(.+)\<\/p\>/i) {
    $desc=$1
  }
  $desc =~ s/<![CDATA[]]>//g;
  $desc =~ s/&#x([A-Fa-f\d]{2});/chr hex $1/eg;
  $desc =~ s/&#([\d]{2});/unidecode(chr $1)/eg;
  $desc =~ s/&#([\d]{3});/unidecode(chr $1)/eg;
  $desc =~ s/&#([\d]{4});/unidecode(chr $1)/eg;
  $desc =~ s/&lt;em&gt;/"/g;
  $desc =~ s/&lt;\/em&gt;/"/g;
  $desc =~ s/&gt;/>/g;
  $desc =~ s/&lt;/</g;
  $desc =~ s/&quot;/"/g;
  $desc =~ s/&amp;/&/g;
  $desc =~ s/\<a href.+\<\/a\>//g;
  $desc =~ s/ \(\)//g;
  $desc =~ s/http\:\/\/[^\s]+\.jpg//g;
  $desc =~ s/\<\/?em\>/\002/g;
  $desc =~ s/^\?v=[a-z0-9]+\s//i;
  return $desc
}

sub default {
  my ($site,$title,$color,$control) = @_;
  my $cont=gweb::website($site);
  my $web=$cont->{content};
  my @list=split(/\<item\>/,$web);
  shift @list;
  my $item=shift @list;
  my $link;
  if ($item =~ /link\>(.+)?\<\/link/) { $link=$1 } else { return $control }
  my $reallink=$link;
  if (($site =~ /\/www.nu.nl\//) || ($site =~ /\/www.volkskrant.nl\//)) {
    my @ls=split(/\//,$link); $link=$ls[4];
  } elsif ($site =~ /\/www.telegraaf.nl\//) {
    my @ls=split(/\//,$link); pop @ls; $link=pop @ls
  } elsif ($site =~ /\/www.krantenkoppen.eu\//) {
    if ($link =~ /\/nl\/nu-nl\//) { return $control }
    if ($link =~ /\/nl\/elsevier-nl\//) { return $control }
    if ($link =~ /\/nl\/telegraaf-nl\//) { return $control }
    if ($link =~ /\/nl\/volkskrant\//) { return $control }
  }
  if ($control ne $link) {
    if (inbuffer($link)) { return $link }
    my @out=(); my $desc;
    if ($item =~ /\<description\>(.+)\<\/description\>/) { $desc=$1 }
    $desc=filter($desc);
    $irc->msg("#nieuws","\003$color\[$title]\003 $desc\00310 $reallink\003");
  }
  return $link
}
