From 72945c9a284b6858594f1e8a43743c397e90c380 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 18 Mar 2018 21:24:03 +0200 Subject: Organize files --- matrix.go | 263 -------------------------------------------------------------- 1 file changed, 263 deletions(-) delete mode 100644 matrix.go (limited to 'matrix.go') diff --git a/matrix.go b/matrix.go deleted file mode 100644 index ea1c5c6..0000000 --- a/matrix.go +++ /dev/null @@ -1,263 +0,0 @@ -// gomuks - A terminal Matrix client written in Go. -// Copyright (C) 2018 Tulir Asokan -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package main - -import ( - "fmt" - "strings" - "time" - - "maunium.net/go/gomatrix" -) - -type MatrixContainer struct { - client *gomatrix.Client - gmx Gomuks - ui *GomuksUI - debug DebugPrinter - config *Config - running bool - stop chan bool - - typing int64 -} - -func NewMatrixContainer(gmx Gomuks) *MatrixContainer { - c := &MatrixContainer{ - config: gmx.Config(), - debug: gmx.Debug(), - ui: gmx.UI(), - gmx: gmx, - } - - return c -} - -func (c *MatrixContainer) InitClient() error { - if len(c.config.HS) == 0 { - return fmt.Errorf("no homeserver in config") - } - - if c.client != nil { - c.Stop() - c.client = nil - } - - var mxid, accessToken string - if c.config.Session != nil { - accessToken = c.config.Session.AccessToken - mxid = c.config.MXID - } - - var err error - c.client, err = gomatrix.NewClient(c.config.HS, mxid, accessToken) - if err != nil { - return err - } - - c.stop = make(chan bool, 1) - - if c.config.Session != nil { - go c.Start() - } - return nil -} - -func (c *MatrixContainer) Initialized() bool { - return c.client != nil -} - -func (c *MatrixContainer) Login(user, password string) error { - resp, err := c.client.Login(&gomatrix.ReqLogin{ - Type: "m.login.password", - User: user, - Password: password, - }) - if err != nil { - return err - } - c.client.SetCredentials(resp.UserID, resp.AccessToken) - c.config.MXID = resp.UserID - c.config.Save() - - c.config.Session = c.config.NewSession(resp.UserID) - c.config.Session.AccessToken = resp.AccessToken - c.config.Session.Save() - - go c.Start() - - return nil -} - -func (c *MatrixContainer) Stop() { - if c.running { - c.stop <- true - c.client.StopSync() - } -} - -func (c *MatrixContainer) UpdateRoomList() { - rooms, err := c.client.JoinedRooms() - if err != nil { - c.debug.Print("Error fetching room list:", err) - return - } - - c.ui.MainView().SetRoomList(rooms.JoinedRooms) -} - -func (c *MatrixContainer) OnLogin() { - c.client.Store = c.config.Session - - syncer := NewGomuksSyncer(c.config.Session) - syncer.OnEventType("m.room.message", c.HandleMessage) - syncer.OnEventType("m.room.member", c.HandleMembership) - syncer.OnEventType("m.typing", c.HandleTyping) - c.client.Syncer = syncer - - c.UpdateRoomList() -} - -func (c *MatrixContainer) Start() { - defer c.gmx.Recover() - - c.OnLogin() - - c.debug.Print("Starting sync...") - c.running = true - c.ui.SetView(ViewMain) - for { - select { - case <-c.stop: - c.debug.Print("Stopping sync...") - c.running = false - return - default: - if err := c.client.Sync(); err != nil { - c.debug.Print("Sync() errored", err) - } else { - c.debug.Print("Sync() returned without error") - } - } - } -} - -func (c *MatrixContainer) HandleMessage(evt *gomatrix.Event) { - room, message := c.ui.MainView().ProcessMessageEvent(evt) - if room != nil { - room.AddMessage(message, AppendMessage) - } -} - -func (c *MatrixContainer) HandleMembership(evt *gomatrix.Event) { - const Hour = 1 * 60 * 60 * 1000 - if evt.Unsigned.Age > Hour { - return - } - - room, message := c.ui.MainView().ProcessMembershipEvent(evt, true) - if room != nil { - // TODO this shouldn't be necessary - room.room.UpdateState(evt) - // TODO This should probably also be in a different place - room.UpdateUserList() - - room.AddMessage(message, AppendMessage) - } -} - -func (c *MatrixContainer) HandleTyping(evt *gomatrix.Event) { - users := evt.Content["user_ids"].([]interface{}) - - strUsers := make([]string, len(users)) - for i, user := range users { - strUsers[i] = user.(string) - } - c.ui.MainView().SetTyping(evt.RoomID, strUsers) -} - -func (c *MatrixContainer) SendMessage(roomID, message string) { - c.gmx.Recover() - c.SendTyping(roomID, false) - c.client.SendText(roomID, message) -} - -func (c *MatrixContainer) SendTyping(roomID string, typing bool) { - c.gmx.Recover() - time := time.Now().Unix() - if c.typing > time && typing { - return - } - - if typing { - c.client.UserTyping(roomID, true, 5000) - c.typing = time + 5 - } else { - c.client.UserTyping(roomID, false, 0) - c.typing = 0 - } -} - -func (c *MatrixContainer) JoinRoom(roomID string) error { - if len(roomID) == 0 { - return fmt.Errorf("invalid room ID") - } - - server := "" - if roomID[0] == '!' { - server = roomID[strings.Index(roomID, ":")+1:] - } - - resp, err := c.client.JoinRoom(roomID, server, nil) - if err != nil { - return err - } - - c.ui.MainView().AddRoom(resp.RoomID) - return nil -} - -func (c *MatrixContainer) getState(roomID string) []*gomatrix.Event { - content := make([]*gomatrix.Event, 0) - err := c.client.StateEvent(roomID, "", "", &content) - if err != nil { - c.debug.Print("Error getting state of", roomID, err) - return nil - } - return content -} - -func (c *MatrixContainer) GetHistory(roomID, prevBatch string, limit int) ([]gomatrix.Event, string, error) { - resp, err := c.client.Messages(roomID, prevBatch, "", 'b', limit) - if err != nil { - return nil, "", err - } - return resp.Chunk, resp.End, nil -} - -func (c *MatrixContainer) GetRoom(roomID string) *Room { - room := c.config.Session.GetRoom(roomID) - if room != nil && len(room.State) == 0 { - events := c.getState(room.ID) - if events != nil { - for _, event := range events { - room.UpdateState(event) - } - } - } - return room -} -- cgit v1.2.3