From 2ec5934d2e8fafd6f48975e4abb843a7e06cb141 Mon Sep 17 00:00:00 2001 From: Denis Arh Date: Wed, 24 Oct 2018 17:17:31 +0200 Subject: [PATCH] User/channel activity echoing service --- internal/payload/incoming/channel.go | 6 ++++++ internal/payload/incoming/payload.go | 2 ++ internal/payload/outgoing/channel.go | 11 +++++++++++ internal/payload/outgoing/payload.go | 2 ++ sam/websocket/session_incoming.go | 2 ++ sam/websocket/session_incoming_channel.go | 9 +++++++++ 6 files changed, 32 insertions(+) diff --git a/internal/payload/incoming/channel.go b/internal/payload/incoming/channel.go index a01bdce7d..ab0003970 100644 --- a/internal/payload/incoming/channel.go +++ b/internal/payload/incoming/channel.go @@ -32,4 +32,10 @@ type ( ChannelDelete struct { ChannelID string `json:"id"` } + + // ChannelActivity is sent from the client when there is an activity on the channel... + ChannelActivity struct { + ChannelID uint64 `json:"ID,string"` + Kind string `json:"kind,omitempty"` + } ) diff --git a/internal/payload/incoming/payload.go b/internal/payload/incoming/payload.go index 48289c9bb..1a4f2a5a9 100644 --- a/internal/payload/incoming/payload.go +++ b/internal/payload/incoming/payload.go @@ -12,6 +12,8 @@ type Payload struct { *ChannelViewRecord `json:"recordChannelView"` + *ChannelActivity `json:"channelActivity"` + // Get channel message history *Messages `json:"messages"` diff --git a/internal/payload/outgoing/channel.go b/internal/payload/outgoing/channel.go index 692711f95..c25a78a5f 100644 --- a/internal/payload/outgoing/channel.go +++ b/internal/payload/outgoing/channel.go @@ -22,6 +22,13 @@ type ( UserID string `json:"userID"` } + // ChannelActivity indicates where the activity is and who is active + ChannelActivity struct { + ID uint64 `json:"channelID,string"` + UserID uint64 `json:"userID,string"` + Kind string `json:"kind,omitempty"` + } + Channel struct { // Channel to part (nil) for ALL channels ID string `json:"ID"` @@ -49,6 +56,10 @@ func (p *ChannelPart) EncodeMessage() ([]byte, error) { return json.Marshal(Payload{ChannelPart: p}) } +func (p *ChannelActivity) EncodeMessage() ([]byte, error) { + return json.Marshal(Payload{ChannelActivity: p}) +} + func (p *Channel) EncodeMessage() ([]byte, error) { return json.Marshal(Payload{Channel: p}) } diff --git a/internal/payload/outgoing/payload.go b/internal/payload/outgoing/payload.go index 422b95008..92da9df72 100644 --- a/internal/payload/outgoing/payload.go +++ b/internal/payload/outgoing/payload.go @@ -15,6 +15,8 @@ type ( *Channel `json:"channel,omitempty"` *ChannelSet `json:"channels,omitempty"` + *ChannelActivity `json:"channelActivity,omitempty"` + *ChannelMember `json:"channelMember,omitempty"` *ChannelMemberSet `json:"channelMembers,omitempty"` diff --git a/sam/websocket/session_incoming.go b/sam/websocket/session_incoming.go index 52623ad2c..613e7788f 100644 --- a/sam/websocket/session_incoming.go +++ b/sam/websocket/session_incoming.go @@ -39,6 +39,8 @@ func (s *Session) dispatch(raw []byte) error { return s.channelUpdate(ctx, p.ChannelUpdate) case p.ChannelViewRecord != nil: return s.channelViewRecord(ctx, p.ChannelViewRecord) + case p.ChannelActivity != nil: + return s.channelActivity(ctx, p.ChannelActivity) case p.Users != nil: return s.userList(ctx, p.Users) diff --git a/sam/websocket/session_incoming_channel.go b/sam/websocket/session_incoming_channel.go index ef7dabbf6..74cb266fb 100644 --- a/sam/websocket/session_incoming_channel.go +++ b/sam/websocket/session_incoming_channel.go @@ -119,3 +119,12 @@ func (s *Session) channelViewRecord(ctx context.Context, p *incoming.ChannelView return s.svc.ch.With(ctx).RecordView(channelID, userID, lastMessageID) } + +// Echoes received channel activity back to all subscribers +func (s *Session) channelActivity(ctx context.Context, p *incoming.ChannelActivity) error { + return s.sendToAllSubscribers(&outgoing.ChannelActivity{ + ID: p.ChannelID, + UserID: auth.GetIdentityFromContext(ctx).Identity(), + Kind: p.Kind, + }, payload.Uint64toa(p.ChannelID)) +}