package matrixbotlib import ( "strings" "maunium.net/go/mautrix" "maunium.net/go/mautrix/event" "maunium.net/go/mautrix/id" ) //NewMatrixClient returns a new logged in Mautrix Client struct func NewMatrixClient(config *MatrixClientConfig, store mautrix.Storer) (*mautrix.Client, error) { var client *mautrix.Client var err error //make sure username is lower case otherwise token login breaks uname := strings.ToLower(config.Username) if config.Token == "" { client, err = mautrix.NewClient(config.Homeserver, "", "") if err != nil { return client, err } } else { client, err = mautrix.NewClient(config.Homeserver, id.NewUserID(uname, config.Domain), config.Token) if err != nil { return client, err } } client.Store = store if config.Token == "" { loginRes, err := client.Login(&mautrix.ReqLogin{ Type: "m.login.password", Identifier: mautrix.UserIdentifier{Type: mautrix.IdentifierTypeUser, User: uname}, Password: config.Password, StoreCredentials: true, }) if err != nil { return client, err } config.Token = loginRes.AccessToken WriteMatrixClientConfig(config) } return client, err } // SetupAccountDataStore sets the client to use a AccountData store and filter appropriately func SetupAccountDataStore(client *mautrix.Client, token string) error { dataFilter := &mautrix.Filter{ AccountData: mautrix.FilterPart{ Limit: 20, NotTypes: []event.Type{ event.NewEventType(token), }, }, } store := mautrix.NewAccountDataStore(token, client) fID, err := client.CreateFilter(dataFilter) if err != nil { //don't want to continue if we can't keep state return err } uid := client.UserID store.SaveFilterID(uid, fID.FilterID) client.Store = store return nil }