| @@ 23-455 (lines=433) @@ | ||
| 20 | * @author Michael Albertsen (http://culex.dk) <[email protected]> |
|
| 21 | */ |
|
| 22 | ||
| 23 | class SmallworldAdmin |
|
| 24 | { |
|
| 25 | /** |
|
| 26 | * Get oldest message in Db |
|
| 27 | * @returns time |
|
| 28 | */ |
|
| 29 | public function oldestMsg() |
|
| 30 | { |
|
| 31 | global $xoopsDB; |
|
| 32 | $date = 0; |
|
| 33 | $sql = 'SELECT * FROM ' . $xoopsDB->prefix('smallworld_messages') . ' ORDER BY created LIMIT 1'; |
|
| 34 | $result = $xoopsDB->queryF($sql); |
|
| 35 | $counter = $xoopsDB->getRowsNum($result); |
|
| 36 | if ($counter >= 1) { |
|
| 37 | while ($sqlfetch = $xoopsDB->fetchArray($result)) { |
|
| 38 | $date = $sqlfetch['created']; |
|
| 39 | } |
|
| 40 | } |
|
| 41 | ||
| 42 | return $date; |
|
| 43 | } |
|
| 44 | ||
| 45 | /** |
|
| 46 | * Get average messages sent per day |
|
| 47 | * @param int $totaldays |
|
| 48 | * @return int|string |
|
| 49 | */ |
|
| 50 | public function AvgMsgDay($totaldays) |
|
| 51 | { |
|
| 52 | global $xoopsDB; |
|
| 53 | $sql = 'SELECT count( * ) / ' . $totaldays . ' AS averg FROM ' . $xoopsDB->prefix('smallworld_messages') . ''; |
|
| 54 | $result = $xoopsDB->queryF($sql); |
|
| 55 | while ($sqlfetch = $xoopsDB->fetchArray($result)) { |
|
| 56 | $avg = number_format($sqlfetch['averg'], 2, '.', ','); |
|
| 57 | } |
|
| 58 | ||
| 59 | return $avg; |
|
| 60 | } |
|
| 61 | ||
| 62 | /** |
|
| 63 | * total users using smallworld |
|
| 64 | * @return int |
|
| 65 | */ |
|
| 66 | public function TotalUsers() |
|
| 67 | { |
|
| 68 | global $xoopsDB; |
|
| 69 | $sql = 'SELECT * FROM ' . $xoopsDB->prefix('smallworld_user') . ''; |
|
| 70 | $result = $xoopsDB->queryF($sql); |
|
| 71 | $counter = $xoopsDB->getRowsNum($result); |
|
| 72 | if ($counter < 1) { |
|
| 73 | $sum = 0; |
|
| 74 | } else { |
|
| 75 | $i = 0; |
|
| 76 | while ($myrow = $xoopsDB->fetchArray($result)) { |
|
| 77 | $user[$i]['username'] = $myrow['username']; |
|
| 78 | ++$i; |
|
| 79 | } |
|
| 80 | $all = $this->flatten($user); |
|
| 81 | $sum = count(array_unique($all)); |
|
| 82 | $unique = array_unique($all); |
|
| 83 | } |
|
| 84 | ||
| 85 | return $sum; |
|
| 86 | } |
|
| 87 | ||
| 88 | /** |
|
| 89 | * Get version of module |
|
| 90 | * @returns string |
|
| 91 | */ |
|
| 92 | public function ModuleInstallVersion() |
|
| 93 | { |
|
| 94 | global $xoopsModule; |
|
| 95 | $version = round($xoopsModule->getVar('version') / 100, 2); |
|
| 96 | ||
| 97 | return $version; |
|
| 98 | } |
|
| 99 | ||
| 100 | /** |
|
| 101 | * Get date when Module was installed |
|
| 102 | * @return string|time |
|
| 103 | */ |
|
| 104 | public function ModuleInstallDate() |
|
| 105 | { |
|
| 106 | global $xoopsModule; |
|
| 107 | $date = formatTimestamp($xoopsModule->getVar('last_update'), 'm'); |
|
| 108 | ||
| 109 | return $date; |
|
| 110 | } |
|
| 111 | ||
| 112 | /** |
|
| 113 | * Count total days represented in db |
|
| 114 | * @return float|int|time |
|
| 115 | */ |
|
| 116 | public function CountDays() |
|
| 117 | { |
|
| 118 | global $xoopsDB, $xoopsModule; |
|
| 119 | $date = $this->oldestMsg(); |
|
| 120 | $now = time(); |
|
| 121 | $diff = ($now - $date) / (60 * 60 * 24); |
|
| 122 | ||
| 123 | return $diff; |
|
| 124 | } |
|
| 125 | ||
| 126 | /** |
|
| 127 | * find user with most posted messages |
|
| 128 | * @returns array |
|
| 129 | */ |
|
| 130 | public function mostactiveusers_allround() |
|
| 131 | { |
|
| 132 | global $xoopsDB, $xoopsUser; |
|
| 133 | $sql = 'SELECT uid_fk, COUNT( * ) as cnt '; |
|
| 134 | $sql .= 'FROM ( '; |
|
| 135 | $sql .= 'SELECT uid_fk '; |
|
| 136 | $sql .= 'FROM ' . $xoopsDB->prefix('smallworld_messages') . ' '; |
|
| 137 | $sql .= 'UNION ALL SELECT uid_fk '; |
|
| 138 | $sql .= 'FROM ' . $xoopsDB->prefix('smallworld_comments') . ' '; |
|
| 139 | $sql .= ') AS u '; |
|
| 140 | $sql .= 'GROUP BY uid_fk '; |
|
| 141 | $sql .= 'ORDER BY count( * ) DESC limit 20'; |
|
| 142 | $result = $xoopsDB->queryF($sql); |
|
| 143 | $counter = $xoopsDB->getRowsNum($result); |
|
| 144 | ||
| 145 | if ($counter < 1) { |
|
| 146 | $msg = []; |
|
| 147 | } else { |
|
| 148 | $msg = []; |
|
| 149 | $i = 1; |
|
| 150 | while ($row = $xoopsDB->fetchArray($result)) { |
|
| 151 | $msg['counter'][$i] = $i; |
|
| 152 | $msg['img'][$i] = "<img style='margin:0px 5px;' src = '../assets/images/" . $i . ".png'>"; |
|
| 153 | if ($msg['counter'][$i] > 3) { |
|
| 154 | $msg['img'][$i] = ''; |
|
| 155 | } |
|
| 156 | $msg['cnt'][$i] = $row['cnt']; |
|
| 157 | $msg['from'][$i] = $xoopsUser->getUnameFromId($row['uid_fk']); |
|
| 158 | ++$i; |
|
| 159 | } |
|
| 160 | } |
|
| 161 | ||
| 162 | return $msg; |
|
| 163 | } |
|
| 164 | ||
| 165 | /** |
|
| 166 | * find user with most posted messages in last 24 hours |
|
| 167 | * @returns array |
|
| 168 | */ |
|
| 169 | public function mostactiveusers_today() |
|
| 170 | { |
|
| 171 | global $xoopsDB, $xoopsUser; |
|
| 172 | $sql = 'SELECT uid_fk, COUNT( * ) as cnt '; |
|
| 173 | $sql .= 'FROM ( '; |
|
| 174 | $sql .= 'SELECT uid_fk '; |
|
| 175 | $sql .= 'FROM ' . $xoopsDB->prefix('smallworld_messages') . ' '; |
|
| 176 | $sql .= 'WHERE `created` > UNIX_TIMESTAMP(DATE_SUB( NOW( ) , INTERVAL 1 DAY )) '; |
|
| 177 | $sql .= 'UNION ALL SELECT uid_fk '; |
|
| 178 | $sql .= 'FROM ' . $xoopsDB->prefix('smallworld_comments') . ' '; |
|
| 179 | $sql .= 'WHERE `created` > UNIX_TIMESTAMP(DATE_SUB( NOW( ) , INTERVAL 1 DAY )) '; |
|
| 180 | $sql .= ') AS u '; |
|
| 181 | $sql .= 'GROUP BY uid_fk '; |
|
| 182 | $sql .= 'ORDER BY count( * ) DESC limit 20'; |
|
| 183 | ||
| 184 | $result = $xoopsDB->queryF($sql); |
|
| 185 | $msgtoday = []; |
|
| 186 | ||
| 187 | if (0 != $xoopsDB->getRowsNum($result)) { |
|
| 188 | $i = 1; |
|
| 189 | while ($row = $xoopsDB->fetchArray($result)) { |
|
| 190 | $msgtoday['counter'][$i] = $i; |
|
| 191 | $msgtoday['img'][$i] = "<img style='margin:0px 5px;' src = '../assets/images/" . $i . ".png'>"; |
|
| 192 | if ($msgtoday['counter'][$i] > 3) { |
|
| 193 | $msgtoday['img'][$i] = ''; |
|
| 194 | } |
|
| 195 | $msgtoday['cnt'][$i] = $row['cnt']; |
|
| 196 | $msgtoday['from'][$i] = $xoopsUser->getUnameFromId($row['uid_fk']); |
|
| 197 | ++$i; |
|
| 198 | } |
|
| 199 | } else { |
|
| 200 | $msgtoday = []; |
|
| 201 | } |
|
| 202 | ||
| 203 | return $msgtoday; |
|
| 204 | } |
|
| 205 | ||
| 206 | /** |
|
| 207 | * Find best OR worst rated users |
|
| 208 | * @param string $direction |
|
| 209 | * @returns array |
|
| 210 | */ |
|
| 211 | public function topratedusers($direction) |
|
| 212 | { |
|
| 213 | global $xoopsUser, $xoopsDB, $xoopsTpl; |
|
| 214 | $array = []; |
|
| 215 | ||
| 216 | if ('up' === $direction) { |
|
| 217 | $sql = 'SELECT owner, count(*) AS cnt FROM ' . $xoopsDB->prefix('smallworld_vote') . " WHERE up='1' GROUP BY owner ORDER BY cnt DESC LIMIT 20"; |
|
| 218 | $result = $xoopsDB->queryF($sql); |
|
| 219 | $count = $xoopsDB->getRowsNum($result); |
|
| 220 | $i = 1; |
|
| 221 | if ($count >= $i) { |
|
| 222 | while ($row = $xoopsDB->fetchArray($result)) { |
|
| 223 | $array['counter'][$i] = $i; |
|
| 224 | $array['img'][$i] = "<img height='10px' width='10px' " . "style='margin:0px 5px;' src = '../assets/images/like.png'>"; |
|
| 225 | if ($array['counter'][$i] > 3) { |
|
| 226 | $array['img'][$i] = ''; |
|
| 227 | } |
|
| 228 | $array['cnt'][$i] = $row['cnt']; |
|
| 229 | $array['user'][$i] = $xoopsUser->getUnameFromId($row['owner']); |
|
| 230 | ++$i; |
|
| 231 | } |
|
| 232 | } else { |
|
| 233 | $array = []; |
|
| 234 | } |
|
| 235 | } else { |
|
| 236 | $sql = 'SELECT owner, count(*) AS cnt FROM ' . $xoopsDB->prefix('smallworld_vote') . " WHERE down='1' GROUP BY owner ORDER BY cnt DESC LIMIT 20"; |
|
| 237 | $result = $xoopsDB->queryF($sql); |
|
| 238 | $count = $xoopsDB->getRowsNum($result); |
|
| 239 | $i = 1; |
|
| 240 | if (0 != $count) { |
|
| 241 | while ($row = $xoopsDB->fetchArray($result)) { |
|
| 242 | $array['counter'][$i] = $i; |
|
| 243 | $array['img'][$i] = "<img height='10px' width='10px' " . "style='margin:0px 5px;' src = '../assets/images/dislike.png'>"; |
|
| 244 | if ($array['counter'][$i] > 3) { |
|
| 245 | $array['img'][$i] = ''; |
|
| 246 | } |
|
| 247 | $array['cnt'][$i] = $row['cnt']; |
|
| 248 | $array['user'][$i] = $xoopsUser->getUnameFromId($row['owner']); |
|
| 249 | ++$i; |
|
| 250 | } |
|
| 251 | } else { |
|
| 252 | $array = []; |
|
| 253 | } |
|
| 254 | } |
|
| 255 | ||
| 256 | return $array; |
|
| 257 | } |
|
| 258 | ||
| 259 | /** |
|
| 260 | * Get all users to loop in admin for administration |
|
| 261 | * @param string $inspect |
|
| 262 | * @returns array |
|
| 263 | */ |
|
| 264 | public function getAllUsers($inspect) |
|
| 265 | { |
|
| 266 | global $xoopsDB, $xoopsUser, $xoopsTpl; |
|
| 267 | $data = []; |
|
| 268 | if ('yes' === $inspect) { |
|
| 269 | $sql = 'SELECT * FROM ' . $xoopsDB->prefix('smallworld_admin') . ' WHERE (inspect_start + inspect_stop) >= ' . time() . ' ORDER BY username'; |
|
| 270 | } else { |
|
| 271 | $sql = 'SELECT * FROM ' . $xoopsDB->prefix('smallworld_admin') . ' WHERE (inspect_start + inspect_stop) < ' . time() . ' ORDER BY username'; |
|
| 272 | } |
|
| 273 | $result = $xoopsDB->queryF($sql); |
|
| 274 | $count = $xoopsDB->getRowsNum($result); |
|
| 275 | if (0 != $count) { |
|
| 276 | while ($row = $xoopsDB->fetchArray($result)) { |
|
| 277 | $data[] = $row; |
|
| 278 | } |
|
| 279 | } |
|
| 280 | if (!empty($data)) { |
|
| 281 | return $data; |
|
| 282 | } |
|
| 283 | } |
|
| 284 | ||
| 285 | /** |
|
| 286 | * check server if update is available |
|
| 287 | * Server currently at culex.dk |
|
| 288 | * Variable $version = current smallworld version number |
|
| 289 | * @return string |
|
| 290 | */ |
|
| 291 | public function doCheckUpdate() |
|
| 292 | { |
|
| 293 | global $pathIcon16; |
|
| 294 | $version = $this->ModuleInstallVersion(); |
|
| 295 | $critical = false; |
|
| 296 | $update = false; |
|
| 297 | $rt = ''; |
|
| 298 | $url = 'http://www.culex.dk/updates/smallworld_version.csv'; |
|
| 299 | $fileC = $this->fetchURL($url, ['fopen', 'curl', 'socket']); |
|
| 300 | $read = explode(';', $fileC); |
|
| 301 | ||
| 302 | $upd_img = $pathIcon16 . '/on.png'; |
|
| 303 | ||
| 304 | if ($read[0] > $version && '1' == $read[2]) { |
|
| 305 | $critical = true; |
|
| 306 | $upd_img = $pathIcon16 . '/off.png'; |
|
| 307 | } |
|
| 308 | if ($read[0] > $version && '1' != $read[2]) { |
|
| 309 | $update = true; |
|
| 310 | $upd_img = '../assets/images/upd_normal.png'; |
|
| 311 | } |
|
| 312 | if ($critical) { |
|
| 313 | $rt = "<div class='smallworld_update'><img src='" . $upd_img . "'>"; |
|
| 314 | $rt .= _AM_SMALLWORLD_UPDATE_CRITICAL_UPD . '</div>'; |
|
| 315 | $rt .= "<textarea class='xim_update_changelog'>" . $read[1] . '</textarea><br><br>'; |
|
| 316 | $rt .= _AM_SMALLWORLD_UPDATE_SERVER_FILE . "<br><a href='" . $read[3] . "'>" . $read[3] . '</a>'; |
|
| 317 | } elseif ($update) { |
|
| 318 | $rt = "<div class='smallworld_update'><img src='" . $upd_img . "'>"; |
|
| 319 | $rt .= _AM_SMALLWORLD_UPDATE_NORMAL_UPD . '</div>'; |
|
| 320 | $rt .= "<textarea class='smallworld_update_changelog'>" . $read[1] . '</textarea><br><br>'; |
|
| 321 | $rt .= _AM_SMALLWORLD_UPDATE_SERVER_FILE . "<br><a href='" . $read[3] . "'>" . $read[3] . '</a>'; |
|
| 322 | } else { |
|
| 323 | $rt = "<div class='smallworld_update'><br><img src='" . $upd_img . "'>" . _AM_SMALLWORLD_UPDATE_YOUHAVENEWESTVERSION . '</div>'; |
|
| 324 | } |
|
| 325 | ||
| 326 | return $rt; |
|
| 327 | } |
|
| 328 | ||
| 329 | /** |
|
| 330 | * Fetch content of comma separated text file |
|
| 331 | * will attempt to use the fopen method first, then curl, then socket |
|
| 332 | * @param string $url |
|
| 333 | * @param array $methods |
|
| 334 | * @returns string |
|
| 335 | */ |
|
| 336 | public function fetchURL($url, $methods = ['fopen', 'curl', 'socket']) |
|
| 337 | { |
|
| 338 | /** |
|
| 339 | * December 21st 2010, Mathew Tinsley ([email protected]) |
|
| 340 | * http://tinsology.net |
|
| 341 | * |
|
| 342 | * To the extent possible under law, Mathew Tinsley has waived all copyright and related or |
|
| 343 | * neighboring rights to this work. There's absolutely no warranty. |
|
| 344 | */ |
|
| 345 | if ('string' === gettype($methods)) { |
|
| 346 | $methods = [$methods]; |
|
| 347 | } elseif (!is_array($methods)) { |
|
| 348 | return false; |
|
| 349 | } |
|
| 350 | foreach ($methods as $method) { |
|
| 351 | switch ($method) { |
|
| 352 | case 'fopen': |
|
| 353 | //uses file_get_contents in place of fopen |
|
| 354 | //allow_url_fopen must still be enabled |
|
| 355 | if (ini_get('allow_url_fopen')) { |
|
| 356 | $contents = file_get_contents($url); |
|
| 357 | if (false !== $contents) { |
|
| 358 | return $contents; |
|
| 359 | } |
|
| 360 | } |
|
| 361 | break; |
|
| 362 | case 'curl': |
|
| 363 | if (function_exists('curl_init')) { |
|
| 364 | $ch = curl_init(); |
|
| 365 | curl_setopt($ch, CURLOPT_URL, $url); |
|
| 366 | curl_setopt($ch, CURLOPT_HEADER, 0); |
|
| 367 | // return the value instead of printing the response to browser |
|
| 368 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); |
|
| 369 | $result = curl_exec($ch); |
|
| 370 | curl_close($ch); |
|
| 371 | //return curl_exec($ch); |
|
| 372 | return $result; |
|
| 373 | } |
|
| 374 | break; |
|
| 375 | case 'socket': |
|
| 376 | //make sure the url contains a protocol, otherwise $parts['host'] won't be set |
|
| 377 | if (0 !== strpos($url, 'http://') && 0 !== strpos($url, 'https://')) { |
|
| 378 | $url = 'http://' . $url; |
|
| 379 | } |
|
| 380 | $parts = parse_url($url); |
|
| 381 | if ('https' === $parts['scheme']) { |
|
| 382 | $target = 'ssl://' . $parts['host']; |
|
| 383 | $port = isset($parts['port']) ? $parts['port'] : 443; |
|
| 384 | } else { |
|
| 385 | $target = $parts['host']; |
|
| 386 | $port = isset($parts['port']) ? $parts['port'] : 80; |
|
| 387 | } |
|
| 388 | $page = isset($parts['path']) ? $parts['path'] : ''; |
|
| 389 | $page .= isset($parts['query']) ? '?' . $parts['query'] : ''; |
|
| 390 | $page .= isset($parts['fragment']) ? '#' . $parts['fragment'] : ''; |
|
| 391 | $page = ('' == $page) ? '/' : $page; |
|
| 392 | if ($fp = fsockopen($target, $port, $errno, $errstr, 15)) { |
|
| 393 | $headers = "GET $page HTTP/1.1\r\n"; |
|
| 394 | $headers .= "Host: {$parts['host']}\r\n"; |
|
| 395 | $headers .= "Connection: Close\r\n\r\n"; |
|
| 396 | if (fwrite($fp, $headers)) { |
|
| 397 | $resp = ''; |
|
| 398 | //while not eof and an error does not occur when calling fgets |
|
| 399 | while (!feof($fp) && false !== ($curr = fgets($fp, 128))) { |
|
| 400 | $resp .= $curr; |
|
| 401 | } |
|
| 402 | if (isset($curr) && false !== $curr) { |
|
| 403 | return substr(strstr($resp, "\r\n\r\n"), 3); |
|
| 404 | } |
|
| 405 | } |
|
| 406 | fclose($fp); |
|
| 407 | } |
|
| 408 | break; |
|
| 409 | } |
|
| 410 | } |
|
| 411 | ||
| 412 | return false; |
|
| 413 | } |
|
| 414 | ||
| 415 | /** |
|
| 416 | * Smallworld_sanitize(array(array) ) |
|
| 417 | * flatten multidimentional arrays to one dimentional |
|
| 418 | * @param array $array |
|
| 419 | * @returns Array |
|
| 420 | */ |
|
| 421 | public function flatten($array) |
|
| 422 | { |
|
| 423 | $return = []; |
|
| 424 | while (count($array)) { |
|
| 425 | $value = array_shift($array); |
|
| 426 | if (is_array($value)) { |
|
| 427 | foreach ($value as $sub) { |
|
| 428 | $array[] = $sub; |
|
| 429 | } |
|
| 430 | } else { |
|
| 431 | $return[] = $value; |
|
| 432 | } |
|
| 433 | } |
|
| 434 | ||
| 435 | return $return; |
|
| 436 | } |
|
| 437 | ||
| 438 | /** |
|
| 439 | * Smallworld_sanitize($string) |
|
| 440 | * @param string $text |
|
| 441 | * @returns string |
|
| 442 | */ |
|
| 443 | public function Smallworld_sanitize($text) |
|
| 444 | { |
|
| 445 | $text = htmlspecialchars($text, ENT_QUOTES); |
|
| 446 | $myts = MyTextSanitizer::getInstance(); |
|
| 447 | $text = $myts->displayTarea($text, 1, 1, 1, 1); |
|
| 448 | $text = str_replace("\n\r", "\n", $text); |
|
| 449 | $text = str_replace("\r\n", "\n", $text); |
|
| 450 | $text = str_replace("\n", '<br>', $text); |
|
| 451 | $text = str_replace('"', "'", $text); |
|
| 452 | ||
| 453 | return $text; |
|
| 454 | } |
|
| 455 | } |
|
| 456 | ||
| 457 | /* |
|
| 458 | * Does a sync to remove orphans from smallworld db |
|
| @@ 23-455 (lines=433) @@ | ||
| 20 | * @author Michael Albertsen (http://culex.dk) <[email protected]> |
|
| 21 | */ |
|
| 22 | ||
| 23 | class SmallworldAdmin |
|
| 24 | { |
|
| 25 | /** |
|
| 26 | * Get oldest message in Db |
|
| 27 | * @returns time |
|
| 28 | */ |
|
| 29 | public function oldestMsg() |
|
| 30 | { |
|
| 31 | global $xoopsDB; |
|
| 32 | $date = 0; |
|
| 33 | $sql = 'SELECT * FROM ' . $xoopsDB->prefix('smallworld_messages') . ' ORDER BY created LIMIT 1'; |
|
| 34 | $result = $xoopsDB->queryF($sql); |
|
| 35 | $counter = $xoopsDB->getRowsNum($result); |
|
| 36 | if ($counter >= 1) { |
|
| 37 | while ($sqlfetch = $xoopsDB->fetchArray($result)) { |
|
| 38 | $date = $sqlfetch['created']; |
|
| 39 | } |
|
| 40 | } |
|
| 41 | ||
| 42 | return $date; |
|
| 43 | } |
|
| 44 | ||
| 45 | /** |
|
| 46 | * Get average messages sent per day |
|
| 47 | * @param int $totaldays |
|
| 48 | * @return int|string |
|
| 49 | */ |
|
| 50 | public function AvgMsgDay($totaldays) |
|
| 51 | { |
|
| 52 | global $xoopsDB; |
|
| 53 | $sql = 'SELECT count( * ) / ' . $totaldays . ' AS averg FROM ' . $xoopsDB->prefix('smallworld_messages') . ''; |
|
| 54 | $result = $xoopsDB->queryF($sql); |
|
| 55 | while ($sqlfetch = $xoopsDB->fetchArray($result)) { |
|
| 56 | $avg = number_format($sqlfetch['averg'], 2, '.', ','); |
|
| 57 | } |
|
| 58 | ||
| 59 | return $avg; |
|
| 60 | } |
|
| 61 | ||
| 62 | /** |
|
| 63 | * total users using smallworld |
|
| 64 | * @return int |
|
| 65 | */ |
|
| 66 | public function TotalUsers() |
|
| 67 | { |
|
| 68 | global $xoopsDB; |
|
| 69 | $sql = 'SELECT * FROM ' . $xoopsDB->prefix('smallworld_user') . ''; |
|
| 70 | $result = $xoopsDB->queryF($sql); |
|
| 71 | $counter = $xoopsDB->getRowsNum($result); |
|
| 72 | if ($counter < 1) { |
|
| 73 | $sum = 0; |
|
| 74 | } else { |
|
| 75 | $i = 0; |
|
| 76 | while ($myrow = $xoopsDB->fetchArray($result)) { |
|
| 77 | $user[$i]['username'] = $myrow['username']; |
|
| 78 | ++$i; |
|
| 79 | } |
|
| 80 | $all = $this->flatten($user); |
|
| 81 | $sum = count(array_unique($all)); |
|
| 82 | $unique = array_unique($all); |
|
| 83 | } |
|
| 84 | ||
| 85 | return $sum; |
|
| 86 | } |
|
| 87 | ||
| 88 | /** |
|
| 89 | * Get version of module |
|
| 90 | * @returns string |
|
| 91 | */ |
|
| 92 | public function ModuleInstallVersion() |
|
| 93 | { |
|
| 94 | global $xoopsModule; |
|
| 95 | $version = round($xoopsModule->getVar('version') / 100, 2); |
|
| 96 | ||
| 97 | return $version; |
|
| 98 | } |
|
| 99 | ||
| 100 | /** |
|
| 101 | * Get date when Module was installed |
|
| 102 | * @return string|time |
|
| 103 | */ |
|
| 104 | public function ModuleInstallDate() |
|
| 105 | { |
|
| 106 | global $xoopsModule; |
|
| 107 | $date = formatTimestamp($xoopsModule->getVar('last_update'), 'm'); |
|
| 108 | ||
| 109 | return $date; |
|
| 110 | } |
|
| 111 | ||
| 112 | /** |
|
| 113 | * Count total days represented in db |
|
| 114 | * @return float|int|time |
|
| 115 | */ |
|
| 116 | public function CountDays() |
|
| 117 | { |
|
| 118 | global $xoopsDB, $xoopsModule; |
|
| 119 | $date = $this->oldestMsg(); |
|
| 120 | $now = time(); |
|
| 121 | $diff = ($now - $date) / (60 * 60 * 24); |
|
| 122 | ||
| 123 | return $diff; |
|
| 124 | } |
|
| 125 | ||
| 126 | /** |
|
| 127 | * find user with most posted messages |
|
| 128 | * @returns array |
|
| 129 | */ |
|
| 130 | public function mostactiveusers_allround() |
|
| 131 | { |
|
| 132 | global $xoopsDB, $xoopsUser; |
|
| 133 | $sql = 'SELECT uid_fk, COUNT( * ) as cnt '; |
|
| 134 | $sql .= 'FROM ( '; |
|
| 135 | $sql .= 'SELECT uid_fk '; |
|
| 136 | $sql .= 'FROM ' . $xoopsDB->prefix('smallworld_messages') . ' '; |
|
| 137 | $sql .= 'UNION ALL SELECT uid_fk '; |
|
| 138 | $sql .= 'FROM ' . $xoopsDB->prefix('smallworld_comments') . ' '; |
|
| 139 | $sql .= ') AS u '; |
|
| 140 | $sql .= 'GROUP BY uid_fk '; |
|
| 141 | $sql .= 'ORDER BY count( * ) DESC limit 20'; |
|
| 142 | $result = $xoopsDB->queryF($sql); |
|
| 143 | $counter = $xoopsDB->getRowsNum($result); |
|
| 144 | ||
| 145 | if ($counter < 1) { |
|
| 146 | $msg = []; |
|
| 147 | } else { |
|
| 148 | $msg = []; |
|
| 149 | $i = 1; |
|
| 150 | while ($row = $xoopsDB->fetchArray($result)) { |
|
| 151 | $msg['counter'][$i] = $i; |
|
| 152 | $msg['img'][$i] = "<img style='margin:0px 5px;' src = '../assets/images/" . $i . ".png'>"; |
|
| 153 | if ($msg['counter'][$i] > 3) { |
|
| 154 | $msg['img'][$i] = ''; |
|
| 155 | } |
|
| 156 | $msg['cnt'][$i] = $row['cnt']; |
|
| 157 | $msg['from'][$i] = $xoopsUser->getUnameFromId($row['uid_fk']); |
|
| 158 | ++$i; |
|
| 159 | } |
|
| 160 | } |
|
| 161 | ||
| 162 | return $msg; |
|
| 163 | } |
|
| 164 | ||
| 165 | /** |
|
| 166 | * find user with most posted messages in last 24 hours |
|
| 167 | * @returns array |
|
| 168 | */ |
|
| 169 | public function mostactiveusers_today() |
|
| 170 | { |
|
| 171 | global $xoopsDB, $xoopsUser; |
|
| 172 | $sql = 'SELECT uid_fk, COUNT( * ) as cnt '; |
|
| 173 | $sql .= 'FROM ( '; |
|
| 174 | $sql .= 'SELECT uid_fk '; |
|
| 175 | $sql .= 'FROM ' . $xoopsDB->prefix('smallworld_messages') . ' '; |
|
| 176 | $sql .= 'WHERE `created` > UNIX_TIMESTAMP(DATE_SUB( NOW( ) , INTERVAL 1 DAY )) '; |
|
| 177 | $sql .= 'UNION ALL SELECT uid_fk '; |
|
| 178 | $sql .= 'FROM ' . $xoopsDB->prefix('smallworld_comments') . ' '; |
|
| 179 | $sql .= 'WHERE `created` > UNIX_TIMESTAMP(DATE_SUB( NOW( ) , INTERVAL 1 DAY )) '; |
|
| 180 | $sql .= ') AS u '; |
|
| 181 | $sql .= 'GROUP BY uid_fk '; |
|
| 182 | $sql .= 'ORDER BY count( * ) DESC limit 20'; |
|
| 183 | ||
| 184 | $result = $xoopsDB->queryF($sql); |
|
| 185 | $msgtoday = []; |
|
| 186 | ||
| 187 | if (0 != $xoopsDB->getRowsNum($result)) { |
|
| 188 | $i = 1; |
|
| 189 | while ($row = $xoopsDB->fetchArray($result)) { |
|
| 190 | $msgtoday['counter'][$i] = $i; |
|
| 191 | $msgtoday['img'][$i] = "<img style='margin:0px 5px;' src = '../assets/images/" . $i . ".png'>"; |
|
| 192 | if ($msgtoday['counter'][$i] > 3) { |
|
| 193 | $msgtoday['img'][$i] = ''; |
|
| 194 | } |
|
| 195 | $msgtoday['cnt'][$i] = $row['cnt']; |
|
| 196 | $msgtoday['from'][$i] = $xoopsUser->getUnameFromId($row['uid_fk']); |
|
| 197 | ++$i; |
|
| 198 | } |
|
| 199 | } else { |
|
| 200 | $msgtoday = []; |
|
| 201 | } |
|
| 202 | ||
| 203 | return $msgtoday; |
|
| 204 | } |
|
| 205 | ||
| 206 | /** |
|
| 207 | * Find best OR worst rated users |
|
| 208 | * @param string $direction |
|
| 209 | * @returns array |
|
| 210 | */ |
|
| 211 | public function topratedusers($direction) |
|
| 212 | { |
|
| 213 | global $xoopsUser, $xoopsDB, $xoopsTpl; |
|
| 214 | $array = []; |
|
| 215 | ||
| 216 | if ('up' === $direction) { |
|
| 217 | $sql = 'SELECT owner, count(*) AS cnt FROM ' . $xoopsDB->prefix('smallworld_vote') . " WHERE up='1' GROUP BY owner ORDER BY cnt DESC LIMIT 20"; |
|
| 218 | $result = $xoopsDB->queryF($sql); |
|
| 219 | $count = $xoopsDB->getRowsNum($result); |
|
| 220 | $i = 1; |
|
| 221 | if ($count >= $i) { |
|
| 222 | while ($row = $xoopsDB->fetchArray($result)) { |
|
| 223 | $array['counter'][$i] = $i; |
|
| 224 | $array['img'][$i] = "<img height='10px' width='10px' " . "style='margin:0px 5px;' src = '../assets/images/like.png'>"; |
|
| 225 | if ($array['counter'][$i] > 3) { |
|
| 226 | $array['img'][$i] = ''; |
|
| 227 | } |
|
| 228 | $array['cnt'][$i] = $row['cnt']; |
|
| 229 | $array['user'][$i] = $xoopsUser->getUnameFromId($row['owner']); |
|
| 230 | ++$i; |
|
| 231 | } |
|
| 232 | } else { |
|
| 233 | $array = []; |
|
| 234 | } |
|
| 235 | } else { |
|
| 236 | $sql = 'SELECT owner, count(*) AS cnt FROM ' . $xoopsDB->prefix('smallworld_vote') . " WHERE down='1' GROUP BY owner ORDER BY cnt DESC LIMIT 20"; |
|
| 237 | $result = $xoopsDB->queryF($sql); |
|
| 238 | $count = $xoopsDB->getRowsNum($result); |
|
| 239 | $i = 1; |
|
| 240 | if (0 != $count) { |
|
| 241 | while ($row = $xoopsDB->fetchArray($result)) { |
|
| 242 | $array['counter'][$i] = $i; |
|
| 243 | $array['img'][$i] = "<img height='10px' width='10px' " . "style='margin:0px 5px;' src = '../assets/images/dislike.png'>"; |
|
| 244 | if ($array['counter'][$i] > 3) { |
|
| 245 | $array['img'][$i] = ''; |
|
| 246 | } |
|
| 247 | $array['cnt'][$i] = $row['cnt']; |
|
| 248 | $array['user'][$i] = $xoopsUser->getUnameFromId($row['owner']); |
|
| 249 | ++$i; |
|
| 250 | } |
|
| 251 | } else { |
|
| 252 | $array = []; |
|
| 253 | } |
|
| 254 | } |
|
| 255 | ||
| 256 | return $array; |
|
| 257 | } |
|
| 258 | ||
| 259 | /** |
|
| 260 | * Get all users to loop in admin for administration |
|
| 261 | * @param string $inspect |
|
| 262 | * @returns array |
|
| 263 | */ |
|
| 264 | public function getAllUsers($inspect) |
|
| 265 | { |
|
| 266 | global $xoopsDB, $xoopsUser, $xoopsTpl; |
|
| 267 | $data = []; |
|
| 268 | if ('yes' === $inspect) { |
|
| 269 | $sql = 'SELECT * FROM ' . $xoopsDB->prefix('smallworld_admin') . ' WHERE (inspect_start + inspect_stop) >= ' . time() . ' ORDER BY username'; |
|
| 270 | } else { |
|
| 271 | $sql = 'SELECT * FROM ' . $xoopsDB->prefix('smallworld_admin') . ' WHERE (inspect_start + inspect_stop) < ' . time() . ' ORDER BY username'; |
|
| 272 | } |
|
| 273 | $result = $xoopsDB->queryF($sql); |
|
| 274 | $count = $xoopsDB->getRowsNum($result); |
|
| 275 | if (0 != $count) { |
|
| 276 | while ($row = $xoopsDB->fetchArray($result)) { |
|
| 277 | $data[] = $row; |
|
| 278 | } |
|
| 279 | } |
|
| 280 | if (!empty($data)) { |
|
| 281 | return $data; |
|
| 282 | } |
|
| 283 | } |
|
| 284 | ||
| 285 | /** |
|
| 286 | * check server if update is available |
|
| 287 | * Server currently at culex.dk |
|
| 288 | * Variable $version = current smallworld version number |
|
| 289 | * @return string |
|
| 290 | */ |
|
| 291 | public function doCheckUpdate() |
|
| 292 | { |
|
| 293 | global $pathIcon16; |
|
| 294 | $version = $this->ModuleInstallVersion(); |
|
| 295 | $critical = false; |
|
| 296 | $update = false; |
|
| 297 | $rt = ''; |
|
| 298 | $url = 'http://www.culex.dk/updates/smallworld_version.csv'; |
|
| 299 | $fileC = $this->fetchURL($url, ['fopen', 'curl', 'socket']); |
|
| 300 | $read = explode(';', $fileC); |
|
| 301 | ||
| 302 | $upd_img = $pathIcon16 . '/on.png'; |
|
| 303 | ||
| 304 | if ($read[0] > $version && '1' == $read[2]) { |
|
| 305 | $critical = true; |
|
| 306 | $upd_img = $pathIcon16 . '/off.png'; |
|
| 307 | } |
|
| 308 | if ($read[0] > $version && '1' != $read[2]) { |
|
| 309 | $update = true; |
|
| 310 | $upd_img = '../assets/images/upd_normal.png'; |
|
| 311 | } |
|
| 312 | if ($critical) { |
|
| 313 | $rt = "<div class='smallworld_update'><img src='" . $upd_img . "'>"; |
|
| 314 | $rt .= _AM_SMALLWORLD_UPDATE_CRITICAL_UPD . '</div>'; |
|
| 315 | $rt .= "<textarea class='xim_update_changelog'>" . $read[1] . '</textarea><br><br>'; |
|
| 316 | $rt .= _AM_SMALLWORLD_UPDATE_SERVER_FILE . "<br><a href='" . $read[3] . "'>" . $read[3] . '</a>'; |
|
| 317 | } elseif ($update) { |
|
| 318 | $rt = "<div class='smallworld_update'><img src='" . $upd_img . "'>"; |
|
| 319 | $rt .= _AM_SMALLWORLD_UPDATE_NORMAL_UPD . '</div>'; |
|
| 320 | $rt .= "<textarea class='smallworld_update_changelog'>" . $read[1] . '</textarea><br><br>'; |
|
| 321 | $rt .= _AM_SMALLWORLD_UPDATE_SERVER_FILE . "<br><a href='" . $read[3] . "'>" . $read[3] . '</a>'; |
|
| 322 | } else { |
|
| 323 | $rt = "<div class='smallworld_update'><br><img src='" . $upd_img . "'>" . _AM_SMALLWORLD_UPDATE_YOUHAVENEWESTVERSION . '</div>'; |
|
| 324 | } |
|
| 325 | ||
| 326 | return $rt; |
|
| 327 | } |
|
| 328 | ||
| 329 | /** |
|
| 330 | * Fetch content of comma separated text file |
|
| 331 | * will attempt to use the fopen method first, then curl, then socket |
|
| 332 | * @param string $url |
|
| 333 | * @param array $methods |
|
| 334 | * @returns string |
|
| 335 | */ |
|
| 336 | public function fetchURL($url, $methods = ['fopen', 'curl', 'socket']) |
|
| 337 | { |
|
| 338 | /** |
|
| 339 | * December 21st 2010, Mathew Tinsley ([email protected]) |
|
| 340 | * http://tinsology.net |
|
| 341 | * |
|
| 342 | * To the extent possible under law, Mathew Tinsley has waived all copyright and related or |
|
| 343 | * neighboring rights to this work. There's absolutely no warranty. |
|
| 344 | */ |
|
| 345 | if ('string' === gettype($methods)) { |
|
| 346 | $methods = [$methods]; |
|
| 347 | } elseif (!is_array($methods)) { |
|
| 348 | return false; |
|
| 349 | } |
|
| 350 | foreach ($methods as $method) { |
|
| 351 | switch ($method) { |
|
| 352 | case 'fopen': |
|
| 353 | //uses file_get_contents in place of fopen |
|
| 354 | //allow_url_fopen must still be enabled |
|
| 355 | if (ini_get('allow_url_fopen')) { |
|
| 356 | $contents = file_get_contents($url); |
|
| 357 | if (false !== $contents) { |
|
| 358 | return $contents; |
|
| 359 | } |
|
| 360 | } |
|
| 361 | break; |
|
| 362 | case 'curl': |
|
| 363 | if (function_exists('curl_init')) { |
|
| 364 | $ch = curl_init(); |
|
| 365 | curl_setopt($ch, CURLOPT_URL, $url); |
|
| 366 | curl_setopt($ch, CURLOPT_HEADER, 0); |
|
| 367 | // return the value instead of printing the response to browser |
|
| 368 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); |
|
| 369 | $result = curl_exec($ch); |
|
| 370 | curl_close($ch); |
|
| 371 | //return curl_exec($ch); |
|
| 372 | return $result; |
|
| 373 | } |
|
| 374 | break; |
|
| 375 | case 'socket': |
|
| 376 | //make sure the url contains a protocol, otherwise $parts['host'] won't be set |
|
| 377 | if (0 !== strpos($url, 'http://') && 0 !== strpos($url, 'https://')) { |
|
| 378 | $url = 'http://' . $url; |
|
| 379 | } |
|
| 380 | $parts = parse_url($url); |
|
| 381 | if ('https' === $parts['scheme']) { |
|
| 382 | $target = 'ssl://' . $parts['host']; |
|
| 383 | $port = isset($parts['port']) ? $parts['port'] : 443; |
|
| 384 | } else { |
|
| 385 | $target = $parts['host']; |
|
| 386 | $port = isset($parts['port']) ? $parts['port'] : 80; |
|
| 387 | } |
|
| 388 | $page = isset($parts['path']) ? $parts['path'] : ''; |
|
| 389 | $page .= isset($parts['query']) ? '?' . $parts['query'] : ''; |
|
| 390 | $page .= isset($parts['fragment']) ? '#' . $parts['fragment'] : ''; |
|
| 391 | $page = ('' == $page) ? '/' : $page; |
|
| 392 | if ($fp = fsockopen($target, $port, $errno, $errstr, 15)) { |
|
| 393 | $headers = "GET $page HTTP/1.1\r\n"; |
|
| 394 | $headers .= "Host: {$parts['host']}\r\n"; |
|
| 395 | $headers .= "Connection: Close\r\n\r\n"; |
|
| 396 | if (fwrite($fp, $headers)) { |
|
| 397 | $resp = ''; |
|
| 398 | //while not eof and an error does not occur when calling fgets |
|
| 399 | while (!feof($fp) && false !== ($curr = fgets($fp, 128))) { |
|
| 400 | $resp .= $curr; |
|
| 401 | } |
|
| 402 | if (isset($curr) && false !== $curr) { |
|
| 403 | return substr(strstr($resp, "\r\n\r\n"), 3); |
|
| 404 | } |
|
| 405 | } |
|
| 406 | fclose($fp); |
|
| 407 | } |
|
| 408 | break; |
|
| 409 | } |
|
| 410 | } |
|
| 411 | ||
| 412 | return false; |
|
| 413 | } |
|
| 414 | ||
| 415 | /** |
|
| 416 | * Smallworld_sanitize(array(array) ) |
|
| 417 | * flatten multidimentional arrays to one dimentional |
|
| 418 | * @param array $array |
|
| 419 | * @return array |
|
| 420 | */ |
|
| 421 | public function flatten($array) |
|
| 422 | { |
|
| 423 | $return = []; |
|
| 424 | while (count($array)) { |
|
| 425 | $value = array_shift($array); |
|
| 426 | if (is_array($value)) { |
|
| 427 | foreach ($value as $sub) { |
|
| 428 | $array[] = $sub; |
|
| 429 | } |
|
| 430 | } else { |
|
| 431 | $return[] = $value; |
|
| 432 | } |
|
| 433 | } |
|
| 434 | ||
| 435 | return $return; |
|
| 436 | } |
|
| 437 | ||
| 438 | /** |
|
| 439 | * Smallworld_sanitize($string) |
|
| 440 | * @param string $text |
|
| 441 | * @returns string |
|
| 442 | */ |
|
| 443 | public function Smallworld_sanitize($text) |
|
| 444 | { |
|
| 445 | $text = htmlspecialchars($text, ENT_QUOTES); |
|
| 446 | $myts = \MyTextSanitizer::getInstance(); |
|
| 447 | $text = $myts->displayTarea($text, 1, 1, 1, 1); |
|
| 448 | $text = str_replace("\n\r", "\n", $text); |
|
| 449 | $text = str_replace("\r\n", "\n", $text); |
|
| 450 | $text = str_replace("\n", '<br>', $text); |
|
| 451 | $text = str_replace('"', "'", $text); |
|
| 452 | ||
| 453 | return $text; |
|
| 454 | } |
|
| 455 | } |
|
| 456 | ||
| 457 | /* |
|
| 458 | * Does a sync to remove orphans from smallworld db |
|