From dae85155903fa07ed4252ef756e5b9cb621d37c5 Mon Sep 17 00:00:00 2001 From: aljazerzen Date: Fri, 26 Mar 2021 20:00:29 +0100 Subject: [PATCH 1/2] after leaving a group, set chat mode to world --- server/src/cmd.rs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/server/src/cmd.rs b/server/src/cmd.rs index 3d0d3db1e9..cac87f4446 100644 --- a/server/src/cmd.rs +++ b/server/src/cmd.rs @@ -15,7 +15,7 @@ use common::{ buff::{BuffCategory, BuffData, BuffKind, BuffSource}, inventory::item::MaterialStatManifest, invite::InviteKind, - ChatType, Inventory, Item, LightEmitter, WaypointArea, + ChatMode, ChatType, Inventory, Item, LightEmitter, WaypointArea, }, effect::Effect, event::{EventBus, ServerEvent}, @@ -2069,6 +2069,17 @@ fn handle_group_kick( ecs.read_resource::>() .emit_now(ServerEvent::GroupManip(client, comp::GroupManip::Kick(uid))); + + // Set chat mode to world (if current chat mode is group) + if let Some(chat_mode) = server + .state + .ecs() + .write_storage::() + .get_mut(target_player) + .filter(|mode| matches!(mode, ChatMode::Group(_))) + { + *chat_mode = ChatMode::World; + } } else { server.notify_client( client, @@ -2098,6 +2109,17 @@ fn handle_group_leave( .ecs() .read_resource::>() .emit_now(ServerEvent::GroupManip(client, comp::GroupManip::Leave)); + + // Set chat mode to world (if current chat mode is group) + if let Some(chat_mode) = server + .state + .ecs() + .write_storage::() + .get_mut(client) + .filter(|mode| matches!(mode, ChatMode::Group(_))) + { + *chat_mode = ChatMode::World; + } } fn handle_group_promote( From 8ac879e4c1d181d26c8218828812b2745b5fcb5d Mon Sep 17 00:00:00 2001 From: aljazerzen Date: Sat, 27 Mar 2021 17:40:43 +0100 Subject: [PATCH 2/2] after leaving group, issue warning instead of changing chat mode --- common/src/comp/chat.rs | 8 ++++++ server/src/cmd.rs | 24 +---------------- server/src/state_ext.rs | 57 +++++++++++++++++++++++++++++++---------- 3 files changed, 52 insertions(+), 37 deletions(-) diff --git a/common/src/comp/chat.rs b/common/src/comp/chat.rs index 57500ba6b6..d5ed529e1c 100644 --- a/common/src/comp/chat.rs +++ b/common/src/comp/chat.rs @@ -179,6 +179,14 @@ impl GenericChatMsg { } } + pub fn get_group(&self) -> Option<&G> { + match &self.chat_type { + ChatType::GroupMeta(g) => Some(&g), + ChatType::Group(_, g) => Some(&g), + _ => None, + } + } + pub fn to_bubble(&self) -> Option<(SpeechBubble, Uid)> { let icon = self.icon(); if let ChatType::Npc(from, r) | ChatType::NpcSay(from, r) = self.chat_type { diff --git a/server/src/cmd.rs b/server/src/cmd.rs index cac87f4446..3d0d3db1e9 100644 --- a/server/src/cmd.rs +++ b/server/src/cmd.rs @@ -15,7 +15,7 @@ use common::{ buff::{BuffCategory, BuffData, BuffKind, BuffSource}, inventory::item::MaterialStatManifest, invite::InviteKind, - ChatMode, ChatType, Inventory, Item, LightEmitter, WaypointArea, + ChatType, Inventory, Item, LightEmitter, WaypointArea, }, effect::Effect, event::{EventBus, ServerEvent}, @@ -2069,17 +2069,6 @@ fn handle_group_kick( ecs.read_resource::>() .emit_now(ServerEvent::GroupManip(client, comp::GroupManip::Kick(uid))); - - // Set chat mode to world (if current chat mode is group) - if let Some(chat_mode) = server - .state - .ecs() - .write_storage::() - .get_mut(target_player) - .filter(|mode| matches!(mode, ChatMode::Group(_))) - { - *chat_mode = ChatMode::World; - } } else { server.notify_client( client, @@ -2109,17 +2098,6 @@ fn handle_group_leave( .ecs() .read_resource::>() .emit_now(ServerEvent::GroupManip(client, comp::GroupManip::Leave)); - - // Set chat mode to world (if current chat mode is group) - if let Some(chat_mode) = server - .state - .ecs() - .write_storage::() - .get_mut(client) - .filter(|mode| matches!(mode, ChatMode::Group(_))) - { - *chat_mode = ChatMode::World; - } } fn handle_group_promote( diff --git a/server/src/state_ext.rs b/server/src/state_ext.rs index 3a3dd43a81..da4116e2d6 100644 --- a/server/src/state_ext.rs +++ b/server/src/state_ext.rs @@ -451,11 +451,15 @@ impl StateExt for State { |target, a: &comp::Pos, b: &comp::Pos| a.0.distance_squared(b.0) < target * target; let group_manager = ecs.read_resource::(); - let resolved_msg = msg.clone().map_group(|group_id| { - group_manager - .group_info(group_id) - .map_or_else(|| "???".into(), |i| i.name.clone()) - }); + + let group_info = msg + .get_group() + .map(|g| group_manager.group_info(*g)) + .flatten(); + + let resolved_msg = msg + .clone() + .map_group(|_| group_info.map_or_else(|| "???".to_string(), |i| i.name.clone())); match &msg.chat_type { comp::ChatType::Offline(_) @@ -544,17 +548,29 @@ impl StateExt for State { } } }, - comp::ChatType::GroupMeta(g) | comp::ChatType::Group(_, g) => { - for (client, group) in ( - &ecs.read_storage::(), - &ecs.read_storage::(), - ) - .join() - { - if g == group { - client.send_fallible(ServerGeneral::ChatMsg(resolved_msg.clone())); + comp::ChatType::Group(from, g) => { + if group_info.is_none() { + // group not found, reply with command error + let reply = comp::ChatMsg { + chat_type: comp::ChatType::CommandError, + message: "You are using group chat but do not belong to a group. Use \ + /world or /region to change chat." + .into(), + }; + + if let Some((client, _)) = + (&ecs.read_storage::(), &ecs.read_storage::()) + .join() + .find(|(_, uid)| *uid == from) + { + client.send_fallible(ServerGeneral::ChatMsg(reply)); } + return; } + send_to_group(g, ecs, &resolved_msg); + }, + comp::ChatType::GroupMeta(g) => { + send_to_group(g, ecs, &resolved_msg); }, } } @@ -653,3 +669,16 @@ impl StateExt for State { res } } + +fn send_to_group(g: &comp::Group, ecs: &specs::World, msg: &comp::ChatMsg) { + for (client, group) in ( + &ecs.read_storage::(), + &ecs.read_storage::(), + ) + .join() + { + if g == group { + client.send_fallible(ServerGeneral::ChatMsg(msg.clone())); + } + } +}