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');