~starkingdoms/starkingdoms

ref: 361225ca8122e4ae48938069793570552a3c8dd1 starkingdoms/crates/server/src/player/send_message.rs -rw-r--r-- 2.0 KiB
361225ca — core networking refactor 8 months ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
use std::net::SocketAddr;

use bevy::prelude::*;
use bevy_rapier2d::prelude::Velocity;
use starkingdoms_common::packet::{MessagePacket, 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(MessagePacket {
            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(MessagePacket {
            message_type: starkingdoms_common::packet::MessageType::Chat,
            actor: player.username.clone(),
            content,
        });

        event_queue.push(WsEvent::Broadcast {
            message: packet.into_message(),
        });
    }
}