mirror of
https://github.com/InsanusMokrassar/TelegramBotAPI.git
synced 2024-11-25 03:28:44 +00:00
commands shortcuts
This commit is contained in:
parent
571296b9a0
commit
3fa3aa50d9
@ -55,6 +55,12 @@
|
|||||||
|
|
||||||
### 0.28.2
|
### 0.28.2
|
||||||
|
|
||||||
|
* `TelegramBotAPI-extensions-utils`:
|
||||||
|
* Several commands shortcuts for `Flow<ContentMessage<TextContent>>` has been added:
|
||||||
|
* `filterExactCommands`
|
||||||
|
* `filterCommandsInsideTextMessages`
|
||||||
|
* `filterCommandsWithArgs`
|
||||||
|
|
||||||
## 0.27.0
|
## 0.27.0
|
||||||
|
|
||||||
* `Common`:
|
* `Common`:
|
||||||
|
@ -0,0 +1,93 @@
|
|||||||
|
package com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.shortcuts
|
||||||
|
|
||||||
|
import com.github.insanusmokrassar.TelegramBotAPI.CommonAbstracts.TextSource
|
||||||
|
import com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.onlyTextContentMessages
|
||||||
|
import com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.updates.asContentMessagesFlow
|
||||||
|
import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.textsources.BotCommandTextSource
|
||||||
|
import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.textsources.RegularTextSource
|
||||||
|
import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.ContentMessage
|
||||||
|
import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.TextContent
|
||||||
|
import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.fullEntitiesList
|
||||||
|
import kotlinx.coroutines.flow.*
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert incoming [com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.ContentMessage.content] of
|
||||||
|
* messages with [fullEntitiesList] and check that incoming message contains ONLY ONE [TextSource] and that is
|
||||||
|
* [BotCommandTextSource]. Besides, it is checking that [BotCommandTextSource.command] [Regex.matches] with incoming
|
||||||
|
* [commandRegex]
|
||||||
|
*
|
||||||
|
* @return The same message in case if it contains only [BotCommandTextSource] with [Regex.matches]
|
||||||
|
* [BotCommandTextSource.command]
|
||||||
|
*
|
||||||
|
* @see fullEntitiesList
|
||||||
|
* @see asContentMessagesFlow
|
||||||
|
* @see onlyTextContentMessages
|
||||||
|
* @see textMessages
|
||||||
|
*/
|
||||||
|
fun <T : ContentMessage<TextContent>> Flow<T>.filterExactCommands(
|
||||||
|
commandRegex: Regex
|
||||||
|
) = filter { contentMessage ->
|
||||||
|
(contentMessage.content.fullEntitiesList().singleOrNull() as? BotCommandTextSource) ?.let { commandRegex.matches(it.command) } == true
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert incoming [com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.ContentMessage.content] of
|
||||||
|
* messages with [fullEntitiesList] and check that incoming message contains [BotCommandTextSource]. Besides, it is
|
||||||
|
* checking that [BotCommandTextSource.command] [Regex.matches] with incoming [commandRegex]
|
||||||
|
*
|
||||||
|
* @return The same message in case if it contains somewhere in text [BotCommandTextSource] with [Regex.matches]
|
||||||
|
* [BotCommandTextSource.command]
|
||||||
|
*
|
||||||
|
* @see fullEntitiesList
|
||||||
|
* @see asContentMessagesFlow
|
||||||
|
* @see onlyTextContentMessages
|
||||||
|
* @see textMessages
|
||||||
|
*/
|
||||||
|
fun <T : ContentMessage<TextContent>> Flow<T>.filterCommandsInsideTextMessages(
|
||||||
|
commandRegex: Regex
|
||||||
|
) = filter { contentMessage ->
|
||||||
|
contentMessage.content.fullEntitiesList().any {
|
||||||
|
(it as? BotCommandTextSource) ?.let { commandRegex.matches(it.command) } == true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert incoming [com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.ContentMessage.content] of
|
||||||
|
* messages with [fullEntitiesList] and check that incoming message contains first [TextSource] as
|
||||||
|
* [BotCommandTextSource]. Besides, it is checking that [BotCommandTextSource.command] [Regex.matches] with incoming
|
||||||
|
* [commandRegex] and for other [TextSource] objects used next rules: all incoming text sources will be passed as is,
|
||||||
|
* [RegularTextSource] will be split by " " for several [RegularTextSource] which will contains not empty args without
|
||||||
|
* spaces.
|
||||||
|
*
|
||||||
|
* @return Converted list with first entity [BotCommandTextSource] and than all others according to rules in description
|
||||||
|
*
|
||||||
|
* @see fullEntitiesList
|
||||||
|
* @see asContentMessagesFlow
|
||||||
|
* @see onlyTextContentMessages
|
||||||
|
* @see textMessages
|
||||||
|
*/
|
||||||
|
fun <T : ContentMessage<TextContent>> Flow<T>.filterCommandsWithArgs(
|
||||||
|
commandRegex: Regex
|
||||||
|
) = mapNotNull { contentMessage ->
|
||||||
|
val allEntities = contentMessage.content.fullEntitiesList()
|
||||||
|
(allEntities.firstOrNull() as? BotCommandTextSource) ?.let {
|
||||||
|
if (commandRegex.matches(it.command)) {
|
||||||
|
allEntities.flatMap {
|
||||||
|
when (it) {
|
||||||
|
is RegularTextSource -> it.source.split(" ").mapNotNull { regularTextSourcePart ->
|
||||||
|
if (regularTextSourcePart.isNotBlank()) {
|
||||||
|
RegularTextSource(regularTextSourcePart)
|
||||||
|
} else {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else -> listOf(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -2,6 +2,7 @@ package com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.updates
|
|||||||
|
|
||||||
import com.github.insanusmokrassar.TelegramBotAPI.CommonAbstracts.TextSource
|
import com.github.insanusmokrassar.TelegramBotAPI.CommonAbstracts.TextSource
|
||||||
import com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.onlyTextContentMessages
|
import com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.onlyTextContentMessages
|
||||||
|
import com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.shortcuts.*
|
||||||
import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.textsources.BotCommandTextSource
|
import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.textsources.BotCommandTextSource
|
||||||
import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.textsources.RegularTextSource
|
import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.textsources.RegularTextSource
|
||||||
import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.fullEntitiesList
|
import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.fullEntitiesList
|
||||||
@ -23,9 +24,7 @@ import kotlinx.coroutines.flow.*
|
|||||||
*/
|
*/
|
||||||
fun <T : BaseSentMessageUpdate> Flow<T>.filterExactCommands(
|
fun <T : BaseSentMessageUpdate> Flow<T>.filterExactCommands(
|
||||||
commandRegex: Regex
|
commandRegex: Regex
|
||||||
) = asContentMessagesFlow().onlyTextContentMessages().filter { contentMessage ->
|
) = textMessages().filterExactCommands(commandRegex)
|
||||||
(contentMessage.content.fullEntitiesList().singleOrNull() as? BotCommandTextSource) ?.let { commandRegex.matches(it.command) } == true
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert incoming [com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.ContentMessage.content] of
|
* Convert incoming [com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.ContentMessage.content] of
|
||||||
@ -41,11 +40,7 @@ fun <T : BaseSentMessageUpdate> Flow<T>.filterExactCommands(
|
|||||||
*/
|
*/
|
||||||
fun <T : BaseSentMessageUpdate> Flow<T>.filterCommandsInsideTextMessages(
|
fun <T : BaseSentMessageUpdate> Flow<T>.filterCommandsInsideTextMessages(
|
||||||
commandRegex: Regex
|
commandRegex: Regex
|
||||||
) = asContentMessagesFlow().onlyTextContentMessages().filter { contentMessage ->
|
) = textMessages().filterCommandsInsideTextMessages(commandRegex)
|
||||||
contentMessage.content.fullEntitiesList().any {
|
|
||||||
(it as? BotCommandTextSource) ?.let { commandRegex.matches(it.command) } == true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert incoming [com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.ContentMessage.content] of
|
* Convert incoming [com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.ContentMessage.content] of
|
||||||
@ -63,24 +58,4 @@ fun <T : BaseSentMessageUpdate> Flow<T>.filterCommandsInsideTextMessages(
|
|||||||
*/
|
*/
|
||||||
fun <T : BaseSentMessageUpdate> Flow<T>.filterCommandsWithArgs(
|
fun <T : BaseSentMessageUpdate> Flow<T>.filterCommandsWithArgs(
|
||||||
commandRegex: Regex
|
commandRegex: Regex
|
||||||
): Flow<List<TextSource>> = asContentMessagesFlow().onlyTextContentMessages().mapNotNull { contentMessage ->
|
): Flow<List<TextSource>> = textMessages().filterCommandsWithArgs(commandRegex)
|
||||||
val allEntities = contentMessage.content.fullEntitiesList()
|
|
||||||
(allEntities.firstOrNull() as? BotCommandTextSource) ?.let {
|
|
||||||
if (commandRegex.matches(it.command)) {
|
|
||||||
allEntities.flatMap {
|
|
||||||
when (it) {
|
|
||||||
is RegularTextSource -> it.source.split(" ").mapNotNull { regularTextSourcePart ->
|
|
||||||
if (regularTextSourcePart.isNotBlank()) {
|
|
||||||
RegularTextSource(regularTextSourcePart)
|
|
||||||
} else {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else -> listOf(it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user