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

97 lines
2.5 KiB
Rust
Raw Normal View History

use phoebe::{
mid_chat::{self, ChatMessage, ChatMessageReference, ChatReference},
prelude::*,
2022-04-16 09:16:51 +00:00
DynServiceLookup,
};
2022-04-11 11:52:29 +00:00
use serenity::{client::Context, Client};
2022-04-08 16:52:59 +00:00
use tracing::{debug, info};
2022-04-11 11:52:29 +00:00
mod chat_conv;
mod handler;
2022-04-16 09:16:51 +00:00
mod lookup;
mod sender;
2022-04-08 16:52:59 +00:00
2022-04-11 11:52:29 +00:00
pub fn discord_reference(id: impl ToString) -> mid_chat::ChatReference {
mid_chat::ChatReference {
service: "discord",
id: id.to_string(),
}
2022-04-08 16:52:59 +00:00
}
2022-04-11 11:52:29 +00:00
pub struct DiscordService {
2022-04-16 09:16:51 +00:00
pub core_db: SqlitePool,
pub discord_media_db: SqlitePool,
pub ctx: Context,
pub dyn_service: DynServiceLookup,
2022-04-08 16:52:59 +00:00
}
2022-04-16 09:16:51 +00:00
pub async fn setup(
core_db: SqlitePool,
tx: ChatEventSender,
dyn_service: DynServiceLookup,
) -> Result<DiscordService> {
2022-04-08 16:52:59 +00:00
info!("Setting up Discord service…");
let discord_media_db = phoebe::db::open("discord_media").await?;
sqlx::migrate!().run(&discord_media_db).await?;
2022-04-11 11:52:29 +00:00
let (ctx_tx, mut ctx_rx) = tokio::sync::mpsc::unbounded_channel::<Context>();
2022-04-08 16:52:59 +00:00
2022-04-11 11:52:29 +00:00
let discord_handler = handler::DiscordHandler {
2022-04-16 09:16:51 +00:00
core_db: core_db.clone(),
discord_media_db: discord_media_db.clone(),
2022-04-08 16:52:59 +00:00
chat_event_tx: tx,
ctx_tx,
};
debug!("Logging in…");
let discord_token = std::env::var("PHOEBE_DISCORD_TOKEN")
.expect("PHOEBE_DISCORD_TOKEN environment variable was not set!");
2022-04-11 11:52:29 +00:00
let mut client = Client::builder(&discord_token)
2022-04-08 16:52:59 +00:00
.event_handler(discord_handler)
.await?;
2022-04-11 11:52:29 +00:00
tokio::spawn(async move {
client
.start()
.await
.expect("Failed to start Discord client")
});
2022-04-08 16:52:59 +00:00
let discord_ctx = ctx_rx.recv().await.expect("Couldn't get Discord context");
debug!("Logged in!");
2022-04-16 09:16:51 +00:00
Ok(DiscordService {
core_db,
discord_media_db,
ctx: discord_ctx,
dyn_service,
})
2022-04-08 16:52:59 +00:00
}
#[async_trait]
impl Service for DiscordService {
2022-04-17 12:03:21 +00:00
fn tag(&self) -> &'static str {
"discord"
}
async fn send_chat_message(
&mut self,
source: &ChatMessage,
destination_channel: ChatReference,
) -> Vec<ChatMessageReference> {
assert_eq!(destination_channel.service, "discord");
2022-04-16 09:16:51 +00:00
sender::send_discord_message(self, source, destination_channel)
.await
.ok()
.into_iter()
.collect()
2022-04-08 16:52:59 +00:00
}
2022-04-17 12:03:21 +00:00
async fn delete_message(&mut self, message: &ChatMessageReference) -> bool {
assert_eq!(message.channel.service, "discord");
sender::delete_discord_message(self, message).await.is_ok()
2022-04-08 16:52:59 +00:00
}
}