1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2026-05-25 01:37:20 +00:00

Chat Management section realization

This commit is contained in:
2026-05-15 18:10:30 +06:00
parent 7e1df37b87
commit 3ed7c8c75f
13 changed files with 488 additions and 15 deletions

View File

@@ -6,6 +6,7 @@ import dev.inmo.tgbotapi.types.ChatIdentifier
import dev.inmo.tgbotapi.types.chat.member.AdministratorChatMember
import dev.inmo.tgbotapi.types.chat.member.AdministratorChatMemberSerializer
import dev.inmo.tgbotapi.types.chatIdField
import dev.inmo.tgbotapi.types.returnBotsField
import kotlinx.serialization.*
import kotlinx.serialization.builtins.ListSerializer
@@ -13,10 +14,23 @@ private val chatMembersListSerializer = ListSerializer(
AdministratorChatMemberSerializer
)
/**
* Represents a request to retrieve a list of administrators in a chat.
*
* This class is used to get information about all administrators of a specific chat.
* The response includes details about the administrators, such as their permissions.
*
* @property chatId Unique identifier for the target chat or username of the target supergroup or channel.
* @property retrieveOtherBots (Serialized as `return_bots`) Optional flag indicating whether to include bot administrators other than the requesting bot.
* @see ChatRequest
* @see SimpleRequest
*/
@Serializable
data class GetChatAdministrators(
@SerialName(chatIdField)
override val chatId: ChatIdentifier
override val chatId: ChatIdentifier,
@SerialName(returnBotsField)
val retrieveOtherBots: Boolean? = null
): ChatRequest, SimpleRequest<List<AdministratorChatMember>> {
override fun method(): String = "getChatAdministrators"
override val resultDeserializer: DeserializationStrategy<List<AdministratorChatMember>>

View File

@@ -0,0 +1,53 @@
package dev.inmo.tgbotapi.requests.send
import dev.inmo.micro_utils.common.Warning
import dev.inmo.tgbotapi.abstracts.types.ChatRequest
import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest
import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.utils.serializers.UnitFromBooleanSerializer
import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationStrategy
@Serializable
data class DeleteAllMessageReactions @Warning(
"Pass either userId or actorChatId, but not both. Prefer DeleteAllUserMessageReactions or DeleteAllActorChatMessageReactions factory functions"
) constructor(
@SerialName(chatIdField)
override val chatId: ChatIdentifier,
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@SerialName(userIdField)
val userId: UserId? = null,
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@SerialName(actorChatIdField)
val actorChatId: ChatId? = null
) : SimpleRequest<Unit>, ChatRequest {
override fun method(): String = "deleteAllMessageReactions"
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
override val resultDeserializer: DeserializationStrategy<Unit>
get() = UnitFromBooleanSerializer
}
@OptIn(Warning::class)
fun DeleteAllUserMessageReactions(
chatId: ChatIdentifier,
userId: UserId
): DeleteAllMessageReactions = DeleteAllMessageReactions(
chatId = chatId,
userId = userId,
actorChatId = null
)
@OptIn(Warning::class)
fun DeleteAllActorChatMessageReactions(
chatId: ChatIdentifier,
actorChatId: ChatId
): DeleteAllMessageReactions = DeleteAllMessageReactions(
chatId = chatId,
userId = null,
actorChatId = actorChatId
)

View File

@@ -0,0 +1,59 @@
package dev.inmo.tgbotapi.requests.send
import dev.inmo.micro_utils.common.Warning
import dev.inmo.tgbotapi.abstracts.types.ChatRequest
import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest
import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.utils.serializers.UnitFromBooleanSerializer
import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationStrategy
@Serializable
data class DeleteMessageReaction @Warning(
"Pass either userId or actorChatId, but not both. Prefer DeleteUserMessageReaction or DeleteActorChatMessageReaction factory functions"
) constructor(
@SerialName(chatIdField)
override val chatId: ChatIdentifier,
@SerialName(messageIdField)
val messageId: MessageId,
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@SerialName(userIdField)
val userId: UserId? = null,
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@SerialName(actorChatIdField)
val actorChatId: ChatId? = null
) : SimpleRequest<Unit>, ChatRequest {
override fun method(): String = "deleteMessageReaction"
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
override val resultDeserializer: DeserializationStrategy<Unit>
get() = UnitFromBooleanSerializer
}
@OptIn(Warning::class)
fun DeleteUserMessageReaction(
chatId: ChatIdentifier,
messageId: MessageId,
userId: UserId
): DeleteMessageReaction = DeleteMessageReaction(
chatId = chatId,
messageId = messageId,
userId = userId,
actorChatId = null
)
@OptIn(Warning::class)
fun DeleteActorChatMessageReaction(
chatId: ChatIdentifier,
messageId: MessageId,
actorChatId: ChatId
): DeleteMessageReaction = DeleteMessageReaction(
chatId = chatId,
messageId = messageId,
userId = null,
actorChatId = actorChatId
)

View File

@@ -294,7 +294,10 @@ const val allowAddingOptionsField = "allow_adding_options"
const val hideResultsUntilClosesField = "hide_results_until_closes"
const val isAnonymousField = "is_anonymous"
const val canManageTopicsField = "can_manage_topics"
const val canReactToMessagesField = "can_react_to_messages"
const val canEditTagField = "can_edit_tag"
const val returnBotsField = "return_bots"
const val actorChatIdField = "actor_chat_id"
const val canPostStoriesField = "can_post_stories"
const val canEditStoriesField = "can_edit_stories"
const val canDeleteStoriesField = "can_delete_stories"

View File

@@ -33,6 +33,7 @@ interface ChatPermissions {
val canChangeInfo: Boolean?
val canInviteUsers: Boolean?
val canPinMessages: Boolean?
val canReactToMessages: Boolean?
val canEditTag: Boolean?
@Transient
val isGranular
@@ -75,6 +76,8 @@ interface ChatPermissions {
override val canInviteUsers: Boolean? = null,
@SerialName(canPinMessagesField)
override val canPinMessages: Boolean? = null,
@SerialName(canReactToMessagesField)
override val canReactToMessages: Boolean? = null,
@SerialName(canEditTagField)
override val canEditTag: Boolean = false,
) : ChatPermissions {
@@ -97,6 +100,8 @@ interface ChatPermissions {
override val canInviteUsers: Boolean? = null,
@SerialName(canPinMessagesField)
override val canPinMessages: Boolean? = null,
@SerialName(canReactToMessagesField)
override val canReactToMessages: Boolean? = null,
@SerialName(canEditTagField)
override val canEditTag: Boolean = false,
) : ChatPermissions {
@@ -141,7 +146,8 @@ interface ChatPermissions {
canAddWebPagePreviews: Boolean? = null,
canChangeInfo: Boolean? = null,
canInviteUsers: Boolean? = null,
canPinMessages: Boolean? = null
canPinMessages: Boolean? = null,
canReactToMessages: Boolean? = null
) = Granular(
canSendMessages = canSendMessages,
canSendAudios = canSendAudios,
@@ -155,7 +161,8 @@ interface ChatPermissions {
canAddWebPagePreviews = canAddWebPagePreviews,
canChangeInfo = canChangeInfo,
canInviteUsers = canInviteUsers,
canPinMessages = canPinMessages
canPinMessages = canPinMessages,
canReactToMessages = canReactToMessages
)
private val realSerializer = Granular.serializer()
@@ -185,7 +192,8 @@ interface ChatPermissions {
canAddWebPagePreviews = canAddWebPagePreviews,
canChangeInfo = canChangeInfo,
canInviteUsers = canInviteUsers,
canPinMessages = canPinMessages
canPinMessages = canPinMessages,
canReactToMessages = canReactToMessages
)
}
)
@@ -209,7 +217,8 @@ interface ChatPermissions {
canAddWebPagePreviews: Boolean? = this.canAddWebPagePreviews,
canChangeInfo: Boolean? = this.canChangeInfo,
canInviteUsers: Boolean? = this.canInviteUsers,
canPinMessages: Boolean? = this.canPinMessages
canPinMessages: Boolean? = this.canPinMessages,
canReactToMessages: Boolean? = this.canReactToMessages
): ChatPermissions = ChatPermissions(
canSendMessages = canSendMessages,
canSendAudios = canSendAudios,
@@ -223,7 +232,8 @@ interface ChatPermissions {
canAddWebPagePreviews = canAddWebPagePreviews,
canChangeInfo = canChangeInfo,
canInviteUsers = canInviteUsers,
canPinMessages = canPinMessages
canPinMessages = canPinMessages,
canReactToMessages = canReactToMessages
)
/**
@@ -236,7 +246,8 @@ interface ChatPermissions {
canAddWebPagePreviews: Boolean? = this.canAddWebPagePreviews,
canChangeInfo: Boolean? = this.canChangeInfo,
canInviteUsers: Boolean? = this.canInviteUsers,
canPinMessages: Boolean? = this.canPinMessages
canPinMessages: Boolean? = this.canPinMessages,
canReactToMessages: Boolean? = this.canReactToMessages
): ChatPermissions = ChatPermissions(
canSendMessages = null,
canSendAudios = null,
@@ -250,7 +261,8 @@ interface ChatPermissions {
canAddWebPagePreviews = canAddWebPagePreviews,
canChangeInfo = canChangeInfo,
canInviteUsers = canInviteUsers,
canPinMessages = canPinMessages
canPinMessages = canPinMessages,
canReactToMessages = canReactToMessages
)
}
@@ -268,6 +280,7 @@ val LeftRestrictionsChatPermissions = ChatPermissions(
canChangeInfo = true,
canInviteUsers = true,
canPinMessages = true,
canReactToMessages = true,
)
val RestrictionsChatPermissions = ChatPermissions(
@@ -284,4 +297,5 @@ val RestrictionsChatPermissions = ChatPermissions(
canChangeInfo = false,
canInviteUsers = false,
canPinMessages = false,
canReactToMessages = false,
)

View File

@@ -15,7 +15,7 @@ sealed interface RestrictedChatMember : ChatMember, UntilDate, OptionallyTagged
@Deprecated(
"Renamed",
ReplaceWith(
"RestrictedChatMemberImpl(user, untilDate, isMember, canSendMessages, canSendAudios, canSendDocuments, canSendPhotos, canSendVideos, canSendVideoNotes, canSendVoiceNotes, canSendPolls, canSendOtherMessages, canAddWebPagePreviews, canChangeInfo, canInviteUsers, canPinMessages, canManageTopics)",
"RestrictedChatMemberImpl(user, untilDate, isMember, canSendMessages, canSendAudios, canSendDocuments, canSendPhotos, canSendVideos, canSendVideoNotes, canSendVoiceNotes, canSendPolls, canSendOtherMessages, canAddWebPagePreviews, canChangeInfo, canInviteUsers, canPinMessages, canManageTopics, canReactToMessages)",
"dev.inmo.tgbotapi.types.chat.members.RestrictedChatMemberImpl",
)
)
@@ -36,7 +36,8 @@ sealed interface RestrictedChatMember : ChatMember, UntilDate, OptionallyTagged
canChangeInfo: Boolean = false,
canInviteUsers: Boolean = false,
canPinMessages: Boolean = false,
canManageTopics: Boolean = false
canManageTopics: Boolean = false,
canReactToMessages: Boolean = false
) = RestrictedMemberChatMember(
user = user,
untilDate = untilDate,
@@ -54,7 +55,8 @@ sealed interface RestrictedChatMember : ChatMember, UntilDate, OptionallyTagged
canChangeInfo = canChangeInfo,
canInviteUsers = canInviteUsers,
canPinMessages = canPinMessages,
canManageTopics = canManageTopics
canManageTopics = canManageTopics,
canReactToMessages = canReactToMessages
)
}
}

View File

@@ -48,6 +48,8 @@ data class RestrictedMemberChatMember(
override val canPinMessages: Boolean = false,
@SerialName(canManageTopicsField)
override val canManageTopics: Boolean = false,
@SerialName(canReactToMessagesField)
override val canReactToMessages: Boolean = false,
@SerialName(canEditTagField)
override val canEditTag: Boolean = false,
@SerialName(tagField)