scroll.server/services/service-rpc/src/auth.rs
WiseDev 972c61dae7 replace command enum with a dyn trait + registry
new logic-derive Command macro submits each command to inventory, manager decodes by vint type. titan-derive loses tagged enums since nothing uses them now. rest of the diff is rustfmt.
2026-08-23 08:05:58 +03:00

73 lines
2 KiB
Rust

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<String>,
#[serde(default)]
pub open_udid: Option<String>,
#[serde(default)]
pub device: Option<String>,
#[serde(default)]
pub os_version: Option<String>,
#[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<String>,
}
#[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<String>,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "op", rename_all = "snake_case")]
pub enum AuthRequest {
Login {
account: AccountRef,
pass_token: Option<String>,
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<String>,
device: DeviceInfo,
) -> RpcResult<LoginOutcome>;
async fn resolve(&self, account: AccountRef) -> RpcResult<bool>;
}