aboutsummaryrefslogtreecommitdiff
path: root/cmd/mobius-hotline-server
diff options
context:
space:
mode:
authorJeff Halter <868228+jhalter@users.noreply.github.com>2026-06-25 07:44:23 -0700
committerJeff Halter <868228+jhalter@users.noreply.github.com>2026-06-25 07:44:23 -0700
commitbba70d0a2903ab1fff5a2e89cff97cb1f6c7f82a (patch)
treecb8bd5cda76f287358bd7b73292ae024e756c824 /cmd/mobius-hotline-server
parent4912c3a7c20d765692993f6caaa98a94f5ae28cb (diff)
Introduce PresenceTracker interface for online-user tracking
Replace the leaky *redis.Client field on Server with a PresenceTracker interface that receives connect/rename/disconnect lifecycle events. This removes Redis-specific set encoding from hotline/server.go and the session handlers, and drops the redis dependency from the hotline package. The Redis implementation moves to mobius.RedisPresenceTracker, which owns the legacy "login::ip"/"login:nickname:ip" set encoding so existing deployments keep working. The API server reads online users through a new OnlineLister interface and falls back to the in-memory ClientMgr when no presence tracker is configured. Startup clearing of stale online state now happens unconditionally when Redis is configured, not only when the API server is enabled.
Diffstat (limited to 'cmd/mobius-hotline-server')
-rw-r--r--cmd/mobius-hotline-server/main.go12
1 files changed, 10 insertions, 2 deletions
diff --git a/cmd/mobius-hotline-server/main.go b/cmd/mobius-hotline-server/main.go
index ba7924d..5191805 100644
--- a/cmd/mobius-hotline-server/main.go
+++ b/cmd/mobius-hotline-server/main.go
@@ -122,6 +122,7 @@ func main() {
reloaders = append(reloaders, namedReloader{"message board", messageBoard})
// Initialize ban list - use Redis if configured, otherwise use file-based storage
+ var onlineLister mobius.OnlineLister
if *redisAddr != "" {
redisClient := redis.NewClient(&redis.Options{
Addr: *redisAddr,
@@ -135,7 +136,14 @@ func main() {
os.Exit(1)
}
- srv.Redis = redisClient
+ presence := mobius.NewRedisPresenceTracker(redisClient, slogger)
+ // Discard stale online state from a previous run.
+ if err := presence.Clear(ctx); err != nil {
+ slogger.Warn("Failed to clear online users in Redis", "err", err)
+ }
+ srv.Presence = presence
+ onlineLister = presence
+
srv.BanList = mobius.NewRedisBanMgr(redisClient, slogger)
slogger.Debug("Using Redis for ban management", "addr", *redisAddr)
} else {
@@ -195,7 +203,7 @@ func main() {
}
if *apiAddr != "" {
- sh := mobius.NewAPIServer(srv, reloadFunc, slogger, *apiKey)
+ sh := mobius.NewAPIServer(srv, onlineLister, reloadFunc, slogger, *apiKey)
go sh.Serve(*apiAddr)
}