cleanup -- don't break the spaghetti edition
This commit is contained in:
parent
5237b81cab
commit
9f38eafcb1
5 changed files with 40 additions and 48 deletions
|
@ -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>,
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"))
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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(())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue