cleanup -- don't break the spaghetti edition

This commit is contained in:
Adam 2024-08-05 21:23:28 -04:00
parent 5237b81cab
commit 9f38eafcb1
5 changed files with 40 additions and 48 deletions

View file

@ -3,6 +3,7 @@
use anyhow::{Context, Result}; use anyhow::{Context, Result};
use lib::*; use lib::*;
use rand::prelude::IteratorRandom; use rand::prelude::IteratorRandom;
use rand::prelude::SliceRandom;
use rand::thread_rng; use rand::thread_rng;
use serde::Deserialize; use serde::Deserialize;
use std::{ use std::{
@ -14,9 +15,29 @@ use std::{
}; };
use tokio::sync::broadcast; use tokio::sync::broadcast;
pub mod websocket; pub mod websocket;
pub mod meta;
pub mod user; /// User
use crate::user::*; #[derive(Default, Debug, Eq, PartialEq, Hash)]
pub struct User {
pub name: String,
}
impl User {
/// Create a new user object from incoming data
pub fn new(state: &Arc<AppState>) -> User {
User {
name: format!(
"{} {}",
state.first_names.choose(&mut rand::thread_rng()).unwrap(),
state.last_names.choose(&mut rand::thread_rng()).unwrap(),
),
}
}
pub fn change_name(&mut self, new_name: String) {
self.name = new_name;
}
}
/// Card Set /// Card Set
#[derive(Debug)] #[derive(Debug)]
@ -332,18 +353,13 @@ pub fn load_names(path: &str) -> Result<Vec<String>> {
// Our shared state // Our shared state
pub struct AppState { pub struct AppState {
// We require unique usernames. This tracks which usernames have been taken. pub tx: broadcast::Sender<String>,
pub first_names: Vec<String>,
pub last_names: Vec<String>,
pub reserved_names: RwLock<HashSet<String>>, pub reserved_names: RwLock<HashSet<String>>,
pub online_users: RwLock<HashMap<SocketAddr, Arc<RwLock<User>>>>, pub online_users: RwLock<HashMap<SocketAddr, Arc<RwLock<User>>>>,
pub offline_users: RwLock<HashMap<String, Arc<RwLock<User>>>>, pub offline_users: RwLock<HashMap<String, Arc<RwLock<User>>>>,
// Channel used to send messages to all connected clients.
pub tx: broadcast::Sender<String>,
// Master card decks
pub packs: CardPacks, pub packs: CardPacks,
pub packs_meta: CardPacksMeta, pub packs_meta: CardPacksMeta,
// Games list
pub games: RwLock<Vec<Game>>, pub games: RwLock<Vec<Game>>,
// chatrooms: Mutex<HashMap<String, ChatRoom<'user>>>,
pub first_names: Vec<String>,
pub last_names: Vec<String>,
} }

View file

@ -1,7 +1,6 @@
use crate::websocket::*; use crate::websocket::*;
use anyhow::{Context, Result}; use anyhow::{Context, Result};
use axum::{routing::get, Router}; use axum::{routing::get, Router};
use server::user::*;
use server::*; use server::*;
use std::{ use std::{
collections::{HashMap, HashSet}, collections::{HashMap, HashSet},
@ -23,30 +22,29 @@ async fn main() -> Result<()> {
.with(tracing_subscriber::fmt::layer()) .with(tracing_subscriber::fmt::layer())
.init(); .init();
// Set up application state for use with with_state(). // Set up state
// Main Broadcast Channel
let (tx, _rx) = broadcast::channel(100); let (tx, _rx) = broadcast::channel(100);
let first_names = load_names("data/first.txt")?;
let last_names = load_names("data/last.txt")?;
let reserved_names = RwLock::new(HashSet::<String>::new()); let reserved_names = RwLock::new(HashSet::<String>::new());
let online_users = RwLock::new(HashMap::<SocketAddr, Arc<RwLock<User>>>::new()); let online_users = RwLock::new(HashMap::<SocketAddr, Arc<RwLock<User>>>::new());
let offline_users = RwLock::new(HashMap::<String, Arc<RwLock<User>>>::new()); let offline_users = RwLock::new(HashMap::<String, Arc<RwLock<User>>>::new());
let (packs, packs_meta) = load_cards_from_json("data/cah-cards-full.json")?; let (packs, packs_meta) = load_cards_from_json("data/cah-cards-full.json")?;
let games = RwLock::new(vec![]); let games = RwLock::new(vec![]);
let first_names = load_names("data/first.txt")?;
let last_names = load_names("data/last.txt")?;
let app_state = Arc::new(AppState { let app_state = Arc::new(AppState {
tx,
first_names,
last_names,
reserved_names, reserved_names,
online_users, online_users,
offline_users, offline_users,
tx,
packs, packs,
packs_meta, packs_meta,
games, games,
first_names,
last_names,
}); });
// set routes and apply state // Router
let app = Router::new() let app = Router::new()
.route("/websocket", get(websocket_connection_handler)) .route("/websocket", get(websocket_connection_handler))
.nest_service("/", ServeDir::new("dist")) .nest_service("/", ServeDir::new("dist"))

View file

@ -1,5 +1,5 @@
use crate::meta::*; use crate::websocket::meta::*;
use crate::user::*; use crate::websocket::user::*;
use crate::AppState; use crate::AppState;
use crate::Game; use crate::Game;
use crate::NewGameManifest; use crate::NewGameManifest;
@ -17,6 +17,8 @@ use lib::*;
use serde_json::{from_str, to_string}; use serde_json::{from_str, to_string};
use std::{net::SocketAddr, sync::Arc}; use std::{net::SocketAddr, sync::Arc};
use tokio::sync::broadcast::Sender; use tokio::sync::broadcast::Sender;
pub mod meta;
pub mod user;
/// Establish the WebSocket connection /// Establish the WebSocket connection
pub async fn websocket_connection_handler( pub async fn websocket_connection_handler(

View file

@ -1,39 +1,16 @@
use crate::meta::*; use crate::websocket::meta::*;
use crate::AppState; use crate::AppState;
use crate::User;
use anyhow::Result; use anyhow::Result;
use axum::extract::ws::{Message, WebSocket}; use axum::extract::ws::{Message, WebSocket};
use futures::stream::SplitSink; use futures::stream::SplitSink;
use futures::SinkExt; use futures::SinkExt;
use lib::*; use lib::*;
use rand::prelude::SliceRandom;
use serde_json::to_string; use serde_json::to_string;
use std::net::SocketAddr; use std::net::SocketAddr;
use std::sync::Arc; use std::sync::Arc;
use std::sync::RwLock; use std::sync::RwLock;
/// User
#[derive(Default, Debug, Eq, PartialEq, Hash)]
pub struct User {
pub name: String,
}
impl User {
/// Create a new user object from incoming data
pub fn new(state: &Arc<AppState>) -> User {
User {
name: format!(
"{} {}",
state.first_names.choose(&mut rand::thread_rng()).unwrap(),
state.last_names.choose(&mut rand::thread_rng()).unwrap(),
),
}
}
pub fn change_name(&mut self, new_name: String) {
self.name = new_name;
}
}
/// Generate message to notify client of user changes /// Generate message to notify client of user changes
pub fn user_client_self_update(new_user: &Arc<RwLock<User>>) -> String { pub fn user_client_self_update(new_user: &Arc<RwLock<User>>) -> String {
to_string::<UserUpdate>(&UserUpdate { to_string::<UserUpdate>(&UserUpdate {
@ -81,4 +58,3 @@ pub async fn user_handle_new(
Ok(()) Ok(())
} }