diff options
Diffstat (limited to 'azalea-client/src')
| -rw-r--r-- | azalea-client/src/chat.rs | 74 | ||||
| -rwxr-xr-x | azalea-client/src/lib.rs | 1 |
2 files changed, 75 insertions, 0 deletions
diff --git a/azalea-client/src/chat.rs b/azalea-client/src/chat.rs new file mode 100644 index 00000000..6176357f --- /dev/null +++ b/azalea-client/src/chat.rs @@ -0,0 +1,74 @@ +use std::time::{SystemTime, UNIX_EPOCH}; + +use azalea_crypto::MessageSignature; +use azalea_protocol::packets::game::{ + clientbound_player_chat_packet::LastSeenMessagesUpdate, + serverbound_chat_command_packet::ServerboundChatCommandPacket, + serverbound_chat_packet::ServerboundChatPacket, +}; + +use crate::Client; + +impl Client { + /// Sends chat message to the server. This only sends the chat packet and + /// not the command packet. The `chat` function handles checking whether + /// the message is a command and using the proper packet for you. + pub async fn send_chat_packet(&self, message: &str) -> Result<(), std::io::Error> { + // TODO: chat signing + let signature = sign_message(); + let packet = ServerboundChatPacket { + message: message.to_string(), + timestamp: SystemTime::now() + .duration_since(UNIX_EPOCH) + .expect("Time shouldn't be before epoch") + .as_millis() + .try_into() + .expect("Instant should fit into a u64"), + salt: azalea_crypto::make_salt(), + signature, + signed_preview: false, + last_seen_messages: LastSeenMessagesUpdate::default(), + } + .get(); + self.write_packet(packet).await + } + + /// Send a command packet to the server. The `command` argument should not + /// include the slash at the front. + pub async fn send_command_packet(&self, command: &str) -> Result<(), std::io::Error> { + // TODO: chat signing + let packet = ServerboundChatCommandPacket { + command: command.to_string(), + timestamp: SystemTime::now() + .duration_since(UNIX_EPOCH) + .expect("Time shouldn't be before epoch") + .as_millis() + .try_into() + .expect("Instant should fit into a u64"), + salt: azalea_crypto::make_salt(), + argument_signatures: vec![], + signed_preview: false, + last_seen_messages: LastSeenMessagesUpdate::default(), + } + .get(); + self.write_packet(packet).await + } + + pub async fn chat(&self, message: &str) -> Result<(), std::io::Error> { + if message.chars().next() == Some('/') { + self.send_command_packet(&message[1..]).await + } else { + self.send_chat_packet(message).await + } + } + + // will be used for when the server tells the client about a chat preview + // with custom formatting + // pub fn acknowledge_preview(&self, message: &str) {} +} + +// TODO +// MessageSigner, ChatMessageContent, LastSeenMessages +fn sign_message() -> MessageSignature { + MessageSignature::default() +} diff --git a/azalea-client/src/lib.rs b/azalea-client/src/lib.rs index c30ca103..1ed30394 100755 --- a/azalea-client/src/lib.rs +++ b/azalea-client/src/lib.rs @@ -1,6 +1,7 @@ //! Significantly abstract azalea-protocol so it's actually useable for bots. mod account; +mod chat; mod client; mod get_mc_dir; mod movement; |
