use rustigram::prelude::*;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
tracing_subscriber::fmt().init();
let token = std::env::var("BOT_TOKEN").expect("BOT_TOKEN not set");
let bot = Bot::new(token)?;
bot.dispatcher()
.on(filters::command("secret"), handler_fn(secret_handler))
.on(filters::callback_data("reveal"), handler_fn(reveal_handler))
.build()
.polling()
.await?;
Ok(())
}
async fn secret_handler(ctx: Context) -> BotResult<()> {
let markup = InlineKeyboardMarkup::new().row(vec![InlineKeyboardButton::callback(
"Tap for a secret",
"reveal",
)]);
if let Some(chat_id) = ctx.chat_id() {
ctx.bot
.send_message(chat_id, "Tap the button below.")
.reply_markup(ReplyMarkup::InlineKeyboard(markup))
.await?;
}
Ok(())
}
async fn reveal_handler(ctx: Context) -> BotResult<()> {
let (Some(query), Some(chat_id), Some(user_id)) =
(ctx.callback_query(), ctx.chat_id(), ctx.from_id())
else {
return Ok(());
};
ctx.bot.answer_callback_query(&query.id).await?;
let ephemeral = ctx
.bot
.send_message(chat_id.clone(), "🤫 This is just between us.")
.receiver_user_id(user_id)
.callback_query_id(&query.id)
.await?;
let Some(ephemeral_id) = ephemeral.ephemeral_message_id else {
return Ok(());
};
ctx.bot
.edit_ephemeral_message_text(
chat_id.clone(),
user_id,
ephemeral_id,
"Still just between us — vanishing in 3 seconds.",
)
.await?;
tokio::time::sleep(std::time::Duration::from_secs(3)).await;
ctx.bot
.delete_ephemeral_message(chat_id, user_id, ephemeral_id)
.await?;
Ok(())
}