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 +}