package dev.inmo.tgbotapi.types.chat import dev.inmo.tgbotapi.types.* import kotlinx.serialization.KSerializer import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder /** * Represents any type with common permissions list * * !!WARNING!! Default serializer of this interface is using [ChatPermissionsImpl] as surrogate and in fact serialized * and deserialized as [ChatPermissionsImpl]. In case you wish some custom behaviour you must implement your own * [KSerializer] or pass another serializer */ @Serializable(ChatPermissions.Companion::class) interface ChatPermissions { val canSendMessages: Boolean? val canSendAudios: Boolean? val canSendDocuments: Boolean? val canSendPhotos: Boolean? val canSendVideos: Boolean? val canSendVideoNotes: Boolean? val canSendVoiceNotes: Boolean? val canSendPolls: Boolean? val canSendOtherMessages: Boolean? val canAddWebPagePreviews: Boolean? val canChangeInfo: Boolean? val canInviteUsers: Boolean? val canPinMessages: Boolean? @Transient val isGranular get() = canSendAudios != null || canSendDocuments != null || canSendVideoNotes != null || canSendPhotos != null || canSendVideos != null || canSendVoiceNotes != null companion object : KSerializer { operator fun invoke( canSendMessages: Boolean? = null, canSendAudios: Boolean? = null, canSendDocuments: Boolean? = null, canSendPhotos: Boolean? = null, canSendVideos: Boolean? = null, canSendVideoNotes: Boolean? = null, canSendVoiceNotes: Boolean? = null, canSendPolls: Boolean? = null, canSendOtherMessages: Boolean? = null, canAddWebPagePreviews: Boolean? = null, canChangeInfo: Boolean? = null, canInviteUsers: Boolean? = null, canPinMessages: Boolean? = null ) = ChatPermissionsImpl( canSendMessages = canSendMessages, canSendAudios = canSendAudios, canSendDocuments = canSendDocuments, canSendPhotos = canSendPhotos, canSendVideos = canSendVideos, canSendVideoNotes = canSendVideoNotes, canSendVoiceNotes = canSendVoiceNotes, canSendPolls = canSendPolls, canSendOtherMessages = canSendOtherMessages, canAddWebPagePreviews = canAddWebPagePreviews, canChangeInfo = canChangeInfo, canInviteUsers = canInviteUsers, canPinMessages = canPinMessages ) fun Granular( canSendMessages: Boolean? = null, canSendAudios: Boolean? = null, canSendDocuments: Boolean? = null, canSendPhotos: Boolean? = null, canSendVideos: Boolean? = null, canSendVideoNotes: Boolean? = null, canSendVoiceNotes: Boolean? = null, canSendPolls: Boolean? = null, canSendOtherMessages: Boolean? = null, canAddWebPagePreviews: Boolean? = null, canChangeInfo: Boolean? = null, canInviteUsers: Boolean? = null, canPinMessages: Boolean? = null ) = ChatPermissions( canSendMessages = canSendMessages, canSendAudios = canSendAudios, canSendDocuments = canSendDocuments, canSendPhotos = canSendPhotos, canSendVideos = canSendVideos, canSendVideoNotes = canSendVideoNotes, canSendVoiceNotes = canSendVoiceNotes, canSendPolls = canSendPolls, canSendOtherMessages = canSendOtherMessages, canAddWebPagePreviews = canAddWebPagePreviews, canChangeInfo = canChangeInfo, canInviteUsers = canInviteUsers, canPinMessages = canPinMessages ) fun Commonized( canSendPolls: Boolean? = null, canSendOtherMessages: Boolean? = null, canAddWebPagePreviews: Boolean? = null, canChangeInfo: Boolean? = null, canInviteUsers: Boolean? = null, canPinMessages: Boolean? = null ) = ChatPermissions( canSendMessages = canSendPolls, canSendAudios = null, canSendDocuments = null, canSendPhotos = null, canSendVideos = null, canSendVideoNotes = null, canSendVoiceNotes = null, canSendPolls = canSendPolls, canSendOtherMessages = canSendOtherMessages, canAddWebPagePreviews = canAddWebPagePreviews, canChangeInfo = canChangeInfo, canInviteUsers = canInviteUsers, canPinMessages = canPinMessages ) fun from( chatPermissions: ChatPermissions, canSendMessages: Boolean? = chatPermissions.canSendMessages, canSendAudios: Boolean? = chatPermissions.canSendAudios, canSendDocuments: Boolean? = chatPermissions.canSendDocuments, canSendPhotos: Boolean? = chatPermissions.canSendPhotos, canSendVideos: Boolean? = chatPermissions.canSendVideos, canSendVideoNotes: Boolean? = chatPermissions.canSendVideoNotes, canSendVoiceNotes: Boolean? = chatPermissions.canSendVoiceNotes, canSendPolls: Boolean? = chatPermissions.canSendPolls, canSendOtherMessages: Boolean? = chatPermissions.canSendOtherMessages, canAddWebPagePreviews: Boolean? = chatPermissions.canAddWebPagePreviews, canChangeInfo: Boolean? = chatPermissions.canChangeInfo, canInviteUsers: Boolean? = chatPermissions.canInviteUsers, canPinMessages: Boolean? = chatPermissions.canPinMessages ) = ChatPermissions( canSendMessages = canSendMessages, canSendAudios = canSendAudios, canSendDocuments = canSendDocuments, canSendPhotos = canSendPhotos, canSendVideos = canSendVideos, canSendVideoNotes = canSendVideoNotes, canSendVoiceNotes = canSendVoiceNotes, canSendPolls = canSendPolls, canSendOtherMessages = canSendOtherMessages, canAddWebPagePreviews = canAddWebPagePreviews, canChangeInfo = canChangeInfo, canInviteUsers = canInviteUsers, canPinMessages = canPinMessages ) private val realSerializer = ChatPermissionsImpl.serializer() override val descriptor: SerialDescriptor get() = realSerializer.descriptor override fun deserialize(decoder: Decoder): ChatPermissions { return realSerializer.deserialize(decoder) } override fun serialize(encoder: Encoder, value: ChatPermissions) { realSerializer.serialize( encoder, (value as? ChatPermissionsImpl) ?: value.run { ChatPermissionsImpl( canSendMessages = canSendMessages, canSendAudios = canSendAudios, canSendDocuments = canSendDocuments, canSendPhotos = canSendPhotos, canSendVideos = canSendVideos, canSendVideoNotes = canSendVideoNotes, canSendVoiceNotes = canSendVoiceNotes, canSendPolls = canSendPolls, canSendOtherMessages = canSendOtherMessages, canAddWebPagePreviews = canAddWebPagePreviews, canChangeInfo = canChangeInfo, canInviteUsers = canInviteUsers, canPinMessages = canPinMessages ) } ) } } /** * Copying current instance as [ChatPermissions], but realizations of this interface may differently override this * method */ fun copyGranular( canSendMessages: Boolean? = this.canSendMessages, canSendAudios: Boolean? = this.canSendAudios, canSendDocuments: Boolean? = this.canSendDocuments, canSendPhotos: Boolean? = this.canSendPhotos, canSendVideos: Boolean? = this.canSendVideos, canSendVideoNotes: Boolean? = this.canSendVideoNotes, canSendVoiceNotes: Boolean? = this.canSendVoiceNotes, canSendPolls: Boolean? = this.canSendPolls, canSendOtherMessages: Boolean? = this.canSendOtherMessages, canAddWebPagePreviews: Boolean? = this.canAddWebPagePreviews, canChangeInfo: Boolean? = this.canChangeInfo, canInviteUsers: Boolean? = this.canInviteUsers, canPinMessages: Boolean? = this.canPinMessages ): ChatPermissions = ChatPermissions( canSendMessages = canSendMessages, canSendAudios = canSendAudios, canSendDocuments = canSendDocuments, canSendPhotos = canSendPhotos, canSendVideos = canSendVideos, canSendVideoNotes = canSendVideoNotes, canSendVoiceNotes = canSendVoiceNotes, canSendPolls = canSendPolls, canSendOtherMessages = canSendOtherMessages, canAddWebPagePreviews = canAddWebPagePreviews, canChangeInfo = canChangeInfo, canInviteUsers = canInviteUsers, canPinMessages = canPinMessages ) /** * Copying current instance as [ChatPermissions], but realizations of this interface may differently override this * method */ fun copyCommon( canSendPolls: Boolean? = this.canSendPolls, canSendOtherMessages: Boolean? = this.canSendOtherMessages, canAddWebPagePreviews: Boolean? = this.canAddWebPagePreviews, canChangeInfo: Boolean? = this.canChangeInfo, canInviteUsers: Boolean? = this.canInviteUsers, canPinMessages: Boolean? = this.canPinMessages ): ChatPermissions = ChatPermissions( canSendMessages = null, canSendAudios = null, canSendDocuments = null, canSendPhotos = null, canSendVideos = null, canSendVideoNotes = null, canSendVoiceNotes = null, canSendPolls = canSendPolls, canSendOtherMessages = canSendOtherMessages, canAddWebPagePreviews = canAddWebPagePreviews, canChangeInfo = canChangeInfo, canInviteUsers = canInviteUsers, canPinMessages = canPinMessages ) } val LeftRestrictionsChatPermissions = ChatPermissions( canSendMessages = true, canSendAudios = true, canSendDocuments = true, canSendPhotos = true, canSendVideos = true, canSendVideoNotes = true, canSendVoiceNotes = true, canSendPolls = true, canSendOtherMessages = true, canAddWebPagePreviews = true, canChangeInfo = true, canInviteUsers = true, canPinMessages = true, ) val RestrictionsChatPermissions = ChatPermissions( canSendMessages = false, canSendAudios = false, canSendDocuments = false, canSendPhotos = false, canSendVideos = false, canSendVideoNotes = false, canSendVoiceNotes = false, canSendPolls = false, canSendOtherMessages = false, canAddWebPagePreviews = false, canChangeInfo = false, canInviteUsers = false, canPinMessages = false, )