MornyInformation adds sub-commands, move BuildConfig to morny-core
Some checks failed
Tests / check-build (push) Has been cancelled
Tests / check-unit-tests (push) Has been cancelled
Tests / check-assembly-run (push) Has been cancelled

- add Info_EventStatistic in MornyReport, registers to MornyInformation.
This refactors the old /info event that hard-coded to MornyInformation class.
- change SimpleCommandManager's `execute()` to `emitCommands()`, for not conflict to ISimpleCommand
- deleted MornyInformationOlds, its functionality has been completely implemented by the original MornyInformation

The BuildConfig series is still not completed yet.
This commit is contained in:
A.C.Sukazyo Eyre 2025-02-22 01:13:31 +08:00
parent 9d43345659
commit ea6bf80d48
Signed by: Eyre_S
GPG Key ID: EFB47D98FE082FAD
12 changed files with 256 additions and 171 deletions

View File

@ -70,6 +70,7 @@ lazy val morny_system_lib = (project in file (MornyProject.morny_system_lib.id))
) )
lazy val morny_core = (project in file(MornyProject.morny_core.id)) lazy val morny_core = (project in file(MornyProject.morny_core.id))
.enablePlugins(BuildInfoPlugin)
.dependsOn(morny_system_lib) .dependsOn(morny_system_lib)
.settings( .settings(
@ -78,23 +79,9 @@ lazy val morny_core = (project in file(MornyProject.morny_core.id))
libraryDependencies ++= MornyProject.morny_core.dependencies, libraryDependencies ++= MornyProject.morny_core.dependencies,
)
lazy val morny_coeur = (project in file(MornyProject.morny_coeur.id))
.enablePlugins(BuildInfoPlugin)
.dependsOn(morny_core)
.dependsOn(morny_system_lib)
.settings(
name := MornyProject.morny_coeur.name,
moduleName := MornyProject.morny_coeur.id,
Compile / mainClass := Some(MornyProject.morny_coeur.main_class),
libraryDependencies ++= MornyProject.morny_coeur.dependencies,
buildInfoPackage := MornyProject.morny_coeur.root_package, buildInfoPackage := MornyProject.morny_coeur.root_package,
buildInfoObject := "BuildConfig", buildInfoObject := "BuildConfig",
buildInfoOptions += BuildInfoOption.Traits("cc.sukazyo.cono.morny.IBuildInfo"),
buildInfoKeys ++= Seq( buildInfoKeys ++= Seq(
BuildInfoKey[String]("VERSION", MornyProject.version), BuildInfoKey[String]("VERSION", MornyProject.version),
BuildInfoKey[String]("VERSION_FULL", MornyProject.version_full), BuildInfoKey[String]("VERSION_FULL", MornyProject.version_full),
@ -108,6 +95,36 @@ lazy val morny_coeur = (project in file(MornyProject.morny_coeur.id))
BuildInfoKey[String]("COMMIT_PATH", MornyProject.git_store_path), BuildInfoKey[String]("COMMIT_PATH", MornyProject.git_store_path),
), ),
)
lazy val morny_coeur = (project in file(MornyProject.morny_coeur.id))
.dependsOn(morny_core)
.dependsOn(morny_system_lib)
.settings(
name := MornyProject.morny_coeur.name,
moduleName := MornyProject.morny_coeur.id,
Compile / mainClass := Some(MornyProject.morny_coeur.main_class),
libraryDependencies ++= MornyProject.morny_coeur.dependencies,
// buildInfoPackage := MornyProject.morny_coeur.root_package,
// buildInfoObject := "BuildConfig",
// buildInfoOptions += BuildInfoOption.Traits("cc.sukazyo.cono.morny.IBuildInfo"),
// buildInfoKeys ++= Seq(
// BuildInfoKey[String]("VERSION", MornyProject.version),
// BuildInfoKey[String]("VERSION_FULL", MornyProject.version_full),
// BuildInfoKey[String]("VERSION_BASE", MornyProject.version_base),
// BuildInfoKey[Option[String]]("VERSION_DELTA", MornyProject.version_delta),
// BuildInfoKey[String]("CODENAME", MornyProject.version_codename),
// BuildInfoKey.action[Long]("CODE_TIMESTAMP") { MornyProject.code_time },
// BuildInfoKey.action[String]("COMMIT") { MornyProject.git_commit },
// BuildInfoKey.action[Boolean]("CLEAN_BUILD") { MornyProject.git_is_clean },
// BuildInfoKey[String]("CODE_STORE", MornyProject.git_store),
// BuildInfoKey[String]("COMMIT_PATH", MornyProject.git_store_path),
// ),
assemblyMergeStrategy := { assemblyMergeStrategy := {
case module if module endsWith "module-info.class" => MergeStrategy.concat case module if module endsWith "module-info.class" => MergeStrategy.concat
case module_kt if module_kt endsWith ".kotlin_module" => MergeStrategy.concat case module_kt if module_kt endsWith ".kotlin_module" => MergeStrategy.concat

View File

@ -3,6 +3,7 @@ package cc.sukazyo.cono.morny.reporter
import cc.sukazyo.cono.morny.core.internal.MornyInternalModule import cc.sukazyo.cono.morny.core.internal.MornyInternalModule
import cc.sukazyo.cono.morny.core.Log.logger import cc.sukazyo.cono.morny.core.Log.logger
import cc.sukazyo.cono.morny.core.MornyCoeur import cc.sukazyo.cono.morny.core.MornyCoeur
import cc.sukazyo.cono.morny.core.bot.command.MornyInformation
import cc.sukazyo.cono.morny.core.event.{TelegramBotEvents, TelegramCoreCommandEvents} import cc.sukazyo.cono.morny.core.event.{TelegramBotEvents, TelegramCoreCommandEvents}
class Module extends MornyInternalModule { class Module extends MornyInternalModule {
@ -28,8 +29,14 @@ class Module extends MornyInternalModule {
import cxt.* import cxt.*
externalContext >> { (instance: MornyReport) => externalContext >> { (instance: MornyReport) =>
given MornyReport = instance
logger `info` "MornyReport will now collect your bot event statistics." logger `info` "MornyReport will now collect your bot event statistics."
eventManager register instance.EventStatistics.EventInfoCatcher eventManager register instance.EventStatistics.EventInfoCatcher
import command.*
MornyInformation.inCoeur register Info_EventStatistic()
} || { } || {
logger `warn` "There seems no reporter instance is provided; skipped register events for it." logger `warn` "There seems no reporter instance is provided; skipped register events for it."
} }

View File

@ -0,0 +1,32 @@
package cc.sukazyo.cono.morny.reporter.command
import cc.sukazyo.cono.morny.reporter.MornyReport
import cc.sukazyo.cono.morny.system.telegram_api.command.{ICommandAlias, InputCommand, ISimpleCommand}
import cc.sukazyo.cono.morny.system.telegram_api.TelegramExtensions.Requests.unsafeExecute
import cc.sukazyo.cono.morny.util.var_text.VarText
import com.pengrad.telegrambot.model.Update
import com.pengrad.telegrambot.model.request.ParseMode
import com.pengrad.telegrambot.request.SendMessage
class Info_EventStatistic (using reporter: MornyReport) extends ISimpleCommand {
import reporter.coeur.dsl.given
override val name: String = "event"
override val aliases: List[ICommandAlias] = Nil
override def execute (using command: InputCommand, event: Update): Unit = {
SendMessage(
event.message.chat.id,
VarText(
// language=html
"""<b>Event Statistics :</b>
|in today
|{event_statistics}""".stripMargin
).render(
"event_statistics" -> reporter.EventStatistics.eventStatisticsHTML
)
).parseMode(ParseMode.HTML).replyToMessageId(event.message.messageId)
.unsafeExecute
}
}

View File

@ -1,40 +0,0 @@
// $COVERAGE-OFF$
package cc.sukazyo.cono.morny
/** This object was generated by sbt-buildinfo. */
case object BuildConfig {
/** The value is "Morny Coeur". */
val name: String = "Morny Coeur"
/** The value is "2.0.0-alpha21-SNAPSHOT". */
val version: String = "2.0.0-alpha21-SNAPSHOT"
/** The value is "3.4.1". */
val scalaVersion: String = "3.4.1"
/** The value is "1.10.0". */
val sbtVersion: String = "1.10.0"
/** The value is "2.0.0-alpha21-SNAPSHOT". */
val VERSION: String = "2.0.0-alpha21-SNAPSHOT"
/** The value is "2.0.0-alpha21-SNAPSHOT+gitbd958708.δ". */
val VERSION_FULL: String = "2.0.0-alpha21-SNAPSHOT+gitbd958708.δ"
/** The value is "2.0.0-alpha21". */
val VERSION_BASE: String = "2.0.0-alpha21"
/** The value is scala.None. */
val VERSION_DELTA: scala.Option[String] = scala.None
/** The value is "xinzheng". */
val CODENAME: String = "xinzheng"
/** The value is 1739975193572L. */
val CODE_TIMESTAMP: scala.Long = 1739975193572L
/** The value is "bd95870864075e9921257e14bf446f53d4bc5e02". */
val COMMIT: String = "bd95870864075e9921257e14bf446f53d4bc5e02"
/** The value is false. */
val CLEAN_BUILD: scala.Boolean = false
/** The value is "https://github.com/Eyre-S/Coeur-Morny-Cono". */
val CODE_STORE: String = "https://github.com/Eyre-S/Coeur-Morny-Cono"
/** The value is "https://github.com/Eyre-S/Coeur-Morny-Cono/commit/%s". */
val COMMIT_PATH: String = "https://github.com/Eyre-S/Coeur-Morny-Cono/commit/%s"
override val toString: String = {
"name: %s, version: %s, scalaVersion: %s, sbtVersion: %s, VERSION: %s, VERSION_FULL: %s, VERSION_BASE: %s, VERSION_DELTA: %s, CODENAME: %s, CODE_TIMESTAMP: %s, COMMIT: %s, CLEAN_BUILD: %s, CODE_STORE: %s, COMMIT_PATH: %s".format(
name, version, scalaVersion, sbtVersion, VERSION, VERSION_FULL, VERSION_BASE, VERSION_DELTA, CODENAME, CODE_TIMESTAMP, COMMIT, CLEAN_BUILD, CODE_STORE, COMMIT_PATH
)
}
}
// $COVERAGE-ON$

View File

@ -0,0 +1,20 @@
package cc.sukazyo.cono.morny
trait IBuildInfo {
val name : String
val version : String
val scalaVersion : String
val sbtVersion : String
val VERSION : String
val VERSION_FULL : String
val VERSION_BASE : String
val VERSION_DELTA : Option[String]
val CODENAME : String
val CODE_TIMESTAMP: Long
val COMMIT : String
val CLEAN_BUILD : Boolean
val CODE_STORE : String
val COMMIT_PATH : String
}

View File

@ -194,6 +194,8 @@ class MornyCoeur (modules: List[MornyModule])(using val config: MornyConfig)(tes
_httpServerContext, _httpServerContext,
initializeContext))) initializeContext)))
import bot.command.MornyInformation
private[core] val $MornyInformation = MornyInformation()
{ {
// register core/api events // register core/api events
@ -206,8 +208,6 @@ class MornyCoeur (modules: List[MornyModule])(using val config: MornyConfig)(tes
import bot.command.* import bot.command.*
val $MornyHellos = MornyHellos() val $MornyHellos = MornyHellos()
val $MornyInformation = MornyInformation()
val $MornyInformationOlds = MornyInformationOlds(using $MornyInformation)
val $MornyManagers = MornyManagers() val $MornyManagers = MornyManagers()
commands.register( commands.register(
@ -216,8 +216,6 @@ class MornyCoeur (modules: List[MornyModule])(using val config: MornyConfig)(tes
MornyInfoOnStart(), MornyInfoOnStart(),
$MornyInformation, $MornyInformation,
$MornyInformationOlds.Version,
$MornyInformationOlds.Runtime,
$MornyManagers.SaveData, $MornyManagers.SaveData,
$MornyManagers.Reload, $MornyManagers.Reload,
$MornyManagers.Exit, $MornyManagers.Exit,
@ -227,6 +225,7 @@ class MornyCoeur (modules: List[MornyModule])(using val config: MornyConfig)(tes
errorMessageManager.ShowErrorMessageCommand, errorMessageManager.ShowErrorMessageCommand,
) )
commands.register($MornyInformation.toplevelCommands*)
// register core utils events // register core utils events
eventManager register $MornyHellos.PrivateChat_O eventManager register $MornyHellos.PrivateChat_O

View File

@ -19,14 +19,7 @@ object MornyCommandManager:
class MornyCommandManager (using coeur: MornyCoeur) extends SimpleCommandManager { class MornyCommandManager (using coeur: MornyCoeur) extends SimpleCommandManager {
private given TelegramBot = coeur.account private given TelegramBot = coeur.account
def execute (using command: InputCommand, event: Update): Boolean = { protected override def nonCommandExecutable (using command: InputCommand, event: Update): Boolean = {
if (commands contains command.command)
commands(command.command) execute;
true
else nonCommandExecutable
}
private def nonCommandExecutable (using command: InputCommand, event: Update): Boolean = {
if command.target eq null then false if command.target eq null then false
else else
SendSticker( SendSticker(

View File

@ -1,10 +1,19 @@
package cc.sukazyo.cono.morny.core.bot.api package cc.sukazyo.cono.morny.core.bot.api
import cc.sukazyo.cono.morny.core.bot.api.MornyCommandManager.CommandMap import cc.sukazyo.cono.morny.core.bot.api.MornyCommandManager.CommandMap
import cc.sukazyo.cono.morny.system.telegram_api.command.ISimpleCommand import cc.sukazyo.cono.morny.system.telegram_api.command.{InputCommand, ISimpleCommand}
import com.pengrad.telegrambot.model.Update
import scala.collection.mutable import scala.collection.mutable
/** The most basic command manager for Telegram commands.
*
* This manager contains numbers [[ISimpleCommand]], also provides methods to register them.
* Also, it provides a method to execute a command.
*
* If the command is not found, this manager will do nothing in default.
* You can customize the behavior by overriding the method [[nonCommandExecutable]].
*/
trait SimpleCommandManager { trait SimpleCommandManager {
protected val commands: CommandMap = mutable.SeqMap.empty protected val commands: CommandMap = mutable.SeqMap.empty
@ -19,4 +28,19 @@ trait SimpleCommandManager {
def register [T <: ISimpleCommand] (commands: T*): Unit = def register [T <: ISimpleCommand] (commands: T*): Unit =
for (command <- commands) doRegister(command) for (command <- commands) doRegister(command)
def emitCommands (using command: InputCommand, event: Update): Boolean = {
if (commands contains command.command)
commands(command.command) execute;
true
else nonCommandExecutable
}
protected def nonCommandExecutable (using command: InputCommand, event: Update): Boolean = {
false
}
}
object SimpleCommandManager {
def apply (): SimpleCommandManager = new SimpleCommandManager {}
} }

View File

@ -2,11 +2,13 @@ package cc.sukazyo.cono.morny.core.bot.command
import cc.sukazyo.cono.morny.core.{MornyCoeur, MornySystem} import cc.sukazyo.cono.morny.core.{MornyCoeur, MornySystem}
import cc.sukazyo.cono.morny.core.bot.api.messages.{ErrorMessage, MessagingContext} import cc.sukazyo.cono.morny.core.bot.api.messages.{ErrorMessage, MessagingContext}
import cc.sukazyo.cono.morny.core.bot.api.SimpleCommandManager
import cc.sukazyo.cono.morny.data.MornyInformation.* import cc.sukazyo.cono.morny.data.MornyInformation.*
import cc.sukazyo.cono.morny.data.TelegramStickers import cc.sukazyo.cono.morny.data.TelegramStickers
import cc.sukazyo.cono.morny.system.telegram_api.formatting.TelegramParseEscape.escapeHtml as h import cc.sukazyo.cono.morny.system.telegram_api.formatting.TelegramParseEscape.escapeHtml as h
import cc.sukazyo.cono.morny.system.telegram_api.TelegramExtensions.Requests.unsafeExecute import cc.sukazyo.cono.morny.system.telegram_api.TelegramExtensions.Requests.unsafeExecute
import cc.sukazyo.cono.morny.system.telegram_api.command.{ICommandAlias, InputCommand, ITelegramCommand} import cc.sukazyo.cono.morny.system.telegram_api.command.{ICommandAlias, InputCommand, ISimpleCommand, ITelegramCommand}
import cc.sukazyo.cono.morny.system.telegram_api.command.ICommandAlias.HiddenAlias
import cc.sukazyo.cono.morny.util.CommonFormat.{formatDate, formatDuration} import cc.sukazyo.cono.morny.util.CommonFormat.{formatDate, formatDuration}
import cc.sukazyo.cono.morny.util.var_text import cc.sukazyo.cono.morny.util.var_text
import cc.sukazyo.cono.morny.util.var_text.VarText import cc.sukazyo.cono.morny.util.var_text.VarText
@ -16,43 +18,39 @@ import com.pengrad.telegrambot.request.{SendMessage, SendPhoto, SendSticker}
import java.lang.System import java.lang.System
class MornyInformation (using coeur: MornyCoeur) extends ITelegramCommand { class MornyInformation (using coeur: MornyCoeur) extends SimpleCommandManager with ITelegramCommand {
import coeur.dsl.{*, given} import coeur.dsl.{*, given}
private case object Subs {
val STICKERS = "stickers"
val RUNTIME = "runtime"
val VERSION = "version"
val VERSION_2 = "v"
val TASKS = "tasks"
val EVENTS = "event"
}
override val name: String = "info" override val name: String = "info"
override val aliases: List[ICommandAlias] = Nil override val aliases: List[ICommandAlias] = Nil
override val paramRule: String = "[(version|runtime|stickers[.IDs]|tasks|event)]" override val paramRule: String = "[(version|runtime|stickers[.IDs]|tasks|event)]"
override val description: String = "输出当前 Morny 的各种信息" override val description: String = "输出当前 Morny 的各种信息"
this.register(Info, Version, _Runtime, TasksStatus)
private[core] val toplevelCommands: List[ISimpleCommand] = List(Version_Toplevel, _Runtime)
override def execute (using command: InputCommand, event: Update): Unit = { override def execute (using command: InputCommand, event: Update): Unit = {
if (command.args isEmpty) { command.args.headOption match
echoInfo(event) // due to the complex of stickers.XXX subcommands
return // matches all the commands that starts with "stickers"
} case Some(s) if s.startsWith(Stickers.name) =>
Stickers.execute
case _ =>
val action: String = command.args(0) this.emitCommands(using command.subcommand, event)
action match {
case s if s `startsWith` Subs.STICKERS => echoStickers
case Subs.RUNTIME => echoRuntime
case Subs.VERSION | Subs.VERSION_2 => echoVersion
case Subs.TASKS => echoTasksStatus
case Subs.EVENTS => echoEventStatistics
case _ => echo404
}
} }
override protected def nonCommandExecutable (using command: InputCommand, event: Update): Boolean =
echo404
true
private case object Info extends ISimpleCommand:
override val name: String = ""
override val aliases: List[ICommandAlias] = Nil
override def execute (using command: InputCommand, event: Update): Unit =
echoInfo(event)
private def echoInfo (update: Update): Unit = { private def echoInfo (update: Update): Unit = {
val cxt = MessagingContext.extract(using update.message) val cxt = MessagingContext.extract(using update.message)
val cxtReplied = Option(update.message.replyToMessage).map(MessagingContext.extract(using _)) val cxtReplied = Option(update.message.replyToMessage).map(MessagingContext.extract(using _))
@ -82,44 +80,77 @@ class MornyInformation (using coeur: MornyCoeur) extends ITelegramCommand {
} }
private def echoStickers (using command: InputCommand, event: Update): Unit = { private case object Stickers extends ISimpleCommand {
val mid: String|Null =
if (command.args(0) == Subs.STICKERS) {
if (command.args.length == 1) ""
else if (command.args.length == 2) command.args(1)
else null
} else if (command.args.length == 1) {
if ((command.args(0) `startsWith` s"${Subs.STICKERS}.") || (command.args(0) `startsWith` s"${Subs.STICKERS}#")) {
command.args(0) `substring` Subs.STICKERS.length+1
} else null
} else null
if (mid == null) echo404
else echoStickers(mid)(using event.message.chat.id, event.message.messageId)
}
private def echoStickers (mid: String)(using send_chat: Long, send_replyTo: Int)(using Update): Unit = { override val name: String = "stickers"
import scala.jdk.CollectionConverters.* override val aliases: List[ICommandAlias] = Nil
if (mid isEmpty) for ((_key, _file_id) <- TelegramStickers.map asScala)
echoSticker(_key, _file_id) /** Process the parameter, to find the sticker name hidden in params.
else { *
try { * Supports:
val sticker = TelegramStickers `getById` mid * - args is `stickers`, send all stickers
echoSticker(sticker.getKey, sticker.getValue) * - args is `stickers.xxx`, send the sticker named `xxx`
} catch case _: NoSuchFieldException => { * - args is `stickers#xxx`, send the sticker named `xxx`
echo404 * - args is `stickers` `xxx`, send the sticker named `xxx`
* - args is `xxx`, send the sticker named `xxx`
*/
override def execute (using command: InputCommand, event: Update): Unit = {
val mid: String | Null =
if (command.args(0) == this.name) {
if (command.args.length == 1) ""
else if (command.args.length == 2) command.args(1)
else null
} else if (command.args.length == 1) {
if ((command.args(0) `startsWith` s"${this.name}.") || (command.args(0) `startsWith` s"${this.name}#")) {
command.args(0) `substring` this.name.length + 1
} else command.args(0)
} else null
if (mid == null) echo404
else echoStickers(mid)(using event.message.chat.id, event.message.messageId)
}
/** Send the sticker named mid, or send all stickers if mid is not set.
*
* - If mid is set and is a sticker name, send the specific one sticker.
* - If mid is set and is not a sticker name, send 404.
* - If mid is not set, send all stickers that available in [[TelegramStickers]].
*/
private def echoStickers (mid: String)(using send_chat: Long, send_replyTo: Int)(using Update): Unit = {
import scala.jdk.CollectionConverters.*
if (mid isEmpty) for ((_key, _file_id) <- TelegramStickers.map asScala)
sent(_key, _file_id)
else {
try {
val sticker = TelegramStickers `getById` mid
sent(sticker.getKey, sticker.getValue)
} catch case _: NoSuchFieldException => {
echo404
}
} }
} }
/** Send the specific sticker to telegram. */
private def sent (mid: String, file_id: String)(using send_chat: Long, send_replyTo: Int): Unit = {
val send_mid = SendMessage(send_chat, mid)
val send_sticker = SendSticker(send_chat, file_id)
if (send_replyTo != -1) send_mid.replyToMessageId(send_replyTo)
val result_send_mid = send_mid.unsafeExecute
send_sticker.replyToMessageId(result_send_mid.message.messageId)
send_sticker.unsafeExecute
}
} }
private def echoSticker (mid: String, file_id: String)(using send_chat: Long, send_replyTo: Int): Unit = { case object Version extends ISimpleCommand:
val send_mid = SendMessage(send_chat, mid) override val name: String = "version"
val send_sticker = SendSticker(send_chat, file_id) override val aliases: List[ICommandAlias] = List(HiddenAlias("v"))
if (send_replyTo != -1) send_mid.replyToMessageId(send_replyTo) override def execute (using command: InputCommand, event: Update): Unit =
val result_send_mid = send_mid.unsafeExecute echoVersion
send_sticker.replyToMessageId(result_send_mid.message.messageId) private case object Version_Toplevel extends ISimpleCommand:
send_sticker.unsafeExecute override val name: String = "version"
} override val aliases: List[ICommandAlias] = Nil
override def execute (using command: InputCommand, event: Update): Unit =
echoVersion
private[command] def echoVersion (using event: Update): Unit = { private[command] def echoVersion (using event: Update): Unit = {
val versionDeltaHTML = MornySystem.VERSION_DELTA match {case Some(d) => s"-δ<code>${h(d)}</code>" case None => ""} val versionDeltaHTML = MornySystem.VERSION_DELTA match {case Some(d) => s"-δ<code>${h(d)}</code>" case None => ""}
val versionGitHTML = if (MornySystem.GIT_COMMIT nonEmpty) s"git $getVersionGitTagHTML" else "" val versionGitHTML = if (MornySystem.GIT_COMMIT nonEmpty) s"git $getVersionGitTagHTML" else ""
@ -149,6 +180,11 @@ class MornyInformation (using coeur: MornyCoeur) extends ITelegramCommand {
.unsafeExecute .unsafeExecute
} }
private case object _Runtime extends ISimpleCommand:
override val name: String = "runtime"
override val aliases: List[ICommandAlias] = Nil
override def execute (using command: InputCommand, event: Update): Unit =
echoRuntime
private[command] def echoRuntime (using event: Update): Unit = { private[command] def echoRuntime (using event: Update): Unit = {
def sysprop (p: String): String = System.getProperty(p) def sysprop (p: String): String = System.getProperty(p)
SendMessage( SendMessage(
@ -199,6 +235,11 @@ class MornyInformation (using coeur: MornyCoeur) extends ITelegramCommand {
.unsafeExecute .unsafeExecute
} }
private case object TasksStatus extends ISimpleCommand:
override val name: String = "tasks"
override val aliases: List[ICommandAlias] = Nil
override def execute (using command: InputCommand, event: Update): Unit =
echoTasksStatus
private def echoTasksStatus (using update: Update): Unit = { private def echoTasksStatus (using update: Update): Unit = {
// if !coeur.trusted.isTrusted(update.message.from.id) then return; // if !coeur.trusted.isTrusted(update.message.from.id) then return;
SendMessage( SendMessage(
@ -219,26 +260,6 @@ class MornyInformation (using coeur: MornyCoeur) extends ITelegramCommand {
.unsafeExecute .unsafeExecute
} }
// todo: fix this
private def echoEventStatistics (using update: Update): Unit = {
// coeur.externalContext >> { (reporter: MornyReport) =>
// SendMessage(
// update.message.chat.id,
// VarText(
// // language=html
// """<b>Event Statistics :</b>
// |in today
// |{event_statistics}""".stripMargin
// ).render(
// "event_statistics" -> reporter.EventStatistics.eventStatisticsHTML
// )
// ).parseMode(ParseMode.HTML).replyToMessageId(update.message.messageId)
// .unsafeExecute
// } || {
// echo404
// }
}
private def echo404 (using event: Update): Unit = private def echo404 (using event: Update): Unit =
SendSticker( SendSticker(
event.message.chat.id, event.message.chat.id,
@ -247,3 +268,10 @@ class MornyInformation (using coeur: MornyCoeur) extends ITelegramCommand {
.unsafeExecute .unsafeExecute
} }
object MornyInformation {
def inCoeur (using coeur: MornyCoeur): MornyInformation =
coeur.$MornyInformation
}

View File

@ -1,18 +0,0 @@
package cc.sukazyo.cono.morny.core.bot.command
import cc.sukazyo.cono.morny.system.telegram_api.command.{ICommandAlias, InputCommand, ISimpleCommand}
import com.pengrad.telegrambot.model.Update
class MornyInformationOlds (using base: MornyInformation) {
object Version extends ISimpleCommand:
override val name: String = "version"
override val aliases: List[ICommandAlias] = Nil
override def execute (using command: InputCommand, event: Update): Unit = base.echoVersion
object Runtime extends ISimpleCommand:
override val name: String = "runtime"
override val aliases: List[ICommandAlias] = Nil
override def execute (using command: InputCommand, event: Update): Unit = base.echoRuntime
}

View File

@ -30,7 +30,7 @@ class MornyOnTelegramCommand (using commandManager: MornyCommandManager) (using
logger `debug` "not morny command" logger `debug` "not morny command"
else else
logger `debug` "is command" logger `debug` "is command"
if commandManager.execute(using inputCommand) then if commandManager.emitCommands(using inputCommand) then
setEventOk setEventOk
} }

View File

@ -9,13 +9,40 @@ class InputCommand private (
) { ) {
override def toString: String = override def toString: String =
s"{{$command}@{$target}#{${args.mkString}}" // s"{{$command}@{$target}#{${args.mkString}}"
s"/$command${if target != null then s"@$target" else ""} ${args.mkString(" ")}"
def subcommand: InputCommand =
InputCommand(args, target)
} }
object InputCommand { object InputCommand {
def apply (input: Array[String]): InputCommand = { private final val TARGET_DEFAULT: String|Null = null
def apply (input: Array[String], target: String|Null): InputCommand = {
new InputCommand(
target,
input.headOption.getOrElse(""),
input drop 1
)
}
def apply (input: Array[String]): InputCommand =
InputCommand(input, TARGET_DEFAULT)
def apply (input: String): InputCommand =
InputCommand(UniversalCommand.Lossy(input))
def apply (input: String, target: String|Null): InputCommand =
InputCommand(UniversalCommand.Lossy(input), target)
def inTelegram (input: String): InputCommand = {
inTelegram(UniversalCommand.Lossy(input))
}
def inTelegram (input: Array[String]): InputCommand = {
val _ex = if input.nonEmpty then input(0).split("@", 2) else Array.empty[String] val _ex = if input.nonEmpty then input(0).split("@", 2) else Array.empty[String]
val _args = input drop 1 val _args = input drop 1
new InputCommand( new InputCommand(
@ -25,8 +52,4 @@ object InputCommand {
) )
} }
//noinspection NoTailRecursionAnnotation
def apply (input: String): InputCommand =
InputCommand(UniversalCommand.Lossy(input))
} }