clicker 0.1.0

A simple desktop automation tool
mod parse;

use device_query::*;
use enigo::*;
use log::*;
use parse::*;
use rand::Rng;
use std::{thread, time};
use structopt::*;

#[derive(StructOpt)]
#[structopt(name = "clicker", about = "A simple desktop automation tool")]
struct Opt {
    #[structopt(name = "delay", default_value = "70")]
    delay: u64,
    #[structopt(name = "click_time", default_value = "5")]
    click_time: u64,
    #[structopt(
        short = "k",
        long = "key",
        default_value = "F4",
        parse(try_from_str = "parse_keycode")
    )]
    key: Keycode,
    #[structopt(
        short = "b",
        long = "button",
        default_value = "Left",
        parse(try_from_str = "parse_mousebutton")
    )]
    button: MouseButton,
    #[structopt(short = "r", long = "random", default_value = "5")]
    random: u64,
}

fn main() {
    env_logger::init();
    let opt = Opt::from_args();
    let mut enigo = Enigo::new();
    let device_state = DeviceState::new();
    let mut rng = rand::thread_rng();
    loop {
        let keys: Vec<Keycode> = device_state.get_keys();
        if keys.contains(&opt.key) {
            enigo.mouse_down(opt.button);
            thread::sleep(time::Duration::from_millis(opt.click_time));
            enigo.mouse_up(opt.button);
            info!("Clicked mouse button");
        }
        let sleep_time: u64 = if opt.random > 0 {
            opt.delay + rng.gen_range(0, opt.random + 1) - (opt.random / 2)
        } else {
            opt.delay
        };
        thread::sleep(time::Duration::from_millis(sleep_time));
    }
}