summaryrefslogtreecommitdiff
path: root/client/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'client/main.go')
-rw-r--r--client/main.go267
1 files changed, 135 insertions, 132 deletions
diff --git a/client/main.go b/client/main.go
index f90a018..bf11f7a 100644
--- a/client/main.go
+++ b/client/main.go
@@ -1,156 +1,159 @@
package main
import (
- "bufio"
- "encoding/json"
- "fmt"
- "log"
- "net"
- "os"
+ "fyne.io/fyne/v2"
+ "fyne.io/fyne/v2/app"
+ "fyne.io/fyne/v2/canvas"
+ "fyne.io/fyne/v2/container"
+ "fyne.io/fyne/v2/data/binding"
+ "fyne.io/fyne/v2/dialog"
+ "fyne.io/fyne/v2/layout"
+ "fyne.io/fyne/v2/widget"
+ "image/color"
"sync"
)
-var storage struct {
- sync.Mutex
- messages []Message
-}
+func chatLayout(window fyne.Window, user UserData, c chan string) {
+ window.SetTitle("Сообщения")
-func parseBuffer(previous []byte, new []byte) ([]Response, []byte) {
- buf := append(previous, new...)
- bufSize := uint32(len(buf))
- var responses []Response
- var idx uint32 = 0
- for {
- if idx+4 >= bufSize {
- break
- }
- size := fromBytes(buf[idx : idx+4])
- if size == 0 {
- return responses, make([]byte, 0)
- }
- if idx+4+size >= bufSize {
- break
- } else {
- resp, err := parseResponse(buf[idx+4 : idx+4+size])
- if err == nil {
- responses = append(responses, resp)
- }
- idx += 4 + size
- }
- }
- return responses, buf[idx:]
+ storage.Lock()
+ storage.data = binding.BindStringList(&storage.stringData)
+ storage.Unlock()
+ go runClient(user, c)
+
+ list := widget.NewListWithData(storage.data,
+ func() fyne.CanvasObject {
+ return widget.NewLabel("template")
+ },
+ func(i binding.DataItem, o fyne.CanvasObject) {
+ o.(*widget.Label).Bind(i.(binding.String))
+ })
+
+ entry := widget.NewEntry()
+ submit := widget.NewButton("Отправить", func() {
+ channelLock.Lock()
+ c <- entry.Text
+ entry.SetText("")
+
+ storage.RLock()
+ lastIdx := storage.data.Length() - 1
+ list.Select(lastIdx)
+ list.Unselect(lastIdx)
+ storage.RUnlock()
+ })
+
+ window.SetContent(container.NewBorder(
+ nil,
+ container.NewBorder(nil, nil, nil, submit, entry),
+ nil, nil,
+ list,
+ ))
}
-func readResponse(conn net.Conn) (Response, error) {
- var response Response
- var err error
+func loginLayout(window fyne.Window, c chan string) {
+ window.SetTitle("Войти в чат")
- buf := make([]byte, 4096)
- _, err = conn.Read(buf)
- if err != nil {
- return response, err
- }
+ label := canvas.NewText("Chat", color.White)
+ label.TextSize = 40
- size := fromBytes(buf[:4])
- rawResponse := buf[4 : size+4]
- return parseResponse(rawResponse)
-}
+ loginLabel := widget.NewLabel("Логин: ")
+ loginEntry := widget.NewEntry()
-func main() {
- var wg sync.WaitGroup
- conn, err := net.Dial("tcp", "localhost:8080")
- handleError(err)
- defer conn.Close()
- wg.Add(1)
- go func(conn net.Conn) {
- authMsg, _ := json.Marshal(Message{
- Type: AUTHENTICATE,
- Data: "auth",
- User: "andrew",
- })
- _ = sendMessage(conn, authMsg)
- reader := bufio.NewReader(os.Stdin)
-
- for i := 0; i < 1000; i += 1 {
- //fmt.Printf("Sending %d request\n", i)
- line, _, _ := reader.ReadLine()
- request, _ := json.Marshal(Message{
- Type: MESSAGE,
- //Data: fmt.Sprintf("Hello, %d", i),
- Data: string(line),
- User: "andrew",
- })
- err = sendMessage(conn, request)
- if err != nil {
- break
+ chooseKey := widget.NewButton("Выбрать ключ для подписи", func() {
+ dialog.ShowFileOpen(func(closer fyne.URIReadCloser, err error) {
+ if closer == nil {
+ return
+ }
+ bufSize := 4096
+ data := make([]byte, 0)
+ buf := make([]byte, bufSize)
+ n := bufSize
+
+ for n >= bufSize {
+ n, _ = closer.Read(buf)
+ data = append(data, buf...)
}
- response, _ := readResponse(conn)
- _ = fmt.Sprintf("%s", response)
- }
+ closer.Close()
+ }, window)
+ })
- exitMsg, _ := json.Marshal(Message{
- Type: MESSAGE,
- Data: "exit",
- User: "andrew",
- })
- _ = sendMessage(conn, exitMsg)
- fmt.Println("Closed connection")
- wg.Done()
- }(conn)
-
- receiver, err := net.Dial("tcp", "localhost:8081")
- handleError(err)
- defer receiver.Close()
- wg.Add(1)
- go func(conn net.Conn) {
- req := Message{
- Type: AUTHENTICATE,
- Data: AUTHENTICATE,
- User: "andrew",
- }
- err = sendMessage(conn, []byte(req.serialize()))
- if err != nil {
- fmt.Println(err)
- return
+ loginButton := widget.NewButton("Войти", func() {
+ var user = UserData{
+ Username: loginEntry.Text,
}
+ chatLayout(window, user, c)
+ })
+
+ back := widget.NewButton("Назад", func() {
+ startLayout(window, c)
+ })
+
+ mainContainer := container.NewCenter(container.NewVBox(
+ container.NewCenter(label), layout.NewSpacer(),
+ container.NewBorder(nil, nil, loginLabel, nil, loginEntry),
+ chooseKey,
+ loginButton,
+ back,
+ ))
+ window.SetContent(mainContainer)
+}
- _, err := readResponse(conn)
- if err != nil {
- return
- }
+func registerLayout(window fyne.Window, c chan string) {
+ window.SetTitle("Регистрация")
- for {
- response, err := readResponse(conn)
- if err != nil {
- break
- }
+ label := canvas.NewText("Chat", color.White)
+ label.TextSize = 40
- message, err := parseMessage([]byte(response.Data))
- if err == nil {
- storage.Lock()
- storage.messages = append(storage.messages, message)
- fmt.Printf("Got message: \"%s\"\n", message.Data)
- storage.Unlock()
- } else {
- fmt.Println(err)
- }
+ loginLabel := widget.NewLabel("Логин: ")
+ loginEntry := widget.NewEntry()
- req := Message{
- Type: MESSAGE,
- Data: SUCCESS,
- User: "andrew",
- }
- _ = sendMessage(conn, []byte(req.serialize()))
- }
- wg.Done()
- }(receiver)
+ generateKeys := widget.NewButton("Сгенерировать ключи подписи", func() {
+
+ })
+
+ registerButton := widget.NewButton("Зарегистрироваться", func() {
- wg.Wait()
+ })
+
+ back := widget.NewButton("Назад", func() {
+ startLayout(window, c)
+ })
+
+ window.SetContent(container.NewCenter(container.NewVBox(
+ container.NewCenter(label), layout.NewSpacer(),
+ container.NewBorder(nil, nil, loginLabel, nil, loginEntry),
+ generateKeys,
+ registerButton,
+ back,
+ )))
+}
+
+func startLayout(window fyne.Window, c chan string) {
+ window.SetTitle("Chat")
+
+ label := canvas.NewText("Chat", color.White)
+ label.TextSize = 40
+ login := widget.NewButton("Войти", func() {
+ loginLayout(window, c)
+ })
+ signup := widget.NewButton("Зарегистрироваться", func() {
+ registerLayout(window, c)
+ })
+
+ mainContainer := container.NewCenter(container.NewVBox(
+ container.NewCenter(label), layout.NewSpacer(), login, signup))
+ window.SetContent(mainContainer)
}
-func handleError(err error) {
- if err != nil {
- log.Fatal(err)
- }
+//var channel chan string
+var channelLock sync.Mutex
+
+func main() {
+ myApp := app.New()
+ window := myApp.NewWindow("")
+ channel := make(chan string)
+
+ startLayout(window, channel)
+ window.ShowAndRun()
}