diff --git a/src/map/map/guild/finish_guild_creation.rs b/src/map/map/guild/finish_guild_creation.rs index 700727b..345cdbd 100644 --- a/src/map/map/guild/finish_guild_creation.rs +++ b/src/map/map/guild/finish_guild_creation.rs @@ -6,7 +6,7 @@ use eolib::{ }, }; -use crate::{character::Character, SETTINGS}; +use crate::SETTINGS; use super::super::Map; @@ -18,37 +18,31 @@ impl Map { guild_tag: String, guild_name: String, ) { - let mut guild_characters: Vec = Vec::with_capacity(SETTINGS.guild.min_players); - - { - let character = match self.characters.get_mut(&player_id) { - Some(character) => character, - None => return, - }; - - character.remove_item(1, SETTINGS.guild.create_cost); - character.guild_tag = Some(guild_tag.clone()); - character.guild_name = Some(guild_name.clone()); - character.guild_rank_string = Some(SETTINGS.guild.default_leader_rank_name.clone()); - character.guild_rank = Some(1); - - guild_characters.push(character.to_owned()); - - self.world.add_guild_member(player_id, guild_tag.clone()); + let character = match self.characters.get_mut(&player_id) { + Some(character) => character, + None => return, + }; - if let Some(player) = character.player.as_ref() { - player.send( - PacketAction::Create, - PacketFamily::Guild, - &GuildCreateServerPacket { - leader_player_id: player_id, - guild_tag: guild_tag.clone(), - guild_name: guild_name.clone(), - rank_name: SETTINGS.guild.default_leader_rank_name.clone(), - gold_amount: character.get_item_amount(1), - }, - ); - } + character.remove_item(1, SETTINGS.guild.create_cost); + character.guild_tag = Some(guild_tag.clone()); + character.guild_name = Some(guild_name.clone()); + character.guild_rank_string = Some(SETTINGS.guild.default_leader_rank_name.clone()); + character.guild_rank = Some(1); + + self.world.add_guild_member(player_id, guild_tag.clone()); + + if let Some(player) = character.player.as_ref() { + player.send( + PacketAction::Create, + PacketFamily::Guild, + &GuildCreateServerPacket { + leader_player_id: player_id, + guild_tag: guild_tag.clone(), + guild_name: guild_name.clone(), + rank_name: SETTINGS.guild.default_leader_rank_name.clone(), + gold_amount: character.get_item_amount(1), + }, + ); } let packet = GuildAgreeServerPacket { @@ -82,31 +76,11 @@ impl Map { character.guild_rank_string = Some(SETTINGS.guild.default_new_member_rank_name.clone()); character.guild_rank = Some(9); - guild_characters.push(character.to_owned()); - self.world.add_guild_member(*player_id, guild_tag.clone()); if let Some(player) = character.player.as_ref() { player.send_buf(PacketAction::Agree, PacketFamily::Guild, buf.clone()); } } - - let pool = self.pool.clone(); - - tokio::spawn(async move { - let mut conn = match pool.get_conn().await { - Ok(conn) => conn, - Err(e) => { - error!("Error getting connection from pool: {}", e); - return; - } - }; - - for character in guild_characters.iter_mut() { - character.save(&mut conn).await.unwrap_or_else(|e| { - error!("Error saving character: {}", e); - }); - } - }); } } diff --git a/src/map/map/guild/join_guild.rs b/src/map/map/guild/join_guild.rs index 0f32fca..c6f7640 100644 --- a/src/map/map/guild/join_guild.rs +++ b/src/map/map/guild/join_guild.rs @@ -35,24 +35,5 @@ impl Map { }, ); } - - // TODO: This is potentially unsafe if character changes before being saved.. - // Possible duping hazard? - let mut character = character.to_owned(); - let pool = self.pool.clone(); - - tokio::spawn(async move { - let mut conn = match pool.get_conn().await { - Ok(conn) => conn, - Err(e) => { - error!("Error getting connection from pool: {}", e); - return; - } - }; - - if let Err(e) = character.save(&mut conn).await { - error!("Error saving character: {}", e); - } - }); } } diff --git a/src/map/map/guild/kick_from_guild.rs b/src/map/map/guild/kick_from_guild.rs index c3bef02..0d2b9c9 100644 --- a/src/map/map/guild/kick_from_guild.rs +++ b/src/map/map/guild/kick_from_guild.rs @@ -28,22 +28,5 @@ impl Map { &GuildKickServerPacket::default(), ); } - - let mut character = character.to_owned(); - let pool = self.pool.clone(); - - tokio::spawn(async move { - let mut conn = match pool.get_conn().await { - Ok(conn) => conn, - Err(e) => { - error!("Error getting connection from pool: {}", e); - return; - } - }; - - if let Err(e) = character.save(&mut conn).await { - error!("Error saving character: {}", e); - } - }); } } diff --git a/src/map/map/guild/leave_guild.rs b/src/map/map/guild/leave_guild.rs index c3b33b6..9b7e22f 100644 --- a/src/map/map/guild/leave_guild.rs +++ b/src/map/map/guild/leave_guild.rs @@ -18,22 +18,5 @@ impl Map { character.guild_rank_string = None; self.world.remove_guild_member(player_id, guild_tag); - - let mut character = character.to_owned(); - let pool = self.pool.clone(); - - tokio::spawn(async move { - let mut conn = match pool.get_conn().await { - Ok(conn) => conn, - Err(e) => { - error!("Error getting connection from pool: {}", e); - return; - } - }; - - if let Err(e) = character.save(&mut conn).await { - error!("Error saving character: {}", e); - } - }); } } diff --git a/src/map/map/guild/update_guild_rank.rs b/src/map/map/guild/update_guild_rank.rs index bb1faa7..338722b 100644 --- a/src/map/map/guild/update_guild_rank.rs +++ b/src/map/map/guild/update_guild_rank.rs @@ -19,22 +19,5 @@ impl Map { &GuildAcceptServerPacket { rank }, ); } - - let mut character = character.to_owned(); - let pool = self.pool.clone(); - - tokio::spawn(async move { - let mut conn = match pool.get_conn().await { - Ok(conn) => conn, - Err(e) => { - error!("Error getting connection from pool: {}", e); - return; - } - }; - - if let Err(e) = character.save(&mut conn).await { - error!("Error saving character: {}", e); - } - }); } } diff --git a/src/player/player/handlers/guild.rs b/src/player/player/handlers/guild.rs index 6421fc3..28c3830 100644 --- a/src/player/player/handlers/guild.rs +++ b/src/player/player/handlers/guild.rs @@ -236,9 +236,11 @@ impl Player { return; } + let guild_tag = create.guild_tag.to_uppercase(); + if let Err(e) = create_guild( &mut conn, - &create.guild_tag, + &guild_tag, &create.guild_name, &create.description, ) @@ -251,7 +253,7 @@ impl Player { map.finish_guild_creation( player_id, guild_create_members, - create.guild_tag, + guild_tag, create.guild_name, ); }); diff --git a/src/sql/cleanup_guildless_characters.sql b/src/sql/cleanup_guildless_characters.sql new file mode 100644 index 0000000..007a72f --- /dev/null +++ b/src/sql/cleanup_guildless_characters.sql @@ -0,0 +1,3 @@ +UPDATE `Character` +SET `guild_rank` = NULL, `guild_rank_string` = NULL +WHERE `guild_id` IS NULL; diff --git a/src/world/world/disband_guild.rs b/src/world/world/disband_guild.rs index ddebda4..acee315 100644 --- a/src/world/world/disband_guild.rs +++ b/src/world/world/disband_guild.rs @@ -32,9 +32,6 @@ impl World { map.kick_from_guild(player_id); } - // Wait a few seconds to ensure all characters have been saved. - tokio::time::sleep(tokio::time::Duration::from_secs(5)).await; - let mut conn = match pool.get_conn().await { Ok(conn) => conn, Err(e) => { @@ -54,6 +51,13 @@ impl World { { error!("Error deleting guild: {}", e); } + + if let Err(e) = conn + .query_drop(include_str!("../../sql/cleanup_guildless_characters.sql")) + .await + { + error!("Error deleting guild: {}", e); + } }); } }