phoebe/services/phoebe-discord/src/sender.rs

56 lines
1.7 KiB
Rust
Raw Normal View History

use phoebe::{
mid_chat::{ChatMessage, ChatMessageReference, ChatReference},
2022-04-16 09:16:51 +00:00
prelude::{future, Result},
};
use serenity::{model::prelude::*, prelude::*};
2022-04-16 09:16:51 +00:00
use crate::{chat_conv, discord_reference, DiscordService};
pub async fn send_discord_message(
2022-04-16 09:16:51 +00:00
discord: &mut DiscordService,
source: &ChatMessage,
destination_channel: ChatReference,
) -> Result<ChatMessageReference> {
// TODO: If we have a webhook we should use the webhook
let channel_id = destination_channel.id.parse::<ChannelId>()?;
let formatted_message = chat_conv::format(&source.content);
let content = format!(
"{} ({}): {}",
source.author.display_name, source.author.reference.service, formatted_message
);
2022-04-16 09:16:51 +00:00
let discord_reply = if let Some(reply) = &source.replying {
if let Some(reply_ref) = discord
.lookup_message(reply, |r| future::ready(r.channel == destination_channel))
.await
{
assert_eq!(reply_ref.channel.service, "discord");
let channel_id: ChannelId = reply_ref.channel.id.parse().unwrap();
let message_id: MessageId = reply_ref.message_id.parse::<u64>().unwrap().into();
Some((channel_id, message_id))
} else {
None
}
} else {
None
};
let sent_message = channel_id
2022-04-16 09:16:51 +00:00
.send_message(&discord.ctx, move |m| {
let m = m.content(content);
2022-04-16 09:16:51 +00:00
if let Some(reply) = discord_reply {
m.reference_message(reply)
} else {
m
}
})
.await?;
Ok(ChatMessageReference::new(
discord_reference(sent_message.channel_id),
sent_message.id,
))
}