@@ 25,17 25,37 @@ func TUI(client *mautrix.Client, elections *election.ElectionsMap) (el *election
if err != nil {
panic(err)
}
+ // sorts rooms by name (putting rooms without names at the end)
+ cmpRooms := func(i, j id.RoomID) bool {
+ roomI := client.Store.LoadRoom(i)
+ roomJ := client.Store.LoadRoom(j)
+ if roomJ == nil {
+ return true
+ }
+ if roomI == nil {
+ return false
+ }
+ var nameI, nameJ string
+ if nameEvt, ok := roomJ.State[event.StateRoomName][""]; ok {
+ nameJ = nameEvt.Content.AsRoomName().Name
+ } else {
+ return true
+ }
+ if nameEvt, ok := roomI.State[event.StateRoomName][""]; ok {
+ nameI = nameEvt.Content.AsRoomName().Name
+ } else {
+ return false
+ }
+ return nameI < nameJ
+ }
+ // try to sort by room name (if available)
+ sort.Slice(resp.JoinedRooms, func(i, j int) bool {
+ return cmpRooms(resp.JoinedRooms[i], resp.JoinedRooms[j])
+ })
list := tview.NewList()
list.SetTitle("Select a room").SetBorder(true)
for _, roomID := range resp.JoinedRooms {
- name := string(roomID)
- room := client.Store.LoadRoom(roomID)
- if room != nil {
- if roomNameEvent, ok := room.State[event.StateRoomName][""]; ok {
- name = roomNameEvent.Content.AsRoomName().Name
- }
- }
- list.AddItem(name, string(roomID), 0, nil)
+ list.AddItem(roomID.String(), roomID.String(), 0, nil)
}
update := func() {
for i, roomID := range resp.JoinedRooms {
@@ 45,14 65,14 @@ func TUI(client *mautrix.Client, elections *election.ElectionsMap) (el *election
}
if roomNameEvent, ok := room.State[event.StateRoomName][""]; ok {
name := roomNameEvent.Content.AsRoomName().Name
- list.SetItemText(i, name, string(roomID))
+ list.SetItemText(i, name, roomID.String())
}
}
}
go func() {
for alive {
- time.Sleep(100 * time.Millisecond) // syncing right away can be slow, so this is before the next line
app.QueueUpdateDraw(update)
+ time.Sleep(300 * time.Millisecond)
}
}()
list.SetSelectedFunc(func(i int, _ string, _ string, _ rune) {