Jacek Kowalski
2012-09-16 d8d9ecd00a4d9e972c87e719df988941fcad3e9e
commit | author | age
8bd4d9 1 <?php
JK 2 class rss implements module {
3     static function register_cmd() {
4         return array(
5             'r' => 'cmd_rss',
6             'rss' => 'cmd_rss',
7             'kanal' => 'cmd_rss',
8             'kanaly' => 'cmd_rss',
9             'news' => 'cmd_rss',
10             'newsy' => 'cmd_rss',
11             'wiad' => 'cmd_rss',
12             'wiadomosc' => 'cmd_rss',
13             'wiadomosci' => 'cmd_rss',
14             
15             'kanal' => 'cmd_set',
16             'kanaly' => 'cmd_set',
17             
18             'rss2' => 'cmd_rssex',
19             'exrss' => 'cmd_rssex',
20             'rssex' => 'cmd_rssex',
21         );
22     }
23     
24     static function help($cmd=NULL) {
25         if($cmd === NULL) {
26             GGapi::putRichText('rss ', TRUE);
27             GGapi::putRichText('[kanał]', FALSE, TRUE);
28             GGapi::putRichText("\n".'   Wiadomości z podanego kanału'."\n");
29             GGapi::putRichText('kanal ', TRUE);
30             GGapi::putRichText('kanał', FALSE, TRUE);
31             GGapi::putRichText("\n".'   Ustawia domyślny kanał dla komendy rss'."\n\n");
32         }
33         elseif($cmd == 'kanal' || $cmd == 'kanaly') {
34             GGapi::putRichText('kanal ', TRUE);
35             GGapi::putRichText('kanał', FALSE, TRUE);
36             GGapi::putRichText("\n".'   Zapisuje domyślny ');
37             GGapi::putRichText('kanał', FALSE, TRUE);
38             GGapi::putRichText(' RSS dla użytkownika. Dostępne kanały: '."\n".'- '.implode("\n".'- ', self::channels()));
39         }
40         else
41         {
42             GGapi::putRichText('rss ', TRUE);
43             GGapi::putRichText('[kanał]', FALSE, TRUE);
44             GGapi::putRichText(' (alias: ');
45             GGapi::putRichText('r, news, wiadomosci', TRUE);
46             GGapi::putRichText(')'."\n".'   Podaje ostatnie wiadomości z kanału RSS ');
47             GGapi::putRichText('kanał', FALSE, TRUE);
48             GGapi::putRichText('. Dostępne kanały: '."\n".'- '.implode("\n".'- ', self::channels()));
49         }
50     }
51     
52     private static function channels() {
53         $file = file('./data/rss/channels.list');
54         $return = array();
55         foreach($file as $chan) {
56             $chan = trim($chan);
57             if(empty($chan) || substr($chan, 0, 1)=='#') {
58                 continue;
59             }
60             
61             $parts = preg_split('/\t[\40\t]*/', $chan, 4);
62             for($i=0; $i<4; $i++) {
63                 $parts[$i] = trim($parts[$i]);
64             }
65             
66             if($aliases) {
67                 $return[$parts[1]] = $parts[1];
68                 
69                 if($parts[2] == 'NULL') continue;
70                 
71                 $alias = explode(',', $parts[2]);
72                 foreach($alias as $val) {
73                     $return[trim($val)] = $parts[1];
74                 }
75             }
76             else
77             {
78                 $return[] = $parts[1];
79             }
80         }
81         
82         return $return;
83     }
84     
85     private static function channel($name, $verbose=FALSE) {
86         $file = file('./data/rss/channels.list');
87         
88         foreach($file as $chan) {
89             $chan = trim($chan);
90             if(empty($chan) || substr($chan, 0, 1)=='#') {
91                 continue;
92             }
93             
94             $parts = preg_split('/\t[\40\t]*/', $chan, 4);
95             for($i=1; $i<3; $i++) {
96                 $parts[$i] = trim($parts[$i]);
97             }
98             
99             if($parts[1] == $name) {
100                 if($verbose) {
101                     return $parts;
102                 }
103                 else
104                 {
105                     return $parts[1];
106                 }
107             }
108             elseif($parts[2] == 'NULL') {
109                 continue;
110             }
111             else
112             {
113                 $alias = explode(',', $parts[2]);
114                 foreach($alias as $val) {
115                     if($val == $name) {
116                         if($verbose) {
117                             return $parts;
118                         }
119                         else
120                         {
121                             return $parts[1];
122                         }
123                     }
124                 }
125             }
126         }
127         
128         return FALSE;
129     }
130     
131     static function p($text, $bash=FALSE) {
132         $text = trim($text);
133         $replace = array(
134             "\n" => ' ',
135             "\r" => ' ',
136             '–' => '-',
137             '&#8211;' => '-',
138             '&#39;' => '"',
139             '&#8222;' => '"',
140             '&#8221;' => '"',
141         );
142         $text = strtr($text, $replace);
143         $text = html_entity_decode($text);
144         $replace = array(
145             '<br />' => "\n",
146             '<br/>' => "\n",
147             '<br>' => "\n",
148             '  ' => ' ',
149         );
150         $text = strtr($text, $replace);
151         if(!$bash) {
152             $text = strip_tags($text);
153         }
154         $text = str_replace(array('&copy;', '&#169;'), '(C)', $text);
155         return $text;
156     }
157     
158     static function cmd_rss($name, $arg) {
159         $arg = self::channel(funcs::utfToAscii($arg));
160         if(!$arg) {
161             $arg = database::get($_GET['from'], 'rss', 'kanal');
162             if(!$arg) {
163                 $arg = self::channel('DEFAULT');
164             }
165         }
166         
167         $rss = @simplexml_load_file('./data/rss/'.$arg.'.rss');
168         if(!$rss) {
169             GGapi::putText('Błąd przy przetwarzaniu kanału, przepraszamy.');
170             return FALSE;
171         }
172         
173         GGapi::putRichText(self::p($rss->channel->title), TRUE);
174         if($rss->channel->copyright) {
175             GGapi::putRichText("\n".self::p($rss->channel->copyright));
176         }
177         
178         foreach($rss->channel->item as $item) {
179             GGapi::putRichText("\n\n".self::p($item->title), TRUE);
180             GGapi::putRichText("\n".self::p($item->description, ($arg=='bash'))."\n".self::p($item->link));
181         
182             if(GGapi::getLength() > 1700) {
183                 return;
184             }
185         }
186     }
187     
188     static function cmd_set($name, $arg) {
189         $arg = self::channel(funcs::utfToAscii($arg), TRUE);
190         if(!$arg) {
191             GGapi::putText('Wybrany kanał nie istnieje! Dostępne kanały: '."\n".'- '.implode("\n".'- ', self::channels()));
192         }
193         else
194         {
195             database::add($_GET['from'], 'rss', 'kanal', $arg[1]);
196             GGapi::putText('Kanał '.$arg[3].' został ustawiony jako domyślny. Teraz zamiast:'."\n".'rss '.$arg[1]."\n".'możesz wpisać samo'."\n".'rss');
197         }
198     }
199     
200     static function testurl($url) {
201         $url = parse_url($url);
202         $schemas = array('http', 'https', 'ftp');
203         if(empty($url['scheme'])) {
204             return array(-1, 'Podaj pełny adres do kanału RSS (z http://)!');
205         }
206         if(!in_array(strtolower($url['scheme']), $schemas)) {
207             return array(-1, 'Niedozowolona metoda dostępu (dostępne: http, https, ftp)');
208         }
209         
210         $hosts = gethostbynamel($url['host']);
211         if(!is_array($hosts)) return array(-2, 'Podany host nie istnieje');
212         foreach($hosts as $ip) {
213             if(substr($ip, 0, 4)=='127.' || substr($ip, 0, 3)=='10.' || substr($ip, 0, 2)=='0.' || substr($ip, 0, 3) > 223) {
214                 return array(-2, 'Niedozwolony numer IP hosta');
215             }
216         }
217         
218         $res = @simplexml_load_file($url['scheme'].'://'.$url['user'].':'.$url['pass'].'@'.$url['host'].'/'.ltrim($url['path'], '/'));
219         if(!$res) {
220             return array(-3, 'Nie udało się załadować podanego kanału RSS');
221         }
222         
223         return $res;
224     }
225     
226     static function cmd_rssex($name, $arg) {
227         if(!$arg) {
228             $arg = database::get($_GET['from'], 'rssex', 'kanal');
229             if(!$arg) {
230                 GGapi::putText('Podaj pełny adres kanału (z http://) lub ustaw domyślny funkcją ');
231                 GGapi::putRichText('kanal2', TRUE);
232                 GGapi::putRichText('!'."\n\n");
233                 GGapi::putRichText('Przykład:', FALSE, FALSE, TRUE);
234                 GGapi::putRichText("\n".'rss2 http://wiadomosci.onet.pl/2,kategoria.rss');
235                 return FALSE;
236             }
237         }
238         
239         $rss = self::testurl($arg);
240         if(is_array($rss)) {
241             GGapi::putText('Nie udało się pobrać wybranego kanału RSS. Błąd: '.$rss[1]);
242             return FALSE;
243         }
244         elseif(!is_object($rss)) {
245             GGapi::putText('Wystąpił nieznany błąd przy pobieraniu danych. Przepraszamy.');
246         }
247         
248         GGapi::putRichText(self::p($rss->channel->title), TRUE);
249         if($rss->channel->copyright) {
250             GGapi::putRichText("\n".self::p($rss->channel->copyright));
251         }
252         
253         foreach($rss->channel->item as $item) {
254             GGapi::putRichText("\n\n".self::p($item->title), TRUE);
255             GGapi::putRichText("\n".self::p($item->description, ($arg=='bash'))."\n".self::p($item->link));
256         
257             if(GGapi::getLength() > 1700) {
258                 return;
259             }
260         }
261     }
262     
263     static function cmd_setex($name, $arg) {
264         if(!$arg) {
265             GGapi::putText('Podaj pełny adres kanału (z http://)!'."\n\n");
266             GGapi::putRichText('Przykład:', FALSE, FALSE, TRUE);
267             GGapi::putRichText("\n".'kanal2 http://wiadomosci.onet.pl/2,kategoria.rss');
268         }
269         else
270         {
271             $ret = self::testurl($arg);
272             if(is_object($ret)) {
273                 database::add($_GET['from'], 'rssex', 'kanal', $arg[1]);
274                 GGapi::putText('Kanał '.$arg.' został ustawiony jako domyślny. Teraz zamiast:'."\n".'rss '.$arg."\n".'możesz wpisać samo'."\n".'rss');
275             }
276             elseif(is_array($ret)) {
277                 GGapi::putText('Nie udało się pobrać wybranego kanału RSS. Błąd: '.$ret[1]);
278             }
279             else
280             {
281                 GGapi::putText('Wystąpił nieznany błąd przy pobieraniu danych. Przepraszamy.');
282             }
283         }
284     }
285 }
286 ?>