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