Compare commits

...

25 Commits

Author SHA1 Message Date
30c5ae71cc
[[release 1.1.0*nanchang]]
## 📇 Function & Mechanisms

- add /chuang command (from @autoziyaobot)
- add 尊嘟假嘟 reply event (from @hasutestbot)

## 🧯 Bug Fix

- fix OnQuestionMarkReply false-checked message due to a huge amount of repeating normal message
2023-10-09 22:09:20 +08:00
692abb9f56
fix OnQuestionMarkReply false-trigger, add 尊嘟假嘟 2023-10-09 21:51:22 +08:00
253208e830
add /chuang 2023-10-09 18:32:36 +08:00
49bbc03ec0
[[[release 1.0.0*beiping]]]
## 📇 Function & Mechanisms

- new /info command
  - root /info command with new introduction page design
  - /start command with new design like new /info
  - /version and /runtime merged to /info
    - old command still available though been hidden
- new "/x?" in random tools
- new function: reply ? for a ?

## 🔌 for Trusted/Admin

- new MornyReport report exceptions or startup/exit events to telegram chat
- cha *msg supported body-less send check

## 🔩 for self-hosted/developer

- Project port to Scala
- add Dockerfile & docker-compose.yml
- add param for Medication Timer
  - param: --medication-notify-chat / -medc
  - param:--medication-notify-timezone / -medtz
  - param: --medication-notify-times / -medt
- cha unset default params (--master ect. is -1 as default)
  - add ID_501 as Morny function return while not supported by provided master

## 🧯 Bug Fix

- fix unclosed quote will cause exceptions while parsing command.
- fix some hidden command cannot execute due to no support to non-ascii command name. (also changed its behavor while I won't tell too much here)
- fix error while converting millisecond to nanosecond in Medication Timer
- inline query ShareBilibiliVideo now will not receive illegal av/BV id which can cause exceptions.
- /nbnhhsh will now send 404 when there's no input text.
- fix --trusted-chat -1 will caused MornyTrusted throws exception, now it will judge(ignore) the value as design.
- fixed --report-to -1 not process normally
- added missing --dinner-chat startup param.
- Some minor fixes while porting coeur to scala is not listed.
2023-10-09 15:46:30 +08:00
3661cb1264
[[[release 0.8.0.11*putian]]]
## 📇功能

- 关闭了 tracker 功能(以及现在 morny 确实的没有任何文件 IO 了)
- 添加 /encrypt 命令可以对文本使用加密算法处理
  - 支持文本,图片,文件,但不支援复数个图片/文件,同时支援的大小受到 API 限制
  - 支援 base64(enc/dec,url-format) md5, sha1/256/512
  - md5 以及 sha1/256/512 支援 uppercase 选项
- 添加内联查询 twitter 分享链接 format 为 vxtwitter 链接的功能
- 添加内联查询 bilibili 分享链接或av/bv号 format 为 av/bv 视频链接的功能
  - 目前仅支援 bilibili av/bv 视频链接不支援 b23 分享链接
- 添加 /info 命令
  - 目前仅支援 stickers (以及stickers.ID) 选项输出 morny 使用的贴纸
- 添加了可以输出一个之前加进去但是没用到的贴纸的 /install 命令

## 🔌系统接口

- 将所有之前在 sukazyo.cc:untitled-* 的工具类重新放回了 morny.utils 下
  - CommonCommand 名称改为了 UniversalCommand
  - 也将之前的 TelegramUserInformation 和 TGToStringMessage 移动到了 utils.tgapi 的相应位置
  - stringsConnect 添加进了 CommonConvert 当中
- 删除了 EncryptUtils,与之代替的是 CommonEncrypt
  - 之前放在 EncryptUtils 的 byte[] 转 hex string 的工具转移到了新的 CommonConvert 当中
  - encryptByXXX 的命名改为了 hashXXX 的命名(虽然由于目前都是散列工具)
  - CommonEncrypt 也添加了可以用于规范化的 ENC_STD_CHARSET 字段,以及 sha1/256/512 一系列工具方法
- CommonFormatUtils 也跟随上文,类名改为了 CommonFormat(内容没有变)
- 为这三个 utils.CommonXXX 都添加了 Test 类

## 🔩技术修改/typo

- CommonFormat.formatDate 中定义日期格式的字符串独立为了一个字段
- CommonConvert byte -> hex-char 的实现方式改为了 Integer.toHexString
2022-11-02 16:34:32 +08:00
afe8d315a2
[[[release 0.7.2.1*fuzhou]]]
## 🧯Bug Fix

- 修复由于调用错误导致 "user not found" 在内部抛出导致外部无响应的问题 #38
2022-10-01 11:02:25 +08:00
72aea15209
[[[release 0.7.1.3*fuzhou]]]
## 🧯Bug Fix

- 优化对命令格式的检查,使其更加符合 telegram 标准
- 修复 EventHack 中对频道消息对象的错误处理导致事件报错

## 📇功能

- 吃药提醒功能提醒对象改为频道,取消了对提醒的pin,提醒对象改为文本类型
- 吃药提醒添加对最近一个提醒的监听,并提供为其附加时间戳(UTC+8)的功能
- 添加 /quit /stop 别名可用于 /exit

## 🔩技术修改/typo

- 启动线程在呼叫 MornyCoeur 启动时现在会把线程名改为 `morny-init`
- 添加了一条 log 用于记录事件监听器已打开
- 将退出时的数据清理线程名称改为小写
2022-06-10 18:57:42 +08:00
e42dfacb2e
[[[release 0.7.0.16*fuzhou]]]
## 🧯Bug Fix

- 修复不是命令的消息却由命令系统错误抓取又由于包含"@"导致无法传递到其它事件的问题

## 📇功能

- 添加了为安妮吃药提醒功能 #35
- 添加管理员私聊中操作 morny 向某对话发送信息的指令 *msg *msgsend #31
- 删除了 KuohuanhuanNeedSleep 功能
- 删除了对 DP7 关闭 SlashAction 的 feature
- 用户资料获取支持了获取用户所在 dc (通过web-cdn方式) #6
- 添加功能 /XXX还是XXX 随机应答 #2
- 添加 /r 命令用于让用户可以删除自己触发的 bot 消息
- 添加对telegram"内置"命令 /start 的支持,使 /start 返回打招呼的信息

## 🔌系统接口

- 为 Morny Coeur 系统添加了 CODENAME 属性(意指每个大版本的名称)
- 启动参数的 alias 广泛化推进
- 添加 --api 和 --api-files 选项提供 local bot api server 自定义功能 #33
- 添加了从环境变量 TELEGRAM_BOT_API_TOKEN 或 MORNY_TG_TOKEN 获取 bot key 的支持 #34
- 添加了 daemon 包和 MornyDaemons 用于管理 morny coeur 的常驻任务
- 命令系统的规范中,命令名称的声明现在需要删除 "/" 前缀

## 🔩技术修改/typo

- 添加启动时显示 trusted-readers-of-dinner 数据
- 启动时回显 Coeur 版本信息
- 修改 /runtime 回显格式
  - cpu核心数量改放到 vm memory 段落
  - 添加显示系统架构os.arch
  - jvm 信息添加 jvm 制造商java.vm.vendor名称
  - 将 java 版本信息从 java 版本java.version 改为 jvm 版本java.vm.version
- 修改用户资料获取将 firstname 和 lastname 合并为 display name 单个条目
2022-06-01 17:16:06 +08:00
30b10382d6
[[[0.6.4.0]]]
## 🧯Bug Fix

- 紧急修复 --trusted-reader-dinner 参数内部处理错误的问题
2022-05-10 23:43:19 +08:00
6b7c895ddc
[[[release 0.6.3.3]]]
## 🧯Bug Fix

- SlashAction 现在可以正常的使用频道身份的频道名作为显示名称 (但是受API限制无法跟随链接找到频道) #30
- 添加 /user 命令对触发身份是否为频道身份的检查,以避免输出占位符的查询结果而直接弹出"频道身份"的提示 #30
- 修复 inline.user-information 的跨用户缓存问题,并缩短缓存时间到10s #32

## 📇功能

- 添加对私聊中的 "安妮今天吃什么" 的查询,仅允许设定了允许查询"吃什么"的用户使用

## 🔌系统接口

- 添加 --trusted-reader-dinner 参数用于指定一个用户可以获取"安妮今天吃什么"的数据,参数可以重复使用
- MornyTrusted 字段添加了 isTrustedForDinnerRead 字段用于验证用户是否有使用"安妮今天吃什么"的权限
- MornyCoeur 编入了 DINNER_CHAT_ID 字段
- 添加了一个 InlineQueryUnit 包装类用于包装单个 InlineQueryResult 使其提供自己的缓存要求
  - 整合后的 InlineQuery 返回数据组将会继承 isPersonal 的设置,同时取返回值组中的缓存时间最低值

## 🔩技术修改/typo

- GetUserNameAndId 现在将会停止对 channel_bot(id:136817688) 的数据返回 #30
2022-05-10 23:38:30 +08:00
7def016bdc
[[[release 0.6.2.0]]]
## 🧯Bug Fix

修复 sleep 功能的 lapis_apple 段的时间检查错误
2022-03-18 00:39:31 +08:00
0d4588d3d2
[[[release 0.6.1.1]]]
## 📇功能

- 为 @Lapis-Apple 也添加 khh 定制功能
- runtime 主机名显示
- runtime/version 信息容错报错
  - 如果主机名显示出错则会是 "<unknown>"
  - core-md5 出错将会显示 "<non-jar-runtime>" 或是 "<calculation-error>" 信息而非报错信息
2022-03-17 13:18:14 +08:00
77337b4557
[[[release 0.6.0.2]]]
## 📇功能

- @KuoHuanHuan 定制的睡觉禁止发言功能添加
- 斜线响应使其基本符合 t.me/hasutestbot 标准 (#26
2022-03-15 17:47:30 +08:00
864800122e
[[[release 0.5.1.1]]]
## 🧯Bug Fix

- 修复误将 /o 命令写为 /on 命令的问题
- 使 Morny 在更新命令表时会先执行一遍命令表删除
2022-03-15 17:45:00 +08:00
f0821ac492
[[[release 0.5.0.6]]]
## 📇功能

- 添加了 [inline][li-me] 版本的 /user 目前只支持获取自己的信息
- 添加 [「喵呜」][cm-meow] 系列...命令...?

## 🔌系统接口

- 正式删除了被弃用的 key 和 username 的参数直赋
- 添加自动向 Telegram 同步与清理命令列表的功能
  - 添加了启动选项 --auto-cmd-list 控制同步行为
  - 添加了启动选项 --auto-cmd-remove 控制清理行为
- 为现在已有的启动行为控制类选项添加了其简写形式
- 添加 TelegramCommand 抽象层与管理类
- 添加了 InlineQuery 抽象层与管理器

## 🔩技术修改/typo

- 关闭 raw 输出 在查询字符串为空时的触发
- 删除显示 186 whois 查询 查询结果的 >>> xxx <<< 后的注释信息
2022-03-15 17:42:28 +08:00
fc3eb3983a -----BEGIN PGP SIGNATURE-----
iQGzBAABCAAdFiEERI59IUZFsNkyOsDp77R9mP4IL60FAmHuKlkACgkQ77R9mP4I
 L60rCwv9H5wYNtV9b7ROSyFYjsKw+N7KXRJf1pVY0ZI3AN0xWGxxTgt933gUm0AG
 zNRoxrxAu4ioaSzxOpFVWNN94S/kXTT8gnz4ow2e6DG3f3sQz/aClxwVU0VeQp8H
 SFpE8oDe0X/1tk7cUN63ousP8kdj638gUxYpHdgK99zrRZ/JOOe+wVayGRyY42Zy
 riaJp1HkOPjPBRs9AM3ipm9USo03sRJOUh6PA4dz7uNZEjEUwf+bxY2JJYq5cPU8
 Jt4jYx8bpeZzgUPnrhS9NrL1/b8NIcJGGUrVDyOPTHghaJDMENvD2cPPW/DRNqhr
 oBCpCeM/jH9GcU74k1BCMeKKxmEy4QJCtRmQuWQkZ1xARannnBpV6xXHAkPr7dSy
 jue1+QuXiEWr87Ln2NJ5U6IDaXA5J0onm8E2S2h4Sb7pX7TcBZZKSyPJT88l2jpa
 vvDSJrZjdtddRRCbaQ9Oq9/EqVUvH5cbHkhsMIX9HOcyg8Xxz7xHlySqwvFh4KOY
 X25jIWop
 =kRxB
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCAAdFiEERI59IUZFsNkyOsDp77R9mP4IL60FAmIwXnMACgkQ77R9mP4I
 L63fhQwAqPxaXQlEuuBWOgHMNv8wP+coft1Jb6efyqUmrsDYoU1pJMi6m6cVNxnQ
 ykMeO6/97unjbnqx8fX/aCKVhSVNOeIem5b1iBtF9Uc3a73KjqbBJEURMGeexUg6
 4fUXobtYlODMJNZ3dP/4rWxDKVFhL1oAucOQivKJlMxhGYKJpFekYKCruXUg1zP9
 3JaY4p+gpKiAOhjmzDYEpu9eET95D3EUbRZOIClgDA3AGCDxGSTk9ib35agBn/G7
 Xg5V4T61D4MB0HEvRdtrXjijrP4HLCe/i6rYzQLQdPFfMSaQaJ1hgO3tva6vclex
 aHVM4YofO5JKwvK+IxzGMcf+Kom1UVKUIvlt15hARvh1AsVndE7nfVDV/c8EY8yi
 o+HGfAIn0w72ZTKxAbeMXfR6nFOEqTC8Af8L8UpKKq6W8Ap0XzaeoPb8Gob39SPj
 1NSDOQRXrYoJnwHUkCCnG1KLARzLIVVhRojsOHD8Gs5Y9zhbHXfFMM0Z4CwXHNdp
 folCXKgW
 =Znu0
 -----END PGP SIGNATURE-----

[[[release 0.4.3.7]]]

## 📇功能

- 添加 /save 命令,用于进行手动的数据保存(要求可信成员权限)。
- 添加 /nbnhhsh 命令,通过调用 https://lab.magiconch.com/api/nbnhhsh/ 查询文本内的 nbnhhsh 词条,支持后接或回复消息作为参数。
- /ip 和 /whois 命令现在可以将回复的消息作为参数处理。
- 中断斜杠动作在 ".DP7" 相关群组的响应

## 🔌系统接口

- 添加程序级别的数据保存方法。
- 将大部分 util 和 telegram-api extend 移动到 untitled 项目中。
- Coeur 主类为 untitled 的 ExtraAction[hsy] 添加实例持有。
- 使用 untitled:util-telegram-api-formatter 进行 Telegram 对象的扩展 ToString

## 🔩技术修改/typo

- 为 .gitignore 添加 .vscode 目录忽略
- 将 telegram api exec 由 TelegramBot#execute() 更改为 ExtraAction#exec()[hsy] 以支持了普通的错误处理
2022-03-15 17:37:55 +08:00
31e25308bb
[[[ release 0.4.2.11 ]]]
## 🧯Bug Fix

- 修复 /user 命令在遇到无 username 用户时会将 java.null 转译为值而非报空的问题
- ((隐藏问题)) 为所有消息发送补全特殊字符转义,修复当拼接内容有 html 特殊字符 < > & 时,telegram api 将无法处理导致无法发送消息

## 📇功能

- 添加呼叫 morny 主人功能
- 添加 /ip 和 /whois 命令 (#17 @186526
- 添加 /event_hack 命令
- 添加 /jrrp 命令以及其 xmomi 版本后端
- /user 命令现在在无参数时返回调用者的数据而非回报错误
- /runtime 命令的返回数据的 continuous 字段添加了启动时间回报

## 🔌系统接口

- 添加了主人 id 记录,用作可信认证和部分功能
- 封装对象化了 MornyCoeur 和 MornyTrusted
- 程序启动参数扩充
  - 以选项方式为 token 与 username 字段赋值
  - 实现 morny 主人和信任群组字段的赋值
  - 同时标记旧的 token username 参数赋值可能废弃
- 添加 apache-commons-text 类库 用于进行 HTML 实体转义
- 添加了 escapeHtmlTelegram 工具 用于进行 telegram api HTML 实体转义
- 移除了没有再被使用的 repeatChars 工具

## 🔩技术修改/typo

- 事件的"忽略程序启动前"作用范围现在扩大为所有 Message 和 EditedMessage 事件
- 添加了贴纸管理类
- 修改 /runtime 的文本
- 补充部分 javadoc
- 为项目添加 .editorconfig
- 将部分误导入的 jetbrains.NotNull 改为 javax.Nonnull
2021-12-27 17:23:24 +08:00
fcea3d51b7
Merge tag '0.4.1.3@mvn' into release 2021-12-24 18:30:54 +08:00
f9d3601c42
Merge tag '0.4.0.1@mvn' into release 2021-12-24 18:30:46 +08:00
868542cd4e
Merge tag '0.3.4.4' into release 2021-12-24 18:30:38 +08:00
85bc22ea91
Merge tag '0.3.3@mvn' into release 2021-12-24 18:30:11 +08:00
f6b64493b2
Merge tag '0.3.0@mvn' into release 2021-12-24 18:29:58 +08:00
7dee5a9d40
Merge tag '0.2.0@mvn(c3)' into release 2021-12-24 18:29:52 +08:00
9f394bef66
Merge tag '0.1.2@mvn' into release 2021-12-24 18:29:42 +08:00
8e570405c2
Merge tag '0.1.1@mvn' into release 2021-12-24 18:29:22 +08:00
9 changed files with 194 additions and 29 deletions

View File

@ -5,12 +5,12 @@ MORNY_ARCHIVE_NAME = morny-coeur
MORNY_CODE_STORE = https://github.com/Eyre-S/Coeur-Morny-Cono MORNY_CODE_STORE = https://github.com/Eyre-S/Coeur-Morny-Cono
MORNY_COMMIT_PATH = https://github.com/Eyre-S/Coeur-Morny-Cono/commit/%s MORNY_COMMIT_PATH = https://github.com/Eyre-S/Coeur-Morny-Cono/commit/%s
VERSION = 1.0.0-RC6 VERSION = 1.1.0
USE_DELTA = false USE_DELTA = false
VERSION_DELTA = VERSION_DELTA =
CODENAME = beiping CODENAME = nanchang
# dependencies # dependencies

View File

@ -1,9 +1,9 @@
package cc.sukazyo.cono.morny package cc.sukazyo.cono.morny
import cc.sukazyo.messiva.logger.Logger
import cc.sukazyo.messiva.appender.ConsoleAppender import cc.sukazyo.messiva.appender.ConsoleAppender
import cc.sukazyo.messiva.formatter.SimpleFormatter import cc.sukazyo.messiva.formatter.SimpleFormatter
import cc.sukazyo.messiva.log.LogLevel import cc.sukazyo.messiva.log.LogLevel
import cc.sukazyo.messiva.logger.Logger
import java.io.{PrintWriter, StringWriter} import java.io.{PrintWriter, StringWriter}

View File

@ -30,6 +30,8 @@ class MornyCommands (using coeur: MornyCoeur) {
private val $MornyManagers = MornyManagers() private val $MornyManagers = MornyManagers()
//noinspection NonAsciiCharacters //noinspection NonAsciiCharacters
private val $喵呜 = 喵呜() private val $喵呜 = 喵呜()
//noinspection NonAsciiCharacters
private val $创 = ()
private val commands: CommandMap = CommandMap( private val commands: CommandMap = CommandMap(
$MornyHellos.On, $MornyHellos.On,
@ -54,7 +56,9 @@ class MornyCommands (using coeur: MornyCoeur) {
//noinspection NonAsciiCharacters //noinspection NonAsciiCharacters
私わね(), 私わね(),
//noinspection NonAsciiCharacters //noinspection NonAsciiCharacters
$喵呜.Progynova $喵呜.Progynova,
//noinspection NonAsciiCharacters
$创.Chuang
) )

View File

@ -0,0 +1,76 @@
package cc.sukazyo.cono.morny.bot.command
import cc.sukazyo.cono.morny.MornyCoeur
import cc.sukazyo.cono.morny.data.TelegramStickers
import cc.sukazyo.cono.morny.util.tgapi.InputCommand
import cc.sukazyo.cono.morny.util.tgapi.TelegramExtensions.Bot.*
import com.pengrad.telegrambot.model.{MessageEntity, Update}
import com.pengrad.telegrambot.request.{SendMessage, SendSticker}
//noinspection NonAsciiCharacters
class (using coeur: MornyCoeur) {
object Chuang extends ISimpleCommand {
override val name: String = "chuang"
override val aliases: Array[ICommandAlias] | Null = null
override def execute (using command: InputCommand, event: Update): Unit = {
val text =
if (command.args nonEmpty)
command.args mkString " "
else if ((event.message.replyToMessage ne null) && (event.message.replyToMessage.text ne null))
event.message.replyToMessage.text
else
// this will directly return for not conflict with @autoziyaobot
return;
val chuangText = .chuangText(text)
coeur.account exec SendMessage(
event.message.chat.id,
chuangText
).entities(
MessageEntity(MessageEntity.Type.pre, 0, chuangText.length)
).replyToMessageId(event.message.messageId)
}
}
}
//noinspection NonAsciiCharacters
object {
def chuangText (text: String): String = {
val c = StringBuilder()
import cc.sukazyo.cono.morny.util.StringEnsure.ensureSize
import Math.*
val lines = text split '\n'
val _base = max(5, lines.map(l => l.length).max)
val _min = 5
val _ext = _base - _min
c ++= raw" " ++= " " * _base ++= raw" \ | " += '\n'
c ++= raw" " ++= " " * _base ++= raw" -+- " += '\n'
c ++= raw" +-+-" ++= "-" * _base ++= raw"-+-\ O " += '\n'
c ++= raw" | | " ++= " " * _base ++= raw" || \ " += '\n'
if (lines.length > 1)
c ++= raw" | | " ++= lines(0).ensureSize(_base) ++= raw" || \ " += '\n'
for (l <- lines drop 1 dropRight 1)
c ++= raw" | | " ++= l.ensureSize(_base) ++= raw" || | " += '\n'
c ++= raw" | | " ++= lines.last.ensureSize(_base) ++= raw" || | O " += '\n'
else
c ++= raw" | | " ++= lines(0).ensureSize(_base) ++= raw" || \ O " += '\n'
c ++= raw" | | " ++= " " * _base ++= raw" || | -+- " += '\n'
c ++= raw" +-+-" ++= raw"-/-\-${"-" * _ext}" ++= raw"-++/-\+ _/ \ " += '\n'
c ++= raw" " ++= raw" \_/ ${" " * _ext}" ++= raw" \-/ " += '\n'
c toString
}
}

View File

@ -5,11 +5,14 @@ import cc.sukazyo.cono.morny.MornyCoeur
class MornyEventListeners (using manager: EventListenerManager) (using coeur: MornyCoeur) { class MornyEventListeners (using manager: EventListenerManager) (using coeur: MornyCoeur) {
private val $OnUserRandom = OnUserRandom()
manager.register( manager.register(
// ACTIVITY_RECORDER // ACTIVITY_RECORDER
// KUOHUANHUAN_NEED_SLEEP // KUOHUANHUAN_NEED_SLEEP
OnUniMeowTrigger(using coeur.commands), OnUniMeowTrigger(using coeur.commands),
OnUserRandom(), $OnUserRandom.RandomSelect,
//noinspection NonAsciiCharacters
$OnUserRandom.尊嘟假嘟,
OnQuestionMarkReply(), OnQuestionMarkReply(),
OnUserSlashAction(), OnUserSlashAction(),
OnCallMe(), OnCallMe(),

View File

@ -36,7 +36,9 @@ object OnQuestionMarkReply {
def isAllMessageMark (using text: String): Boolean = { def isAllMessageMark (using text: String): Boolean = {
boundary[Boolean] { boundary[Boolean] {
for (c <- text) if QUESTION_MARKS contains c then boundary.break(false) for (c <- text)
if !(QUESTION_MARKS contains c) then
boundary break false
true true
} }
} }

View File

@ -4,37 +4,65 @@ import cc.sukazyo.cono.morny.MornyCoeur
import cc.sukazyo.cono.morny.bot.api.EventListener import cc.sukazyo.cono.morny.bot.api.EventListener
import cc.sukazyo.cono.morny.util.tgapi.TelegramExtensions.Bot.exec import cc.sukazyo.cono.morny.util.tgapi.TelegramExtensions.Bot.exec
import com.pengrad.telegrambot.model.Update import com.pengrad.telegrambot.model.Update
import com.pengrad.telegrambot.request.SendMessage import com.pengrad.telegrambot.request.{AbstractSendRequest, SendMessage}
import com.pengrad.telegrambot.response.SendResponse
import scala.language.postfixOps import scala.language.postfixOps
class OnUserRandom (using coeur: MornyCoeur) extends EventListener { class OnUserRandom (using coeur: MornyCoeur) {
private val USER_OR_QUERY = "^(.+)(?:还是|or)(.+)$"r
private val USER_IF_QUERY = "^(.+)(?:吗\\?||\\?|吗?)$"r
override def onMessage(using update: Update): Boolean = { object RandomSelect extends EventListener {
if update.message.text == null then return false
if !(update.message.text startsWith "/") then return false
import cc.sukazyo.cono.morny.util.UseRandom.rand_half private val USER_OR_QUERY = "^(.+)(?:还是|or)(.+)$" r
val query = update.message.text substring 1 private val USER_IF_QUERY = "^(.+)(?:吗\\?||\\?|吗?)$" r
val result: String|Null = query match
case USER_OR_QUERY(_con1, _con2) =>
if rand_half then _con1 else _con2
case USER_IF_QUERY(_con) =>
// for capability with [[OnQuestionMarkReply]]
if OnQuestionMarkReply.isAllMessageMark(using _con) then return false
(if rand_half then "不" else "") + _con
case _ => null
if result == null then return false override def onMessage (using update: Update): Boolean = {
if update.message.text == null then return false
if !(update.message.text startsWith "/") then return false
import cc.sukazyo.cono.morny.util.UseRandom.rand_half
val query = update.message.text substring 1
val result: String | Null = query match
case USER_OR_QUERY(_con1, _con2) =>
if rand_half then _con1 else _con2
case USER_IF_QUERY(_con) =>
// for capability with [[OnQuestionMarkReply]]
if OnQuestionMarkReply.isAllMessageMark(using _con) then return false
(if rand_half then "不" else "") + _con
case _ => null
if result == null then return false
coeur.account exec SendMessage(
update.message.chat.id, result
).replyToMessageId(update.message.messageId)
true
}
coeur.account exec SendMessage( }
update.message.chat.id, result
).replyToMessageId(update.message.messageId) //noinspection NonAsciiCharacters
true object 尊嘟假嘟 extends EventListener {
private val keywords = Array("尊嘟假嘟", "O.o", "o.O")
override def onMessage (using event: Update): Boolean = {
if event.message.text == null then return false
if !(keywords contains event.message.text) then return false
import cc.sukazyo.cono.morny.util.UseRandom.rand_half
coeur.account exec SendMessage(
event.message.chat.id,
if rand_half then "尊嘟" else "假嘟"
).replyToMessageId(event.message.messageId)
true
}
} }

View File

@ -0,0 +1,17 @@
package cc.sukazyo.cono.morny.util
object StringEnsure {
extension (str: String) {
def ensureSize(size: Int, paddingStr: Char = ' '): String = {
if (str.length < size) {
val padding = paddingStr.toString * (size-str.length)
str + padding
} else str
}
}
}

View File

@ -0,0 +1,35 @@
package cc.sukazyo.cono.morny.test.cc.sukazyo.cono.morny.event
import cc.sukazyo.cono.morny.bot.event.OnQuestionMarkReply
import cc.sukazyo.cono.morny.test.MornyTests
import org.scalatest.prop.TableDrivenPropertyChecks
class OnQuestionMarkReplyTest extends MornyTests with TableDrivenPropertyChecks {
"on replying a question mark :" - {
"on checking if a message is a question mark :" - {
val examples = Table(
("text", "is"),
("回来了", false),
("为什么?", false),
("?这不合理", false),
("??尊嘟假嘟", false),
("?????", true),
("?", true),
("", true),
("??❔", true),
)
forAll(examples) { (text, is) =>
s"$text should checked with result $is" in:
OnQuestionMarkReply.isAllMessageMark(using text) shouldEqual is
}
}
}
}