Jacek Kowalski
2016-02-12 e785f2c811a3e6bef9e53ad1ae91f3c774d2f42f
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         
ff648f 173         if($rss->entry) {
JK 174             GGapi::putRichText(self::p($rss->title), TRUE);
175             
176             foreach($rss->entry as $item) {
177                 GGapi::putRichText("\n\n".self::p($item->title), TRUE);
178                 GGapi::putRichText("\n".self::p($item->summary, ($arg=='bash'))."\n".self::p($item->link['href']));
179             
180                 if(GGapi::getLength() > 1700) {
181                     return;
182                 }
183             }
8bd4d9 184         }
ff648f 185         else
JK 186         {
187             GGapi::putRichText(self::p($rss->channel->title), TRUE);
188             if($rss->channel->copyright) {
189                 GGapi::putRichText("\n".self::p($rss->channel->copyright));
190             }
191             
192             foreach($rss->channel->item as $item) {
193                 GGapi::putRichText("\n\n".self::p($item->title), TRUE);
194                 GGapi::putRichText("\n".self::p($item->description, ($arg=='bash'))."\n".self::p($item->link));
195             
196                 if(GGapi::getLength() > 1700) {
197                     return;
198                 }
8bd4d9 199             }
JK 200         }
201     }
202     
203     static function cmd_set($name, $arg) {
204         $arg = self::channel(funcs::utfToAscii($arg), TRUE);
205         if(!$arg) {
206             GGapi::putText('Wybrany kanał nie istnieje! Dostępne kanały: '."\n".'- '.implode("\n".'- ', self::channels()));
207         }
208         else
209         {
210             database::add($_GET['from'], 'rss', 'kanal', $arg[1]);
211             GGapi::putText('Kanał '.$arg[3].' został ustawiony jako domyślny. Teraz zamiast:'."\n".'rss '.$arg[1]."\n".'możesz wpisać samo'."\n".'rss');
212         }
213     }
214     
215     static function testurl($url) {
216         $url = parse_url($url);
217         $schemas = array('http', 'https', 'ftp');
218         if(empty($url['scheme'])) {
219             return array(-1, 'Podaj pełny adres do kanału RSS (z http://)!');
220         }
221         if(!in_array(strtolower($url['scheme']), $schemas)) {
222             return array(-1, 'Niedozowolona metoda dostępu (dostępne: http, https, ftp)');
223         }
224         
225         $hosts = gethostbynamel($url['host']);
226         if(!is_array($hosts)) return array(-2, 'Podany host nie istnieje');
227         foreach($hosts as $ip) {
228             if(substr($ip, 0, 4)=='127.' || substr($ip, 0, 3)=='10.' || substr($ip, 0, 2)=='0.' || substr($ip, 0, 3) > 223) {
229                 return array(-2, 'Niedozwolony numer IP hosta');
230             }
231         }
232         
233         $res = @simplexml_load_file($url['scheme'].'://'.$url['user'].':'.$url['pass'].'@'.$url['host'].'/'.ltrim($url['path'], '/'));
234         if(!$res) {
235             return array(-3, 'Nie udało się załadować podanego kanału RSS');
236         }
237         
238         return $res;
239     }
240     
241     static function cmd_rssex($name, $arg) {
242         if(!$arg) {
243             $arg = database::get($_GET['from'], 'rssex', 'kanal');
244             if(!$arg) {
245                 GGapi::putText('Podaj pełny adres kanału (z http://) lub ustaw domyślny funkcją ');
246                 GGapi::putRichText('kanal2', TRUE);
247                 GGapi::putRichText('!'."\n\n");
248                 GGapi::putRichText('Przykład:', FALSE, FALSE, TRUE);
249                 GGapi::putRichText("\n".'rss2 http://wiadomosci.onet.pl/2,kategoria.rss');
250                 return FALSE;
251             }
252         }
253         
254         $rss = self::testurl($arg);
255         if(is_array($rss)) {
256             GGapi::putText('Nie udało się pobrać wybranego kanału RSS. Błąd: '.$rss[1]);
257             return FALSE;
258         }
259         elseif(!is_object($rss)) {
260             GGapi::putText('Wystąpił nieznany błąd przy pobieraniu danych. Przepraszamy.');
261         }
262         
263         GGapi::putRichText(self::p($rss->channel->title), TRUE);
264         if($rss->channel->copyright) {
265             GGapi::putRichText("\n".self::p($rss->channel->copyright));
266         }
267         
268         foreach($rss->channel->item as $item) {
269             GGapi::putRichText("\n\n".self::p($item->title), TRUE);
270             GGapi::putRichText("\n".self::p($item->description, ($arg=='bash'))."\n".self::p($item->link));
271         
272             if(GGapi::getLength() > 1700) {
273                 return;
274             }
275         }
276     }
277     
278     static function cmd_setex($name, $arg) {
279         if(!$arg) {
280             GGapi::putText('Podaj pełny adres kanału (z http://)!'."\n\n");
281             GGapi::putRichText('Przykład:', FALSE, FALSE, TRUE);
282             GGapi::putRichText("\n".'kanal2 http://wiadomosci.onet.pl/2,kategoria.rss');
283         }
284         else
285         {
286             $ret = self::testurl($arg);
287             if(is_object($ret)) {
288                 database::add($_GET['from'], 'rssex', 'kanal', $arg[1]);
289                 GGapi::putText('Kanał '.$arg.' został ustawiony jako domyślny. Teraz zamiast:'."\n".'rss '.$arg."\n".'możesz wpisać samo'."\n".'rss');
290             }
291             elseif(is_array($ret)) {
292                 GGapi::putText('Nie udało się pobrać wybranego kanału RSS. Błąd: '.$ret[1]);
293             }
294             else
295             {
296                 GGapi::putText('Wystąpił nieznany błąd przy pobieraniu danych. Przepraszamy.');
297             }
298         }
299     }
300 }
301 ?>