add cli args

master
bel 2022-09-18 17:41:17 -06:00
parent 7d16adc1ff
commit 1455a93b40
5 changed files with 88 additions and 36 deletions

View File

@ -2,9 +2,10 @@ import random
import time import time
class Bucket: class Bucket:
def __init__(self): def __init__(self, interval):
random.seed(time.time()) random.seed(time.time())
self.name = Bucket.ms_to_bucket(Bucket.now_ms()) self.interval = interval
self.name = self.ms_to_bucket(Bucket.now_ms())
self.content = [] self.content = []
def push(self, v): def push(self, v):
@ -22,9 +23,6 @@ class Bucket:
def now_ms(): def now_ms():
return int(1000 * time.time()) return int(1000 * time.time())
def ms_to_bucket(ms): def ms_to_bucket(self, ms):
return int(int(ms // Bucket.interval()) * Bucket.interval()) return int(int(ms // self.interval) * self.interval)
def interval():
return 100

4
src/log.py Normal file
View File

@ -0,0 +1,4 @@
from sys import stderr
def info(*args):
print(*args, file=stderr)

View File

@ -1,30 +1,65 @@
import reader import reader
import writer import writer
import bucket import bucket
import log
import argparse import argparse
import json
import time
def main(): def main():
ap = argparse.ArgumentParser() ap = argparse.ArgumentParser()
ap.add_argument("--stdin", default=False, action="store_true") ap.add_argument("--stdin", default=False, action="store_true")
ap.add_argument("--interval", default=250, type=int)
ap.add_argument("--max-keys-down", default=2, type=int)
ap.add_argument("--startup", default=3, type=int)
ap.add_argument("--controller-setup", default=False, action="store_true")
ap.add_argument("--translation", default=json.dumps({
"up": {"key": "w", "weight": 20},
"down": {"key": "s", "weight": 1},
"left": {"key": "a", "weight": 1},
"right": {"key": "d", "weight": 20},
}))
args = ap.parse_args() args = ap.parse_args()
w_translation = json.loads(args.translation) if args.translation else None
w = writer.Writer(writer.PyAutoGUIWriter(w_translation))
if args.controller_setup:
stdin = reader.StdinReader()
for k in w_translation.keys():
log.info(f"===configuring '{k}' in===")
for i in range(3, 0, -1):
log.info(f" {i}")
time.sleep(1)
w.write(k)
time.sleep(1)
w.write([])
time.sleep(1)
log.info(f"/configured '{k}', [ENTER] to continue")
while not stdin.read():
time.sleep(.1)
exit(0)
r = reader.Reader(reader.StdinReader()) r = reader.Reader(reader.StdinReader())
if not args.stdin: if not args.stdin:
r = reader.Reader(reader.RandomReader()) r = reader.Reader(reader.RandomReader(w_translation))
w = writer.Writer(writer.MultiWriter( bkt = bucket.Bucket(args.interval)
#writer.StdoutWriter(),
writer.PyAutoGUIWriter(), log.info("starting in")
)) for i in range(args.startup, 0, -1):
bkt = bucket.Bucket() log.info("...", i)
time.sleep(1)
log.info("go")
for line in r.read(): for line in r.read():
latest_bkt = bucket.Bucket() latest_bkt = bucket.Bucket(args.interval)
if latest_bkt.name != bkt.name: if latest_bkt.name != bkt.name:
picked = bkt.pick_n(2) picked = bkt.pick_n(args.max_keys_down)
w.write(picked) w.write(picked)
bkt = latest_bkt bkt = latest_bkt
bkt.push(line) bkt.push(line)
print("closing writer") log.info("closing writer")
w.close() w.close()
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -4,6 +4,7 @@ import time
import sys import sys
import select import select
import random import random
import log
__interval__ = .1 __interval__ = .1
@ -30,7 +31,8 @@ class Reader:
self.q.put_nowait(self.foo()) self.q.put_nowait(self.foo())
except queue.Full: except queue.Full:
pass pass
time.sleep(__interval__/2.0) except StopIteration:
self.stop()
reader = async_reader(q, self.reader.read) reader = async_reader(q, self.reader.read)
reader.start() reader.start()
@ -49,28 +51,42 @@ class Reader:
reader.join() reader.join()
class StdinReader: class StdinReader:
def __init__(self):
self.__closed__ = False
def read(self): def read(self):
if self.__closed__:
raise StopIteration
try: try:
if select.select([sys.stdin,],[],[],__interval__/2.0)[0]: if select.select([sys.stdin,],[],[],__interval__/2.0)[0]:
line = sys.stdin.readline() line = sys.stdin.readline()
self.__closed__ = not line
return line return line
except Exception as e: except Exception as e:
pass pass
return None return None
class RandomReader: class RandomReader:
def __init__(self, keys={"a":{"weight":1}, "b":{"weight":1}}):
self.keys = keys
self.weighted_keys = []
for k in self.keys:
weight = int(self.keys[k]["weight"] * 1000)
self.weighted_keys.extend([k] * weight)
log.info("weighted keys", self.weighted_keys)
def read(self): def read(self):
seed = random.randint(0, 99) return self.weighted_keys[
if seed < 10: random.randint(0, len(self.weighted_keys)-1)
return "a" ]
elif seed < 50:
return "B"
else:
return "b"
class FileReader: class FileReader:
def __init__(self, path): def __init__(self, path):
self.f = open(path, "r") self.f = open(path, "r")
self.__closed__ = False
def read(self): def read(self):
return self.f.readline() if self.__closed__:
raise StopIteration
result = self.f.readline()
result = not self.__closed__

View File

@ -1,6 +1,7 @@
import time import time
import json import json
import pyautogui import pyautogui
import log
class Writer: class Writer:
def __init__(self, writer): def __init__(self, writer):
@ -16,6 +17,7 @@ class Writer:
def close(self): def close(self):
self.writer.write(Line([])) self.writer.write(Line([]))
time.sleep(.2)
class MultiWriter: class MultiWriter:
def __init__(self, *writers): def __init__(self, *writers):
@ -30,14 +32,11 @@ class StdoutWriter:
print(v) print(v)
class PyAutoGUIWriter: class PyAutoGUIWriter:
translation = { def __init__(self, optional_translation):
"a": "f24", pyautogui.FAILSAFE = False
"b": "f23",
}
def __init__(self):
self.keys_down = set() self.keys_down = set()
print(json.dumps(PyAutoGUIWriter.translation, indent=" ")) self.translation = optional_translation
log.info(json.dumps(self.translation, indent=" "))
def write(self, v): def write(self, v):
to_push = set() to_push = set()
@ -50,21 +49,21 @@ class PyAutoGUIWriter:
self.release(key) self.release(key)
for key in to_push: for key in to_push:
self.push(key) self.push(key)
print("PUSHING", self.keys_down) log.info("PUSHING", self.keys_down)
# https://pyautogui.readthedocs.io/en/latest/keyboard.html#keyboard-keys # https://pyautogui.readthedocs.io/en/latest/keyboard.html#keyboard-keys
def translate(self, v): def translate(self, v):
result = PyAutoGUIWriter.translation.get(v, None) result = self.translation.get(v, {}).get("key")
if result: if result:
return result return result
def push(self, k): def push(self, k):
self.keys_down.add(k) self.keys_down.add(k)
#pyautogui.keyDown(k) pyautogui.keyDown(k)
def release(self, k): def release(self, k):
self.keys_down.remove(k) self.keys_down.remove(k)
#pyautogui.keyUp(k) pyautogui.keyUp(k)
class Line: class Line:
def __init__(self, v): def __init__(self, v):