mirror of
https://github.com/InsanusMokrassar/TelegramBotAPI.git
synced 2025-11-17 04:20:13 +00:00
Compare commits
28 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e56199ac9f | |||
| 3e199c6944 | |||
| b43d9aefb9 | |||
| fe133bbde0 | |||
| 332fe95adf | |||
| 1f416d4a28 | |||
| e626d8b5cc | |||
| b906d605f4 | |||
| d3584e793c | |||
| f71ac51461 | |||
| 5fe8cf948a | |||
| 85ea101641 | |||
| dc3ecec5c7 | |||
| ebd5e1a37b | |||
| 3da2e4fffb | |||
| 9aea59b44b | |||
| 7bab96a9cd | |||
| a0c10d9a9a | |||
| e2901cb9f9 | |||
| 3c60d074ba | |||
| f10cfdc5f1 | |||
| 270f9a60c1 | |||
| 2b49a75a42 | |||
| 9f7a348000 | |||
| 8cec74aa6a | |||
| d1914c8045 | |||
| baeb4848cf | |||
| dbadcb3f5a |
7
.github/workflows/packages_publishing.yml
vendored
7
.github/workflows/packages_publishing.yml
vendored
@@ -16,7 +16,12 @@ jobs:
|
|||||||
mv gradle.properties.tmp gradle.properties
|
mv gradle.properties.tmp gradle.properties
|
||||||
- name: Build
|
- name: Build
|
||||||
run: ./gradlew build
|
run: ./gradlew build
|
||||||
- name: Publish
|
- name: Publish to Gitea
|
||||||
|
continue-on-error: true
|
||||||
|
run: ./gradlew publishAllPublicationsToGiteaRepository
|
||||||
|
env:
|
||||||
|
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||||
|
- name: Publish to GithubPackages
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
run: ./gradlew publishAllPublicationsToGithubPackagesRepository --no-parallel
|
run: ./gradlew publishAllPublicationsToGithubPackagesRepository --no-parallel
|
||||||
env:
|
env:
|
||||||
|
|||||||
30
CHANGELOG.md
30
CHANGELOG.md
@@ -1,5 +1,35 @@
|
|||||||
# TelegramBotAPI changelog
|
# TelegramBotAPI changelog
|
||||||
|
|
||||||
|
## 4.2.2
|
||||||
|
|
||||||
|
* `Versions`:
|
||||||
|
* `MicroUtils`: `0.16.0` -> `0.16.2`
|
||||||
|
* `Core`:
|
||||||
|
* Fix of [#694](https://github.com/InsanusMokrassar/TelegramBotAPI/issues/694): add opportunity to create `ChatId` and `ChatIdWithThreadId` from `IdChatIdentifier`
|
||||||
|
|
||||||
|
## 4.2.1
|
||||||
|
|
||||||
|
* `Versions`:
|
||||||
|
* `MicroUtils`: `0.15.0` -> `0.16.0`
|
||||||
|
* `Ktor`: `2.1.3` -> `2.2.1`
|
||||||
|
* `Utils`:
|
||||||
|
* Improve support of `makeLinkToMessage` extensions
|
||||||
|
|
||||||
|
## 4.2.0
|
||||||
|
|
||||||
|
* `Versions`:
|
||||||
|
* `Kotlin`: `1.7.21` -> `1.7.22`
|
||||||
|
* `MicroUtils`: `0.14.4` -> `0.15.0`
|
||||||
|
|
||||||
|
## 4.1.3
|
||||||
|
|
||||||
|
* `Versions`:
|
||||||
|
* `MicroUtils`: `0.14.2` -> `0.14.4`
|
||||||
|
* `Core`:
|
||||||
|
* `ContentMessage`, `CommonMessage`, `PossiblyMediaGroupMessage` and `PossiblySentViaBotCommonMessage` got `out`
|
||||||
|
variance
|
||||||
|
* `UserId` now is `ChatId` instead of `IdChatIdentififer`
|
||||||
|
|
||||||
## 4.1.2
|
## 4.1.2
|
||||||
|
|
||||||
* `Versions`:
|
* `Versions`:
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ allprojects {
|
|||||||
mavenLocal()
|
mavenLocal()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
google()
|
google()
|
||||||
|
maven { url "https://git.inmo.dev/api/packages/InsanusMokrassar/maven" }
|
||||||
}
|
}
|
||||||
if (it != rootProject.findProject("docs")) {
|
if (it != rootProject.findProject("docs")) {
|
||||||
tasks.whenTaskAdded { task ->
|
tasks.whenTaskAdded { task ->
|
||||||
|
|||||||
@@ -6,4 +6,4 @@ kotlin.incremental=true
|
|||||||
kotlin.incremental.js=true
|
kotlin.incremental.js=true
|
||||||
|
|
||||||
library_group=dev.inmo
|
library_group=dev.inmo
|
||||||
library_version=4.1.2
|
library_version=4.2.2
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[versions]
|
[versions]
|
||||||
|
|
||||||
kotlin = "1.7.21"
|
kotlin = "1.7.22"
|
||||||
kotlin-serialization = "1.4.1"
|
kotlin-serialization = "1.4.1"
|
||||||
kotlin-coroutines = "1.6.4"
|
kotlin-coroutines = "1.6.4"
|
||||||
|
|
||||||
@@ -8,12 +8,12 @@ javax-activation = "1.1.1"
|
|||||||
|
|
||||||
korlibs = "3.4.0"
|
korlibs = "3.4.0"
|
||||||
uuid = "0.6.0"
|
uuid = "0.6.0"
|
||||||
ktor = "2.1.3"
|
ktor = "2.2.1"
|
||||||
|
|
||||||
ksp = "1.7.21-1.0.8"
|
ksp = "1.7.22-1.0.8"
|
||||||
kotlin-poet = "1.12.0"
|
kotlin-poet = "1.12.0"
|
||||||
|
|
||||||
microutils = "0.14.2"
|
microutils = "0.16.2"
|
||||||
|
|
||||||
github-release-plugin = "2.4.1"
|
github-release-plugin = "2.4.1"
|
||||||
dokka = "1.7.20"
|
dokka = "1.7.20"
|
||||||
|
|||||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
|
|||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
|
||||||
|
|||||||
@@ -54,6 +54,13 @@ value class ChatIdWithThreadId(val chatIdWithThreadId: Pair<Identifier, MessageT
|
|||||||
val ChatIdentifier.threadId: MessageThreadId?
|
val ChatIdentifier.threadId: MessageThreadId?
|
||||||
get() = (this as? IdChatIdentifier) ?.threadId
|
get() = (this as? IdChatIdentifier) ?.threadId
|
||||||
|
|
||||||
|
fun IdChatIdentifier.toChatId() = when (this) {
|
||||||
|
is ChatId -> this
|
||||||
|
is ChatIdWithThreadId -> ChatId(chatId)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun IdChatIdentifier.toChatWithThreadId(threadId: MessageThreadId) = IdChatIdentifier(chatId, threadId)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* https://core.telegram.org/bots/api#formatting-options
|
* https://core.telegram.org/bots/api#formatting-options
|
||||||
*/
|
*/
|
||||||
@@ -69,9 +76,9 @@ val UserId.userLink: String
|
|||||||
val User.link: String
|
val User.link: String
|
||||||
get() = id.userLink
|
get() = id.userLink
|
||||||
|
|
||||||
typealias UserId = IdChatIdentifier
|
typealias UserId = ChatId
|
||||||
|
|
||||||
fun Identifier.toChatId(): IdChatIdentifier = ChatId(this)
|
fun Identifier.toChatId(): ChatId = ChatId(this)
|
||||||
fun Int.toChatId(): IdChatIdentifier = toLong().toChatId()
|
fun Int.toChatId(): IdChatIdentifier = toLong().toChatId()
|
||||||
fun Byte.toChatId(): IdChatIdentifier = toLong().toChatId()
|
fun Byte.toChatId(): IdChatIdentifier = toLong().toChatId()
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ data class ExtendedGroupChatImpl(
|
|||||||
@Serializable
|
@Serializable
|
||||||
data class ExtendedPrivateChatImpl(
|
data class ExtendedPrivateChatImpl(
|
||||||
@SerialName(idField)
|
@SerialName(idField)
|
||||||
override val id: IdChatIdentifier,
|
override val id: UserId,
|
||||||
@SerialName(photoField)
|
@SerialName(photoField)
|
||||||
override val chatPhoto: ChatPhoto? = null,
|
override val chatPhoto: ChatPhoto? = null,
|
||||||
@SerialName(usernameField)
|
@SerialName(usernameField)
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ data class GroupChatImpl(
|
|||||||
@Serializable
|
@Serializable
|
||||||
data class PrivateChatImpl(
|
data class PrivateChatImpl(
|
||||||
@SerialName(idField)
|
@SerialName(idField)
|
||||||
override val id: IdChatIdentifier,
|
override val id: UserId,
|
||||||
@SerialName(usernameField)
|
@SerialName(usernameField)
|
||||||
override val username: Username? = null,
|
override val username: Username? = null,
|
||||||
@SerialName(firstNameField)
|
@SerialName(firstNameField)
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ sealed interface Sticker : TelegramMediaFile, SizedMediaFile, ThumbedMediaFile {
|
|||||||
get() = false
|
get() = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OptIn(RiskFeature::class)
|
||||||
object StickerSerializer : KSerializer<Sticker> {
|
object StickerSerializer : KSerializer<Sticker> {
|
||||||
override val descriptor: SerialDescriptor = StickerSurrogate.serializer().descriptor
|
override val descriptor: SerialDescriptor = StickerSurrogate.serializer().descriptor
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package dev.inmo.tgbotapi.types.message.abstracts
|
|||||||
|
|
||||||
import dev.inmo.tgbotapi.types.message.content.MessageContent
|
import dev.inmo.tgbotapi.types.message.content.MessageContent
|
||||||
|
|
||||||
sealed interface CommonMessage<T: MessageContent> : Message,
|
sealed interface CommonMessage<out T: MessageContent> : Message,
|
||||||
PossiblyForwardedMessage,
|
PossiblyForwardedMessage,
|
||||||
PossiblyEditedMessage,
|
PossiblyEditedMessage,
|
||||||
PossiblyReplyMessage,
|
PossiblyReplyMessage,
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package dev.inmo.tgbotapi.types.message.abstracts
|
|||||||
|
|
||||||
import dev.inmo.tgbotapi.types.message.content.MessageContent
|
import dev.inmo.tgbotapi.types.message.content.MessageContent
|
||||||
|
|
||||||
interface ContentMessage<T: MessageContent>: Message {
|
interface ContentMessage<out T: MessageContent>: Message {
|
||||||
val hasProtectedContent: Boolean
|
val hasProtectedContent: Boolean
|
||||||
val content: T
|
val content: T
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,6 @@ package dev.inmo.tgbotapi.types.message.abstracts
|
|||||||
import dev.inmo.tgbotapi.types.MediaGroupIdentifier
|
import dev.inmo.tgbotapi.types.MediaGroupIdentifier
|
||||||
import dev.inmo.tgbotapi.types.message.content.MessageContent
|
import dev.inmo.tgbotapi.types.message.content.MessageContent
|
||||||
|
|
||||||
interface PossiblyMediaGroupMessage<T : MessageContent> : ContentMessage<T> {
|
interface PossiblyMediaGroupMessage<out T : MessageContent> : ContentMessage<T> {
|
||||||
val mediaGroupId: MediaGroupIdentifier?
|
val mediaGroupId: MediaGroupIdentifier?
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,4 +2,4 @@ package dev.inmo.tgbotapi.types.message.abstracts
|
|||||||
|
|
||||||
import dev.inmo.tgbotapi.types.message.content.MessageContent
|
import dev.inmo.tgbotapi.types.message.content.MessageContent
|
||||||
|
|
||||||
sealed interface PossiblySentViaBotCommonMessage<T: MessageContent> : CommonMessage<T>, PossiblySentViaBot
|
sealed interface PossiblySentViaBotCommonMessage<out T: MessageContent> : CommonMessage<T>, PossiblySentViaBot
|
||||||
|
|||||||
@@ -7,39 +7,61 @@ import dev.inmo.tgbotapi.types.message.textsources.link
|
|||||||
import io.ktor.http.encodeURLQueryComponent
|
import io.ktor.http.encodeURLQueryComponent
|
||||||
|
|
||||||
|
|
||||||
fun makeUsernameLink(username: String) = "$internalLinkBeginning/$username"
|
fun makeUsernameLink(username: String, threadId: MessageThreadId? = null) = "$internalLinkBeginning/$username${threadId ?.let { "/$it" } ?: ""}"
|
||||||
|
fun makeChatLink(identifier: Identifier, threadId: MessageThreadId? = null) = identifier.toString().replace(
|
||||||
|
linkIdRedundantPartRegex,
|
||||||
|
""
|
||||||
|
).let { bareId ->
|
||||||
|
"$internalLinkBeginning/c/$bareId${threadId ?.let { "/$it" } ?: ""}"
|
||||||
|
}
|
||||||
fun makeUsernameDeepLinkPrefix(username: String) = "${makeUsernameLink(username)}?start="
|
fun makeUsernameDeepLinkPrefix(username: String) = "${makeUsernameLink(username)}?start="
|
||||||
fun makeUsernameStartattachPrefix(username: String) = "$internalLinkBeginning/$username?startattach"
|
fun makeUsernameStartattachPrefix(username: String) = "$internalLinkBeginning/$username?startattach"
|
||||||
fun makeUsernameStartattachLink(username: String, data: String? = null) = "${makeUsernameStartattachPrefix(username)}${data?.let { "=$it" } ?: ""}"
|
fun makeUsernameStartattachLink(username: String, data: String? = null) = "${makeUsernameStartattachPrefix(username)}${data?.let { "=$it" } ?: ""}"
|
||||||
inline val Username.link
|
inline val Username.link
|
||||||
get() = makeUsernameLink(usernameWithoutAt)
|
get() = makeUsernameLink(usernameWithoutAt)
|
||||||
|
val IdChatIdentifier.link: String
|
||||||
|
get() = makeChatLink(chatId, threadId)
|
||||||
|
fun ChatId.link(threadId: MessageThreadId?) = makeChatLink(chatId, threadId)
|
||||||
|
inline fun Username.link(threadId: MessageThreadId?) = makeUsernameLink(usernameWithoutAt, threadId)
|
||||||
inline val Username.deepLinkPrefix
|
inline val Username.deepLinkPrefix
|
||||||
get() = makeUsernameDeepLinkPrefix(usernameWithoutAt)
|
get() = makeUsernameDeepLinkPrefix(usernameWithoutAt)
|
||||||
inline val Username.startattachPrefix
|
inline val Username.startattachPrefix
|
||||||
get() = makeUsernameStartattachPrefix(usernameWithoutAt)
|
get() = makeUsernameStartattachPrefix(usernameWithoutAt)
|
||||||
inline fun makeLink(username: Username) = username.link
|
inline fun makeLink(username: Username, threadId: MessageThreadId? = null) = username.link(threadId)
|
||||||
inline fun makeTelegramDeepLink(username: String, startParameter: String) = "${makeUsernameDeepLinkPrefix(username)}$startParameter".encodeURLQueryComponent()
|
inline fun makeTelegramDeepLink(username: String, startParameter: String) = "${makeUsernameDeepLinkPrefix(username)}$startParameter".encodeURLQueryComponent()
|
||||||
inline fun makeTelegramStartattach(username: String, data: String? = null) = makeUsernameStartattachLink(username, data)
|
inline fun makeTelegramStartattach(username: String, data: String? = null) = makeUsernameStartattachLink(username, data)
|
||||||
inline fun makeDeepLink(username: Username, startParameter: String) = makeTelegramDeepLink(username.usernameWithoutAt, startParameter)
|
inline fun makeDeepLink(username: Username, startParameter: String) = makeTelegramDeepLink(username.usernameWithoutAt, startParameter)
|
||||||
inline fun makeTelegramDeepLink(username: Username, startParameter: String) = makeDeepLink(username, startParameter)
|
inline fun makeTelegramDeepLink(username: Username, startParameter: String) = makeDeepLink(username, startParameter)
|
||||||
inline fun makeTelegramStartattach(username: Username, data: String? = null) = makeTelegramStartattach(username.usernameWithoutAt, data)
|
inline fun makeTelegramStartattach(username: Username, data: String? = null) = makeTelegramStartattach(username.usernameWithoutAt, data)
|
||||||
|
|
||||||
fun makeLinkToMessage(
|
|
||||||
username: String,
|
|
||||||
messageId: MessageId
|
|
||||||
): String = "$internalLinkBeginning/$username/$messageId"
|
|
||||||
fun makeLinkToMessage(
|
|
||||||
username: Username,
|
|
||||||
messageId: MessageId
|
|
||||||
): String = makeLinkToMessage(username.username, messageId)
|
|
||||||
fun makeLinkToMessage(
|
|
||||||
chat: UsernameChat,
|
|
||||||
messageId: MessageId
|
|
||||||
): String? = chat.username ?.let { makeLinkToMessage(it, messageId) }
|
|
||||||
|
|
||||||
private val linkIdRedundantPartRegex = Regex("^-100")
|
private val linkIdRedundantPartRegex = Regex("^-100")
|
||||||
private val usernameBeginSymbolRegex = Regex("^@")
|
private val usernameBeginSymbolRegex = Regex("^@")
|
||||||
|
|
||||||
|
fun makeLinkToMessage(
|
||||||
|
username: String,
|
||||||
|
messageId: MessageId,
|
||||||
|
threadId: MessageThreadId? = null
|
||||||
|
): String = "${makeUsernameLink(username, threadId)}/$messageId"
|
||||||
|
fun makeLinkToMessage(
|
||||||
|
username: Username,
|
||||||
|
messageId: MessageId,
|
||||||
|
threadId: MessageThreadId? = null
|
||||||
|
): String = makeLinkToMessage(username.username, messageId, threadId)
|
||||||
|
fun makeLinkToMessage(
|
||||||
|
chatId: Identifier,
|
||||||
|
messageId: MessageId,
|
||||||
|
threadId: MessageThreadId? = null
|
||||||
|
): String = chatId.toString().replace(
|
||||||
|
linkIdRedundantPartRegex,
|
||||||
|
""
|
||||||
|
).let { bareId ->
|
||||||
|
"$internalLinkBeginning/c/$bareId/${threadId ?.let { "$it/" } ?: ""}$messageId"
|
||||||
|
}
|
||||||
|
fun makeLinkToMessage(
|
||||||
|
chatId: IdChatIdentifier,
|
||||||
|
messageId: MessageId,
|
||||||
|
): String = makeLinkToMessage(chatId.chatId, messageId, chatId.threadId)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Link which can be used as by any user to get access to [Message]. Returns null in case when there are no
|
* Link which can be used as by any user to get access to [Message]. Returns null in case when there are no
|
||||||
* known way to build link (for [PrivateChat]s, for example)
|
* known way to build link (for [PrivateChat]s, for example)
|
||||||
@@ -49,16 +71,10 @@ fun makeLinkToMessage(
|
|||||||
messageId: MessageId
|
messageId: MessageId
|
||||||
): String? {
|
): String? {
|
||||||
return when {
|
return when {
|
||||||
chat is UsernameChat && chat.username != null -> {
|
chat is UsernameChat && chat.username != null -> chat.username ?.let {
|
||||||
"$internalLinkBeginning/${chat.username ?.username ?.replace(
|
makeLinkToMessage(it, messageId, chat.id.threadId)
|
||||||
usernameBeginSymbolRegex, "")}/$messageId"
|
} ?: makeLinkToMessage(chat.id, messageId)
|
||||||
}
|
chat !is PrivateChat -> makeLinkToMessage(chat.id, messageId)
|
||||||
chat !is PrivateChat -> chat.id.chatId.toString().replace(
|
|
||||||
linkIdRedundantPartRegex,
|
|
||||||
""
|
|
||||||
).let { bareId ->
|
|
||||||
"$internalLinkBeginning/c/$bareId/$messageId"
|
|
||||||
}
|
|
||||||
else -> return null
|
else -> return null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -79,7 +95,7 @@ val Message.link: String?
|
|||||||
val Chat.link: String?
|
val Chat.link: String?
|
||||||
get() {
|
get() {
|
||||||
if (this is UsernameChat) {
|
if (this is UsernameChat) {
|
||||||
username ?.link
|
username ?.link ?: id.link
|
||||||
}
|
}
|
||||||
if (this is ExtendedPublicChat) {
|
if (this is ExtendedPublicChat) {
|
||||||
inviteLink ?.let { return it }
|
inviteLink ?.let { return it }
|
||||||
|
|||||||
@@ -200,7 +200,7 @@ infix fun String.mention(parseMode: ParseMode): String = when (parseMode) {
|
|||||||
is MarkdownV2 -> mentionMarkdownV2()
|
is MarkdownV2 -> mentionMarkdownV2()
|
||||||
}
|
}
|
||||||
|
|
||||||
infix fun Pair<String, IdChatIdentifier>.mention(parseMode: ParseMode): String = when (parseMode) {
|
infix fun Pair<String, UserId>.mention(parseMode: ParseMode): String = when (parseMode) {
|
||||||
is HTML -> first.textMentionHTML(second)
|
is HTML -> first.textMentionHTML(second)
|
||||||
is Markdown -> first.textMentionMarkdown(second)
|
is Markdown -> first.textMentionMarkdown(second)
|
||||||
is MarkdownV2 -> first.textMentionMarkdownV2(second)
|
is MarkdownV2 -> first.textMentionMarkdownV2(second)
|
||||||
|
|||||||
Reference in New Issue
Block a user