spark-server/internal/transport/tcp/session/kick.go
zhr ae9a71034d feat: implement Spark IM V3 modular monolith
Add HTTP /v1 MVC, TCP send path, groups with server-side member-avatar collage, object-storage upload, and friends/favorites around the architecture-v3 layout.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-17 19:52:11 +08:00

56 lines
1.3 KiB
Go

package session
import (
"spark-server/internal/pkg/i18n"
"spark-server/internal/transport/tcp/protocol"
)
func (m *memManager) Get(sessionID string) (Session, bool) {
m.mu.RLock()
defer m.mu.RUnlock()
s, ok := m.byID[sessionID]
return s, ok
}
func (m *memManager) kickSameDevice(incoming Session) {
userMap := m.byUser[incoming.UserID()]
if userMap == nil {
return
}
for _, existing := range userMap {
if existing.DeviceID() != incoming.DeviceID() || existing.ID() == incoming.ID() {
continue
}
reason := i18n.T(i18n.Parse(existing.Language()), i18n.NotifyKickReplaced, nil)
_ = existing.Send(&Packet{
Command: protocol.CmdKick,
Body: protocol.EncodeKick(reason),
})
_ = existing.Close()
delete(m.byID, existing.ID())
delete(userMap, existing.ID())
}
}
func (m *memManager) KickDevice(userID int64, deviceID uint64) {
m.mu.Lock()
defer m.mu.Unlock()
userMap := m.byUser[userID]
if userMap == nil {
return
}
for id, existing := range userMap {
if existing.DeviceID() != deviceID {
continue
}
reason := i18n.T(i18n.Parse(existing.Language()), i18n.NotifyKickLogout, nil)
_ = existing.Send(&Packet{
Command: protocol.CmdKick,
Body: protocol.EncodeKick(reason),
})
_ = existing.Close()
delete(m.byID, id)
delete(userMap, id)
}
}