diff options
Diffstat (limited to 'scripts/ircgmessagenotify.pl')
-rw-r--r-- | scripts/ircgmessagenotify.pl | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/scripts/ircgmessagenotify.pl b/scripts/ircgmessagenotify.pl new file mode 100644 index 0000000..cb019d1 --- /dev/null +++ b/scripts/ircgmessagenotify.pl @@ -0,0 +1,218 @@ +#!/usr/bin/perl -T -w + +# Harjoitustyönä tehty skripta. + +# Käyttö: +# 1) kopioi .irssi/scripts hakemistoon +# 2) /run ircgmessagenotify.pl +# 3) /set ircgusername yournick +# 4) /set ircgpassword yourpassword +# 5) Voit myös optionaalisesti säätää ircgcheck_interval arvoa joka sekunneissa määärää kyselyjen välisen ajan sekunteina +# 6) ircgdo_polling asetus voi olla joko 1 tai 0 ja se määrää pollataanko serveriä ylipäänsä +# 7) /statusbar window add ircgcomments komento lisää statusbariin kohdan IRCG: n jossa n kuvaa uusien viestien lukumäärää. =) +# 8) /ircgcomments komento kyselee käsin pakotettuna tilanteen + +# jos polling on asetettu 0 ei edes käsipelin kysely toimi. + +# Kiitokset statusbar ideasta Whiz:ille.. kiitos pällistä ideasta pälliin skriptaan jne. +# Kiitoksia ei heru Whizille kylläkään toimimattomista regexpeistä... joutu ihan itse opetteleen keletanatu. + +use strict; +use LWP::UserAgent; +use HTTP::Cookies; +use Irssi; +use Irssi::TextUI; + +# ------------------------------------ +# Ircgalleria skriptin poikanen +# + +use vars qw($VERSION %IRSSI); +$VERSION = "0.1b"; +%IRSSI = ( + authors => "BCOW", + contact => "bcow\@iki.fi", + name => "ircgmessagenotify", + description => "Tarkistelee irc-galleria.net:iä ja sanoo kun sinulle on uusia viestejä.", + sbitems => "ircgcomments", + license => "GPLv2", + url => "http://www.verkonpaino.net/", + changed => "21.01.2004 23:55:00 EET" +); + +# alustetaan asetukset +Irssi::settings_add_str('ircgmessagenotify', 'ircgusername', ''); +Irssi::settings_add_str('ircgmessagenotify', 'ircgpassword', ''); +Irssi::settings_add_int('ircgmessagenotify', 'ircgcheck_interval', '120'); +Irssi::settings_add_int('ircgmessagenotify', 'ircgdo_polling', '1'); + +# alustetaan keksisäilö :P +my $cookie_jar = HTTP::Cookies->new(file => $ENV{'HOME'}. "/.irssi/ircgmessagenotify_cookie_jar.dat", autosave => 1,); +# alustetaan viestilaskuri +my $lastcount = 0; +# alustetaan timeria +my $timeout; +my $timeouttag; + +# -- aseta timeri +sub setup_timer +{ + # aseta uusi timeri + $timeout = Irssi::settings_get_int("ircgcheck_interval"); + if ($timeout < 60) + { + $timeout == 60; + Irssi::print("ircgcheck_interval ei voi olla pienempi kuin 60. Asetin sen 60:een."); + } + $timeouttag = Irssi::timeout_add($timeout * 1000, 'check_for_new_messages', ''); +} + +# -- varmistetaan että timeri muuttuu ja sen mukaan myös skriptan ajo. +sub setup_changed +{ + # määritykset muuttui. aseta timeri uudestan =) + Irssi::timeout_remove($timeouttag); + &setup_timer; + # jokatapauksessa piirrä statusbar uudestaan + Irssi::statusbar_items_redraw("ircgcomments"); +} + +# -- varsinainen funktio jolla tsekataan viestit +sub check_messages +{ + my $forced = $_[0]; + + my $ua = LWP::UserAgent->new; + $ua->agent("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"); + $ua->timeout(10); + $ua->cookie_jar($cookie_jar); + + my $irclogin = Irssi::settings_get_str('ircgusername'); + my $passwd = Irssi::settings_get_str('ircgpassword'); + + my $req = HTTP::Request->new(POST => "http://irc-galleria.net/login.php"); + $req->content_type("application/x-www-form-urlencoded"); + $req->content("login=$irclogin&passwd=$passwd"); + + my $res = $ua->request($req); + + # Oliko palautus ok vai virhe + if ($res->is_success) { + #print $res->content; + # okei saatiin tehtyä kirjautuminen.. ööm ja saatiin se mitä pitäisikin. tämä ei ole kuitenkaan se mitä halutaan ;) + Irssi::print("ircgmessagenotify.pl sanoo: ööömm.. tätä ei pitänyt tapahtua: ". $res->as_string); + } elsif ($res->is_redirect) { + # okei uudelleenohjaus niinkuin pitäisikin(?) olla´ + if ($res->header("Location") =~ /error/) + { + # gallerian virhe + Irssi::print("ircgmessagenotify.pl sanoo VIRHE kirjauduttaessa: gallerian virhekoodi!"); + } else { + # homma ok. Haetaanpas sitten uudella requestilla viestit + my $req2 = HTTP::Request->new(GET => "http://irc-galleria.net/". $res->header("Location")); + + # useragent toivottavasti muistaa keksit + my $res2 = $ua->request($req2); + + if ($res2->is_success) + { + # ookii ;) saatiin content! + if ($res2->content =~ /Sinulle on uusia kommentteja/) + { + #Irssi::print("Sinulle on uusia kommentteja irc-galleriassa!!!"); + my $newcount = $res2->content; + #$newcount =~ s/.*commentcount\"\>\(//i; + #$newcount =~ s/\)\<.*//i; + + # irroita arvo :) + $newcount =~ /.*commentcount\"\>\((\d)\)\<.*/; + $newcount = $1; + + my $uusia = $newcount - $lastcount; + + #Irssi::print("Uusia: $uusia, newcount: $newcount, lastcount: $lastcount"); + + # sitten viimeinen tarkistus ;) + if ($lastcount < $newcount) + { + # uusia viestejä! jeee! + Irssi::print("Sinulle on irc-galleriassa $uusia kpl uusia kommentteja. Yhteensä $newcount kpl."); + } elsif ($lastcount > $newcount) { + # viestejä on luettu sitten viimekerran tai jotain muuta hassua, mutta niitä on kuitenkin + Irssi::print("Sinulle on irc-galleriassa $newcount kpl viestejä odottamassa lukemista."); + } # nolla tekee jotakin omituista :) + + # aseta arvo + $lastcount = $newcount; + } else { + # aseta arvo nollille koska ei ole uusia viestejä + $lastcount = 0; + if ($forced == 1) + { + # hassuja epäloogisuuksia tuossa ylempänä ja siinä mitä tässä tapahtuu ;) + Irssi::print("Sinulle ei ole uusia kommentteja irc-galleriassa."); + } + } + } else { + # virhe :((( + Irssi::print("ircgmessagenotify.pl sanoo VIRHE viestien lukumäärää selvitettäessä: ". $res2->status_line); + } + } + } else { + #print $res->status_line, "\n"; + # virhe :((( + Irssi::print("ircgmessagenotify.pl sanoo VIRHE kirjauduttaessa: ". $res->status_line); + } +} + +# -- tarkista pakotetusti +sub check_messages_forced +{ + &check_messages(1); + # jokatapauksessa piirrä statusbar uudestaan + Irssi::statusbar_items_redraw("ircgcomments"); +} + +# -- tarkista onko uusia viestejä eli yhdy palvelimeen ja tsekkaa lukema +sub check_for_new_messages +{ + # tarkista tarvitseeko tehdä mitään? + if (Irssi::settings_get_int("ircgdo_polling") > 0) + { + #Irssi::print("Tick"); + &check_messages(0); + } # do_polling + # jokatapauksessa piirrä statusbar uudestaan + Irssi::statusbar_items_redraw("ircgcomments"); +} + +# -- näytä tieto tän hetkisestä laskurista statusbarissa -) +sub statusbar +{ + my ($item, $get_size_only) = @_; + + my $state; + + if (Irssi::settings_get_int("ircgdo_polling") > 0) + { + # jos pollataan näytäkkin jotain + $state = $lastcount; + } else { + # ei pollata joten näytä - + $state = "-"; + } + + $item->default_handler($get_size_only, undef, "IRCG: $state", 1); +} + +# Kiinnitetään timeri +&setup_timer; + +# sitten signaali liitoksia +Irssi::signal_add("setup changed", "setup_changed"); + +# ja komento liitoksia +Irssi::command_bind('ircgcomments', 'check_messages_forced'); + +# viimeiseksi jää statusbar liitos +Irssi::statusbar_item_register('ircgcomments','{sb $0-}', 'statusbar'); |