From 95c66855b0ff7ffc7cf525269eb7bfbcdb1e9dbf Mon Sep 17 00:00:00 2001 From: Liplum Date: Thu, 7 Dec 2023 15:06:32 +0800 Subject: [PATCH] using reference for WelcomeScene, WelcomeCondition, and WelcomeAction --- assets/welcomes/en.properties | 6 +- assets/welcomes/ja.properties | 6 +- assets/welcomes/ru.properties | 6 +- assets/welcomes/uk_UA.properties | 6 +- assets/welcomes/zh_CN.properties | 6 +- .../src/net/liplum/common/ui/RateStarPanel.kt | 11 +- main/src/net/liplum/ui/CioUI.kt | 17 +- main/src/net/liplum/welcome/ActionRegistry.kt | 41 ----- main/src/net/liplum/welcome/Actions.kt | 71 -------- main/src/net/liplum/welcome/Condition.kt | 42 ----- main/src/net/liplum/welcome/SharedUI.kt | 19 +-- .../net/liplum/welcome/TemplateRegistry.kt | 40 ----- main/src/net/liplum/welcome/Templates.kt | 158 ------------------ main/src/net/liplum/welcome/Welcome.kt | 68 ++++---- main/src/net/liplum/welcome/WelcomeActions.kt | 72 ++++++++ .../{Conditions.kt => WelcomeConditions.kt} | 33 ++-- main/src/net/liplum/welcome/WelcomeScene.kt | 75 +++++++-- .../net/liplum/welcome/WelcomeTemplates.kt | 155 +++++++++++++++++ main/src/net/liplum/welcome/Welcomes.kt | 82 ++++----- 19 files changed, 396 insertions(+), 518 deletions(-) delete mode 100644 main/src/net/liplum/welcome/ActionRegistry.kt delete mode 100644 main/src/net/liplum/welcome/Actions.kt delete mode 100644 main/src/net/liplum/welcome/Condition.kt delete mode 100644 main/src/net/liplum/welcome/TemplateRegistry.kt delete mode 100644 main/src/net/liplum/welcome/Templates.kt create mode 100644 main/src/net/liplum/welcome/WelcomeActions.kt rename main/src/net/liplum/welcome/{Conditions.kt => WelcomeConditions.kt} (52%) create mode 100644 main/src/net/liplum/welcome/WelcomeTemplates.kt diff --git a/assets/welcomes/en.properties b/assets/welcomes/en.properties index 6df7ef22..03080c88 100644 --- a/assets/welcomes/en.properties +++ b/assets/welcomes/en.properties @@ -17,9 +17,9 @@ Discord.no=Mark as Junk UpdateECHO.title=Update ECHO UpdateECHO=News: Recently, the ECHO has published a new version {0}.\n\ You can click the button below to update your ECHO terminal. -UpdateECHO.button-a=[accent]Update[] -UpdateECHO.button-b=Not Now -UpdateECHO.button-c=Skip This +UpdateECHO.update=[accent]Update[] +UpdateECHO.no=Not Now +UpdateECHO.skip-this=Skip This UpdateECHO.break-update-warning=Warning: The latest version is a break update, so it may make your saves corrupted. Be careful! #v2 EmploymentVerification.title=Employment Verification diff --git a/assets/welcomes/ja.properties b/assets/welcomes/ja.properties index b579b29d..670505bb 100644 --- a/assets/welcomes/ja.properties +++ b/assets/welcomes/ja.properties @@ -17,9 +17,9 @@ Discord.no=\u30B8\u30E3\u30F3\u30AF\u3068\u3057\u3066\u30DE\u30FC\u30AF UpdateECHO.title=\uFF25\uFF23\uFF28\uFF2F\u3092\u66F4\u65B0\u3059\u308B UpdateECHO=News: \u6700\u8FD1\u3001\uFF25\uFF23\uFF28\uFF2F\u306F\u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u516C\u958B\u3057\u307E\u3057\u305F {0}\u3002\n\ \u4E0B\u306E\u30DC\u30BF\u30F3\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u3001\uFF25\uFF23\uFF28\uFF2F\u7AEF\u672B\u3092\u66F4\u65B0\u3067\u304D\u307E\u3059\u3002 -UpdateECHO.button-a=\u66F4\u65B0\u3059\u308B -UpdateECHO.button-b=\u4ECA\u306F\u3084\u3081\u308D -UpdateECHO.button-c=\u8868\u793A\u3057\u306A\u3044 +UpdateECHO.update=\u66F4\u65B0\u3059\u308B +UpdateECHO.no=\u4ECA\u306F\u3084\u3081\u308D +UpdateECHO.skip-this=\u8868\u793A\u3057\u306A\u3044 #v2 EmploymentVerification.title=\u96C7\u7528\u78BA\u8A8D EmploymentVerification=\u300APlum Star Inc.\u300B\u306B\u3088\u3046\u3053\u305D\u3002\u6B64\u306E\u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3\u306E\u5B8C\u5168\u306A\u30B5\u30A4\u30D0\u30CD\u30C6\u30A3\u30C3\u30AF\u30B9\u3092\u304A\u697D\u3057\u307F\u304F\u3060\u3055\u3044\uFF01\n\ diff --git a/assets/welcomes/ru.properties b/assets/welcomes/ru.properties index 5849a96f..cb6cf0fd 100644 --- a/assets/welcomes/ru.properties +++ b/assets/welcomes/ru.properties @@ -17,9 +17,9 @@ Discord.no=\u041E\u0442\u043C\u0435\u0442\u0438\u0442\u044C \u043A\u0430\u043A \ UpdateECHO.title=\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u042D\u0425\u041E UpdateECHO=\u041D\u043E\u0432\u043E\u0441\u0442\u0438: \u041D\u0435\u0434\u0430\u0432\u043D\u043E ECHO \u043E\u043F\u0443\u0431\u043B\u0438\u043A\u043E\u0432\u0430\u043B\u043E \u043D\u043E\u0432\u0443\u044E \u0432\u0435\u0440\u0441\u0438\u044E {0}.\n\ \u0412\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043D\u0430\u0436\u0430\u0442\u044C \u043A\u043D\u043E\u043F\u043A\u0443 \u043D\u0438\u0436\u0435, \u0447\u0442\u043E\u0431\u044B \u043E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0441\u0432\u043E\u0439 \u0442\u0435\u0440\u043C\u0438\u043D\u0430\u043B ECHO. -UpdateECHO.button-a=\u041E\u0431\u043D\u043E\u0432\u043B\u044F\u0442\u044C -UpdateECHO.button-b=\u041D\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 -UpdateECHO.button-c=\u0411\u043E\u043B\u044C\u0448\u0435 \u043D\u0435 \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C +UpdateECHO.update=\u041E\u0431\u043D\u043E\u0432\u043B\u044F\u0442\u044C +UpdateECHO.no=\u041D\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 +UpdateECHO.skip-this=\u0411\u043E\u043B\u044C\u0448\u0435 \u043D\u0435 \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C #v2 EmploymentVerification.title=\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0437\u0430\u043D\u044F\u0442\u043E\u0441\u0442\u0438 EmploymentVerification=\u041F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u044F\u0439\u0442\u0435\u0441\u044C \u043A \u043D\u0430\u043C, Plum Star Inc., \u043D\u0430\u0441\u043B\u0430\u0436\u0434\u0430\u0439\u0442\u0435\u0441\u044C \u044D\u0442\u043E\u0439 \u043D\u043E\u0432\u043E\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u043F\u043E\u043B\u043D\u043E\u0439 \u043A\u0438\u0431\u0435\u0440\u043D\u0435\u0442\u0438\u043A\u0438!\n\ diff --git a/assets/welcomes/uk_UA.properties b/assets/welcomes/uk_UA.properties index c4f75dda..88dfecfa 100644 --- a/assets/welcomes/uk_UA.properties +++ b/assets/welcomes/uk_UA.properties @@ -17,9 +17,9 @@ Discord.no=\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 UpdateECHO.title=\u041E\u043D\u043E\u0432\u0438\u0442\u0438 ECHO UpdateECHO=\u041D\u043E\u0432\u0438\u043D\u0438: \u043D\u0435\u0449\u043E\u0434\u0430\u0432\u043D\u043E ECHO \u043E\u043F\u0443\u0431\u043B\u0456\u043A\u0443\u0432\u0430\u043B\u0438 \u043D\u043E\u0432\u0443 \u0432\u0435\u0440\u0441\u0456\u044E: {0}.\n\ \u0412\u0438 \u043C\u043E\u0436\u0435\u0442\u0435 \u043D\u0430\u0442\u0438\u0441\u043D\u0443\u0442\u0438 \u043A\u043D\u043E\u043F\u043A\u0443 \u043D\u0438\u0436\u0447\u0435, \u0449\u043E\u0431 \u043E\u043D\u043E\u0432\u0438\u0442\u0438 \u0442\u0435\u0440\u043C\u0456\u043D\u0430\u043B ECHO. -UpdateECHO.button-a=\u041E\u043D\u043E\u0432\u0438\u0442\u0438 -UpdateECHO.button-b=\u041D\u0435 \u0437\u0430\u0440\u0430\u0437 -UpdateECHO.button-c=\u041D\u0435 \u043F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 +UpdateECHO.update=\u041E\u043D\u043E\u0432\u0438\u0442\u0438 +UpdateECHO.no=\u041D\u0435 \u0437\u0430\u0440\u0430\u0437 +UpdateECHO.skip-this=\u041D\u0435 \u043F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 #v2 EmploymentVerification.title=\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F \u043F\u0440\u0430\u0446\u0435\u0432\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F EmploymentVerification=\u041B\u0430\u0441\u043A\u0430\u0432\u043E \u043F\u0440\u043E\u0441\u0438\u043C\u043E \u0434\u043E \u043D\u0430\u0441, \u00AB\u041F\u043B\u044E\u043C \u0421\u0442\u0430\u0440 \u0406\u043D\u043A\u043E\u0440\u043F\u043E\u0440\u0435\u0439\u0448\u043D\u00BB, \u043D\u0430\u0441\u043E\u043B\u043E\u0434\u0436\u0443\u0439\u0442\u0435\u0441\u044C \u0446\u0456\u0454\u044E \u043D\u043E\u0432\u043E\u044E \u0432\u0435\u0440\u0441\u0456\u0454\u044E, \u0449\u043E \u0441\u043F\u043E\u0432\u043D\u0435\u043D\u0430 \u043A\u0443\u043F\u043E\u044E \u043A\u0456\u0431\u0435\u0440\u043D\u0435\u0442\u0438\u0447\u043D\u0438\u0445 \u0440\u0435\u0447\u0435\u0439!\n\ diff --git a/assets/welcomes/zh_CN.properties b/assets/welcomes/zh_CN.properties index 3bcd9871..e35e50e2 100644 --- a/assets/welcomes/zh_CN.properties +++ b/assets/welcomes/zh_CN.properties @@ -17,9 +17,9 @@ Discord.no=\u6807\u8BB0\u4E3A\u5783\u573E\u5185\u5BB9 UpdateECHO.title=\u66F4\u65B0\u201C\u98DE\u58F0\u201D UpdateECHO=News: \u6700\u8FD1\uFF0C\u201C\u98DE\u58F0\u201D\u7EC8\u7AEF\u63A8\u51FA\u4E86\u65B0\u7248\u672C{0}\u3002\n\ \u4F60\u53EF\u4EE5\u70B9\u51FB\u4E0B\u9762\u7684\u6309\u94AE\u66F4\u65B0\u4F60\u7684\u7EC8\u7AEF -UpdateECHO.button-a=[accent]\u66F4\u65B0[] -UpdateECHO.button-b=\u4EE5\u540E\u63D0\u9192\u6211 -UpdateECHO.button-c=\u4E0D\u518D\u663E\u793A +UpdateECHO.update=[accent]\u66F4\u65B0[] +UpdateECHO.no=\u4EE5\u540E\u63D0\u9192\u6211 +UpdateECHO.skip-this=\u4E0D\u518D\u663E\u793A UpdateECHO.break-update-warning=\u8B66\u544A\uFF1A\u6700\u65B0\u7248\u672C\u7684\u66F4\u65B0\u5DF2\u635F\u574F\uFF0C\u53EF\u80FD\u4F1A\u5BFC\u81F4\u5B58\u6863\u9519\u8BEF\u3002\u8BF7\u52A1\u5FC5\u8C28\u614E\uFF01 #v2 EmploymentVerification.title=\u9A8C\u8BC1\u96C7\u4F63\u72B6\u6001 diff --git a/common/src/net/liplum/common/ui/RateStarPanel.kt b/common/src/net/liplum/common/ui/RateStarPanel.kt index e59710df..86b483b2 100644 --- a/common/src/net/liplum/common/ui/RateStarPanel.kt +++ b/common/src/net/liplum/common/ui/RateStarPanel.kt @@ -5,11 +5,12 @@ import arc.scene.ui.ImageButton import arc.scene.ui.layout.Table import plumy.core.assets.TR -class RateStarPanelBuilder { - var starNumber = 5 - var starSize = 50f - var inactiveStar: TR = TR() - var activeStar: TR = TR() +class RateStarPanelBuilder( + val starNumber: Int = 5, + val starSize: Float = 50f, + val activeStar: TR = TR(), + val inactiveStar: TR = TR(), +) { inline fun build( crossinline onRate: (Int) -> Unit = {}, ): Table = Table().apply { diff --git a/main/src/net/liplum/ui/CioUI.kt b/main/src/net/liplum/ui/CioUI.kt index 2e28781c..3e8201f4 100644 --- a/main/src/net/liplum/ui/CioUI.kt +++ b/main/src/net/liplum/ui/CioUI.kt @@ -31,8 +31,8 @@ import net.liplum.ui.settings.SliderSettingX.Companion.addSliderSettingX import net.liplum.update.Updater import net.liplum.utils.IsLocal import net.liplum.utils.safeCall -import net.liplum.welcome.Conditions import net.liplum.welcome.Welcome +import net.liplum.welcome.WelcomeConditions import net.liplum.welcome.Welcomes import net.liplum.welcome.findAll import plumy.core.ClientOnly @@ -167,19 +167,18 @@ object CioUI { Updater.accessJob?.join() if (!failed) { if (Updater.requireUpdate) { - val updateTips = Welcomes.findAll { tip -> - tip.condition == Conditions.CheckUpdate + val updateScenes = Welcomes.findAll { tip -> + tip.condition == WelcomeConditions.CheckUpdate } - if (updateTips.isEmpty()) { + if (updateScenes.isEmpty()) { ShowTextDialog(bundle("not-support")) } else { - val updateTip = updateTips.randomExcept(atLeastOne = true) { + val updateScene = updateScenes.randomExcept(atLeastOne = true) { id != Settings.LastWelcomeID } - if (updateTip != null) - Welcome.genEntity().apply { - tip = updateTip - }.showTip() + Welcomes.updateECHO + if (updateScene != null) + Welcome.createEntity(updateScene).showTip() else ShowTextDialog(bundle("not-support")) } diff --git a/main/src/net/liplum/welcome/ActionRegistry.kt b/main/src/net/liplum/welcome/ActionRegistry.kt deleted file mode 100644 index 5727dd08..00000000 --- a/main/src/net/liplum/welcome/ActionRegistry.kt +++ /dev/null @@ -1,41 +0,0 @@ -package net.liplum.welcome - -import net.liplum.welcome.ActionRegistry.register - -object ActionRegistry { - val actions: MutableMap = HashMap() - operator fun get(id: String) = - actions[id] ?: Action.Default - - operator fun get(id: Any?) = - (id as? String)?.let { actions[it] } ?: Action.Default - - operator fun set(id: String, action: Action) { - actions[id] = action - } - - fun T.register(): T { - this@ActionRegistry[id] = this - return this - } -} - -abstract class Action( - val id: String, -) { - init { - this.register() - } - - abstract fun doAction(entity: Welcome.Entity) - operator fun invoke(entity: Welcome.Entity) { - doAction(entity) - } - - companion object { - val Default = object : Action("Default") { - override fun doAction(entity: Welcome.Entity) { - } - } - } -} diff --git a/main/src/net/liplum/welcome/Actions.kt b/main/src/net/liplum/welcome/Actions.kt deleted file mode 100644 index 40a1dde8..00000000 --- a/main/src/net/liplum/welcome/Actions.kt +++ /dev/null @@ -1,71 +0,0 @@ -package net.liplum.welcome - -import arc.Core -import net.liplum.CLog -import net.liplum.Settings -import net.liplum.Var -import net.liplum.ui.Navigator -import net.liplum.update.Updater - -object Actions { - val OpenLink = object : Action("OpenLink") { - override fun doAction(entity: Welcome.Entity) { - val data = entity.tip.data - var link = data["Link"] as? String - if (link != null) { - link = if (link.startsWith('@')) - entity[link.substring(1)] - else - link - Core.app.openURI(link) - } - } - } - val CloseReceiveWelcome = object : Action("StopReceiveWelcome") { - override fun doAction(entity: Welcome.Entity) { - Settings.ShouldShowWelcome = false - } - } - val StopCheckUpdate = object : Action("StopCheckUpdate") { - override fun doAction(entity: Welcome.Entity) { - Settings.ShowUpdate = false - } - } - val SkipThisUpdate = object : Action("SkipThisUpdate") { - override fun doAction(entity: Welcome.Entity) { - val latest = Updater.latestVersion - Settings.LastSkippedUpdate = latest.toString() - } - } - val UpdateCyberIO = object : Action("UpdateCyberIO") { - override fun doAction(entity: Welcome.Entity) { - Updater.Release.update() - } - } - val CallStaticFunction = object : Action("CallStaticFunction") { - override fun doAction(entity: Welcome.Entity) { - val data = entity.tip.data - val clzName = data["ClassFullName"] as? String - val funcName = data["StaticFunctionName"] as? String - if (clzName != null && funcName != null) { - try { - val clz = Class.forName(clzName) - val method = clz.getMethod(funcName) - method.invoke(null) - } catch (e: Exception) { - CLog.err("In action [$id]", e) - } - } - } - } - val Navigation = object : Action("Navigation") { - override fun doAction(entity: Welcome.Entity) { - val data = entity.tip.data - val locatorText = data["Locator"] as? String - if (locatorText != null) { - val locator = Navigator.by(locatorText) - Var.Navigation.navigate(locator) - } - } - } -} \ No newline at end of file diff --git a/main/src/net/liplum/welcome/Condition.kt b/main/src/net/liplum/welcome/Condition.kt deleted file mode 100644 index c5651409..00000000 --- a/main/src/net/liplum/welcome/Condition.kt +++ /dev/null @@ -1,42 +0,0 @@ -package net.liplum.welcome - -import net.liplum.welcome.ConditionRegistry.register - -object ConditionRegistry { - val conditions: MutableMap = HashMap() - operator fun get(id: String) = - conditions[id] ?: Condition.Default - - operator fun get(id: Any?) = - (id as? String)?.let { conditions[it] } ?: Condition.Default - - operator fun set(id: String, condition: Condition) { - conditions[id] = condition - } - - fun T.register(): T { - this@ConditionRegistry[id] = this - return this - } -} - -abstract class Condition( - val id: String, -) { - init { - this.register() - } - - abstract fun canShow(tip: WelcomeScene): Boolean - abstract fun priority(tip: WelcomeScene): Int - - companion object { - val Default = object : Condition("Default") { - override fun canShow(tip: WelcomeScene): Boolean { - return false - } - - override fun priority(tip: WelcomeScene) = Int.MIN_VALUE - } - } -} \ No newline at end of file diff --git a/main/src/net/liplum/welcome/SharedUI.kt b/main/src/net/liplum/welcome/SharedUI.kt index ffa6fe8a..b1a11540 100644 --- a/main/src/net/liplum/welcome/SharedUI.kt +++ b/main/src/net/liplum/welcome/SharedUI.kt @@ -7,14 +7,13 @@ import arc.scene.ui.Label import arc.scene.ui.TextButton import arc.scene.ui.layout.Cell import arc.scene.ui.layout.Table -import arc.scene.utils.Elem import arc.util.Scaling import mindustry.gen.Tex import net.liplum.Meta import net.liplum.Var import net.liplum.i18nName -import plumy.core.assets.TR import plumy.core.DesktopOnly +import plumy.core.assets.TR internal fun Dialog.addPoster( icon: TR, @@ -35,7 +34,7 @@ internal fun Dialog.addPoster( return img } -internal fun Dialog.addPoliteWelcome(entity: Welcome.Entity) { +internal fun Dialog.addPoliteWelcome(entity: WelcomeEntity) { addCenterText( entity.bundle.format( "welcome", @@ -79,22 +78,12 @@ internal fun Dialog.addBoxedText( internal inline fun Dialog.addCloseButton( text: String, table: Table = this.cont, + width: Float = 200f, crossinline task: () -> Unit = {}, ): Cell { return table.button(text) { Welcome.recordClick() task() hide() - }.size(200f, 50f) -} - -internal inline fun Dialog.createCloseButton( - text: String, - crossinline task: () -> Unit = {}, -): TextButton { - return Elem.newButton(text) { - Welcome.recordClick() - task() - hide() - } + }.size(width, 50f) } diff --git a/main/src/net/liplum/welcome/TemplateRegistry.kt b/main/src/net/liplum/welcome/TemplateRegistry.kt deleted file mode 100644 index 0afe878a..00000000 --- a/main/src/net/liplum/welcome/TemplateRegistry.kt +++ /dev/null @@ -1,40 +0,0 @@ -package net.liplum.welcome - -import arc.scene.ui.Dialog -import mindustry.ui.dialogs.BaseDialog -import net.liplum.welcome.TemplateRegistry.register - -object TemplateRegistry { - val templates: MutableMap = HashMap() - operator fun get(id: String) = - templates[id] ?: WelcomeTemplate.Default - - operator fun set(id: String, template: WelcomeTemplate) { - templates[id] = template - } - - fun T.register(): T { - this@TemplateRegistry[id] = this - return this - } -} - -abstract class WelcomeTemplate( - val id: String, -) { - init { - this.register() - } - - abstract fun gen(entity: Welcome.Entity): Dialog - - companion object { - val Default = object : WelcomeTemplate("Default") { - override fun gen(entity: Welcome.Entity) = - BaseDialog(entity.bundle["Default.title"]).apply { - cont.add(entity.bundle["Default"]) - addCloseButton() - } - } - } -} diff --git a/main/src/net/liplum/welcome/Templates.kt b/main/src/net/liplum/welcome/Templates.kt deleted file mode 100644 index c81f1ef7..00000000 --- a/main/src/net/liplum/welcome/Templates.kt +++ /dev/null @@ -1,158 +0,0 @@ -package net.liplum.welcome - -import arc.scene.ui.Button -import mindustry.ui.dialogs.BaseDialog -import net.liplum.R -import net.liplum.Var -import plumy.core.arc.tinted -import net.liplum.common.ui.RateStarPanelBuilder -import net.liplum.update.Updater -import net.liplum.welcome.Welcome.Entity -import net.liplum.welcome.Welcome.handleTrRefer - -object Templates { - val Story = object : WelcomeTemplate("Story") { - override fun gen(entity: Entity) = - BaseDialog(entity["title"]).apply { - addCloseListener() - val data = entity.tip.data - addPoster(entity.icon) - val showPoliteWelcome = data["ShowPoliteWelcome"] as? Boolean ?: true - if (showPoliteWelcome) addPoliteWelcome(entity) - addCenterText(entity.content) - addCloseButton(entity["read"]) - } - } - val ButtonABC = object : WelcomeTemplate("ButtonABC") { - override fun gen(entity: Entity) = - BaseDialog(entity["title"]).apply { - addCloseListener() - val data = entity.tip.data - val yesAction = ActionRegistry[data["ActionA"]] - val noAction = ActionRegistry[data["ActionB"]] - val dontShowAction = ActionRegistry[data["ActionC"]] - val showPoliteWelcome = data["ShowPoliteWelcome"] as? Boolean ?: true - addPoster(entity.icon) - if (showPoliteWelcome) addPoliteWelcome(entity) - cont.table { - addCloseButton(entity["button-a"], it) { - yesAction(entity) - }.size(150f, 50f) - addCloseButton(entity["button-b"], it) { - noAction(entity) - }.size(150f, 50f) - addCloseButton(entity["button-c"], it) { - dontShowAction(entity) - }.size(150f, 50f) - }.growX() - .row() - } - } - val DoAction = object : WelcomeTemplate("DoAction") { - override fun gen(entity: Entity) = - BaseDialog(entity["title"]).apply { - addCloseListener() - val data = entity.tip.data - addPoster(entity.icon) - val showPoliteWelcome = data["ShowPoliteWelcome"] as? Boolean ?: false - if (showPoliteWelcome) addPoliteWelcome(entity) - val yesAction = ActionRegistry[data["YesAction"]] - val noAction = ActionRegistry[data["NoAction"]] - addCenterText(entity.content) - cont.table { - fun addButton(vararg buttons: Button) { - for (b in buttons) - it.add(b).size(200f, 50f) - } - - val yes = createCloseButton(entity["yes"]) { - yesAction(entity) - } - val no = createCloseButton(entity["no"]) { - noAction(entity) - } - addButton(yes, no) - }.growX() - .row() - } - } - val TextIcon = object : WelcomeTemplate("TextIcon") { - override fun gen(entity: Entity) = - BaseDialog(entity["title"]).apply { - addCloseListener() - val data = entity.tip.data - val text = data["Text"] as? String ?: "" - val fontSize = data["FontSize"] as? Float ?: 1f - val resText = entity.bundle.handleRefer(text) - addCenterText(resText).get().apply { - this.setFontScale(fontSize) - } - val showPoliteWelcome = data["ShowPoliteWelcome"] as? Boolean ?: true - if (showPoliteWelcome) addPoliteWelcome(entity) - addCenterText(entity.content) - addCloseButton(entity["read"]) - } - } - val PlainText = object : WelcomeTemplate("PlainText") { - override fun gen(entity: Entity) = - BaseDialog(entity["title"]).apply { - addCloseListener() - val data = entity.tip.data - val showPoliteWelcome = data["ShowPoliteWelcome"] as? Boolean ?: true - if (showPoliteWelcome) addPoliteWelcome(entity) - val fontSize = data["FontSize"] as? Float ?: 1f - addCenterText(entity.content).pad(40f).get().apply { - this.setFontScale(fontSize) - } - addCloseButton(entity["read"]) - } - } - val rateStar = object : WelcomeTemplate("RateStar") { - override fun gen(entity: Entity) = - BaseDialog(entity["title"]).apply { - addCloseListener() - val data = entity.tip.data - addPoster(entity.icon) - val showPoliteWelcome = data["ShowPoliteWelcome"] as? Boolean ?: true - if (showPoliteWelcome) addPoliteWelcome(entity) - addCenterText(entity.content) - val starSize = data["StarSize"] as? Float ?: 50f - val ratePanel = RateStarPanelBuilder().apply { - starNumber = 5 - this.starSize = starSize - (data["InactiveStarIconPath"] as? String)?.let { inactiveStar = it.handleTrRefer() } - (data["ActiveStarIconPath"] as? String)?.let { activeStar = it.handleTrRefer() } - }.build() - cont.add(ratePanel).row() - addCloseButton(entity["submit"]) - } - } - val Update = object : WelcomeTemplate("Update") { - override fun gen(entity: Entity) = - BaseDialog(entity["title"]).apply { - addCloseListener() - val data = entity.tip.data - val yesAction = ActionRegistry[data["ActionA"]] - val noAction = ActionRegistry[data["ActionB"]] - val dontShowAction = ActionRegistry[data["ActionC"]] - addPoster(entity.icon) - addCenterText(entity.content(Updater.latestVersion.toString().tinted(Var.Hologram))) - if (Updater.isCurrentBreakUpdate) - addCenterText(entity["break-update-warning"]).color(R.C.RedAlert) - if (Updater.hasUpdateDescription) - addBoxedText(Updater.UpdateDescription) - cont.table { - addCloseButton(entity["button-a"], it) { - yesAction(entity) - }.size(150f, 50f) - addCloseButton(entity["button-b"], it) { - noAction(entity) - }.size(150f, 50f) - addCloseButton(entity["button-c"], it) { - dontShowAction(entity) - }.size(150f, 50f) - }.growX() - .row() - } - } -} \ No newline at end of file diff --git a/main/src/net/liplum/welcome/Welcome.kt b/main/src/net/liplum/welcome/Welcome.kt index 68449566..641a97dc 100644 --- a/main/src/net/liplum/welcome/Welcome.kt +++ b/main/src/net/liplum/welcome/Welcome.kt @@ -21,6 +21,7 @@ import net.liplum.common.util.allMaxBy import net.liplum.common.util.randomExcept import net.liplum.event.CioInitEvent import net.liplum.math.randomByWeights +import net.liplum.welcome.Welcome.handleTrRefer import plumy.core.ClientOnly import plumy.core.assets.TR import plumy.dsl.sprite @@ -29,18 +30,12 @@ import plumy.dsl.sprite object Welcome { var bundle = ReferBundleWrapper.create() private var version = WelcomeScenePacks.v5_1 - fun genEntity() = Entity(bundle, version) - private var entity = genEntity() - private var showWelcome = false @JvmStatic @ClientOnly fun showWelcomeDialog() { checkLastVersion() - judgeWelcome() - if (showWelcome) { - entity.showTip() - } + judgeWelcome()?.showTip() //For debug /*val tip = WelcomeList.find { it.id == "SetOutErekir" } tip?.condition?.canShow(tip)*/ @@ -48,13 +43,12 @@ object Welcome { } @JvmStatic - fun judgeWelcome() { + fun judgeWelcome(): WelcomeEntity? { val allTips = version.scenes.distinct().toList() val tipsCanShow = allTips.filter { it.condition.canShow(it) } val allCandidates = tipsCanShow.allMaxBy { it.condition.priority(it) } if (allCandidates.isEmpty()) { - showWelcome = false - return + return null } var sumChance = 0 val weights = IntArray(allCandidates.size) { @@ -72,9 +66,13 @@ object Welcome { } if (res != null) { LastWelcomeID = res.id - entity.tip = res - showWelcome = true + return createEntity(res) } + return null + } + + fun createEntity(scene: WelcomeScene): WelcomeEntity { + return WelcomeEntity(bundle, version, scene) } @JvmStatic @@ -111,9 +109,9 @@ object Welcome { fun load() { loadBundle() //To load all templates and actions - Templates - Actions - Conditions + WelcomeTemplates + WelcomeActions + WelcomeConditions } @JvmStatic @@ -128,34 +126,26 @@ object Welcome { if (startsWith('@')) removePrefix("@").sprite else cio.sprite +} - class Entity( - val bundle: ReferBundleWrapper, - val info: WelcomeScenePack, - ) { - var tip: WelcomeScene = WelcomeScene.Default - operator fun get(key: String) = - bundle["$tip.$key"] - - val content: String - get() = bundle["$tip"] +class WelcomeEntity( + val bundle: ReferBundleWrapper, + val info: WelcomeScenePack, + val scene: WelcomeScene, +) { + operator fun get(key: String) = + bundle["$scene.$key"] - fun content(vararg args: Any): String = - bundle.format("$tip", *args) + val content: String + get() = bundle["$scene"] - val icon: TR - get() = tip.iconPath.handleTrRefer() + fun content(vararg args: Any): String = + bundle.format("$scene", *args) - fun showTip() { - tip.template.gen(this).show() - } + val icon: TR + get() = scene.iconPath.handleTrRefer() - companion object { - fun Entity.showTipByID(id: String): Entity { - tip = Welcomes[id] - showTip() - return this - } - } + fun showTip() { + scene.template.gen(this).show() } } diff --git a/main/src/net/liplum/welcome/WelcomeActions.kt b/main/src/net/liplum/welcome/WelcomeActions.kt new file mode 100644 index 00000000..b3e00c7c --- /dev/null +++ b/main/src/net/liplum/welcome/WelcomeActions.kt @@ -0,0 +1,72 @@ +package net.liplum.welcome + +import arc.Core +import net.liplum.CLog +import net.liplum.Settings +import net.liplum.Var +import net.liplum.ui.Navigator +import net.liplum.update.Updater + +object WelcomeActions { + class OpenLink( + val link: String, + ) : WelcomeAction() { + override fun doAction(entity: WelcomeEntity) { + var link = this.link + link = if (link.startsWith('@')) + entity[link.substring(1)] + else + link + Core.app.openURI(link) + } + } + + object StopReceiveWelcome : WelcomeAction() { + override fun doAction(entity: WelcomeEntity) { + Settings.ShouldShowWelcome = false + } + } + + object StopCheckUpdate : WelcomeAction() { + override fun doAction(entity: WelcomeEntity) { + Settings.ShowUpdate = false + } + } + + object SkipThisUpdate : WelcomeAction() { + override fun doAction(entity: WelcomeEntity) { + val latest = Updater.latestVersion + Settings.LastSkippedUpdate = latest.toString() + } + } + + object UpdateCyberIO : WelcomeAction() { + override fun doAction(entity: WelcomeEntity) { + Updater.Release.update() + } + } + + class CallStaticFunction( + val classFullName: String, + val funcName: String, + ) : WelcomeAction() { + override fun doAction(entity: WelcomeEntity) { + try { + val clz = Class.forName(classFullName) + val method = clz.getMethod(funcName) + method.invoke(null) + } catch (e: Exception) { + CLog.err("Failed to call ${classFullName}.${funcName}", e) + } + } + } + + class Navigation( + val destination: String, + ) : WelcomeAction() { + override fun doAction(entity: WelcomeEntity) { + val locator = Navigator.by(destination) + Var.Navigation.navigate(locator) + } + } +} \ No newline at end of file diff --git a/main/src/net/liplum/welcome/Conditions.kt b/main/src/net/liplum/welcome/WelcomeConditions.kt similarity index 52% rename from main/src/net/liplum/welcome/Conditions.kt rename to main/src/net/liplum/welcome/WelcomeConditions.kt index 29588721..4f5c7bae 100644 --- a/main/src/net/liplum/welcome/Conditions.kt +++ b/main/src/net/liplum/welcome/WelcomeConditions.kt @@ -3,18 +3,17 @@ package net.liplum.welcome import mindustry.Vars import net.liplum.Settings import net.liplum.update.Updater -import opengal.core.IExpressionReceiver -import opengal.experssion.ExpressionParser -object Conditions { - val ShowWelcome = object : Condition("ShowWelcome") { +object WelcomeConditions { + object ShowWelcome : WelcomeCondition() { override fun canShow(tip: WelcomeScene): Boolean { return Settings.ShouldShowWelcome } override fun priority(tip: WelcomeScene) = 0 } - val CheckUpdate = object : Condition("CheckUpdate") { + + object CheckUpdate : WelcomeCondition() { override fun canShow(tip: WelcomeScene): Boolean { return !Vars.steam && Settings.ShowUpdate && Updater.requireUpdate && @@ -24,7 +23,8 @@ object Conditions { override fun priority(tip: WelcomeScene) = 10 } - val SpecialDishes = object : Condition("SpecialDishes") { + + object SpecialDishes : WelcomeCondition() { override fun canShow(tip: WelcomeScene): Boolean { return Settings.ShouldShowWelcome } @@ -32,22 +32,15 @@ object Conditions { override fun priority(tip: WelcomeScene) = if (Settings.ClickWelcomeTimes == 0) 5 else 0 } - val SettingsReq = object : Condition("SettingsReq") { + + class Expr( + val priority: Int = 0, + val expr: () -> Boolean, + ) : WelcomeCondition() { override fun canShow(tip: WelcomeScene): Boolean { - val data = tip.data - val exprRaw = data["CExpression"] as? String ?: "" - val expr = ExpressionParser.by(exprRaw).parse() - return expr.calculate(ExprSettingsWrapper) + return expr() } - override fun priority(tip: WelcomeScene) = 0 - } - - object ExprSettingsWrapper : IExpressionReceiver { - override fun set(name: String, value: Any) = - throw NotImplementedError("Can't set $name as $value") - - override fun get(name: String): T = - Settings[name] + override fun priority(tip: WelcomeScene) = priority } } \ No newline at end of file diff --git a/main/src/net/liplum/welcome/WelcomeScene.kt b/main/src/net/liplum/welcome/WelcomeScene.kt index c246b3c3..105e1be9 100644 --- a/main/src/net/liplum/welcome/WelcomeScene.kt +++ b/main/src/net/liplum/welcome/WelcomeScene.kt @@ -1,26 +1,24 @@ package net.liplum.welcome +import arc.scene.ui.Dialog +import mindustry.ui.dialogs.BaseDialog + class WelcomeScene( - @JvmField var id: String = DefaultID, - @JvmField var conditionID: String = DefaultCondition, - @JvmField var templateID: String = DefaultTemplateID, - @JvmField var iconPath: String = DefaultIconPath, - @JvmField var chance: Int = DefaultChance, - @JvmField var data: Map = emptyMap(), + @JvmField val id: String, + @JvmField val condition: WelcomeCondition = WelcomeCondition.Default, + @JvmField val template: WelcomeTemplate = WelcomeTemplate.Default, + @JvmField var iconPath: String = "icon", + @JvmField var chance: Int = 100, ) { override fun toString() = id - val template: WelcomeTemplate - get() = TemplateRegistry[templateID] - val condition: Condition - get() = ConditionRegistry[conditionID] companion object { - val Default = WelcomeScene() - const val DefaultID = "Default" - const val DefaultCondition = "ShowWelcome" - const val DefaultTemplateID = "Story" - const val DefaultChance = 1000 - const val DefaultIconPath = "icon" + val Default = WelcomeScene( + id = "Default", + condition = WelcomeConditions.ShowWelcome, + template = WelcomeTemplates.Story(), + chance = 0, + ) } } @@ -46,4 +44,47 @@ class WelcomeScenePack( scenes = this.scenes + scenes, ) } -} \ No newline at end of file +} + +abstract class WelcomeTemplate { + abstract fun gen(entity: WelcomeEntity): Dialog + + companion object { + val Default = object : WelcomeTemplate() { + override fun gen(entity: WelcomeEntity) = + BaseDialog(entity.bundle["Default.title"]).apply { + cont.add(entity.bundle["Default"]) + addCloseButton() + } + } + } +} + +abstract class WelcomeCondition { + abstract fun canShow(tip: WelcomeScene): Boolean + abstract fun priority(tip: WelcomeScene): Int + + companion object { + val Default = object : WelcomeCondition() { + override fun canShow(tip: WelcomeScene): Boolean { + return false + } + + override fun priority(tip: WelcomeScene) = Int.MIN_VALUE + } + } +} + +abstract class WelcomeAction { + abstract fun doAction(entity: WelcomeEntity) + operator fun invoke(entity: WelcomeEntity) { + doAction(entity) + } + + companion object { + val Default = object : WelcomeAction() { + override fun doAction(entity: WelcomeEntity) { + } + } + } +} diff --git a/main/src/net/liplum/welcome/WelcomeTemplates.kt b/main/src/net/liplum/welcome/WelcomeTemplates.kt new file mode 100644 index 00000000..617374d8 --- /dev/null +++ b/main/src/net/liplum/welcome/WelcomeTemplates.kt @@ -0,0 +1,155 @@ +package net.liplum.welcome + +import mindustry.ui.dialogs.BaseDialog +import net.liplum.R +import net.liplum.Var +import net.liplum.common.ui.RateStarPanelBuilder +import net.liplum.update.Updater +import net.liplum.welcome.Welcome.handleTrRefer +import plumy.core.arc.tinted + + +object WelcomeTemplates { + class Story( + val showPoliteWelcome: Boolean = true, + ) : WelcomeTemplate() { + override fun gen(entity: WelcomeEntity) = + BaseDialog(entity["title"]).apply { + addCloseListener() + addPoster(entity.icon) + if (showPoliteWelcome) addPoliteWelcome(entity) + addCenterText(entity.content) + addCloseButton(entity["read"]) + } + } + + class ButtonABC( + val actionA: WelcomeAction = WelcomeAction.Default, + val actionB: WelcomeAction = WelcomeAction.Default, + val actionC: WelcomeAction = WelcomeAction.Default, + val showPoliteWelcome: Boolean = true, + ) : WelcomeTemplate() { + override fun gen(entity: WelcomeEntity) = + BaseDialog(entity["title"]).apply { + addCloseListener() + addPoster(entity.icon) + if (showPoliteWelcome) addPoliteWelcome(entity) + cont.table { + addCloseButton(entity["button-a"], it, 200f) { + actionA(entity) + } + addCloseButton(entity["button-b"], it, 200f) { + actionB(entity) + } + addCloseButton(entity["button-c"], it, 200f) { + actionC(entity) + } + }.growX() + .row() + } + } + + class DoAction( + val yesAction: WelcomeAction = WelcomeAction.Default, + val noAction: WelcomeAction = WelcomeAction.Default, + val showPoliteWelcome: Boolean = true, + ) : WelcomeTemplate() { + override fun gen(entity: WelcomeEntity) = + BaseDialog(entity["title"]).apply { + addCloseListener() + addPoster(entity.icon) + if (showPoliteWelcome) addPoliteWelcome(entity) + addCenterText(entity.content) + cont.table { + addCloseButton(entity["yes"]) { + yesAction(entity) + } + addCloseButton(entity["no"]) { + noAction(entity) + } + }.growX() + .row() + } + } + + class TextIcon( + val text: String = "", + val fontSize: Float = 1f, + val showPoliteWelcome: Boolean = true, + ) : WelcomeTemplate() { + override fun gen(entity: WelcomeEntity) = + BaseDialog(entity["title"]).apply { + addCloseListener() + val resText = entity.bundle.handleRefer(text) + addCenterText(resText).get().apply { + this.setFontScale(fontSize) + } + if (showPoliteWelcome) addPoliteWelcome(entity) + addCenterText(entity.content) + addCloseButton(entity["read"]) + } + } + + class PlainText( + val fontSize: Float = 1f, + val showPoliteWelcome: Boolean = true, + ) : WelcomeTemplate() { + override fun gen(entity: WelcomeEntity) = + BaseDialog(entity["title"]).apply { + addCloseListener() + if (showPoliteWelcome) addPoliteWelcome(entity) + addCenterText(entity.content).pad(40f).get().apply { + this.setFontScale(fontSize) + } + addCloseButton(entity["read"]) + } + } + + class RateStar( + val starSize: Float = 50f, + val starNumber: Int = 5, + val activeStarIconPath: String, + val inactiveStarIconPath: String, + val showPoliteWelcome: Boolean = true, + ) : WelcomeTemplate() { + override fun gen(entity: WelcomeEntity) = + BaseDialog(entity["title"]).apply { + addCloseListener() + addPoster(entity.icon) + if (showPoliteWelcome) addPoliteWelcome(entity) + addCenterText(entity.content) + val ratePanel = RateStarPanelBuilder( + starNumber = starNumber, + starSize = starSize, + activeStar = activeStarIconPath.handleTrRefer(), + inactiveStar = inactiveStarIconPath.handleTrRefer(), + ).build() + cont.add(ratePanel).row() + addCloseButton(entity["submit"]) + } + } + + object UpdateCyberIO : WelcomeTemplate() { + override fun gen(entity: WelcomeEntity) = + BaseDialog(entity["title"]).apply { + addCloseListener() + addPoster(entity.icon) + addCenterText(entity.content(Updater.latestVersion.toString().tinted(Var.Hologram))) + if (Updater.isCurrentBreakUpdate) + addCenterText(entity["break-update-warning"]).color(R.C.RedAlert) + if (Updater.hasUpdateDescription) + addBoxedText(Updater.UpdateDescription) + cont.table { + addCloseButton(entity["update"], it) { + WelcomeActions.UpdateCyberIO(entity) + }.size(150f, 50f) + addCloseButton(entity["no"], it) { + }.size(150f, 50f) + addCloseButton(entity["skip-this"], it) { + WelcomeActions.SkipThisUpdate(entity) + }.size(150f, 50f) + }.growX() + .row() + } + } +} \ No newline at end of file diff --git a/main/src/net/liplum/welcome/Welcomes.kt b/main/src/net/liplum/welcome/Welcomes.kt index 28f0f910..336cd8a6 100644 --- a/main/src/net/liplum/welcome/Welcomes.kt +++ b/main/src/net/liplum/welcome/Welcomes.kt @@ -1,38 +1,34 @@ package net.liplum.welcome +import net.liplum.Settings + object Welcomes { val default = WelcomeScene( id = "Default", - templateID = "Story", + template = WelcomeTemplates.Story(), ) val employmentVerification = WelcomeScene( id = "EmploymentVerification", - templateID = "SpecialDishes", + condition = WelcomeConditions.SpecialDishes, ) val discord = WelcomeScene( id = "Discord", - templateID = "DoAction", - data = mapOf( - "YesAction" to "OpenLink", - "Link" to "@link", + template = WelcomeTemplates.DoAction( + yesAction = WelcomeActions.OpenLink("@link"), ), iconPath = "discord", chance = 750, ) val updateECHO = WelcomeScene( id = "UpdateECHO", - templateID = "Update", - data = mapOf( - "ActionA" to "UpdateCyberIO", - "ActionC" to "@SkipThisUpdate", - ), + template = WelcomeTemplates.UpdateCyberIO, iconPath = "update-icon", - conditionID = "CheckUpdate", + condition = WelcomeConditions.CheckUpdate, ) val researchProject = WelcomeScene( id = "ResearchProject", iconPath = "welcome-holo-project", - conditionID = "SpecialDishes", + condition = WelcomeConditions.SpecialDishes, ) val theShip = WelcomeScene( id = "TheSHIP", @@ -46,70 +42,64 @@ object Welcomes { ) val adBlock = WelcomeScene( id = "AdBlock", - templateID = "DoAction", - iconPath = "ad-block", - data = mapOf( - "NoAction" to "StopReceiveWelcome", + template = WelcomeTemplates.DoAction( + noAction = WelcomeActions.StopReceiveWelcome, ), + iconPath = "ad-block", chance = 300, ) val `404NotFound` = WelcomeScene( id = "404NotFound", - templateID = "PlainText", - iconPath = "ad-block", - conditionID = "SettingsReq", - data = mapOf( - "FontSize" to 1.2, - "ShowPoliteWelcome" to false, - "CExpression" to "@ClickWelcomeTimes > 5 && @ShouldShowWelcome", + template = WelcomeTemplates.PlainText( + fontSize = 1.2f, + showPoliteWelcome = false, ), + condition = WelcomeConditions.Expr { + Settings.ClickWelcomeTimes > 5 && Settings.ShouldShowWelcome + }, chance = 200, ) val ohNo = WelcomeScene( id = "OhNo", iconPath = "@error", - data = mapOf( - "ShowPoliteWelcome" to false, + template = WelcomeTemplates.Story( + showPoliteWelcome = false, ), chance = 200, ) val rateUs = WelcomeScene( id = "RateUs", - templateID = "RateStar", - iconPath = "@error", - data = mapOf( - "StarNumber" to 5, - "InactiveStarIconPath" to "star-inactive", - "ActiveStarIconPath" to "star", - "StarSize" to 60.0, + template = WelcomeTemplates.RateStar( + starSize = 60f, + starNumber = 5, + activeStarIconPath = "star", + inactiveStarIconPath = "star-inactive", ), + iconPath = "@error", chance = 200, ) val erekirDetected = WelcomeScene( id = "ErekirDetected", iconPath = "spec-erekir", - conditionID = "SpecialDishes", + condition = WelcomeConditions.SpecialDishes, ) val setOutErekir = WelcomeScene( id = "SetOutErekir", - templateID = "DoAction", - conditionID = "SettingsReq", + condition = WelcomeConditions.Expr { + Settings.ContentSpecific == "vanilla" && Settings.ShouldShowWelcome + }, iconPath = "spec-erekir", - data = mapOf( - "ShowPoliteWelcome" to true, - "CExpression" to "@ContentSpecific == vanilla && @ShouldShowWelcome", - "YesAction" to "Navigation", - "Locator" to "/CyberIO/ContentSpecific", + template = WelcomeTemplates.DoAction( + yesAction = WelcomeActions.Navigation("/CyberIO/ContentSpecific"), ), ) val cyberionForErekir = WelcomeScene( id = "CyberionForErekir", - conditionID = "SettingsReq", iconPath = "cyberion-for-erekir", - data = mapOf( - "ShowPoliteWelcome" to true, - "CExpression" to "@ContentSpecific == erekir && @ShouldShowWelcome", - ), + template = WelcomeTemplates.Story(), + condition = WelcomeConditions.Expr { + Settings.ContentSpecific == "erekir" && Settings.ShouldShowWelcome + }, ) val tips = listOf( default,