Move history storage to matrix package. Fixes #90

This commit is contained in:
Tulir Asokan
2019-04-05 23:44:17 +03:00
parent 535fbbb4f7
commit 7ad2103f8f
14 changed files with 343 additions and 105 deletions

View File

@ -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.

View File

@ -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)

View File

@ -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 {

View File

@ -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

View File

@ -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()
}