Move history storage to matrix package. Fixes #90
This commit is contained in:
		@@ -113,10 +113,10 @@ func cmdHelp(cmd *Command) {
 | 
			
		||||
/join <room address> - Join a room.
 | 
			
		||||
/leave               - Leave the current room.
 | 
			
		||||
 | 
			
		||||
/invite <user id>        - Invite a user.
 | 
			
		||||
/kick <user id> [reason] - Kick a user.
 | 
			
		||||
/ban <user id> [reason]  - Ban a user.
 | 
			
		||||
/unban <user id>         - Unban a user.
 | 
			
		||||
/invite <user id>          - Invite a user.
 | 
			
		||||
/kick   <user id> [reason] - Kick a user.
 | 
			
		||||
/ban    <user id> [reason] - Ban a user.
 | 
			
		||||
/unban  <user id>          - Unban a user.
 | 
			
		||||
 | 
			
		||||
/send     <room id> <type>         <json> - Send a custom event to the given room.
 | 
			
		||||
/msend              <type>         <json> - Send a custom event to the current room.
 | 
			
		||||
 
 | 
			
		||||
@@ -17,10 +17,8 @@
 | 
			
		||||
package ui
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/gob"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"math"
 | 
			
		||||
	"os"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/mattn/go-runewidth"
 | 
			
		||||
@@ -84,55 +82,6 @@ func NewMessageView(parent *RoomView) *MessageView {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (view *MessageView) SaveHistory(path string) error {
 | 
			
		||||
	file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0600)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	defer file.Close()
 | 
			
		||||
 | 
			
		||||
	enc := gob.NewEncoder(file)
 | 
			
		||||
	err = enc.Encode(view.messages)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (view *MessageView) LoadHistory(matrix ifc.MatrixContainer, path string) (int, error) {
 | 
			
		||||
	file, err := os.OpenFile(path, os.O_RDONLY, 0600)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if os.IsNotExist(err) {
 | 
			
		||||
			return 0, nil
 | 
			
		||||
		}
 | 
			
		||||
		return -1, err
 | 
			
		||||
	}
 | 
			
		||||
	defer file.Close()
 | 
			
		||||
 | 
			
		||||
	var msgs []messages.UIMessage
 | 
			
		||||
 | 
			
		||||
	dec := gob.NewDecoder(file)
 | 
			
		||||
	err = dec.Decode(&msgs)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return -1, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	view.messages = make([]messages.UIMessage, len(msgs))
 | 
			
		||||
	indexOffset := 0
 | 
			
		||||
	for index, message := range msgs {
 | 
			
		||||
		if message != nil {
 | 
			
		||||
			view.messages[index-indexOffset] = message
 | 
			
		||||
			view.updateWidestSender(message.Sender())
 | 
			
		||||
			message.RegisterMatrix(matrix)
 | 
			
		||||
		} else {
 | 
			
		||||
			indexOffset++
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return len(view.messages), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (view *MessageView) updateWidestSender(sender string) {
 | 
			
		||||
	if len(sender) > view.widestSender {
 | 
			
		||||
		view.widestSender = len(sender)
 | 
			
		||||
 
 | 
			
		||||
@@ -106,7 +106,7 @@ func ParseMessage(matrix ifc.MatrixContainer, room *rooms.Room, evt *mautrix.Eve
 | 
			
		||||
		if len(roomID) == 0 {
 | 
			
		||||
			roomID = room.ID
 | 
			
		||||
		}
 | 
			
		||||
		replyToEvt, _ := matrix.Client().GetEvent(roomID, evt.Content.GetReplyTo())
 | 
			
		||||
		replyToEvt, _ := matrix.GetEvent(room, evt.Content.GetReplyTo())
 | 
			
		||||
		if replyToEvt != nil {
 | 
			
		||||
			replyToEvt.Content.RemoveReplyFallback()
 | 
			
		||||
			if len(replyToEvt.Content.FormattedBody) == 0 {
 | 
			
		||||
 
 | 
			
		||||
@@ -119,14 +119,6 @@ func (view *RoomView) logPath(dir string) string {
 | 
			
		||||
	return filepath.Join(dir, fmt.Sprintf("%s.gmxlog", view.Room.ID))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (view *RoomView) SaveHistory(dir string) error {
 | 
			
		||||
	return view.MessageView().SaveHistory(view.logPath(dir))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (view *RoomView) LoadHistory(matrix ifc.MatrixContainer, dir string) (int, error) {
 | 
			
		||||
	return view.MessageView().LoadHistory(matrix, view.logPath(dir))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (view *RoomView) SetInputSubmitFunc(fn func(room *RoomView, text string)) *RoomView {
 | 
			
		||||
	view.inputSubmitFunc = fn
 | 
			
		||||
	return view
 | 
			
		||||
 
 | 
			
		||||
@@ -122,9 +122,12 @@ func (view *MainView) BumpFocus(roomView *RoomView) {
 | 
			
		||||
func (view *MainView) MarkRead(roomView *RoomView) {
 | 
			
		||||
	if roomView != nil && roomView.Room.HasNewMessages() && roomView.MessageView().ScrollOffset == 0 {
 | 
			
		||||
		msgList := roomView.MessageView().messages
 | 
			
		||||
		msg := msgList[len(msgList)-1]
 | 
			
		||||
		roomView.Room.MarkRead(msg.ID())
 | 
			
		||||
		view.matrix.MarkRead(roomView.Room.ID, msg.ID())
 | 
			
		||||
		if len(msgList) > 0 {
 | 
			
		||||
			msg := msgList[len(msgList)-1]
 | 
			
		||||
			if roomView.Room.MarkRead(msg.ID()) {
 | 
			
		||||
				view.matrix.MarkRead(roomView.Room.ID, msg.ID())
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -301,14 +304,8 @@ func (view *MainView) SwitchRoom(tag string, room *rooms.Room) {
 | 
			
		||||
	view.MarkRead(roomView)
 | 
			
		||||
	view.roomList.SetSelected(tag, room)
 | 
			
		||||
	view.parent.Render()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (view *MainView) SaveAllHistory() {
 | 
			
		||||
	for _, room := range view.rooms {
 | 
			
		||||
		err := room.SaveHistory(view.config.HistoryDir)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			debug.Printf("Failed to save history of %s: %v", room.Room.GetTitle(), err)
 | 
			
		||||
		}
 | 
			
		||||
	if len(roomView.MessageView().messages) == 0 {
 | 
			
		||||
		go view.LoadHistory(room.ID)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -320,10 +317,11 @@ func (view *MainView) addRoomPage(room *rooms.Room) {
 | 
			
		||||
		view.rooms[room.ID] = roomView
 | 
			
		||||
		roomView.UpdateUserList()
 | 
			
		||||
 | 
			
		||||
		_, err := roomView.LoadHistory(view.matrix, view.config.HistoryDir)
 | 
			
		||||
		// FIXME
 | 
			
		||||
		/*_, err := roomView.LoadHistory(view.matrix, view.config.HistoryDir)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			debug.Printf("Failed to load history of %s: %v", roomView.Room.GetTitle(), err)
 | 
			
		||||
		}
 | 
			
		||||
		}*/
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -465,24 +463,23 @@ func (view *MainView) LoadHistory(room string) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	debug.Print("Fetching history for", room, "starting from", batch)
 | 
			
		||||
	history, prevBatch, err := view.matrix.GetHistory(roomView.Room.ID, batch, 50)
 | 
			
		||||
	history, err := view.matrix.GetHistory(roomView.Room, 50)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		roomView.AddServiceMessage("Failed to fetch history")
 | 
			
		||||
		debug.Print("Failed to fetch history for", roomView.Room.ID, err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	roomView.Room.PrevBatch = prevBatch
 | 
			
		||||
	for _, evt := range history {
 | 
			
		||||
		message := view.ParseEvent(roomView, evt)
 | 
			
		||||
		if message != nil {
 | 
			
		||||
			roomView.AddMessage(message, ifc.PrependMessage)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	err = roomView.SaveHistory(view.config.HistoryDir)
 | 
			
		||||
	// TODO?
 | 
			
		||||
	/*err = roomView.SaveHistory(view.config.HistoryDir)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		debug.Printf("Failed to save history of %s: %v", roomView.Room.GetTitle(), err)
 | 
			
		||||
	}
 | 
			
		||||
	}*/
 | 
			
		||||
	view.config.PutRoom(roomView.Room)
 | 
			
		||||
	view.parent.Render()
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user