onlinelist.php

main 97 lines · 3.7 KB Raw
Alex Alex Commit Initial commit 01/10/2026 09:20
1<?php require_once 'engine/init.php'; theme_open();
2
3$history = array(
4 "enabled" => true,
5 "days" => 14,
6 "cache" => 300
7);
8
9// Returns a list of players online
10$array = false;
11$loadFlags = ($config['country_flags']['enabled'] && $config['country_flags']['onlinelist']) ? true : false;
12$loadOutfits = ($config['show_outfits']['onlinelist']) ? true : false;
13if ($config['client'] < 780) {
14 $outfitQuery = ($loadOutfits) ? ", `p`.`lookbody` AS `body`, `p`.`lookfeet` AS `feet`, `p`.`lookhead` AS `head`, `p`.`looklegs` AS `legs`, `p`.`looktype` AS `type`" : "";
15} else {
16 $outfitQuery = ($loadOutfits) ? ", `p`.`lookbody` AS `body`, `p`.`lookfeet` AS `feet`, `p`.`lookhead` AS `head`, `p`.`looklegs` AS `legs`, `p`.`looktype` AS `type`, `p`.`lookaddons` AS `addons`" : "";
17}
18
19// Small 30 seconds players_online cache.
20$cache = new Cache('engine/cache/onlinelist');
21$cache->setExpiration(30);
22if ($cache->hasExpired()) {
23 // Load online list data from SQL
24 $array = ($loadFlags === true) ? db()->fetchAll("SELECT `p`.`name` AS `name`, `p`.`level` AS `level`, `p`.`vocation` AS `vocation`, `g`.`name` AS `gname`, `za`.`flag` AS `flag` $outfitQuery FROM `players_online` AS `o` INNER JOIN `players` AS `p` ON `o`.`player_id` = `p`.`id` INNER JOIN `znote_accounts` AS `za` ON `p`.`account_id` = `za`.`account_id` LEFT JOIN `guild_membership` AS `gm` ON `o`.`player_id` = `gm`.`player_id` LEFT JOIN `guilds` AS `g` ON `gm`.`guild_id` = `g`.`id`;") : db()->fetchAll("SELECT `p`.`name` AS `name`, `p`.`level` AS `level`, `p`.`vocation` AS `vocation`, `g`.`name` AS `gname` $outfitQuery FROM `players_online` AS `o` INNER JOIN `players` AS `p` ON `o`.`player_id` = `p`.`id` LEFT JOIN `guild_membership` AS `gm` ON `o`.`player_id` = `gm`.`player_id` LEFT JOIN `guilds` AS `g` ON `gm`.`guild_id` = `g`.`id`;");
25 // End loading data from SQL
26 $cache->setContent($array);
27 $cache->save();
28} else {
29 $array = $cache->load();
30}
31// End cache
32
33/**
34 * Players-online record.
35 *
36 * Updated here because this page already knows the current count - checking it
37 * anywhere else would mean an extra query on every page load. Stored in
38 * znote_config, see znote_record_update().
39 */
40$onlineNow = is_array($array) ? count($array) : 0;
41$onlineBroken = znote_record_update($onlineNow);
42$onlineRecord = znote_record_get();
43
44// 5 minute logout history cache
45if ($history["enabled"]) {
46 $time = time();
47 $cache = new Cache('engine/cache/onlinelist_rec');
48 $cache->setExpiration($history['cache']);
49 if ($cache->hasExpired()) {
50 // Load online list data from SQL
51 $sinceThreshold = $time - ((int)$history['days'] * 24 * 60 * 60);
52 $recents = ($loadFlags === true) ? db()->fetchAll("
53 SELECT
54 `p`.`name` AS `name`,
55 `p`.`level` AS `level`,
56 `p`.`vocation` AS `vocation`,
57 `p`.`lastlogout`,
58 `g`.`name` AS `gname`,
59 `za`.`flag` AS `flag`
60 $outfitQuery
61 FROM `players` AS `p`
62 INNER JOIN `znote_accounts` AS `za`
63 ON `p`.`account_id` = `za`.`account_id`
64 LEFT JOIN `guild_membership` AS `gm`
65 ON `p`.`id` = `gm`.`player_id`
66 LEFT JOIN `guilds` AS `g`
67 ON `gm`.`guild_id` = `g`.`id`
68 WHERE `p`.`lastlogout` >= ?
69 ORDER BY `p`.`lastlogout` DESC;
70 ", [$sinceThreshold]) : db()->fetchAll("
71 SELECT
72 `p`.`name` AS `name`,
73 `p`.`level` AS `level`,
74 `p`.`vocation` AS `vocation`,
75 `p`.`lastlogout`,
76 `g`.`name` AS `gname`
77 $outfitQuery
78 FROM `players` AS `p`
79 LEFT JOIN `guild_membership` AS `gm`
80 ON `p`.`id` = `gm`.`player_id`
81 LEFT JOIN `guilds` AS `g`
82 ON `gm`.`guild_id` = `g`.`id`
83 WHERE `p`.`lastlogout` >= ?
84 ORDER BY `p`.`lastlogout` DESC;
85 ", [$sinceThreshold]);
86 // End loading data from SQL
87 $cache->setContent($recents);
88 $cache->save();
89 } else {
90 $recents = $cache->load();
91 }
92}
93
94view('onlinelist');
95
96theme_close();
97
Top