mirror of
https://github.com/InsanusMokrassar/TelegramBotAPI.git
synced 2025-11-18 21:45:06 +00:00
Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 32fe008eef | |||
| 2b938903b6 | |||
| 080db09d2c | |||
| 0efa52fe00 | |||
| fdf510153d | |||
| edb16d7107 | |||
| c49f400201 | |||
| db7de6edf8 | |||
| 10860e1bb2 | |||
| 46e6eeca9d | |||
| 80be86454d | |||
| d5f5a0e30b | |||
| 051210caf5 | |||
| 284fe58848 | |||
| 38c9732da5 | |||
| dee13c03ae | |||
| 6103b70a47 | |||
| 7f5cd0567b |
25
CHANGELOG.md
25
CHANGELOG.md
@@ -1,5 +1,30 @@
|
|||||||
# TelegramBotAPI changelog
|
# TelegramBotAPI changelog
|
||||||
|
|
||||||
|
## 9.2.4
|
||||||
|
|
||||||
|
* `Utils`:
|
||||||
|
* New extensions `*.parseCommandsWithNamedArgs`
|
||||||
|
* `BehaviourBuilder`:
|
||||||
|
* In expectaters and triggers of `commands` add `*WithNamedArgs` variants
|
||||||
|
* In expectaters and triggers of `commands` add opportunity to use custom separator
|
||||||
|
|
||||||
|
## 9.2.3
|
||||||
|
|
||||||
|
* `Core`:
|
||||||
|
* Fix in `VoiceContent#createResend`
|
||||||
|
|
||||||
|
## 9.2.2
|
||||||
|
|
||||||
|
* `Core`:
|
||||||
|
* Fix of [#793](https://github.com/InsanusMokrassar/ktgbotapi/issues/793): Add `PreviewChat`
|
||||||
|
|
||||||
|
## 9.2.1
|
||||||
|
|
||||||
|
* `Version`:
|
||||||
|
* `Ktor`: `2.3.3` -> `2.3.4`
|
||||||
|
* `Core`:
|
||||||
|
* All `ChatMember` inheritors have fixes `status` field
|
||||||
|
|
||||||
## 9.2.0
|
## 9.2.0
|
||||||
|
|
||||||
**Add support of [Telegram Bots API 6.9](https://core.telegram.org/bots/api-changelog#september-22-2023)**
|
**Add support of [Telegram Bots API 6.9](https://core.telegram.org/bots/api-changelog#september-22-2023)**
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ Object callback = {
|
|||||||
|
|
||||||
sourceLink {
|
sourceLink {
|
||||||
localDirectory.set(file("../"))
|
localDirectory.set(file("../"))
|
||||||
remoteUrl.set(new URL("https://github.com/InsanusMokrassar/TelegramBotAPI/blob/master/"))
|
remoteUrl.set(new URL("https://github.com/InsanusMokrassar/ktgbotapi/tree/master"))
|
||||||
remoteLineSuffix.set("#L")
|
remoteLineSuffix.set("#L")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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=9.2.0
|
library_version=9.2.4
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ javax-activation = "1.1.1"
|
|||||||
|
|
||||||
korlibs = "4.0.3"
|
korlibs = "4.0.3"
|
||||||
uuid = "0.7.1"
|
uuid = "0.7.1"
|
||||||
ktor = "2.3.3"
|
ktor = "2.3.4"
|
||||||
|
|
||||||
ksp = "1.8.22-1.0.11"
|
ksp = "1.8.22-1.0.11"
|
||||||
kotlin-poet = "1.14.2"
|
kotlin-poet = "1.14.2"
|
||||||
|
|||||||
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.6.2-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-bin.zip
|
||||||
|
|||||||
@@ -3,6 +3,10 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations
|
|||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
|
import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
|
||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers_registrar.doWithRegistration
|
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers_registrar.doWithRegistration
|
||||||
import dev.inmo.tgbotapi.extensions.utils.*
|
import dev.inmo.tgbotapi.extensions.utils.*
|
||||||
|
import dev.inmo.tgbotapi.extensions.utils.extensions.TelegramBotCommandsDefaults
|
||||||
|
import dev.inmo.tgbotapi.extensions.utils.extensions.parseCommandsWithArgs
|
||||||
|
import dev.inmo.tgbotapi.extensions.utils.extensions.parseCommandsWithArgsSources
|
||||||
|
import dev.inmo.tgbotapi.extensions.utils.extensions.parseCommandsWithNamedArgs
|
||||||
import dev.inmo.tgbotapi.requests.abstracts.Request
|
import dev.inmo.tgbotapi.requests.abstracts.Request
|
||||||
import dev.inmo.tgbotapi.types.BotCommand
|
import dev.inmo.tgbotapi.types.BotCommand
|
||||||
import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage
|
import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage
|
||||||
@@ -79,35 +83,54 @@ fun Flow<CommonMessage<TextContent>>.requireCommandsWithoutParams() = filter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Map the commands with their arguments and source messages
|
* Uses [parseCommandsWithArgsSources] on incoming text sources and map them with [CommonMessage]
|
||||||
*/
|
*/
|
||||||
fun Flow<CommonMessage<TextContent>>.commandsWithParams(): Flow<Pair<CommonMessage<TextContent>, List<Pair<BotCommandTextSource, Array<TextSource>>>>> = mapNotNull {
|
fun Flow<CommonMessage<TextContent>>.commandsWithParams(): Flow<Pair<CommonMessage<TextContent>, List<Pair<BotCommandTextSource, Array<TextSource>>>>> = mapNotNull {
|
||||||
var currentCommandTextSource: BotCommandTextSource? = null
|
it to it.content.textSources.parseCommandsWithArgsSources().toList()
|
||||||
val currentArgs = mutableListOf<TextSource>()
|
|
||||||
val result = mutableListOf<Pair<BotCommandTextSource, Array<TextSource>>>()
|
|
||||||
|
|
||||||
fun addCurrentCommandToResult() {
|
|
||||||
currentCommandTextSource ?.let {
|
|
||||||
result.add(it to currentArgs.toTypedArray())
|
|
||||||
currentArgs.clear()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
it.content.textSources.forEach {
|
|
||||||
it.ifBotCommandTextSource {
|
|
||||||
addCurrentCommandToResult()
|
|
||||||
currentCommandTextSource = it
|
|
||||||
return@forEach
|
|
||||||
}
|
|
||||||
currentArgs.add(it)
|
|
||||||
}
|
|
||||||
addCurrentCommandToResult()
|
|
||||||
|
|
||||||
result.toList().takeIf { it.isNotEmpty() } ?.let { result ->
|
|
||||||
it to result
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses [parseCommandsWithArgs] on incoming text sources and map them with [CommonMessage]
|
||||||
|
*/
|
||||||
|
fun Flow<CommonMessage<TextContent>>.commandsWithArgs(
|
||||||
|
argsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex
|
||||||
|
): Flow<Pair<CommonMessage<TextContent>, List<Pair<String, Array<String>>>>> = mapNotNull {
|
||||||
|
val commandsWithArgs = it.content.textSources.parseCommandsWithArgs(argsSeparator).toList().ifEmpty {
|
||||||
|
return@mapNotNull null
|
||||||
|
}
|
||||||
|
|
||||||
|
it to commandsWithArgs
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses [parseCommandsWithArgs] on incoming text sources and map them with [CommonMessage]
|
||||||
|
*/
|
||||||
|
fun Flow<CommonMessage<TextContent>>.commandsWithArgs(
|
||||||
|
argsSeparator: String
|
||||||
|
): Flow<Pair<CommonMessage<TextContent>, List<Pair<String, Array<String>>>>> = commandsWithArgs(Regex(argsSeparator))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses [parseCommandsWithNamedArgs] on incoming text sources and map them with [CommonMessage]
|
||||||
|
*/
|
||||||
|
fun Flow<CommonMessage<TextContent>>.commandsWithNamedArgs(
|
||||||
|
argsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex,
|
||||||
|
nameArgSeparator: Regex = TelegramBotCommandsDefaults.defaultNamesArgsSeparatorRegex,
|
||||||
|
): Flow<Pair<CommonMessage<TextContent>, List<Pair<String, List<Pair<String, String>>>>>> = mapNotNull {
|
||||||
|
val commandsWithArgs = it.content.textSources.parseCommandsWithNamedArgs(argsSeparator, nameArgSeparator).toList().ifEmpty {
|
||||||
|
return@mapNotNull null
|
||||||
|
}
|
||||||
|
|
||||||
|
it to commandsWithArgs
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses [parseCommandsWithNamedArgs] on incoming text sources and map them with [CommonMessage]
|
||||||
|
*/
|
||||||
|
fun Flow<CommonMessage<TextContent>>.commandsWithNamedArgs(
|
||||||
|
argsSeparator: String,
|
||||||
|
nameArgSeparator: Regex = TelegramBotCommandsDefaults.defaultNamesArgsSeparatorRegex,
|
||||||
|
): Flow<Pair<CommonMessage<TextContent>, List<Pair<String, List<Pair<String, String>>>>>> = commandsWithNamedArgs(Regex(argsSeparator), nameArgSeparator)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flat [commandsWithParams]. Each [Pair] of [BotCommandTextSource] and its [Array] of arg text sources will
|
* Flat [commandsWithParams]. Each [Pair] of [BotCommandTextSource] and its [Array] of arg text sources will
|
||||||
* be associated with its source message
|
* be associated with its source message
|
||||||
|
|||||||
@@ -11,7 +11,9 @@ import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByC
|
|||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
|
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
|
||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.times
|
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.times
|
||||||
import dev.inmo.tgbotapi.extensions.utils.botCommandTextSourceOrNull
|
import dev.inmo.tgbotapi.extensions.utils.botCommandTextSourceOrNull
|
||||||
import dev.inmo.tgbotapi.extensions.utils.extensions.parseCommandsWithParams
|
import dev.inmo.tgbotapi.extensions.utils.extensions.TelegramBotCommandsDefaults
|
||||||
|
import dev.inmo.tgbotapi.extensions.utils.extensions.parseCommandsWithArgs
|
||||||
|
import dev.inmo.tgbotapi.extensions.utils.extensions.parseCommandsWithNamedArgs
|
||||||
import dev.inmo.tgbotapi.types.BotCommand
|
import dev.inmo.tgbotapi.types.BotCommand
|
||||||
import dev.inmo.tgbotapi.types.message.content.TextContent
|
import dev.inmo.tgbotapi.types.message.content.TextContent
|
||||||
import dev.inmo.tgbotapi.types.message.content.TextMessage
|
import dev.inmo.tgbotapi.types.message.content.TextMessage
|
||||||
@@ -124,6 +126,7 @@ suspend fun <BC : BehaviourContext> BC.commandWithArgs(
|
|||||||
initialFilter: CommonMessageFilter<TextContent>? = CommonMessageFilterExcludeMediaGroups,
|
initialFilter: CommonMessageFilter<TextContent>? = CommonMessageFilterExcludeMediaGroups,
|
||||||
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, TextMessage, Update>? = MessageFilterByChat,
|
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, TextMessage, Update>? = MessageFilterByChat,
|
||||||
markerFactory: MarkerFactory<in TextMessage, Any> = ByChatMessageMarkerFactory,
|
markerFactory: MarkerFactory<in TextMessage, Any> = ByChatMessageMarkerFactory,
|
||||||
|
argsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex,
|
||||||
scenarioReceiver: CustomBehaviourContextAndTwoTypesReceiver<BC, Unit, TextMessage, Array<String>>
|
scenarioReceiver: CustomBehaviourContextAndTwoTypesReceiver<BC, Unit, TextMessage, Array<String>>
|
||||||
) = command(
|
) = command(
|
||||||
commandRegex,
|
commandRegex,
|
||||||
@@ -132,7 +135,7 @@ suspend fun <BC : BehaviourContext> BC.commandWithArgs(
|
|||||||
subcontextUpdatesFilter = subcontextUpdatesFilter,
|
subcontextUpdatesFilter = subcontextUpdatesFilter,
|
||||||
markerFactory = markerFactory
|
markerFactory = markerFactory
|
||||||
) {
|
) {
|
||||||
val args = it.parseCommandsWithParams().let { commandsWithArgs ->
|
val args = it.parseCommandsWithArgs(argsSeparator = argsSeparator).let { commandsWithArgs ->
|
||||||
val key = commandsWithArgs.keys.firstOrNull { it.matches(commandRegex) } ?: return@let null
|
val key = commandsWithArgs.keys.firstOrNull { it.matches(commandRegex) } ?: return@let null
|
||||||
commandsWithArgs[key]
|
commandsWithArgs[key]
|
||||||
} ?: emptyArray()
|
} ?: emptyArray()
|
||||||
@@ -144,12 +147,14 @@ suspend fun <BC : BehaviourContext> BC.commandWithArgs(
|
|||||||
initialFilter: CommonMessageFilter<TextContent>? = CommonMessageFilterExcludeMediaGroups,
|
initialFilter: CommonMessageFilter<TextContent>? = CommonMessageFilterExcludeMediaGroups,
|
||||||
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, TextMessage, Update>? = MessageFilterByChat,
|
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, TextMessage, Update>? = MessageFilterByChat,
|
||||||
markerFactory: MarkerFactory<in TextMessage, Any> = ByChatMessageMarkerFactory,
|
markerFactory: MarkerFactory<in TextMessage, Any> = ByChatMessageMarkerFactory,
|
||||||
|
argsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex,
|
||||||
scenarioReceiver: CustomBehaviourContextAndTwoTypesReceiver<BC, Unit, TextMessage, Array<String>>
|
scenarioReceiver: CustomBehaviourContextAndTwoTypesReceiver<BC, Unit, TextMessage, Array<String>>
|
||||||
) = commandWithArgs(
|
) = commandWithArgs(
|
||||||
command.toRegex(),
|
command.toRegex(),
|
||||||
initialFilter = initialFilter,
|
initialFilter = initialFilter,
|
||||||
subcontextUpdatesFilter = subcontextUpdatesFilter,
|
subcontextUpdatesFilter = subcontextUpdatesFilter,
|
||||||
markerFactory = markerFactory,
|
markerFactory = markerFactory,
|
||||||
|
argsSeparator = argsSeparator,
|
||||||
scenarioReceiver = scenarioReceiver
|
scenarioReceiver = scenarioReceiver
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -158,12 +163,72 @@ suspend fun <BC : BehaviourContext> BC.commandWithArgs(
|
|||||||
initialFilter: CommonMessageFilter<TextContent>? = CommonMessageFilterExcludeMediaGroups,
|
initialFilter: CommonMessageFilter<TextContent>? = CommonMessageFilterExcludeMediaGroups,
|
||||||
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, TextMessage, Update>? = MessageFilterByChat,
|
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, TextMessage, Update>? = MessageFilterByChat,
|
||||||
markerFactory: MarkerFactory<in TextMessage, Any> = ByChatMessageMarkerFactory,
|
markerFactory: MarkerFactory<in TextMessage, Any> = ByChatMessageMarkerFactory,
|
||||||
|
argsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex,
|
||||||
scenarioReceiver: CustomBehaviourContextAndTwoTypesReceiver<BC, Unit, TextMessage, Array<String>>
|
scenarioReceiver: CustomBehaviourContextAndTwoTypesReceiver<BC, Unit, TextMessage, Array<String>>
|
||||||
) = commandWithArgs(
|
) = commandWithArgs(
|
||||||
botCommand.command,
|
botCommand.command,
|
||||||
initialFilter = initialFilter,
|
initialFilter = initialFilter,
|
||||||
subcontextUpdatesFilter = subcontextUpdatesFilter,
|
subcontextUpdatesFilter = subcontextUpdatesFilter,
|
||||||
markerFactory = markerFactory,
|
markerFactory = markerFactory,
|
||||||
|
argsSeparator = argsSeparator,
|
||||||
|
scenarioReceiver = scenarioReceiver
|
||||||
|
)
|
||||||
|
|
||||||
|
suspend fun <BC : BehaviourContext> BC.commandWithNamedArgs(
|
||||||
|
commandRegex: Regex,
|
||||||
|
initialFilter: CommonMessageFilter<TextContent>? = CommonMessageFilterExcludeMediaGroups,
|
||||||
|
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, TextMessage, Update>? = MessageFilterByChat,
|
||||||
|
markerFactory: MarkerFactory<in TextMessage, Any> = ByChatMessageMarkerFactory,
|
||||||
|
argsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex,
|
||||||
|
nameArgSeparator: Regex = TelegramBotCommandsDefaults.defaultNamesArgsSeparatorRegex,
|
||||||
|
scenarioReceiver: CustomBehaviourContextAndTwoTypesReceiver<BC, Unit, TextMessage, List<Pair<String, String>>>
|
||||||
|
) = command(
|
||||||
|
commandRegex,
|
||||||
|
requireOnlyCommandInMessage = false,
|
||||||
|
initialFilter = initialFilter,
|
||||||
|
subcontextUpdatesFilter = subcontextUpdatesFilter,
|
||||||
|
markerFactory = markerFactory
|
||||||
|
) {
|
||||||
|
val args = it.parseCommandsWithNamedArgs(argsSeparator = argsSeparator, nameArgSeparator = nameArgSeparator).let { commandsWithArgs ->
|
||||||
|
val key = commandsWithArgs.keys.firstOrNull { it.matches(commandRegex) } ?: return@let null
|
||||||
|
commandsWithArgs[key]
|
||||||
|
} ?: emptyList()
|
||||||
|
scenarioReceiver(it, args)
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun <BC : BehaviourContext> BC.commandWithNamedArgs(
|
||||||
|
command: String,
|
||||||
|
initialFilter: CommonMessageFilter<TextContent>? = CommonMessageFilterExcludeMediaGroups,
|
||||||
|
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, TextMessage, Update>? = MessageFilterByChat,
|
||||||
|
markerFactory: MarkerFactory<in TextMessage, Any> = ByChatMessageMarkerFactory,
|
||||||
|
argsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex,
|
||||||
|
nameArgSeparator: Regex = TelegramBotCommandsDefaults.defaultNamesArgsSeparatorRegex,
|
||||||
|
scenarioReceiver: CustomBehaviourContextAndTwoTypesReceiver<BC, Unit, TextMessage, List<Pair<String, String>>>
|
||||||
|
) = commandWithNamedArgs(
|
||||||
|
command.toRegex(),
|
||||||
|
initialFilter = initialFilter,
|
||||||
|
subcontextUpdatesFilter = subcontextUpdatesFilter,
|
||||||
|
markerFactory = markerFactory,
|
||||||
|
argsSeparator = argsSeparator,
|
||||||
|
nameArgSeparator = nameArgSeparator,
|
||||||
|
scenarioReceiver = scenarioReceiver
|
||||||
|
)
|
||||||
|
|
||||||
|
suspend fun <BC : BehaviourContext> BC.commandWithNamedArgs(
|
||||||
|
botCommand: BotCommand,
|
||||||
|
initialFilter: CommonMessageFilter<TextContent>? = CommonMessageFilterExcludeMediaGroups,
|
||||||
|
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, TextMessage, Update>? = MessageFilterByChat,
|
||||||
|
markerFactory: MarkerFactory<in TextMessage, Any> = ByChatMessageMarkerFactory,
|
||||||
|
argsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex,
|
||||||
|
nameArgSeparator: Regex = TelegramBotCommandsDefaults.defaultNamesArgsSeparatorRegex,
|
||||||
|
scenarioReceiver: CustomBehaviourContextAndTwoTypesReceiver<BC, Unit, TextMessage, List<Pair<String, String>>>
|
||||||
|
) = commandWithNamedArgs(
|
||||||
|
botCommand.command,
|
||||||
|
initialFilter = initialFilter,
|
||||||
|
subcontextUpdatesFilter = subcontextUpdatesFilter,
|
||||||
|
markerFactory = markerFactory,
|
||||||
|
argsSeparator = argsSeparator,
|
||||||
|
nameArgSeparator = nameArgSeparator,
|
||||||
scenarioReceiver = scenarioReceiver
|
scenarioReceiver = scenarioReceiver
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -172,21 +237,99 @@ suspend fun <BC : BehaviourContext> BC.onCommandWithArgs(
|
|||||||
initialFilter: CommonMessageFilter<TextContent>? = CommonMessageFilterExcludeMediaGroups,
|
initialFilter: CommonMessageFilter<TextContent>? = CommonMessageFilterExcludeMediaGroups,
|
||||||
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, TextMessage, Update>? = MessageFilterByChat,
|
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, TextMessage, Update>? = MessageFilterByChat,
|
||||||
markerFactory: MarkerFactory<in TextMessage, Any> = ByChatMessageMarkerFactory,
|
markerFactory: MarkerFactory<in TextMessage, Any> = ByChatMessageMarkerFactory,
|
||||||
|
argsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex,
|
||||||
scenarioReceiver: CustomBehaviourContextAndTwoTypesReceiver<BC, Unit, TextMessage, Array<String>>
|
scenarioReceiver: CustomBehaviourContextAndTwoTypesReceiver<BC, Unit, TextMessage, Array<String>>
|
||||||
): Job = commandWithArgs(commandRegex, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver)
|
): Job = commandWithArgs(
|
||||||
|
commandRegex = commandRegex,
|
||||||
|
initialFilter = initialFilter,
|
||||||
|
subcontextUpdatesFilter = subcontextUpdatesFilter,
|
||||||
|
markerFactory = markerFactory,
|
||||||
|
argsSeparator = argsSeparator,
|
||||||
|
scenarioReceiver = scenarioReceiver
|
||||||
|
)
|
||||||
|
|
||||||
suspend fun <BC : BehaviourContext> BC.onCommandWithArgs(
|
suspend fun <BC : BehaviourContext> BC.onCommandWithArgs(
|
||||||
command: String,
|
command: String,
|
||||||
initialFilter: CommonMessageFilter<TextContent>? = CommonMessageFilterExcludeMediaGroups,
|
initialFilter: CommonMessageFilter<TextContent>? = CommonMessageFilterExcludeMediaGroups,
|
||||||
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, TextMessage, Update>? = MessageFilterByChat,
|
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, TextMessage, Update>? = MessageFilterByChat,
|
||||||
markerFactory: MarkerFactory<in TextMessage, Any> = ByChatMessageMarkerFactory,
|
markerFactory: MarkerFactory<in TextMessage, Any> = ByChatMessageMarkerFactory,
|
||||||
|
argsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex,
|
||||||
scenarioReceiver: CustomBehaviourContextAndTwoTypesReceiver<BC, Unit, TextMessage, Array<String>>
|
scenarioReceiver: CustomBehaviourContextAndTwoTypesReceiver<BC, Unit, TextMessage, Array<String>>
|
||||||
): Job = onCommandWithArgs(command.toRegex(), initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver)
|
): Job = onCommandWithArgs(
|
||||||
|
commandRegex = command.toRegex(),
|
||||||
|
initialFilter = initialFilter,
|
||||||
|
subcontextUpdatesFilter = subcontextUpdatesFilter,
|
||||||
|
markerFactory = markerFactory,
|
||||||
|
argsSeparator = argsSeparator,
|
||||||
|
scenarioReceiver = scenarioReceiver
|
||||||
|
)
|
||||||
|
|
||||||
suspend fun <BC : BehaviourContext> BC.onCommandWithArgs(
|
suspend fun <BC : BehaviourContext> BC.onCommandWithArgs(
|
||||||
botCommand: BotCommand,
|
botCommand: BotCommand,
|
||||||
initialFilter: CommonMessageFilter<TextContent>? = CommonMessageFilterExcludeMediaGroups,
|
initialFilter: CommonMessageFilter<TextContent>? = CommonMessageFilterExcludeMediaGroups,
|
||||||
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, TextMessage, Update>? = MessageFilterByChat,
|
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, TextMessage, Update>? = MessageFilterByChat,
|
||||||
markerFactory: MarkerFactory<in TextMessage, Any> = ByChatMessageMarkerFactory,
|
markerFactory: MarkerFactory<in TextMessage, Any> = ByChatMessageMarkerFactory,
|
||||||
|
argsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex,
|
||||||
scenarioReceiver: CustomBehaviourContextAndTwoTypesReceiver<BC, Unit, TextMessage, Array<String>>
|
scenarioReceiver: CustomBehaviourContextAndTwoTypesReceiver<BC, Unit, TextMessage, Array<String>>
|
||||||
): Job = onCommandWithArgs(botCommand.command, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver)
|
): Job = onCommandWithArgs(
|
||||||
|
command = botCommand.command,
|
||||||
|
initialFilter = initialFilter,
|
||||||
|
subcontextUpdatesFilter = subcontextUpdatesFilter,
|
||||||
|
markerFactory = markerFactory,
|
||||||
|
argsSeparator = argsSeparator,
|
||||||
|
scenarioReceiver = scenarioReceiver
|
||||||
|
)
|
||||||
|
|
||||||
|
suspend fun <BC : BehaviourContext> BC.onCommandWithNamedArgs(
|
||||||
|
commandRegex: Regex,
|
||||||
|
initialFilter: CommonMessageFilter<TextContent>? = CommonMessageFilterExcludeMediaGroups,
|
||||||
|
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, TextMessage, Update>? = MessageFilterByChat,
|
||||||
|
markerFactory: MarkerFactory<in TextMessage, Any> = ByChatMessageMarkerFactory,
|
||||||
|
argsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex,
|
||||||
|
nameArgSeparator: Regex = TelegramBotCommandsDefaults.defaultNamesArgsSeparatorRegex,
|
||||||
|
scenarioReceiver: CustomBehaviourContextAndTwoTypesReceiver<BC, Unit, TextMessage, List<Pair<String, String>>>
|
||||||
|
) = commandWithNamedArgs(
|
||||||
|
commandRegex,
|
||||||
|
initialFilter = initialFilter,
|
||||||
|
subcontextUpdatesFilter = subcontextUpdatesFilter,
|
||||||
|
markerFactory = markerFactory,
|
||||||
|
argsSeparator = argsSeparator,
|
||||||
|
nameArgSeparator = nameArgSeparator,
|
||||||
|
scenarioReceiver = scenarioReceiver,
|
||||||
|
)
|
||||||
|
|
||||||
|
suspend fun <BC : BehaviourContext> BC.onCommandWithNamedArgs(
|
||||||
|
command: String,
|
||||||
|
initialFilter: CommonMessageFilter<TextContent>? = CommonMessageFilterExcludeMediaGroups,
|
||||||
|
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, TextMessage, Update>? = MessageFilterByChat,
|
||||||
|
markerFactory: MarkerFactory<in TextMessage, Any> = ByChatMessageMarkerFactory,
|
||||||
|
argsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex,
|
||||||
|
nameArgSeparator: Regex = TelegramBotCommandsDefaults.defaultNamesArgsSeparatorRegex,
|
||||||
|
scenarioReceiver: CustomBehaviourContextAndTwoTypesReceiver<BC, Unit, TextMessage, List<Pair<String, String>>>
|
||||||
|
) = onCommandWithNamedArgs(
|
||||||
|
command.toRegex(),
|
||||||
|
initialFilter = initialFilter,
|
||||||
|
subcontextUpdatesFilter = subcontextUpdatesFilter,
|
||||||
|
markerFactory = markerFactory,
|
||||||
|
argsSeparator = argsSeparator,
|
||||||
|
nameArgSeparator = nameArgSeparator,
|
||||||
|
scenarioReceiver = scenarioReceiver
|
||||||
|
)
|
||||||
|
|
||||||
|
suspend fun <BC : BehaviourContext> BC.onCommandWithNamedArgs(
|
||||||
|
botCommand: BotCommand,
|
||||||
|
initialFilter: CommonMessageFilter<TextContent>? = CommonMessageFilterExcludeMediaGroups,
|
||||||
|
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, TextMessage, Update>? = MessageFilterByChat,
|
||||||
|
markerFactory: MarkerFactory<in TextMessage, Any> = ByChatMessageMarkerFactory,
|
||||||
|
argsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex,
|
||||||
|
nameArgSeparator: Regex = TelegramBotCommandsDefaults.defaultNamesArgsSeparatorRegex,
|
||||||
|
scenarioReceiver: CustomBehaviourContextAndTwoTypesReceiver<BC, Unit, TextMessage, List<Pair<String, String>>>
|
||||||
|
) = onCommandWithNamedArgs(
|
||||||
|
botCommand.command,
|
||||||
|
initialFilter = initialFilter,
|
||||||
|
subcontextUpdatesFilter = subcontextUpdatesFilter,
|
||||||
|
markerFactory = markerFactory,
|
||||||
|
argsSeparator = argsSeparator,
|
||||||
|
nameArgSeparator = nameArgSeparator,
|
||||||
|
scenarioReceiver = scenarioReceiver
|
||||||
|
)
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByC
|
|||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
|
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
|
||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.times
|
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.times
|
||||||
import dev.inmo.tgbotapi.extensions.utils.botCommandTextSourceOrNull
|
import dev.inmo.tgbotapi.extensions.utils.botCommandTextSourceOrNull
|
||||||
import dev.inmo.tgbotapi.extensions.utils.extensions.parseCommandsWithParams
|
import dev.inmo.tgbotapi.extensions.utils.extensions.parseCommandsWithArgs
|
||||||
import dev.inmo.tgbotapi.types.message.content.TextContent
|
import dev.inmo.tgbotapi.types.message.content.TextContent
|
||||||
import dev.inmo.tgbotapi.types.message.content.TextMessage
|
import dev.inmo.tgbotapi.types.message.content.TextMessage
|
||||||
import dev.inmo.tgbotapi.types.update.abstracts.Update
|
import dev.inmo.tgbotapi.types.update.abstracts.Update
|
||||||
@@ -65,7 +65,7 @@ suspend fun <BC : BehaviourContext> BC.unhandledCommandWithArgs(
|
|||||||
subcontextUpdatesFilter = subcontextUpdatesFilter,
|
subcontextUpdatesFilter = subcontextUpdatesFilter,
|
||||||
markerFactory = markerFactory
|
markerFactory = markerFactory
|
||||||
) {
|
) {
|
||||||
val args = it.parseCommandsWithParams().let { commandsWithArgs ->
|
val args = it.parseCommandsWithArgs().let { commandsWithArgs ->
|
||||||
commandsWithArgs
|
commandsWithArgs
|
||||||
}
|
}
|
||||||
scenarioReceiver(it, args)
|
scenarioReceiver(it, args)
|
||||||
|
|||||||
@@ -4,22 +4,18 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling
|
|||||||
|
|
||||||
import dev.inmo.micro_utils.coroutines.*
|
import dev.inmo.micro_utils.coroutines.*
|
||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.*
|
import dev.inmo.tgbotapi.extensions.behaviour_builder.*
|
||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitDeepLinks
|
|
||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.filters.CommonMessageFilterExcludeMediaGroups
|
|
||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.filters.MessageFilterByChat
|
import dev.inmo.tgbotapi.extensions.behaviour_builder.filters.MessageFilterByChat
|
||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter
|
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter
|
||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByChatMessageMarkerFactory
|
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByChatMessageMarkerFactory
|
||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
|
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
|
||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.times
|
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.times
|
||||||
import dev.inmo.tgbotapi.extensions.utils.*
|
import dev.inmo.tgbotapi.extensions.utils.*
|
||||||
import dev.inmo.tgbotapi.extensions.utils.extensions.parseCommandsWithParams
|
|
||||||
import dev.inmo.tgbotapi.types.message.content.TextContent
|
import dev.inmo.tgbotapi.types.message.content.TextContent
|
||||||
import dev.inmo.tgbotapi.types.message.content.TextMessage
|
import dev.inmo.tgbotapi.types.message.content.TextMessage
|
||||||
import dev.inmo.tgbotapi.types.message.textsources.RegularTextSource
|
import dev.inmo.tgbotapi.types.message.textsources.RegularTextSource
|
||||||
import dev.inmo.tgbotapi.types.update.abstracts.Update
|
import dev.inmo.tgbotapi.types.update.abstracts.Update
|
||||||
import io.ktor.http.decodeURLQueryComponent
|
import io.ktor.http.decodeURLQueryComponent
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
import kotlinx.coroutines.flow.filter
|
|
||||||
|
|
||||||
private val startRegex = Regex("start")
|
private val startRegex = Regex("start")
|
||||||
suspend fun <BC : BehaviourContext> BC.onDeepLink(
|
suspend fun <BC : BehaviourContext> BC.onDeepLink(
|
||||||
|
|||||||
@@ -1,10 +1,17 @@
|
|||||||
package dev.inmo.tgbotapi.abstracts
|
package dev.inmo.tgbotapi.abstracts
|
||||||
|
|
||||||
import dev.inmo.tgbotapi.types.chat.Chat
|
import dev.inmo.tgbotapi.types.chat.Chat
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewChat
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All inheritors of this interface have [chat] field and related to this [chat]
|
* All inheritors of this interface have [chat] field and related to this [chat]
|
||||||
*/
|
*/
|
||||||
interface WithChat {
|
interface WithPreviewChat {
|
||||||
val chat: Chat
|
val chat: PreviewChat
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All inheritors of this interface have [chat] field and related to this [chat]
|
||||||
|
*/
|
||||||
|
@Deprecated("Renamed", ReplaceWith("WithPreviewChat", "dev.inmo.tgbotapi.abstracts.WithPreviewChat"))
|
||||||
|
typealias WithChat = WithPreviewChat
|
||||||
|
|||||||
@@ -4,51 +4,51 @@ import dev.inmo.tgbotapi.utils.internal.ClassCastsIncluded
|
|||||||
import dev.inmo.tgbotapi.types.*
|
import dev.inmo.tgbotapi.types.*
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable(PreviewChatSerializer::class)
|
@Serializable(ChatSerializer::class)
|
||||||
sealed interface UsernameChat : Chat {
|
sealed interface UsernameChat : Chat {
|
||||||
val username: Username?
|
val username: Username?
|
||||||
}
|
}
|
||||||
|
|
||||||
@Serializable(PreviewChatSerializer::class)
|
@Serializable(ChatSerializer::class)
|
||||||
sealed interface PrivateChat : Chat, UsernameChat {
|
sealed interface PrivateChat : Chat, UsernameChat {
|
||||||
override val id: UserId
|
override val id: UserId
|
||||||
val firstName: String
|
val firstName: String
|
||||||
val lastName: String
|
val lastName: String
|
||||||
}
|
}
|
||||||
|
|
||||||
@Serializable(PreviewChatSerializer::class)
|
@Serializable(ChatSerializer::class)
|
||||||
sealed interface PublicChat : Chat {
|
sealed interface PublicChat : Chat {
|
||||||
val title: String
|
val title: String
|
||||||
}
|
}
|
||||||
|
|
||||||
@Serializable(PreviewChatSerializer::class)
|
@Serializable(ChatSerializer::class)
|
||||||
sealed interface SuperPublicChat : PublicChat, UsernameChat
|
sealed interface SuperPublicChat : PublicChat, UsernameChat
|
||||||
|
|
||||||
@Serializable(PreviewChatSerializer::class)
|
@Serializable(ChatSerializer::class)
|
||||||
sealed interface ChannelChat : SuperPublicChat {
|
sealed interface ChannelChat : SuperPublicChat {
|
||||||
override val id: ChatId
|
override val id: ChatId
|
||||||
}
|
}
|
||||||
|
|
||||||
@Serializable(PreviewChatSerializer::class)
|
@Serializable(ChatSerializer::class)
|
||||||
sealed interface GroupChat : PublicChat
|
sealed interface GroupChat : PublicChat
|
||||||
|
|
||||||
@Serializable(PreviewChatSerializer::class)
|
@Serializable(ChatSerializer::class)
|
||||||
sealed interface SupergroupChat : GroupChat, SuperPublicChat
|
sealed interface SupergroupChat : GroupChat, SuperPublicChat
|
||||||
|
|
||||||
@Serializable(PreviewChatSerializer::class)
|
@Serializable(ChatSerializer::class)
|
||||||
sealed interface ForumChat : SupergroupChat
|
sealed interface ForumChat : SupergroupChat
|
||||||
|
|
||||||
@Serializable(PreviewChatSerializer::class)
|
@Serializable(ChatSerializer::class)
|
||||||
sealed interface PossiblyPremiumChat : Chat {
|
sealed interface PossiblyPremiumChat : Chat {
|
||||||
val isPremium: Boolean
|
val isPremium: Boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
@Serializable(PreviewChatSerializer::class)
|
@Serializable(ChatSerializer::class)
|
||||||
sealed interface AbleToAddInAttachmentMenuChat : Chat {
|
sealed interface AbleToAddInAttachmentMenuChat : Chat {
|
||||||
val addedToAttachmentMenu: Boolean
|
val addedToAttachmentMenu: Boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
@Serializable(PreviewChatSerializer::class)
|
@Serializable(ChatSerializer::class)
|
||||||
@ClassCastsIncluded(excludeRegex = ".*Impl")
|
@ClassCastsIncluded(excludeRegex = ".*Impl")
|
||||||
sealed interface Chat {
|
sealed interface Chat {
|
||||||
val id: IdChatIdentifier
|
val id: IdChatIdentifier
|
||||||
|
|||||||
@@ -49,13 +49,54 @@ object ChatTypeSerializer : KSerializer<ChatType> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@RiskFeature
|
@RiskFeature
|
||||||
object PreviewChatSerializer : KSerializer<Chat> {
|
object ChatSerializer : KSerializer<Chat> {
|
||||||
@OptIn(InternalSerializationApi::class)
|
@OptIn(InternalSerializationApi::class)
|
||||||
override val descriptor: SerialDescriptor = buildSerialDescriptor("PreviewChatSerializer", PolymorphicKind.OPEN)
|
override val descriptor: SerialDescriptor = buildSerialDescriptor("PreviewChatSerializer", PolymorphicKind.OPEN)
|
||||||
|
|
||||||
override fun deserialize(decoder: Decoder): Chat {
|
override fun deserialize(decoder: Decoder): Chat {
|
||||||
val decodedJson = JsonObject.serializer().deserialize(decoder)
|
val decodedJson = JsonObject.serializer().deserialize(decoder)
|
||||||
|
|
||||||
|
return try {
|
||||||
|
formatter.decodeFromJsonElement(ExtendedChatSerializer, decodedJson)
|
||||||
|
} catch (e: SerializationException) {
|
||||||
|
val type = decodedJson[typeField] ?.jsonPrimitive ?.content ?.asChatType ?: error("Field $typeField must be presented, but absent in $decodedJson")
|
||||||
|
val isForum = decodedJson[isForumField] ?.jsonPrimitive ?.booleanOrNull == true
|
||||||
|
|
||||||
|
when (type) {
|
||||||
|
ChatType.PrivateChatType -> formatter.decodeFromJsonElement(PrivateChatImpl.serializer(), decodedJson)
|
||||||
|
ChatType.GroupChatType -> formatter.decodeFromJsonElement(GroupChatImpl.serializer(), decodedJson)
|
||||||
|
ChatType.SupergroupChatType -> if (isForum) {
|
||||||
|
formatter.decodeFromJsonElement(ForumChatImpl.serializer(), decodedJson)
|
||||||
|
} else {
|
||||||
|
formatter.decodeFromJsonElement(SupergroupChatImpl.serializer(), decodedJson)
|
||||||
|
}
|
||||||
|
ChatType.ChannelChatType -> formatter.decodeFromJsonElement(ChannelChatImpl.serializer(), decodedJson)
|
||||||
|
is ChatType.UnknownChatType -> UnknownChatType(
|
||||||
|
formatter.decodeFromJsonElement(Long.serializer(), decodedJson[chatIdField] ?: JsonPrimitive(-1)).toChatId(),
|
||||||
|
decodedJson.toString(),
|
||||||
|
decodedJson
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serialize(encoder: Encoder, value: Chat) {
|
||||||
|
when (value) {
|
||||||
|
is ExtendedChat -> ExtendedChatSerializer.serialize(encoder, value)
|
||||||
|
is PreviewChat -> PreviewChatSerializer.serialize(encoder, value)
|
||||||
|
is ExtendedBot -> ExtendedBot.serializer().serialize(encoder, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@RiskFeature
|
||||||
|
object PreviewChatSerializer : KSerializer<PreviewChat> {
|
||||||
|
@OptIn(InternalSerializationApi::class)
|
||||||
|
override val descriptor: SerialDescriptor = buildSerialDescriptor("PreviewChatSerializer", PolymorphicKind.OPEN)
|
||||||
|
|
||||||
|
override fun deserialize(decoder: Decoder): PreviewChat {
|
||||||
|
val decodedJson = JsonObject.serializer().deserialize(decoder)
|
||||||
|
|
||||||
val type = decodedJson[typeField] ?.jsonPrimitive ?.content ?.asChatType ?: error("Field $typeField must be presented, but absent in $decodedJson")
|
val type = decodedJson[typeField] ?.jsonPrimitive ?.content ?.asChatType ?: error("Field $typeField must be presented, but absent in $decodedJson")
|
||||||
val isForum = decodedJson[isForumField] ?.jsonPrimitive ?.booleanOrNull == true
|
val isForum = decodedJson[isForumField] ?.jsonPrimitive ?.booleanOrNull == true
|
||||||
|
|
||||||
@@ -76,16 +117,14 @@ object PreviewChatSerializer : KSerializer<Chat> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun serialize(encoder: Encoder, value: Chat) {
|
override fun serialize(encoder: Encoder, value: PreviewChat) {
|
||||||
when (value) {
|
when (value) {
|
||||||
is ExtendedChat -> ExtendedChatSerializer.serialize(encoder, value)
|
|
||||||
is PrivateChatImpl -> PrivateChatImpl.serializer().serialize(encoder, value)
|
is PrivateChatImpl -> PrivateChatImpl.serializer().serialize(encoder, value)
|
||||||
is GroupChatImpl -> GroupChatImpl.serializer().serialize(encoder, value)
|
is GroupChatImpl -> GroupChatImpl.serializer().serialize(encoder, value)
|
||||||
is SupergroupChatImpl -> SupergroupChatImpl.serializer().serialize(encoder, value)
|
is SupergroupChatImpl -> SupergroupChatImpl.serializer().serialize(encoder, value)
|
||||||
is ForumChatImpl -> ForumChatImpl.serializer().serialize(encoder, value)
|
is ForumChatImpl -> ForumChatImpl.serializer().serialize(encoder, value)
|
||||||
is ChannelChatImpl -> ChannelChatImpl.serializer().serialize(encoder, value)
|
is ChannelChatImpl -> ChannelChatImpl.serializer().serialize(encoder, value)
|
||||||
is CommonBot -> CommonBot.serializer().serialize(encoder, value)
|
is CommonBot -> CommonBot.serializer().serialize(encoder, value)
|
||||||
is ExtendedBot -> ExtendedBot.serializer().serialize(encoder, value)
|
|
||||||
is CommonUser -> CommonUser.serializer().serialize(encoder, value)
|
is CommonUser -> CommonUser.serializer().serialize(encoder, value)
|
||||||
is UnknownChatType -> JsonObject.serializer().serialize(encoder, value.rawJson)
|
is UnknownChatType -> JsonObject.serializer().serialize(encoder, value.rawJson)
|
||||||
}
|
}
|
||||||
@@ -128,6 +167,7 @@ sealed class ExtendedChatSerializer : KSerializer<ExtendedChat> {
|
|||||||
is ExtendedSupergroupChatImpl -> ExtendedSupergroupChatImpl.serializer().serialize(encoder, value)
|
is ExtendedSupergroupChatImpl -> ExtendedSupergroupChatImpl.serializer().serialize(encoder, value)
|
||||||
is ExtendedForumChatImpl -> ExtendedForumChatImpl.serializer().serialize(encoder, value)
|
is ExtendedForumChatImpl -> ExtendedForumChatImpl.serializer().serialize(encoder, value)
|
||||||
is ExtendedChannelChatImpl -> ExtendedChannelChatImpl.serializer().serialize(encoder, value)
|
is ExtendedChannelChatImpl -> ExtendedChannelChatImpl.serializer().serialize(encoder, value)
|
||||||
|
is ExtendedBot -> ExtendedBot.serializer().serialize(encoder, value)
|
||||||
is UnknownExtendedChat -> JsonObject.serializer().serialize(encoder, value.rawJson)
|
is UnknownExtendedChat -> JsonObject.serializer().serialize(encoder, value.rawJson)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -184,8 +184,10 @@ data class ExtendedBot(
|
|||||||
@SerialName(canReadAllGroupMessagesField)
|
@SerialName(canReadAllGroupMessagesField)
|
||||||
val canReadAllGroupMessages: Boolean = false,
|
val canReadAllGroupMessages: Boolean = false,
|
||||||
@SerialName(supportInlineQueriesField)
|
@SerialName(supportInlineQueriesField)
|
||||||
val supportsInlineQueries: Boolean = false
|
val supportsInlineQueries: Boolean = false,
|
||||||
) : Bot() {
|
@SerialName(photoField)
|
||||||
|
override val chatPhoto: ChatPhoto? = null
|
||||||
|
) : Bot(), ExtendedChat {
|
||||||
@SerialName(isBotField)
|
@SerialName(isBotField)
|
||||||
private val isBot = true
|
private val isBot = true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ data class GroupChatImpl(
|
|||||||
override val id: ChatId,
|
override val id: ChatId,
|
||||||
@SerialName(titleField)
|
@SerialName(titleField)
|
||||||
override val title: String
|
override val title: String
|
||||||
) : GroupChat
|
) : PreviewGroupChat
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
@RiskFeature("This class is a subject of changes. It is better to use PrivateChat due")
|
@RiskFeature("This class is a subject of changes. It is better to use PrivateChat due")
|
||||||
@@ -28,7 +28,7 @@ data class PrivateChatImpl(
|
|||||||
override val firstName: String = "",
|
override val firstName: String = "",
|
||||||
@SerialName(lastNameField)
|
@SerialName(lastNameField)
|
||||||
override val lastName: String = ""
|
override val lastName: String = ""
|
||||||
) : PrivateChat
|
) : PreviewPrivateChat
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
@RiskFeature("This class is a subject of changes. It is better to use SupergroupChat due")
|
@RiskFeature("This class is a subject of changes. It is better to use SupergroupChat due")
|
||||||
@@ -39,7 +39,7 @@ data class SupergroupChatImpl(
|
|||||||
override val title: String,
|
override val title: String,
|
||||||
@SerialName(usernameField)
|
@SerialName(usernameField)
|
||||||
override val username: Username? = null
|
override val username: Username? = null
|
||||||
) : SupergroupChat
|
) : PreviewSupergroupChat
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
@RiskFeature("This class is a subject of changes. It is better to use ForumChat due")
|
@RiskFeature("This class is a subject of changes. It is better to use ForumChat due")
|
||||||
@@ -50,7 +50,7 @@ data class ForumChatImpl(
|
|||||||
override val title: String,
|
override val title: String,
|
||||||
@SerialName(usernameField)
|
@SerialName(usernameField)
|
||||||
override val username: Username? = null
|
override val username: Username? = null
|
||||||
) : ForumChat
|
) : PreviewForumChat
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
@RiskFeature("This class is a subject of changes. It is better to use ChannelChat due")
|
@RiskFeature("This class is a subject of changes. It is better to use ChannelChat due")
|
||||||
@@ -61,14 +61,20 @@ data class ChannelChatImpl(
|
|||||||
override val title: String,
|
override val title: String,
|
||||||
@SerialName(usernameField)
|
@SerialName(usernameField)
|
||||||
override val username: Username? = null
|
override val username: Username? = null
|
||||||
) : ChannelChat
|
) : PreviewChannelChat
|
||||||
|
|
||||||
@Serializable(UserSerializer::class)
|
@Serializable(UserSerializer::class)
|
||||||
sealed class User : PrivateChat
|
sealed class User : PrivateChat
|
||||||
|
|
||||||
|
@Serializable(UserSerializer::class)
|
||||||
|
sealed class PreviewUser : PreviewPrivateChat, User()
|
||||||
|
|
||||||
@Serializable(UserSerializer::class)
|
@Serializable(UserSerializer::class)
|
||||||
sealed class Bot : User()
|
sealed class Bot : User()
|
||||||
|
|
||||||
|
@Serializable(UserSerializer::class)
|
||||||
|
sealed class PreviewBot : PreviewUser()
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class CommonBot(
|
data class CommonBot(
|
||||||
override val id: UserId,
|
override val id: UserId,
|
||||||
@@ -78,7 +84,7 @@ data class CommonBot(
|
|||||||
override val lastName: String = "",
|
override val lastName: String = "",
|
||||||
@SerialName(usernameField)
|
@SerialName(usernameField)
|
||||||
override val username: Username? = null,
|
override val username: Username? = null,
|
||||||
) : Bot() {
|
) : PreviewBot() {
|
||||||
@SerialName(isBotField)
|
@SerialName(isBotField)
|
||||||
private val isBot = true
|
private val isBot = true
|
||||||
}
|
}
|
||||||
@@ -99,7 +105,7 @@ data class CommonUser(
|
|||||||
override val isPremium: Boolean = false,
|
override val isPremium: Boolean = false,
|
||||||
@SerialName(addedToAttachmentMenuField)
|
@SerialName(addedToAttachmentMenuField)
|
||||||
override val addedToAttachmentMenu: Boolean = false
|
override val addedToAttachmentMenu: Boolean = false
|
||||||
) : User(), WithOptionalLanguageCode, PossiblyPremiumChat, AbleToAddInAttachmentMenuChat {
|
) : PreviewUser(), WithOptionalLanguageCode, PossiblyPremiumChat, AbleToAddInAttachmentMenuChat {
|
||||||
constructor(
|
constructor(
|
||||||
id: UserId,
|
id: UserId,
|
||||||
firstName: String,
|
firstName: String,
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package dev.inmo.tgbotapi.types.chat
|
||||||
|
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
|
@Serializable(PreviewChatSerializer::class)
|
||||||
|
sealed interface PreviewChat : Chat
|
||||||
|
|
||||||
|
@Serializable(PreviewChatSerializer::class)
|
||||||
|
sealed interface PreviewUsernameChat : PreviewChat, UsernameChat
|
||||||
|
|
||||||
|
@Serializable(PreviewChatSerializer::class)
|
||||||
|
sealed interface PreviewPrivateChat : PreviewUsernameChat, PrivateChat
|
||||||
|
|
||||||
|
@Serializable(PreviewChatSerializer::class)
|
||||||
|
sealed interface PreviewPublicChat : PreviewChat, PublicChat
|
||||||
|
|
||||||
|
@Serializable(PreviewChatSerializer::class)
|
||||||
|
sealed interface PreviewSuperPublicChat : PreviewPublicChat, PreviewUsernameChat, SuperPublicChat
|
||||||
|
|
||||||
|
@Serializable(PreviewChatSerializer::class)
|
||||||
|
sealed interface PreviewChannelChat : PreviewSuperPublicChat, ChannelChat
|
||||||
|
|
||||||
|
@Serializable(PreviewChatSerializer::class)
|
||||||
|
sealed interface PreviewGroupChat : PreviewPublicChat, GroupChat
|
||||||
|
|
||||||
|
@Serializable(PreviewChatSerializer::class)
|
||||||
|
sealed interface PreviewSupergroupChat : PreviewGroupChat, PreviewSuperPublicChat, SupergroupChat
|
||||||
|
|
||||||
|
@Serializable(PreviewChatSerializer::class)
|
||||||
|
sealed interface PreviewForumChat : PreviewSupergroupChat, ForumChat
|
||||||
@@ -7,4 +7,4 @@ data class UnknownChatType(
|
|||||||
override val id: IdChatIdentifier,
|
override val id: IdChatIdentifier,
|
||||||
val raw: String,
|
val raw: String,
|
||||||
val rawJson: JsonObject
|
val rawJson: JsonObject
|
||||||
) : Chat
|
) : Chat, PreviewChat
|
||||||
|
|||||||
@@ -45,6 +45,5 @@ data class AdministratorChatMemberImpl(
|
|||||||
) : AdministratorChatMember {
|
) : AdministratorChatMember {
|
||||||
@SerialName(statusField)
|
@SerialName(statusField)
|
||||||
@Required
|
@Required
|
||||||
override val status: ChatMember.Status
|
override val status: ChatMember.Status = ChatMember.Status.Administrator
|
||||||
get() = ChatMember.Status.Administrator
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import dev.inmo.tgbotapi.utils.nonstrictJsonFormat
|
|||||||
import kotlinx.serialization.DeserializationStrategy
|
import kotlinx.serialization.DeserializationStrategy
|
||||||
import kotlinx.serialization.KSerializer
|
import kotlinx.serialization.KSerializer
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
import kotlinx.serialization.builtins.serializer
|
||||||
import kotlinx.serialization.descriptors.SerialDescriptor
|
import kotlinx.serialization.descriptors.SerialDescriptor
|
||||||
import kotlinx.serialization.encoding.Decoder
|
import kotlinx.serialization.encoding.Decoder
|
||||||
import kotlinx.serialization.encoding.Encoder
|
import kotlinx.serialization.encoding.Encoder
|
||||||
@@ -15,8 +16,11 @@ import kotlinx.serialization.json.jsonPrimitive
|
|||||||
|
|
||||||
@Serializable(ChatMemberSerializer::class)
|
@Serializable(ChatMemberSerializer::class)
|
||||||
sealed interface ChatMember : WithUser {
|
sealed interface ChatMember : WithUser {
|
||||||
@Serializable
|
@Serializable(StatusSerializer::class)
|
||||||
enum class Status(val status: String, val deserializationStrategy: DeserializationStrategy<ChatMember>) {
|
enum class Status(
|
||||||
|
val status: String,
|
||||||
|
val deserializationStrategy: DeserializationStrategy<ChatMember>
|
||||||
|
) {
|
||||||
Creator("creator", OwnerChatMember.serializer()),
|
Creator("creator", OwnerChatMember.serializer()),
|
||||||
Administrator("administrator", AdministratorChatMemberImpl.serializer()),
|
Administrator("administrator", AdministratorChatMemberImpl.serializer()),
|
||||||
Member("member", MemberChatMemberImpl.serializer()),
|
Member("member", MemberChatMemberImpl.serializer()),
|
||||||
@@ -24,6 +28,23 @@ sealed interface ChatMember : WithUser {
|
|||||||
Left("left", LeftChatMemberImpl.serializer()),
|
Left("left", LeftChatMemberImpl.serializer()),
|
||||||
Kicked("kicked", KickedChatMember.serializer())
|
Kicked("kicked", KickedChatMember.serializer())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object StatusSerializer : KSerializer<Status> {
|
||||||
|
override val descriptor: SerialDescriptor
|
||||||
|
get() = String.serializer().descriptor
|
||||||
|
|
||||||
|
override fun deserialize(decoder: Decoder): Status {
|
||||||
|
val status = decoder.decodeString()
|
||||||
|
return Status.values().first {
|
||||||
|
it.status == status
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serialize(encoder: Encoder, value: Status) {
|
||||||
|
encoder.encodeString(value.status)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val status: Status
|
val status: Status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
package dev.inmo.tgbotapi.types.chat.member
|
package dev.inmo.tgbotapi.types.chat.member
|
||||||
|
|
||||||
import dev.inmo.tgbotapi.abstracts.WithChat
|
import dev.inmo.tgbotapi.abstracts.WithPreviewChat
|
||||||
import dev.inmo.tgbotapi.abstracts.WithUser
|
import dev.inmo.tgbotapi.abstracts.WithUser
|
||||||
import dev.inmo.tgbotapi.types.*
|
import dev.inmo.tgbotapi.types.*
|
||||||
import dev.inmo.tgbotapi.types.chat.Chat
|
import dev.inmo.tgbotapi.types.chat.Chat
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewChat
|
||||||
import dev.inmo.tgbotapi.types.chat.User
|
import dev.inmo.tgbotapi.types.chat.User
|
||||||
import kotlinx.serialization.SerialName
|
import kotlinx.serialization.SerialName
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
@@ -11,7 +12,7 @@ import kotlinx.serialization.Serializable
|
|||||||
@Serializable
|
@Serializable
|
||||||
data class ChatMemberUpdated(
|
data class ChatMemberUpdated(
|
||||||
@SerialName(chatField)
|
@SerialName(chatField)
|
||||||
override val chat: Chat,
|
override val chat: PreviewChat,
|
||||||
@SerialName(fromField)
|
@SerialName(fromField)
|
||||||
override val user: User,
|
override val user: User,
|
||||||
@SerialName(dateField)
|
@SerialName(dateField)
|
||||||
@@ -24,4 +25,4 @@ data class ChatMemberUpdated(
|
|||||||
val inviteLink: ChatInviteLink? = null,
|
val inviteLink: ChatInviteLink? = null,
|
||||||
@SerialName(viaChatFolderInviteLinkField)
|
@SerialName(viaChatFolderInviteLinkField)
|
||||||
val viaChatFolderInviteLink: Boolean? = false
|
val viaChatFolderInviteLink: Boolean? = false
|
||||||
) : WithChat, WithUser
|
) : WithPreviewChat, WithUser
|
||||||
|
|||||||
@@ -13,6 +13,5 @@ data class KickedChatMember(
|
|||||||
) : BannedChatMember {
|
) : BannedChatMember {
|
||||||
@SerialName(statusField)
|
@SerialName(statusField)
|
||||||
@Required
|
@Required
|
||||||
override val status: ChatMember.Status
|
override val status: ChatMember.Status = ChatMember.Status.Kicked
|
||||||
get() = ChatMember.Status.Kicked
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,5 @@ data class LeftChatMemberImpl(
|
|||||||
) : LeftChatMember {
|
) : LeftChatMember {
|
||||||
@SerialName(statusField)
|
@SerialName(statusField)
|
||||||
@Required
|
@Required
|
||||||
override val status: ChatMember.Status
|
override val status: ChatMember.Status = ChatMember.Status.Left
|
||||||
get() = ChatMember.Status.Left
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,5 @@ data class MemberChatMemberImpl(
|
|||||||
) : MemberChatMember {
|
) : MemberChatMember {
|
||||||
@SerialName(statusField)
|
@SerialName(statusField)
|
||||||
@Required
|
@Required
|
||||||
override val status: ChatMember.Status
|
override val status: ChatMember.Status = ChatMember.Status.Member
|
||||||
get() = ChatMember.Status.Member
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,6 +45,5 @@ data class OwnerChatMember(
|
|||||||
|
|
||||||
@SerialName(statusField)
|
@SerialName(statusField)
|
||||||
@Required
|
@Required
|
||||||
override val status: ChatMember.Status
|
override val status: ChatMember.Status = ChatMember.Status.Creator
|
||||||
get() = ChatMember.Status.Creator
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,6 +44,5 @@ data class RestrictedChatMember(
|
|||||||
) : BannedChatMember, SpecialRightsChatMember, ChatPermissions {
|
) : BannedChatMember, SpecialRightsChatMember, ChatPermissions {
|
||||||
@SerialName(statusField)
|
@SerialName(statusField)
|
||||||
@Required
|
@Required
|
||||||
override val status: ChatMember.Status
|
override val status: ChatMember.Status = ChatMember.Status.Restricted
|
||||||
get() = ChatMember.Status.Restricted
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,12 +5,13 @@ import dev.inmo.tgbotapi.types.*
|
|||||||
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
|
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
|
||||||
import dev.inmo.tgbotapi.types.chat.ChannelChat
|
import dev.inmo.tgbotapi.types.chat.ChannelChat
|
||||||
import dev.inmo.tgbotapi.types.chat.CommonBot
|
import dev.inmo.tgbotapi.types.chat.CommonBot
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewChannelChat
|
||||||
import dev.inmo.tgbotapi.types.message.abstracts.*
|
import dev.inmo.tgbotapi.types.message.abstracts.*
|
||||||
import dev.inmo.tgbotapi.types.message.content.MessageContent
|
import dev.inmo.tgbotapi.types.message.content.MessageContent
|
||||||
|
|
||||||
data class ChannelContentMessageImpl<T: MessageContent>(
|
data class ChannelContentMessageImpl<T: MessageContent>(
|
||||||
override val messageId: MessageId,
|
override val messageId: MessageId,
|
||||||
override val chat: ChannelChat,
|
override val chat: PreviewChannelChat,
|
||||||
override val content: T,
|
override val content: T,
|
||||||
override val date: DateTime,
|
override val date: DateTime,
|
||||||
override val editDate: DateTime?,
|
override val editDate: DateTime?,
|
||||||
|
|||||||
@@ -3,12 +3,13 @@ package dev.inmo.tgbotapi.types.message
|
|||||||
import korlibs.time.DateTime
|
import korlibs.time.DateTime
|
||||||
import dev.inmo.tgbotapi.types.MessageId
|
import dev.inmo.tgbotapi.types.MessageId
|
||||||
import dev.inmo.tgbotapi.types.chat.ChannelChat
|
import dev.inmo.tgbotapi.types.chat.ChannelChat
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewChannelChat
|
||||||
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.ChannelEvent
|
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.ChannelEvent
|
||||||
import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage
|
import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage
|
||||||
|
|
||||||
data class ChannelEventMessage<T : ChannelEvent>(
|
data class ChannelEventMessage<T : ChannelEvent>(
|
||||||
override val messageId: MessageId,
|
override val messageId: MessageId,
|
||||||
override val chat: ChannelChat,
|
override val chat: PreviewChannelChat,
|
||||||
override val chatEvent: T,
|
override val chatEvent: T,
|
||||||
override val date: DateTime
|
override val date: DateTime
|
||||||
) : ChatEventMessage<T>
|
) : ChatEventMessage<T>
|
||||||
|
|||||||
@@ -4,13 +4,14 @@ import korlibs.time.DateTime
|
|||||||
import dev.inmo.tgbotapi.types.MessageId
|
import dev.inmo.tgbotapi.types.MessageId
|
||||||
import dev.inmo.tgbotapi.types.chat.User
|
import dev.inmo.tgbotapi.types.chat.User
|
||||||
import dev.inmo.tgbotapi.types.chat.GroupChat
|
import dev.inmo.tgbotapi.types.chat.GroupChat
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewGroupChat
|
||||||
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.GroupEvent
|
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.GroupEvent
|
||||||
import dev.inmo.tgbotapi.types.message.abstracts.GroupEventMessage
|
import dev.inmo.tgbotapi.types.message.abstracts.GroupEventMessage
|
||||||
|
|
||||||
data class CommonGroupEventMessage<T : GroupEvent>(
|
data class CommonGroupEventMessage<T : GroupEvent>(
|
||||||
override val messageId: MessageId,
|
override val messageId: MessageId,
|
||||||
override val from: User,
|
override val from: User,
|
||||||
override val chat: GroupChat,
|
override val chat: PreviewGroupChat,
|
||||||
override val chatEvent: T,
|
override val chatEvent: T,
|
||||||
override val date: DateTime
|
override val date: DateTime
|
||||||
) : GroupEventMessage<T>
|
) : GroupEventMessage<T>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package dev.inmo.tgbotapi.types.message
|
|||||||
|
|
||||||
import korlibs.time.DateTime
|
import korlibs.time.DateTime
|
||||||
import dev.inmo.tgbotapi.types.MessageId
|
import dev.inmo.tgbotapi.types.MessageId
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewSupergroupChat
|
||||||
import dev.inmo.tgbotapi.types.chat.User
|
import dev.inmo.tgbotapi.types.chat.User
|
||||||
import dev.inmo.tgbotapi.types.chat.SupergroupChat
|
import dev.inmo.tgbotapi.types.chat.SupergroupChat
|
||||||
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.SupergroupEvent
|
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.SupergroupEvent
|
||||||
@@ -10,7 +11,7 @@ import dev.inmo.tgbotapi.types.message.abstracts.SupergroupEventMessage
|
|||||||
data class CommonSupergroupEventMessage<T : SupergroupEvent>(
|
data class CommonSupergroupEventMessage<T : SupergroupEvent>(
|
||||||
override val messageId: MessageId,
|
override val messageId: MessageId,
|
||||||
override val from: User,
|
override val from: User,
|
||||||
override val chat: SupergroupChat,
|
override val chat: PreviewSupergroupChat,
|
||||||
override val chatEvent: T,
|
override val chatEvent: T,
|
||||||
override val date: DateTime
|
override val date: DateTime
|
||||||
) : SupergroupEventMessage<T>
|
) : SupergroupEventMessage<T>
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ import dev.inmo.tgbotapi.types.message.abstracts.*
|
|||||||
import dev.inmo.tgbotapi.types.message.content.MessageContent
|
import dev.inmo.tgbotapi.types.message.content.MessageContent
|
||||||
|
|
||||||
data class ConnectedFromChannelGroupContentMessageImpl<T : MessageContent>(
|
data class ConnectedFromChannelGroupContentMessageImpl<T : MessageContent>(
|
||||||
override val chat: GroupChat,
|
override val chat: PreviewGroupChat,
|
||||||
override val channel: ChannelChat,
|
override val channel: PreviewChannelChat,
|
||||||
override val messageId: MessageId,
|
override val messageId: MessageId,
|
||||||
override val date: DateTime,
|
override val date: DateTime,
|
||||||
override val forwardInfo: ForwardInfo?,
|
override val forwardInfo: ForwardInfo?,
|
||||||
@@ -26,8 +26,8 @@ data class ConnectedFromChannelGroupContentMessageImpl<T : MessageContent>(
|
|||||||
) : ConnectedFromChannelGroupContentMessage<T>
|
) : ConnectedFromChannelGroupContentMessage<T>
|
||||||
|
|
||||||
data class UnconnectedFromChannelGroupContentMessageImpl<T: MessageContent>(
|
data class UnconnectedFromChannelGroupContentMessageImpl<T: MessageContent>(
|
||||||
override val chat: GroupChat,
|
override val chat: PreviewGroupChat,
|
||||||
override val channel: ChannelChat,
|
override val channel: PreviewChannelChat,
|
||||||
override val messageId: MessageId,
|
override val messageId: MessageId,
|
||||||
override val date: DateTime,
|
override val date: DateTime,
|
||||||
override val forwardInfo: ForwardInfo?,
|
override val forwardInfo: ForwardInfo?,
|
||||||
@@ -42,7 +42,7 @@ data class UnconnectedFromChannelGroupContentMessageImpl<T: MessageContent>(
|
|||||||
) : UnconnectedFromChannelGroupContentMessage<T>
|
) : UnconnectedFromChannelGroupContentMessage<T>
|
||||||
|
|
||||||
data class AnonymousGroupContentMessageImpl<T : MessageContent>(
|
data class AnonymousGroupContentMessageImpl<T : MessageContent>(
|
||||||
override val chat: GroupChat,
|
override val chat: PreviewGroupChat,
|
||||||
override val messageId: MessageId,
|
override val messageId: MessageId,
|
||||||
override val date: DateTime,
|
override val date: DateTime,
|
||||||
override val forwardInfo: ForwardInfo?,
|
override val forwardInfo: ForwardInfo?,
|
||||||
@@ -57,7 +57,7 @@ data class AnonymousGroupContentMessageImpl<T : MessageContent>(
|
|||||||
) : AnonymousGroupContentMessage<T>
|
) : AnonymousGroupContentMessage<T>
|
||||||
|
|
||||||
data class CommonGroupContentMessageImpl<T : MessageContent>(
|
data class CommonGroupContentMessageImpl<T : MessageContent>(
|
||||||
override val chat: GroupChat,
|
override val chat: PreviewGroupChat,
|
||||||
override val messageId: MessageId,
|
override val messageId: MessageId,
|
||||||
override val from: User,
|
override val from: User,
|
||||||
override val date: DateTime,
|
override val date: DateTime,
|
||||||
@@ -72,8 +72,8 @@ data class CommonGroupContentMessageImpl<T : MessageContent>(
|
|||||||
) : CommonGroupContentMessage<T>
|
) : CommonGroupContentMessage<T>
|
||||||
|
|
||||||
data class FromChannelForumContentMessageImpl<T: MessageContent>(
|
data class FromChannelForumContentMessageImpl<T: MessageContent>(
|
||||||
override val chat: ForumChat,
|
override val chat: PreviewForumChat,
|
||||||
override val channel: ChannelChat,
|
override val channel: PreviewChannelChat,
|
||||||
override val messageId: MessageId,
|
override val messageId: MessageId,
|
||||||
override val threadId: MessageThreadId,
|
override val threadId: MessageThreadId,
|
||||||
override val date: DateTime,
|
override val date: DateTime,
|
||||||
@@ -89,7 +89,7 @@ data class FromChannelForumContentMessageImpl<T: MessageContent>(
|
|||||||
) : FromChannelForumContentMessage<T>
|
) : FromChannelForumContentMessage<T>
|
||||||
|
|
||||||
data class AnonymousForumContentMessageImpl<T : MessageContent>(
|
data class AnonymousForumContentMessageImpl<T : MessageContent>(
|
||||||
override val chat: ForumChat,
|
override val chat: PreviewForumChat,
|
||||||
override val messageId: MessageId,
|
override val messageId: MessageId,
|
||||||
override val threadId: MessageThreadId,
|
override val threadId: MessageThreadId,
|
||||||
override val date: DateTime,
|
override val date: DateTime,
|
||||||
@@ -105,7 +105,7 @@ data class AnonymousForumContentMessageImpl<T : MessageContent>(
|
|||||||
) : AnonymousForumContentMessage<T>
|
) : AnonymousForumContentMessage<T>
|
||||||
|
|
||||||
data class CommonForumContentMessageImpl<T : MessageContent>(
|
data class CommonForumContentMessageImpl<T : MessageContent>(
|
||||||
override val chat: ForumChat,
|
override val chat: PreviewForumChat,
|
||||||
override val messageId: MessageId,
|
override val messageId: MessageId,
|
||||||
override val threadId: MessageThreadId,
|
override val threadId: MessageThreadId,
|
||||||
override val from: User,
|
override val from: User,
|
||||||
|
|||||||
@@ -4,13 +4,14 @@ import korlibs.time.DateTime
|
|||||||
import dev.inmo.tgbotapi.types.MessageId
|
import dev.inmo.tgbotapi.types.MessageId
|
||||||
import dev.inmo.tgbotapi.types.chat.User
|
import dev.inmo.tgbotapi.types.chat.User
|
||||||
import dev.inmo.tgbotapi.types.chat.Chat
|
import dev.inmo.tgbotapi.types.chat.Chat
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewChat
|
||||||
import dev.inmo.tgbotapi.types.message.abstracts.FromUserMessage
|
import dev.inmo.tgbotapi.types.message.abstracts.FromUserMessage
|
||||||
import dev.inmo.tgbotapi.types.message.abstracts.Message
|
import dev.inmo.tgbotapi.types.message.abstracts.Message
|
||||||
import dev.inmo.tgbotapi.types.passport.PassportData
|
import dev.inmo.tgbotapi.types.passport.PassportData
|
||||||
|
|
||||||
data class PassportMessage(
|
data class PassportMessage(
|
||||||
override val messageId: MessageId,
|
override val messageId: MessageId,
|
||||||
override val chat: Chat,
|
override val chat: PreviewChat,
|
||||||
override val from: User,
|
override val from: User,
|
||||||
override val date: DateTime,
|
override val date: DateTime,
|
||||||
val passportData: PassportData
|
val passportData: PassportData
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import dev.inmo.tgbotapi.types.message.content.MessageContent
|
|||||||
data class PrivateContentMessageImpl<T: MessageContent>(
|
data class PrivateContentMessageImpl<T: MessageContent>(
|
||||||
override val messageId: MessageId,
|
override val messageId: MessageId,
|
||||||
override val from: User,
|
override val from: User,
|
||||||
override val chat: Chat,
|
override val chat: PreviewPrivateChat,
|
||||||
override val content: T,
|
override val content: T,
|
||||||
override val date: DateTime,
|
override val date: DateTime,
|
||||||
override val editDate: DateTime?,
|
override val editDate: DateTime?,
|
||||||
|
|||||||
@@ -2,13 +2,14 @@ package dev.inmo.tgbotapi.types.message
|
|||||||
|
|
||||||
import korlibs.time.DateTime
|
import korlibs.time.DateTime
|
||||||
import dev.inmo.tgbotapi.types.MessageId
|
import dev.inmo.tgbotapi.types.MessageId
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewPrivateChat
|
||||||
import dev.inmo.tgbotapi.types.chat.PrivateChat
|
import dev.inmo.tgbotapi.types.chat.PrivateChat
|
||||||
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.PrivateEvent
|
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.PrivateEvent
|
||||||
import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage
|
import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage
|
||||||
|
|
||||||
data class PrivateEventMessage<T : PrivateEvent>(
|
data class PrivateEventMessage<T : PrivateEvent>(
|
||||||
override val messageId: MessageId,
|
override val messageId: MessageId,
|
||||||
override val chat: PrivateChat,
|
override val chat: PreviewPrivateChat,
|
||||||
override val chatEvent: T,
|
override val chatEvent: T,
|
||||||
override val date: DateTime
|
override val date: DateTime
|
||||||
) : ChatEventMessage<T>
|
) : ChatEventMessage<T>
|
||||||
|
|||||||
@@ -43,11 +43,11 @@ internal data class RawMessage(
|
|||||||
@SerialName(messageIdField)
|
@SerialName(messageIdField)
|
||||||
val messageId: MessageId,
|
val messageId: MessageId,
|
||||||
val date: TelegramDate,
|
val date: TelegramDate,
|
||||||
private val chat: Chat,
|
private val chat: PreviewChat,
|
||||||
@SerialName(messageThreadIdField)
|
@SerialName(messageThreadIdField)
|
||||||
private val messageThreadId: MessageThreadId? = null,
|
private val messageThreadId: MessageThreadId? = null,
|
||||||
private val from: User? = null,
|
private val from: User? = null,
|
||||||
private val sender_chat: PublicChat? = null,
|
private val sender_chat: PreviewPublicChat? = null,
|
||||||
private val forward_from: User? = null,
|
private val forward_from: User? = null,
|
||||||
private val forward_from_chat: Chat? = null,
|
private val forward_from_chat: Chat? = null,
|
||||||
private val forward_from_message_id: MessageId? = null,
|
private val forward_from_message_id: MessageId? = null,
|
||||||
@@ -274,27 +274,27 @@ internal data class RawMessage(
|
|||||||
try {
|
try {
|
||||||
chatEvent?.let { chatEvent ->
|
chatEvent?.let { chatEvent ->
|
||||||
when (chat) {
|
when (chat) {
|
||||||
is SupergroupChat -> CommonSupergroupEventMessage(
|
is PreviewSupergroupChat -> CommonSupergroupEventMessage(
|
||||||
messageId,
|
messageId,
|
||||||
from ?: error("Supergroup events are expected to contain 'from' field"),
|
from ?: error("Supergroup events are expected to contain 'from' field"),
|
||||||
chat,
|
chat,
|
||||||
chatEvent as? SupergroupEvent ?: throwWrongChatEvent(SupergroupEvent::class, chatEvent),
|
chatEvent as? SupergroupEvent ?: throwWrongChatEvent(SupergroupEvent::class, chatEvent),
|
||||||
date.asDate
|
date.asDate
|
||||||
)
|
)
|
||||||
is GroupChat -> CommonGroupEventMessage(
|
is PreviewGroupChat -> CommonGroupEventMessage(
|
||||||
messageId,
|
messageId,
|
||||||
from ?: error("Supergroup events are expected to contain 'from' field"),
|
from ?: error("Supergroup events are expected to contain 'from' field"),
|
||||||
chat,
|
chat,
|
||||||
chatEvent as? GroupEvent ?: throwWrongChatEvent(GroupChat::class, chatEvent),
|
chatEvent as? GroupEvent ?: throwWrongChatEvent(GroupChat::class, chatEvent),
|
||||||
date.asDate
|
date.asDate
|
||||||
)
|
)
|
||||||
is ChannelChat -> ChannelEventMessage(
|
is PreviewChannelChat -> ChannelEventMessage(
|
||||||
messageId,
|
messageId,
|
||||||
chat,
|
chat,
|
||||||
chatEvent as? ChannelEvent ?: throwWrongChatEvent(ChannelEvent::class, chatEvent),
|
chatEvent as? ChannelEvent ?: throwWrongChatEvent(ChannelEvent::class, chatEvent),
|
||||||
date.asDate
|
date.asDate
|
||||||
)
|
)
|
||||||
is PrivateChat -> PrivateEventMessage(
|
is PreviewPrivateChat -> PrivateEventMessage(
|
||||||
messageId,
|
messageId,
|
||||||
chat,
|
chat,
|
||||||
chatEvent as? PrivateEvent ?: throwWrongChatEvent(PrivateEvent::class, chatEvent),
|
chatEvent as? PrivateEvent ?: throwWrongChatEvent(PrivateEvent::class, chatEvent),
|
||||||
@@ -303,8 +303,8 @@ internal data class RawMessage(
|
|||||||
else -> error("Expected one of the public chats, but was $chat (in extracting of chat event message)")
|
else -> error("Expected one of the public chats, but was $chat (in extracting of chat event message)")
|
||||||
}
|
}
|
||||||
} ?: content?.let { content -> when (chat) {
|
} ?: content?.let { content -> when (chat) {
|
||||||
is PublicChat -> when (chat) {
|
is PreviewPublicChat -> when (chat) {
|
||||||
is ChannelChat -> ChannelContentMessageImpl(
|
is PreviewChannelChat -> ChannelContentMessageImpl(
|
||||||
messageId,
|
messageId,
|
||||||
chat,
|
chat,
|
||||||
content,
|
content,
|
||||||
@@ -318,17 +318,16 @@ internal data class RawMessage(
|
|||||||
author_signature,
|
author_signature,
|
||||||
media_group_id
|
media_group_id
|
||||||
)
|
)
|
||||||
is ForumChat -> if (messageThreadId != null) {
|
is PreviewForumChat -> if (messageThreadId != null) {
|
||||||
val chatId = ChatIdWithThreadId(
|
val chatId = ChatIdWithThreadId(
|
||||||
chat.id.chatId,
|
chat.id.chatId,
|
||||||
messageThreadId
|
messageThreadId
|
||||||
)
|
)
|
||||||
val actualForumChat = when (chat) {
|
val actualForumChat = when (chat) {
|
||||||
is ExtendedForumChatImpl -> chat.copy(id = chatId)
|
|
||||||
is ForumChatImpl -> chat.copy(id = chatId)
|
is ForumChatImpl -> chat.copy(id = chatId)
|
||||||
}
|
}
|
||||||
when (sender_chat) {
|
when (sender_chat) {
|
||||||
is ChannelChat -> FromChannelForumContentMessageImpl(
|
is PreviewChannelChat -> FromChannelForumContentMessageImpl(
|
||||||
actualForumChat,
|
actualForumChat,
|
||||||
sender_chat,
|
sender_chat,
|
||||||
messageId,
|
messageId,
|
||||||
@@ -344,7 +343,7 @@ internal data class RawMessage(
|
|||||||
author_signature,
|
author_signature,
|
||||||
media_group_id
|
media_group_id
|
||||||
)
|
)
|
||||||
is GroupChat -> AnonymousForumContentMessageImpl(
|
is PreviewGroupChat -> AnonymousForumContentMessageImpl(
|
||||||
actualForumChat,
|
actualForumChat,
|
||||||
messageId,
|
messageId,
|
||||||
messageThreadId,
|
messageThreadId,
|
||||||
@@ -377,7 +376,7 @@ internal data class RawMessage(
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
when (sender_chat) {
|
when (sender_chat) {
|
||||||
is ChannelChat -> if (is_automatic_forward == true) {
|
is PreviewChannelChat -> if (is_automatic_forward == true) {
|
||||||
ConnectedFromChannelGroupContentMessageImpl(
|
ConnectedFromChannelGroupContentMessageImpl(
|
||||||
chat,
|
chat,
|
||||||
sender_chat,
|
sender_chat,
|
||||||
@@ -440,8 +439,8 @@ internal data class RawMessage(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
is GroupChat -> when (sender_chat) {
|
is PreviewGroupChat -> when (sender_chat) {
|
||||||
is ChannelChat -> if (is_automatic_forward == true) {
|
is PreviewChannelChat -> if (is_automatic_forward == true) {
|
||||||
ConnectedFromChannelGroupContentMessageImpl(
|
ConnectedFromChannelGroupContentMessageImpl(
|
||||||
chat,
|
chat,
|
||||||
sender_chat,
|
sender_chat,
|
||||||
@@ -474,7 +473,7 @@ internal data class RawMessage(
|
|||||||
media_group_id
|
media_group_id
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
is GroupChat -> AnonymousGroupContentMessageImpl(
|
is PreviewGroupChat -> AnonymousGroupContentMessageImpl(
|
||||||
chat,
|
chat,
|
||||||
messageId,
|
messageId,
|
||||||
date.asDate,
|
date.asDate,
|
||||||
@@ -504,7 +503,7 @@ internal data class RawMessage(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
is PrivateChat -> PrivateContentMessageImpl(
|
is PreviewPrivateChat -> PrivateContentMessageImpl(
|
||||||
messageId,
|
messageId,
|
||||||
from ?: error("Was detected common message, but owner (sender) of the message was not found"),
|
from ?: error("Was detected common message, but owner (sender) of the message was not found"),
|
||||||
chat,
|
chat,
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
package dev.inmo.tgbotapi.types.message.abstracts
|
package dev.inmo.tgbotapi.types.message.abstracts
|
||||||
|
|
||||||
import dev.inmo.tgbotapi.types.chat.ChannelChat
|
import dev.inmo.tgbotapi.types.chat.ChannelChat
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewChannelChat
|
||||||
import dev.inmo.tgbotapi.types.message.content.MessageContent
|
import dev.inmo.tgbotapi.types.message.content.MessageContent
|
||||||
|
|
||||||
interface ChannelContentMessage<T: MessageContent> : PossiblySentViaBotCommonMessage<T>, SignedMessage, WithSenderChatMessage {
|
interface ChannelContentMessage<T: MessageContent> : PossiblySentViaBotCommonMessage<T>, SignedMessage, WithSenderChatMessage {
|
||||||
override val chat: ChannelChat
|
override val chat: PreviewChannelChat
|
||||||
override val senderChat: ChannelChat
|
override val senderChat: PreviewChannelChat
|
||||||
get() = chat
|
get() = chat
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
package dev.inmo.tgbotapi.types.message.abstracts
|
package dev.inmo.tgbotapi.types.message.abstracts
|
||||||
|
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewChat
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewGroupChat
|
||||||
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.GroupEvent
|
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.GroupEvent
|
||||||
|
|
||||||
interface GroupEventMessage<T : GroupEvent> : ChatEventMessage<T>, FromUserMessage
|
interface GroupEventMessage<T : GroupEvent> : ChatEventMessage<T>, FromUserMessage {
|
||||||
|
override val chat: PreviewGroupChat
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,24 +1,22 @@
|
|||||||
package dev.inmo.tgbotapi.types.message.abstracts
|
package dev.inmo.tgbotapi.types.message.abstracts
|
||||||
|
|
||||||
import dev.inmo.tgbotapi.types.MessageThreadId
|
import dev.inmo.tgbotapi.types.MessageThreadId
|
||||||
import dev.inmo.tgbotapi.types.chat.ChannelChat
|
import dev.inmo.tgbotapi.types.chat.*
|
||||||
import dev.inmo.tgbotapi.types.chat.ForumChat
|
|
||||||
import dev.inmo.tgbotapi.types.chat.GroupChat
|
|
||||||
import dev.inmo.tgbotapi.types.message.content.MessageContent
|
import dev.inmo.tgbotapi.types.message.content.MessageContent
|
||||||
|
|
||||||
sealed interface GroupContentMessage<T : MessageContent> : PublicContentMessage<T> {
|
sealed interface GroupContentMessage<T : MessageContent> : PublicContentMessage<T> {
|
||||||
override val chat: GroupChat
|
override val chat: PreviewGroupChat
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed interface ForumContentMessage<T : MessageContent> : GroupContentMessage<T>, PossiblyTopicMessage {
|
sealed interface ForumContentMessage<T : MessageContent> : GroupContentMessage<T>, PossiblyTopicMessage {
|
||||||
override val chat: ForumChat
|
override val chat: PreviewForumChat
|
||||||
override val threadId: MessageThreadId
|
override val threadId: MessageThreadId
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
sealed interface FromChannelGroupContentMessage<T : MessageContent> : GroupContentMessage<T>, SignedMessage, WithSenderChatMessage {
|
sealed interface FromChannelGroupContentMessage<T : MessageContent> : GroupContentMessage<T>, SignedMessage, WithSenderChatMessage {
|
||||||
val channel: ChannelChat
|
val channel: PreviewChannelChat
|
||||||
override val senderChat: ChannelChat
|
override val senderChat: PreviewChannelChat
|
||||||
get() = channel
|
get() = channel
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -26,7 +24,7 @@ interface ConnectedFromChannelGroupContentMessage<T: MessageContent> : FromChann
|
|||||||
interface UnconnectedFromChannelGroupContentMessage<T: MessageContent> : FromChannelGroupContentMessage<T>
|
interface UnconnectedFromChannelGroupContentMessage<T: MessageContent> : FromChannelGroupContentMessage<T>
|
||||||
|
|
||||||
interface AnonymousGroupContentMessage<T : MessageContent> : GroupContentMessage<T>, SignedMessage, WithSenderChatMessage {
|
interface AnonymousGroupContentMessage<T : MessageContent> : GroupContentMessage<T>, SignedMessage, WithSenderChatMessage {
|
||||||
override val senderChat: GroupChat
|
override val senderChat: PreviewGroupChat
|
||||||
get() = chat
|
get() = chat
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,7 +33,7 @@ interface CommonGroupContentMessage<T : MessageContent> : GroupContentMessage<T>
|
|||||||
interface FromChannelForumContentMessage<T: MessageContent> : FromChannelGroupContentMessage<T>, ForumContentMessage<T>
|
interface FromChannelForumContentMessage<T: MessageContent> : FromChannelGroupContentMessage<T>, ForumContentMessage<T>
|
||||||
|
|
||||||
interface AnonymousForumContentMessage<T : MessageContent> : ForumContentMessage<T>, SignedMessage, WithSenderChatMessage {
|
interface AnonymousForumContentMessage<T : MessageContent> : ForumContentMessage<T>, SignedMessage, WithSenderChatMessage {
|
||||||
override val senderChat: GroupChat
|
override val senderChat: PreviewGroupChat
|
||||||
get() = chat
|
get() = chat
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
package dev.inmo.tgbotapi.types.message.abstracts
|
package dev.inmo.tgbotapi.types.message.abstracts
|
||||||
|
|
||||||
import korlibs.time.DateTime
|
import korlibs.time.DateTime
|
||||||
import dev.inmo.tgbotapi.abstracts.WithChat
|
import dev.inmo.tgbotapi.abstracts.WithPreviewChat
|
||||||
import dev.inmo.tgbotapi.utils.internal.ClassCastsIncluded
|
import dev.inmo.tgbotapi.utils.internal.ClassCastsIncluded
|
||||||
import dev.inmo.tgbotapi.types.MessageId
|
import dev.inmo.tgbotapi.types.MessageId
|
||||||
import dev.inmo.tgbotapi.types.chat.Chat
|
import dev.inmo.tgbotapi.types.chat.Chat
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewChat
|
||||||
import dev.inmo.tgbotapi.types.message.RawMessage
|
import dev.inmo.tgbotapi.types.message.RawMessage
|
||||||
import kotlinx.serialization.*
|
import kotlinx.serialization.*
|
||||||
import kotlinx.serialization.descriptors.*
|
import kotlinx.serialization.descriptors.*
|
||||||
@@ -12,14 +13,14 @@ import kotlinx.serialization.encoding.Decoder
|
|||||||
import kotlinx.serialization.encoding.Encoder
|
import kotlinx.serialization.encoding.Encoder
|
||||||
|
|
||||||
@ClassCastsIncluded(excludeRegex = ".*Impl")
|
@ClassCastsIncluded(excludeRegex = ".*Impl")
|
||||||
interface Message : WithChat {
|
interface Message : WithPreviewChat {
|
||||||
val messageId: MessageId
|
val messageId: MessageId
|
||||||
val date: DateTime
|
val date: DateTime
|
||||||
}
|
}
|
||||||
|
|
||||||
data class UnknownMessageType(
|
data class UnknownMessageType(
|
||||||
override val messageId: MessageId,
|
override val messageId: MessageId,
|
||||||
override val chat: Chat,
|
override val chat: PreviewChat,
|
||||||
override val date: DateTime,
|
override val date: DateTime,
|
||||||
val insideException: Exception
|
val insideException: Exception
|
||||||
) : Message
|
) : Message
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
package dev.inmo.tgbotapi.types.message.abstracts
|
package dev.inmo.tgbotapi.types.message.abstracts
|
||||||
|
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewChat
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewPrivateChat
|
||||||
import dev.inmo.tgbotapi.types.message.content.MessageContent
|
import dev.inmo.tgbotapi.types.message.content.MessageContent
|
||||||
|
|
||||||
interface PrivateContentMessage<T: MessageContent> : PossiblySentViaBotCommonMessage<T>, FromUserMessage
|
interface PrivateContentMessage<T: MessageContent> : PossiblySentViaBotCommonMessage<T>, FromUserMessage {
|
||||||
|
override val chat: PreviewPrivateChat
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
package dev.inmo.tgbotapi.types.message.abstracts
|
package dev.inmo.tgbotapi.types.message.abstracts
|
||||||
|
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewPublicChat
|
||||||
import dev.inmo.tgbotapi.types.chat.PublicChat
|
import dev.inmo.tgbotapi.types.chat.PublicChat
|
||||||
import dev.inmo.tgbotapi.types.message.content.MessageContent
|
import dev.inmo.tgbotapi.types.message.content.MessageContent
|
||||||
|
|
||||||
sealed interface PublicContentMessage<T: MessageContent> : PossiblySentViaBotCommonMessage<T> {
|
sealed interface PublicContentMessage<T: MessageContent> : PossiblySentViaBotCommonMessage<T> {
|
||||||
override val chat: PublicChat
|
override val chat: PreviewPublicChat
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
package dev.inmo.tgbotapi.types.message.abstracts
|
package dev.inmo.tgbotapi.types.message.abstracts
|
||||||
|
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewGroupChat
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewSupergroupChat
|
||||||
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.SupergroupEvent
|
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.SupergroupEvent
|
||||||
|
|
||||||
interface SupergroupEventMessage<T : SupergroupEvent> : GroupEventMessage<T>
|
interface SupergroupEventMessage<T : SupergroupEvent> : GroupEventMessage<T> {
|
||||||
|
override val chat: PreviewSupergroupChat
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
package dev.inmo.tgbotapi.types.message.abstracts
|
package dev.inmo.tgbotapi.types.message.abstracts
|
||||||
|
|
||||||
import dev.inmo.tgbotapi.types.chat.Chat
|
import dev.inmo.tgbotapi.types.chat.Chat
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewChat
|
||||||
|
|
||||||
interface WithSenderChatMessage {
|
interface WithSenderChatMessage {
|
||||||
val senderChat: Chat
|
val senderChat: PreviewChat
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import dev.inmo.tgbotapi.types.MessageThreadId
|
|||||||
import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
|
import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
|
||||||
import dev.inmo.tgbotapi.types.files.VoiceFile
|
import dev.inmo.tgbotapi.types.files.VoiceFile
|
||||||
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
|
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
|
||||||
|
import dev.inmo.tgbotapi.types.threadId
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
@@ -27,16 +28,16 @@ data class VoiceContent(
|
|||||||
allowSendingWithoutReply: Boolean?,
|
allowSendingWithoutReply: Boolean?,
|
||||||
replyMarkup: KeyboardMarkup?
|
replyMarkup: KeyboardMarkup?
|
||||||
): Request<ContentMessage<VoiceContent>> = SendVoice(
|
): Request<ContentMessage<VoiceContent>> = SendVoice(
|
||||||
chatId,
|
chatId = chatId,
|
||||||
media.fileId,
|
voice = media.fileId,
|
||||||
textSources,
|
entities = textSources,
|
||||||
media.duration,
|
threadId = messageThreadId,
|
||||||
messageThreadId,
|
duration = media.duration,
|
||||||
disableNotification,
|
disableNotification = disableNotification,
|
||||||
protectContent,
|
protectContent = protectContent,
|
||||||
replyToMessageId,
|
replyToMessageId = replyToMessageId,
|
||||||
allowSendingWithoutReply,
|
allowSendingWithoutReply = allowSendingWithoutReply,
|
||||||
replyMarkup
|
replyMarkup = replyMarkup
|
||||||
)
|
)
|
||||||
|
|
||||||
override fun asTelegramMedia(): TelegramMediaAudio = TelegramMediaAudio(
|
override fun asTelegramMedia(): TelegramMediaAudio = TelegramMediaAudio(
|
||||||
|
|||||||
@@ -126,6 +126,17 @@ import dev.inmo.tgbotapi.types.chat.ExtendedSupergroupChat
|
|||||||
import dev.inmo.tgbotapi.types.chat.ForumChat
|
import dev.inmo.tgbotapi.types.chat.ForumChat
|
||||||
import dev.inmo.tgbotapi.types.chat.GroupChat
|
import dev.inmo.tgbotapi.types.chat.GroupChat
|
||||||
import dev.inmo.tgbotapi.types.chat.PossiblyPremiumChat
|
import dev.inmo.tgbotapi.types.chat.PossiblyPremiumChat
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewBot
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewChannelChat
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewChat
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewForumChat
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewGroupChat
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewPrivateChat
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewPublicChat
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewSuperPublicChat
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewSupergroupChat
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewUser
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PreviewUsernameChat
|
||||||
import dev.inmo.tgbotapi.types.chat.PrivateChat
|
import dev.inmo.tgbotapi.types.chat.PrivateChat
|
||||||
import dev.inmo.tgbotapi.types.chat.PublicChat
|
import dev.inmo.tgbotapi.types.chat.PublicChat
|
||||||
import dev.inmo.tgbotapi.types.chat.SuperPublicChat
|
import dev.inmo.tgbotapi.types.chat.SuperPublicChat
|
||||||
@@ -1969,12 +1980,30 @@ public inline fun Chat.userOrThrow(): User = this as dev.inmo.tgbotapi.types.cha
|
|||||||
|
|
||||||
public inline fun <T> Chat.ifUser(block: (User) -> T): T? = userOrNull() ?.let(block)
|
public inline fun <T> Chat.ifUser(block: (User) -> T): T? = userOrNull() ?.let(block)
|
||||||
|
|
||||||
|
public inline fun Chat.previewUserOrNull(): PreviewUser? = this as?
|
||||||
|
dev.inmo.tgbotapi.types.chat.PreviewUser
|
||||||
|
|
||||||
|
public inline fun Chat.previewUserOrThrow(): PreviewUser = this as
|
||||||
|
dev.inmo.tgbotapi.types.chat.PreviewUser
|
||||||
|
|
||||||
|
public inline fun <T> Chat.ifPreviewUser(block: (PreviewUser) -> T): T? = previewUserOrNull()
|
||||||
|
?.let(block)
|
||||||
|
|
||||||
public inline fun Chat.botOrNull(): Bot? = this as? dev.inmo.tgbotapi.types.chat.Bot
|
public inline fun Chat.botOrNull(): Bot? = this as? dev.inmo.tgbotapi.types.chat.Bot
|
||||||
|
|
||||||
public inline fun Chat.botOrThrow(): Bot = this as dev.inmo.tgbotapi.types.chat.Bot
|
public inline fun Chat.botOrThrow(): Bot = this as dev.inmo.tgbotapi.types.chat.Bot
|
||||||
|
|
||||||
public inline fun <T> Chat.ifBot(block: (Bot) -> T): T? = botOrNull() ?.let(block)
|
public inline fun <T> Chat.ifBot(block: (Bot) -> T): T? = botOrNull() ?.let(block)
|
||||||
|
|
||||||
|
public inline fun Chat.previewBotOrNull(): PreviewBot? = this as?
|
||||||
|
dev.inmo.tgbotapi.types.chat.PreviewBot
|
||||||
|
|
||||||
|
public inline fun Chat.previewBotOrThrow(): PreviewBot = this as
|
||||||
|
dev.inmo.tgbotapi.types.chat.PreviewBot
|
||||||
|
|
||||||
|
public inline fun <T> Chat.ifPreviewBot(block: (PreviewBot) -> T): T? = previewBotOrNull()
|
||||||
|
?.let(block)
|
||||||
|
|
||||||
public inline fun Chat.commonBotOrNull(): CommonBot? = this as?
|
public inline fun Chat.commonBotOrNull(): CommonBot? = this as?
|
||||||
dev.inmo.tgbotapi.types.chat.CommonBot
|
dev.inmo.tgbotapi.types.chat.CommonBot
|
||||||
|
|
||||||
@@ -1992,6 +2021,87 @@ public inline fun Chat.commonUserOrThrow(): CommonUser = this as
|
|||||||
public inline fun <T> Chat.ifCommonUser(block: (CommonUser) -> T): T? = commonUserOrNull()
|
public inline fun <T> Chat.ifCommonUser(block: (CommonUser) -> T): T? = commonUserOrNull()
|
||||||
?.let(block)
|
?.let(block)
|
||||||
|
|
||||||
|
public inline fun Chat.previewChatOrNull(): PreviewChat? = this as?
|
||||||
|
dev.inmo.tgbotapi.types.chat.PreviewChat
|
||||||
|
|
||||||
|
public inline fun Chat.previewChatOrThrow(): PreviewChat = this as
|
||||||
|
dev.inmo.tgbotapi.types.chat.PreviewChat
|
||||||
|
|
||||||
|
public inline fun <T> Chat.ifPreviewChat(block: (PreviewChat) -> T): T? = previewChatOrNull()
|
||||||
|
?.let(block)
|
||||||
|
|
||||||
|
public inline fun Chat.previewUsernameChatOrNull(): PreviewUsernameChat? = this as?
|
||||||
|
dev.inmo.tgbotapi.types.chat.PreviewUsernameChat
|
||||||
|
|
||||||
|
public inline fun Chat.previewUsernameChatOrThrow(): PreviewUsernameChat = this as
|
||||||
|
dev.inmo.tgbotapi.types.chat.PreviewUsernameChat
|
||||||
|
|
||||||
|
public inline fun <T> Chat.ifPreviewUsernameChat(block: (PreviewUsernameChat) -> T): T? =
|
||||||
|
previewUsernameChatOrNull() ?.let(block)
|
||||||
|
|
||||||
|
public inline fun Chat.previewPrivateChatOrNull(): PreviewPrivateChat? = this as?
|
||||||
|
dev.inmo.tgbotapi.types.chat.PreviewPrivateChat
|
||||||
|
|
||||||
|
public inline fun Chat.previewPrivateChatOrThrow(): PreviewPrivateChat = this as
|
||||||
|
dev.inmo.tgbotapi.types.chat.PreviewPrivateChat
|
||||||
|
|
||||||
|
public inline fun <T> Chat.ifPreviewPrivateChat(block: (PreviewPrivateChat) -> T): T? =
|
||||||
|
previewPrivateChatOrNull() ?.let(block)
|
||||||
|
|
||||||
|
public inline fun Chat.previewPublicChatOrNull(): PreviewPublicChat? = this as?
|
||||||
|
dev.inmo.tgbotapi.types.chat.PreviewPublicChat
|
||||||
|
|
||||||
|
public inline fun Chat.previewPublicChatOrThrow(): PreviewPublicChat = this as
|
||||||
|
dev.inmo.tgbotapi.types.chat.PreviewPublicChat
|
||||||
|
|
||||||
|
public inline fun <T> Chat.ifPreviewPublicChat(block: (PreviewPublicChat) -> T): T? =
|
||||||
|
previewPublicChatOrNull() ?.let(block)
|
||||||
|
|
||||||
|
public inline fun Chat.previewSuperPublicChatOrNull(): PreviewSuperPublicChat? = this as?
|
||||||
|
dev.inmo.tgbotapi.types.chat.PreviewSuperPublicChat
|
||||||
|
|
||||||
|
public inline fun Chat.previewSuperPublicChatOrThrow(): PreviewSuperPublicChat = this as
|
||||||
|
dev.inmo.tgbotapi.types.chat.PreviewSuperPublicChat
|
||||||
|
|
||||||
|
public inline fun <T> Chat.ifPreviewSuperPublicChat(block: (PreviewSuperPublicChat) -> T): T? =
|
||||||
|
previewSuperPublicChatOrNull() ?.let(block)
|
||||||
|
|
||||||
|
public inline fun Chat.previewChannelChatOrNull(): PreviewChannelChat? = this as?
|
||||||
|
dev.inmo.tgbotapi.types.chat.PreviewChannelChat
|
||||||
|
|
||||||
|
public inline fun Chat.previewChannelChatOrThrow(): PreviewChannelChat = this as
|
||||||
|
dev.inmo.tgbotapi.types.chat.PreviewChannelChat
|
||||||
|
|
||||||
|
public inline fun <T> Chat.ifPreviewChannelChat(block: (PreviewChannelChat) -> T): T? =
|
||||||
|
previewChannelChatOrNull() ?.let(block)
|
||||||
|
|
||||||
|
public inline fun Chat.previewGroupChatOrNull(): PreviewGroupChat? = this as?
|
||||||
|
dev.inmo.tgbotapi.types.chat.PreviewGroupChat
|
||||||
|
|
||||||
|
public inline fun Chat.previewGroupChatOrThrow(): PreviewGroupChat = this as
|
||||||
|
dev.inmo.tgbotapi.types.chat.PreviewGroupChat
|
||||||
|
|
||||||
|
public inline fun <T> Chat.ifPreviewGroupChat(block: (PreviewGroupChat) -> T): T? =
|
||||||
|
previewGroupChatOrNull() ?.let(block)
|
||||||
|
|
||||||
|
public inline fun Chat.previewSupergroupChatOrNull(): PreviewSupergroupChat? = this as?
|
||||||
|
dev.inmo.tgbotapi.types.chat.PreviewSupergroupChat
|
||||||
|
|
||||||
|
public inline fun Chat.previewSupergroupChatOrThrow(): PreviewSupergroupChat = this as
|
||||||
|
dev.inmo.tgbotapi.types.chat.PreviewSupergroupChat
|
||||||
|
|
||||||
|
public inline fun <T> Chat.ifPreviewSupergroupChat(block: (PreviewSupergroupChat) -> T): T? =
|
||||||
|
previewSupergroupChatOrNull() ?.let(block)
|
||||||
|
|
||||||
|
public inline fun Chat.previewForumChatOrNull(): PreviewForumChat? = this as?
|
||||||
|
dev.inmo.tgbotapi.types.chat.PreviewForumChat
|
||||||
|
|
||||||
|
public inline fun Chat.previewForumChatOrThrow(): PreviewForumChat = this as
|
||||||
|
dev.inmo.tgbotapi.types.chat.PreviewForumChat
|
||||||
|
|
||||||
|
public inline fun <T> Chat.ifPreviewForumChat(block: (PreviewForumChat) -> T): T? =
|
||||||
|
previewForumChatOrNull() ?.let(block)
|
||||||
|
|
||||||
public inline fun Chat.unknownChatTypeOrNull(): UnknownChatType? = this as?
|
public inline fun Chat.unknownChatTypeOrNull(): UnknownChatType? = this as?
|
||||||
dev.inmo.tgbotapi.types.chat.UnknownChatType
|
dev.inmo.tgbotapi.types.chat.UnknownChatType
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,247 @@
|
|||||||
|
package dev.inmo.tgbotapi.extensions.utils.extensions
|
||||||
|
|
||||||
|
import dev.inmo.tgbotapi.abstracts.TextedWithTextSources
|
||||||
|
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
|
||||||
|
import dev.inmo.tgbotapi.types.message.content.TextContent
|
||||||
|
import dev.inmo.tgbotapi.types.message.textsources.BotCommandTextSource
|
||||||
|
import dev.inmo.tgbotapi.types.message.textsources.TextSource
|
||||||
|
|
||||||
|
object TelegramBotCommandsDefaults {
|
||||||
|
const val defaultArgsSeparator = " "
|
||||||
|
val defaultArgsSeparatorRegex = Regex(defaultArgsSeparator)
|
||||||
|
const val defaultNamesArgsSeparator = "="
|
||||||
|
val defaultNamesArgsSeparatorRegex = Regex(defaultNamesArgsSeparator)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated(message = "Replaced", replaceWith = ReplaceWith("TelegramBotCommandsDefaults.defaultArgsSeparatorRegex", "dev.inmo.tgbotapi.extensions.utils.extensions.TelegramBotCommandsDefaults"))
|
||||||
|
val defaultArgsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse commands and their args. Logic will find command, get all subsequent data as args until new command
|
||||||
|
*/
|
||||||
|
fun List<TextSource>.parseCommandsWithArgs(
|
||||||
|
argsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex
|
||||||
|
): MutableMap<String, Array<String>> {
|
||||||
|
val result = mutableMapOf<String, Array<String>>()
|
||||||
|
var currentBotCommandSource: BotCommandTextSource? = null
|
||||||
|
var currentArgs = ""
|
||||||
|
|
||||||
|
fun includeCurrent() = currentBotCommandSource?.let {
|
||||||
|
currentArgs = currentArgs.trim()
|
||||||
|
result[it.command] = if (currentArgs.isNotEmpty()) {
|
||||||
|
currentArgs.split(argsSeparator).toTypedArray()
|
||||||
|
} else {
|
||||||
|
emptyArray()
|
||||||
|
}
|
||||||
|
currentArgs = ""
|
||||||
|
currentBotCommandSource = null
|
||||||
|
}
|
||||||
|
|
||||||
|
for (textSource in this) {
|
||||||
|
if (textSource is BotCommandTextSource) {
|
||||||
|
includeCurrent()
|
||||||
|
currentBotCommandSource = textSource
|
||||||
|
} else {
|
||||||
|
currentArgs += textSource.source
|
||||||
|
}
|
||||||
|
}
|
||||||
|
includeCurrent()
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse commands and their args. Logic will find command, get all subsequent data as args until new command
|
||||||
|
*/
|
||||||
|
fun TextedWithTextSources.parseCommandsWithArgs(
|
||||||
|
argsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex
|
||||||
|
) = textSources?.parseCommandsWithArgs(argsSeparator) ?: emptyMap()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse commands and their args. Logic will find command, get all subsequent data as args until new command
|
||||||
|
*/
|
||||||
|
fun ContentMessage<TextContent>.parseCommandsWithArgs(
|
||||||
|
argsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex
|
||||||
|
) = content.parseCommandsWithArgs(argsSeparator)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse commands and their args. Logic will find command, get all subsequent data as args until new command
|
||||||
|
*/
|
||||||
|
fun List<TextSource>.parseCommandsWithArgs(
|
||||||
|
argsSeparator: String
|
||||||
|
): MutableMap<String, Array<String>> = parseCommandsWithArgs(Regex(argsSeparator))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse commands and their args. Logic will find command, get all subsequent data as args until new command
|
||||||
|
*/
|
||||||
|
fun TextedWithTextSources.parseCommandsWithArgs(
|
||||||
|
argsSeparator: String
|
||||||
|
) = parseCommandsWithArgs(Regex(argsSeparator))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse commands and their args. Logic will find command, get all subsequent data as args until new command
|
||||||
|
*/
|
||||||
|
fun ContentMessage<TextContent>.parseCommandsWithArgs(
|
||||||
|
argsSeparator: String
|
||||||
|
) = parseCommandsWithArgs(Regex(argsSeparator))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses [parseCommandsWithArgs] to create base [argsSeparator] split args for commands and map their as k-v pairs.
|
||||||
|
* Sample:
|
||||||
|
*
|
||||||
|
* ```bash
|
||||||
|
* /command args1=value1 arg2=value2 arg1=value3
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* Will produce [Map] with one key `command` and the list of three pairs:
|
||||||
|
*
|
||||||
|
* 1. `args1` to `value1`
|
||||||
|
* 2. `args2` to `value2`
|
||||||
|
* 3. `args1` to `value3`
|
||||||
|
*
|
||||||
|
* @return Array of named arguments
|
||||||
|
*/
|
||||||
|
fun List<TextSource>.parseCommandsWithNamedArgs(
|
||||||
|
argsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex,
|
||||||
|
nameArgSeparator: Regex = TelegramBotCommandsDefaults.defaultNamesArgsSeparatorRegex,
|
||||||
|
): Map<String, List<Pair<String, String>>> {
|
||||||
|
val withArgs = parseCommandsWithArgs(argsSeparator)
|
||||||
|
|
||||||
|
return withArgs.mapValues { (k, v) ->
|
||||||
|
v.flatMap {
|
||||||
|
it.split(nameArgSeparator, 2).map { v -> it to v }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses [parseCommandsWithArgs] to create base [argsSeparator] split args for commands and map their as k-v pairs.
|
||||||
|
* Sample:
|
||||||
|
*
|
||||||
|
* ```bash
|
||||||
|
* /command args1=value1 arg2=value2 arg1=value3
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* Will produce [Map] with one key `command` and the list of three pairs:
|
||||||
|
*
|
||||||
|
* 1. `args1` to `value1`
|
||||||
|
* 2. `args2` to `value2`
|
||||||
|
* 3. `args1` to `value3`
|
||||||
|
*
|
||||||
|
* @return Array of named arguments
|
||||||
|
*/
|
||||||
|
fun TextedWithTextSources.parseCommandsWithNamedArgs(
|
||||||
|
argsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex,
|
||||||
|
nameArgSeparator: Regex = TelegramBotCommandsDefaults.defaultNamesArgsSeparatorRegex,
|
||||||
|
) = textSources?.parseCommandsWithNamedArgs(argsSeparator = argsSeparator, nameArgSeparator = nameArgSeparator) ?: emptyMap()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses [parseCommandsWithArgs] to create base [argsSeparator] split args for commands and map their as k-v pairs.
|
||||||
|
* Sample:
|
||||||
|
*
|
||||||
|
* ```bash
|
||||||
|
* /command args1=value1 arg2=value2 arg1=value3
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* Will produce [Map] with one key `command` and the list of three pairs:
|
||||||
|
*
|
||||||
|
* 1. `args1` to `value1`
|
||||||
|
* 2. `args2` to `value2`
|
||||||
|
* 3. `args1` to `value3`
|
||||||
|
*
|
||||||
|
* @return Array of named arguments
|
||||||
|
*/
|
||||||
|
fun ContentMessage<TextContent>.parseCommandsWithNamedArgs(
|
||||||
|
argsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex,
|
||||||
|
nameArgSeparator: Regex = TelegramBotCommandsDefaults.defaultNamesArgsSeparatorRegex,
|
||||||
|
) = content.parseCommandsWithNamedArgs(argsSeparator = argsSeparator, nameArgSeparator = nameArgSeparator)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses [parseCommandsWithArgs] to create base [argsSeparator] split args for commands and map their as k-v pairs.
|
||||||
|
* Sample:
|
||||||
|
*
|
||||||
|
* ```bash
|
||||||
|
* /command args1=value1 arg2=value2 arg1=value3
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* Will produce [Map] with one key `command` and the list of three pairs:
|
||||||
|
*
|
||||||
|
* 1. `args1` to `value1`
|
||||||
|
* 2. `args2` to `value2`
|
||||||
|
* 3. `args1` to `value3`
|
||||||
|
*
|
||||||
|
* @return Array of named arguments
|
||||||
|
*/
|
||||||
|
fun List<TextSource>.parseCommandsWithNamedArgs(
|
||||||
|
argsSeparator: String,
|
||||||
|
nameArgSeparator: Regex = TelegramBotCommandsDefaults.defaultNamesArgsSeparatorRegex,
|
||||||
|
): Map<String, List<Pair<String, String>>> = parseCommandsWithNamedArgs(Regex(pattern = argsSeparator), nameArgSeparator)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses [parseCommandsWithArgs] to create base [argsSeparator] split args for commands and map their as k-v pairs.
|
||||||
|
* Sample:
|
||||||
|
*
|
||||||
|
* ```bash
|
||||||
|
* /command args1=value1 arg2=value2 arg1=value3
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* Will produce [Map] with one key `command` and the list of three pairs:
|
||||||
|
*
|
||||||
|
* 1. `args1` to `value1`
|
||||||
|
* 2. `args2` to `value2`
|
||||||
|
* 3. `args1` to `value3`
|
||||||
|
*
|
||||||
|
* @return Array of named arguments
|
||||||
|
*/
|
||||||
|
fun TextedWithTextSources.parseCommandsWithNamedArgs(
|
||||||
|
argsSeparator: String,
|
||||||
|
nameArgSeparator: Regex = TelegramBotCommandsDefaults.defaultNamesArgsSeparatorRegex,
|
||||||
|
) = parseCommandsWithNamedArgs(argsSeparator = Regex(pattern = argsSeparator), nameArgSeparator = nameArgSeparator)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses [parseCommandsWithArgs] to create base [argsSeparator] split args for commands and map their as k-v pairs.
|
||||||
|
* Sample:
|
||||||
|
*
|
||||||
|
* ```bash
|
||||||
|
* /command args1=value1 arg2=value2 arg1=value3
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* Will produce [Map] with one key `command` and the list of three pairs:
|
||||||
|
*
|
||||||
|
* 1. `args1` to `value1`
|
||||||
|
* 2. `args2` to `value2`
|
||||||
|
* 3. `args1` to `value3`
|
||||||
|
*
|
||||||
|
* @return Array of named arguments
|
||||||
|
*/
|
||||||
|
fun ContentMessage<TextContent>.parseCommandsWithNamedArgs(
|
||||||
|
argsSeparator: String,
|
||||||
|
nameArgSeparator: Regex = TelegramBotCommandsDefaults.defaultNamesArgsSeparatorRegex,
|
||||||
|
) = parseCommandsWithNamedArgs(argsSeparator = Regex(pattern = argsSeparator), nameArgSeparator = nameArgSeparator)
|
||||||
|
|
||||||
|
|
||||||
|
// Deprecations
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse commands and their args. Logic will find command, get all subsequent data as args until new command
|
||||||
|
*/
|
||||||
|
@Deprecated("Renamed", ReplaceWith("parseCommandsWithArgs(argsSeparator)", "dev.inmo.tgbotapi.extensions.utils.extensions.parseCommandsWithArgs"))
|
||||||
|
fun List<TextSource>.parseCommandsWithParams(
|
||||||
|
argsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex
|
||||||
|
): MutableMap<String, Array<String>> = parseCommandsWithArgs(argsSeparator)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse commands and their args. Logic will find command, get all subsequent data as args until new command
|
||||||
|
*/
|
||||||
|
@Deprecated("Renamed", ReplaceWith("parseCommandsWithArgs(argsSeparator)", "dev.inmo.tgbotapi.extensions.utils.extensions.parseCommandsWithArgs"))
|
||||||
|
fun TextedWithTextSources.parseCommandsWithParams(
|
||||||
|
argsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex
|
||||||
|
) = parseCommandsWithArgs(argsSeparator)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse commands and their args. Logic will find command, get all subsequent data as args until new command
|
||||||
|
*/
|
||||||
|
@Deprecated("Renamed", ReplaceWith("parseCommandsWithArgs(argsSeparator)", "dev.inmo.tgbotapi.extensions.utils.extensions.parseCommandsWithArgs"))
|
||||||
|
fun ContentMessage<TextContent>.parseCommandsWithParams(
|
||||||
|
argsSeparator: Regex = TelegramBotCommandsDefaults.defaultArgsSeparatorRegex
|
||||||
|
) = parseCommandsWithArgs(argsSeparator)
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
package dev.inmo.tgbotapi.extensions.utils.extensions
|
||||||
|
|
||||||
|
import dev.inmo.tgbotapi.abstracts.TextedWithTextSources
|
||||||
|
import dev.inmo.tgbotapi.extensions.utils.botCommandTextSourceOrNull
|
||||||
|
import dev.inmo.tgbotapi.extensions.utils.ifBotCommandTextSource
|
||||||
|
import dev.inmo.tgbotapi.extensions.utils.whenBotCommandTextSource
|
||||||
|
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
|
||||||
|
import dev.inmo.tgbotapi.types.message.content.TextContent
|
||||||
|
import dev.inmo.tgbotapi.types.message.textsources.BotCommandTextSource
|
||||||
|
import dev.inmo.tgbotapi.types.message.textsources.TextSource
|
||||||
|
|
||||||
|
// Sources
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse text sources to find commands with their arguments. This method will skip all the text sources __before__
|
||||||
|
* first command and all following text sources until the next command will be guessed as an args of last found command
|
||||||
|
*/
|
||||||
|
fun List<TextSource>.parseCommandsWithArgsSources(): Map<BotCommandTextSource, Array<TextSource>> {
|
||||||
|
var currentCommandTextSource: BotCommandTextSource? = null
|
||||||
|
val currentArgs = mutableListOf<TextSource>()
|
||||||
|
val result = mutableMapOf<BotCommandTextSource, Array<TextSource>>()
|
||||||
|
|
||||||
|
fun addCurrentCommandToResult() {
|
||||||
|
currentCommandTextSource ?.let {
|
||||||
|
result[it] = currentArgs.toTypedArray()
|
||||||
|
currentArgs.clear()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
forEach {
|
||||||
|
it.whenBotCommandTextSource {
|
||||||
|
addCurrentCommandToResult()
|
||||||
|
currentCommandTextSource = it
|
||||||
|
return@forEach
|
||||||
|
}
|
||||||
|
currentArgs.add(it)
|
||||||
|
}
|
||||||
|
addCurrentCommandToResult()
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse text sources to find commands with their arguments. This method will skip all the text sources __before__
|
||||||
|
* first command and all following text sources until the next command will be guessed as an args of last found command
|
||||||
|
*/
|
||||||
|
fun TextedWithTextSources.parseCommandsWithArgsSources() = textSources?.parseCommandsWithArgsSources() ?: emptyMap()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse text sources to find commands with their arguments. This method will skip all the text sources __before__
|
||||||
|
* first command and all following text sources until the next command will be guessed as an args of last found command
|
||||||
|
*/
|
||||||
|
fun ContentMessage<TextContent>.parseCommandsWithArgsSources() = content.parseCommandsWithArgsSources()
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package dev.inmo.tgbotapi.extensions.utils.extensions
|
package dev.inmo.tgbotapi.extensions.utils.extensions
|
||||||
|
|
||||||
import dev.inmo.tgbotapi.abstracts.FromUser
|
import dev.inmo.tgbotapi.abstracts.FromUser
|
||||||
import dev.inmo.tgbotapi.abstracts.WithChat
|
import dev.inmo.tgbotapi.abstracts.WithPreviewChat
|
||||||
import dev.inmo.tgbotapi.types.ChatIdentifier
|
import dev.inmo.tgbotapi.types.ChatIdentifier
|
||||||
import dev.inmo.tgbotapi.types.UserId
|
import dev.inmo.tgbotapi.types.UserId
|
||||||
import dev.inmo.tgbotapi.types.chat.Chat
|
import dev.inmo.tgbotapi.types.chat.Chat
|
||||||
@@ -15,13 +15,13 @@ import kotlinx.coroutines.flow.transform
|
|||||||
* Will pass only those [T] which have [sameChat] as [chatId]
|
* Will pass only those [T] which have [sameChat] as [chatId]
|
||||||
*/
|
*/
|
||||||
@Suppress("NOTHING_TO_INLINE")
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
inline fun <T : WithChat> Flow<T>.fromChat(chatId: ChatIdentifier): Flow<T> = filter { it.sameChat(chatId) }
|
inline fun <T : WithPreviewChat> Flow<T>.fromChat(chatId: ChatIdentifier): Flow<T> = filter { it.sameChat(chatId) }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Will pass only those [T] which have [sameChat] as [chatId]
|
* Will pass only those [T] which have [sameChat] as [chatId]
|
||||||
*/
|
*/
|
||||||
@Suppress("NOTHING_TO_INLINE")
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
inline fun <T : WithChat> Flow<T>.fromChat(chat: Chat): Flow<T> = fromChat(chat.id)
|
inline fun <T : WithPreviewChat> Flow<T>.fromChat(chat: Chat): Flow<T> = fromChat(chat.id)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return [Flow] with the [FromUser.user] field [User.id] the same as [userId]
|
* @return [Flow] with the [FromUser.user] field [User.id] the same as [userId]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package dev.inmo.tgbotapi.extensions.utils.extensions
|
package dev.inmo.tgbotapi.extensions.utils.extensions
|
||||||
|
|
||||||
import dev.inmo.tgbotapi.abstracts.WithChat
|
import dev.inmo.tgbotapi.abstracts.WithPreviewChat
|
||||||
import dev.inmo.tgbotapi.extensions.utils.usernameChatOrNull
|
import dev.inmo.tgbotapi.extensions.utils.usernameChatOrNull
|
||||||
import dev.inmo.tgbotapi.extensions.utils.whenUsernameChat
|
import dev.inmo.tgbotapi.extensions.utils.whenUsernameChat
|
||||||
import dev.inmo.tgbotapi.types.ChatIdentifier
|
import dev.inmo.tgbotapi.types.ChatIdentifier
|
||||||
@@ -16,21 +16,23 @@ import dev.inmo.tgbotapi.utils.extensions.threadIdOrNull
|
|||||||
* @return true in case if [this] message is placed in the chat with id == [chatId]
|
* @return true in case if [this] message is placed in the chat with id == [chatId]
|
||||||
*/
|
*/
|
||||||
@Suppress("NOTHING_TO_INLINE")
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
inline fun WithChat.sameChat(chatId: ChatIdentifier) = chat.id == chatId || (chatId is Username && chat.whenUsernameChat {
|
inline fun WithPreviewChat.sameChat(chatId: ChatIdentifier) =
|
||||||
it.username == chatId
|
chat.id == chatId || (chatId is Username && chat.whenUsernameChat {
|
||||||
} ?: false)
|
it.username == chatId
|
||||||
|
} ?: false)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true in case if [this] message is placed in the [chat]
|
* @return true in case if [this] message is placed in the [chat]
|
||||||
*/
|
*/
|
||||||
@Suppress("NOTHING_TO_INLINE")
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
inline fun WithChat.sameChat(chat: Chat) = sameChat(chat.id) || chat.usernameChatOrNull() ?.username ?.let { sameChat(it) } ?: false
|
inline fun WithPreviewChat.sameChat(chat: Chat) =
|
||||||
|
sameChat(chat.id) || chat.usernameChatOrNull()?.username?.let { sameChat(it) } ?: false
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true in case if [this] message is placed in the same chat that [other]
|
* @return true in case if [this] message is placed in the same chat that [other]
|
||||||
*/
|
*/
|
||||||
@Suppress("NOTHING_TO_INLINE")
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
inline fun WithChat.sameChat(other: Message) = sameChat(other.chat)
|
inline fun WithPreviewChat.sameChat(other: Message) = sameChat(other.chat)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true in case if [this] message is from the same chat (with id == [chatId]) and [this] [Message.messageId]
|
* @return true in case if [this] message is from the same chat (with id == [chatId]) and [this] [Message.messageId]
|
||||||
|
|||||||
@@ -1,54 +0,0 @@
|
|||||||
package dev.inmo.tgbotapi.extensions.utils.extensions
|
|
||||||
|
|
||||||
import dev.inmo.tgbotapi.abstracts.TextedWithTextSources
|
|
||||||
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
|
|
||||||
import dev.inmo.tgbotapi.types.message.content.TextContent
|
|
||||||
import dev.inmo.tgbotapi.types.message.textsources.BotCommandTextSource
|
|
||||||
import dev.inmo.tgbotapi.types.message.textsources.TextSource
|
|
||||||
|
|
||||||
|
|
||||||
val defaultArgsSeparator = Regex(" ")
|
|
||||||
/**
|
|
||||||
* Parse commands and their args. Logic will find command, get all subsequent data as args until new command
|
|
||||||
*/
|
|
||||||
fun List<TextSource>.parseCommandsWithParams(
|
|
||||||
argsSeparator: Regex = defaultArgsSeparator
|
|
||||||
): MutableMap<String, Array<String>> {
|
|
||||||
val result = mutableMapOf<String, Array<String>>()
|
|
||||||
var currentBotCommandSource: BotCommandTextSource? = null
|
|
||||||
var currentArgs = ""
|
|
||||||
fun includeCurrent() = currentBotCommandSource ?.let {
|
|
||||||
currentArgs = currentArgs.trim()
|
|
||||||
result[it.command] = if (currentArgs.isNotEmpty()) {
|
|
||||||
currentArgs.split(argsSeparator).toTypedArray()
|
|
||||||
} else {
|
|
||||||
emptyArray()
|
|
||||||
}
|
|
||||||
currentArgs = ""
|
|
||||||
currentBotCommandSource = null
|
|
||||||
}
|
|
||||||
for (textSource in this) {
|
|
||||||
if (textSource is BotCommandTextSource) {
|
|
||||||
includeCurrent()
|
|
||||||
currentBotCommandSource = textSource
|
|
||||||
} else {
|
|
||||||
currentArgs += textSource.source
|
|
||||||
}
|
|
||||||
}
|
|
||||||
includeCurrent()
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse commands and their args. Logic will find command, get all subsequent data as args until new command
|
|
||||||
*/
|
|
||||||
fun TextedWithTextSources.parseCommandsWithParams(
|
|
||||||
argsSeparator: Regex = defaultArgsSeparator
|
|
||||||
) = textSources ?.parseCommandsWithParams(argsSeparator) ?: emptyMap()
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse commands and their args. Logic will find command, get all subsequent data as args until new command
|
|
||||||
*/
|
|
||||||
fun ContentMessage<TextContent>.parseCommandsWithParams(
|
|
||||||
argsSeparator: Regex = defaultArgsSeparator
|
|
||||||
) = content.parseCommandsWithParams(argsSeparator)
|
|
||||||
Reference in New Issue
Block a user