社团的联系方式有Telegram Group和QQ群两种,社团的前辈大佬模仿Wikipedia中文组的@zhmrtbot
模式实现了一个聊天转发互通机器人,原版是基于CoolQ Air的,带来的弊端在于:
- 无法直接发送图片(使用了Vim-CN图床来转换为连接发送)
- 无法显示被回复引用消息.
- 需要Windows环境依赖,性能较差.
出于众所周知的原因,CoolQ已经停止了服务,群里少了很多欢乐,于是决定使用mirai框架重写机器人.
mirai 是一个在全平台下运行,提供 QQ Android 协议支持的高效率机器人库.基于Kotlin语言.
大概的坑如下:
- Kotlin语言多应用于Android开发,很少用于jvm开发(而由于Kotlin的某个Bug,mirai甚至不能再Android平台使用,因特斯汀.....),因此包括部署等坑一把(idea找不到主类,不过最新版Kotlin插件通过自己手动生成一个
MANIFEST.MF
这种很不优雅的办法修复了) - mirai使用了大量的协程和DSL,对我这种Java都没经验的菜鸡来讲很不友好.
对于Kotlin Bot的库,选择只有两个,选择了更新最近的一个,即kotlin-telegram-bot,然而在Dispatch中的函数并非是suspend
的,因此无法实现Kotlin的协程特性(看了源代码来看,感觉没有用到多少Kotlin特性,大多数还是Java的思想),而且Jitpack上的版本属实太老了,因此拉下来源代码自行编译引入.
由于Bot库是非suspend,而mirai的发送函数是suspend的,无法直接在Bot的逻辑中执行mirai函数,一开始采用了runblocking
这种极不优雅的方案,即阻塞线程等待mirai挂起恢复,后来发现了GlobalScope.launch
单独开启一个顶层协程,算是部分解决了这个问题.
P.S. 后来有尝试过为Bot库加上suspend的特性,然鹅出于Kotlin的另一个Bug Support suspend function as super type,在当前代码架构下实现,我还是太菜了
属实是我最艰难的一次开发,mirai和bot库均无完善的文档,基本靠翻源码注释和猜测,Kotlin在Android开发之外也确实有很多小问题,有一次升级了Kotlin插件版本导致了ClassDefNotFound
的bug,(如果有其他选择,我绝不会跳这个火坑.....