]> jfr.im git - irc/unrealircd/unrealircd-webpanel.git/blob - index.php
d070f039aaaae9fd71e1f0864026920049740d84
[irc/unrealircd/unrealircd-webpanel.git] / index.php
1 <?php
2 require_once "inc/common.php";
3 require_once "Classes/class-checkup.php";
4 if (!isset($config['unrealircd']))
5 {
6 $redirect = get_config("base_url")."settings/rpc-servers.php";
7 header('Location: ' . $redirect);
8 die;
9 }
10
11 require_once "inc/header.php";
12
13 ?>
14 <div class="row ml-0">
15 <h2>Network Overview</h2>
16 <span class="badge bg-danger text-light ml-4 pl-2 pr-2 rounded-pill" style="height:fit-content">LIVE</span>
17 <?php checkup_widget(); ?>
18 </div>
19 <?php
20 $array_of_stats = [];
21 /* What if someone wants to add their own stats... */
22 Hook::run(HOOKTYPE_PRE_OVERVIEW_CARD, $array_of_stats);
23
24 /* This makes sure that a plugin which called the parameter
25 * by reference can add/update the stats for display here.
26 */
27 $stats = (object) $array_of_stats;
28 $userlist = [];
29 Hook::run(HOOKTYPE_GET_USER_LIST, $userlist);
30 $num_of_panel_admins = count($userlist);
31
32 ?>
33 <style>
34 #health_banner {
35 margin-left:20px;
36 width:fit-content;
37 }
38 a.card:hover { opacity: 0.8; transition: opacity 0.2s ease-in-out; }
39 .card {
40 min-height: 80%;
41 border-radius: 16px;
42 }
43 body {
44 background-image: url('https://cdn.wallpapersafari.com/34/98/yznZmQ.jpg');
45 background-size: cover;
46 }
47 .card-body i {
48 position: fixed;
49 top: 10px;
50 right: 10px;
51 }
52 .card:hover {
53 text-decoration: none;
54 }
55
56 @keyframes rotateEffect {
57 0% { transform: rotateX(0deg); }
58 50% { transform: rotateX(180deg); }
59 100% { transform: rotateX(0deg); }
60 }
61
62 .numberDisplay {
63 animation: rotateEffect 0.5s ease;
64 }
65
66 .frosted-glass-success {
67 /* From https://css.glass */
68 background: rgba(63, 162, 36, 0.73);
69 box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
70 backdrop-filter: blur(9.8px);
71 -webkit-backdrop-filter: blur(9.8px);
72 }
73 .frosted-glass-info {
74 /* From https://css.glass */
75 background: rgba(57, 127, 207, 0.73);
76 box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
77 backdrop-filter: blur(9.8px);
78 -webkit-backdrop-filter: blur(9.8px);
79 }
80 .frosted-glass-danger {
81 /* From https://css.glass */
82 background: rgba(207, 57, 57, 0.73);
83 box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
84 backdrop-filter: blur(9.8px);
85 -webkit-backdrop-filter: blur(9.8px);
86 }
87 .frosted-glass-warning {
88 /* From https://css.glass */
89 background: rgba(207, 194, 57, 0.73);
90 box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
91 backdrop-filter: blur(9.8px);
92 -webkit-backdrop-filter: blur(9.8px);
93 }
94 .frosted-glass-secondary {
95 /* From https://css.glass */
96 background: rgba(75, 75, 75, 0.73);
97 box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
98 backdrop-filter: blur(9.8px);
99 -webkit-backdrop-filter: blur(9.8px);
100 }
101
102 </style>
103 <div class="container card-container ml-1">
104
105 <div class="row mt-3">
106 <div class="col-sm mb-3">
107 <a class="card frosted-glass-success text-center" href="<?php echo get_config("base_url"); ?>users/">
108 <div class="card-body text-white">
109 <div class="row text-center">
110 <span id="userRecord" class="position-absolute badge rounded-pill badge-warning" hidden>
111 <?php echo "Record: "; ?>
112 </span>
113 <div class="col">
114 <div class="col">
115 <i aria-hidden="true" class="fa fa-users fa-2x"></i>
116 </div>
117 <div class="col">
118 <h5 id="stats_user_total" class="display-4 numberDisplay"></h5>
119 <h5 class="display-5">Users Online</h5>
120 </div>
121 </div>
122 </div>
123 </div>
124 </a>
125 </div>
126 <div class="col-sm mb-3">
127 <a class="card frosted-glass-info text-center" href="<?php echo get_config("base_url"); ?>channels/">
128 <div class="card-body text-white">
129 <div class="row text-center">
130 <div class="col">
131 <div class="col">
132 <i aria-hidden="true" class="fa fa-hashtag fa-2x"></i>
133 </div>
134 <div class="col">
135 <h5 id="stats_channel_total" class="display-4 numberDisplay"></h5>
136 <h5 class="display-5">Channels</h5>
137 </div>
138 </div>
139 </div>
140 </div>
141 </a>
142 </div>
143 <div class="col-sm mb-3">
144 <a class="card frosted-glass-warning text-center" href="<?php echo get_config("base_url"); ?>users/">
145 <div class="card-body text-dark">
146 <div class="row text-center">
147 <div class="col">
148 <div class="col">
149 <i aria-hidden="true" class="fa fa-shield-halved fa-2x"></i>
150 </div>
151 <div class="col">
152 <h5 id="stats_oper_total" class="display-4 numberDisplay"></h5>
153 <h5 class="display-5" style="margin-top: -3px">Operators</h5>
154 <h5 style="font-size: 10px; margin-top:-12px">View in Users ></h5>
155 </div>
156 </div>
157 </div>
158 </div>
159 </a>
160 </div>
161 <div class="col-sm mb-3">
162 <a class="card frosted-glass-secondary text-center" href="<?php echo get_config("base_url"); ?>servers/">
163 <div class="card-body text-white">
164 <div class="row text-center">
165 <div class="col">
166 <div class="col">
167 <i aria-hidden="true" class="fa fa-network-wired fa-2x"></i>
168 </div>
169 <div class="col">
170 <h5 id="stats_server_total" class="display-4 numberDisplay"></h5>
171 <h5 class="display-5">Servers</h5>
172 </div>
173 </div>
174 </div>
175 </div>
176 </a>
177 </div>
178 </div>
179 </div>
180 <div class="container card-container ml-1">
181
182 <div class="row">
183 <div class="col-sm mb-3">
184 <a class="card frosted-glass-danger text-center" href="<?php echo get_config("base_url"); ?>server-bans/">
185 <div class="card-body text-white">
186 <div class="row text-center">
187 <div class="col">
188 <div class="col">
189 <i aria-hidden="true" class="fa fa-ban fa-2x"></i>
190 </div>
191 <div class="col">
192 <h5 id="num_server_bans" class="display-4 numberDisplay"></h5>
193 <h5 class="display-5">Server Bans</h5>
194 </div>
195 </div>
196 </div>
197 </div>
198 </a>
199 </div>
200 <div class="col-sm mb-3">
201 <a class="card frosted-glass-secondary text-center" href="<?php echo get_config("base_url"); ?>spamfilter.php/">
202 <div class="card-body text-white">
203 <div class="row text-center">
204 <div class="col">
205 <div class="col">
206 <i aria-hidden="true" class="fa fa-filter fa-2x"></i>
207 </div>
208 <div class="col">
209 <h5 id="num_spamfilter_entries" class="display-4 numberDisplay"></h5>
210 <h5 class="display-5">Spamfilter</h5>
211 </div>
212 </div>
213 </div>
214 </div>
215 </a>
216 </div>
217 <div class="col-sm mb-3">
218 <a class="card frosted-glass-info text-center" href="<?php echo get_config("base_url"); ?>server-bans/ban-exceptions.php">
219 <div class="card-body text-white">
220 <div class="row text-center">
221 <div class="col">
222 <div class="col">
223 <i aria-hidden="true" class="fa fa-door-open fa-2x"></i>
224 </div>
225 <div class="col">
226 <h5 id="num_ban_exceptions" class="display-4 numberDisplay"></h5>
227 <h5 class="display-5">Server Ban Exceptions</h5>
228 </div>
229 </div>
230 </div>
231 </div>
232 </a>
233 </div>
234 <div class="col-sm mb-3">
235 <a class="card frosted-glass-success text-center" href="<?php echo get_config("base_url"); ?>servers">
236 <div class="card-body text-white">
237 <div class="row text-center">
238 <div class="col">
239 <div class="col">
240 <i aria-hidden="true" class="fa fa-database fa-2x"></i>
241 </div>
242 <div class="col">
243 <h5 id="stats_uline_total" class="display-4 numberDisplay"></h5>
244 <h5 class="display-5" style="margin-top: -3px">Services Online</h5>
245 <h5 style="font-size: 10px; margin-top:-12px">View in Servers ></h5>
246 </div>
247 </div>
248 </div>
249 </div>
250 </a>
251 </div>
252 </div>
253 </div>
254
255
256 <script>
257 /* Last time stats were updated */
258 let stats_tick = 0;
259
260 function updateStats(e)
261 {
262 var data;
263 try {
264 data = JSON.parse(e.data);
265 } catch(e) {
266 return;
267 }
268 stats_tick = Date.now()
269 console.log(data);
270 document.getElementById("userRecord").innerHTML = "Record: "+data.user.record;
271 document.getElementById("stats_user_total").innerHTML = data.user.total;
272 document.getElementById("stats_user_total").classList.remove('numberDisplay');
273 document.getElementById("stats_user_total").classList.add('numberDisplay');
274 document.getElementById("stats_channel_total").innerHTML = data.channel.total;
275 document.getElementById("stats_oper_total").innerHTML = data.user.oper;
276 document.getElementById("stats_server_total").innerHTML = data.server.total;
277 document.getElementById("num_server_bans").innerHTML = data.server_ban.server_ban;
278 document.getElementById("num_spamfilter_entries").innerHTML = data.server_ban.spamfilter;
279 document.getElementById("num_ban_exceptions").innerHTML = data.server_ban.server_ban_exception;
280 document.getElementById("stats_uline_total").innerHTML = data.user.ulined + "/" + data.server.ulined;
281 }
282 function checkStatsOutdated()
283 {
284 setTimeout(checkStatsOutdated, 2000);
285 if (Date.now() - stats_tick > 10000)
286 document.getElementById("live_stats").style.visibility = 'hidden';
287 }
288 setTimeout(checkStatsOutdated, 2000);
289
290 function initStats()
291 {
292 if (!!window.EventSource) {
293 var source = new EventSource('api/overview.php');
294 source.addEventListener('message', updateStats, false);
295 }
296 }
297 initStats();
298 //setInterval(updateStats, 1000); // Update stats every second
299 // ^ commented out but may want to restart initStats() when connection is lost.
300
301
302 window.addEventListener('resize', function() {
303 var containers = document.querySelectorAll('.card-container');
304 var width = window.innerWidth;
305 if (width < 768)
306 {
307 containers.forEach((container) => {
308 container.removeAttribute('style');
309
310 });
311 } else
312 {
313 containers.forEach((container) => {
314 container.style.marginLeft = "40px";
315 container.style.marginTop = "30px";
316
317 });
318 }
319 });
320 </script>
321
322 <div class="container card-container card-container ml-1">
323
324 <div class="row">
325 <div class="col-sm mb-3">
326 <a class="card frosted-glass-success text-center" href="<?php echo get_config("base_url"); ?>settings">
327 <div class="card-body text-white">
328 <div class="row text-center">
329 <div class="col">
330 <div class="col">
331 <i aria-hidden="true" class="fa fa-lock-open fa-2x"></i>
332 </div>
333 <div class="col">
334 <h5 class="display-4 numberDisplay"><?php echo $num_of_panel_admins; ?></h5>
335 <h5 class="display-5">Panel Accounts</h5>
336 </div>
337 </div>
338 </div>
339 </div>
340 </a>
341 </div>
342 <div class="col-sm mb-3">
343 <a class="card frosted-glass-info text-center" href="<?php echo get_config("base_url"); ?>settings/plugins.php">
344 <div class="card-body text-light">
345 <div class="row text-center">
346 <div class="col">
347 <div class="col">
348 <i aria-hidden="true" class="fa fa-plug fa-2x"></i>
349 </div>
350 <div class="col">
351 <h5 class="display-4 numberDisplay"><?php echo count(Plugins::$list); ?></h5>
352 <h5 class="display-5">Plugins</h5>
353 </div>
354 </div>
355 </div>
356 </div>
357 </a>
358 </div>
359 </div>
360 </div>
361 <?php
362
363 Hook::run(HOOKTYPE_OVERVIEW_CARD, $stats);
364
365 require_once "inc/footer.php";