diff --git a/go.mod b/go.mod index 6b99ec5..f001292 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module mayhem-party go 1.19 + +require github.com/micmonay/keybd_event v1.1.1 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..1a6387e --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/micmonay/keybd_event v1.1.1 h1:rv7omwXWYL9Lgf3PUq6uBgJI2k1yGkL/GD6dxc6nmSs= +github.com/micmonay/keybd_event v1.1.1/go.mod h1:CGMWMDNgsfPljzrAWoybUOSKafQPZpv+rLigt2LzNGI= diff --git a/src/device/output/device.go b/src/device/output/device.go new file mode 100644 index 0000000..b0bb40d --- /dev/null +++ b/src/device/output/device.go @@ -0,0 +1,3 @@ +package output + +type Device interface{} diff --git a/src/device/output/keyboard.go b/src/device/output/keyboard.go new file mode 100644 index 0000000..f22954e --- /dev/null +++ b/src/device/output/keyboard.go @@ -0,0 +1,48 @@ +package output + +import ( + "log" + "time" + + "github.com/micmonay/keybd_event" +) + +type Keyboard struct { + created time.Time + kb *keybd_event.KeyBonding +} + +func NewKeyboard() Keyboard { + kb, err := keybd_event.NewKeyBonding() + if err != nil { + panic(err) + } + return Keyboard{ + kb: &kb, + created: time.Now(), + } +} + +func (kb Keyboard) wait() { + if delta := time.Since(kb.created.Add(time.Second * 2)); delta < 0 { + time.Sleep(-1 * delta) + } +} + +func (kb Keyboard) Press(keys ...int) { + kb.wait() + + kb.Release() + kb.kb.SetKeys(keys...) + if err := kb.kb.Press(); err != nil { + log.Println("failed to press keys:", err) + } +} + +func (kb Keyboard) Release() { + kb.wait() + + if err := kb.kb.Release(); err != nil { + log.Println("failed to release keys:", err) + } +} diff --git a/src/device/output/keyboard_test.go b/src/device/output/keyboard_test.go new file mode 100644 index 0000000..ee7724c --- /dev/null +++ b/src/device/output/keyboard_test.go @@ -0,0 +1,23 @@ +//go:build integration + +package output_test + +import ( + "mayhem-party/src/device/output" + "testing" + "time" +) + +func TestKeyboardIntegration(t *testing.T) { + kb := output.NewKeyboard() + defer kb.Release() + + t.Log("pressing 'a' for 5 seconds") + kb.Press(output.A) + for i := 0; i < 5; i++ { + t.Logf("\t%d...", 5-i) + time.Sleep(time.Second) + } + t.Logf("releasing") + kb.Release() +} diff --git a/src/device/output/keys.go b/src/device/output/keys.go new file mode 100644 index 0000000..0ef7881 --- /dev/null +++ b/src/device/output/keys.go @@ -0,0 +1,32 @@ +package output + +import "github.com/micmonay/keybd_event" + +const ( + A = keybd_event.VK_A + B = keybd_event.VK_B + C = keybd_event.VK_C + D = keybd_event.VK_D + E = keybd_event.VK_E + F = keybd_event.VK_F + G = keybd_event.VK_G + H = keybd_event.VK_H + I = keybd_event.VK_I + J = keybd_event.VK_J + K = keybd_event.VK_K + L = keybd_event.VK_L + M = keybd_event.VK_M + N = keybd_event.VK_N + O = keybd_event.VK_O + P = keybd_event.VK_P + Q = keybd_event.VK_Q + R = keybd_event.VK_R + S = keybd_event.VK_S + T = keybd_event.VK_T + U = keybd_event.VK_U + V = keybd_event.VK_V + W = keybd_event.VK_W + X = keybd_event.VK_X + Y = keybd_event.VK_Y + Z = keybd_event.VK_Z +)