Clean up warnings and commented code
All checks were successful
Monorepo build / test-all (push) Successful in 21s
Monorepo build / build-flake (push) Successful in 4s

This commit was merged in pull request #425.
This commit is contained in:
2026-04-27 21:23:38 -04:00
parent 39d7407858
commit 0479729252
2 changed files with 45 additions and 282 deletions

View File

@@ -8,7 +8,6 @@
//!
//! The application will run in its own loop, and websocket connections will
//! send messages here via a channel.
use std::{
collections::{HashMap, HashSet},
pin::Pin,
@@ -186,7 +185,7 @@ impl App_ {
let game = match db.game(game_id)? {
Some(game) => game,
None => return Ok(Err(Error::NotFound(game_id.to_string()))),
_ => return Ok(Err(Error::NotFound(game_id.to_string()))),
};
let TabletopRow {
@@ -272,7 +271,7 @@ impl App {
Box::pin(async move {
let user = match db.user_by_username(&email).expect("") {
Some(user) => user,
None => return Ok(Err(Error::Unauthorized)),
_ => return Ok(Err(Error::Unauthorized)),
};
match db.get_password(&user.id).expect("") {
@@ -352,7 +351,8 @@ impl App {
) -> Result<Result<(), Error>, Fatal> {
self.with_mutable_state_and_db(move |_, db| {
Box::pin(async move {
// TODO: race condition? potentially, if two different people have the invitation and try to create users at the same time. Narrow window, but should be resolved.
// TODO: race condition? potentially, if two different people have the invitation
// and try to create users at the same time. Narrow window, but should be resolved.
if db.is_valid_invitation(&invitation)? {
let user_id = UserId::default();
let user = User {
@@ -437,7 +437,7 @@ impl App {
let (invitation_id, user_name, display_name, registration_state) =
match state.registration_challenges.remove(&registration.user_id) {
Some(state) => state,
None => {
_ => {
eprintln!("invitation challenge does not exist");
return Ok(Err(Error::Forbidden));
}
@@ -525,7 +525,7 @@ impl App {
) -> Result<Result<User, Error>, Fatal> {
let auth_state = match state.discoverable_challenges.remove(&auth_id) {
Some(state) => state,
None => return Ok(Err(Error::Forbidden)),
_ => return Ok(Err(Error::Forbidden)),
};
let Ok((user_id, credential_id)) = state
@@ -580,7 +580,7 @@ impl App {
Ok(Ok(Some(user)))
}
}
Ok(None) => Ok(Ok(None)),
Ok(_) => Ok(Ok(None)),
Err(err) => Err(err.into()),
}
})
@@ -629,7 +629,7 @@ impl App {
Box::pin(async move {
match db.game(&game_id) {
Ok(Some(game)) => Ok(Ok(game)),
Ok(None) => Ok(Err(Error::NotFound(game_id.as_str().to_owned()))),
Ok(_) => Ok(Err(Error::NotFound(game_id.as_str().to_owned()))),
Err(err) => Err(err.into()),
}
})
@@ -661,92 +661,6 @@ impl App {
.await
}
/*
pub async fn game_overview(
&self,
user_id: &UserId,
game_id: &GameId,
) -> Result<Result<GameOverview, Error>, Fatal> {
let state = self.inner.read().await;
let db = match state.database.open() {
Ok(db) => db,
Err(_) => return Ok(Err(Error::CannotOpen)),
};
let game = match db.game(game_id)? {
Some(game) => game,
None => {
return Ok(Err(Error::NotFound(format!("{:?}", game_id))));
}
};
if !game.contains_user(user_id) {
return Ok(Err(Error::Forbidden));
}
()
let gm = match db.user(&game.gm)? {
Some(gm) => UserOverview::from(gm),
None => return Ok(Err(Error::NotFound(format!("{:?}", game.gm)))),
};
let players: Vec<UserOverview> = game
.players
.iter()
.map(|player_id| db.user(player_id))
.collect::<Result<Vec<Option<User>>, database::Fatal>>()?
.into_iter()
.filter_map(|user| user.map(UserOverview::from))
.collect();
eprintln!("user_id: {:?}", user_id);
eprintln!("players: {:?}", players);
Ok(Ok(overview))
}
*/
/*
pub async fn game_overviews(&self) -> Result<Result<Vec<GameOverview>, Error>, Fatal> {
let state = self.inner.read().await;
let db = match state.database.open() {
Ok(db) => db,
Err(_) => return Ok(Err(Error::CannotOpen)),
};
let games = db.games()?;
let users = db
.users()?
.into_iter()
.map(|user| (user.id.clone(), user))
.collect::<HashMap<UserId, User>>();
let mut overviews: Vec<GameOverview> = vec![];
for game in games {
match db.game(&game.id)? {
Some(game) => {
println!("game: {:?}", game);
// SAFETY: Games cannot be created unless the users involved exist. So no user ID can be present in
// a game without being present here.
let gm = UserOverview::from(users.get(&game.gm).unwrap().clone());
let players = game
.players
.iter()
.map(|player| UserOverview::from(users.get(player).unwrap().clone()))
.collect();
let mut overview = GameOverview::from(game);
overview.gm = gm.id;
overviews.push(overview);
}
None => {}
}
}
for overview in overviews.iter() {
println!("overview: {:?}", overview);
}
Ok(Ok(overviews))
}
*/
pub async fn create_game(
&self,
user_id: &UserId,
@@ -848,82 +762,6 @@ impl App {
.await
}
/*
pub async fn open_to_spectators(
&self,
user: &User,
game_id: &GameId,
) -> Result<Result<(), Error>, Fatal> {
self.with_readonly_state_and_db(clone!((user, game_id), move |_, db| {
Box::pin(async move {
let mut game = match db.game(&game_id)? {
Some(game) => game,
None => return Ok(Err(Error::NotFound(game_id.as_str().to_owned()))),
};
if game.gm != user.id {
return Ok(Err(Error::Forbidden));
}
game.open_to_spectators = true;
db.save_game(game)?;
Ok(Ok(()))
})
}))
.await
}
pub async fn close_to_spectators(
&self,
user: &User,
game_id: &GameId,
) -> Result<Result<(), Error>, Fatal> {
self.with_mutable_state_and_db(clone!((user, game_id), move |state, db| {
Box::pin(async move {
let mut game = match db.game(&game_id)? {
Some(game) => game,
None => return Ok(Err(Error::NotFound(game_id.as_str().to_owned()))),
};
if game.gm != user.id {
return Ok(Err(Error::Forbidden));
}
game.open_to_spectators = false;
db.save_game(game)?;
// Find all spectator sockets for this game, send them SpectatorModeDisabled,
// and remove them from the connections map
let spectator_socket_ids: Vec<SocketId> = state
.connections
.iter()
.filter_map(|(socket_id, socket)| {
if let SocketState::Spectator(ref gid, _) = socket.state {
if *gid == game_id {
return Some(socket_id.clone());
}
}
None
})
.collect();
for socket_id in &spectator_socket_ids {
if let Some(socket) = state.connections.get(socket_id) {
let _ = socket.sender.send(GameMessage::SpectatorModeDisabled).await;
}
}
for socket_id in spectator_socket_ids {
state.connections.remove(&socket_id);
}
Ok(Ok(()))
})
}))
.await
}
*/
pub async fn set_tabletop_image(
&self,
user_id: &UserId,
@@ -961,7 +799,7 @@ impl App {
.await?;
Ok(Ok(()))
}
None => Ok(Err(Error::NotFound(format!("{:?}", game_id.clone())))),
_ => Ok(Err(Error::NotFound(format!("{:?}", game_id.clone())))),
}
})
}))
@@ -998,11 +836,11 @@ impl App {
let game = match filter.game_id.clone() {
Some(game_id) => match db.game(&game_id)? {
Some(game) => game,
None => {
_ => {
return Ok(Err(Error::NotFound(game_id.as_str().to_string())));
}
},
None => {
_ => {
return Ok(Err(Error::Forbidden));
}
};
@@ -1029,12 +867,12 @@ impl App {
Box::pin(async move {
let _game = match db.game(&game_id)? {
Some(game) => game,
None => return Ok(Err(Error::NotFound(format!("{:?}", scene_id.clone())))),
_ => return Ok(Err(Error::NotFound(format!("{:?}", scene_id.clone())))),
};
let scene = match db.scene(&scene_id)? {
Some(scene) => scene,
None => return Ok(Err(Error::NotFound(format!("{:?}", scene_id.clone())))),
_ => return Ok(Err(Error::NotFound(format!("{:?}", scene_id.clone())))),
};
if scene.game != game_id {
@@ -1101,7 +939,7 @@ impl App {
let saved_scene = match db.scene(&scene_id)? {
Some(scene) => scene,
None => return Ok(Err(Error::NotFound(format!("{:?}", scene_id.clone())))),
_ => return Ok(Err(Error::NotFound(format!("{:?}", scene_id.clone())))),
};
if scene.game != saved_scene.game {
@@ -1110,7 +948,7 @@ impl App {
let game = match db.game(&saved_scene.game)? {
Some(game) => game,
None => {
_ => {
return Ok(Err(Error::NotFound(saved_scene.game.as_str().to_string())));
}
};
@@ -1139,12 +977,12 @@ impl App {
Box::pin(async move {
let scene = match db.scene(&scene_id)? {
Some(scene) => scene,
None => return Ok(Err(Error::NotFound(format!("{:?}", scene_id.clone())))),
_ => return Ok(Err(Error::NotFound(format!("{:?}", scene_id.clone())))),
};
let game = match db.game(&scene.game)? {
Some(game) => game,
None => return Ok(Err(Error::NotFound(scene.game.as_str().to_string()))),
_ => return Ok(Err(Error::NotFound(scene.game.as_str().to_string()))),
};
if !user.admin && user.id != game.gm {
@@ -1157,7 +995,7 @@ impl App {
})?;
let image = match images.into_iter().find(|image| image.id == image_id) {
Some(image) => image,
None => return Ok(Err(Error::NotFound(format!("{:?}", image_id.clone())))),
_ => return Ok(Err(Error::NotFound(format!("{:?}", image_id.clone())))),
};
if image.game != scene.game {
@@ -1183,12 +1021,12 @@ impl App {
Box::pin(async move {
let scene = match db.scene(&scene_id)? {
Some(scene) => scene,
None => return Ok(Err(Error::NotFound(format!("{:?}", scene_id.clone())))),
_ => return Ok(Err(Error::NotFound(format!("{:?}", scene_id.clone())))),
};
let game = match db.game(&scene.game)? {
Some(game) => game,
None => return Ok(Err(Error::NotFound(scene.game.as_str().to_string()))),
_ => return Ok(Err(Error::NotFound(scene.game.as_str().to_string()))),
};
if !user.admin && user.id != game.gm {
@@ -1201,7 +1039,7 @@ impl App {
})?;
let image = match images.into_iter().find(|image| image.id == image_id) {
Some(image) => image,
None => return Ok(Err(Error::NotFound(format!("{:?}", image_id.clone())))),
_ => return Ok(Err(Error::NotFound(format!("{:?}", image_id.clone())))),
};
if image.game != scene.game {
@@ -1250,7 +1088,7 @@ impl App {
})?;
match images.into_iter().find(|img| img.url == image.url) {
Some(image) => Ok(Ok(image)),
None => Ok(Err(Error::NotFound(image.url))),
_ => Ok(Err(Error::NotFound(image.url))),
}
})
})
@@ -1299,26 +1137,26 @@ impl App {
Some(scene_id) => {
let scene = match db.scene(&scene_id)? {
Some(scene) => scene,
None => {
_ => {
return Ok(Err(Error::NotFound(format!("{:?}", scene_id.clone()))));
}
};
match db.game(&scene.game)? {
Some(game) => game,
None => {
_ => {
return Ok(Err(Error::NotFound(scene.game.as_str().to_string())));
}
}
}
None => match filter.game_id.clone() {
_ => match filter.game_id.clone() {
Some(game_id) => match db.game(&game_id)? {
Some(game) => game,
None => {
_ => {
return Ok(Err(Error::NotFound(game_id.as_str().to_string())));
}
},
None => return Ok(Ok(vec![])),
_ => return Ok(Ok(vec![])),
},
};
@@ -1349,9 +1187,9 @@ impl App {
let game = match filter.game_id {
Some(ref game_id) => match db.game(game_id)? {
Some(game) => Some(game),
None => return Ok(Err(Error::NotFound(format!("{:?}", game_id)))),
_ => return Ok(Err(Error::NotFound(format!("{:?}", game_id)))),
},
None => None,
_ => None,
};
let filter = match game {
@@ -1365,7 +1203,7 @@ impl App {
filter
}
}
None => CharacterFilter {
_ => CharacterFilter {
user_id: filter.user_id,
game_id: None,
},
@@ -1385,12 +1223,12 @@ impl App {
Box::pin(async move {
let sheet = match db.character(&charsheet_id)? {
Some(sheet) => sheet,
None => return Ok(Err(Error::NotFound(charsheet_id.to_string()))),
_ => return Ok(Err(Error::NotFound(charsheet_id.to_string()))),
};
match db.game(&sheet.game_id)? {
Some(_) => Ok(Ok(sheet)),
None => Ok(Err(Error::NotFound(charsheet_id.to_string()))),
_ => Ok(Err(Error::NotFound(charsheet_id.to_string()))),
}
})
}))
@@ -1406,7 +1244,7 @@ impl App {
Box::pin(async move {
let game = match db.game(&game_id)? {
Some(game) => game,
None => return Ok(Err(Error::NotFound(game_id.as_str().to_owned()))),
_ => return Ok(Err(Error::NotFound(game_id.as_str().to_owned()))),
};
if !game.players.contains(&user_id) {
@@ -1482,7 +1320,7 @@ impl App {
return Ok(Err(Error::NotFound(game_id.as_str().to_owned())));
}
}
Ok(None) => return Ok(Err(Error::NotFound(game_id.as_str().to_owned()))),
Ok(_) => return Ok(Err(Error::NotFound(game_id.as_str().to_owned()))),
Err(err) => return Err(err.into()),
};
@@ -1491,7 +1329,7 @@ impl App {
Some(sheet) => {
let sheet_game = match db.game(&sheet.game_id)? {
Some(game) => game,
None => {
_ => {
return Ok(Err(Error::NotFound(format!(
"{:?}",
character_id.clone()
@@ -1504,7 +1342,7 @@ impl App {
return Ok(Err(Error::NotFound(format!("{:?}", character_id.clone()))));
}
}
None => return Ok(Err(Error::NotFound(format!("{:?}", character_id.clone())))),
_ => return Ok(Err(Error::NotFound(format!("{:?}", character_id.clone())))),
};
if character.user_id != user.id || character.game_id != game.id {
@@ -1574,7 +1412,7 @@ impl App {
old_card.location == Location::Tabletop
|| card.location == Location::Tabletop
}
None => card.location == Location::Tabletop,
_ => card.location == Location::Tabletop,
};
if public_visibility_change {
@@ -1628,7 +1466,7 @@ impl App {
Box::pin(async move {
let socket = match state.connections.get_mut(&socket_id) {
Some(socket) => socket,
None => {
_ => {
return None;
}
};
@@ -1734,7 +1572,7 @@ impl App {
);
}
}
SocketState::Spectator(_, None) => {}
SocketState::Spectator(_, _) => {}
}
match (socket.state, msg) {
@@ -1750,7 +1588,7 @@ impl App {
.await;
Ok(Some(GameMessage::Ok))
}
Ok(None) => Ok(Some(GameMessage::PermissionDenied)),
Ok(_) => Ok(Some(GameMessage::PermissionDenied)),
Err(err) => Ok(Some(GameMessage::Error(err.to_string()))),
}
}
@@ -1801,78 +1639,6 @@ impl App {
Ok(Some(GameMessage::PermissionDenied))
}
}
/*
(
SocketState::Authenticated(_session_id, user),
GameRequest::ChangeSpectatorMode(game_id, is_enabled),
) => {
if is_enabled {
match self.open_to_spectators(&user, &game_id).await? {
Ok(()) => {
return Ok(Some(GameMessage::SpectatorModeEnabled));
}
Err(err) => {
return Ok(Some(GameMessage::Error(err.to_string())));
}
}
} else {
match self.close_to_spectators(&user, &game_id).await? {
Ok(()) => {
return Ok(Some(GameMessage::SpectatorModeDisabled));
}
Err(err) => {
return Ok(Some(GameMessage::Error(err.to_string())));
}
}
}
}
*/
/*
(
SocketState::InGame(_session_id, user, game_id),
GameRequest::ChangeSpectatorMode(req_game_id, is_enabled),
) => {
if game_id != req_game_id {
return Ok(Some(GameMessage::InvalidState));
}
if is_enabled {
match self.open_to_spectators(&user, &game_id).await? {
Ok(()) => Ok(Some(GameMessage::SpectatorModeEnabled)),
Err(err) => Ok(Some(GameMessage::Error(err.to_string()))),
}
} else {
match self.close_to_spectators(&user, &game_id).await? {
Ok(()) => Ok(Some(GameMessage::SpectatorModeDisabled)),
Err(err) => Ok(Some(GameMessage::Error(err.to_string()))),
}
}
}
*/
/*
(
SocketState::InGame(_session_id, _user_id, _game_id),
GameRequest::SetBackground(_),
) => {
todo!()
}
// Unauthenticated spectator trying to switch games
(SocketState::Spectator(_, None), GameRequest::JoinGame(game_id)) => {
// Use None for user to check if game is open to spectators
match self.game(&game_id).await? {
Ok(_game) => {
// Game is open to spectators
self.change_websocket_state(
&socket_id,
SocketState::Spectator(game_id, None),
)
.await;
Ok(Some(GameMessage::Ok))
}
Err(_) => Ok(Some(GameMessage::PermissionDenied)),
}
}
*/
// Authenticated spectator trying to switch games (might become player)
(
SocketState::Spectator(_, Some((session_id, user_id))),
@@ -1881,7 +1647,7 @@ impl App {
// Retrieve the user from the session
let user = match self.user(&user_id).await? {
Ok(Some(user)) => user,
Ok(None) => return Ok(Some(GameMessage::PermissionDenied)),
Ok(_) => return Ok(Some(GameMessage::PermissionDenied)),
Err(err) => return Ok(Some(GameMessage::Error(err.to_string()))),
};

View File

@@ -1,8 +1,5 @@
use cool_asserts::assert_matches;
use visions_types::{
Character, CharacterFilter, CharacterId, GameId, GameMessage, Location, SceneId, Tabletop,
UserId,
};
use visions_types::{Character, CharacterFilter, CharacterId, GameMessage, Location, Tabletop};
use crate::{
CreateInvitation,
@@ -13,9 +10,9 @@ use crate::{
},
run_command,
test_utils::{
ALENKO_ID, FOURTH_PHAROS_ID, JACK_ID, JOKER_ID, MISSING_LIBRARIANS_ID, PHILETHIS_INDEX_ID,
TALI_ID, TSONI_ID, TestSupport, VAKARIAN_ID, WINTER_SOLSTICE_ID, WINTER_SOLSTICE_TITLE,
get_character, list_characters, zell_base_data, zell_update_data,
ALENKO_ID, JOKER_ID, MISSING_LIBRARIANS_ID, PHILETHIS_INDEX_ID, TALI_ID, TSONI_ID,
TestSupport, VAKARIAN_ID, WINTER_SOLSTICE_ID, WINTER_SOLSTICE_TITLE, get_character,
list_characters, zell_base_data, zell_update_data,
},
};