From e04b001d8bdb3b19db5ab9f510e8a4b5bc92039a Mon Sep 17 00:00:00 2001 From: Nikos Filippakis Date: Tue, 16 Jun 2020 19:27:04 +0200 Subject: [PATCH] Use the state store to retrieve room joined users Signed-off-by: Nikos Filippakis --- clients/bot_client.go | 6 +----- clients/state_store.go | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/clients/bot_client.go b/clients/bot_client.go index 0573e29..6752d2e 100644 --- a/clients/bot_client.go +++ b/clients/bot_client.go @@ -75,14 +75,10 @@ func (botClient *BotClient) SendMessageEvent(content interface{}, roomID id.Room return err } else if sess == nil || sess.Expired() || !sess.Shared { // No error but valid, shared session does not exist - membs, err := botClient.client.JoinedMembers(roomID) + memberIDs, err := botClient.stateStore.GetJoinedMembers(roomID) if err != nil { return err } - memberIDs := make([]id.UserID, 0, len(membs.Joined)) - for member := range membs.Joined { - memberIDs = append(memberIDs, member) - } // Share group session with room members if err = olmMachine.ShareGroupSession(roomID, memberIDs); err != nil { return err diff --git a/clients/state_store.go b/clients/state_store.go index 0be3a21..fa95a74 100644 --- a/clients/state_store.go +++ b/clients/state_store.go @@ -1,6 +1,8 @@ package clients import ( + "errors" + "maunium.net/go/mautrix" "maunium.net/go/mautrix/event" "maunium.net/go/mautrix/id" @@ -52,3 +54,26 @@ func (ss *NebStateStore) UpdateStateStore(resp *mautrix.RespSync) { } } } + +// GetJoinedMembers returns a list of members that are currently in a room. +func (ss *NebStateStore) GetJoinedMembers(roomID id.RoomID) ([]id.UserID, error) { + joinedMembers := make([]id.UserID, 0) + room := ss.Storer.LoadRoom(roomID) + if room == nil { + return nil, errors.New("unknown roomID") + } + memberEvents := room.State[event.StateMember] + if memberEvents == nil { + return nil, errors.New("no state member events found") + } + for stateKey, stateEvent := range memberEvents { + if stateEvent == nil { + continue + } + stateEvent.Content.ParseRaw(event.StateMember) + if stateEvent.Content.AsMember().Membership == event.MembershipJoin { + joinedMembers = append(joinedMembers, id.UserID(stateKey)) + } + } + return joinedMembers, nil +}