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