commit 0cf17633b32340054c7b0d3a4ce39768f007170a Author: shinya Date: Thu May 8 14:01:19 2025 +0200 first gocui chat version diff --git a/FS.md b/FS.md new file mode 100644 index 0000000..e69de29 diff --git a/TECH_STACK.md b/TECH_STACK.md new file mode 100644 index 0000000..b8e79df --- /dev/null +++ b/TECH_STACK.md @@ -0,0 +1,17 @@ +# Použité technologie + +## GO + +- Klient aplikace pro uživatele a komunikace se serverem +- - vizuální stránka aplikace, nejde rendrovat obrázky +- - vizuální stránka aplikace +- - rendrování obrázků v terminálu + (profilové obrázky nebo posílané médium) + +## C + +- Pro rendrování a hashovací algoritmy v klient aplikaci embeded v go kodu + +## Java + +- Server pro komunikaci mezi uživateli diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..846d50c --- /dev/null +++ b/go.mod @@ -0,0 +1,11 @@ +module whspbrd + +go 1.24.2 + +require github.com/jroimartin/gocui v0.5.0 + +require ( + github.com/dolmen-go/kittyimg v0.0.0-20250507221057-648811cc98ed + github.com/mattn/go-runewidth v0.0.9 // indirect + github.com/nsf/termbox-go v1.1.1 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..13254ab --- /dev/null +++ b/go.sum @@ -0,0 +1,8 @@ +github.com/dolmen-go/kittyimg v0.0.0-20250507221057-648811cc98ed h1:kDKSQ5o62eFce2771pkdTu6kjv4I3s5dFhe6gXgSeUg= +github.com/dolmen-go/kittyimg v0.0.0-20250507221057-648811cc98ed/go.mod h1:2vk7ATPVcI7uW4Sh6PrSQvtO+Czmq8509xcg/y8Osd0= +github.com/jroimartin/gocui v0.5.0 h1:DCZc97zY9dMnHXJSJLLmx9VqiEnAj0yh0eTNpuEtG/4= +github.com/jroimartin/gocui v0.5.0/go.mod h1:l7Hz8DoYoL6NoYnlnaX6XCNR62G7J5FfSW5jEogzaxE= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/nsf/termbox-go v1.1.1 h1:nksUPLCb73Q++DwbYUBEglYBRPZyoXJdrj5L+TkjyZY= +github.com/nsf/termbox-go v1.1.1/go.mod h1:T0cTdVuOwf7pHQNtfhnEbzHbcNyCEcVU4YPpouCbVxo= diff --git a/main.go b/main.go new file mode 100644 index 0000000..b38418e --- /dev/null +++ b/main.go @@ -0,0 +1,120 @@ +package main + +import ( + "fmt" + "log" + "strings" + + "github.com/jroimartin/gocui" +) + +var messages []string +var users = []string{"Alice", "Bob", "Charlie"} + +func layout(g *gocui.Gui) error { + maxX, maxY := g.Size() + + if v, err := g.SetView("users", 0, 0, 20, maxY-1); err != nil { + if err != gocui.ErrUnknownView { + return err + } + v.Title = "Users" + v.Clear() + for _, u := range users { + fmt.Fprintln(v, u) + } + } + + if v, err := g.SetView("chat", 21, 0, maxX-1, maxY-5); err != nil { + if err != gocui.ErrUnknownView { + return err + } + v.Title = "Chat" + v.Wrap = true + updateChatView(v) + } + + if v, err := g.SetView("input", 21, maxY-4, maxX-1, maxY-1); err != nil { + if err != gocui.ErrUnknownView { + return err + } + v.Title = "Type your message" + v.Editable = true + v.Wrap = true + if _, err := g.SetCurrentView("input"); err != nil { + return err + } + } + + return nil +} +func updateChatView(v *gocui.View) { + v.Clear() + for _, msg := range messages { + fmt.Fprintln(v, msg) + } +} + +func sendMessage(g *gocui.Gui, v *gocui.View) error { + input := strings.TrimSpace(v.Buffer()) + v.Clear() + v.SetCursor(0, 0) + v.SetOrigin(0, 0) + + if input != "" { + messages = append(messages, "You: "+input) + if chatView, err := g.View("chat"); err == nil { + updateChatView(chatView) + } + } + v.Clear() + v.SetCursor(0, 0) + return nil +} + +func keybindings(g *gocui.Gui) error { + // Ctrl+C to quit + if err := g.SetKeybinding("", gocui.KeyCtrlC, gocui.ModNone, quit); err != nil { + return err + } + + // Enter to send message + // Enter adds a new line (multiline input) + if err := g.SetKeybinding("input", gocui.KeyArrowDown, gocui.ModNone, insertNewline); err != nil { + return err + } + + // Ctrl+Enter sends the message + if err := g.SetKeybinding("input", gocui.KeyEnter, gocui.ModNone, sendMessage); err != nil { + return err + } + + return nil +} + +func insertNewline(g *gocui.Gui, v *gocui.View) error { + v.EditNewLine() + return nil +} + +func quit(g *gocui.Gui, v *gocui.View) error { + return gocui.ErrQuit +} + +func main() { + g, err := gocui.NewGui(gocui.OutputNormal) + if err != nil { + log.Panicln(err) + } + defer g.Close() + + g.SetManagerFunc(layout) + + if err := keybindings(g); err != nil { + log.Panicln(err) + } + + if err := g.MainLoop(); err != nil && err != gocui.ErrQuit { + log.Panicln(err) + } +}