~starkingdoms/starkingdoms

ref: f09a962cd10ee3b70177bd86c7c8a88f662c49f5 starkingdoms/server/src/player/send_message.rs -rw-r--r-- 1.8 KiB
f09a962c — ghostlyzsh comments? and formal grammar for kabel 1 year, 4 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
use std::net::SocketAddr;

use bevy::prelude::*;
use bevy_rapier2d::prelude::Velocity;

use crate::{module::component::{Attach, PartFlags}, planet::PlanetType, ws::WsEvent, Packet};

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: crate::packet::MessageType::Direct,
            actor: player.username.clone(),
            content,
        };
        event_queue.push(WsEvent::Send {
            to: target_player.addr,
            message: packet.clone().into(),
        });
        event_queue.push(WsEvent::Send {
            to: *from,
            message: packet.into(),
        });
    } else {
        // send to general chat
        let packet = Packet::Message {
            message_type: crate::packet::MessageType::Chat,
            actor: player.username.clone(),
            content,
        };

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