diff options
Diffstat (limited to 'account.go')
-rw-r--r-- | account.go | 75 |
1 files changed, 44 insertions, 31 deletions
@@ -39,41 +39,40 @@ func SetAccount(mxid string, name string, protocol string, config map[string]str } accounts := registeredAccounts[mxid] + // Check we can create connector + proto, ok := Protocols[protocol] + if !ok { + return fmt.Errorf("Invalid protocol: %s", protocol) + } + conn := proto.NewConnector() + if conn == nil { + return fmt.Errorf("Could not create connector for protocol %s", protocol) + } + + // If the account existed already, close and drop connector if prev_acct, ok := accounts[name]; ok { - if protocol != prev_acct.Protocol { - return fmt.Errorf("Wrong protocol") - } - if !reflect.DeepEqual(config, prev_acct.Config) { - go func() { - prev_acct.Conn.Close() - prev_acct.JoinedRooms = map[RoomID]bool{} - - prev_acct.Config = config - prev_acct.connect() - }() - } - } else { - proto, ok := Protocols[protocol] - if !ok { - return fmt.Errorf("Invalid protocol: %s", protocol) - } - conn := proto.NewConnector() - if conn == nil { - return fmt.Errorf("Could not create connector for protocol %s", protocol) - } - account := &Account{ - MatrixUser: mxid, - AccountName: name, - Protocol: protocol, - Config: config, - Conn: conn, - JoinedRooms: map[RoomID]bool{}, + if prev_acct.Protocol == protocol && reflect.DeepEqual(config, prev_acct.Config) { + return nil } - conn.SetHandler(account) - accounts[name] = account - go account.connect() + go prev_acct.Conn.Close() + delete(accounts, name) } + + // Configure and connect + account := &Account{ + MatrixUser: mxid, + AccountName: name, + Protocol: protocol, + Config: config, + Conn: conn, + JoinedRooms: map[RoomID]bool{}, + } + conn.SetHandler(account) + + accounts[name] = account + go account.connect() + return nil } @@ -232,6 +231,20 @@ func (a *Account) delAutojoin(roomId RoomID) { // ---- Begin event handlers ---- +func (a *Account) SaveConfig(config Configuration) { + a.Config = config + if key, ok := userKeys[a.MatrixUser]; ok { + var entry DbAccountConfig + db.Where(&DbAccountConfig{ + MxUserID: a.MatrixUser, + Name: a.AccountName, + }).Assign(&DbAccountConfig{ + Protocol: a.Protocol, + Config: encryptAccountConfig(a.Config, key), + }).FirstOrCreate(&entry) + } +} + func (a *Account) Joined(roomId RoomID) { err := a.joinedInternal(roomId) if err != nil { |