1#!/usr/local/bin/perl -T -w 2 3# Harjoitusty�n� tehty skripta. 4 5# K�ytt�: 6# 1) kopioi .irssi/scripts hakemistoon 7# 2) /run ircgmessagenotify.pl 8# 3) /set ircgusername yournick 9# 4) /set ircgpassword yourpassword 10# 5) Voit my�s optionaalisesti s��t�� ircgcheck_interval arvoa joka sekunneissa m���r�� kyselyjen v�lisen ajan sekunteina 11# 6) ircgdo_polling asetus voi olla joko 1 tai 0 ja se m��r�� pollataanko serveri� ylip��ns� 12# 7) /statusbar window add ircgcomments komento lis�� statusbariin kohdan IRCG: n jossa n kuvaa uusien viestien lukum��r��. =) 13# 8) /ircgcomments komento kyselee k�sin pakotettuna tilanteen 14 15# jos polling on asetettu 0 ei edes k�sipelin kysely toimi. 16 17# Kiitokset statusbar ideasta Whiz:ille.. kiitos p�llist� ideasta p�lliin skriptaan jne. 18# Kiitoksia ei heru Whizille kyll�k��n toimimattomista regexpeist�... joutu ihan itse opetteleen keletanatu. 19 20use strict; 21use LWP::UserAgent; 22use HTTP::Cookies; 23use Irssi; 24use Irssi::TextUI; 25 26# ------------------------------------ 27# Ircgalleria skriptin poikanen 28# 29 30use vars qw($VERSION %IRSSI); 31$VERSION = "0.1b"; 32%IRSSI = ( 33 authors => "BCOW", 34 contact => "bcow\@iki.fi", 35 name => "ircgmessagenotify", 36 description => "Tarkistelee irc-galleria.net:i� ja sanoo kun sinulle on uusia viestej�.", 37 sbitems => "ircgcomments", 38 license => "GPLv2", 39 url => "http://www.verkonpaino.net/", 40 changed => "21.01.2004 23:55:00 EET" 41); 42 43# alustetaan asetukset 44Irssi::settings_add_str('ircgmessagenotify', 'ircgusername', ''); 45Irssi::settings_add_str('ircgmessagenotify', 'ircgpassword', ''); 46Irssi::settings_add_int('ircgmessagenotify', 'ircgcheck_interval', '120'); 47Irssi::settings_add_int('ircgmessagenotify', 'ircgdo_polling', '1'); 48 49# alustetaan keksis�il� :P 50my $cookie_jar = HTTP::Cookies->new(file => $ENV{'HOME'}. "/.irssi/ircgmessagenotify_cookie_jar.dat", autosave => 1,); 51# alustetaan viestilaskuri 52my $lastcount = 0; 53# alustetaan timeria 54my $timeout; 55my $timeouttag; 56 57# -- aseta timeri 58sub setup_timer 59{ 60 # aseta uusi timeri 61 $timeout = Irssi::settings_get_int("ircgcheck_interval"); 62 if ($timeout < 60) 63 { 64 $timeout == 60; 65 Irssi::print("ircgcheck_interval ei voi olla pienempi kuin 60. Asetin sen 60:een."); 66 } 67 $timeouttag = Irssi::timeout_add($timeout * 1000, 'check_for_new_messages', ''); 68} 69 70# -- varmistetaan ett� timeri muuttuu ja sen mukaan my�s skriptan ajo. 71sub setup_changed 72{ 73 # m��ritykset muuttui. aseta timeri uudestan =) 74 Irssi::timeout_remove($timeouttag); 75 &setup_timer; 76 # jokatapauksessa piirr� statusbar uudestaan 77 Irssi::statusbar_items_redraw("ircgcomments"); 78} 79 80# -- varsinainen funktio jolla tsekataan viestit 81sub check_messages 82{ 83 my $forced = $_[0]; 84 85 my $ua = LWP::UserAgent->new; 86 $ua->agent("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"); 87 $ua->timeout(10); 88 $ua->cookie_jar($cookie_jar); 89 90 my $irclogin = Irssi::settings_get_str('ircgusername'); 91 my $passwd = Irssi::settings_get_str('ircgpassword'); 92 93 my $req = HTTP::Request->new(POST => "http://irc-galleria.net/login.php"); 94 $req->content_type("application/x-www-form-urlencoded"); 95 $req->content("login=$irclogin&passwd=$passwd"); 96 97 my $res = $ua->request($req); 98 99 # Oliko palautus ok vai virhe 100 if ($res->is_success) { 101 #print $res->content; 102 # okei saatiin tehty� kirjautuminen.. ��m ja saatiin se mit� pit�isikin. t�m� ei ole kuitenkaan se mit� halutaan ;) 103 Irssi::print("ircgmessagenotify.pl sanoo: ���mm.. t�t� ei pit�nyt tapahtua: ". $res->as_string); 104 } elsif ($res->is_redirect) { 105 # okei uudelleenohjaus niinkuin pit�isikin(?) olla� 106 if ($res->header("Location") =~ /error/) 107 { 108 # gallerian virhe 109 Irssi::print("ircgmessagenotify.pl sanoo VIRHE kirjauduttaessa: gallerian virhekoodi!"); 110 } else { 111 # homma ok. Haetaanpas sitten uudella requestilla viestit 112 my $req2 = HTTP::Request->new(GET => "http://irc-galleria.net/". $res->header("Location")); 113 114 # useragent toivottavasti muistaa keksit 115 my $res2 = $ua->request($req2); 116 117 if ($res2->is_success) 118 { 119 # ookii ;) saatiin content! 120 if ($res2->content =~ /Sinulle on uusia kommentteja/) 121 { 122 #Irssi::print("Sinulle on uusia kommentteja irc-galleriassa!!!"); 123 my $newcount = $res2->content; 124 #$newcount =~ s/.*commentcount\"\>\(//i; 125 #$newcount =~ s/\)\<.*//i; 126 127 # irroita arvo :) 128 $newcount =~ /.*commentcount\"\>\((\d)\)\<.*/; 129 $newcount = $1; 130 131 my $uusia = $newcount - $lastcount; 132 133 #Irssi::print("Uusia: $uusia, newcount: $newcount, lastcount: $lastcount"); 134 135 # sitten viimeinen tarkistus ;) 136 if ($lastcount < $newcount) 137 { 138 # uusia viestej�! jeee! 139 Irssi::print("Sinulle on irc-galleriassa $uusia kpl uusia kommentteja. Yhteens� $newcount kpl."); 140 } elsif ($lastcount > $newcount) { 141 # viestej� on luettu sitten viimekerran tai jotain muuta hassua, mutta niit� on kuitenkin 142 Irssi::print("Sinulle on irc-galleriassa $newcount kpl viestej� odottamassa lukemista."); 143 } # nolla tekee jotakin omituista :) 144 145 # aseta arvo 146 $lastcount = $newcount; 147 } else { 148 # aseta arvo nollille koska ei ole uusia viestej� 149 $lastcount = 0; 150 if ($forced == 1) 151 { 152 # hassuja ep�loogisuuksia tuossa ylemp�n� ja siin� mit� t�ss� tapahtuu ;) 153 Irssi::print("Sinulle ei ole uusia kommentteja irc-galleriassa."); 154 } 155 } 156 } else { 157 # virhe :((( 158 Irssi::print("ircgmessagenotify.pl sanoo VIRHE viestien lukum��r�� selvitett�ess�: ". $res2->status_line); 159 } 160 } 161 } else { 162 #print $res->status_line, "\n"; 163 # virhe :((( 164 Irssi::print("ircgmessagenotify.pl sanoo VIRHE kirjauduttaessa: ". $res->status_line); 165 } 166} 167 168# -- tarkista pakotetusti 169sub check_messages_forced 170{ 171 &check_messages(1); 172 # jokatapauksessa piirr� statusbar uudestaan 173 Irssi::statusbar_items_redraw("ircgcomments"); 174} 175 176# -- tarkista onko uusia viestej� eli yhdy palvelimeen ja tsekkaa lukema 177sub check_for_new_messages 178{ 179 # tarkista tarvitseeko tehd� mit��n? 180 if (Irssi::settings_get_int("ircgdo_polling") > 0) 181 { 182 #Irssi::print("Tick"); 183 &check_messages(0); 184 } # do_polling 185 # jokatapauksessa piirr� statusbar uudestaan 186 Irssi::statusbar_items_redraw("ircgcomments"); 187} 188 189# -- n�yt� tieto t�n hetkisest� laskurista statusbarissa -) 190sub statusbar 191{ 192 my ($item, $get_size_only) = @_; 193 194 my $state; 195 196 if (Irssi::settings_get_int("ircgdo_polling") > 0) 197 { 198 # jos pollataan n�yt�kkin jotain 199 $state = $lastcount; 200 } else { 201 # ei pollata joten n�yt� - 202 $state = "-"; 203 } 204 205 $item->default_handler($get_size_only, undef, "IRCG: $state", 1); 206} 207 208# Kiinnitet��n timeri 209&setup_timer; 210 211# sitten signaali liitoksia 212Irssi::signal_add("setup changed", "setup_changed"); 213 214# ja komento liitoksia 215Irssi::command_bind('ircgcomments', 'check_messages_forced'); 216 217# viimeiseksi j�� statusbar liitos 218Irssi::statusbar_item_register('ircgcomments','{sb $0-}', 'statusbar'); 219