use serde::{Deserialize, Serialize}; use crate::error::RpcResult; use crate::game::AccountRef; #[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct DeviceInfo { #[serde(default)] pub udid: Option, #[serde(default)] pub open_udid: Option, #[serde(default)] pub device: Option, #[serde(default)] pub os_version: Option, #[serde(default)] pub android: bool, #[serde(default)] pub preferred_language: String, #[serde(default)] pub client_major_version: i32, #[serde(default)] pub client_minor_version: i32, #[serde(default)] pub client_build: i32, #[serde(default)] pub resource_sha: Option, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct Session { pub account: AccountRef, pub pass_token: String, pub session_count: i32, pub play_time_seconds: i32, pub days_since_started_playing: i32, pub account_created_date: String, pub server_time: String, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(tag = "outcome", rename_all = "snake_case")] pub enum LoginOutcome { Accepted(Session), Rejected { error_code: i32, message: Option, }, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(tag = "op", rename_all = "snake_case")] pub enum AuthRequest { Login { account: AccountRef, pass_token: Option, device: DeviceInfo, }, Resolve { account: AccountRef, }, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(tag = "result", rename_all = "snake_case")] pub enum AuthResponse { Login(LoginOutcome), Resolved { known: bool }, } #[async_trait::async_trait] pub trait AuthApi: Send + Sync + 'static { async fn login( &self, account: AccountRef, pass_token: Option, device: DeviceInfo, ) -> RpcResult; async fn resolve(&self, account: AccountRef) -> RpcResult; }