diff --git a/dist/script.js b/dist/script.js index 4a0e81e..12e1b42 100644 --- a/dist/script.js +++ b/dist/script.js @@ -86,14 +86,9 @@ function addMessage(messageType, serviceType, serviceName, message, timestamp) { deleteOldMessages() } -function addViewerInfoMessage(joined, timestamp) { +function addCustomMessage(message) { let li = document.createElement("li") - - if (joined) { - li.innerHTML = formatDate(timestamp) + "A client has joined" - } else { - li.innerHTML = formatDate(timestamp) + "A client has left" - } + li.innerHTML = message messages.appendChild(li) @@ -104,6 +99,14 @@ function addViewerInfoMessage(joined, timestamp) { deleteOldMessages() } +function addViewerInfoMessage(joined, timestamp) { + if (joined) { + addCustomMessage(formatDate(timestamp) + "A client has joined") + } else { + addCustomMessage(formatDate(timestamp) + "A client has left") + } +} + function deleteOldMessages() { if (messages.childElementCount > 500) { messages.removeChild(messages.getElementsByTagName("li")[0]) @@ -195,18 +198,28 @@ function connectWS() { serviceType = data.ServiceType timestamp = data.Timestamp - console.log(timestamp) - - if (messageType == 100 && serviceName == 100) { + if (messageType == 100 && serviceName == 100) { // viewer count viewersCount.innerHTML = data.Msg + (data.Msg == 1 ? " viewer" : " viewers") addViewerInfoMessage(serviceType == 1, timestamp) + } else if (messageType == 101 && serviceName == 101 && serviceType == 101) { + lastMessages = JSON.parse(data.Msg) + + if (lastMessages != null && lastMessages.length > 0) { + addCustomMessage("––––––––– START OF OLD MESSAGES –––––––––") + + for (const i in lastMessages) { + addMessage(lastMessages[i].MessageType, lastMessages[i].ServiceType, lastMessages[i].ServiceName, lastMessages[i].Msg, lastMessages[i].Timestamp) + } + + addCustomMessage("––––––––– END OF OLD MESSAGES –––––––––") + } } else { if (serviceType == 0 && !checkboxAlpha.checked) return if (serviceType == 1 && !checkboxBeta.checked) return if (serviceType == 2 && !checkboxStable.checked) return - addMessage(messageType, serviceType, serviceName, data["Msg"], timestamp) + addMessage(messageType, serviceType, serviceName, data.Msg, timestamp) } } diff --git a/main.go b/main.go index 8002854..d0e45f9 100644 --- a/main.go +++ b/main.go @@ -18,8 +18,6 @@ package main import ( - "time" - "clickandjoin.app/managementsystem/modules/config" "clickandjoin.app/managementsystem/modules/rabbitmq" "clickandjoin.app/managementsystem/modules/scylladb" @@ -79,7 +77,5 @@ func main() { router.SetupRoutes(app) - gocnjhelper.LogInfof("%s", time.Now().UnixMilli()) - app.Listen(cfg.Host + ":" + cfg.Port) } diff --git a/modules/cache/cache.go b/modules/cache/cache.go index 903ba9d..ee98db0 100644 --- a/modules/cache/cache.go +++ b/modules/cache/cache.go @@ -4,35 +4,59 @@ import ( "sync" "clickandjoin.app/managementsystem/modules/structs" + "clickandjoin.app/managementsystem/modules/utils" + gocnjhelper "git.clickandjoin.umbach.dev/ClickandJoin/go-cnj-helper" ) var socketClients = make(map[string]*structs.SocketClient) -var mu sync.RWMutex +var muS sync.RWMutex func AddSocketClient(clientId string, socketClient *structs.SocketClient) { - mu.Lock() + muS.Lock() socketClients[clientId] = socketClient - mu.Unlock() + muS.Unlock() } func DeleteClient(clientId string) { - mu.Lock() + muS.Lock() delete(socketClients, clientId) - mu.Unlock() + muS.Unlock() } func GetSocketClients() map[string]*structs.SocketClient { - mu.RLock() - defer mu.RUnlock() + muS.RLock() + defer muS.RUnlock() return socketClients } func GetSocketClient(clientId string) (socketClient *structs.SocketClient, ok bool) { - mu.RLock() - defer mu.RUnlock() + muS.RLock() + defer muS.RUnlock() client, ok := socketClients[clientId] return client, ok } + +var lastLogMessages []gocnjhelper.RabbitMqLogMessage +var muL sync.RWMutex + +func AddLastLogMessage(rabbitMqLogMessage gocnjhelper.RabbitMqLogMessage) { + muL.Lock() + + if len(lastLogMessages) > utils.CachedLastLogMessages { + lastLogMessages = lastLogMessages[1:] + } + + lastLogMessages = append(lastLogMessages, rabbitMqLogMessage) + + muL.Unlock() +} + +func GetlastLogMessages() []gocnjhelper.RabbitMqLogMessage { + muL.RLock() + defer muL.RUnlock() + + return lastLogMessages +} diff --git a/modules/rabbitmq/helper.go b/modules/rabbitmq/helper.go index ed597e0..cde12e9 100644 --- a/modules/rabbitmq/helper.go +++ b/modules/rabbitmq/helper.go @@ -3,10 +3,10 @@ package rabbitmq import ( "encoding/json" + "clickandjoin.app/managementsystem/modules/cache" "clickandjoin.app/managementsystem/socketclients" gocnjhelper "git.clickandjoin.umbach.dev/ClickandJoin/go-cnj-helper" amqp "github.com/rabbitmq/amqp091-go" - "github.com/rs/zerolog/log" ) func LogsMessagesHandling() { @@ -50,10 +50,10 @@ func LogsMessagesHandling() { continue } - log.Info().Msgf("msg", logMessage) - socketclients.BroadcastLogMessage(logMessage) + cache.AddLastLogMessage(logMessage) + msg.Ack(false) } } diff --git a/modules/utils/definitions.go b/modules/utils/definitions.go index d4b585b..fca1add 100644 --- a/modules/utils/definitions.go +++ b/modules/utils/definitions.go @@ -1 +1,3 @@ package utils + +const CachedLastLogMessages = 499 // Number of messages held in the cache and sent to new clients to receive the latest messages diff --git a/readme.md b/readme.md index aa1969d..4dffe67 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,6 @@ -# Management System +# Definitions that are specified in the app + +[Click here to see the definitions](modules/utils/definitions.go) ## Tasks - Admin Dashboard diff --git a/socketserver/hub.go b/socketserver/hub.go index ce90e41..8eea9f4 100644 --- a/socketserver/hub.go +++ b/socketserver/hub.go @@ -1,6 +1,9 @@ package socketserver import ( + "encoding/json" + "time" + "clickandjoin.app/managementsystem/modules/cache" "clickandjoin.app/managementsystem/modules/structs" "clickandjoin.app/managementsystem/socketclients" @@ -24,6 +27,22 @@ func RunHub() { cache.AddSocketClient(newSocketClient.ClientId, newSocketClient) socketclients.BroadcastViewersCountMessage(1) + if socketClient, ok := cache.GetSocketClient(newSocketClient.ClientId); ok { + lastMessages, err := json.Marshal(cache.GetlastLogMessages()) + + if err != nil { + gocnjhelper.LogDebugf("Failed to marshal last messages, err: %s") + continue + } + + socketClient.SendMessage(gocnjhelper.RabbitMqLogMessage{ + MessageType: 101, + ServiceName: 101, + ServiceType: 101, + Msg: string(lastMessages), + Timestamp: time.Now().Unix(), + }) + } case data := <-broadcast: gocnjhelper.LogDebugf("RECEIVED WEBSOCKET MESSAGE: %s", data.Msg)