PROGRESS! mostly ui, got admin stuff

This commit is contained in:
Rusty Striker 2025-07-27 21:19:50 +03:00
parent 2658f3d28c
commit e730f9a870
Signed by: RustyStriker
GPG key ID: 87E4D691632DFF15
6 changed files with 198 additions and 68 deletions

View file

@ -16,6 +16,7 @@ pub enum Request {
Login(login::LoginRequest),
Quit,
Kick(String),
Save,
Shutdown,
// Character stuff
CreateCharacter,
@ -57,12 +58,15 @@ pub enum Request {
grid_cell_size: f32,
grid_offset: [f32; 2],
},
SceneSetVisible {
SetSceneVisible {
scene: usize,
visible: bool,
},
GetScene {
id: usize,
scene: usize,
},
ShowScene {
scene: usize,
},
/// TODO: Perhaps remove it, as the client should auto get it on login and on scene list updates
GetSceneList,
@ -101,7 +105,7 @@ pub enum Response {
grid_offset: Option<[f32; 2]>,
},
SceneList {
scenes: Vec<(usize, String)>,
scenes: Vec<(usize, String, bool)>,
},
MoveToken {
token_id: usize,
@ -110,6 +114,7 @@ pub enum Response {
},
SpawnToken(SpawnToken),
CharacterCreated(usize),
ConnectedPlayers(Vec<String>),
Quit {
id: String,
},

View file

@ -69,6 +69,7 @@ impl GameServer {
}
pub async fn save(&self) {
println!("Saving game data!");
let _ = tokio::fs::create_dir("data").await;
if let Ok(json) = serde_json::to_string(self) {
let _ = tokio::fs::write(GAME_SAVE_FILE, json.as_bytes()).await;
@ -108,6 +109,8 @@ impl GameServer {
// Send the list of scenes and chat history and such
_ = broadcast.send((SendTo::User(login.username.clone()), self.get_scene_list(admin)));
_ = broadcast.send((SendTo::User(login.username.clone()), self.get_last_messages(50)));
let c = self.users.keys().cloned().collect();
_ = broadcast.send((SendTo::All, api::Response::ConnectedPlayers(c)))
} else {
_ = broadcast.send((
SendTo::User(id.clone()),
@ -163,11 +166,26 @@ impl GameServer {
}
}
}
api::Request::GetScene { id: scene_id } => {
if let Some(response) = self.get_scene(&id, scene_id) {
api::Request::GetScene { scene } => {
if let Some(response) = self.get_scene(&id, scene) {
_ = broadcast.send((SendTo::User(id), response));
}
}
api::Request::ShowScene { scene } => {
if self.is_admin(&id) {
if let Some(s) = self.game.get_scene_mut(scene) {
// Force visible to players
if !s.visible_to_users {
s.visible_to_users = true;
_ = broadcast.send((SendTo::AllBut(id.clone()), self.get_scene_list(false)));
_ = broadcast.send((SendTo::User(id.clone()), self.get_scene_list(true)));
}
}
if let Some(response) = self.get_scene(&id, scene) {
_ = broadcast.send((SendTo::All, response))
}
}
}
api::Request::CreateScene { title } => {
if self.is_admin(&id) {
self.game.create_scene(title);
@ -197,7 +215,7 @@ impl GameServer {
}
}
}
api::Request::SceneSetVisible { scene, visible } => {
api::Request::SetSceneVisible { scene, visible } => {
if self.is_admin(&id) {
self.game.scene_visible(scene, visible);
_ = broadcast.send((SendTo::AllBut(id.clone()), self.get_scene_list(false)));
@ -272,19 +290,24 @@ impl GameServer {
if self.users.contains_key(&id) {
self.users.remove(&id);
}
_ = broadcast.send((SendTo::All, api::Response::Quit { id }));
// _ = broadcast.send((SendTo::All, api::Response::Quit { id }));
let c = self.users.keys().cloned().collect();
_ = broadcast.send((SendTo::All, api::Response::ConnectedPlayers(c)))
}
api::Request::Kick(id) => {
if self.users.contains_key(&id) {
self.users.remove(&id);
}
_ = broadcast.send((SendTo::User(id), api::Response::Shutdown));
let c = self.users.keys().cloned().collect();
_ = broadcast.send((SendTo::All, api::Response::ConnectedPlayers(c)))
}
api::Request::Shutdown => {
if self.is_admin(&id) {
break;
}
}
api::Request::Save => self.save().await,
api::Request::CharacterDisplay { id: _ } => {}
api::Request::CharacterInputs { id: _ } => todo!(),
api::Request::CharacterGetField { id: _, field: _ } => todo!(),
@ -313,7 +336,7 @@ impl GameServer {
.map(|id| self.game.get_scene(*id).map(|s| (id, s)))
.flatten()
.filter(|(_, scene)| admin || scene.visible_to_users)
.map(|(id, s)| (*id, s.title.to_string()))
.map(|(id, s)| (*id, s.title.to_string(), s.visible_to_users))
.collect::<Vec<_>>();
api::Response::SceneList { scenes }
}