1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2024-06-01 23:45:25 +00:00
tgbotapi/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/LiveLocation.kt

157 lines
5.2 KiB
Kotlin
Raw Normal View History

package dev.inmo.tgbotapi.extensions.api
2020-02-15 09:33:04 +00:00
2020-10-04 11:06:30 +00:00
import dev.inmo.tgbotapi.bot.TelegramBot
import dev.inmo.tgbotapi.extensions.api.edit.LiveLocation.editLiveLocation
import dev.inmo.tgbotapi.extensions.api.edit.LiveLocation.stopLiveLocation
import dev.inmo.tgbotapi.requests.send.SendLocation
import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
import dev.inmo.tgbotapi.types.chat.abstracts.Chat
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.content.LocationContent
import com.soywiz.klock.DateTime
import com.soywiz.klock.TimeSpan
2020-11-04 19:12:14 +00:00
import dev.inmo.tgbotapi.types.location.StaticLocation
import io.ktor.utils.io.core.Closeable
2020-02-15 09:33:04 +00:00
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
2020-02-15 09:33:04 +00:00
import kotlin.math.ceil
2020-10-04 10:47:30 +00:00
val defaultLivePeriodDelayMillis = (livePeriodLimit.last - 60L) * 1000L
class LiveLocation internal constructor(
private val requestsExecutor: TelegramBot,
scope: CoroutineScope,
autoCloseTimeDelay: Double,
initMessage: ContentMessage<LocationContent>
) : Closeable {
private val doWhenClose = {
scope.launch {
requestsExecutor.stopLiveLocation(message)
}
}
private val autoCloseTime = DateTime.now() + TimeSpan(autoCloseTimeDelay)
val leftUntilCloseMillis: TimeSpan
get() = autoCloseTime - DateTime.now()
var isClosed: Boolean = false
private set
get() = field || leftUntilCloseMillis.millisecondsLong < 0L
private var message: ContentMessage<LocationContent> = initMessage
2020-11-04 19:12:14 +00:00
val lastLocation: StaticLocation
get() = message.content.location
suspend fun updateLocation(
2020-11-04 19:12:14 +00:00
location: StaticLocation,
replyMarkup: InlineKeyboardMarkup? = null
2020-11-04 19:12:14 +00:00
): StaticLocation {
if (!isClosed) {
message = requestsExecutor.editLiveLocation(
message,
location,
replyMarkup
)
return lastLocation
} else {
error("LiveLocation is closed")
}
}
override fun close() {
if (isClosed) {
return
}
isClosed = true
doWhenClose()
}
}
2020-02-15 09:33:04 +00:00
suspend fun TelegramBot.startLiveLocation(
2020-02-15 09:33:04 +00:00
scope: CoroutineScope,
chatId: ChatIdentifier,
latitude: Double,
longitude: Double,
2020-10-04 10:47:30 +00:00
liveTimeMillis: Long = defaultLivePeriodDelayMillis,
2020-02-15 09:33:04 +00:00
disableNotification: Boolean = false,
replyToMessageId: MessageIdentifier? = null,
replyMarkup: KeyboardMarkup? = null
): LiveLocation {
val liveTimeAsDouble = liveTimeMillis.toDouble()
val locationMessage = execute(
SendLocation(
chatId,
latitude,
longitude,
ceil(liveTimeAsDouble / 1000).toLong(),
disableNotification,
replyToMessageId,
replyMarkup
)
)
return LiveLocation(
this,
scope,
liveTimeAsDouble,
locationMessage
)
}
suspend fun TelegramBot.startLiveLocation(
2020-02-15 09:33:04 +00:00
scope: CoroutineScope,
chat: Chat,
latitude: Double,
longitude: Double,
2020-10-04 10:47:30 +00:00
liveTimeMillis: Long = defaultLivePeriodDelayMillis,
2020-02-15 09:33:04 +00:00
disableNotification: Boolean = false,
replyToMessageId: MessageIdentifier? = null,
replyMarkup: KeyboardMarkup? = null
): LiveLocation = startLiveLocation(
scope, chat.id, latitude, longitude, liveTimeMillis, disableNotification, replyToMessageId, replyMarkup
)
suspend fun TelegramBot.startLiveLocation(
2020-02-15 09:33:04 +00:00
scope: CoroutineScope,
chatId: ChatId,
2020-11-04 19:12:14 +00:00
location: StaticLocation,
2020-10-04 10:47:30 +00:00
liveTimeMillis: Long = defaultLivePeriodDelayMillis,
2020-02-15 09:33:04 +00:00
disableNotification: Boolean = false,
replyToMessageId: MessageIdentifier? = null,
replyMarkup: KeyboardMarkup? = null
): LiveLocation = startLiveLocation(
scope, chatId, location.latitude, location.longitude, liveTimeMillis, disableNotification, replyToMessageId, replyMarkup
)
suspend fun TelegramBot.startLiveLocation(
2020-02-15 09:33:04 +00:00
scope: CoroutineScope,
chat: Chat,
2020-11-04 19:12:14 +00:00
location: StaticLocation,
2020-10-04 10:47:30 +00:00
liveTimeMillis: Long = defaultLivePeriodDelayMillis,
2020-02-15 09:33:04 +00:00
disableNotification: Boolean = false,
replyToMessageId: MessageIdentifier? = null,
replyMarkup: KeyboardMarkup? = null
): LiveLocation = startLiveLocation(
scope, chat.id, location.latitude, location.longitude, liveTimeMillis, disableNotification, replyToMessageId, replyMarkup
)
2020-10-04 10:47:30 +00:00
suspend inline fun TelegramBot.replyWithLiveLocation(
to: Message,
scope: CoroutineScope,
latitude: Double,
longitude: Double,
liveTimeMillis: Long = defaultLivePeriodDelayMillis,
disableNotification: Boolean = false,
replyMarkup: KeyboardMarkup? = null
) = startLiveLocation(scope, to.chat, latitude, longitude, liveTimeMillis, disableNotification, to.messageId, replyMarkup)
suspend inline fun TelegramBot.replyWithLiveLocation(
to: Message,
scope: CoroutineScope,
2020-11-04 19:12:14 +00:00
location: StaticLocation,
2020-10-04 10:47:30 +00:00
liveTimeMillis: Long = defaultLivePeriodDelayMillis,
disableNotification: Boolean = false,
replyMarkup: KeyboardMarkup? = null
) = startLiveLocation(scope, to.chat, location, liveTimeMillis, disableNotification, to.messageId, replyMarkup)