use crate::prelude::*; use base64::{engine::general_purpose::STANDARD as B64_ENGINE, Engine as _}; use futures::future; use itertools::Itertools; use sha2::{Digest, Sha256}; use teloxide::types::{InlineKeyboardButton, InlineKeyboardMarkup, KeyboardButton, KeyboardMarkup}; /// Creates a markup of all user's account names #[inline] pub async fn account_markup( user_id: u64, db: &DatabaseConnection, ) -> crate::Result { let account_names: Vec> = Account::get_names(user_id, db) .await? .map_ok(KeyboardButton::new) .try_chunks(3) .map_err(|err| err.1) .try_collect() .await?; let markup = KeyboardMarkup::new(account_names) .resize_keyboard(true) .one_time_keyboard(true); Ok(markup) } /// Creates a markup with a "Delete message" button. /// This markup should be added for all messages that won't be deleted afterwards #[inline] pub fn deletion_markup() -> InlineKeyboardMarkup { let button = InlineKeyboardButton::callback("Delete message", "delete_message"); InlineKeyboardMarkup::new([[button]]) }