platypush/platypush/plugins/inputs.py
2019-12-30 21:39:56 +01:00

159 lines
4.6 KiB
Python

from typing import List
from platypush.plugins import Plugin, action
class InputsPlugin(Plugin):
"""
This plugin emulates user input on a keyboard/mouse. It requires the a graphical server (X server or Mac/Win
interface) to be running - it won't work in console mode.
Requires:
* **pyuserinput** (``pip install pyuserinput``)
"""
@staticmethod
def _get_keyboard():
# noinspection PyPackageRequirements
from pykeyboard import PyKeyboard
return PyKeyboard()
@staticmethod
def _get_mouse():
# noinspection PyPackageRequirements
from pymouse import PyMouse
return PyMouse()
@classmethod
def _parse_key(cls, key: str):
k = cls._get_keyboard()
keymap = {
'ctrl': k.control_key,
'alt': k.alt_key,
'meta': k.windows_l_key,
'shift': k.shift_key,
'enter': k.enter_key,
'tab': k.tab_key,
'home': k.home_key,
'end': k.end_key,
'capslock': k.caps_lock_key,
'back': k.backspace_key,
'del': k.delete_key,
'up': k.up_key,
'down': k.down_key,
'left': k.left_key,
'right': k.right_key,
'pageup': k.page_up_key,
'pagedown': k.page_down_key,
'esc': k.escape_key,
'find': k.find_key,
'f1': k.function_keys[1],
'f2': k.function_keys[2],
'f3': k.function_keys[3],
'f4': k.function_keys[4],
'f5': k.function_keys[5],
'f6': k.function_keys[6],
'f7': k.function_keys[7],
'f8': k.function_keys[8],
'f9': k.function_keys[9],
'f10': k.function_keys[10],
'f11': k.function_keys[11],
'f12': k.function_keys[12],
'help': k.help_key,
'media_next': k.media_next_track_key,
'media_prev': k.media_prev_track_key,
'media_play': k.media_play_pause_key,
'menu': k.menu_key,
'numlock': k.num_lock_key,
'print': k.print_key,
'print_screen': k.print_screen_key,
'sleep': k.sleep_key,
'space': k.space_key,
'voldown': k.volume_down_key,
'volup': k.volume_up_key,
'volmute': k.volume_mute_key,
'zoom': k.zoom_key,
}
lkey = key.lower()
if lkey in keymap:
return keymap[lkey]
return key
@action
def press_key(self, key: str):
"""
Emulate the pressure of a key.
:param key: Key to be pressed
"""
kbd = self._get_keyboard()
key = self._parse_key(key)
kbd.press_key(key)
@action
def release_key(self, key: str):
"""
Release a pressed key.
:param key: Key to be released
"""
kbd = self._get_keyboard()
key = self._parse_key(key)
kbd.release_key(key)
@action
def press_keys(self, keys: List[str]):
"""
Emulate the pressure of multiple keys.
:param keys: List of keys to be pressed.
"""
kbd = self._get_keyboard()
keys = [self._parse_key(k) for k in keys]
kbd.press_keys(keys)
@action
def tap_key(self, key: str, repeat: int = 1, interval: float = 0):
"""
Emulate a key tap.
:param key: Key to be pressed
:param repeat: Number of iterations (default: 1)
:param interval: Repeat interval in seconds (default: 0)
"""
kbd = self._get_keyboard()
key = self._parse_key(key)
kbd.tap_key(key, n=repeat, interval=interval)
@action
def type_string(self, string: str, interval: float = 0):
"""
Type a string.
:param string: String to be typed
:param interval: Interval between key strokes in seconds (default: 0)
"""
kbd = self._get_keyboard()
kbd.type_string(string, interval=interval)
@action
def get_screen_size(self) -> List[int]:
"""
Get the size of the screen in pixels.
"""
m = self._get_mouse()
return [m.screen_size()]
@action
def mouse_click(self, x: int, y: int, btn: int, repeat: int = 1):
"""
Mouse click.
:param x: x screen position
:param y: y screen position
:param btn: Button number (1 for left, 2 for right, 3 for middle)
:param repeat: Number of clicks (default: 1)
"""
m = self._get_mouse()
m.click(x, y, btn, n=repeat)
# vim:sw=4:ts=4:et: