@@ -40,8 +40,8 @@ <h1 class="text-3xl font-bold tracking-tight text-white">Dashboard</h1>
4040 </ svg >
4141 </ div >
4242 < div class ="stat-title text-base-content "> Server Count</ div >
43- < div class ="stat-value text-primary "> 1 </ div >
44- < div class ="stat-desc "> 100% more than before Byte was born </ div >
43+ < div class ="stat-value text-primary " id =" server-count " > - </ div >
44+ < div class ="stat-desc "> Servers connected to Byte</ div >
4545 </ div >
4646
4747 < div class ="stat ">
@@ -68,17 +68,23 @@ <h1 class="text-3xl font-bold tracking-tight text-white">Dashboard</h1>
6868
6969 < div class ="stat ">
7070 < div class ="stat-figure text-secondary ">
71- < div class ="avatar online ">
71+ < div class ="avatar " id =" bot-avatar ">
7272 < div class ="w-16 rounded-full ">
7373 < img src ="static/logo.svg " alt ="Byte Logo " />
7474 </ div >
7575 </ div >
7676 </ div >
77- < div class ="stat-title text-base-content "> Uptime</ div >
78- < div class ="stat-value text-primary "> 99.99%</ div >
79- < div class ="stat-desc text-warning "> 2 issues in the last 24 hours</ div >
77+ < div class ="stat-title text-base-content "> Bot Status</ div >
78+ < div class ="stat-value ">
79+ < span id ="bot-status " class ="badge badge-lg "> -</ span >
80+ </ div >
81+ < div class ="stat-desc "> Uptime: < span id ="uptime "> -</ span > </ div >
8082 </ div >
8183 </ div >
84+ < div class ="mt-4 text-sm text-center text-base-content/60 dark:text-base-100/40 ">
85+ Last update: < span id ="last-update "> -</ span >
86+ | WebSocket: < span id ="ws-status " class ="ws-status "> disconnected</ span >
87+ </ div >
8288 < div class ="mt-10 p-4 rounded-lg shadow-2xl bg-base-100/60 dark:bg-neutral/60 ">
8389 < h1 class ="text-5xl font-bold text-base-content dark:text-base-100/80 "> Activity</ h1 >
8490 < div class ="h-[calc(50vh-10em)] overflow-y-auto ">
@@ -487,4 +493,122 @@ <h1 class="text-5xl font-bold text-base-content dark:text-base-100/80">Activity<
487493 </ div >
488494 </ div >
489495</ main >
490- {% endblock content %} {% block extrajs %}{% endblock extrajs %}
496+ {% endblock content %}
497+ {% block extrajs %}
498+ < script >
499+ let ws = null ;
500+ let reconnectAttempts = 0 ;
501+ const maxReconnectAttempts = 5 ;
502+
503+ function connectWebSocket ( ) {
504+ const protocol = window . location . protocol === 'https:' ? 'wss:' : 'ws:' ;
505+ const wsUrl = `${ protocol } //${ window . location . host } /ws/dashboard` ;
506+
507+ console . log ( 'Connecting to WebSocket:' , wsUrl ) ;
508+ ws = new WebSocket ( wsUrl ) ;
509+
510+ ws . onopen = ( ) => {
511+ console . log ( 'WebSocket connected' ) ;
512+ reconnectAttempts = 0 ;
513+ updateConnectionStatus ( 'connected' ) ;
514+ } ;
515+
516+ ws . onmessage = ( event ) => {
517+ const data = JSON . parse ( event . data ) ;
518+ console . log ( 'WebSocket message received:' , data ) ;
519+ updateDashboard ( data ) ;
520+ } ;
521+
522+ ws . onclose = ( ) => {
523+ console . log ( 'WebSocket closed, attempting reconnect...' ) ;
524+ updateConnectionStatus ( 'disconnected' ) ;
525+
526+ if ( reconnectAttempts < maxReconnectAttempts ) {
527+ reconnectAttempts ++ ;
528+ const delay = 3000 * reconnectAttempts ;
529+ console . log ( `Reconnecting in ${ delay } ms (attempt ${ reconnectAttempts } /${ maxReconnectAttempts } )` ) ;
530+ setTimeout ( connectWebSocket , delay ) ;
531+ } else {
532+ console . error ( 'Max reconnection attempts reached' ) ;
533+ updateConnectionStatus ( 'failed' ) ;
534+ }
535+ } ;
536+
537+ ws . onerror = ( error ) => {
538+ console . error ( 'WebSocket error:' , error ) ;
539+ updateConnectionStatus ( 'error' ) ;
540+ } ;
541+ }
542+
543+ function updateDashboard ( data ) {
544+ // Update server count
545+ const serverCountEl = document . getElementById ( 'server-count' ) ;
546+ if ( serverCountEl ) {
547+ serverCountEl . textContent = data . server_count ;
548+ }
549+
550+ // Update bot status
551+ const botStatusEl = document . getElementById ( 'bot-status' ) ;
552+ const botAvatarEl = document . getElementById ( 'bot-avatar' ) ;
553+ if ( botStatusEl ) {
554+ const isOnline = data . bot_status === 'online' ;
555+ botStatusEl . textContent = data . bot_status ;
556+ botStatusEl . className = isOnline ? 'badge badge-lg badge-success' : 'badge badge-lg badge-error' ;
557+
558+ // Update avatar online indicator
559+ if ( botAvatarEl ) {
560+ if ( isOnline ) {
561+ botAvatarEl . classList . add ( 'online' ) ;
562+ } else {
563+ botAvatarEl . classList . remove ( 'online' ) ;
564+ }
565+ }
566+ }
567+
568+ // Update uptime
569+ const uptimeEl = document . getElementById ( 'uptime' ) ;
570+ if ( uptimeEl ) {
571+ uptimeEl . textContent = formatUptime ( data . uptime ) ;
572+ }
573+
574+ // Update last update timestamp
575+ const timestampEl = document . getElementById ( 'last-update' ) ;
576+ if ( timestampEl ) {
577+ const updateTime = new Date ( data . timestamp ) ;
578+ timestampEl . textContent = updateTime . toLocaleTimeString ( ) ;
579+ }
580+ }
581+
582+ function formatUptime ( seconds ) {
583+ const days = Math . floor ( seconds / 86400 ) ;
584+ const hours = Math . floor ( ( seconds % 86400 ) / 3600 ) ;
585+ const minutes = Math . floor ( ( seconds % 3600 ) / 60 ) ;
586+
587+ if ( days > 0 ) {
588+ return `${ days } d ${ hours } h ${ minutes } m` ;
589+ } else if ( hours > 0 ) {
590+ return `${ hours } h ${ minutes } m` ;
591+ } else {
592+ return `${ minutes } m` ;
593+ }
594+ }
595+
596+ function updateConnectionStatus ( status ) {
597+ const statusEl = document . getElementById ( 'ws-status' ) ;
598+ if ( statusEl ) {
599+ statusEl . textContent = status ;
600+ statusEl . className = `ws-status ws-status-${ status } ` ;
601+ }
602+ }
603+
604+ // Connect on page load
605+ document . addEventListener ( 'DOMContentLoaded' , connectWebSocket ) ;
606+
607+ // Cleanup on page unload
608+ window . addEventListener ( 'beforeunload' , ( ) => {
609+ if ( ws ) {
610+ ws . close ( ) ;
611+ }
612+ } ) ;
613+ </ script >
614+ {% endblock extrajs %}
0 commit comments