tgbotapi/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/formatting/LinksFormatting.kt

113 lines
4.4 KiB
Kotlin
Raw Normal View History

package dev.inmo.tgbotapi.extensions.utils.formatting
2020-06-01 19:15:08 +00:00
2020-10-04 11:06:30 +00:00
import dev.inmo.tgbotapi.types.*
2022-04-21 18:16:41 +00:00
import dev.inmo.tgbotapi.types.chat.*
2020-11-16 07:22:08 +00:00
import dev.inmo.tgbotapi.types.message.abstracts.Message
2022-08-05 10:35:07 +00:00
import dev.inmo.tgbotapi.types.message.textsources.link
2022-08-26 06:20:20 +00:00
import io.ktor.http.encodeURLQueryComponent
2020-06-01 19:15:08 +00:00
2022-08-13 07:13:07 +00:00
2022-12-08 03:17:58 +00:00
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" } ?: ""}"
}
2022-02-07 12:08:06 +00:00
fun makeUsernameDeepLinkPrefix(username: String) = "${makeUsernameLink(username)}?start="
2022-08-13 07:13:07 +00:00
fun makeUsernameStartattachPrefix(username: String) = "$internalLinkBeginning/$username?startattach"
fun makeUsernameStartattachLink(username: String, data: String? = null) = "${makeUsernameStartattachPrefix(username)}${data?.let { "=$it" } ?: ""}"
2020-11-16 07:22:08 +00:00
inline val Username.link
2022-02-07 12:08:06 +00:00
get() = makeUsernameLink(usernameWithoutAt)
2022-12-08 03:17:58 +00:00
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)
2022-02-07 12:08:06 +00:00
inline val Username.deepLinkPrefix
get() = makeUsernameDeepLinkPrefix(usernameWithoutAt)
2022-08-13 07:13:07 +00:00
inline val Username.startattachPrefix
get() = makeUsernameStartattachPrefix(usernameWithoutAt)
2022-12-08 03:17:58 +00:00
inline fun makeLink(username: Username, threadId: MessageThreadId? = null) = username.link(threadId)
2022-08-26 06:20:20 +00:00
inline fun makeTelegramDeepLink(username: String, startParameter: String) = "${makeUsernameDeepLinkPrefix(username)}$startParameter".encodeURLQueryComponent()
2022-08-13 07:13:07 +00:00
inline fun makeTelegramStartattach(username: String, data: String? = null) = makeUsernameStartattachLink(username, data)
2022-08-26 06:20:20 +00:00
inline fun makeDeepLink(username: Username, startParameter: String) = makeTelegramDeepLink(username.usernameWithoutAt, startParameter)
2022-02-07 12:08:06 +00:00
inline fun makeTelegramDeepLink(username: Username, startParameter: String) = makeDeepLink(username, startParameter)
2022-08-26 06:20:20 +00:00
inline fun makeTelegramStartattach(username: Username, data: String? = null) = makeTelegramStartattach(username.usernameWithoutAt, data)
2020-11-16 07:22:08 +00:00
2022-12-08 03:06:54 +00:00
private val linkIdRedundantPartRegex = Regex("^-100")
private val usernameBeginSymbolRegex = Regex("^@")
2020-06-01 19:15:08 +00:00
fun makeLinkToMessage(
username: String,
2022-12-08 03:06:54 +00:00
messageId: MessageId,
threadId: MessageThreadId? = null
2022-12-08 03:17:58 +00:00
): String = "${makeUsernameLink(username, threadId)}/$messageId"
2020-06-27 04:11:03 +00:00
fun makeLinkToMessage(
username: Username,
2022-12-08 03:06:54 +00:00
messageId: MessageId,
threadId: MessageThreadId? = null
): String = makeLinkToMessage(username.username, messageId, threadId)
2020-06-27 04:11:03 +00:00
fun makeLinkToMessage(
2022-12-08 03:06:54 +00:00
chatId: Identifier,
messageId: MessageId,
threadId: MessageThreadId? = null
): String = chatId.toString().replace(
linkIdRedundantPartRegex,
""
).let { bareId ->
2022-12-08 03:17:58 +00:00
"$internalLinkBeginning/c/$bareId/${threadId ?.let { "$it/" } ?: ""}$messageId"
2022-12-08 03:06:54 +00:00
}
fun makeLinkToMessage(
chatId: IdChatIdentifier,
messageId: MessageId,
): String = makeLinkToMessage(chatId.chatId, messageId, chatId.threadId)
2020-06-01 19:15:08 +00:00
2020-11-16 07:22:08 +00:00
/**
* 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)
*/
2020-06-01 19:15:08 +00:00
fun makeLinkToMessage(
2020-11-16 07:22:08 +00:00
chat: Chat,
messageId: MessageId
2020-06-01 19:15:08 +00:00
): String? {
return when {
2022-12-08 03:06:54 +00:00
chat is UsernameChat && chat.username != null -> chat.username ?.let {
makeLinkToMessage(it, messageId, chat.id.threadId)
} ?: makeLinkToMessage(chat.id, messageId)
chat !is PrivateChat -> makeLinkToMessage(chat.id, messageId)
2020-06-01 19:15:08 +00:00
else -> return null
}
}
2020-11-16 07:22:08 +00:00
/**
* @see makeLinkToMessage
*/
val Message.link: String?
get() = makeLinkToMessage(
chat,
messageId
)
2020-06-01 19:15:08 +00:00
/**
2020-11-16 07:22:08 +00:00
* Link which can be used as by any user to get access to [Chat]. Returns null in case when there are no
* known way to build link
2020-06-01 19:15:08 +00:00
*/
2020-11-16 07:22:08 +00:00
val Chat.link: String?
get() {
if (this is UsernameChat) {
2022-12-08 03:17:58 +00:00
username ?.link ?: id.link
2020-11-16 07:22:08 +00:00
}
if (this is ExtendedPublicChat) {
inviteLink ?.let { return it }
}
if (this is PrivateChat) {
2022-08-04 12:15:51 +00:00
return id.userLink
2020-11-16 07:22:08 +00:00
}
return null
}
private const val stickerSetAddingLinkPrefix = "$internalLinkBeginning/addstickers"
val StickerSetName.stickerSetLink
get() = link(this, "$stickerSetAddingLinkPrefix/$this")