use std::net::SocketAddr;
use bevy::prelude::*;
use bevy_rapier2d::prelude::Velocity;
use starkingdoms_common::packet::Packet;
use crate::{
module::component::{Attach, PartFlags},
planet::PlanetType,
ws::{PacketMessageConvert, WsEvent},
};
use super::component::Player;
pub fn send_message(
player_query: &Query<
(
Entity,
&mut Player,
&Transform,
&Velocity,
&mut Attach,
&mut PartFlags,
),
Without<PlanetType>,
>,
from: &SocketAddr,
event_queue: &mut Vec<WsEvent>,
target: Option<String>,
content: String,
) {
// find our player
let mut player = None;
for (_, q_player, _, _, _, _) in player_query.iter() {
if q_player.addr == *from {
player = Some(q_player);
}
}
let player = player.unwrap();
if let Some(target_username) = target {
let mut target_player = None;
for (_, q_player, _, _, _, _) in player_query.iter() {
if q_player.username == target_username {
target_player = Some(q_player);
}
}
let target_player = target_player.unwrap();
let packet = Packet::Message {
message_type: starkingdoms_common::packet::MessageType::Direct,
actor: player.username.clone(),
content,
};
event_queue.push(WsEvent::Send {
to: target_player.addr,
message: packet.clone().into_message(),
});
event_queue.push(WsEvent::Send {
to: *from,
message: packet.into_message(),
});
} else {
// send to general chat
let packet = Packet::Message {
message_type: starkingdoms_common::packet::MessageType::Chat,
actor: player.username.clone(),
content,
};
event_queue.push(WsEvent::Broadcast {
message: packet.into_message(),
});
}
}