65 lines
1.9 KiB
Rust
65 lines
1.9 KiB
Rust
use crate::game::listener::{EventStatus, Listener, ListenerContext, Priority};
|
|
use crate::game::message_router::{Median, MessageDest, MessageSource, send_private_message, WoxlfMessage};
|
|
use crate::game::role::Role;
|
|
use serenity::async_trait;
|
|
use serenity::model::prelude::UserId;
|
|
use serenity::utils::MessageBuilder;
|
|
|
|
#[derive(Debug)]
|
|
pub struct SpyListener {}
|
|
|
|
#[async_trait]
|
|
impl Listener for SpyListener {
|
|
fn get_priority(&self) -> Priority {
|
|
Priority::Logging
|
|
}
|
|
|
|
async fn on_chat(
|
|
&mut self,
|
|
ctx: &mut ListenerContext,
|
|
msg: &WoxlfMessage,
|
|
) -> crate::error::Result<EventStatus> {
|
|
if msg.median != Median::DirectMessage {
|
|
return Ok(EventStatus::Okay);
|
|
}
|
|
|
|
let src_player = if let MessageSource::Player(p) = &msg.source {
|
|
p
|
|
} else {
|
|
return Ok(EventStatus::Okay);
|
|
};
|
|
|
|
let dest_player = if let MessageDest::Player(p) = &msg.dest {
|
|
p
|
|
} else {
|
|
return Ok(EventStatus::Okay);
|
|
};
|
|
|
|
|
|
let spy_player = ctx
|
|
.data
|
|
.game_state()?
|
|
.player_data
|
|
.iter()
|
|
.find(|p| p.alive && p.role == Role::Spy);
|
|
|
|
if let Some(spy_player) = spy_player {
|
|
if spy_player.discord_id == dest_player.discord_id || spy_player.discord_id == src_player.discord_id {
|
|
return Ok(EventStatus::Okay);
|
|
}
|
|
|
|
let msg_content = MessageBuilder::default()
|
|
.push_bold_line_safe(format!(
|
|
"{} Sent {} a private message:",
|
|
src_player.codename, dest_player.codename
|
|
))
|
|
.push(msg.content.clone())
|
|
.build();
|
|
|
|
send_private_message(&ctx.ctx.http, UserId::from(spy_player.discord_id), &msg_content, &None).await?
|
|
}
|
|
|
|
return Ok(EventStatus::Okay);
|
|
}
|
|
}
|