Message router refactor
+ Created the WoxlfMessage struct to streamline interface + Message tasks are now joined at once instead of sequentially + Clippy + fmt
This commit is contained in:
+55
-63
@@ -10,14 +10,16 @@ use serenity::framework::standard::{
|
||||
use serenity::framework::StandardFramework;
|
||||
use serenity::model::guild::Member;
|
||||
use serenity::model::id::ChannelId;
|
||||
use serenity::model::prelude::{GuildId, Message, UserId};
|
||||
use serenity::model::prelude::{Message, UserId};
|
||||
use serenity::prelude::Context;
|
||||
use serenity::utils::MessageBuilder;
|
||||
|
||||
use crate::discord::helper::{add_user_to_game, parse_duration_arg};
|
||||
use crate::error::{Result, WoxlfError};
|
||||
use crate::game::global_data::GlobalData;
|
||||
use crate::game::message_router::{dispatch_message, MessageDest, MessageSource};
|
||||
use crate::game::message_router::{
|
||||
dispatch_message, Median, MessageDest, MessageSource, WoxlfMessage,
|
||||
};
|
||||
use crate::game::player_data::PlayerData;
|
||||
use crate::game::Phase;
|
||||
use crate::messages::DiscordUser;
|
||||
@@ -161,23 +163,20 @@ async fn end(ctx: &Context, msg: &Message, mut _args: Args) -> CommandResult {
|
||||
#[command]
|
||||
#[only_in(guilds)]
|
||||
#[allowed_roles("wolfx host")]
|
||||
async fn say(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
||||
let mut data = ctx.data.write().await;
|
||||
let global_data = data.get_mut::<GlobalData>().unwrap();
|
||||
let guild = msg.guild(&ctx.cache).unwrap();
|
||||
async fn say(ctx: &Context, _msg: &Message, args: Args) -> CommandResult {
|
||||
let data = ctx.data.read().await;
|
||||
let global_data = data.get::<GlobalData>().unwrap();
|
||||
|
||||
let mut global_data = global_data.lock().await;
|
||||
let global_data = global_data.lock().await;
|
||||
|
||||
dispatch_message(
|
||||
ctx,
|
||||
&guild,
|
||||
&mut global_data,
|
||||
MessageSource::Host,
|
||||
MessageDest::Broadcast,
|
||||
args.rest(),
|
||||
None,
|
||||
)
|
||||
.await?;
|
||||
let msg = WoxlfMessage::default()
|
||||
.source(MessageSource::Host)
|
||||
.dest(MessageDest::Broadcast)
|
||||
.median(Median::Webhook)
|
||||
.content(args.rest())
|
||||
.clone();
|
||||
|
||||
dispatch_message(ctx, &global_data, msg).await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@@ -185,27 +184,24 @@ async fn say(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
||||
#[command]
|
||||
#[only_in(guilds)]
|
||||
#[allowed_roles("wolfx host")]
|
||||
async fn broadcast(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
||||
let mut data = ctx.data.write().await;
|
||||
let global_data = data.get_mut::<GlobalData>().unwrap();
|
||||
let guild = msg.guild(&ctx.cache).unwrap();
|
||||
async fn broadcast(ctx: &Context, _msg: &Message, args: Args) -> CommandResult {
|
||||
let data = ctx.data.read().await;
|
||||
let global_data = data.get::<GlobalData>().unwrap();
|
||||
|
||||
let mut global_data = global_data.lock().await;
|
||||
let global_data = global_data.lock().await;
|
||||
|
||||
let msg = global_data
|
||||
let broadcast = global_data
|
||||
.templates()?
|
||||
.build_announcement(&global_data, args.rest())?;
|
||||
|
||||
dispatch_message(
|
||||
ctx,
|
||||
&guild,
|
||||
&mut global_data,
|
||||
MessageSource::Automated,
|
||||
MessageDest::Broadcast,
|
||||
&msg,
|
||||
None,
|
||||
)
|
||||
.await?;
|
||||
let woxlf_msg = WoxlfMessage::default()
|
||||
.source(MessageSource::Automated)
|
||||
.dest(MessageDest::Broadcast)
|
||||
.content(&broadcast)
|
||||
.median(Median::Webhook)
|
||||
.clone();
|
||||
|
||||
dispatch_message(ctx, &global_data, woxlf_msg).await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@@ -234,16 +230,14 @@ async fn next_phase(ctx: &Context, msg: &Message, mut args: Args) -> CommandResu
|
||||
.templates()?
|
||||
.build_announcement(&global_data, &broadcast)?;
|
||||
|
||||
dispatch_message(
|
||||
ctx,
|
||||
&guild,
|
||||
&mut global_data,
|
||||
MessageSource::Automated,
|
||||
MessageDest::Broadcast,
|
||||
&broadcast,
|
||||
None,
|
||||
)
|
||||
.await?;
|
||||
let woxlf_msg = WoxlfMessage::default()
|
||||
.source(MessageSource::Automated)
|
||||
.dest(MessageDest::Broadcast)
|
||||
.median(Median::Webhook)
|
||||
.content(&broadcast)
|
||||
.clone();
|
||||
|
||||
dispatch_message(ctx, &global_data, woxlf_msg).await?;
|
||||
|
||||
if global_data.game_state_mut()?.current_phase == Phase::Day {
|
||||
let vote_channel = guild
|
||||
@@ -311,7 +305,6 @@ async fn kill(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
|
||||
async fn add_time(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult {
|
||||
let mut data = ctx.data.write().await;
|
||||
let global_data = data.get_mut::<GlobalData>().unwrap();
|
||||
let guild = msg.guild(&ctx.cache).unwrap();
|
||||
|
||||
let mut global_data = global_data.lock().await;
|
||||
|
||||
@@ -335,16 +328,14 @@ async fn add_time(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult
|
||||
.templates()?
|
||||
.build_announcement(&global_data, &broadcast)?;
|
||||
|
||||
dispatch_message(
|
||||
ctx,
|
||||
&guild,
|
||||
&mut global_data,
|
||||
MessageSource::Automated,
|
||||
MessageDest::Broadcast,
|
||||
&broadcast,
|
||||
None,
|
||||
)
|
||||
.await?;
|
||||
let woxlf_msg = WoxlfMessage::default()
|
||||
.source(MessageSource::Automated)
|
||||
.dest(MessageDest::Broadcast)
|
||||
.median(Median::Webhook)
|
||||
.content(&broadcast)
|
||||
.clone();
|
||||
|
||||
dispatch_message(ctx, &global_data, woxlf_msg).await?;
|
||||
|
||||
msg.reply(&ctx.http, "Phase has been updated")
|
||||
.await
|
||||
@@ -651,13 +642,9 @@ async fn whisper(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult
|
||||
msg.reply(&ctx.http, "Need a recipient and message!")
|
||||
.await?;
|
||||
} else {
|
||||
let data = ctx.data.write().await;
|
||||
let data = ctx.data.read().await;
|
||||
let global_data = data.get::<GlobalData>().unwrap();
|
||||
let mut global_data = global_data.lock().await;
|
||||
|
||||
let guild = GuildId::from(global_data.cfg.discord_config.guild_id)
|
||||
.to_guild_cached(&ctx.cache)
|
||||
.unwrap();
|
||||
let global_data = global_data.lock().await;
|
||||
|
||||
let target = args.single::<String>()?;
|
||||
let pm = args.rest();
|
||||
@@ -680,9 +667,14 @@ async fn whisper(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let msg_src = MessageSource::Player(Box::new(src_player.clone()));
|
||||
let msg_dest = MessageDest::PlayerDm(Box::new(target_player.clone()));
|
||||
dispatch_message(ctx, &guild, &mut global_data, msg_src, msg_dest, pm, None).await?;
|
||||
let woxlf_msg = WoxlfMessage::default()
|
||||
.source(MessageSource::Player(Box::new(src_player.clone())))
|
||||
.dest(MessageDest::Player(Box::new(target_player.clone())))
|
||||
.median(Median::DirectMessage)
|
||||
.content(pm)
|
||||
.clone();
|
||||
|
||||
dispatch_message(ctx, &global_data, woxlf_msg).await?;
|
||||
} else {
|
||||
msg.reply(
|
||||
&ctx.http,
|
||||
|
||||
@@ -6,8 +6,8 @@ use serenity::model::prelude::AttachmentType;
|
||||
use serenity::utils::parse_emoji;
|
||||
|
||||
use crate::game::global_data::GlobalData;
|
||||
use crate::game::message_router::MessageSource;
|
||||
use crate::game::message_router::{dispatch_message, MessageDest};
|
||||
use crate::game::message_router::{Median, MessageSource, WoxlfMessage};
|
||||
|
||||
pub struct Handler {}
|
||||
|
||||
@@ -26,7 +26,7 @@ impl EventHandler for Handler {
|
||||
|
||||
let global_data = data.get::<GlobalData>().unwrap();
|
||||
|
||||
let mut global_data = global_data.lock().await;
|
||||
let global_data = global_data.lock().await;
|
||||
|
||||
if global_data.game_state.is_none() {
|
||||
// no game in progress
|
||||
@@ -43,7 +43,6 @@ impl EventHandler for Handler {
|
||||
return;
|
||||
}
|
||||
|
||||
let guild = msg.guild(&ctx.cache).unwrap();
|
||||
let user_msg = msg.content.clone();
|
||||
|
||||
let re = regex::Regex::new(r"<a?:.+:\d+>").unwrap();
|
||||
@@ -68,19 +67,17 @@ impl EventHandler for Handler {
|
||||
.map(|a| AttachmentType::Image((a.url).parse().unwrap()))
|
||||
.collect();
|
||||
|
||||
let msg_source = MessageSource::Player(Box::new(player_data.clone()));
|
||||
let woxlf_msg = WoxlfMessage::default()
|
||||
.source(MessageSource::Player(Box::new(player_data.clone())))
|
||||
.dest(MessageDest::Broadcast)
|
||||
.median(Median::Webhook)
|
||||
.content(&user_msg)
|
||||
.attachments(attachments)
|
||||
.clone();
|
||||
|
||||
dispatch_message(
|
||||
&ctx,
|
||||
&guild,
|
||||
&mut global_data,
|
||||
msg_source,
|
||||
MessageDest::Broadcast,
|
||||
&user_msg,
|
||||
Some(attachments),
|
||||
)
|
||||
.await
|
||||
.expect("Unable to send message to players");
|
||||
dispatch_message(&ctx, &global_data, woxlf_msg)
|
||||
.await
|
||||
.expect("Unable to send message to players");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user