use super::*;
#[derive(Resource, Default)]
pub struct SpectatorChat(pub Option<String>);
impl SpectatorChat {
pub fn open(&self) -> bool {
self.0.is_some()
}
}
pub fn spectator_chat_input(
mut keys: ResMut<ButtonInput<KeyCode>>,
caps: Res<crate::app::keycaps::KeyCaps>,
mut typed: MessageReader<bevy::input::keyboard::KeyboardInput>,
settings: Res<crate::app::settings::GameSettings>,
mut chat: ResMut<SpectatorChat>,
mut online: ResMut<Online>,
) {
if !is_spectating(&online) {
chat.0 = None;
typed.clear();
return;
}
let Some(line) = &mut chat.0 else {
if caps.just_pressed(&keys, 'T') {
chat.0 = Some(String::new());
typed.clear();
}
return;
};
let said = crate::app::lobby::type_a_line(&mut typed, line, crate::transport::chat_fits)
.or_else(|| crate::app::menu_ui::enter(&keys).then(|| line.clone()));
if keys.just_pressed(KeyCode::Escape) {
chat.0 = None;
crate::app::menu_ui::spend(&mut keys, &crate::app::menu_ui::CLOSERS);
return;
}
let Some(said) = said else {
return;
};
chat.0 = None;
crate::app::menu_ui::spend(&mut keys, &crate::app::menu_ui::CLOSERS);
if said.trim().is_empty() {
return;
}
let Some(session) = &mut online.0 else {
return;
};
let me = crate::app::lobby::speaking_as(session.bot.as_deref(), &settings.names[0]).to_string();
if me.is_empty() {
return;
}
session.transport.send(NetMsg::chat(&me, &said));
session.heard.push((
crate::transport::name_as_sent(&me),
crate::transport::chat_as_sent(&said),
));
}