2023-06-29 14:33:26 +00:00
|
|
|
use crate::prelude::*;
|
2023-07-25 14:44:12 +00:00
|
|
|
use base64::{engine::general_purpose::STANDARD as B64_ENGINE, Engine as _};
|
|
|
|
use futures::future;
|
|
|
|
use itertools::Itertools;
|
|
|
|
use sha2::{Digest, Sha256};
|
2023-05-06 18:02:32 +00:00
|
|
|
use teloxide::types::{InlineKeyboardButton, InlineKeyboardMarkup, KeyboardButton, KeyboardMarkup};
|
2023-05-04 18:15:41 +00:00
|
|
|
|
2023-05-09 17:27:58 +00:00
|
|
|
/// Creates a markup of all user's account names
|
2023-05-04 18:15:41 +00:00
|
|
|
#[inline]
|
|
|
|
pub async fn account_markup(
|
|
|
|
user_id: u64,
|
|
|
|
db: &DatabaseConnection,
|
|
|
|
) -> crate::Result<KeyboardMarkup> {
|
2023-06-12 14:55:21 +00:00
|
|
|
let account_names: Vec<Vec<KeyboardButton>> = Account::get_names(user_id, db)
|
2023-05-04 18:15:41 +00:00
|
|
|
.await?
|
2023-05-07 10:20:11 +00:00
|
|
|
.map_ok(KeyboardButton::new)
|
2023-05-04 18:15:41 +00:00
|
|
|
.try_chunks(3)
|
2023-05-27 18:56:58 +00:00
|
|
|
.map_err(|err| err.1)
|
2023-05-04 18:15:41 +00:00
|
|
|
.try_collect()
|
|
|
|
.await?;
|
|
|
|
let markup = KeyboardMarkup::new(account_names)
|
|
|
|
.resize_keyboard(true)
|
|
|
|
.one_time_keyboard(true);
|
|
|
|
Ok(markup)
|
|
|
|
}
|
2023-05-06 18:02:32 +00:00
|
|
|
|
2023-07-25 16:09:34 +00:00
|
|
|
#[inline]
|
|
|
|
pub fn menu_markup(names: impl IntoIterator<Item = String>) -> InlineKeyboardMarkup {
|
|
|
|
let names = names
|
|
|
|
.into_iter()
|
|
|
|
.map(|name| {
|
|
|
|
let hash = <Sha256 as Digest>::digest(name.as_bytes());
|
|
|
|
let mut data = "get ".to_owned();
|
|
|
|
data.reserve(43);
|
|
|
|
B64_ENGINE.encode_string(hash, &mut data);
|
|
|
|
InlineKeyboardButton::callback(name, data)
|
|
|
|
})
|
|
|
|
.chunks(3);
|
|
|
|
|
|
|
|
InlineKeyboardMarkup::new(&names)
|
|
|
|
}
|
|
|
|
|
2023-05-09 17:27:58 +00:00
|
|
|
/// Creates a markup with a "Delete message" button.
|
|
|
|
/// This markup should be added for all messages that won't be deleted afterwards
|
2023-05-06 18:02:32 +00:00
|
|
|
#[inline]
|
|
|
|
pub fn deletion_markup() -> InlineKeyboardMarkup {
|
|
|
|
let button = InlineKeyboardButton::callback("Delete message", "delete_message");
|
|
|
|
InlineKeyboardMarkup::new([[button]])
|
|
|
|
}
|