1
0
Fork 0

initial commit

This commit is contained in:
ston1th 2019-02-11 23:58:53 +01:00
commit dc421f035e
8 changed files with 989 additions and 0 deletions

202
pkg/encode/encode.go Normal file
View file

@ -0,0 +1,202 @@
package encode
import (
"bufio"
"fmt"
"io"
"os"
"strconv"
"strings"
"git.giftfish.de/ston1th/duckycode/pkg/lang"
)
type Encoder struct {
reader io.Reader
language string
defaultDelay int
delayOverride bool
loop int
repeat bool
}
func NewEncoder(r io.Reader, language string) *Encoder {
if language == "" {
language = "de"
}
return &Encoder{r, language, 0, false, 0, false}
}
func (e *Encoder) Encode() (buf []byte, err error) {
scanner := bufio.NewScanner(e.reader)
for scanner.Scan() {
if err = scanner.Err(); err != nil {
return
}
s := strings.SplitN(scanner.Text(), " ", 2)
switch len(s) {
case 1:
if b := e.instruction(s[0]); b != 0 {
fmt.Fprintf(os.Stderr, "%s\n", s[0])
buf = append(buf, []byte{b, 0}...)
fmt.Fprintf(os.Stderr, "%#v\n", buf)
}
case 2:
fmt.Fprintf(os.Stderr, "%s:%s\n", s[0], s[1])
buf = append(buf, e.instructionData(s[0], s[1])...)
fmt.Fprintf(os.Stderr, "%#v\n", buf)
}
if !e.delayOverride && e.defaultDelay > 0 {
delayCounter := e.defaultDelay
for delayCounter > 0 {
buf = append(buf, byte(0))
if delayCounter > 255 {
buf = append(buf, byte(255))
delayCounter -= 255
} else {
buf = append(buf, byte(delayCounter))
delayCounter = 0
}
}
}
}
return
}
func (e *Encoder) instruction(in string) byte {
if b, ok := lang.K["KEY_"+in]; ok {
return b
}
switch in {
case "", "REM":
return 0
case "ESCAPE":
return e.instruction("ESC")
case "DEL":
return e.instruction("DELETE")
case "BREAK":
return e.instruction("PAUSE")
case "CONTROL":
return e.instruction("CTRL")
case "DOWNARROW":
return e.instruction("DOWM")
case "UPARROW":
return e.instruction("UP")
case "LEFTARROW":
return e.instruction("LEFT")
case "RIGHTARROW":
return e.instruction("RIGHT")
case "MENU":
return e.instruction("APP")
case "WINDOWS":
return e.instruction("GUI")
case "PLAY":
return e.instruction("MEDIA_PLAY_PAUSE")
case "MUTE":
return e.instruction("MEDIA_MUTE")
case "VOLUMEUP":
return e.instruction("MEDIA_VOLUME_INC")
case "VOLUMEDOWN":
return e.instruction("MEDIAVOLUME_DEC")
case "SCROLLLOCK":
return e.instruction("SCROLL_LOCK")
case "NUMLOCK":
return e.instruction("NUM_LOCK")
case "CAPSLOCK":
return e.instruction("CAPS_LOCK")
case "CTRL":
return e.instruction("LEFT_CTRL")
case "ALT":
return e.instruction("LEFT_ALT")
case "SHIFT":
return e.instruction("LEFT_SHIFT")
case "ALT-SHIFT":
//TODO
return 0
case "ALT-TAB":
//TODO
return 0
}
return e.encodeRune(rune(in[0]))[0]
}
func (e *Encoder) instructionData(in string, data string) (b []byte) {
switch in {
case "DEFAULT_DELAY", "DEFAULTDELAY":
delay, err := strconv.Atoi(data)
if err == nil {
e.defaultDelay = delay
e.delayOverride = true
}
return nil
case "DELAY":
delay, err := strconv.Atoi(data)
if err != nil {
return nil
}
for delay > 0 {
b = append(b, byte(0))
if delay > 255 {
b = append(b, byte(255))
delay -= 255
} else {
b = append(b, byte(delay))
delay = 0
}
}
e.delayOverride = true
return
case "", "REM":
return nil
case "STRING":
for _, r := range data {
enc := e.encodeRune(r)
if len(enc)%2 != 0 {
enc = append(enc, byte(0))
}
b = append(b, enc...)
}
return
case "CONTROL", "CTRL":
return []byte{e.instruction(data), lang.K["MODIFIERKEY_CTRL"]}
case "ALT":
return []byte{e.instruction(data), lang.K["MODIFIERKEY_ALT"]}
case "SHIFT":
return []byte{e.instruction(data), lang.K["MODIFIERKEY_SHIFT"]}
case "CTRL-ALT":
return []byte{e.instruction(data), lang.K["MODIFIERKEY_CTRL"] | lang.K["MODIFIERKEY_ALT"]}
case "CTRL-SHIFT":
return []byte{e.instruction(data), lang.K["MODIFIERKEY_CTRL"] | lang.K["MODIFIERKEY_SHIFT"]}
case "COMMAND-OPTION":
return []byte{e.instruction(data), lang.K["MODIFIERKEY_LEFT_GUI"] | lang.K["MODIFIERKEY_ALT"]}
case "ALT-SHIFT":
return []byte{e.instruction(data), lang.K["MODIFIERKEY_LEFT_ALT"] | lang.K["MODIFIERKEY_SHIFT"]}
case "WINDOWS", "GUI", "COMMAND":
return []byte{e.instruction(data), lang.K["MODIFIERKEY_LEFT_GUI"]}
}
return []byte{e.instruction(data), 0}
}
func (e *Encoder) encodeRune(r rune) []byte {
var code string
hex := strings.ToUpper(strconv.FormatUint(uint64(r), 16))
switch {
case r < 128:
code = "ASCII_" + hex
case r < 256:
code = "ISO_8859_1_" + hex
default:
code = "UNICODE_" + hex
}
if b, ok := lang.K[code]; ok {
return []byte{b}
} else if k, ok := lang.Langs[e.language][code]; ok {
if k.Mod != 0 {
return []byte{k.Key, k.Mod}
}
return []byte{k.Key}
}
return nil
}

116
pkg/lang/de.go Normal file
View file

@ -0,0 +1,116 @@
package lang
func init() {
l := make(Lang)
l["ASCII_20"] = Key{K["KEY_SPACE"], K[""]}
l["ASCII_21"] = Key{K["KEY_1"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_22"] = Key{K["KEY_2"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_23"] = Key{K["KEY_BACKSLASH"], K[""]}
l["ASCII_24"] = Key{K["KEY_4"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_25"] = Key{K["KEY_5"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_26"] = Key{K["KEY_6"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_27"] = Key{K["KEY_BACKSLASH"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_28"] = Key{K["KEY_8"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_29"] = Key{K["KEY_9"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_2A"] = Key{K["KEY_RIGHT_BRACE"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_2B"] = Key{K["KEY_RIGHT_BRACE"], K[""]}
l["ASCII_2C"] = Key{K["KEY_COMMA"], K[""]}
l["ASCII_2D"] = Key{K["KEY_SLASH"], K[""]}
l["ASCII_2E"] = Key{K["KEY_PERIOD"], K[""]}
l["ASCII_2F"] = Key{K["KEY_7"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_30"] = Key{K["KEY_0"], K[""]}
l["ASCII_31"] = Key{K["KEY_1"], K[""]}
l["ASCII_32"] = Key{K["KEY_2"], K[""]}
l["ASCII_33"] = Key{K["KEY_3"], K[""]}
l["ASCII_34"] = Key{K["KEY_4"], K[""]}
l["ASCII_35"] = Key{K["KEY_5"], K[""]}
l["ASCII_36"] = Key{K["KEY_6"], K[""]}
l["ASCII_37"] = Key{K["KEY_7"], K[""]}
l["ASCII_38"] = Key{K["KEY_8"], K[""]}
l["ASCII_39"] = Key{K["KEY_9"], K[""]}
l["ASCII_3A"] = Key{K["KEY_PERIOD"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_3B"] = Key{K["KEY_COMMA"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_3C"] = Key{K["KEY_NON_US_100"], K[""]}
l["ASCII_3D"] = Key{K["KEY_0"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_3E"] = Key{K["KEY_NON_US_100"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_3F"] = Key{K["KEY_MINUS"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_40"] = Key{K["KEY_Q"], K["MODIFIERKEY_RIGHT_ALT"]}
l["ASCII_41"] = Key{K["KEY_A"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_42"] = Key{K["KEY_B"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_43"] = Key{K["KEY_C"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_44"] = Key{K["KEY_D"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_45"] = Key{K["KEY_E"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_46"] = Key{K["KEY_F"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_47"] = Key{K["KEY_G"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_48"] = Key{K["KEY_H"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_49"] = Key{K["KEY_I"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_4A"] = Key{K["KEY_J"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_4B"] = Key{K["KEY_K"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_4C"] = Key{K["KEY_L"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_4D"] = Key{K["KEY_M"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_4E"] = Key{K["KEY_N"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_4F"] = Key{K["KEY_O"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_50"] = Key{K["KEY_P"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_51"] = Key{K["KEY_Q"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_52"] = Key{K["KEY_R"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_53"] = Key{K["KEY_S"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_54"] = Key{K["KEY_T"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_55"] = Key{K["KEY_U"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_56"] = Key{K["KEY_V"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_57"] = Key{K["KEY_W"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_58"] = Key{K["KEY_X"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_59"] = Key{K["KEY_Z"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_5A"] = Key{K["KEY_Y"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_5B"] = Key{K["KEY_8"], K["MODIFIERKEY_RIGHT_ALT"]}
l["ASCII_5C"] = Key{K["KEY_MINUS"], K["MODIFIERKEY_RIGHT_ALT"]}
l["ASCII_5D"] = Key{K["KEY_9"], K["MODIFIERKEY_RIGHT_ALT"]}
l["ASCII_5E"] = Key{K["KEY_TILDE"], K[""]}
l["ASCII_5F"] = Key{K["KEY_SLASH"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_60"] = Key{K["KEY_EQUAL"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_61"] = Key{K["KEY_A"], K[""]}
l["ASCII_62"] = Key{K["KEY_B"], K[""]}
l["ASCII_63"] = Key{K["KEY_C"], K[""]}
l["ASCII_64"] = Key{K["KEY_D"], K[""]}
l["ASCII_65"] = Key{K["KEY_E"], K[""]}
l["ASCII_66"] = Key{K["KEY_F"], K[""]}
l["ASCII_67"] = Key{K["KEY_G"], K[""]}
l["ASCII_68"] = Key{K["KEY_H"], K[""]}
l["ASCII_69"] = Key{K["KEY_I"], K[""]}
l["ASCII_6A"] = Key{K["KEY_J"], K[""]}
l["ASCII_6B"] = Key{K["KEY_K"], K[""]}
l["ASCII_6C"] = Key{K["KEY_L"], K[""]}
l["ASCII_6D"] = Key{K["KEY_M"], K[""]}
l["ASCII_6E"] = Key{K["KEY_N"], K[""]}
l["ASCII_6F"] = Key{K["KEY_O"], K[""]}
l["ASCII_70"] = Key{K["KEY_P"], K[""]}
l["ASCII_71"] = Key{K["KEY_Q"], K[""]}
l["ASCII_72"] = Key{K["KEY_R"], K[""]}
l["ASCII_73"] = Key{K["KEY_S"], K[""]}
l["ASCII_74"] = Key{K["KEY_T"], K[""]}
l["ASCII_75"] = Key{K["KEY_U"], K[""]}
l["ASCII_76"] = Key{K["KEY_V"], K[""]}
l["ASCII_77"] = Key{K["KEY_W"], K[""]}
l["ASCII_78"] = Key{K["KEY_X"], K[""]}
l["ASCII_79"] = Key{K["KEY_Z"], K[""]}
l["ASCII_7A"] = Key{K["KEY_Y"], K[""]}
l["ASCII_7B"] = Key{K["KEY_7"], K["MODIFIERKEY_RIGHT_ALT"]}
l["ASCII_7C"] = Key{K["KEY_NON_US_100"], K["MODIFIERKEY_RIGHT_ALT"]}
l["ASCII_7D"] = Key{K["KEY_0"], K["MODIFIERKEY_RIGHT_ALT"]}
l["ASCII_7E"] = Key{K["KEY_RIGHT_BRACE"], K["MODIFIERKEY_RIGHT_ALT"]}
l["ASCII_7F"] = Key{K["KEY_BACKSPACE"], K[""]}
l["ISO_8859_1_A0"] = Key{K["KEY_SPACE"], K[""]}
l["ISO_8859_1_A4"] = Key{K["KEY_E"], K["MODIFIERKEY_RIGHT_ALT"]}
l["ISO_8859_1_A7"] = Key{K["KEY_3"], K["MODIFIERKEY_SHIFT"]}
l["ISO_8859_1_B0"] = Key{K["KEY_TILDE"], K["MODIFIERKEY_SHIFT"]}
l["ISO_8859_1_B2"] = Key{K["KEY_2"], K["MODIFIERKEY_RIGHT_ALT"]}
l["ISO_8859_1_B3"] = Key{K["KEY_3"], K["MODIFIERKEY_RIGHT_ALT"]}
l["ISO_8859_1_C4"] = Key{K["KEY_QUOTE"], K["MODIFIERKEY_SHIFT"]}
l["ISO_8859_1_D6"] = Key{K["KEY_SEMICOLON"], K["MODIFIERKEY_SHIFT"]}
l["ISO_8859_1_DC"] = Key{K["KEY_LEFT_BRACE"], K["MODIFIERKEY_SHIFT"]}
l["ISO_8859_1_DF"] = Key{K["KEY_MINUS"], K[""]}
l["ISO_8859_1_E4"] = Key{K["KEY_QUOTE"], K[""]}
l["ISO_8859_1_F6"] = Key{K["KEY_SEMICOLON"], K[""]}
l["ISO_8859_1_FC"] = Key{K["KEY_LEFT_BRACE"], K[""]}
l["UNICODE_20AC"] = Key{K["KEY_E"], K["MODIFIERKEY_RIGHT_ALT"]}
Langs["de"] = l
}

146
pkg/lang/keyboard.go Normal file
View file

@ -0,0 +1,146 @@
package lang
var K = map[string]byte{
"": 0,
"MODIFIERKEY_CTRL": 0x01,
"MODIFIERKEY_SHIFT": 0x02,
"MODIFIERKEY_ALT": 0x04,
"MODIFIERKEY_GUI": 0x08,
"MODIFIERKEY_LEFT_CTRL": 0x01,
"MODIFIERKEY_LEFT_SHIFT": 0x02,
"MODIFIERKEY_LEFT_ALT": 0x04,
"MODIFIERKEY_LEFT_GUI": 0x08,
"MODIFIERKEY_RIGHT_CTRL": 0x10,
"MODIFIERKEY_RIGHT_SHIFT": 0x20,
"MODIFIERKEY_RIGHT_ALT": 0x40,
"MODIFIERKEY_RIGHT_GUI": 0x80,
"KEY_MEDIA_VOLUME_INC": 0x80,
"KEY_MEDIA_VOLUME_DEC": 0x81,
"KEY_MEDIA_MUTE": 0x7F,
"KEY_MEDIA_PLAY_PAUSE": 0x08,
"KEY_MEDIA_NEXT_TRACK": 0x10,
"KEY_MEDIA_PREV_TRACK": 0x20,
"KEY_A": 4,
"KEY_B": 5,
"KEY_C": 6,
"KEY_D": 7,
"KEY_E": 8,
"KEY_F": 9,
"KEY_G": 10,
"KEY_H": 11,
"KEY_I": 12,
"KEY_J": 13,
"KEY_K": 14,
"KEY_L": 15,
"KEY_M": 16,
"KEY_N": 17,
"KEY_O": 18,
"KEY_P": 19,
"KEY_Q": 20,
"KEY_R": 21,
"KEY_S": 22,
"KEY_T": 23,
"KEY_U": 24,
"KEY_V": 25,
"KEY_W": 26,
"KEY_X": 27,
"KEY_Y": 28,
"KEY_Z": 29,
"KEY_1": 30,
"KEY_2": 31,
"KEY_3": 32,
"KEY_4": 33,
"KEY_5": 34,
"KEY_6": 35,
"KEY_7": 36,
"KEY_8": 37,
"KEY_9": 38,
"KEY_0": 39,
"KEY_ENTER": 40,
"KEY_ESC": 41,
"KEY_BACKSPACE": 42,
"KEY_TAB": 43,
"KEY_SPACE": 44,
"KEY_MINUS": 45,
"KEY_EQUAL": 46,
"KEY_LEFT_BRACE": 47,
"KEY_RIGHT_BRACE": 48,
"KEY_BACKSLASH": 49,
"KEY_NON_US_NUM": 50,
"KEY_SEMICOLON": 51,
"KEY_QUOTE": 52,
"KEY_TILDE": 53,
"KEY_COMMA": 54,
"KEY_PERIOD": 55,
"KEY_SLASH": 56,
"KEY_CAPS_LOCK": 57,
"KEY_F1": 58,
"KEY_F2": 59,
"KEY_F3": 60,
"KEY_F4": 61,
"KEY_F5": 62,
"KEY_F6": 63,
"KEY_F7": 64,
"KEY_F8": 65,
"KEY_F9": 66,
"KEY_F10": 67,
"KEY_F11": 68,
"KEY_F12": 69,
"KEY_PRINTSCREEN": 70,
"KEY_SCROLL_LOCK": 71,
"KEY_PAUSE": 72,
"KEY_INSERT": 73,
"KEY_HOME": 74,
"KEY_PAGEUP": 75,
"KEY_DELETE": 76,
"KEY_END": 77,
"KEY_PAGEDOWN": 78,
"KEY_RIGHT": 79,
"KEY_LEFT": 80,
"KEY_DOWN": 81,
"KEY_UP": 82,
"KEY_NUM_LOCK": 83,
"KEYPAD_SLASH": 84,
"KEYPAD_ASTERIX": 85,
"KEYPAD_MINUS": 86,
"KEYPAD_PLUS": 87,
"KEYPAD_ENTER": 88,
"KEYPAD_EQUALS": 103,
"KEYPAD_1": 89,
"KEYPAD_2": 90,
"KEYPAD_3": 91,
"KEYPAD_4": 92,
"KEYPAD_5": 93,
"KEYPAD_6": 94,
"KEYPAD_7": 95,
"KEYPAD_8": 96,
"KEYPAD_9": 97,
"KEYPAD_0": 98,
"KEYPAD_PERIOD": 99,
"KEY_APP": 0x65,
"KEY_POWER": 0x66,
"KEY_EXE": 0x74,
"KEY_HELP": 0x75,
"KEY_MENU": 0x76,
"KEY_SELECT": 0x77,
"KEY_STOP": 0x78,
"KEY_AGAIN": 0x79,
"KEY_UNDO": 0x7A,
"KEY_CUT": 0x7B,
"KEY_COPY": 0x7C,
"KEY_PASTE": 0x7D,
"KEY_FIND": 0x7E,
"KEY_SYSTEM_POWER": 0x81,
"KEY_SYSTEM_SLEEP": 0x82,
"KEY_SYSTEM_WAKE": 0x83,
"KEYPAD_PIPE": 0xC9,
"KEY_LEFT_CTRL": 0xE0,
"KEY_LEFT_SHIFT": 0xE1,
"KEY_LEFT_ALT": 0xE2,
"KEY_LEFT_GUI": 0xE3,
"KEY_COMMAND": 0xE3,
"KEY_RIGHT_CTRL": 0xE4,
"KEY_RIGHT_SHIFT": 0xE5,
"KEY_RIGHT_ALT": 0xE6,
"KEY_RIGHT_GUI": 0xE7,
}

10
pkg/lang/lang.go Normal file
View file

@ -0,0 +1,10 @@
package lang
var Langs = make(map[string]Lang)
type Lang map[string]Key
type Key struct {
Key byte
Mod byte
}