Pumpkin/pumpkin-protocol/src/client/play/c_player_chat_message.rs
2024-10-27 14:18:18 +01:00

77 lines
2.0 KiB
Rust

use pumpkin_core::text::TextComponent;
use pumpkin_macros::client_packet;
use serde::Serialize;
use crate::{BitSet, VarInt};
#[derive(Serialize)]
#[client_packet("play:player_chat")]
pub struct CPlayerChatMessage<'a> {
#[serde(with = "uuid::serde::compact")]
sender: uuid::Uuid,
index: VarInt,
message_signature: Option<&'a [u8]>,
message: &'a str,
timestamp: i64,
salt: i64,
previous_messages_count: VarInt,
previous_messages: &'a [PreviousMessage<'a>], // max 20
unsigned_content: Option<TextComponent<'a>>,
filter_type: FilterType<'a>,
chat_type: VarInt,
sender_name: TextComponent<'a>,
target_name: Option<TextComponent<'a>>,
}
impl<'a> CPlayerChatMessage<'a> {
#[expect(clippy::too_many_arguments)]
pub fn new(
sender: uuid::Uuid,
index: VarInt,
message_signature: Option<&'a [u8]>,
message: &'a str,
timestamp: i64,
salt: i64,
previous_messages: &'a [PreviousMessage<'a>],
unsigned_content: Option<TextComponent<'a>>,
filter_type: FilterType<'a>,
chat_type: VarInt,
sender_name: TextComponent<'a>,
target_name: Option<TextComponent<'a>>,
) -> Self {
Self {
sender,
index,
message_signature,
message,
timestamp,
salt,
previous_messages_count: previous_messages.len().into(),
previous_messages,
unsigned_content,
filter_type,
chat_type,
sender_name,
target_name,
}
}
}
#[derive(Serialize)]
pub struct PreviousMessage<'a> {
message_id: VarInt,
signature: Option<&'a [u8]>,
}
#[derive(Serialize)]
#[repr(i32)]
pub enum FilterType<'a> {
/// Message is not filtered at all
PassThrough = 0,
/// Message is fully filtered
FullyFiltered = 1,
/// Only some characters in the message are filtered
PartiallyFiltered(BitSet<'a>) = 2,
}