diff options
| author | mat <27899617+mat-1@users.noreply.github.com> | 2022-11-18 21:52:09 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-11-18 21:52:09 -0600 |
| commit | 7ad4b227267e3bb2da99ef5d76c30cd54d040157 (patch) | |
| tree | a0a2fe96b10552b433dd82b632d85cca7b902d86 /azalea-client/src/chat.rs | |
| parent | ad6da947cdd0e3eace84135e054c0bfd0e1351fa (diff) | |
| download | azalea-drasl-7ad4b227267e3bb2da99ef5d76c30cd54d040157.tar.xz | |
Add functions to get ChatPacket author and content (#42)
* Add functions to get ChatPacket author and content
* add ChatPacket::username and ChatPacket::content
Diffstat (limited to 'azalea-client/src/chat.rs')
| -rwxr-xr-x | azalea-client/src/chat.rs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/azalea-client/src/chat.rs b/azalea-client/src/chat.rs index 24ccbfd5..3a0efa95 100755 --- a/azalea-client/src/chat.rs +++ b/azalea-client/src/chat.rs @@ -9,6 +9,8 @@ use azalea_protocol::packets::game::{ serverbound_chat_command_packet::ServerboundChatCommandPacket, serverbound_chat_packet::ServerboundChatPacket, }; +use lazy_static::lazy_static; +use regex::Regex; use std::time::{SystemTime, UNIX_EPOCH}; /// A chat packet, either a system message or a chat message. @@ -26,6 +28,53 @@ impl ChatPacket { ChatPacket::Player(p) => p.message(false), } } + + /// Determine the username of the sender and content of the message. This + /// does not preserve formatting codes. If it's not a player-sent chat + /// message or the sender couldn't be determined, the username part will be + /// None. + pub fn split_sender_and_content(&self) -> (Option<String>, String) { + match self { + ChatPacket::Player(p) => ( + // If it's a player chat packet, then the sender and content + // are already split for us. + Some(p.chat_type.name.to_string()), + p.message.content(false).to_string(), + ), + ChatPacket::System(p) => { + let message = p.content.to_string(); + // Overlay messages aren't in chat + if p.overlay { + return (None, message); + } + // It's a system message, so we'll have to match the content + // with regex + lazy_static! { + static ref ANGLE_BRACKETS_RE: Regex = + Regex::new("^<([a-zA-Z_0-9]{1,16})> (.+)$").unwrap(); + } + if let Some(m) = ANGLE_BRACKETS_RE.captures(&message) { + return (Some(m[1].to_string()), m[2].to_string()); + } + + (None, message) + } + } + } + + /// Get the username of the sender of the message. If it's not a + /// player-sent chat message or the sender couldn't be determined, this + /// will be None. + pub fn username(&self) -> Option<String> { + self.split_sender_and_content().0 + } + + /// Get the content part of the message as a string. This does not preserve + /// formatting codes. If it's not a player-sent chat message or the sender + /// couldn't be determined, this will contain the entire message. + pub fn content(&self) -> String { + self.split_sender_and_content().1 + } } impl Client { |
