import (
"fmt"
+ "log"
"sort"
"github.com/jroimartin/gocui"
+ vors "go.stargrave.org/vors/v3/internal"
)
var (
- GUI *gocui.Gui
- GUIReady bool
- GUIReadyC = make(chan struct{})
- GUIMaxY int
+ GUI *gocui.Gui
+ GUIReady bool
+ GUIReadyC = make(chan struct{})
+ GUIMaxY int
+ CurrentView = 0
)
func guiQuit(gui *gocui.Gui, v *gocui.View) error {
return nil
}
+func tabHandle(gui *gocui.Gui, v *gocui.View) error {
+ sids := make([]int, 0, len(Streams)+1)
+ sids = append(sids, -1)
+ for sid := range Streams {
+ sids = append(sids, int(sid))
+ }
+ sort.Ints(sids)
+ if CurrentView+1 >= len(sids) {
+ CurrentView = 0
+ } else {
+ CurrentView++
+ }
+ if CurrentView == 0 {
+ gui.SetCurrentView("chat")
+ } else {
+ gui.SetCurrentView(Streams[byte(sids[CurrentView])].name)
+ }
+ return nil
+}
+
+func chatEnter(gui *gocui.Gui, v *gocui.View) error {
+ msg := v.Buffer()
+ if len(msg) > 1 {
+ Ctrl <- vors.ArgsEncode([]byte(vors.CmdChat), []byte(msg[:len(msg)-1]))
+ log.Println("me:", msg[:len(msg)-1])
+ }
+ v.Clear()
+ v.SetCursor(0, 0)
+ return nil
+}
+
func guiLayout(gui *gocui.Gui) error {
var maxX int
maxX, GUIMaxY = gui.Size()
prevY := 0
- v, err := gui.SetView("logs", 0, prevY, maxX-1, prevY+10+2)
- prevY += 10 + 2
+ v, err := gui.SetView("logs", 0, prevY, maxX-1, prevY+7+2)
+ prevY += 7 + 2
if err != nil {
if err != gocui.ErrUnknownView {
return err
}
v.Title = fmt.Sprintf("Logs room=%s", *Room)
v.Autoscroll = true
+ v.Wrap = true
+ }
+ v, err = gui.SetView("chat", 0, prevY, maxX-1, prevY+2)
+ if err != nil {
+ if err != gocui.ErrUnknownView {
+ return err
+ }
+ v.Title = "chat"
+ v.Editable = true
+ if err := GUI.SetKeybinding(
+ "chat", gocui.KeyEnter, gocui.ModNone, chatEnter,
+ ); err != nil {
+ return err
+ }
}
+ prevY += 3
sids := make([]int, 0, len(Streams))
for sid := range Streams {
sids = append(sids, int(sid))
if err != gocui.ErrUnknownView {
return err
}
- v.Title = stream.name
+ if stream.name == *Name {
+ v.Title = ">" + stream.name + "<"
+ } else {
+ v.Title = stream.name
+ }
}
_, err = gui.SetView(stream.name+"-vol", maxX/2, prevY, maxX-1, prevY+2)
prevY += 3
if !GUIReady {
close(GUIReadyC)
GUIReady = true
- gui.SetCurrentView(*Name)
+ gui.SetCurrentView("chat")
}
return nil
}
GUI.SelFgColor = gocui.ColorCyan
GUI.Highlight = true
GUI.SetManagerFunc(guiLayout)
- if err := GUI.SetKeybinding("", 'q', gocui.ModNone, guiQuit); err != nil {
+ if err := GUI.SetKeybinding("", gocui.KeyTab, gocui.ModNone, tabHandle); err != nil {
log.Fatal(err)
}
- if err := GUI.SetKeybinding("", gocui.KeyEnter, gocui.ModNone, mute); err != nil {
+ if err := GUI.SetKeybinding("", gocui.KeyF1, gocui.ModNone, mute); err != nil {
+ log.Fatal(err)
+ }
+ if err := GUI.SetKeybinding("", gocui.KeyF10, gocui.ModNone, guiQuit); err != nil {
log.Fatal(err)
}
continue
}
s.muted = false
+ case vors.CmdChat:
+ sid := args[1][0]
+ s := Streams[sid]
+ if s == nil {
+ log.Println("unknown sid:", sid)
+ continue
+ }
+ log.Println(s.name, ":", string(args[2]))
default:
log.Fatal("unexpected cmd:", cmd)
}