diff --git a/gradle.properties b/gradle.properties
index 40423cd..96a7c65 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,6 +1,6 @@
## Core
-VERSION = 0.4.1.1
+VERSION = 0.4.1.2
# dependencies
diff --git a/src/main/java/cc/sukazyo/cono/morny/GradleProjectConfigures.java b/src/main/java/cc/sukazyo/cono/morny/GradleProjectConfigures.java
index 07e1123..305a77b 100644
--- a/src/main/java/cc/sukazyo/cono/morny/GradleProjectConfigures.java
+++ b/src/main/java/cc/sukazyo/cono/morny/GradleProjectConfigures.java
@@ -4,6 +4,6 @@ package cc.sukazyo.cono.morny;
* the final field that will be updated by gradle automatically.
*/
public class GradleProjectConfigures {
- public static final String VERSION = "0.4.1.1";
- public static final long COMPILE_TIMESTAMP = 1639152431845L;
+ public static final String VERSION = "0.4.1.2";
+ public static final long COMPILE_TIMESTAMP = 1639211288142L;
}
diff --git a/src/main/java/cc/sukazyo/cono/morny/MornyCoeur.java b/src/main/java/cc/sukazyo/cono/morny/MornyCoeur.java
index 5fa2efa..c6fdf0d 100644
--- a/src/main/java/cc/sukazyo/cono/morny/MornyCoeur.java
+++ b/src/main/java/cc/sukazyo/cono/morny/MornyCoeur.java
@@ -36,6 +36,11 @@ public class MornyCoeur {
* 会根据这里定义的时间戳取消掉比此时间更早的事件链
*/
public static long latestEventTimestamp;
+ /**
+ * morny 主程序启动时间
+ * 用于统计数据
+ */
+ public static final long coeurStartTimestamp = System.currentTimeMillis();
/**
* bot 启动入口,执行 bot 初始化
diff --git a/src/main/java/cc/sukazyo/cono/morny/ServerMain.java b/src/main/java/cc/sukazyo/cono/morny/ServerMain.java
index 9cd9520..89147c3 100644
--- a/src/main/java/cc/sukazyo/cono/morny/ServerMain.java
+++ b/src/main/java/cc/sukazyo/cono/morny/ServerMain.java
@@ -1,11 +1,8 @@
package cc.sukazyo.cono.morny;
+import cc.sukazyo.cono.morny.util.CommonFormatUtils;
+
import javax.annotation.Nonnull;
-import java.time.Instant;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.time.ZoneOffset;
-import java.time.format.DateTimeFormatter;
import static cc.sukazyo.cono.morny.Log.logger;
@@ -113,9 +110,7 @@ public class ServerMain {
MornySystem.VERSION,
MornySystem.getJarMd5(),
GradleProjectConfigures.COMPILE_TIMESTAMP,
- DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS").format(LocalDateTime.ofInstant(
- Instant.ofEpochMilli(GradleProjectConfigures.COMPILE_TIMESTAMP),
- ZoneId.ofOffset("UTC", ZoneOffset.UTC)))
+ CommonFormatUtils.formatDate(GradleProjectConfigures.COMPILE_TIMESTAMP, 0)
));
return;
diff --git a/src/main/java/cc/sukazyo/cono/morny/bot/api/InputCommand.java b/src/main/java/cc/sukazyo/cono/morny/bot/api/InputCommand.java
index 38e4a0b..743d0da 100644
--- a/src/main/java/cc/sukazyo/cono/morny/bot/api/InputCommand.java
+++ b/src/main/java/cc/sukazyo/cono/morny/bot/api/InputCommand.java
@@ -37,14 +37,17 @@ public class InputCommand {
return new InputCommand(cx.length == 1 ? null : cx[1], cx[0], args);
}
+ @Nullable
public String getTarget () {
return target;
}
+ @Nonnull
public String getCommand () {
return command;
}
+ @Nonnull
public String[] getArgs () {
return args;
}
@@ -54,6 +57,7 @@ public class InputCommand {
}
@Override
+ @Nonnull
public String toString() {
return String.format("{{%s}@{%s}#{%s}}", command, target, Arrays.toString(args));
}
diff --git a/src/main/java/cc/sukazyo/cono/morny/bot/event/OnCommandExecute.java b/src/main/java/cc/sukazyo/cono/morny/bot/event/OnCommandExecute.java
index e9609df..d3e6def 100644
--- a/src/main/java/cc/sukazyo/cono/morny/bot/event/OnCommandExecute.java
+++ b/src/main/java/cc/sukazyo/cono/morny/bot/event/OnCommandExecute.java
@@ -7,6 +7,7 @@ import cc.sukazyo.cono.morny.MornyTrusted;
import cc.sukazyo.cono.morny.bot.api.EventListener;
import cc.sukazyo.cono.morny.bot.api.InputCommand;
import cc.sukazyo.cono.morny.bot.event.on_commands.GetUsernameAndId;
+import cc.sukazyo.cono.morny.util.CommonFormatUtils;
import com.pengrad.telegrambot.model.Update;
import com.pengrad.telegrambot.model.request.ParseMode;
import com.pengrad.telegrambot.request.SendMessage;
@@ -14,12 +15,6 @@ import com.pengrad.telegrambot.request.SendSticker;
import javax.annotation.Nonnull;
-import java.time.Instant;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.time.ZoneOffset;
-import java.time.format.DateTimeFormatter;
-
import static cc.sukazyo.cono.morny.Log.logger;
public class OnCommandExecute extends EventListener {
@@ -28,6 +23,7 @@ public class OnCommandExecute extends EventListener {
private static final String HELLO_STICKER_ID = "CAACAgEAAxkBAAMnYYYWKNXO4ibo9dlsmDctHhhV6fIAAqooAAJ4_MYFJJhrHS74xUAiBA";
private static final String EXIT_STICKER_ID = "CAACAgEAAxkBAAMoYYYWt8UjvP0N405SAyvg2SQZmokAAkMiAAJ4_MYFw6yZLu06b-MiBA";
private static final String EXIT_403_STICKER_ID = "CAACAgEAAxkBAAMqYYYa_7hpXH6hMOYMX4Nh8AVYd74AAnQnAAJ4_MYFRdmmsQKLDZgiBA";
+ private static final String NON_COMMAND_QUESTION_STICKER_ID = "CAACAgEAAx0CSQh32gABA966YbRJpbmi2lCHINBDuo1DknSTsbsAAqUoAAJ4_MYFUa8SIaZriAojBA";
@Override
public boolean onMessage (@Nonnull Update event) {
@@ -55,12 +51,27 @@ public class OnCommandExecute extends EventListener {
case "/version":
onCommandVersionExec(event);
break;
+ case "/runtime":
+ onCommandRuntimeExec(event);
+ break;
default:
- return false; // 无法解析的命令,转交事件链后代处理
+ return nonCommandExecutable(event, command);
}
return true; // 命令执行成功,标记事件为已处理,退出事件链
}
+ private boolean nonCommandExecutable (Update event, InputCommand command) {
+ if (command.getTarget() == null) return false; // 无法解析的命令,转交事件链后代处理
+ else { // 无法解析的显式命令格式,报错找不到命令
+ MornyCoeur.getAccount().execute(new SendSticker(
+ event.message().chat().id(),
+ NON_COMMAND_QUESTION_STICKER_ID
+ ).replyToMessageId(event.message().messageId())
+ );
+ return true;
+ }
+ }
+
private void onCommandOnExec (@Nonnull Update event) {
MornyCoeur.getAccount().execute(new SendSticker(
event.message().chat().id(),
@@ -110,9 +121,50 @@ public class OnCommandExecute extends EventListener {
MornySystem.VERSION,
MornySystem.getJarMd5(),
GradleProjectConfigures.COMPILE_TIMESTAMP,
- DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS").format(LocalDateTime.ofInstant(
- Instant.ofEpochMilli(GradleProjectConfigures.COMPILE_TIMESTAMP),
- ZoneId.ofOffset("UTC", ZoneOffset.UTC)))
+ CommonFormatUtils.formatDate(GradleProjectConfigures.COMPILE_TIMESTAMP, 0)
+ )
+ ).replyToMessageId(event.message().messageId()).parseMode(ParseMode.HTML));
+ }
+
+ private void onCommandRuntimeExec (@Nonnull Update event) {
+ MornyCoeur.getAccount().execute(new SendMessage(
+ event.message().chat().id(),
+ String.format("""
+ system:
+ - %s
+ - %s
+ - %d
cores
+ java runtime:
+ - %s
+ - %s
+ memory:
+ - %d
/ %d
MB
+ morny version:
+ - %s
+ - %s
+ - %s [UTC]
+ - [%d
]
+ continuous
+ - %s
+ - [%d
]""",
+ // system
+ System.getProperty("os.name"),
+ System.getProperty("os.version"),
+ Runtime.getRuntime().availableProcessors(),
+ // java
+ System.getProperty("java.vm.name"),
+ System.getProperty("java.version"),
+ // memory
+ Runtime.getRuntime().totalMemory() / 1024 / 1024,
+ Runtime.getRuntime().maxMemory() / 1024 / 1024,
+ // version
+ MornySystem.VERSION,
+ MornySystem.getJarMd5(),
+ CommonFormatUtils.formatDate(GradleProjectConfigures.COMPILE_TIMESTAMP, 0),
+ GradleProjectConfigures.COMPILE_TIMESTAMP,
+ // continuous
+ CommonFormatUtils.formatDuration(System.currentTimeMillis() - MornyCoeur.coeurStartTimestamp),
+ System.currentTimeMillis() - MornyCoeur.coeurStartTimestamp
)
).replyToMessageId(event.message().messageId()).parseMode(ParseMode.HTML));
}
diff --git a/src/main/java/cc/sukazyo/cono/morny/util/CommonFormatUtils.java b/src/main/java/cc/sukazyo/cono/morny/util/CommonFormatUtils.java
new file mode 100644
index 0000000..c629548
--- /dev/null
+++ b/src/main/java/cc/sukazyo/cono/morny/util/CommonFormatUtils.java
@@ -0,0 +1,28 @@
+package cc.sukazyo.cono.morny.util;
+
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+
+public class CommonFormatUtils {
+
+ public static String formatDate (long timestamp, int utcOffset) {
+ return DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS").format(LocalDateTime.ofInstant(
+ Instant.ofEpochMilli(timestamp),
+ ZoneId.ofOffset("UTC", ZoneOffset.ofHours(utcOffset))
+ ));
+ }
+
+ public static String formatDuration (long duration) {
+ StringBuilder sb = new StringBuilder();
+ if (duration > 1000 * 60 * 60 * 24) sb.append(duration / (1000*60*60*24)).append("d ");
+ if (duration > 1000 * 60 * 60) sb.append(duration / (1000*60*60) % 24).append("h ");
+ if (duration > 1000 * 60) sb.append(duration / (1000*60) % 60).append("min ");
+ if (duration > 1000) sb.append(duration / 1000 % 60).append("s ");
+ sb.append(duration % 1000).append("ms");
+ return sb.toString();
+ }
+
+}