mirror of https://github.com/matrix-org/go-neb.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.6 KiB
93 lines
2.6 KiB
package clients
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"maunium.net/go/mautrix"
|
|
"maunium.net/go/mautrix/event"
|
|
"maunium.net/go/mautrix/id"
|
|
)
|
|
|
|
// NebStateStore implements the StateStore interface for OlmMachine.
|
|
// It is used to determine which rooms are encrypted and which rooms are shared with a user.
|
|
// The state is updated by /sync responses.
|
|
type NebStateStore struct {
|
|
Storer *mautrix.InMemoryStore
|
|
}
|
|
|
|
// GetEncryptionEvent returns the encryption event for a room.
|
|
func (ss *NebStateStore) GetEncryptionEvent(roomID id.RoomID) *event.EncryptionEventContent {
|
|
room := ss.Storer.LoadRoom(roomID)
|
|
if room == nil {
|
|
return nil
|
|
}
|
|
if evts, ok := room.State[event.StateEncryption]; ok {
|
|
if evt, ok := evts[""]; ok {
|
|
return evt.Content.AsEncryption()
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// IsEncrypted returns whether a room has been encrypted.
|
|
func (ss *NebStateStore) IsEncrypted(roomID id.RoomID) bool {
|
|
room := ss.Storer.LoadRoom(roomID)
|
|
if room == nil {
|
|
return false
|
|
}
|
|
_, ok := room.State[event.StateEncryption]
|
|
return ok
|
|
}
|
|
|
|
// FindSharedRooms returns a list of room IDs that the given user ID is also a member of.
|
|
func (ss *NebStateStore) FindSharedRooms(userID id.UserID) []id.RoomID {
|
|
sharedRooms := make([]id.RoomID, 0)
|
|
for roomID, room := range ss.Storer.Rooms {
|
|
if room.GetMembershipState(userID) != event.MembershipLeave {
|
|
sharedRooms = append(sharedRooms, roomID)
|
|
}
|
|
}
|
|
return sharedRooms
|
|
}
|
|
|
|
// UpdateStateStore updates the internal state of NebStateStore from a /sync response.
|
|
func (ss *NebStateStore) UpdateStateStore(resp *mautrix.RespSync) {
|
|
for roomID, evts := range resp.Rooms.Join {
|
|
room := ss.Storer.LoadRoom(roomID)
|
|
if room == nil {
|
|
room = mautrix.NewRoom(roomID)
|
|
ss.Storer.SaveRoom(room)
|
|
}
|
|
for _, i := range evts.State.Events {
|
|
room.UpdateState(i)
|
|
}
|
|
for _, i := range evts.Timeline.Events {
|
|
if i.Type.IsState() {
|
|
room.UpdateState(i)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// 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
|
|
}
|