pub enum ChatPacket {
System(Arc<ClientboundSystemChat>),
Player(Arc<ClientboundPlayerChat>),
Disguised(Arc<ClientboundDisguisedChat>),
}Expand description
A chat packet, either a system message or a chat message.
Variants§
System(Arc<ClientboundSystemChat>)
Player(Arc<ClientboundPlayerChat>)
Disguised(Arc<ClientboundDisguisedChat>)
Implementations§
Source§impl ChatPacket
impl ChatPacket
Sourcepub fn message(&self) -> FormattedText
pub fn message(&self) -> FormattedText
Get the message shown in chat for this packet.
See Self::split_sender_and_content for more details about how this
works.
Examples found in repository?
135async fn handle(bot: Client, event: azalea::Event, state: State) -> anyhow::Result<()> {
136 let swarm = bot.resource::<SwarmState>();
137
138 match event {
139 azalea::Event::Init => {
140 bot.set_client_information(ClientInformation {
141 view_distance: 32,
142 ..Default::default()
143 });
144 if swarm.args.pathfinder_debug_particles {
145 bot.ecs
146 .write()
147 .entity_mut(bot.entity)
148 .insert(PathfinderDebugParticles);
149 }
150 }
151 azalea::Event::Chat(chat) => {
152 let (Some(username), content) = chat.split_sender_and_content() else {
153 return Ok(());
154 };
155 if username != swarm.args.owner_username {
156 return Ok(());
157 }
158
159 println!("{:?}", chat.message());
160
161 let command = if chat.is_whisper() {
162 Some(content)
163 } else {
164 content.strip_prefix('!').map(|s| s.to_owned())
165 };
166 if let Some(command) = command {
167 match swarm.commands.execute(
168 command,
169 Mutex::new(CommandSource {
170 bot: bot.clone(),
171 chat: chat.clone(),
172 state: state.clone(),
173 }),
174 ) {
175 Ok(_) => {}
176 Err(err) => {
177 eprintln!("{err:?}");
178 let command_source = CommandSource {
179 bot,
180 chat: chat.clone(),
181 state: state.clone(),
182 };
183 command_source.reply(format!("{err:?}"));
184 }
185 }
186 }
187 }
188 azalea::Event::Tick => {
189 killaura::tick(bot.clone(), state.clone())?;
190
191 let task = *state.task.lock();
192 match task {
193 BotTask::None => {}
194 }
195 }
196 azalea::Event::Login => {
197 println!("Got login event")
198 }
199 _ => {}
200 }
201
202 Ok(())
203}
204async fn swarm_handle(_swarm: Swarm, event: SwarmEvent, _state: SwarmState) -> anyhow::Result<()> {
205 match &event {
206 SwarmEvent::Disconnect(account, _join_opts) => {
207 println!("bot got kicked! {}", account.username());
208 }
209 SwarmEvent::Chat(chat) => {
210 if chat.message().to_string() == "The particle was not visible for anybody" {
211 return Ok(());
212 }
213 println!("{}", chat.message().to_ansi());
214 }
215 _ => {}
216 }
217
218 Ok(())
219}Sourcepub fn split_sender_and_content(&self) -> (Option<String>, String)
pub fn split_sender_and_content(&self) -> (Option<String>, String)
A convenience function to determine the username of the sender and the content of a chat message.
This does not preserve formatting codes.
This function uses a few checks to attempt to split the chat message, and is intended to work on most servers. It won’t work for every server though, so in certain cases you may have to reimplement this yourself.
If it’s not a player-sent chat message or the sender couldn’t be determined, the username part will be None.
Also see Self::sender and Self::content if you only need one of
the parts.
Examples found in repository?
19async fn handle(bot: Client, event: Event, _state: State) -> anyhow::Result<()> {
20 if let Event::Chat(m) = event
21 && let (Some(sender), content) = m.split_sender_and_content()
22 {
23 if sender == bot.username() {
24 // ignore our own messages
25 return Ok(());
26 }
27 bot.chat(content);
28 }
29
30 Ok(())
31}More examples
135async fn handle(bot: Client, event: azalea::Event, state: State) -> anyhow::Result<()> {
136 let swarm = bot.resource::<SwarmState>();
137
138 match event {
139 azalea::Event::Init => {
140 bot.set_client_information(ClientInformation {
141 view_distance: 32,
142 ..Default::default()
143 });
144 if swarm.args.pathfinder_debug_particles {
145 bot.ecs
146 .write()
147 .entity_mut(bot.entity)
148 .insert(PathfinderDebugParticles);
149 }
150 }
151 azalea::Event::Chat(chat) => {
152 let (Some(username), content) = chat.split_sender_and_content() else {
153 return Ok(());
154 };
155 if username != swarm.args.owner_username {
156 return Ok(());
157 }
158
159 println!("{:?}", chat.message());
160
161 let command = if chat.is_whisper() {
162 Some(content)
163 } else {
164 content.strip_prefix('!').map(|s| s.to_owned())
165 };
166 if let Some(command) = command {
167 match swarm.commands.execute(
168 command,
169 Mutex::new(CommandSource {
170 bot: bot.clone(),
171 chat: chat.clone(),
172 state: state.clone(),
173 }),
174 ) {
175 Ok(_) => {}
176 Err(err) => {
177 eprintln!("{err:?}");
178 let command_source = CommandSource {
179 bot,
180 chat: chat.clone(),
181 state: state.clone(),
182 };
183 command_source.reply(format!("{err:?}"));
184 }
185 }
186 }
187 }
188 azalea::Event::Tick => {
189 killaura::tick(bot.clone(), state.clone())?;
190
191 let task = *state.task.lock();
192 match task {
193 BotTask::None => {}
194 }
195 }
196 azalea::Event::Login => {
197 println!("Got login event")
198 }
199 _ => {}
200 }
201
202 Ok(())
203}Sourcepub fn sender(&self) -> Option<String>
pub fn sender(&self) -> Option<String>
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.
See Self::split_sender_and_content for more details about how this
works.
Examples found in repository?
23 pub fn reply(&self, message: impl Into<String>) {
24 let message = message.into();
25 if self.chat.is_whisper() {
26 self.bot
27 .chat(format!("/w {} {message}", self.chat.sender().unwrap()));
28 } else {
29 self.bot.chat(message);
30 }
31 }
32
33 pub fn entity(&self) -> Option<azalea::EntityRef> {
34 let username = self.chat.sender()?;
35 self.bot
36 .any_entity_by::<&GameProfileComponent, With<Player>>(
37 |profile: &GameProfileComponent| profile.name == username,
38 )
39 }More examples
27async fn handle(bot: Client, event: Event, state: State) -> anyhow::Result<()> {
28 if let Event::Chat(m) = event {
29 if m.sender() == Some(bot.username()) {
30 return Ok(());
31 };
32 if m.content() != "go" {
33 return Ok(());
34 }
35
36 steal(bot, state).await?;
37 }
38
39 Ok(())
40}Sourcepub fn sender_uuid(&self) -> Option<Uuid>
pub fn sender_uuid(&self) -> Option<Uuid>
Get the UUID of the sender of the message.
If it’s not a player-sent chat message, this will be None (this is sometimes the case when a server uses a plugin to modify chat messages).
Sourcepub fn content(&self) -> String
pub fn content(&self) -> String
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.
Examples found in repository?
27async fn handle(bot: Client, event: Event, state: State) -> anyhow::Result<()> {
28 if let Event::Chat(m) = event {
29 if m.sender() == Some(bot.username()) {
30 return Ok(());
31 };
32 if m.content() != "go" {
33 return Ok(());
34 }
35
36 steal(bot, state).await?;
37 }
38
39 Ok(())
40}Sourcepub fn new(message: &str) -> ChatPacket
pub fn new(message: &str) -> ChatPacket
Create a new ChatPacket from a string. This is meant to be used as a
convenience function for testing.
Sourcepub fn is_whisper(&self) -> bool
pub fn is_whisper(&self) -> bool
Whether this message is an incoming whisper message (i.e. someone else messaged the bot with /msg).
This is not guaranteed to work correctly on custom servers.
Examples found in repository?
More examples
135async fn handle(bot: Client, event: azalea::Event, state: State) -> anyhow::Result<()> {
136 let swarm = bot.resource::<SwarmState>();
137
138 match event {
139 azalea::Event::Init => {
140 bot.set_client_information(ClientInformation {
141 view_distance: 32,
142 ..Default::default()
143 });
144 if swarm.args.pathfinder_debug_particles {
145 bot.ecs
146 .write()
147 .entity_mut(bot.entity)
148 .insert(PathfinderDebugParticles);
149 }
150 }
151 azalea::Event::Chat(chat) => {
152 let (Some(username), content) = chat.split_sender_and_content() else {
153 return Ok(());
154 };
155 if username != swarm.args.owner_username {
156 return Ok(());
157 }
158
159 println!("{:?}", chat.message());
160
161 let command = if chat.is_whisper() {
162 Some(content)
163 } else {
164 content.strip_prefix('!').map(|s| s.to_owned())
165 };
166 if let Some(command) = command {
167 match swarm.commands.execute(
168 command,
169 Mutex::new(CommandSource {
170 bot: bot.clone(),
171 chat: chat.clone(),
172 state: state.clone(),
173 }),
174 ) {
175 Ok(_) => {}
176 Err(err) => {
177 eprintln!("{err:?}");
178 let command_source = CommandSource {
179 bot,
180 chat: chat.clone(),
181 state: state.clone(),
182 };
183 command_source.reply(format!("{err:?}"));
184 }
185 }
186 }
187 }
188 azalea::Event::Tick => {
189 killaura::tick(bot.clone(), state.clone())?;
190
191 let task = *state.task.lock();
192 match task {
193 BotTask::None => {}
194 }
195 }
196 azalea::Event::Login => {
197 println!("Got login event")
198 }
199 _ => {}
200 }
201
202 Ok(())
203}Trait Implementations§
Source§impl Clone for ChatPacket
impl Clone for ChatPacket
Source§fn clone(&self) -> ChatPacket
fn clone(&self) -> ChatPacket
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ChatPacket
impl Debug for ChatPacket
Source§impl PartialEq for ChatPacket
impl PartialEq for ChatPacket
impl StructuralPartialEq for ChatPacket
Auto Trait Implementations§
impl Freeze for ChatPacket
impl RefUnwindSafe for ChatPacket
impl Send for ChatPacket
impl Sync for ChatPacket
impl Unpin for ChatPacket
impl UnsafeUnpin for ChatPacket
impl UnwindSafe for ChatPacket
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> CompatExt for T
impl<T> CompatExt for T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.