Skip to content

Commit 0020783

Browse files
committed
Process LeetCode links
1 parent b173dd6 commit 0020783

File tree

3 files changed

+85
-3
lines changed

3 files changed

+85
-3
lines changed

leetcode/src/main/kotlin/by/jprof/telegram/bot/leetcode/LeetCodeUpdateProcessor.kt

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,51 @@
11
package by.jprof.telegram.bot.leetcode
22

33
import by.jprof.telegram.bot.core.UpdateProcessor
4+
import dev.inmo.tgbotapi.bot.RequestsExecutor
5+
import dev.inmo.tgbotapi.extensions.api.send.reply
46
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextLinkTextSource
57
import dev.inmo.tgbotapi.types.MessageEntity.textsources.URLTextSource
8+
import dev.inmo.tgbotapi.types.ParseMode.MarkdownV2ParseMode
69
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
710
import dev.inmo.tgbotapi.types.message.abstracts.Message
811
import dev.inmo.tgbotapi.types.message.content.TextContent
912
import dev.inmo.tgbotapi.types.update.MessageUpdate
1013
import 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
1118
import 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
}

leetcode/src/main/kotlin/by/jprof/telegram/bot/leetcode/Question.kt

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package by.jprof.telegram.bot.leetcode
22

3+
import dev.inmo.tgbotapi.utils.extensions.escapeMarkdownV2Common
34
import kotlinx.serialization.Serializable
45

56
@Serializable
@@ -12,4 +13,50 @@ data class Question(
1213
val likes: Int,
1314
val dislikes: Int,
1415
val categoryTitle: String,
15-
)
16+
) {
17+
fun level(): String = when (this.difficulty) {
18+
"Easy" -> "\uD83E\uDD64"
19+
"Medium" -> "\uD83E\uDD14"
20+
"Hard" -> "\uD83E\uDD18"
21+
else -> ""
22+
}
23+
24+
fun paidIndicator() = if (isPaidOnly) {
25+
"\uD83E\uDD11"
26+
} else {
27+
""
28+
}
29+
30+
fun markdownContent(): String = this.content
31+
.replace("&nbsp;", " ")
32+
.replace("&lt;", "<")
33+
.replace("&gt;", ">")
34+
.replace(Regex("<sup>(?<sup>.+?)</sup>")) {
35+
"^${it.groups["sup"]!!.value}"
36+
}
37+
38+
.escapeMarkdownV2Common()
39+
40+
.replace("<code\\>", "`")
41+
.replace("</code\\>", "`")
42+
43+
.replace("<pre\\>", "```")
44+
.replace("</pre\\>", "```")
45+
46+
.replace("<strong\\>", "*")
47+
.replace("</strong\\>", "*")
48+
49+
.replace("<em\\>", "_")
50+
.replace("</em\\>", "_")
51+
52+
.replace("<li\\>", "")
53+
.replace("</li\\>", "")
54+
55+
.replace("<p\\>", "")
56+
.replace("</p\\>", "")
57+
.replace("<ul\\>", "")
58+
.replace("</ul\\>", "")
59+
60+
.replace("\\n", "\n")
61+
.replace("\\t", "\t")
62+
}

runners/lambda/src/main/kotlin/by/jprof/telegram/bot/runners/lambda/config/pipeline.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ val pipelineModule = module {
134134

135135
single<UpdateProcessor>(named("LeetCodeUpdateProcessor")) {
136136
LeetCodeUpdateProcessor(
137+
bot = get(),
137138
)
138139
}
139140
}

0 commit comments

Comments
 (0)