Browse Source

Update mautrix-appservice

Tulir Asokan 6 years ago
parent
commit
e15c3286bd

+ 2 - 2
Gopkg.lock

@@ -123,7 +123,7 @@
     ".",
     ".",
     "format"
     "format"
   ]
   ]
-  revision = "3bc65810c93810440c0a053b9fe5009bb01521c5"
+  revision = "692bae934fcd3b7f4379e89d7271220f1d81f318"
 
 
 [[projects]]
 [[projects]]
   branch = "master"
   branch = "master"
@@ -141,7 +141,7 @@
   branch = "master"
   branch = "master"
   name = "maunium.net/go/mautrix-appservice"
   name = "maunium.net/go/mautrix-appservice"
   packages = ["."]
   packages = ["."]
-  revision = "7873866d1709943d6e2ac2d889c845eeca2e7686"
+  revision = "62ccd06944c74b6e526b493ef66fc736d23b1cf2"
 
 
 [solve-meta]
 [solve-meta]
   analyzer-name = "dep"
   analyzer-name = "dep"

+ 8 - 8
statestore.go

@@ -26,19 +26,19 @@ import (
 )
 )
 
 
 type AutosavingStateStore struct {
 type AutosavingStateStore struct {
-	*appservice.BasicStateStore
+	appservice.StateStore
 	Path string
 	Path string
 }
 }
 
 
 func NewAutosavingStateStore(path string) *AutosavingStateStore {
 func NewAutosavingStateStore(path string) *AutosavingStateStore {
 	return &AutosavingStateStore{
 	return &AutosavingStateStore{
-		BasicStateStore: appservice.NewBasicStateStore(),
-		Path:            path,
+		StateStore: appservice.NewBasicStateStore(),
+		Path:       path,
 	}
 	}
 }
 }
 
 
 func (store *AutosavingStateStore) Save() error {
 func (store *AutosavingStateStore) Save() error {
-	data, err := json.Marshal(store.BasicStateStore)
+	data, err := json.Marshal(store.StateStore)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
@@ -55,20 +55,20 @@ func (store *AutosavingStateStore) Load() error {
 		return err
 		return err
 	}
 	}
 
 
-	return json.Unmarshal(data, store.BasicStateStore)
+	return json.Unmarshal(data, store.StateStore)
 }
 }
 
 
 func (store *AutosavingStateStore) MarkRegistered(userID string) {
 func (store *AutosavingStateStore) MarkRegistered(userID string) {
-	store.BasicStateStore.MarkRegistered(userID)
+	store.StateStore.MarkRegistered(userID)
 	store.Save()
 	store.Save()
 }
 }
 
 
 func (store *AutosavingStateStore) SetMembership(roomID, userID, membership string) {
 func (store *AutosavingStateStore) SetMembership(roomID, userID, membership string) {
-	store.BasicStateStore.SetMembership(roomID, userID, membership)
+	store.StateStore.SetMembership(roomID, userID, membership)
 	store.Save()
 	store.Save()
 }
 }
 
 
 func (store *AutosavingStateStore) SetPowerLevels(roomID string, levels *gomatrix.PowerLevels) {
 func (store *AutosavingStateStore) SetPowerLevels(roomID string, levels *gomatrix.PowerLevels) {
-	store.BasicStateStore.SetPowerLevels(roomID, levels)
+	store.StateStore.SetPowerLevels(roomID, levels)
 	store.Save()
 	store.Save()
 }
 }

+ 4 - 4
vendor/maunium.net/go/gomatrix/events.go

@@ -231,8 +231,8 @@ func (pl *PowerLevels) StateDefault() int {
 
 
 func (pl *PowerLevels) GetUserLevel(userID string) int {
 func (pl *PowerLevels) GetUserLevel(userID string) int {
 	pl.usersLock.RLock()
 	pl.usersLock.RLock()
+	defer pl.usersLock.RUnlock()
 	level, ok := pl.Users[userID]
 	level, ok := pl.Users[userID]
-	pl.usersLock.RUnlock()
 	if !ok {
 	if !ok {
 		return pl.UsersDefault
 		return pl.UsersDefault
 	}
 	}
@@ -241,12 +241,12 @@ func (pl *PowerLevels) GetUserLevel(userID string) int {
 
 
 func (pl *PowerLevels) SetUserLevel(userID string, level int) {
 func (pl *PowerLevels) SetUserLevel(userID string, level int) {
 	pl.usersLock.Lock()
 	pl.usersLock.Lock()
+	defer pl.usersLock.Unlock()
 	if level == pl.UsersDefault {
 	if level == pl.UsersDefault {
 		delete(pl.Users, userID)
 		delete(pl.Users, userID)
 	} else {
 	} else {
 		pl.Users[userID] = level
 		pl.Users[userID] = level
 	}
 	}
-	pl.usersLock.Unlock()
 }
 }
 
 
 func (pl *PowerLevels) EnsureUserLevel(userID string, level int) bool {
 func (pl *PowerLevels) EnsureUserLevel(userID string, level int) bool {
@@ -260,8 +260,8 @@ func (pl *PowerLevels) EnsureUserLevel(userID string, level int) bool {
 
 
 func (pl *PowerLevels) GetEventLevel(eventType EventType, isState bool) int {
 func (pl *PowerLevels) GetEventLevel(eventType EventType, isState bool) int {
 	pl.eventsLock.RLock()
 	pl.eventsLock.RLock()
+	defer pl.eventsLock.RUnlock()
 	level, ok := pl.Events[eventType]
 	level, ok := pl.Events[eventType]
-	pl.eventsLock.RUnlock()
 	if !ok {
 	if !ok {
 		if isState {
 		if isState {
 			return pl.StateDefault()
 			return pl.StateDefault()
@@ -273,12 +273,12 @@ func (pl *PowerLevels) GetEventLevel(eventType EventType, isState bool) int {
 
 
 func (pl *PowerLevels) SetEventLevel(eventType EventType, isState bool, level int) {
 func (pl *PowerLevels) SetEventLevel(eventType EventType, isState bool, level int) {
 	pl.eventsLock.Lock()
 	pl.eventsLock.Lock()
+	defer pl.eventsLock.Unlock()
 	if (isState && level == pl.StateDefault()) || (!isState && level == pl.EventsDefault) {
 	if (isState && level == pl.StateDefault()) || (!isState && level == pl.EventsDefault) {
 		delete(pl.Events, eventType)
 		delete(pl.Events, eventType)
 	} else {
 	} else {
 		pl.Events[eventType] = level
 		pl.Events[eventType] = level
 	}
 	}
-	pl.eventsLock.Unlock()
 }
 }
 
 
 func (pl *PowerLevels) EnsureEventLevel(eventType EventType, isState bool, level int) bool {
 func (pl *PowerLevels) EnsureEventLevel(eventType EventType, isState bool, level int) bool {

+ 1 - 1
vendor/maunium.net/go/mautrix-appservice/appservice.go

@@ -24,7 +24,7 @@ func Create() *AppService {
 		LogConfig:  CreateLogConfig(),
 		LogConfig:  CreateLogConfig(),
 		clients:    make(map[string]*gomatrix.Client),
 		clients:    make(map[string]*gomatrix.Client),
 		intents:    make(map[string]*IntentAPI),
 		intents:    make(map[string]*IntentAPI),
-		StateStore: &BasicStateStore{},
+		StateStore: NewBasicStateStore(),
 	}
 	}
 }
 }
 
 

+ 15 - 0
vendor/maunium.net/go/mautrix-appservice/intent.go

@@ -150,6 +150,21 @@ func (intent *IntentAPI) SetPowerLevel(roomID, userID string, level int) (*gomat
 	return nil, nil
 	return nil, nil
 }
 }
 
 
+func (intent *IntentAPI) UserTyping(roomID string, typing bool, timeout int64) (resp *gomatrix.RespTyping, err error) {
+	if intent.as.StateStore.IsTyping(roomID, intent.UserID) == typing {
+		return
+	}
+	resp, err = intent.Client.UserTyping(roomID, typing, timeout)
+	if err != nil {
+		return
+	}
+	if !typing {
+		timeout = -1
+	}
+	intent.as.StateStore.SetTyping(roomID, intent.UserID, timeout)
+	return
+}
+
 func (intent *IntentAPI) SendText(roomID, text string) (*gomatrix.RespSendEvent, error) {
 func (intent *IntentAPI) SendText(roomID, text string) (*gomatrix.RespSendEvent, error) {
 	if err := intent.EnsureJoined(roomID); err != nil {
 	if err := intent.EnsureJoined(roomID); err != nil {
 		return nil, err
 		return nil, err

+ 51 - 9
vendor/maunium.net/go/mautrix-appservice/statestore.go

@@ -4,12 +4,16 @@ import (
 	"maunium.net/go/gomatrix"
 	"maunium.net/go/gomatrix"
 	"strings"
 	"strings"
 	"sync"
 	"sync"
+	"time"
 )
 )
 
 
 type StateStore interface {
 type StateStore interface {
 	IsRegistered(userID string) bool
 	IsRegistered(userID string) bool
 	MarkRegistered(userID string)
 	MarkRegistered(userID string)
 
 
+	IsTyping(roomID, userID string) bool
+	SetTyping(roomID, userID string, timeout int64)
+
 	IsInRoom(roomID, userID string) bool
 	IsInRoom(roomID, userID string) bool
 	SetMembership(roomID, userID, membership string)
 	SetMembership(roomID, userID, membership string)
 
 
@@ -28,33 +32,70 @@ func (as *AppService) UpdateState(evt *gomatrix.Event) {
 }
 }
 
 
 type BasicStateStore struct {
 type BasicStateStore struct {
-	registrationsLock sync.RWMutex                    `json:"-"`
-	Registrations     map[string]bool                 `json:"registrations"`
-	membershipsLock   sync.RWMutex                    `json:"-"`
-	Memberships       map[string]map[string]string    `json:"memberships"`
-	powerLevelsLock   sync.RWMutex                    `json:"-"`
+	registrationsLock sync.RWMutex                     `json:"-"`
+	Registrations     map[string]bool                  `json:"registrations"`
+	membershipsLock   sync.RWMutex                     `json:"-"`
+	Memberships       map[string]map[string]string     `json:"memberships"`
+	powerLevelsLock   sync.RWMutex                     `json:"-"`
 	PowerLevels       map[string]*gomatrix.PowerLevels `json:"power_levels"`
 	PowerLevels       map[string]*gomatrix.PowerLevels `json:"power_levels"`
+
+	Typing     map[string]map[string]int64 `json:"-"`
+	typingLock sync.RWMutex                `json:"-"`
 }
 }
 
 
-func NewBasicStateStore() *BasicStateStore {
+func NewBasicStateStore() StateStore {
 	return &BasicStateStore{
 	return &BasicStateStore{
 		Registrations: make(map[string]bool),
 		Registrations: make(map[string]bool),
 		Memberships:   make(map[string]map[string]string),
 		Memberships:   make(map[string]map[string]string),
 		PowerLevels:   make(map[string]*gomatrix.PowerLevels),
 		PowerLevels:   make(map[string]*gomatrix.PowerLevels),
+		Typing:        make(map[string]map[string]int64),
 	}
 	}
 }
 }
 
 
 func (store *BasicStateStore) IsRegistered(userID string) bool {
 func (store *BasicStateStore) IsRegistered(userID string) bool {
 	store.registrationsLock.RLock()
 	store.registrationsLock.RLock()
+	defer store.registrationsLock.RUnlock()
 	registered, ok := store.Registrations[userID]
 	registered, ok := store.Registrations[userID]
-	store.registrationsLock.RUnlock()
 	return ok && registered
 	return ok && registered
 }
 }
 
 
 func (store *BasicStateStore) MarkRegistered(userID string) {
 func (store *BasicStateStore) MarkRegistered(userID string) {
 	store.registrationsLock.Lock()
 	store.registrationsLock.Lock()
+	defer store.registrationsLock.Unlock()
 	store.Registrations[userID] = true
 	store.Registrations[userID] = true
-	store.registrationsLock.Unlock()
+}
+
+func (store *BasicStateStore) IsTyping(roomID, userID string) bool {
+	store.typingLock.RLock()
+	defer store.typingLock.RUnlock()
+	roomTyping, ok := store.Typing[roomID]
+	if !ok {
+		return false
+	}
+	typingEndsAt, _ := roomTyping[userID]
+	return typingEndsAt >= time.Now().Unix()
+}
+
+func (store *BasicStateStore) SetTyping(roomID, userID string, timeout int64) {
+	store.typingLock.Lock()
+	defer store.typingLock.Unlock()
+	roomTyping, ok := store.Typing[roomID]
+	if !ok {
+		if timeout >= 0 {
+			roomTyping = map[string]int64{
+				userID: time.Now().Unix() + timeout,
+			}
+		} else {
+			roomTyping = make(map[string]int64)
+		}
+	} else {
+		if timeout >= 0 {
+			roomTyping[userID] = time.Now().Unix() + timeout
+		} else {
+			delete(roomTyping, userID)
+		}
+	}
+	store.Typing[roomID] = roomTyping
 }
 }
 
 
 func (store *BasicStateStore) GetRoomMemberships(roomID string) map[string]string {
 func (store *BasicStateStore) GetRoomMemberships(roomID string) map[string]string {
@@ -88,12 +129,13 @@ func (store *BasicStateStore) SetMembership(roomID, userID, membership string) {
 	store.membershipsLock.Lock()
 	store.membershipsLock.Lock()
 	memberships, ok := store.Memberships[roomID]
 	memberships, ok := store.Memberships[roomID]
 	if !ok {
 	if !ok {
-		store.Memberships[roomID] = map[string]string{
+		memberships = map[string]string{
 			userID: strings.ToLower(membership),
 			userID: strings.ToLower(membership),
 		}
 		}
 	} else {
 	} else {
 		memberships[userID] = strings.ToLower(membership)
 		memberships[userID] = strings.ToLower(membership)
 	}
 	}
+	store.Memberships[roomID] = memberships
 	store.membershipsLock.Unlock()
 	store.membershipsLock.Unlock()
 }
 }