platypush/platypush/plugins/inputs/__init__.py
Fabio Manganiello c3337ccc6c
[] Docs deps autogen sphinx plugin.
Added an `add_dependencies` plugin to the Sphinx build process that
parses the manifest files of the scanned backends and plugins and
automatically generates the documentation for the required dependencies
and triggered events.

This means that those dependencies are no longer required to be listed
in the docstring of the class itself.

Also in this commit:

- Black/LINT for some integrations that hadn't been touched in a long
  time.

- Deleted some leftovers from previous refactors (deprecated
  `backend.mqtt`, `backend.zwave.mqtt`, `backend.http.request.rss`).

- Deleted deprecated `inotify` backend - replaced by `file.monitor` (see
  ).
2023-09-24 17:00:08 +02:00

156 lines
4.5 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.
"""
@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: