f089202286
Switch to scanning runes in client since go fmt scanning ignores spaces because of excellent design
114 lines
2.3 KiB
Markdown
114 lines
2.3 KiB
Markdown
# GoSmartKeyboard Client
|
|
|
|
When GoSmartKeyboard is started in client mode, it does the following:
|
|
|
|
1. Load the connection URL from the second CLI argument.
|
|
2. Load the auth token from the environment variable `KEYBOARD_AUTH` or stdin.
|
|
3. Connect to the server.
|
|
4 Send the auth token to the server.
|
|
5. If the server responds with "authenticated", we start reading keys from stdin and sending them to the server until EOF.
|
|
|
|
|
|
--- handle client command
|
|
|
|
if len(os.Args) > 1 && os.Args[1] == "connect" {
|
|
@{start client}
|
|
os.Exit(0)
|
|
}
|
|
|
|
---
|
|
|
|
|
|
## Connecting
|
|
|
|
The base64 authentication token is loaded from the environment variable `KEYBOARD_AUTH`, if it does not exist we read it from stdin (base64 encoded), ended with a newline.
|
|
|
|
``` go
|
|
|
|
--- start client
|
|
|
|
@{load connection URL from second CLI argument}
|
|
@{get authTokenInput from environment}
|
|
|
|
if !authTokenInputExists {
|
|
fmt.Print("Enter authentication token: ")
|
|
_, err := fmt.Scanln(&authTokenInput)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
client, _, err := websocket.DefaultDialer.Dial(connectionURL, nil)
|
|
if err != nil {
|
|
log.Fatal("dial:", err)
|
|
}
|
|
defer client.Close()
|
|
|
|
err = client.WriteMessage(websocket.TextMessage, []byte(authTokenInput))
|
|
|
|
if err != nil {
|
|
log.Fatal("write:", err)
|
|
}
|
|
|
|
_, authResponse, err := client.ReadMessage()
|
|
if err != nil {
|
|
log.Fatal("read:", err)
|
|
}
|
|
if string(authResponse) == "authenticated" {
|
|
fmt.Println("authenticated")
|
|
} else {
|
|
log.Fatal("authentication failed")
|
|
}
|
|
|
|
|
|
---
|
|
|
|
--- load connection URL from second CLI argument --- noWeave
|
|
|
|
if len(os.Args) < 3 {
|
|
log.Fatal("missing connection URL")
|
|
}
|
|
|
|
connectionURL := os.Args[2]
|
|
|
|
if !strings.HasPrefix(connectionURL, "ws://") && !strings.HasPrefix(connectionURL, "wss://") {
|
|
log.Fatal("connection URL must start with ws:// or wss://")
|
|
}
|
|
|
|
---
|
|
|
|
```
|
|
|
|
## Sending keys
|
|
|
|
|
|
We read keys from stdin and send them to the server until we get EOF
|
|
|
|
``` go
|
|
|
|
--- start client +=
|
|
|
|
|
|
for {
|
|
var key string
|
|
reader := bufio.NewReader(os.Stdin)
|
|
|
|
rune, _, err := reader.ReadRune() //:= fmt.Scan(&key)
|
|
key = string(rune)
|
|
|
|
if err != nil {
|
|
if err == io.EOF {
|
|
break
|
|
}
|
|
log.Fatal(err)
|
|
}
|
|
fmt.Println("send" + strings.Replace(key, " ", "space", 10))
|
|
err = client.WriteMessage(websocket.TextMessage, []byte(key))
|
|
if err != nil {
|
|
log.Fatal("write:", err)
|
|
}
|
|
}
|
|
|
|
---
|
|
|
|
``` |