diff --git a/messaging/rest/router.go b/messaging/rest/router.go index 3a3d59f1f..f4abeea23 100644 --- a/messaging/rest/router.go +++ b/messaging/rest/router.go @@ -27,6 +27,7 @@ func MountRoutes() func(chi.Router) { handlers.NewChannel(Channel{}.New()).MountRoutes(r) handlers.NewMessage(Message{}.New()).MountRoutes(r) handlers.NewSearch(Search{}.New()).MountRoutes(r) + handlers.NewStatus(Status{}.New()).MountRoutes(r) handlers.NewCommands(Commands{}.New()).MountRoutes(r) }) } diff --git a/messaging/rest/status.go b/messaging/rest/status.go index 95810b482..5ce765400 100644 --- a/messaging/rest/status.go +++ b/messaging/rest/status.go @@ -6,6 +6,7 @@ import ( "github.com/pkg/errors" "github.com/crusttech/crust/messaging/rest/request" + "github.com/crusttech/crust/messaging/websocket" ) var _ = errors.Wrap @@ -19,7 +20,22 @@ func (Status) New() *Status { } func (ctrl *Status) List(ctx context.Context, r *request.StatusList) (interface{}, error) { - return nil, errors.New("Not implemented: Status.list") + type userStatus struct { + UserID uint64 `json:"userID,string"` + Status string `json:"present"` + Icon string `json:"icon"` + Message string `json:"message"` + } + + out := []userStatus{} + for _, userID := range websocket.GetConnectedUsers() { + out = append(out, userStatus{ + UserID: userID, + Status: "online", + }) + } + + return out, nil } func (ctrl *Status) Set(ctx context.Context, r *request.StatusSet) (interface{}, error) { diff --git a/messaging/websocket/session_store.go b/messaging/websocket/session_store.go index d1a6389b5..2edf241a0 100644 --- a/messaging/websocket/session_store.go +++ b/messaging/websocket/session_store.go @@ -61,3 +61,18 @@ func (s *Store) Delete(id uint64) { defer s.Unlock() delete(s.Sessions, id) } + +func GetConnectedUsers() []uint64 { + var chk = map[uint64]bool{} + + store.Walk(func(session *Session) { + chk[session.user.Identity()] = true + }) + + var out = make([]uint64, 0) + for ID := range chk { + out = append(out, ID) + } + + return out +}