use crate::{
result::PebblesError,
Service,
};
use rand::Rng;
use serde_json::json;
use std::rc::Rc;
use std::fmt;
pub struct Keyboard {
service: Rc<Service>,
}
impl Keyboard {
pub fn new(service: Rc<Service>) -> Self {
Keyboard {
service,
}
}
pub fn down(&self, key:&str) -> Result<(), PebblesError> {
let actions = json!({"actions":[
{
"type": "key",
"id": "key",
"actions": [{
"type": "keyDown",
"value": key
}]
}
]});
self.service.post("/actions", &actions)?;
Ok(())
}
pub fn up(&self, key:&str) -> Result<(), PebblesError> {
let actions = json!({"actions":[
{
"type": "key",
"id": "key",
"actions": [{
"type": "keyUp",
"value": key
}]
}
]});
self.service.post("/actions", &actions)?;
Ok(())
}
pub fn type_keys(&self, keys:&str) -> Result<(), PebblesError> {
let mut rng = rand::thread_rng();
let max_pause: i32 = 120;
let min_pause: i32 = 50;
let mut pause_duration: i32 = rng.gen_range(min_pause..max_pause);
let mut actions = json!({"actions":[
{
"type": "key",
"id": "key",
"actions": []
}
]});
for key in keys.chars() {
if rng.gen_range(1..3) == 1 {
pause_duration = rng.gen_range(min_pause..max_pause);
}
let new_action = vec![
json!({
"type": "keyDown",
"value": key
}),
json!({
"type": "pause",
"duration": pause_duration
}),
json!({
"type": "keyUp",
"value": key
}),
json!({
"type": "pause",
"duration": if key != ' ' {pause_duration} else {(pause_duration as f32 * rng.gen_range(1.0..3.0)) as i32}
})
];
if let Some(actions_array) = actions["actions"][0]["actions"].as_array_mut() {
actions_array.extend(new_action);
}
}
self.service.post("/actions", &actions)?;
Ok(())
}
}
pub enum Keys {
Null,
Cancel,
Help,
BackSpace,
Tab,
Clear,
Return,
Enter,
Shift,
Control,
Alt,
Pause,
Escape,
Space,
PageUp,
PageDown,
End,
Home,
Left,
Up,
Right,
Down,
Insert,
Delete,
Semicolon,
Equals,
Numpad0,
Numpad1,
Numpad2,
Numpad3,
Numpad4,
Numpad5,
Numpad6,
Numpad7,
Numpad8,
Numpad9,
Multiply,
Add,
Separator,
Subtract,
Decimal,
Divide,
F1,
F2,
F3,
F4,
F5,
F6,
F7,
F8,
F9,
F10,
F11,
F12,
Meta,
Command,
ZenkakuHankaku,
}
impl fmt::Display for Keys {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Keys::Null => write!(f, "\u{e000}"),
Keys::Cancel => write!(f, "\u{e001}"),
Keys::Help => write!(f, "\u{e002}"),
Keys::BackSpace => write!(f, "\u{e003}"),
Keys::Tab => write!(f, "\u{e004}"),
Keys::Clear => write!(f, "\u{e005}"),
Keys::Return => write!(f, "\u{e006}"),
Keys::Enter => write!(f, "\u{e007}"),
Keys::Shift => write!(f, "\u{e008}"),
Keys::Control => write!(f, "\u{e009}"),
Keys::Alt => write!(f, "\u{e00a}"),
Keys::Pause => write!(f, "\u{e00b}"),
Keys::Escape => write!(f, "\u{e00c}"),
Keys::Space => write!(f, "\u{e00d}"),
Keys::PageUp => write!(f, "\u{e00e}"),
Keys::PageDown => write!(f, "\u{e00f}"),
Keys::End => write!(f, "\u{e010}"),
Keys::Home => write!(f, "\u{e011}"),
Keys::Left => write!(f, "\u{e012}"),
Keys::Up => write!(f, "\u{e013}"),
Keys::Right => write!(f, "\u{e014}"),
Keys::Down => write!(f, "\u{e015}"),
Keys::Insert => write!(f, "\u{e016}"),
Keys::Delete => write!(f, "\u{e017}"),
Keys::Semicolon => write!(f, "\u{e018}"),
Keys::Equals => write!(f, "\u{e019}"),
Keys::Numpad0 => write!(f, "\u{e01a}"),
Keys::Numpad1 => write!(f, "\u{e01b}"),
Keys::Numpad2 => write!(f, "\u{e01c}"),
Keys::Numpad3 => write!(f, "\u{e01d}"),
Keys::Numpad4 => write!(f, "\u{e01e}"),
Keys::Numpad5 => write!(f, "\u{e01f}"),
Keys::Numpad6 => write!(f, "\u{e020}"),
Keys::Numpad7 => write!(f, "\u{e021}"),
Keys::Numpad8 => write!(f, "\u{e022}"),
Keys::Numpad9 => write!(f, "\u{e023}"),
Keys::Multiply => write!(f, "\u{e024}"),
Keys::Add => write!(f, "\u{e025}"),
Keys::Separator => write!(f, "\u{e026}"),
Keys::Subtract => write!(f, "\u{e027}"),
Keys::Decimal => write!(f, "\u{e028}"),
Keys::Divide => write!(f, "\u{e029}"),
Keys::F1 => write!(f, "\u{e031}"),
Keys::F2 => write!(f, "\u{e032}"),
Keys::F3 => write!(f, "\u{e033}"),
Keys::F4 => write!(f, "\u{e034}"),
Keys::F5 => write!(f, "\u{e035}"),
Keys::F6 => write!(f, "\u{e036}"),
Keys::F7 => write!(f, "\u{e037}"),
Keys::F8 => write!(f, "\u{e038}"),
Keys::F9 => write!(f, "\u{e039}"),
Keys::F10 => write!(f, "\u{e03a}"),
Keys::F11 => write!(f, "\u{e03b}"),
Keys::F12 => write!(f, "\u{e03c}"),
Keys::Meta => write!(f, "\u{e03d}"),
Keys::Command => write!(f, "\u{e03d}"),
Keys::ZenkakuHankaku => write!(f, "\u{e040}"),
}
}
}