]> jfr.im git - irc/unrealircd/unrealircd-webpanel.git/blob - index.php
973427177bc380ff67022cf05cddaba469bae165
[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 border-radius: 16px;
37 width:fit-content;
38 }
39 .card-container a.card:hover { opacity: 0.8; transition: opacity 0.2s ease-in-out; }
40 .card-container .card {
41 min-height: 80%;
42 border-radius: 16px;
43 }
44 body {
45 background-image: url('https://cdn.wallpapersafari.com/34/98/yznZmQ.jpg');
46 background-size: cover;
47 }
48 .card-container .card-body i {
49 position: fixed;
50 top: 10px;
51 right: 10px;
52 }
53 .card-container .card:hover {
54 text-decoration: none;
55 }
56
57 @keyframes rotateEffect {
58 0% { transform: rotateX(0deg); }
59 50% { transform: rotateX(180deg); }
60 100% { transform: rotateX(0deg); }
61 }
62
63 .numberDisplay {
64 animation: rotateEffect 0.5s ease;
65 }
66
67 .frosted-glass-success {
68 /* From https://css.glass */
69 background: rgba(63, 162, 36, 0.73);
70 box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
71 backdrop-filter: blur(9.8px);
72 -webkit-backdrop-filter: blur(9.8px);
73 }
74 .frosted-glass-info {
75 /* From https://css.glass */
76 background: rgba(57, 127, 207, 0.73);
77 box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
78 backdrop-filter: blur(9.8px);
79 -webkit-backdrop-filter: blur(9.8px);
80 }
81 .frosted-glass-danger {
82 /* From https://css.glass */
83 background: rgba(207, 57, 57, 0.73);
84 box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
85 backdrop-filter: blur(9.8px);
86 -webkit-backdrop-filter: blur(9.8px);
87 }
88 .frosted-glass-warning {
89 /* From https://css.glass */
90 background: rgba(207, 194, 57, 0.73);
91 box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
92 backdrop-filter: blur(9.8px);
93 -webkit-backdrop-filter: blur(9.8px);
94 }
95 .frosted-glass-secondary {
96 /* From https://css.glass */
97 background: rgba(75, 75, 75, 0.73);
98 box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
99 backdrop-filter: blur(9.8px);
100 -webkit-backdrop-filter: blur(9.8px);
101 }
102
103 </style>
104 <div class="container card-container ml-1">
105
106 <div class="row mt-3">
107 <div class="col-sm mb-3">
108 <a class="card frosted-glass-success text-center" href="<?php echo get_config("base_url"); ?>users/">
109 <div class="card-body text-white">
110 <div class="row text-center">
111 <span id="userRecord" class="position-absolute badge rounded-pill badge-warning" hidden>
112 <?php echo "Record: "; ?>
113 </span>
114 <div class="col">
115 <div class="col">
116 <i aria-hidden="true" class="fa fa-users fa-2x"></i>
117 </div>
118 <div class="col">
119 <h5 id="stats_user_total" class="display-4 numberDisplay"></h5>
120 <h5 class="display-5">Users Online</h5>
121 </div>
122 </div>
123 </div>
124 </div>
125 </a>
126 </div>
127 <div class="col-sm mb-3">
128 <a class="card frosted-glass-info text-center" href="<?php echo get_config("base_url"); ?>channels/">
129 <div class="card-body text-white">
130 <div class="row text-center">
131 <div class="col">
132 <div class="col">
133 <i aria-hidden="true" class="fa fa-hashtag fa-2x"></i>
134 </div>
135 <div class="col">
136 <h5 id="stats_channel_total" class="display-4 numberDisplay"></h5>
137 <h5 class="display-5">Channels</h5>
138 </div>
139 </div>
140 </div>
141 </div>
142 </a>
143 </div>
144 <div class="col-sm mb-3">
145 <a class="card frosted-glass-warning text-center" href="<?php echo get_config("base_url"); ?>users/">
146 <div class="card-body text-dark">
147 <div class="row text-center">
148 <div class="col">
149 <div class="col">
150 <i aria-hidden="true" class="fa fa-shield-halved fa-2x"></i>
151 </div>
152 <div class="col">
153 <h5 id="stats_oper_total" class="display-4 numberDisplay"></h5>
154 <h5 class="display-5" style="margin-top: -3px">Operators</h5>
155 <h5 style="font-size: 10px; margin-top:-12px">View in Users ></h5>
156 </div>
157 </div>
158 </div>
159 </div>
160 </a>
161 </div>
162 <div class="col-sm mb-3">
163 <a class="card frosted-glass-secondary text-center" href="<?php echo get_config("base_url"); ?>servers/">
164 <div class="card-body text-white">
165 <div class="row text-center">
166 <div class="col">
167 <div class="col">
168 <i aria-hidden="true" class="fa fa-network-wired fa-2x"></i>
169 </div>
170 <div class="col">
171 <h5 id="stats_server_total" class="display-4 numberDisplay"></h5>
172 <h5 class="display-5">Servers</h5>
173 </div>
174 </div>
175 </div>
176 </div>
177 </a>
178 </div>
179 </div>
180 </div>
181 <div class="container card-container ml-1">
182
183 <div class="row">
184 <div class="col-sm mb-3">
185 <a class="card frosted-glass-danger text-center" href="<?php echo get_config("base_url"); ?>server-bans/">
186 <div class="card-body text-white">
187 <div class="row text-center">
188 <div class="col">
189 <div class="col">
190 <i aria-hidden="true" class="fa fa-ban fa-2x"></i>
191 </div>
192 <div class="col">
193 <h5 id="num_server_bans" class="display-4 numberDisplay"></h5>
194 <h5 class="display-5">Server Bans</h5>
195 </div>
196 </div>
197 </div>
198 </div>
199 </a>
200 </div>
201 <div class="col-sm mb-3">
202 <a class="card frosted-glass-secondary text-center" href="<?php echo get_config("base_url"); ?>spamfilter.php/">
203 <div class="card-body text-white">
204 <div class="row text-center">
205 <div class="col">
206 <div class="col">
207 <i aria-hidden="true" class="fa fa-filter fa-2x"></i>
208 </div>
209 <div class="col">
210 <h5 id="num_spamfilter_entries" class="display-4 numberDisplay"></h5>
211 <h5 class="display-5">Spamfilter</h5>
212 </div>
213 </div>
214 </div>
215 </div>
216 </a>
217 </div>
218 <div class="col-sm mb-3">
219 <a class="card frosted-glass-info text-center" href="<?php echo get_config("base_url"); ?>server-bans/ban-exceptions.php">
220 <div class="card-body text-white">
221 <div class="row text-center">
222 <div class="col">
223 <div class="col">
224 <i aria-hidden="true" class="fa fa-door-open fa-2x"></i>
225 </div>
226 <div class="col">
227 <h5 id="num_ban_exceptions" class="display-4 numberDisplay"></h5>
228 <h5 class="display-5">Server Ban Exceptions</h5>
229 </div>
230 </div>
231 </div>
232 </div>
233 </a>
234 </div>
235 <div class="col-sm mb-3">
236 <a class="card frosted-glass-success text-center" href="<?php echo get_config("base_url"); ?>servers">
237 <div class="card-body text-white">
238 <div class="row text-center">
239 <div class="col">
240 <div class="col">
241 <i aria-hidden="true" class="fa fa-database fa-2x"></i>
242 </div>
243 <div class="col">
244 <h5 id="stats_uline_total" class="display-4 numberDisplay"></h5>
245 <h5 class="display-5" style="margin-top: -3px">Services Online</h5>
246 <h5 style="font-size: 10px; margin-top:-12px">View in Servers ></h5>
247 </div>
248 </div>
249 </div>
250 </div>
251 </a>
252 </div>
253 </div>
254 </div>
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";