diff --git a/.gitignore b/.gitignore index e333297..53a83b9 100755 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ target .vscode .DS_Store *.log -plans \ No newline at end of file +plans +.codex \ No newline at end of file diff --git a/src/main/java/cz/kamma/fabka/app/HttpServerApplication.java b/src/main/java/cz/kamma/fabka/app/HttpServerApplication.java index 35bd358..fae6424 100644 --- a/src/main/java/cz/kamma/fabka/app/HttpServerApplication.java +++ b/src/main/java/cz/kamma/fabka/app/HttpServerApplication.java @@ -178,8 +178,8 @@ public class HttpServerApplication { List results = forumRepository.searchMessages(userId, searchText, forumId); - int loggedUsersCount = sessionManager.countSessionsWithAttribute(AUTH_USER_KEY); - List loggedUsers = sessionManager.sessionAttributeValues(AUTH_USER_KEY); + int loggedUsersCount = sessionManager.countDistinctAttributeValues(AUTH_USER_KEY); + List loggedUsers = sessionManager.distinctSessionAttributeValues(AUTH_USER_KEY); PrivateMessageStats pmStats = privateMessageRepository.stats(userId); Responses.html(ctx.exchange(), 200, Pages.searchResultsPage( @@ -336,8 +336,8 @@ public class HttpServerApplication { forumRepository.putHistoryRecord(userId, 0L); List forums = forumRepository.listActiveForums(); Map newCounts = forumRepository.getNewMessagesCountByUserId(userId); - int loggedUsersCount = sessionManager.countSessionsWithAttribute(AUTH_USER_KEY); - List loggedUsers = sessionManager.sessionAttributeValues(AUTH_USER_KEY); + int loggedUsersCount = sessionManager.countDistinctAttributeValues(AUTH_USER_KEY); + List loggedUsers = sessionManager.distinctSessionAttributeValues(AUTH_USER_KEY); PrivateMessageStats pmStats = privateMessageRepository.stats(userId); Responses.html(ctx.exchange(), 200, Pages.forumPage(username, forums, newCounts, loggedUsersCount, loggedUsers, pmStats)); }); @@ -356,8 +356,8 @@ public class HttpServerApplication { String soundSetting = (soundRaw == null) ? "soundon" : String.valueOf(soundRaw); String error = (String) session.getAttribute(MEMBER_ERROR_KEY); session.setAttribute(MEMBER_ERROR_KEY, null); - int loggedUsersCount = sessionManager.countSessionsWithAttribute(AUTH_USER_KEY); - List loggedUsers = sessionManager.sessionAttributeValues(AUTH_USER_KEY); + int loggedUsersCount = sessionManager.countDistinctAttributeValues(AUTH_USER_KEY); + List loggedUsers = sessionManager.distinctSessionAttributeValues(AUTH_USER_KEY); PrivateMessageStats pmStats = privateMessageRepository.stats(userId); Responses.html( ctx.exchange(), @@ -383,8 +383,8 @@ public class HttpServerApplication { session.setAttribute(CURRENT_PAGE_KEY, "chat"); String username = String.valueOf(session.getAttribute(AUTH_USER_KEY)); long userId = parseLong(session.getAttribute(AUTH_USER_ID_KEY), -1L); - int loggedUsersCount = sessionManager.countSessionsWithAttribute(AUTH_USER_KEY); - List loggedUsers = sessionManager.sessionAttributeValues(AUTH_USER_KEY); + int loggedUsersCount = sessionManager.countDistinctAttributeValues(AUTH_USER_KEY); + List loggedUsers = sessionManager.distinctSessionAttributeValues(AUTH_USER_KEY); PrivateMessageStats pmStats = privateMessageRepository.stats(userId); Responses.html(ctx.exchange(), 200, Pages.chatPage(username, loggedUsersCount, loggedUsers, pmStats)); }); @@ -423,8 +423,8 @@ public class HttpServerApplication { List threads = totalRows == 0 ? List.of() : allThreads.subList(fromIdx, toIdx); int rowsFrom = totalRows == 0 ? 0 : fromIdx + 1; int rowsTo = toIdx; - int loggedUsersCount = sessionManager.countSessionsWithAttribute(AUTH_USER_KEY); - List loggedUsers = sessionManager.sessionAttributeValues(AUTH_USER_KEY); + int loggedUsersCount = sessionManager.countDistinctAttributeValues(AUTH_USER_KEY); + List loggedUsers = sessionManager.distinctSessionAttributeValues(AUTH_USER_KEY); PrivateMessageStats pmStats = privateMessageRepository.stats(userId); Responses.html( ctx.exchange(), @@ -494,8 +494,8 @@ public class HttpServerApplication { String toUsername = privateMessageRepository.usernameById(toUser); String error = valueOrDefault((String) session.getAttribute(PM_ERROR_KEY), ""); session.setAttribute(PM_ERROR_KEY, null); - int loggedUsersCount = sessionManager.countSessionsWithAttribute(AUTH_USER_KEY); - List loggedUsers = sessionManager.sessionAttributeValues(AUTH_USER_KEY); + int loggedUsersCount = sessionManager.countDistinctAttributeValues(AUTH_USER_KEY); + List loggedUsers = sessionManager.distinctSessionAttributeValues(AUTH_USER_KEY); PrivateMessageStats pmStats = privateMessageRepository.stats(userId); Responses.html(ctx.exchange(), 200, Pages.newPmPage(username, toUser, toUsername, error, loggedUsersCount, loggedUsers, pmStats)); }); @@ -511,8 +511,8 @@ public class HttpServerApplication { String username = String.valueOf(session.getAttribute(AUTH_USER_KEY)); String error = valueOrDefault((String) session.getAttribute(NEW_THREAD_ERROR_KEY), ""); session.setAttribute(NEW_THREAD_ERROR_KEY, null); - int loggedUsersCount = sessionManager.countSessionsWithAttribute(AUTH_USER_KEY); - List loggedUsers = sessionManager.sessionAttributeValues(AUTH_USER_KEY); + int loggedUsersCount = sessionManager.countDistinctAttributeValues(AUTH_USER_KEY); + List loggedUsers = sessionManager.distinctSessionAttributeValues(AUTH_USER_KEY); PrivateMessageStats pmStats = privateMessageRepository.stats(userId); Responses.html(ctx.exchange(), 200, Pages.newThreadPage(username, error, loggedUsersCount, loggedUsers, pmStats)); }); @@ -607,8 +607,8 @@ public class HttpServerApplication { int rowsTo = toIdx; String error = valueOrDefault((String) session.getAttribute(PM_ERROR_KEY), ""); session.setAttribute(PM_ERROR_KEY, null); - int loggedUsersCount = sessionManager.countSessionsWithAttribute(AUTH_USER_KEY); - List loggedUsers = sessionManager.sessionAttributeValues(AUTH_USER_KEY); + int loggedUsersCount = sessionManager.countDistinctAttributeValues(AUTH_USER_KEY); + List loggedUsers = sessionManager.distinctSessionAttributeValues(AUTH_USER_KEY); PrivateMessageStats pmStats = privateMessageRepository.stats(userId); Responses.html( ctx.exchange(), @@ -791,8 +791,8 @@ public class HttpServerApplication { } ForumDisplayView view = paginate(filtered, pageNo, perPage, searchText, showType, showImg, sortBy, sortType); - int loggedUsersCount = sessionManager.countSessionsWithAttribute(AUTH_USER_KEY); - List loggedUsers = sessionManager.sessionAttributeValues(AUTH_USER_KEY); + int loggedUsersCount = sessionManager.countDistinctAttributeValues(AUTH_USER_KEY); + List loggedUsers = sessionManager.distinctSessionAttributeValues(AUTH_USER_KEY); MessageRenderSettings renderSettings = settingsRepository.loadMessageRenderSettings(); PrivateMessageStats pmStats = privateMessageRepository.stats(userId); Responses.html( @@ -1315,8 +1315,8 @@ public class HttpServerApplication { tableName = ""; } - int loggedUsersCount = sessionManager.countSessionsWithAttribute(AUTH_USER_KEY); - List loggedUsers = sessionManager.sessionAttributeValues(AUTH_USER_KEY); + int loggedUsersCount = sessionManager.countDistinctAttributeValues(AUTH_USER_KEY); + List loggedUsers = sessionManager.distinctSessionAttributeValues(AUTH_USER_KEY); PrivateMessageStats pmStats = privateMessageRepository.stats(userId); Responses.html( ctx.exchange(), diff --git a/src/main/java/cz/kamma/fabka/session/SessionManager.java b/src/main/java/cz/kamma/fabka/session/SessionManager.java index e8bf5ef..02601a5 100644 --- a/src/main/java/cz/kamma/fabka/session/SessionManager.java +++ b/src/main/java/cz/kamma/fabka/session/SessionManager.java @@ -2,8 +2,10 @@ package cz.kamma.fabka.session; import java.time.Duration; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; @@ -75,6 +77,26 @@ public class SessionManager { return values; } + public int countDistinctAttributeValues(String attributeKey) { + return distinctSessionAttributeValues(attributeKey).size(); + } + + public List distinctSessionAttributeValues(String attributeKey) { + cleanupExpired(); + Set values = new LinkedHashSet<>(); + for (SessionData session : sessions.values()) { + Object value = session.getAttribute(attributeKey); + if (value == null) { + continue; + } + String asString = String.valueOf(value).trim(); + if (!asString.isBlank()) { + values.add(asString); + } + } + return new ArrayList<>(values); + } + public List activeSessions() { cleanupExpired(); return new ArrayList<>(sessions.values());