aafk-sober 0.2.2

Anti-AFK application for Sober (Roblox on Linux)
use evdev::{
    InputEvent, Key, RelativeAxisType, uinput::VirtualDevice, uinput::VirtualDeviceBuilder,
};

pub fn create_keyboard_device() -> Result<VirtualDevice, String> {
    let mut keys = evdev::AttributeSet::<Key>::new();
    keys.insert(Key::KEY_SPACE);
    keys.insert(Key::KEY_W);
    keys.insert(Key::KEY_A);
    keys.insert(Key::KEY_S);
    keys.insert(Key::KEY_D);
    keys.insert(Key::KEY_I);
    keys.insert(Key::KEY_O);

    VirtualDeviceBuilder::new()
        .map_err(|e: std::io::Error| e.to_string())?
        .name("AntiAFK Virtual Keyboard")
        .with_keys(&keys)
        .map_err(|e: std::io::Error| e.to_string())?
        .build()
        .map_err(|e: std::io::Error| format!("Keyboard creation failed: {e}. Run: sudo chmod 666 /dev/uinput"))
}

pub fn create_mouse_device() -> Result<VirtualDevice, String> {
    let mut rel_axes = evdev::AttributeSet::<RelativeAxisType>::new();
    rel_axes.insert(RelativeAxisType::REL_X);
    rel_axes.insert(RelativeAxisType::REL_Y);

    let mut keys = evdev::AttributeSet::<Key>::new();
    keys.insert(Key::BTN_LEFT);

    VirtualDeviceBuilder::new()
        .map_err(|e: std::io::Error| e.to_string())?
        .name("AntiAFK Virtual Mouse")
        .with_relative_axes(&rel_axes)
        .map_err(|e: std::io::Error| e.to_string())?
        .with_keys(&keys)
        .map_err(|e: std::io::Error| e.to_string())?
        .build()
        .map_err(|e: std::io::Error| format!("Mouse creation failed: {e}. Check permissions."))
}

pub fn emit_key(device: &mut VirtualDevice, key: Key, pressed: bool) -> Result<(), std::io::Error> {
    device.emit(&[
        InputEvent::new(evdev::EventType::KEY, key.code(), i32::from(pressed)),
        InputEvent::new(evdev::EventType::SYNCHRONIZATION, 0, 0),
    ])
}