2020-10-04 10:57:39 +00:00
|
|
|
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.*
|
2020-11-16 07:22:08 +00:00
|
|
|
import dev.inmo.tgbotapi.types.MessageEntity.textsources.link
|
|
|
|
import dev.inmo.tgbotapi.types.chat.abstracts.*
|
|
|
|
import dev.inmo.tgbotapi.types.chat.abstracts.extended.ExtendedPublicChat
|
|
|
|
import dev.inmo.tgbotapi.types.message.abstracts.Message
|
2020-06-01 19:15:08 +00:00
|
|
|
|
|
|
|
private const val internalLinkBeginning = "https://t.me"
|
|
|
|
|
2020-11-16 10:25:10 +00:00
|
|
|
fun makeUsernameLink(username: String) = "$internalLinkBeginning/$username"
|
2022-02-07 12:08:06 +00:00
|
|
|
fun makeUsernameDeepLinkPrefix(username: String) = "${makeUsernameLink(username)}?start="
|
2020-11-16 07:22:08 +00:00
|
|
|
inline val Username.link
|
2022-02-07 12:08:06 +00:00
|
|
|
get() = makeUsernameLink(usernameWithoutAt)
|
|
|
|
inline val Username.deepLinkPrefix
|
|
|
|
get() = makeUsernameDeepLinkPrefix(usernameWithoutAt)
|
2020-11-16 07:22:08 +00:00
|
|
|
inline fun makeLink(username: Username) = username.link
|
2022-02-07 12:08:06 +00:00
|
|
|
inline fun makeTelegramDeepLink(username: String, startParameter: String) = "${makeUsernameDeepLinkPrefix(username)}$startParameter"
|
|
|
|
inline fun makeDeepLink(username: Username, startParameter: String) = "${username.deepLinkPrefix}$startParameter"
|
|
|
|
inline fun makeTelegramDeepLink(username: Username, startParameter: String) = makeDeepLink(username, startParameter)
|
2020-11-16 07:22:08 +00:00
|
|
|
|
2020-06-01 19:15:08 +00:00
|
|
|
fun makeLinkToMessage(
|
|
|
|
username: String,
|
|
|
|
messageId: MessageIdentifier
|
|
|
|
): String = "$internalLinkBeginning/$username/$messageId"
|
2020-06-27 04:11:03 +00:00
|
|
|
fun makeLinkToMessage(
|
|
|
|
username: Username,
|
|
|
|
messageId: MessageIdentifier
|
|
|
|
): String = makeLinkToMessage(username.username, messageId)
|
|
|
|
fun makeLinkToMessage(
|
|
|
|
chat: UsernameChat,
|
|
|
|
messageId: MessageIdentifier
|
|
|
|
): String? = chat.username ?.let { makeLinkToMessage(it, messageId) }
|
2020-06-01 19:15:08 +00:00
|
|
|
|
|
|
|
private val linkIdRedundantPartRegex = Regex("^-100")
|
|
|
|
private val usernameBeginSymbolRegex = Regex("^@")
|
|
|
|
|
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,
|
2020-06-01 19:15:08 +00:00
|
|
|
messageId: MessageIdentifier
|
|
|
|
): String? {
|
|
|
|
return when {
|
|
|
|
chat is UsernameChat && chat.username != null -> {
|
2020-06-01 19:26:46 +00:00
|
|
|
"$internalLinkBeginning/${chat.username ?.username ?.replace(
|
|
|
|
usernameBeginSymbolRegex, "")}/$messageId"
|
2020-06-01 19:15:08 +00:00
|
|
|
}
|
|
|
|
chat !is PrivateChat -> chat.id.chatId.toString().replace(
|
|
|
|
linkIdRedundantPartRegex,
|
|
|
|
""
|
|
|
|
).let { bareId ->
|
|
|
|
"$internalLinkBeginning/c/$bareId/$messageId"
|
|
|
|
}
|
|
|
|
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) {
|
|
|
|
username ?.username ?.let { return it }
|
|
|
|
}
|
|
|
|
if (this is ExtendedPublicChat) {
|
|
|
|
inviteLink ?.let { return it }
|
|
|
|
}
|
|
|
|
if (this is PrivateChat) {
|
|
|
|
return id.link
|
|
|
|
}
|
|
|
|
return null
|
|
|
|
}
|
|
|
|
|
|
|
|
private const val stickerSetAddingLinkPrefix = "$internalLinkBeginning/addstickers"
|
|
|
|
|
|
|
|
val StickerSetName.stickerSetLink
|
|
|
|
get() = link(this, "$stickerSetAddingLinkPrefix/$this")
|