Merge pull request #33 from tulir/initial-sync
Use initial sync data instead of fetching room list, state, history, etc manually
This commit is contained in:
@ -183,7 +183,8 @@ func (view *MessageView) AddMessage(ifcMessage ifc.Message, direction ifc.Messag
|
||||
} else if oldMsg != nil {
|
||||
view.replaceBuffer(oldMsg, message)
|
||||
} else {
|
||||
view.replaceBuffer(message, message)
|
||||
debug.Print("Unexpected AddMessage() call: Direction is not append or prepend, but message is new.")
|
||||
debug.PrintStack()
|
||||
}
|
||||
|
||||
view.messageIDs[message.ID()] = message
|
||||
@ -232,7 +233,8 @@ func (view *MessageView) replaceBuffer(original messages.UIMessage, new messages
|
||||
}
|
||||
|
||||
if start == -1 {
|
||||
debug.Print("Called replaceBuffer() with message that was not in the buffer:", original)
|
||||
debug.Print("Called replaceBuffer() with message that was not in the buffer:", original.ID())
|
||||
debug.PrintStack()
|
||||
view.appendBuffer(new)
|
||||
return
|
||||
}
|
||||
|
@ -72,8 +72,18 @@ func (msg *BaseTextMessage) calculateBufferWithText(text tstring.TString, width
|
||||
}
|
||||
|
||||
matches := boundaryPattern.FindAllStringIndex(extract.String(), -1)
|
||||
if len(matches) > 0 {
|
||||
extract = extract[:matches[len(matches)-1][1]]
|
||||
if len(matches) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
match := matches[len(matches)-1]
|
||||
if len(match) < 2 {
|
||||
continue
|
||||
}
|
||||
|
||||
until := match[1]
|
||||
if until < len(extract) {
|
||||
extract = extract[:until]
|
||||
}
|
||||
}
|
||||
msg.buffer = append(msg.buffer, extract)
|
||||
|
@ -23,6 +23,7 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"maunium.net/go/gomuks/debug"
|
||||
"maunium.net/go/gomuks/matrix/rooms"
|
||||
"maunium.net/go/gomuks/ui/widget"
|
||||
"maunium.net/go/tcell"
|
||||
@ -57,6 +58,7 @@ func NewRoomList() *RoomList {
|
||||
return &RoomList{
|
||||
Box: tview.NewBox(),
|
||||
items: make(map[string][]*rooms.Room),
|
||||
tags: []string{"m.favourite", "im.vector.fake.direct", "", "m.lowpriority"},
|
||||
|
||||
mainTextColor: tcell.ColorWhite,
|
||||
selectedTextColor: tcell.ColorWhite,
|
||||
@ -86,16 +88,17 @@ func (list *RoomList) CheckTag(tag string) {
|
||||
|
||||
items, ok := list.items[tag]
|
||||
|
||||
if len(items) == 0 {
|
||||
if ok && len(items) == 0 {
|
||||
delete(list.items, tag)
|
||||
ok = false
|
||||
}
|
||||
|
||||
if ok && index == -1 {
|
||||
list.tags = append(list.tags, tag)
|
||||
} else if index != -1 {
|
||||
} /* TODO this doesn't work properly
|
||||
else if index != -1 {
|
||||
list.tags = append(list.tags[0:index], list.tags[index+1:]...)
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
func (list *RoomList) AddToTag(tag string, room *rooms.Room) {
|
||||
@ -210,7 +213,8 @@ func (list *RoomList) Clear() {
|
||||
|
||||
func (list *RoomList) SetSelected(tag string, room *rooms.Room) {
|
||||
list.selected = room
|
||||
list.selectedTag = ""
|
||||
list.selectedTag = tag
|
||||
debug.Print("Selecting", room.GetTitle(), "in", tag)
|
||||
}
|
||||
|
||||
func (list *RoomList) HasSelected() bool {
|
||||
@ -229,7 +233,7 @@ func (list *RoomList) First() (string, *rooms.Room) {
|
||||
for _, tag := range list.tags {
|
||||
items := list.items[tag]
|
||||
if len(items) > 0 {
|
||||
return tag, items[0]
|
||||
return tag, items[len(items)-1]
|
||||
}
|
||||
}
|
||||
return "", nil
|
||||
@ -240,7 +244,7 @@ func (list *RoomList) Last() (string, *rooms.Room) {
|
||||
tag := list.tags[tagIndex]
|
||||
items := list.items[tag]
|
||||
if len(items) > 0 {
|
||||
return tag, items[len(items)-1]
|
||||
return tag, items[0]
|
||||
}
|
||||
}
|
||||
return "", nil
|
||||
@ -264,17 +268,19 @@ func (list *RoomList) Previous() (string, *rooms.Room) {
|
||||
|
||||
items := list.items[list.selectedTag]
|
||||
index := list.indexInTag(list.selectedTag, list.selected)
|
||||
if index == len(items)-1 {
|
||||
if index == -1 {
|
||||
return list.First()
|
||||
} else if index == len(items)-1 {
|
||||
tagIndex := list.IndexTag(list.selectedTag)
|
||||
tagIndex++
|
||||
for ; tagIndex < len(list.tags); tagIndex++ {
|
||||
nextTag := list.tags[tagIndex]
|
||||
nextTagItems := list.items[nextTag]
|
||||
if len(nextTagItems) > 0 {
|
||||
return nextTag, nextTagItems[0]
|
||||
tagIndex--
|
||||
for ; tagIndex >= 0; tagIndex-- {
|
||||
prevTag := list.tags[tagIndex]
|
||||
prevTagItems := list.items[prevTag]
|
||||
if len(prevTagItems) > 0 {
|
||||
return prevTag, prevTagItems[0]
|
||||
}
|
||||
}
|
||||
return list.First()
|
||||
return list.Last()
|
||||
}
|
||||
return list.selectedTag, items[index+1]
|
||||
}
|
||||
@ -288,17 +294,19 @@ func (list *RoomList) Next() (string, *rooms.Room) {
|
||||
|
||||
items := list.items[list.selectedTag]
|
||||
index := list.indexInTag(list.selectedTag, list.selected)
|
||||
if index == 0 {
|
||||
if index == -1 {
|
||||
return list.Last()
|
||||
} else if index == 0 {
|
||||
tagIndex := list.IndexTag(list.selectedTag)
|
||||
tagIndex--
|
||||
for ; tagIndex >= 0; tagIndex-- {
|
||||
prevTag := list.tags[tagIndex]
|
||||
prevTagItems := list.items[prevTag]
|
||||
if len(prevTagItems) > 0 {
|
||||
return prevTag, prevTagItems[len(prevTagItems)-1]
|
||||
tagIndex++
|
||||
for ; tagIndex < len(list.tags); tagIndex++ {
|
||||
nextTag := list.tags[tagIndex]
|
||||
nextTagItems := list.items[nextTag]
|
||||
if len(nextTagItems) > 0 {
|
||||
return nextTag, nextTagItems[len(nextTagItems)-1]
|
||||
}
|
||||
}
|
||||
return list.Last()
|
||||
return list.First()
|
||||
}
|
||||
return list.selectedTag, items[index-1]
|
||||
}
|
||||
@ -332,6 +340,8 @@ func (list *RoomList) Get(n int) (string, *rooms.Room) {
|
||||
|
||||
// Tag items
|
||||
n -= len(items)
|
||||
// Tag footer
|
||||
n--
|
||||
}
|
||||
return "", nil
|
||||
}
|
||||
@ -346,6 +356,8 @@ func (list *RoomList) GetTagDisplayName(tag string) string {
|
||||
return "Favorites"
|
||||
case tag == "m.lowpriority":
|
||||
return "Low Priority"
|
||||
case tag == "im.vector.fake.direct":
|
||||
return "People"
|
||||
case strings.HasPrefix(tag, "m."):
|
||||
return strings.Title(strings.Replace(tag[len("m."):], "_", " ", -1))
|
||||
case strings.HasPrefix(tag, "u."):
|
||||
@ -420,5 +432,6 @@ func (list *RoomList) Draw(screen tcell.Screen) {
|
||||
break
|
||||
}
|
||||
}
|
||||
y++
|
||||
}
|
||||
}
|
||||
|
@ -173,7 +173,7 @@ func (view *MainView) KeyEventHandler(roomView *RoomView, key *tcell.EventKey) *
|
||||
msgView := roomView.MessageView()
|
||||
|
||||
if msgView.IsAtTop() && (k == tcell.KeyPgUp || k == tcell.KeyUp) {
|
||||
go view.LoadHistory(roomView.Room.ID, false)
|
||||
go view.LoadHistory(roomView.Room.ID)
|
||||
}
|
||||
|
||||
switch k {
|
||||
@ -215,7 +215,7 @@ func (view *MainView) MouseEventHandler(roomView *RoomView, event *tcell.EventMo
|
||||
switch event.Buttons() {
|
||||
case tcell.WheelUp:
|
||||
if msgView.IsAtTop() {
|
||||
go view.LoadHistory(roomView.Room.ID, false)
|
||||
go view.LoadHistory(roomView.Room.ID)
|
||||
} else {
|
||||
msgView.AddScrollOffset(WheelScrollOffsetDiff)
|
||||
|
||||
@ -293,11 +293,9 @@ func (view *MainView) addRoomPage(room *rooms.Room) {
|
||||
view.roomView.AddPage(room.ID, roomView, true, false)
|
||||
roomView.UpdateUserList()
|
||||
|
||||
count, err := roomView.LoadHistory(view.matrix, view.config.HistoryDir)
|
||||
_, err := roomView.LoadHistory(view.matrix, view.config.HistoryDir)
|
||||
if err != nil {
|
||||
debug.Printf("Failed to load history of %s: %v", roomView.Room.GetTitle(), err)
|
||||
} else if count <= 0 {
|
||||
go view.LoadHistory(room.ID, true)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -314,18 +312,25 @@ func (view *MainView) GetRoom(roomID string) ifc.RoomView {
|
||||
|
||||
func (view *MainView) AddRoom(roomID string) {
|
||||
if view.roomList.Contains(roomID) {
|
||||
debug.Print("Add aborted", roomID)
|
||||
return
|
||||
}
|
||||
debug.Print("Adding", roomID)
|
||||
room := view.matrix.GetRoom(roomID)
|
||||
view.roomList.Add(room)
|
||||
view.addRoomPage(room)
|
||||
if !view.roomList.HasSelected() {
|
||||
view.SwitchRoom(view.roomList.First())
|
||||
}
|
||||
}
|
||||
|
||||
func (view *MainView) RemoveRoom(roomID string) {
|
||||
roomView := view.GetRoom(roomID)
|
||||
if roomView == nil {
|
||||
debug.Print("Remove aborted", roomID)
|
||||
return
|
||||
}
|
||||
debug.Print("Removing", roomID)
|
||||
|
||||
view.roomList.Remove(roomView.MxRoom())
|
||||
view.SwitchRoom(view.roomList.Selected())
|
||||
@ -336,12 +341,11 @@ func (view *MainView) RemoveRoom(roomID string) {
|
||||
view.parent.Render()
|
||||
}
|
||||
|
||||
func (view *MainView) SetRooms(roomIDs []string) {
|
||||
func (view *MainView) SetRooms(rooms map[string]*rooms.Room) {
|
||||
view.roomList.Clear()
|
||||
view.roomView.Clear()
|
||||
view.rooms = make(map[string]*RoomView)
|
||||
for _, roomID := range roomIDs {
|
||||
room := view.matrix.GetRoom(roomID)
|
||||
for _, room := range rooms {
|
||||
view.roomList.Add(room)
|
||||
view.addRoomPage(room)
|
||||
}
|
||||
@ -425,7 +429,7 @@ func (view *MainView) NotifyMessage(room *rooms.Room, message ifc.Message, shoul
|
||||
view.roomList.Bump(room)
|
||||
}
|
||||
|
||||
func (view *MainView) LoadHistory(room string, initial bool) {
|
||||
func (view *MainView) LoadHistory(room string) {
|
||||
defer debug.Recover()
|
||||
roomView := view.rooms[room]
|
||||
|
||||
@ -446,12 +450,7 @@ func (view *MainView) LoadHistory(room string, initial bool) {
|
||||
return
|
||||
}
|
||||
|
||||
if initial {
|
||||
batch = view.config.Session.NextBatch
|
||||
debug.Print("Loading initial history for", room)
|
||||
} else {
|
||||
debug.Print("Loading more history for", room, "starting from", batch)
|
||||
}
|
||||
debug.Print("Fetching history for", room, "starting from", batch)
|
||||
history, prevBatch, err := view.matrix.GetHistory(roomView.Room.ID, batch, 50)
|
||||
if err != nil {
|
||||
roomView.AddServiceMessage("Failed to fetch history")
|
||||
|
Reference in New Issue
Block a user