2 require_once "inc/common.php";
3 require_once "Classes/class-checkup.php";
4 if (!isset($config['unrealircd']))
6 $redirect = get_config("base_url")."settings/rpc-servers.php";
7 header('Location: ' . $redirect);
11 require_once "inc/header.php";
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(); ?>
21 /* What if someone wants to add their own stats... */
22 Hook
::run(HOOKTYPE_PRE_OVERVIEW_CARD
, $array_of_stats);
24 /* This makes sure that a plugin which called the parameter
25 * by reference can add/update the stats for display here.
27 $stats = (object) $array_of_stats;
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']))
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");
50 .card
-container a
.card
:hover { opacity
: 0.8; transition
: opacity
0.2s ease
-in
-out
; }
51 .card
-container
.card
{
56 background
-image
: url('https://cdn.wallpapersafari.com/34/98/yznZmQ.jpg');
57 background
-size
: cover
;
59 .card
-container
.card
-body i
{
64 .card
-container
.card
:hover
{
65 text
-decoration
: none
;
68 @keyframes rotateEffect
{
69 0% { transform
: rotateX(0deg
); }
70 50% { transform
: rotateX(180deg
); }
71 100% { transform
: rotateX(0deg
); }
75 animation
: rotateEffect
0.5s ease
;
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
);
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
);
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
);
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
);
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
);
115 <div
class="container card-container ml-1">
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: "; ?>
127 <i aria
-hidden
="true" class="fa fa-users fa-2x"></i
>
130 <h5 id
="stats_user_total" class="display-4 numberDisplay"></h5
>
131 <h5
class="display-5">Users Online
</h5
>
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">
144 <i aria
-hidden
="true" class="fa fa-hashtag fa-2x"></i
>
147 <h5 id
="stats_channel_total" class="display-4 numberDisplay"></h5
>
148 <h5
class="display-5">Channels
</h5
>
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">
161 <i aria
-hidden
="true" class="fa fa-shield-halved fa-2x"></i
>
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
>
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">
179 <i aria
-hidden
="true" class="fa fa-network-wired fa-2x"></i
>
182 <h5 id
="stats_server_total" class="display-4 numberDisplay"></h5
>
183 <h5
class="display-5">Servers
</h5
>
192 <div
class="container card-container ml-1">
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">
201 <i aria
-hidden
="true" class="fa fa-ban fa-2x"></i
>
204 <h5 id
="num_server_bans" class="display-4 numberDisplay"></h5
>
205 <h5
class="display-5">Server Bans
</h5
>
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">
218 <i aria
-hidden
="true" class="fa fa-filter fa-2x"></i
>
221 <h5 id
="num_spamfilter_entries" class="display-4 numberDisplay"></h5
>
222 <h5
class="display-5">Spamfilter
</h5
>
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">
235 <i aria
-hidden
="true" class="fa fa-door-open fa-2x"></i
>
238 <h5 id
="num_ban_exceptions" class="display-4 numberDisplay"></h5
>
239 <h5
class="display-5">Server Ban Exceptions
</h5
>
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">
252 <i aria
-hidden
="true" class="fa fa-database fa-2x"></i
>
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
>
268 /* Last time stats were updated */
271 function updateStats(e
)
275 data
= JSON
.parse(e
.data
);
279 stats_tick
= Date
.now()
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
;
293 function checkStatsOutdated()
295 setTimeout(checkStatsOutdated
, 2000);
296 if (Date
.now() - stats_tick
> 10000)
297 document
.getElementById("live_stats").style
.visibility
= 'hidden';
299 setTimeout(checkStatsOutdated
, 2000);
303 if (!!window
.EventSource
) {
304 var source
= new EventSource('api/overview.php');
305 source
.addEventListener('message', updateStats
, false);
309 //setInterval(updateStats, 1000); // Update stats every second
310 // ^ commented out but may want to restart initStats() when connection is lost.
313 window
.addEventListener('resize', function() {
314 var containers
= document
.querySelectorAll('.card-container');
315 var width
= window
.innerWidth
;
318 containers
.forEach((container
) => {
319 container
.removeAttribute('style');
324 containers
.forEach((container
) => {
325 container
.style
.marginLeft
= "40px";
326 container
.style
.marginTop
= "30px";
333 <div
class="container card-container card-container ml-1">
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">
342 <i aria
-hidden
="true" class="fa fa-lock-open fa-2x"></i
>
345 <h5
class="display-4 numberDisplay"><?php
echo $num_of_panel_admins; ?></h5
>
346 <h5
class="display-5">Panel Accounts
</h5
>
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">
359 <i aria
-hidden
="true" class="fa fa-plug fa-2x"></i
>
362 <h5
class="display-4 numberDisplay"><?php
echo count(Plugins
::$list); ?></h5
>
363 <h5
class="display-5">Plugins
</h5
>
374 Hook
::run(HOOKTYPE_OVERVIEW_CARD
, $stats);
376 require_once "inc/footer.php";