mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Separated the registration system into two files
This commit is contained in:
parent
db9991ce6d
commit
c28ac78e03
@ -24,6 +24,7 @@ pub mod login_provider;
|
||||
pub mod metrics;
|
||||
pub mod persistence;
|
||||
pub mod presence;
|
||||
mod register;
|
||||
pub mod rtsim;
|
||||
pub mod settings;
|
||||
pub mod state_ext;
|
||||
@ -68,9 +69,8 @@ use common::{
|
||||
};
|
||||
use common_net::{
|
||||
msg::{
|
||||
CharacterInfo, ClientRegister, ClientType, DisconnectReason, PlayerInfo, PlayerListUpdate,
|
||||
RegisterError, ServerGeneral, ServerInfo, ServerInit, ServerMsg, ServerRegisterAnswer,
|
||||
WorldMapMsg,
|
||||
CharacterInfo, ClientType, DisconnectReason, PlayerInfo, PlayerListUpdate, ServerGeneral,
|
||||
ServerInfo, ServerInit, ServerMsg, WorldMapMsg,
|
||||
},
|
||||
sync::WorldSyncExt,
|
||||
};
|
||||
@ -87,11 +87,7 @@ use persistence::{
|
||||
use plugin_api::Uid;
|
||||
use prometheus::Registry;
|
||||
use prometheus_hyper::Server as PrometheusServer;
|
||||
use specs::{
|
||||
join::Join,
|
||||
shred::{Fetch, FetchMut},
|
||||
Builder, Entity as EcsEntity, RunNow, SystemData, WorldExt, WriteStorage,
|
||||
};
|
||||
use specs::{join::Join, Builder, Entity as EcsEntity, RunNow, SystemData, WorldExt};
|
||||
use std::{
|
||||
i32,
|
||||
ops::{Deref, DerefMut},
|
||||
@ -923,70 +919,6 @@ impl Server {
|
||||
self.state.cleanup();
|
||||
}
|
||||
|
||||
fn handle_register_msg(
|
||||
world: &specs::World,
|
||||
player_list: &HashMap<Uid, PlayerInfo>,
|
||||
new_players: &mut Vec<specs::Entity>,
|
||||
entity: specs::Entity,
|
||||
client: &Client,
|
||||
player_metrics: &Fetch<'_, PlayerMetrics>,
|
||||
login_provider: &mut FetchMut<'_, LoginProvider>,
|
||||
admins: &mut WriteStorage<'_, Admin>,
|
||||
players: &mut WriteStorage<'_, Player>,
|
||||
editable_settings: &Fetch<'_, EditableSettings>,
|
||||
msg: ClientRegister,
|
||||
) -> Result<(), crate::error::Error> {
|
||||
let plugin_mgr = world.read_resource::<PluginMgr>();
|
||||
let (username, uuid) = match login_provider.try_login(
|
||||
&msg.token_or_username,
|
||||
world,
|
||||
&plugin_mgr,
|
||||
&*editable_settings.admins,
|
||||
&*editable_settings.whitelist,
|
||||
&*editable_settings.banlist,
|
||||
) {
|
||||
Err(err) => {
|
||||
client.send(ServerRegisterAnswer::Err(err))?;
|
||||
return Ok(());
|
||||
},
|
||||
Ok((username, uuid)) => (username, uuid),
|
||||
};
|
||||
|
||||
let player = Player::new(username, uuid);
|
||||
let is_admin = editable_settings.admins.contains(&uuid);
|
||||
|
||||
if !player.is_valid() {
|
||||
// Invalid player
|
||||
client.send(ServerRegisterAnswer::Err(RegisterError::InvalidCharacter))?;
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
if !players.contains(entity) {
|
||||
// Add Player component to this client
|
||||
let _ = players.insert(entity, player);
|
||||
player_metrics.players_connected.inc();
|
||||
|
||||
// Give the Admin component to the player if their name exists in
|
||||
// admin list
|
||||
if is_admin {
|
||||
let _ = admins.insert(entity, Admin);
|
||||
}
|
||||
|
||||
// Tell the client its request was successful.
|
||||
client.send(ServerRegisterAnswer::Ok(()))?;
|
||||
|
||||
// Send initial player list
|
||||
client.send(ServerGeneral::PlayerListUpdate(PlayerListUpdate::Init(
|
||||
player_list.clone(),
|
||||
)))?;
|
||||
|
||||
// Add to list to notify all clients of the new player
|
||||
new_players.push(entity);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn register_run(&mut self) {
|
||||
let world = self.state_mut().ecs_mut();
|
||||
let entities = world.entities();
|
||||
@ -1018,7 +950,7 @@ impl Server {
|
||||
|
||||
for (entity, client) in (&entities, &clients).join() {
|
||||
let _ = sys::msg::try_recv_all(client, 0, |client, msg| {
|
||||
Server::handle_register_msg(
|
||||
register::handle_register_msg(
|
||||
&world,
|
||||
&player_list,
|
||||
&mut new_players,
|
||||
|
80
server/src/register.rs
Normal file
80
server/src/register.rs
Normal file
@ -0,0 +1,80 @@
|
||||
use common::comp::{Admin, Player};
|
||||
use common_net::msg::{
|
||||
ClientRegister, PlayerInfo, PlayerListUpdate, RegisterError, ServerGeneral,
|
||||
ServerRegisterAnswer,
|
||||
};
|
||||
use common_sys::plugin::PluginMgr;
|
||||
use hashbrown::HashMap;
|
||||
use plugin_api::Uid;
|
||||
use specs::{
|
||||
shred::{Fetch, FetchMut},
|
||||
Entity, World, WorldExt, WriteStorage,
|
||||
};
|
||||
|
||||
use crate::{
|
||||
client::Client, login_provider::LoginProvider, metrics::PlayerMetrics, EditableSettings,
|
||||
};
|
||||
|
||||
pub(crate) fn handle_register_msg(
|
||||
world: &World,
|
||||
player_list: &HashMap<Uid, PlayerInfo>,
|
||||
new_players: &mut Vec<Entity>,
|
||||
entity: Entity,
|
||||
client: &Client,
|
||||
player_metrics: &Fetch<'_, PlayerMetrics>,
|
||||
login_provider: &mut FetchMut<'_, LoginProvider>,
|
||||
admins: &mut WriteStorage<'_, Admin>,
|
||||
players: &mut WriteStorage<'_, Player>,
|
||||
editable_settings: &Fetch<'_, EditableSettings>,
|
||||
msg: ClientRegister,
|
||||
) -> Result<(), crate::error::Error> {
|
||||
let plugin_mgr = world.read_resource::<PluginMgr>();
|
||||
let (username, uuid) = match login_provider.try_login(
|
||||
&msg.token_or_username,
|
||||
world,
|
||||
&plugin_mgr,
|
||||
&*editable_settings.admins,
|
||||
&*editable_settings.whitelist,
|
||||
&*editable_settings.banlist,
|
||||
) {
|
||||
Err(err) => {
|
||||
client.send(ServerRegisterAnswer::Err(err))?;
|
||||
return Ok(());
|
||||
},
|
||||
Ok((username, uuid)) => (username, uuid),
|
||||
};
|
||||
|
||||
let player = Player::new(username, uuid);
|
||||
let is_admin = editable_settings.admins.contains(&uuid);
|
||||
|
||||
if !player.is_valid() {
|
||||
// Invalid player
|
||||
client.send(ServerRegisterAnswer::Err(RegisterError::InvalidCharacter))?;
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
if !players.contains(entity) {
|
||||
// Add Player component to this client
|
||||
let _ = players.insert(entity, player);
|
||||
player_metrics.players_connected.inc();
|
||||
|
||||
// Give the Admin component to the player if their name exists in
|
||||
// admin list
|
||||
if is_admin {
|
||||
let _ = admins.insert(entity, Admin);
|
||||
}
|
||||
|
||||
// Tell the client its request was successful.
|
||||
client.send(ServerRegisterAnswer::Ok(()))?;
|
||||
|
||||
// Send initial player list
|
||||
client.send(ServerGeneral::PlayerListUpdate(PlayerListUpdate::Init(
|
||||
player_list.clone(),
|
||||
)))?;
|
||||
|
||||
// Add to list to notify all clients of the new player
|
||||
new_players.push(entity);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
Loading…
Reference in New Issue
Block a user