2023-01-08 23:23:50 +00:00
|
|
|
use crate::game::listener::{EventStatus, Listener, ListenerContext, Priority};
|
2023-01-09 03:13:31 +00:00
|
|
|
use crate::game::message_router::{
|
|
|
|
send_private_message, Median, MessageDest, MessageSource, WoxlfMessage,
|
|
|
|
};
|
2023-01-08 23:23:50 +00:00
|
|
|
use crate::game::role::Role;
|
2023-01-09 03:13:31 +00:00
|
|
|
use rand::{thread_rng, Rng};
|
2023-01-08 23:23:50 +00:00
|
|
|
use serenity::async_trait;
|
|
|
|
use serenity::model::prelude::UserId;
|
|
|
|
use serenity::utils::MessageBuilder;
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
2023-01-28 20:36:22 +00:00
|
|
|
pub struct SpyListener {
|
|
|
|
pub role: Role
|
|
|
|
}
|
2023-01-08 23:23:50 +00:00
|
|
|
|
|
|
|
#[async_trait]
|
|
|
|
impl Listener for SpyListener {
|
2023-02-15 01:46:19 +00:00
|
|
|
fn name(&self) -> String {
|
|
|
|
format!("{} DM Listener", self.role)
|
|
|
|
}
|
|
|
|
|
2023-01-08 23:23:50 +00:00
|
|
|
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()
|
2023-01-28 20:36:22 +00:00
|
|
|
.find(|p| p.alive && p.role == self.role);
|
2023-01-08 23:23:50 +00:00
|
|
|
|
|
|
|
if let Some(spy_player) = spy_player {
|
2023-01-09 03:13:31 +00:00
|
|
|
if spy_player.discord_id == dest_player.discord_id
|
|
|
|
|| spy_player.discord_id == src_player.discord_id
|
|
|
|
{
|
2023-01-08 23:23:50 +00:00
|
|
|
return Ok(EventStatus::Okay);
|
|
|
|
}
|
|
|
|
|
2023-01-09 03:13:31 +00:00
|
|
|
// 1/4 chance to intercept message
|
|
|
|
if thread_rng().gen_bool(0.25) {
|
2023-02-15 01:46:19 +00:00
|
|
|
println!("Sending a spy message...");
|
|
|
|
|
2023-01-09 03:13:31 +00:00
|
|
|
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();
|
2023-01-08 23:23:50 +00:00
|
|
|
|
2023-01-09 03:13:31 +00:00
|
|
|
send_private_message(
|
|
|
|
&ctx.ctx.http,
|
|
|
|
UserId::from(spy_player.discord_id),
|
|
|
|
&msg_content,
|
|
|
|
&None,
|
|
|
|
)
|
|
|
|
.await?
|
|
|
|
}
|
2023-01-08 23:23:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return Ok(EventStatus::Okay);
|
|
|
|
}
|
|
|
|
}
|