See https://docs.rs/tokio/latest/tokio/sync/struct.Mutex.html\#which-kind-of-mutex-should-you-use (same applies for RwLock). We don't need an asynchronous Mutex/RwLock for data.
70 lines
1.7 KiB
Rust
70 lines
1.7 KiB
Rust
use std::time::{SystemTime, UNIX_EPOCH};
|
|
|
|
use super::*;
|
|
use crate::{
|
|
game::util,
|
|
net::session::{AccountUID, PlayerUID},
|
|
};
|
|
|
|
const DEFAULT_ACCOUNT_ID: u64 = 1;
|
|
|
|
pub async fn on_rpc_login(session: &NetworkSession, arg: &RpcLoginArg) -> Result<RpcLoginRet> {
|
|
tracing::info!("Received rpc login arg: {}", arg.account_name);
|
|
|
|
match session.logged_in(
|
|
AccountUID(DEFAULT_ACCOUNT_ID),
|
|
util::create_default_account(DEFAULT_ACCOUNT_ID),
|
|
) {
|
|
Ok(()) => Ok(RpcLoginRet::new(
|
|
session.ns_prop_mgr.serialize_account_info(),
|
|
)),
|
|
Err(_) => Ok(RpcLoginRet::error(ErrorCode::RepeatedLogin, Vec::new())),
|
|
}
|
|
}
|
|
|
|
pub async fn on_rpc_create_player(
|
|
session: &NetworkSession,
|
|
_arg: &RpcCreatePlayerArg,
|
|
) -> Result<RpcCreatePlayerRet> {
|
|
let account_uid = session.account_uid();
|
|
let player_count = session
|
|
.ns_prop_mgr
|
|
.account_info
|
|
.read()
|
|
.players
|
|
.as_ref()
|
|
.unwrap()
|
|
.len();
|
|
|
|
let player_uid = PlayerUID::new(account_uid, player_count + 1);
|
|
session
|
|
.ns_prop_mgr
|
|
.account_info
|
|
.write()
|
|
.players
|
|
.as_mut()
|
|
.unwrap()
|
|
.push(player_uid.raw());
|
|
|
|
Ok(RpcCreatePlayerRet::new(player_uid.raw()))
|
|
}
|
|
|
|
pub async fn on_ptc_get_server_timestamp(
|
|
_session: &NetworkSession,
|
|
_arg: &PtcGetServerTimestampArg,
|
|
) -> Result<PtcGetServerTimestampRet> {
|
|
Ok(PtcGetServerTimestampRet::new(
|
|
SystemTime::now()
|
|
.duration_since(UNIX_EPOCH)
|
|
.unwrap()
|
|
.as_millis() as u64,
|
|
0,
|
|
))
|
|
}
|
|
|
|
pub async fn on_rpc_keep_alive(
|
|
_session: &NetworkSession,
|
|
_arg: &RpcKeepAliveArg,
|
|
) -> Result<RpcKeepAliveRet> {
|
|
Ok(RpcKeepAliveRet::new())
|
|
}
|