Skip to content

Commit 600ac8e

Browse files
Merge pull request #356 from InsanusMokrassar/31.0.0
31.0.0
2 parents 0e8714c + 0740354 commit 600ac8e

16 files changed

Lines changed: 531 additions & 91 deletions

File tree

CustomBot/src/main/kotlin/CustomBot.kt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,22 @@ import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
66
import dev.inmo.tgbotapi.extensions.api.bot.getMe
77
import dev.inmo.tgbotapi.extensions.api.bot.getMyStarBalance
88
import dev.inmo.tgbotapi.extensions.api.chat.get.getChat
9+
import dev.inmo.tgbotapi.extensions.api.get.getUserProfileAudios
10+
import dev.inmo.tgbotapi.extensions.api.send.media.sendPaidMedia
911
import dev.inmo.tgbotapi.extensions.api.send.reply
12+
import dev.inmo.tgbotapi.extensions.api.send.replyWithAudio
13+
import dev.inmo.tgbotapi.extensions.api.send.replyWithPlaylist
1014
import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContextData
1115
import dev.inmo.tgbotapi.extensions.behaviour_builder.buildSubcontextInitialAction
1216
import dev.inmo.tgbotapi.extensions.behaviour_builder.telegramBotWithBehaviourAndLongPolling
1317
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onChannelDirectMessagesConfigurationChanged
18+
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onChatOwnerChanged
19+
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onChatOwnerLeft
1420
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand
21+
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onPhoto
22+
import dev.inmo.tgbotapi.types.media.AudioMediaGroupMemberTelegramMedia
23+
import dev.inmo.tgbotapi.types.media.toTelegramMediaAudio
24+
import dev.inmo.tgbotapi.types.media.toTelegramPaidMediaPhoto
1525
import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage
1626
import dev.inmo.tgbotapi.types.update.abstracts.Update
1727
import kotlinx.coroutines.CoroutineScope
@@ -70,6 +80,32 @@ suspend fun main(vararg args: String) {
7080
println(data.update)
7181
println(data.commonMessage)
7282
println(getChat(it.chat))
83+
var currentOffset = 0
84+
val pageSize = 2
85+
do {
86+
val userAudios = getUserProfileAudios(userId = it.chat.id, offset = currentOffset, limit = pageSize)
87+
currentOffset += pageSize
88+
println(userAudios)
89+
when (userAudios.audios.size) {
90+
1 -> {
91+
replyWithAudio(
92+
it,
93+
userAudios.audios.first().fileId
94+
)
95+
}
96+
0 -> {
97+
// do nothing
98+
}
99+
else -> {
100+
replyWithPlaylist(
101+
it,
102+
userAudios.audios.map {
103+
it.toTelegramMediaAudio()
104+
}
105+
)
106+
}
107+
}
108+
} while (currentOffset < userAudios.totalCount && userAudios.audios.isNotEmpty())
73109
}
74110

75111
onCommand(

DraftsBot/README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Drafts bot
2+
3+
The main purpose of this bot is just to answer "Oh, hi, " and add user mention here
4+
5+
## Launch
6+
7+
```bash
8+
../gradlew run --args="BOT_TOKEN"
9+
```

DraftsBot/build.gradle

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
buildscript {
2+
repositories {
3+
mavenCentral()
4+
}
5+
6+
dependencies {
7+
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
8+
}
9+
}
10+
11+
apply plugin: 'kotlin'
12+
apply plugin: 'application'
13+
14+
mainClassName="TopicsHandlingKt"
15+
16+
17+
dependencies {
18+
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
19+
20+
implementation "dev.inmo:tgbotapi:$telegram_bot_api_version"
21+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import com.benasher44.uuid.uuid4
2+
import dev.inmo.kslog.common.w
3+
import dev.inmo.micro_utils.coroutines.runCatchingLogging
4+
import dev.inmo.micro_utils.coroutines.runCatchingSafely
5+
import dev.inmo.micro_utils.coroutines.subscribeLoggingDropExceptions
6+
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
7+
import dev.inmo.tgbotapi.bot.TelegramBot
8+
import dev.inmo.tgbotapi.extensions.api.bot.getMe
9+
import dev.inmo.tgbotapi.extensions.api.bot.setMyCommands
10+
import dev.inmo.tgbotapi.extensions.api.chat.forum.*
11+
import dev.inmo.tgbotapi.extensions.api.send.reply
12+
import dev.inmo.tgbotapi.extensions.api.send.send
13+
import dev.inmo.tgbotapi.extensions.api.send.sendMessageDraftFlow
14+
import dev.inmo.tgbotapi.extensions.api.send.sendMessageDraftFlowWithTexts
15+
import dev.inmo.tgbotapi.extensions.behaviour_builder.telegramBotWithBehaviourAndLongPolling
16+
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand
17+
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onForumTopicClosed
18+
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onForumTopicCreated
19+
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onForumTopicEdited
20+
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onForumTopicReopened
21+
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onGeneralForumTopicHidden
22+
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onGeneralForumTopicUnhidden
23+
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onPrivateForumTopicCreated
24+
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onPrivateForumTopicEdited
25+
import dev.inmo.tgbotapi.extensions.utils.forumChatOrNull
26+
import dev.inmo.tgbotapi.extensions.utils.forumContentMessageOrNull
27+
import dev.inmo.tgbotapi.extensions.utils.privateChatOrNull
28+
import dev.inmo.tgbotapi.extensions.utils.privateForumChatOrNull
29+
import dev.inmo.tgbotapi.extensions.utils.updates.retrieving.flushAccumulatedUpdates
30+
import dev.inmo.tgbotapi.types.BotCommand
31+
import dev.inmo.tgbotapi.types.ForumTopic
32+
import dev.inmo.tgbotapi.types.chat.PrivateChat
33+
import dev.inmo.tgbotapi.types.commands.BotCommandScope
34+
import io.ktor.client.plugins.*
35+
import kotlinx.coroutines.CoroutineScope
36+
import kotlinx.coroutines.Dispatchers
37+
import kotlinx.coroutines.delay
38+
import kotlinx.coroutines.flow.flow
39+
import kotlinx.coroutines.isActive
40+
41+
const val testText = """
42+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
43+
"""
44+
45+
suspend fun main(vararg args: String) {
46+
telegramBotWithBehaviourAndLongPolling(
47+
args.first(),
48+
CoroutineScope(Dispatchers.Default),
49+
defaultExceptionsHandler = {
50+
it.printStackTrace()
51+
},
52+
builder = {
53+
client = client.config {
54+
install(HttpTimeout) {
55+
requestTimeoutMillis = 30000
56+
socketTimeoutMillis = 30000
57+
connectTimeoutMillis = 30000
58+
}
59+
}
60+
}
61+
) {
62+
onCommand("test_draft_flow") {
63+
sendMessageDraftFlowWithTexts(
64+
it.chat.id,
65+
flow<String> {
66+
val step = 50
67+
var currentLength = step
68+
while (isActive && testText.length > currentLength) {
69+
delay(500L)
70+
emit(testText.take(currentLength))
71+
currentLength += step
72+
}
73+
},
74+
)
75+
send(it.chat, testText)
76+
}
77+
78+
setMyCommands(
79+
BotCommand("test_draft_flow", "Start draft testing with flow"),
80+
scope = BotCommandScope.AllGroupChats
81+
)
82+
allUpdatesFlow.subscribeLoggingDropExceptions(this) {
83+
println(it)
84+
}
85+
}.second.join()
86+
}

GetMeBot/src/main/kotlin/GetMeBot.kt

Lines changed: 0 additions & 29 deletions
This file was deleted.

GiftsBot/build.gradle

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
buildscript {
2+
repositories {
3+
mavenCentral()
4+
}
5+
6+
dependencies {
7+
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
8+
}
9+
}
10+
11+
apply plugin: 'kotlin'
12+
apply plugin: 'application'
13+
14+
mainClassName="GiftsBotKt"
15+
16+
17+
dependencies {
18+
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
19+
20+
implementation "dev.inmo:tgbotapi:$telegram_bot_api_version"
21+
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
import dev.inmo.kslog.common.KSLog
2+
import dev.inmo.kslog.common.LogLevel
3+
import dev.inmo.kslog.common.defaultMessageFormatter
4+
import dev.inmo.kslog.common.setDefaultKSLog
5+
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
6+
import dev.inmo.tgbotapi.extensions.api.bot.getMe
7+
import dev.inmo.tgbotapi.extensions.api.business.getBusinessAccountGiftsFlow
8+
import dev.inmo.tgbotapi.extensions.api.gifts.getChatGiftsFlow
9+
import dev.inmo.tgbotapi.extensions.api.gifts.getUserGiftsFlow
10+
import dev.inmo.tgbotapi.extensions.api.send.reply
11+
import dev.inmo.tgbotapi.extensions.api.send.withTypingAction
12+
import dev.inmo.tgbotapi.extensions.behaviour_builder.telegramBotWithBehaviourAndLongPolling
13+
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand
14+
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onGiveawayCompleted
15+
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onGiveawayContent
16+
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onGiveawayCreated
17+
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onGiveawayWinners
18+
import dev.inmo.tgbotapi.types.chat.BusinessChat
19+
import dev.inmo.tgbotapi.types.chat.PrivateChat
20+
import dev.inmo.tgbotapi.types.chat.PublicChat
21+
import dev.inmo.tgbotapi.types.chat.UnknownChatType
22+
import dev.inmo.tgbotapi.types.gifts.OwnedGift
23+
import dev.inmo.tgbotapi.types.message.textsources.splitForText
24+
import dev.inmo.tgbotapi.utils.bold
25+
import dev.inmo.tgbotapi.utils.buildEntities
26+
import kotlinx.coroutines.CoroutineScope
27+
import kotlinx.coroutines.Dispatchers
28+
29+
suspend fun main(vararg args: String) {
30+
val botToken = args.first()
31+
32+
val isDebug = args.any { it == "debug" }
33+
val isTestServer = args.any { it == "testServer" }
34+
35+
if (isDebug) {
36+
setDefaultKSLog(
37+
KSLog { level: LogLevel, tag: String?, message: Any, throwable: Throwable? ->
38+
println(defaultMessageFormatter(level, tag, message, throwable))
39+
}
40+
)
41+
}
42+
43+
telegramBotWithBehaviourAndLongPolling(botToken, testServer = isTestServer) {
44+
// start here!!
45+
val me = getMe()
46+
println(me)
47+
48+
onCommand("start") {
49+
val giftsFlow = when (val chat = it.chat) {
50+
is BusinessChat -> {
51+
getBusinessAccountGiftsFlow(
52+
chat.id.businessConnectionId
53+
)
54+
}
55+
is PrivateChat -> {
56+
getUserGiftsFlow(it.chat.id)
57+
}
58+
is UnknownChatType,
59+
is PublicChat -> {
60+
getChatGiftsFlow(it.chat.id)
61+
}
62+
}
63+
64+
withTypingAction(it.chat) {
65+
val texts = buildEntities {
66+
giftsFlow.collect { ownedGifts ->
67+
ownedGifts.gifts.forEach {
68+
when (it) {
69+
is OwnedGift.Regular.Common -> {
70+
bold("Type") + ": Regular common\n"
71+
bold("Id") + ": ${it.gift.id.string}\n"
72+
bold("Text") + ": ${it.text ?: "(None)"}\n"
73+
bold("Stars cost") + ": ${it.gift.starCount}\n"
74+
}
75+
is OwnedGift.Unique.Common -> {
76+
bold("Type") + ": Unique common\n"
77+
bold("Id") + ": ${it.gift.id ?.string ?: "(None)"}\n"
78+
bold("Name") + ": ${it.gift.name.value}\n"
79+
bold("Model") + ": ${it.gift.model.name}\n"
80+
bold("Number") + ": ${it.gift.number}\n"
81+
}
82+
is OwnedGift.Regular.OwnedByBusinessAccount -> {
83+
bold("Type") + ": Regular owned by business\n"
84+
bold("Id") + ": ${it.gift.id.string}\n"
85+
bold("Text") + ": ${it.text ?: "(None)"}\n"
86+
bold("Stars cost") + ": ${it.gift.starCount}\n"
87+
}
88+
is OwnedGift.Unique.OwnedByBusinessAccount -> {
89+
bold("Type") + ": Unique owned by business\n"
90+
bold("Id") + ": ${it.gift.id ?.string ?: "(None)"}\n"
91+
bold("Name") + ": ${it.gift.name.value}\n"
92+
bold("Model") + ": ${it.gift.model.name}\n"
93+
bold("Number") + ": ${it.gift.number}\n"
94+
}
95+
}
96+
}
97+
}
98+
}
99+
val preparedTexts = texts.splitForText()
100+
if (preparedTexts.isEmpty()) {
101+
reply(it, "This chat have no any gifts")
102+
} else {
103+
preparedTexts.forEach { preparedText -> reply(it, preparedText) }
104+
}
105+
}
106+
}
107+
108+
// allUpdatesFlow.subscribeSafelyWithoutExceptions(this) {
109+
// println(it)
110+
// }
111+
}.second.join()
112+
}

KeyboardsBot/KeyboardsBotLib/src/commonMain/kotlin/KeyboardsBot.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.*
1111
import dev.inmo.tgbotapi.extensions.utils.types.buttons.*
1212
import dev.inmo.tgbotapi.extensions.utils.withContent
1313
import dev.inmo.tgbotapi.types.BotCommand
14+
import dev.inmo.tgbotapi.types.CustomEmojiId
1415
import dev.inmo.tgbotapi.types.InlineQueries.InlineQueryResult.InlineQueryResultArticle
1516
import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputTextMessageContent
1617
import dev.inmo.tgbotapi.types.InlineQueryId
18+
import dev.inmo.tgbotapi.types.buttons.KeyboardButtonStyle
1719
import dev.inmo.tgbotapi.types.message.content.TextContent
1820
import dev.inmo.tgbotapi.utils.PreviewFeature
1921
import dev.inmo.tgbotapi.utils.botCommand
@@ -51,17 +53,17 @@ fun InlineKeyboardBuilder.includePageButtons(page: Int, count: Int) {
5153

5254
row {
5355
if (page - 1 > 2) {
54-
dataButton("<<", "1 $count")
56+
dataButton("<<", "1 $count", style = KeyboardButtonStyle.Danger)
5557
}
5658
if (page - 1 > 1) {
57-
dataButton("<", "${page - 2} $count")
59+
dataButton("<", "${page - 2} $count", style = KeyboardButtonStyle.Primary)
5860
}
5961

6062
if (page + 1 < count) {
61-
dataButton(">", "${page + 2} $count")
63+
dataButton(">", "${page + 2} $count", style = KeyboardButtonStyle.Success)
6264
}
6365
if (page + 2 < count) {
64-
dataButton(">>", "$count $count")
66+
dataButton(">>", "$count $count", style = KeyboardButtonStyle.Danger)
6567
}
6668
}
6769
row {
@@ -161,7 +163,7 @@ suspend fun activateKeyboardsBot(
161163
it,
162164
replyMarkup = replyKeyboard(resizeKeyboard = true, oneTimeKeyboard = true) {
163165
row {
164-
simpleButton("/inline")
166+
simpleButton("/inline", style = KeyboardButtonStyle.Primary)
165167
}
166168
}
167169
) {
File renamed without changes.

0 commit comments

Comments
 (0)