Add command to log out

This commit is contained in:
Tulir Asokan 2018-05-10 15:47:24 +03:00
parent e42ce27e0a
commit 151141f288
5 changed files with 33 additions and 7 deletions

View File

@ -55,6 +55,17 @@ func (config *Config) Clear() {
os.RemoveAll(config.MediaDir) os.RemoveAll(config.MediaDir)
} }
func (config *Config) DeleteSession() {
if config.Session != nil {
os.Remove(config.Session.path)
config.Session = nil
}
os.RemoveAll(config.HistoryDir)
os.RemoveAll(config.MediaDir)
os.MkdirAll(config.HistoryDir, 0700)
os.MkdirAll(config.MediaDir, 0700)
}
// Load loads the config from config.yaml in the directory given to the config struct. // Load loads the config from config.yaml in the directory given to the config struct.
func (config *Config) Load() { func (config *Config) Load() {
os.MkdirAll(config.Dir, 0700) os.MkdirAll(config.Dir, 0700)

View File

@ -30,6 +30,7 @@ type MatrixContainer interface {
Stop() Stop()
Login(user, password string) error Login(user, password string) error
Logout()
SendMessage(roomID, msgtype, message string) (string, error) SendMessage(roomID, msgtype, message string) (string, error)
SendMarkdownMessage(roomID, msgtype, message string) (string, error) SendMarkdownMessage(roomID, msgtype, message string) (string, error)

View File

@ -131,6 +131,15 @@ func (c *Container) Login(user, password string) error {
return nil return nil
} }
// Logout revokes the access token, stops the syncer and calls the OnLogout() method of the UI.
func (c *Container) Logout() {
c.client.Logout()
c.config.DeleteSession()
c.Stop()
c.client = nil
c.ui.OnLogout()
}
// Stop stops the Matrix syncer. // Stop stops the Matrix syncer.
func (c *Container) Stop() { func (c *Container) Stop() {
if c.running { if c.running {
@ -158,12 +167,6 @@ func (c *Container) PushRules() *pushrules.PushRuleset {
return c.config.Session.PushRules return c.config.Session.PushRules
} }
// OnLogout stops the syncer and moves the UI back to the login view.
func (c *Container) OnLogout() {
c.ui.OnLogout()
c.Stop()
}
// OnLogin initializes the syncer and updates the room list. // OnLogin initializes the syncer and updates the room list.
func (c *Container) OnLogin() { func (c *Container) OnLogin() {
c.ui.OnLogin() c.ui.OnLogin()
@ -209,7 +212,12 @@ func (c *Container) Start() {
return return
default: default:
if err := c.client.Sync(); err != nil { if err := c.client.Sync(); err != nil {
debug.Print("Sync() errored", err) if httpErr, ok := err.(gomatrix.HTTPError); ok && httpErr.Code == http.StatusUnauthorized {
debug.Print("Sync() errored with ", err, " -> logging out")
c.Logout()
} else {
debug.Print("Sync() errored", err)
}
} else { } else {
debug.Print("Sync() returned without error") debug.Print("Sync() returned without error")
} }

View File

@ -78,10 +78,12 @@ func (ui *GomuksUI) Render() {
func (ui *GomuksUI) OnLogin() { func (ui *GomuksUI) OnLogin() {
ui.SetView(ViewMain) ui.SetView(ViewMain)
ui.app.SetFocus(ui.mainView)
} }
func (ui *GomuksUI) OnLogout() { func (ui *GomuksUI) OnLogout() {
ui.SetView(ViewLogin) ui.SetView(ViewLogin)
ui.app.SetFocus(ui.loginView)
} }
func (ui *GomuksUI) SetView(name View) { func (ui *GomuksUI) SetView(name View) {

View File

@ -119,6 +119,7 @@ func (view *MainView) SendMessage(roomView *RoomView, text string) {
func (view *MainView) sendTempMessage(roomView *RoomView, tempMessage ifc.Message, text string) { func (view *MainView) sendTempMessage(roomView *RoomView, tempMessage ifc.Message, text string) {
defer debug.Recover() defer debug.Recover()
debug.Print("Sending message", tempMessage.Type(), text)
eventID, err := view.matrix.SendMarkdownMessage(roomView.Room.ID, tempMessage.Type(), text) eventID, err := view.matrix.SendMarkdownMessage(roomView.Room.ID, tempMessage.Type(), text)
if err != nil { if err != nil {
tempMessage.SetState(ifc.MessageStateFailed) tempMessage.SetState(ifc.MessageStateFailed)
@ -131,6 +132,7 @@ func (view *MainView) sendTempMessage(roomView *RoomView, tempMessage ifc.Messag
roomView.AddServiceMessage(fmt.Sprintf("Failed to send message: %v", err)) roomView.AddServiceMessage(fmt.Sprintf("Failed to send message: %v", err))
view.parent.Render() view.parent.Render()
} else { } else {
debug.Print("Event ID received:", eventID)
roomView.MessageView().UpdateMessageID(tempMessage, eventID) roomView.MessageView().UpdateMessageID(tempMessage, eventID)
} }
} }
@ -167,6 +169,8 @@ func (view *MainView) HandleCommand(roomView *RoomView, command string, args []s
if err == nil { if err == nil {
view.AddRoom(room) view.AddRoom(room)
} }
case "/logout":
view.matrix.Logout()
default: default:
roomView.AddServiceMessage("Unknown command.") roomView.AddServiceMessage("Unknown command.")
} }