11package by.jprof.telegram.bot.leetcode
22
33import by.jprof.telegram.bot.core.UpdateProcessor
4+ import dev.inmo.tgbotapi.bot.RequestsExecutor
5+ import dev.inmo.tgbotapi.extensions.api.send.reply
46import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextLinkTextSource
57import dev.inmo.tgbotapi.types.MessageEntity.textsources.URLTextSource
8+ import dev.inmo.tgbotapi.types.ParseMode.MarkdownV2ParseMode
69import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
710import dev.inmo.tgbotapi.types.message.abstracts.Message
811import dev.inmo.tgbotapi.types.message.content.TextContent
912import dev.inmo.tgbotapi.types.update.MessageUpdate
1013import dev.inmo.tgbotapi.types.update.abstracts.Update
14+ import dev.inmo.tgbotapi.utils.extensions.escapeMarkdownV2Common
15+ import kotlinx.coroutines.async
16+ import kotlinx.coroutines.awaitAll
17+ import kotlinx.coroutines.coroutineScope
1118import org.apache.logging.log4j.LogManager
1219
13- class LeetCodeUpdateProcessor : UpdateProcessor {
20+ class LeetCodeUpdateProcessor (
21+ private val bot : RequestsExecutor ,
22+ ) : UpdateProcessor {
1423 companion object {
1524 private val logger = LogManager .getLogger(LeetCodeUpdateProcessor ::class .java)!!
1625 private val slugExtractor: SlugExtractor = ::NaiveRegexSlugExtractor
26+ private val leetCodeClient: LeetCodeClient = GraphQLLeetCodeClient ()
1727 }
1828
1929 override suspend fun process (update : Update ) {
2030 @Suppress(" NAME_SHADOWING" ) val update = update as ? MessageUpdate ? : return
2131
22- val slugs = extractSlugs(update.data) ? : return
32+ val slugs = extractSlugs(update.data)?. takeUnless { it.isEmpty() }?.distinct() ? : return
2333
2434 logger.debug(" LeetCode slugs: {}" , slugs)
35+
36+ val questions = coroutineScope {
37+ slugs.map { slug -> async { leetCodeClient.questionData(slug) } }.awaitAll()
38+ }.filterNotNull()
39+
40+ logger.debug(" Questions: {}" , questions)
41+
42+ questions.forEach { question ->
43+ bot.reply(
44+ to = update.data,
45+ text = questionInfo(question),
46+ parseMode = MarkdownV2ParseMode ,
47+ )
48+ }
2549 }
2650
2751 private fun extractSlugs (message : Message ): List <String >? =
@@ -37,4 +61,14 @@ class LeetCodeUpdateProcessor : UpdateProcessor {
3761 }
3862 }
3963 }
64+
65+ private fun questionInfo (question : Question ): String {
66+ return """
67+ |${question.level()} *${question.title.escapeMarkdownV2Common()} * \(${question.categoryTitle} \) ${question.paidIndicator()}
68+ |
69+ |${question.markdownContent()}
70+ |
71+ |_Likes: ${question.likes} / Dislikes: ${question.dislikes} _
72+ """ .trimMargin()
73+ }
4074}
0 commit comments