sf-api 0.3.0

A simple API to send commands to the Shakes & Fidget servers and parse their responses into characters
Documentation
#![allow(unused)]
use std::{borrow::Borrow, time::Duration};

use chrono::{DateTime, Local};
use sf_api::{
    command::{Command, ExpeditionSetting, TimeSkip},
    gamestate::{
        items::{Enchantment, EquipmentSlot},
        tavern::{AvailableTasks, CurrentAction},
        unlockables::HellevatorStatus,
    },
    misc::EnumMapGet,
    session::SimpleSession,
};
use sha1::digest::Update;
use tokio::time::sleep;

#[tokio::main]
pub async fn main() {
    let mut session = login_with_env().await;

    loop {
        sleep(Duration::from_secs(2)).await;
        let gs = session.game_state().unwrap();

        if gs.character.level < 10 {
            println!("Character level too low");
            break;
        }

        let hellevator = match gs.hellevator.status() {
            HellevatorStatus::RewardClaimable => {
                session
                    .send_command(Command::HellevatorClaimFinal)
                    .await
                    .unwrap();
                continue;
            }
            HellevatorStatus::NotEntered => {
                session
                    .send_command(Command::HellevatorEnter)
                    .await
                    .unwrap();
                continue;
            }
            HellevatorStatus::NotAvailable => {
                println!("Hellevator is not available currently");
                break;
            }
            HellevatorStatus::Active(h) => h,
        };
    }
}

pub fn time_remaining<T: Borrow<DateTime<Local>>>(time: T) -> Duration {
    (*time.borrow() - Local::now()).to_std().unwrap_or_default()
}

pub async fn login_with_env() -> SimpleSession {
    let username = std::env::var("USERNAME").unwrap();
    let password = std::env::var("PASSWORD").unwrap();
    let server = std::env::var("SERVER").unwrap();
    SimpleSession::login(&username, &password, &server)
        .await
        .unwrap()
}