Skip to content

Commit 8cd7567

Browse files
add opportunity to set custom emoji status from webapp
1 parent d294d0e commit 8cd7567

4 files changed

Lines changed: 69 additions & 5 deletions

File tree

WebApp/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ kotlin {
3030
dependencies {
3131
implementation kotlin('stdlib')
3232
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:$serialization_version"
33+
implementation "dev.inmo:tgbotapi.core:$telegram_bot_api_version"
3334
implementation compose.runtime
3435
}
3536
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import dev.inmo.tgbotapi.types.CustomEmojiId
2+
3+
val CustomEmojiIdToSet = CustomEmojiId("5424939566278649034")

WebApp/src/jsMain/kotlin/main.kt

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import androidx.compose.runtime.*
22
import dev.inmo.micro_utils.coroutines.launchSafelyWithoutExceptions
3+
import dev.inmo.tgbotapi.types.CustomEmojiId
4+
import dev.inmo.tgbotapi.types.userIdField
35
import dev.inmo.tgbotapi.types.webAppQueryIdField
46
import dev.inmo.tgbotapi.webapps.*
57
import dev.inmo.tgbotapi.webapps.accelerometer.AccelerometerStartParams
@@ -85,6 +87,47 @@ fun main() {
8587
P()
8688
Text("Chat from WebAppInitData: ${webApp.initDataUnsafe.chat}")
8789

90+
val emojiStatusAccessState = remember { mutableStateOf(false) }
91+
webApp.onEmojiStatusAccessRequested {
92+
emojiStatusAccessState.value = it.isAllowed
93+
}
94+
Button({
95+
onClick {
96+
webApp.requestEmojiStatusAccess()
97+
}
98+
}) {
99+
Text("Request custom emoji status access")
100+
}
101+
if (emojiStatusAccessState.value) {
102+
Button({
103+
onClick {
104+
webApp.setEmojiStatus(CustomEmojiIdToSet/* android custom emoji id */)
105+
}
106+
}) {
107+
Text("Set custom emoji status")
108+
}
109+
val userId = webApp.initDataUnsafe.user ?.id
110+
userId ?.let { userId ->
111+
Button({
112+
onClick {
113+
scope.launchSafelyWithoutExceptions {
114+
client.post("$baseUrl/setCustomEmoji") {
115+
parameter(userIdField, userId.long)
116+
setBody(
117+
Json.encodeToString(
118+
WebAppDataWrapper.serializer(),
119+
WebAppDataWrapper(webApp.initData, webApp.initDataUnsafe.hash)
120+
)
121+
)
122+
}
123+
}
124+
}
125+
}) {
126+
Text("Set custom emoji status via bot")
127+
}
128+
}
129+
}
130+
88131
Button({
89132
onClick {
90133
scope.launchSafelyWithoutExceptions {

WebApp/src/jvmMain/kotlin/WebAppServer.kt

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import dev.inmo.tgbotapi.extensions.api.bot.getMe
66
import dev.inmo.tgbotapi.extensions.api.bot.setMyCommands
77
import dev.inmo.tgbotapi.extensions.api.send.reply
88
import dev.inmo.tgbotapi.extensions.api.send.send
9+
import dev.inmo.tgbotapi.extensions.api.set.setUserEmojiStatus
910
import dev.inmo.tgbotapi.extensions.api.telegramBot
1011
import dev.inmo.tgbotapi.extensions.behaviour_builder.buildBehaviourWithLongPolling
1112
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onBaseInlineQuery
@@ -16,12 +17,9 @@ import dev.inmo.tgbotapi.extensions.utils.types.buttons.inlineKeyboard
1617
import dev.inmo.tgbotapi.extensions.utils.types.buttons.replyKeyboard
1718
import dev.inmo.tgbotapi.extensions.utils.types.buttons.webAppButton
1819
import dev.inmo.tgbotapi.requests.answers.InlineQueryResultsButton
19-
import dev.inmo.tgbotapi.types.BotCommand
20+
import dev.inmo.tgbotapi.types.*
2021
import dev.inmo.tgbotapi.types.InlineQueries.InlineQueryResult.InlineQueryResultArticle
2122
import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputTextMessageContent
22-
import dev.inmo.tgbotapi.types.InlineQueryId
23-
import dev.inmo.tgbotapi.types.LinkPreviewOptions
24-
import dev.inmo.tgbotapi.types.webAppQueryIdField
2523
import dev.inmo.tgbotapi.types.webapps.WebAppInfo
2624
import dev.inmo.tgbotapi.utils.*
2725
import io.ktor.http.*
@@ -30,7 +28,6 @@ import io.ktor.server.http.content.*
3028
import io.ktor.server.request.*
3129
import io.ktor.server.response.*
3230
import io.ktor.server.routing.*
33-
import kotlinx.coroutines.Dispatchers
3431
import kotlinx.serialization.json.Json
3532
import java.io.File
3633

@@ -105,6 +102,26 @@ suspend fun main(vararg args: String) {
105102

106103
call.respond(HttpStatusCode.OK, isSafe.toString())
107104
}
105+
post("setCustomEmoji") {
106+
val requestBody = call.receiveText()
107+
val webAppCheckData = Json.decodeFromString(WebAppDataWrapper.serializer(), requestBody)
108+
109+
val isSafe = telegramBotAPIUrlsKeeper.checkWebAppData(webAppCheckData.data, webAppCheckData.hash)
110+
val rawUserId = call.parameters[userIdField] ?.toLongOrNull() ?.let(::RawChatId) ?: error("$userIdField should be presented as long value")
111+
112+
val set = if (isSafe) {
113+
runCatching {
114+
bot.setUserEmojiStatus(
115+
UserId(rawUserId),
116+
CustomEmojiIdToSet
117+
)
118+
}.getOrElse { false }
119+
} else {
120+
false
121+
}
122+
123+
call.respond(HttpStatusCode.OK, set.toString())
124+
}
108125
}
109126
}.start(false)
110127

0 commit comments

Comments
 (0)