use std::fmt;
use grammers_mtsender::InvocationError;
use grammers_session::types::{PeerId, PeerRef};
use grammers_session::updates::State;
use grammers_tl_types as tl;
use crate::Client;
use crate::message::InputMessage;
use crate::peer::{Peer, PeerMap, User};
#[derive(Clone)]
pub struct InlineSend {
pub raw: tl::enums::Update,
pub state: State,
pub(crate) client: Client,
pub(crate) peers: PeerMap,
}
impl InlineSend {
fn update(&self) -> &tl::types::UpdateBotInlineSend {
match &self.raw {
tl::enums::Update::BotInlineSend(update) => update,
_ => unreachable!(),
}
}
pub fn text(&self) -> &str {
self.update().query.as_str()
}
pub fn sender_id(&self) -> PeerId {
PeerId::user_unchecked(self.update().user_id)
}
pub async fn sender_ref(&self) -> Option<PeerRef> {
self.peers.get_ref(self.sender_id()).await
}
pub fn sender(&self) -> Option<&User> {
match self.peers.get(self.sender_id()) {
Some(Peer::User(user)) => Some(user),
None => None,
_ => unreachable!(),
}
}
pub fn result_id(&self) -> &str {
self.update().id.as_str()
}
pub fn message_id(&self) -> Option<tl::enums::InputBotInlineMessageId> {
self.update().msg_id.clone()
}
pub async fn edit_message(
&self,
input_message: impl Into<InputMessage>,
) -> Result<Option<bool>, InvocationError> {
let msg_id = match self.update().msg_id.clone() {
None => return Ok(None),
Some(msg_id) => msg_id,
};
Ok(Some(
self.client
.edit_inline_message(msg_id, input_message.into())
.await?,
))
}
}
impl fmt::Debug for InlineSend {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("InlineSend")
.field("text", &self.text())
.field("sender", &self.sender())
.field("result_id", &self.result_id())
.field("message_id", &self.message_id())
.finish()
}
}