use std::sync::Arc;
use serenity::model::id::MessageId;
use tokio::sync::Mutex;
use super::DiscordState;
use super::tool_group::{GroupEntry, GroupState};
pub(crate) struct BubbleSlot {
mid: Arc<Mutex<Option<MessageId>>>,
birth: Mutex<()>,
}
impl BubbleSlot {
pub(crate) fn new() -> Self {
Self {
mid: Arc::new(Mutex::new(None)),
birth: Mutex::new(()),
}
}
pub(crate) fn mid_handle(&self) -> Arc<Mutex<Option<MessageId>>> {
self.mid.clone()
}
pub(crate) async fn read(&self) -> Option<MessageId> {
*self.mid.lock().await
}
pub(crate) async fn store(&self, mid: MessageId) {
*self.mid.lock().await = Some(mid);
}
pub(crate) async fn birth_claim(&self) -> tokio::sync::MutexGuard<'_, ()> {
self.birth.lock().await
}
}
pub(crate) async fn append_tool_entry(
dstate: &DiscordState,
channel: serenity::model::id::ChannelId,
http: &serenity::http::Http,
mid: MessageId,
entries: Vec<GroupEntry>,
label: &str,
) {
let group = dstate
.upsert_tool_group(
mid.get(),
GroupState {
page: 0,
entries,
notes: Vec::new(),
expanded: false,
started_at: std::time::Instant::now(),
settled: None,
},
)
.await;
let edit = serenity::builder::EditMessage::new()
.content(super::tool_group::render_content(&group))
.embeds(super::tool_group::render_embeds(&group))
.components(super::tool_group::render_components(&group, mid.get()));
if let Some(Err(e)) =
super::governor::edit_chrome(&dstate.governor, channel, http, mid, edit).await
{
tracing::warn!("Discord: {label} tool group edit failed (append): {e}");
}
}