html/ircgmessagenotify.pl


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