use serde::{Deserialize, Deserializer, Serialize, Serializer};
use crate::{
api::{Method, Payload, PayloadError},
types::{Chat, ChatId, ChatInviteLink, ChatPermissions, Integer, User},
};
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
#[serde(rename_all = "snake_case")]
#[serde(tag = "status")]
pub enum ChatMember {
Administrator(ChatMemberAdministrator),
Creator(ChatMemberCreator),
Kicked(ChatMemberKicked),
#[serde(deserialize_with = "ChatMemberUser::deserialize_value")]
#[serde(serialize_with = "ChatMemberUser::serialize_value")]
Left(User),
Member {
user: User,
tag: Option<String>,
until_date: Option<Integer>,
},
Restricted(ChatMemberRestricted),
}
impl ChatMember {
pub fn get_user(&self) -> &User {
use self::ChatMember::*;
match self {
Administrator(admin) => &admin.user,
Creator(creator) => &creator.user,
Kicked(kicked) => &kicked.user,
Left(user) => user,
Member { user, .. } => user,
Restricted(restricted) => &restricted.user,
}
}
pub fn is_member(&self) -> bool {
use self::ChatMember::*;
match self {
Administrator(_) | Creator(_) | Member { .. } => true,
Kicked(_) | Left(_) => false,
Restricted(restricted) => restricted.is_member,
}
}
}
#[derive(Deserialize, Serialize)]
struct ChatMemberUser {
user: User,
}
impl ChatMemberUser {
fn deserialize_value<'de, T>(deserializer: T) -> Result<User, T::Error>
where
T: Deserializer<'de>,
{
ChatMemberUser::deserialize(deserializer).map(|x| x.user)
}
fn serialize_value<T>(value: &User, serializer: T) -> Result<T::Ok, T::Error>
where
T: Serializer,
{
let value = ChatMemberUser { user: value.clone() };
value.serialize(serializer)
}
}
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
pub struct ChatMemberAdministrator {
pub user: User,
pub can_be_edited: bool,
pub can_change_info: bool,
pub can_delete_messages: bool,
pub can_delete_stories: Option<bool>,
pub can_edit_messages: Option<bool>,
pub can_edit_stories: Option<bool>,
pub can_invite_users: bool,
pub can_manage_chat: bool,
pub can_manage_direct_messages: Option<bool>,
pub can_manage_tags: Option<bool>,
pub can_manage_topics: Option<bool>,
pub can_manage_video_chats: bool,
pub can_pin_messages: Option<bool>,
pub can_post_messages: Option<bool>,
pub can_post_stories: Option<bool>,
pub can_promote_members: bool,
pub can_restrict_members: bool,
pub custom_title: Option<String>,
pub is_anonymous: bool,
}
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
pub struct ChatMemberCreator {
pub is_anonymous: bool,
pub user: User,
pub custom_title: Option<String>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
pub struct ChatMemberKicked {
pub until_date: Integer,
pub user: User,
}
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
pub struct ChatMemberRestricted {
pub user: User,
pub can_add_web_page_previews: bool,
pub can_change_info: bool,
pub can_edit_tag: bool,
pub can_invite_users: bool,
pub can_manage_topics: bool,
pub can_pin_messages: bool,
pub can_react_to_messages: bool,
pub can_send_audios: bool,
pub can_send_documents: bool,
pub can_send_messages: bool,
pub can_send_other_messages: bool,
pub can_send_photos: bool,
pub can_send_polls: bool,
pub can_send_video_notes: bool,
pub can_send_videos: bool,
pub can_send_voice_notes: bool,
pub is_member: bool,
pub until_date: Integer,
pub tag: Option<String>,
}
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct ChatMemberUpdated {
pub chat: Chat,
pub date: Integer,
pub from: User,
pub new_chat_member: ChatMember,
pub old_chat_member: ChatMember,
pub invite_link: Option<ChatInviteLink>,
pub via_chat_folder_invite_link: Option<bool>,
pub via_join_request: Option<bool>,
}
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Serialize)]
pub struct BanChatMember {
chat_id: ChatId,
user_id: Integer,
revoke_messages: Option<bool>,
until_date: Option<Integer>,
}
impl BanChatMember {
pub fn new<T>(chat_id: T, user_id: Integer) -> Self
where
T: Into<ChatId>,
{
Self {
chat_id: chat_id.into(),
user_id,
until_date: None,
revoke_messages: None,
}
}
pub fn with_revoke_messages(mut self, value: bool) -> Self {
self.revoke_messages = Some(value);
self
}
pub fn with_until_date(mut self, value: Integer) -> Self {
self.until_date = Some(value);
self
}
}
impl Method for BanChatMember {
type Response = bool;
fn into_payload(self) -> Result<Payload, PayloadError> {
Payload::json("banChatMember", self)
}
}
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Serialize)]
pub struct GetChatAdministrators {
chat_id: ChatId,
return_bots: Option<bool>,
}
impl GetChatAdministrators {
pub fn new<T>(chat_id: T) -> Self
where
T: Into<ChatId>,
{
Self {
chat_id: chat_id.into(),
return_bots: None,
}
}
pub fn with_return_bots(mut self, value: bool) -> Self {
self.return_bots = Some(value);
self
}
}
impl Method for GetChatAdministrators {
type Response = Vec<ChatMember>;
fn into_payload(self) -> Result<Payload, PayloadError> {
Payload::json("getChatAdministrators", self)
}
}
#[derive(Clone, Debug, Serialize)]
pub struct GetChatMember {
chat_id: ChatId,
user_id: Integer,
}
impl GetChatMember {
pub fn new<T>(chat_id: T, user_id: Integer) -> Self
where
T: Into<ChatId>,
{
Self {
chat_id: chat_id.into(),
user_id,
}
}
}
impl Method for GetChatMember {
type Response = ChatMember;
fn into_payload(self) -> Result<Payload, PayloadError> {
Payload::json("getChatMember", self)
}
}
#[derive(Clone, Debug, Serialize)]
pub struct GetChatMemberCount {
chat_id: ChatId,
}
impl GetChatMemberCount {
pub fn new<T>(chat_id: T) -> Self
where
T: Into<ChatId>,
{
Self {
chat_id: chat_id.into(),
}
}
}
impl Method for GetChatMemberCount {
type Response = Integer;
fn into_payload(self) -> Result<Payload, PayloadError> {
Payload::json("getChatMemberCount", self)
}
}
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Serialize)]
pub struct PromoteChatMember {
chat_id: ChatId,
user_id: Integer,
can_change_info: Option<bool>,
can_delete_messages: Option<bool>,
can_delete_stories: Option<bool>,
can_edit_messages: Option<bool>,
can_edit_stories: Option<bool>,
can_invite_users: Option<bool>,
can_manage_chat: Option<bool>,
can_manage_direct_messages: Option<bool>,
can_manage_tags: Option<bool>,
can_manage_topics: Option<bool>,
can_manage_video_chats: Option<bool>,
can_pin_messages: Option<bool>,
can_post_messages: Option<bool>,
can_post_stories: Option<bool>,
can_promote_members: Option<bool>,
can_restrict_members: Option<bool>,
is_anonymous: Option<bool>,
}
impl PromoteChatMember {
pub fn new<T>(chat_id: T, user_id: Integer) -> Self
where
T: Into<ChatId>,
{
Self {
chat_id: chat_id.into(),
user_id,
can_change_info: None,
can_delete_messages: None,
can_delete_stories: None,
can_edit_messages: None,
can_edit_stories: None,
can_invite_users: None,
can_manage_chat: None,
can_manage_direct_messages: None,
can_manage_tags: None,
can_manage_topics: None,
can_manage_video_chats: None,
can_pin_messages: None,
can_post_messages: None,
can_post_stories: None,
can_promote_members: None,
can_restrict_members: None,
is_anonymous: None,
}
}
pub fn promote_all(mut self) -> Self {
self.is_anonymous = Some(true);
self.can_change_info = Some(true);
self.can_delete_messages = Some(true);
self.can_delete_stories = Some(true);
self.can_edit_messages = Some(true);
self.can_edit_stories = Some(true);
self.can_invite_users = Some(true);
self.can_manage_chat = Some(true);
self.can_manage_direct_messages = Some(true);
self.can_manage_tags = Some(true);
self.can_manage_topics = Some(true);
self.can_manage_video_chats = Some(true);
self.can_pin_messages = Some(true);
self.can_post_messages = Some(true);
self.can_post_stories = Some(true);
self.can_promote_members = Some(true);
self.can_restrict_members = Some(true);
self
}
pub fn demote_all(mut self) -> Self {
self.is_anonymous = Some(false);
self.can_change_info = Some(false);
self.can_delete_messages = Some(false);
self.can_delete_stories = Some(false);
self.can_edit_messages = Some(false);
self.can_edit_stories = Some(false);
self.can_invite_users = Some(false);
self.can_manage_chat = Some(false);
self.can_manage_direct_messages = Some(false);
self.can_manage_tags = Some(false);
self.can_manage_topics = Some(false);
self.can_manage_video_chats = Some(false);
self.can_pin_messages = Some(false);
self.can_post_messages = Some(false);
self.can_post_stories = Some(false);
self.can_promote_members = Some(false);
self.can_restrict_members = Some(false);
self
}
pub fn with_can_change_info(mut self, value: bool) -> Self {
self.can_change_info = Some(value);
self
}
pub fn with_can_delete_messages(mut self, value: bool) -> Self {
self.can_delete_messages = Some(value);
self
}
pub fn with_can_delete_stories(mut self, value: bool) -> Self {
self.can_delete_stories = Some(value);
self
}
pub fn with_can_edit_messages(mut self, value: bool) -> Self {
self.can_edit_messages = Some(value);
self
}
pub fn with_can_edit_stories(mut self, value: bool) -> Self {
self.can_edit_stories = Some(value);
self
}
pub fn with_can_invite_users(mut self, value: bool) -> Self {
self.can_invite_users = Some(value);
self
}
pub fn with_can_manage_chat(mut self, value: bool) -> Self {
self.can_manage_chat = Some(value);
self
}
pub fn with_can_manage_direct_messages(mut self, value: bool) -> Self {
self.can_manage_direct_messages = Some(value);
self
}
pub fn with_can_manage_tags(mut self, value: bool) -> Self {
self.can_manage_tags = Some(value);
self
}
pub fn with_can_manage_topics(mut self, value: bool) -> Self {
self.can_manage_topics = Some(value);
self
}
pub fn with_can_manage_video_chats(mut self, value: bool) -> Self {
self.can_manage_video_chats = Some(value);
self
}
pub fn with_can_pin_messages(mut self, value: bool) -> Self {
self.can_pin_messages = Some(value);
self
}
pub fn with_can_post_messages(mut self, value: bool) -> Self {
self.can_post_messages = Some(value);
self
}
pub fn with_can_post_stories(mut self, value: bool) -> Self {
self.can_post_stories = Some(value);
self
}
pub fn with_can_promote_members(mut self, value: bool) -> Self {
self.can_promote_members = Some(value);
self
}
pub fn with_can_restrict_members(mut self, value: bool) -> Self {
self.can_restrict_members = Some(value);
self
}
pub fn with_is_anonymous(mut self, value: bool) -> Self {
self.is_anonymous = Some(value);
self
}
}
impl Method for PromoteChatMember {
type Response = bool;
fn into_payload(self) -> Result<Payload, PayloadError> {
Payload::json("promoteChatMember", self)
}
}
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Serialize)]
pub struct RestrictChatMember {
chat_id: ChatId,
permissions: ChatPermissions,
user_id: Integer,
until_date: Option<Integer>,
use_independent_chat_permissions: Option<bool>,
}
impl RestrictChatMember {
pub fn new<T>(chat_id: T, user_id: Integer) -> Self
where
T: Into<ChatId>,
{
RestrictChatMember {
chat_id: chat_id.into(),
permissions: ChatPermissions::default(),
user_id,
until_date: None,
use_independent_chat_permissions: None,
}
}
pub fn allow_all(mut self) -> Self {
self.permissions = ChatPermissions::allowed();
self
}
pub fn restrict_all(mut self) -> Self {
self.permissions = ChatPermissions::restricted();
self
}
pub fn with_permissions(mut self, value: ChatPermissions) -> Self {
self.permissions = value;
self
}
pub fn with_until_date(mut self, value: Integer) -> Self {
self.until_date = Some(value);
self
}
pub fn with_use_independent_chat_permissions(mut self, value: bool) -> Self {
self.use_independent_chat_permissions = Some(value);
self
}
}
impl Method for RestrictChatMember {
type Response = bool;
fn into_payload(self) -> Result<Payload, PayloadError> {
Payload::json("restrictChatMember", self)
}
}
#[derive(Clone, Debug, Serialize)]
pub struct SetChatAdministratorCustomTitle {
chat_id: ChatId,
user_id: Integer,
custom_title: String,
}
impl SetChatAdministratorCustomTitle {
pub fn new<A, B>(chat_id: A, custom_title: B, user_id: Integer) -> Self
where
A: Into<ChatId>,
B: Into<String>,
{
Self {
chat_id: chat_id.into(),
custom_title: custom_title.into(),
user_id,
}
}
}
impl Method for SetChatAdministratorCustomTitle {
type Response = bool;
fn into_payload(self) -> Result<Payload, PayloadError> {
Payload::json("setChatAdministratorCustomTitle", self)
}
}
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Serialize)]
pub struct SetChatMemberTag {
chat_id: ChatId,
user_id: Integer,
tag: Option<String>,
}
impl SetChatMemberTag {
pub fn new<T>(chat_id: T, user_id: Integer) -> Self
where
T: Into<ChatId>,
{
Self {
chat_id: chat_id.into(),
user_id,
tag: None,
}
}
pub fn with_tag<T>(mut self, value: T) -> Self
where
T: Into<String>,
{
self.tag = Some(value.into());
self
}
}
impl Method for SetChatMemberTag {
type Response = bool;
fn into_payload(self) -> Result<Payload, PayloadError> {
Payload::json("setChatMemberTag", self)
}
}
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Serialize)]
pub struct UnbanChatMember {
chat_id: ChatId,
user_id: Integer,
only_if_banned: Option<bool>,
}
impl UnbanChatMember {
pub fn new<T>(chat_id: T, user_id: Integer) -> Self
where
T: Into<ChatId>,
{
UnbanChatMember {
chat_id: chat_id.into(),
user_id,
only_if_banned: None,
}
}
pub fn with_only_if_banned(mut self, only_if_banned: bool) -> Self {
self.only_if_banned = Some(only_if_banned);
self
}
}
impl Method for UnbanChatMember {
type Response = bool;
fn into_payload(self) -> Result<Payload, PayloadError> {
Payload::json("unbanChatMember", self)
}
}