Skip to content
This repository was archived by the owner on Nov 11, 2022. It is now read-only.

Commit 89e2df4

Browse files
authored
Merge pull request #37 from /issues/28
Fix #28: One does not simply walk into Mordor
2 parents 26cf5fe + b66f3af commit 89e2df4

File tree

10 files changed

+302
-1
lines changed

10 files changed

+302
-1
lines changed

README.adoc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,16 @@ Triggered by a pattern "Я и сам своего рода <кто-то>" or by
5252
+
5353
image::./demos/i'm something of a scientist myself ru.jpeg[]
5454

55+
https://knowyourmeme.com/memes/one-does-not-simply-walk-into-mordor[**One does not simply walk into Mordor**]::
56+
Triggered by a pattern "One does not simply <do something>" or by macro id: "Boromir: <do something>"
57+
+
58+
image::./demos/one does not simply walk into mordor.jpeg[]
59+
60+
https://knowyourmeme.com/memes/one-does-not-simply-walk-into-mordor[**One does not simply walk into Mordor (ru)**]::
61+
Triggered by a pattern "Нельзя просто так взять и <сделать что-то>" or by macro id: "Боромир: <сделать что-то>"
62+
+
63+
image::./demos/one does not simply walk into mordor ru.jpeg[]
64+
5565
== Running locally
5666

5767
. Define the required environment variables in `.env` file in the root of the project.

core/src/main/kotlin/me/madhead/imgmacrobot/core/generators/GoodGoodPalpatineRu.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import java.nio.file.Path
1010
import kotlin.io.path.ExperimentalPathApi
1111

1212
/**
13-
* Palpatine's reaction to the hate flowing through Luke Skywalker.
13+
* Palpatine's reaction to the hate flowing through Luke Skywalker (russian).
1414
*/
1515
@ExperimentalPathApi
1616
class GoodGoodPalpatineRu(
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package me.madhead.imgmacrobot.core.generators
2+
3+
import dev.inmo.tgbotapi.types.InlineQueries.abstracts.InlineQuery
4+
import io.micrometer.core.instrument.MeterRegistry
5+
import me.madhead.imgmacrobot.core.ParagraphsImageMacroGenerator
6+
import me.madhead.imgmacrobot.core.ParsedInlineQuery
7+
import me.madhead.imgmacrobot.core.dao.CachedInlineQueryResultDAO
8+
import me.madhead.imgmacrobot.imgur.Imgur
9+
import org.jetbrains.skija.Canvas
10+
import org.jetbrains.skija.Image
11+
import org.jetbrains.skija.paragraph.FontCollection
12+
import java.nio.file.Path
13+
import kotlin.io.path.ExperimentalPathApi
14+
15+
/**
16+
* Boromir knows the ways.
17+
*/
18+
@ExperimentalPathApi
19+
class OneDoesNotSimply(
20+
templatesDir: Path,
21+
imgur: Imgur,
22+
fontCollection: FontCollection,
23+
cachedInlineQueryResultDAO: CachedInlineQueryResultDAO,
24+
registry: MeterRegistry,
25+
) : ParagraphsImageMacroGenerator<OneDoesNotSimplyParsedInlineQuery>(
26+
templatesDir,
27+
"one does not simply walk into mordor.png",
28+
imgur,
29+
fontCollection,
30+
cachedInlineQueryResultDAO,
31+
registry,
32+
) {
33+
companion object {
34+
private val macroIdRegex = "boromir:(\\s*)(?<doWhat>.+)".toRegex(RegexOption.IGNORE_CASE)
35+
private val regex = "One +((does +not)|(doesn't)) +simply ++(?<doWhat>.+)".toRegex(RegexOption.IGNORE_CASE)
36+
}
37+
38+
override fun parseInlineQuery(inlineQuery: InlineQuery): OneDoesNotSimplyParsedInlineQuery? {
39+
return macroIdRegex.matchEntire(inlineQuery.query)?.groups?.get("doWhat")?.let { OneDoesNotSimplyParsedInlineQuery(it.value) }
40+
?: regex.matchEntire(inlineQuery.query)?.groups?.get("doWhat")?.let { OneDoesNotSimplyParsedInlineQuery(it.value) }
41+
}
42+
43+
override fun drawParagraphs(template: Image, canvas: Canvas, parsedInlineQuery: OneDoesNotSimplyParsedInlineQuery) {
44+
imageMacroParagraph(text = "ONE DOES NOT SIMPLY", size = 32F) {
45+
layout(template.width.toFloat())
46+
paint(canvas, @Suppress("MagicNumber") 0F, @Suppress("MagicNumber") 10F)
47+
}
48+
imageMacroParagraph(text = parsedInlineQuery.doWhat.toUpperCase(), size = 32F) {
49+
layout(@Suppress("MagicNumber") 0.9F * template.width.toFloat())
50+
paint(canvas, @Suppress("MagicNumber") 0.05F * template.width, template.height - @Suppress("MagicNumber") 10 - height)
51+
}
52+
}
53+
}
54+
55+
/**
56+
* [ParsedInlineQuery] implementation for [OneDoesNotSimply].
57+
*
58+
* @property doWhat one does not simply do what?
59+
*/
60+
data class OneDoesNotSimplyParsedInlineQuery(
61+
val doWhat: String
62+
) : ParsedInlineQuery {
63+
override val discriminator: String
64+
get() = doWhat
65+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package me.madhead.imgmacrobot.core.generators
2+
3+
import dev.inmo.tgbotapi.types.InlineQueries.abstracts.InlineQuery
4+
import io.micrometer.core.instrument.MeterRegistry
5+
import me.madhead.imgmacrobot.core.ParagraphsImageMacroGenerator
6+
import me.madhead.imgmacrobot.core.ParsedInlineQuery
7+
import me.madhead.imgmacrobot.core.dao.CachedInlineQueryResultDAO
8+
import me.madhead.imgmacrobot.imgur.Imgur
9+
import org.jetbrains.skija.Canvas
10+
import org.jetbrains.skija.Image
11+
import org.jetbrains.skija.paragraph.FontCollection
12+
import java.nio.file.Path
13+
import kotlin.io.path.ExperimentalPathApi
14+
15+
/**
16+
* Boromir knows the ways (russian).
17+
*/
18+
@ExperimentalPathApi
19+
class OneDoesNotSimplyRu(
20+
templatesDir: Path,
21+
imgur: Imgur,
22+
fontCollection: FontCollection,
23+
cachedInlineQueryResultDAO: CachedInlineQueryResultDAO,
24+
registry: MeterRegistry,
25+
) : ParagraphsImageMacroGenerator<OneDoesNotSimplyRuParsedInlineQuery>(
26+
templatesDir,
27+
"one does not simply walk into mordor.png",
28+
imgur,
29+
fontCollection,
30+
cachedInlineQueryResultDAO,
31+
registry,
32+
) {
33+
companion object {
34+
private val macroIdRegex = "боромир:(\\s*)(?<doWhat>.+)".toRegex(RegexOption.IGNORE_CASE)
35+
private val regex = "Нельзя +просто +так( +взять и)? ++(?<doWhat>.+)".toRegex(RegexOption.IGNORE_CASE)
36+
}
37+
38+
override fun parseInlineQuery(inlineQuery: InlineQuery): OneDoesNotSimplyRuParsedInlineQuery? {
39+
return macroIdRegex.matchEntire(inlineQuery.query)?.groups?.get("doWhat")?.let { OneDoesNotSimplyRuParsedInlineQuery(it.value) }
40+
?: regex.matchEntire(inlineQuery.query)?.groups?.get("doWhat")?.let { OneDoesNotSimplyRuParsedInlineQuery(it.value) }
41+
}
42+
43+
override fun drawParagraphs(template: Image, canvas: Canvas, parsedInlineQuery: OneDoesNotSimplyRuParsedInlineQuery) {
44+
imageMacroParagraph(text = "НЕЛЬЗЯ ПРОСТО ТАК ВЗЯТЬ И", size = 32F) {
45+
layout(template.width.toFloat())
46+
paint(canvas, @Suppress("MagicNumber") 0F, @Suppress("MagicNumber") 10F)
47+
}
48+
imageMacroParagraph(text = parsedInlineQuery.doWhat.toUpperCase(), size = 32F) {
49+
layout(@Suppress("MagicNumber") 0.9F * template.width.toFloat())
50+
paint(canvas, @Suppress("MagicNumber") 0.05F * template.width, template.height - @Suppress("MagicNumber") 10 - height)
51+
}
52+
}
53+
}
54+
55+
/**
56+
* [ParsedInlineQuery] implementation for [OneDoesNotSimplyRu].
57+
*
58+
* @property doWhat one does not simply do what?
59+
*/
60+
data class OneDoesNotSimplyRuParsedInlineQuery(
61+
val doWhat: String
62+
) : ParsedInlineQuery {
63+
override val discriminator: String
64+
get() = doWhat
65+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package me.madhead.imgmacrobot.core.generators
2+
3+
import dev.inmo.tgbotapi.types.ChatId
4+
import dev.inmo.tgbotapi.types.CommonUser
5+
import dev.inmo.tgbotapi.types.InlineQueries.abstracts.InlineQuery
6+
import dev.inmo.tgbotapi.types.InlineQueries.query.BaseInlineQuery
7+
import io.micrometer.core.instrument.simple.SimpleMeterRegistry
8+
import io.mockk.mockk
9+
import me.madhead.imgmacrobot.core.dao.CachedInlineQueryResultDAO
10+
import me.madhead.imgmacrobot.imgur.Imgur
11+
import org.jetbrains.skija.paragraph.FontCollection
12+
import org.junit.jupiter.api.Assertions
13+
import org.junit.jupiter.api.TestInstance
14+
import org.junit.jupiter.params.ParameterizedTest
15+
import org.junit.jupiter.params.provider.Arguments
16+
import org.junit.jupiter.params.provider.MethodSource
17+
import java.nio.file.Path
18+
import kotlin.io.path.ExperimentalPathApi
19+
20+
@ExperimentalPathApi
21+
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
22+
internal class OneDoesNotSimplyRuTest {
23+
private val templatesDir = mockk<Path>()
24+
private val imgur = mockk<Imgur>()
25+
private val fontCollection = mockk<FontCollection>()
26+
private val cachedInlineQueryResultDAO = mockk<CachedInlineQueryResultDAO>()
27+
private val registry = SimpleMeterRegistry()
28+
private val sut = OneDoesNotSimplyRu(templatesDir, imgur, fontCollection, cachedInlineQueryResultDAO, registry)
29+
30+
@ParameterizedTest
31+
@MethodSource("parseInlineQueryParams")
32+
fun parseInlineQuery(inlineQuery: InlineQuery, parsedInlineQuery: OneDoesNotSimplyRuParsedInlineQuery?) {
33+
val actual = sut.parseInlineQuery(inlineQuery)
34+
35+
Assertions.assertEquals(parsedInlineQuery, actual)
36+
}
37+
38+
@Suppress("unused")
39+
private fun parseInlineQueryParams(): List<Arguments> {
40+
val user = CommonUser(
41+
id = ChatId(0),
42+
firstName = "user"
43+
)
44+
45+
return listOf(
46+
Arguments.of(
47+
BaseInlineQuery(id = "", from = user, query = "боромир: пойти в Мордор", offset = ""),
48+
OneDoesNotSimplyRuParsedInlineQuery("пойти в Мордор")
49+
),
50+
Arguments.of(
51+
BaseInlineQuery(id = "", from = user, query = "боромир: \t пойти в Мордор", offset = ""),
52+
OneDoesNotSimplyRuParsedInlineQuery("пойти в Мордор")
53+
),
54+
Arguments.of(
55+
BaseInlineQuery(id = "", from = user, query = "Нельзя просто так взять и пойти в Мордор", offset = ""),
56+
OneDoesNotSimplyRuParsedInlineQuery("пойти в Мордор")
57+
),
58+
Arguments.of(
59+
BaseInlineQuery(id = "", from = user, query = "Нельзя просто так пойти в Мордор", offset = ""),
60+
OneDoesNotSimplyRuParsedInlineQuery("пойти в Мордор")
61+
),
62+
Arguments.of(
63+
BaseInlineQuery(id = "", from = user, query = "Бегите, глупцы!", offset = ""),
64+
null
65+
),
66+
)
67+
}
68+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package me.madhead.imgmacrobot.core.generators
2+
3+
import dev.inmo.tgbotapi.types.ChatId
4+
import dev.inmo.tgbotapi.types.CommonUser
5+
import dev.inmo.tgbotapi.types.InlineQueries.abstracts.InlineQuery
6+
import dev.inmo.tgbotapi.types.InlineQueries.query.BaseInlineQuery
7+
import io.micrometer.core.instrument.simple.SimpleMeterRegistry
8+
import io.mockk.mockk
9+
import me.madhead.imgmacrobot.core.dao.CachedInlineQueryResultDAO
10+
import me.madhead.imgmacrobot.imgur.Imgur
11+
import org.jetbrains.skija.paragraph.FontCollection
12+
import org.junit.jupiter.api.Assertions
13+
import org.junit.jupiter.api.TestInstance
14+
import org.junit.jupiter.params.ParameterizedTest
15+
import org.junit.jupiter.params.provider.Arguments
16+
import org.junit.jupiter.params.provider.MethodSource
17+
import java.nio.file.Path
18+
import kotlin.io.path.ExperimentalPathApi
19+
20+
@ExperimentalPathApi
21+
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
22+
internal class OneDoesNotSimplyTest {
23+
private val templatesDir = mockk<Path>()
24+
private val imgur = mockk<Imgur>()
25+
private val fontCollection = mockk<FontCollection>()
26+
private val cachedInlineQueryResultDAO = mockk<CachedInlineQueryResultDAO>()
27+
private val registry = SimpleMeterRegistry()
28+
private val sut = OneDoesNotSimply(templatesDir, imgur, fontCollection, cachedInlineQueryResultDAO, registry)
29+
30+
@ParameterizedTest
31+
@MethodSource("parseInlineQueryParams")
32+
fun parseInlineQuery(inlineQuery: InlineQuery, parsedInlineQuery: OneDoesNotSimplyParsedInlineQuery?) {
33+
val actual = sut.parseInlineQuery(inlineQuery)
34+
35+
Assertions.assertEquals(parsedInlineQuery, actual)
36+
}
37+
38+
@Suppress("unused")
39+
private fun parseInlineQueryParams(): List<Arguments> {
40+
val user = CommonUser(
41+
id = ChatId(0),
42+
firstName = "user"
43+
)
44+
45+
return listOf(
46+
Arguments.of(
47+
BaseInlineQuery(id = "", from = user, query = "boromir: walk into Mordor", offset = ""),
48+
OneDoesNotSimplyParsedInlineQuery("walk into Mordor")
49+
),
50+
Arguments.of(
51+
BaseInlineQuery(id = "", from = user, query = "boromir: \t walk into Mordor", offset = ""),
52+
OneDoesNotSimplyParsedInlineQuery("walk into Mordor")
53+
),
54+
Arguments.of(
55+
BaseInlineQuery(id = "", from = user, query = "One does not simply walk into Mordor", offset = ""),
56+
OneDoesNotSimplyParsedInlineQuery("walk into Mordor")
57+
),
58+
Arguments.of(
59+
BaseInlineQuery(id = "", from = user, query = "One doesn't simply walk into Mordor", offset = ""),
60+
OneDoesNotSimplyParsedInlineQuery("walk into Mordor")
61+
),
62+
Arguments.of(
63+
BaseInlineQuery(id = "", from = user, query = "Fly, you fools!", offset = ""),
64+
null
65+
),
66+
)
67+
}
68+
}
Lines changed: 3 additions & 0 deletions
Loading
Lines changed: 3 additions & 0 deletions
Loading

runners/ktor/src/main/kotlin/me/madhead/imgmacrobot/runner/ktor/koin/pipeline.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import me.madhead.imgmacrobot.core.generators.GoodGoodPalpatine
77
import me.madhead.imgmacrobot.core.generators.GoodGoodPalpatineRu
88
import me.madhead.imgmacrobot.core.generators.IronicPalpatine
99
import me.madhead.imgmacrobot.core.generators.IronicPalpatineRu
10+
import me.madhead.imgmacrobot.core.generators.OneDoesNotSimply
11+
import me.madhead.imgmacrobot.core.generators.OneDoesNotSimplyRu
1012
import me.madhead.imgmacrobot.core.generators.SomethingOfAScientist
1113
import me.madhead.imgmacrobot.core.generators.SomethingOfAScientistRu
1214
import me.madhead.imgmacrobot.core.generators.WhatIfIToldYou
@@ -97,6 +99,20 @@ val pipelineModule = module {
9799
get(),
98100
get<PrometheusMeterRegistry>()
99101
),
102+
OneDoesNotSimply(
103+
Path(get<ApplicationConfig>().property("templatesDir").getString()),
104+
get(),
105+
get(),
106+
get(),
107+
get<PrometheusMeterRegistry>()
108+
),
109+
OneDoesNotSimplyRu(
110+
Path(get<ApplicationConfig>().property("templatesDir").getString()),
111+
get(),
112+
get(),
113+
get(),
114+
get<PrometheusMeterRegistry>()
115+
),
100116
),
101117
get(),
102118
)
Lines changed: 3 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)