use serde::{Deserialize, Serialize};
use crate::chat::ChatJoinRequest;
use crate::inline::{ChosenInlineResult, InlineQuery};
use crate::message::Message;
use crate::payments::{PreCheckoutQuery, ShippingQuery};
use crate::poll::{Poll, PollAnswer};
use crate::user::User;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Update {
pub update_id: i64,
#[serde(flatten)]
pub kind: UpdateKind,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum UpdateKind {
Message(Message),
EditedMessage(Message),
ChannelPost(Message),
EditedChannelPost(Message),
BusinessMessage(Message),
EditedBusinessMessage(Message),
InlineQuery(InlineQuery),
ChosenInlineResult(ChosenInlineResult),
CallbackQuery(CallbackQuery),
ShippingQuery(ShippingQuery),
PreCheckoutQuery(PreCheckoutQuery),
Poll(Poll),
PollAnswer(PollAnswer),
MyChatMember(ChatMemberUpdated),
ChatMember(ChatMemberUpdated),
ChatJoinRequest(ChatJoinRequest),
MessageReaction(MessageReactionUpdated),
MessageReactionCount(MessageReactionCountUpdated),
ChatBoost(ChatBoostUpdated),
RemovedChatBoost(ChatBoostRemoved),
ManagedBot(ManagedBotUpdated),
BusinessConnection(BusinessConnection),
DeletedBusinessMessages(BusinessMessagesDeleted),
PurchasedPaidMedia(PaidMediaPurchased),
}
impl Update {
#[must_use]
pub fn chat_id(&self) -> Option<i64> {
match &self.kind {
UpdateKind::Message(m)
| UpdateKind::EditedMessage(m)
| UpdateKind::ChannelPost(m)
| UpdateKind::EditedChannelPost(m)
| UpdateKind::BusinessMessage(m)
| UpdateKind::EditedBusinessMessage(m) => Some(m.chat.id),
UpdateKind::CallbackQuery(q) => q.message.as_ref().map(|m| m.chat.id),
_ => None,
}
}
#[must_use]
pub fn from(&self) -> Option<&User> {
match &self.kind {
UpdateKind::Message(m)
| UpdateKind::EditedMessage(m)
| UpdateKind::ChannelPost(m)
| UpdateKind::EditedChannelPost(m)
| UpdateKind::BusinessMessage(m)
| UpdateKind::EditedBusinessMessage(m) => m.from.as_ref(),
UpdateKind::CallbackQuery(q) => Some(&q.from),
UpdateKind::InlineQuery(q) => Some(&q.from),
UpdateKind::ShippingQuery(q) => Some(&q.from),
UpdateKind::PreCheckoutQuery(q) => Some(&q.from),
UpdateKind::PollAnswer(a) => a.user.as_ref(),
_ => None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CallbackQuery {
pub id: String,
pub from: User,
#[serde(skip_serializing_if = "Option::is_none")]
pub message: Option<Message>,
#[serde(skip_serializing_if = "Option::is_none")]
pub inline_message_id: Option<String>,
pub chat_instance: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub game_short_name: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatMemberUpdated {
pub chat: crate::chat::Chat,
pub from: User,
pub date: i64,
pub old_chat_member: crate::chat_member::ChatMember,
pub new_chat_member: crate::chat_member::ChatMember,
#[serde(skip_serializing_if = "Option::is_none")]
pub invite_link: Option<crate::chat::ChatInviteLink>,
#[serde(skip_serializing_if = "Option::is_none")]
pub via_join_request: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub via_chat_folder_invite_link: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessageReactionUpdated {
pub chat: crate::chat::Chat,
pub message_id: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<User>,
#[serde(skip_serializing_if = "Option::is_none")]
pub actor_chat: Option<crate::chat::Chat>,
pub date: i64,
pub old_reaction: Vec<crate::message::ReactionType>,
pub new_reaction: Vec<crate::message::ReactionType>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessageReactionCountUpdated {
pub chat: crate::chat::Chat,
pub message_id: i64,
pub date: i64,
pub reactions: Vec<ReactionCount>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReactionCount {
#[serde(rename = "type")]
pub kind: crate::message::ReactionType,
pub total_count: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatBoostUpdated {
pub chat: crate::chat::Chat,
pub boost: ChatBoost,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatBoost {
pub boost_id: String,
pub add_date: i64,
pub expiration_date: i64,
pub source: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatBoostRemoved {
pub chat: crate::chat::Chat,
pub boost_id: String,
pub remove_date: i64,
pub source: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ManagedBotUpdated {
pub user: User,
pub bot: User,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BusinessConnection {
pub id: String,
pub user: User,
pub user_chat_id: i64,
pub date: i64,
pub can_reply: bool,
pub is_enabled: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub rights: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BusinessMessagesDeleted {
pub business_connection_id: String,
pub chat: crate::chat::Chat,
pub message_ids: Vec<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PaidMediaPurchased {
pub from: User,
pub paid_media_payload: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Updates {
pub ok: bool,
pub result: Vec<Update>,
}