MrXiaoM 发布的最佳帖子
-
RE: 如何获取信息链中的元素?
@zhou2008
你是不是直接把 MessageChain 显性转换为 At 然后获取 target 了…
不可能转换得了的,MessageChain 可以被理解为列表,而文字、At、图片等是列表里的元素下面这是我从文档里复制来的
处理富文本消息Mirai 不内置富文本消息的处理工具类。
MessageChain
实现接口List<SingleMessage>
,一个思路是遍历 list 并判断类型处理:for (element : messageChain) { if (element instanceof Image) { // 处理一个 Image } }
也可以像数组一样按下标随机访问:
SingleMessage element = messageChain.get(0); if (element instanceof Image) { // 处理一个 Image }
补:我在java中获取机器人是否被at的代码是这样的,可以参考下:
boolean isAt = false; for (SingleMessage s : event.getMessage()) { if (s instanceof At) { At at = (At) s; if (at.getTarget() == event.getBot().getId()) { isAt = true; break; } } } if (isAt) { // do sth. }
补:刚刚又翻了下文档发觉kt好香啊
val image: Image? = chain.findIsInstance<Image>()
-
RE: W/MCL Addon: iTXTech Soyuz 未安装,Soyuz MCL Handler 特性已禁用
Soyuz 是 iTXTech 开发的 Websocket API 服务。
鉴于它可以配合 MCL Addon 进行包管理,它很可能是将来的插件中心所需插件。
在官方宣布插件中心建成之前 (2021年4月3日起至今未完成),它似乎没有什么用途,不用管。 -
适用于新人的 mirai 帮助文档【备份】
已弃用
该文档现已弃用,新的文档正在编写中,敬请期待
https://wiki.mrxiaom.top/mirai旧文档 Github: MrXiaoM/mirai-docs
旧文档地址: https://mirai-docs.doomteam.fun/
一切内容以 Github 为准
希望论坛字数限制够放得下文档
如果你想实时收到更新通知,请点击右边第二个 铃铛按钮 来关注本贴mirai-docs
面向初学者 的
mirai
非官方帮助文档在本文档中,我将会按照顺序一步一步地教学,
就像打怪升级一样目前正在编写和整理中,敬请期待
注:
初学者
指new miraier
,刚接触mirai
的人观前须知
请先阅读《提问的智慧 (How To Ask Questions The Smart Way)》以确保你在遇到简单的问题时能够
STFW
(到网上搜索) 以及RTFM
(读软件给出的帮助手册) 来解决问题而不是去问别人占用别人的时间,如果你的问题能搜索得到,那你得到的回复很可能是别人搜索了然后发你的,鲁迅曾经说过:“无端空耗别人的时间其实是无异于谋财害命的。”
所以在没到网上搜索之前不要提问!不要提问!不要提问!
在遇到网上搜索/读手册解决不了 (前提是要读过,要实践过确实不行) 再去以正确的方式提问,比如提供尽可能完整的信息,包括但不限于系统版本/所使用的软件或组件版本/进行的详细操作/输出日志或者弹出信息等等,而不是你问在吗,别人回答在,你问问题,别人找你要信息,你发信息,别人觉得信息不够推断不出来你的问题然后再进一步找你要信息…… 直接一步到位把信息提供全面难道不好吗?
如果你有问题,可以在本仓库 发布 issue (没有
Github
账号?点这里注册)。也可以向我的邮箱
coolxiaom95@gmail.com
发送邮件求助,或者加我的QQ 2431208142 (我没设加好友验证,申请添加好友之后请直接说明来意和详细描述问题)。
不管是在哪个渠道联系我,我看到你的消息之后将会在我空闲时尽快回复。
确认你的水平
在查阅这份文档之前,请确保你已掌握
kotlin
或者java
两门语言中的其中一门如果你已掌握一门语言并能使用这门语言进行网络操作,很抱歉目前我没有对这方面的研究,你可以去查看官方文档
如果你是完全不会编程的人类,你只需要查阅用户文档
如果你不是人类…… 能看得懂简体中文并能理解句子的意思的话大概也可以看得懂吧
开始吧
适合不会编程的新手: 用户文档
如果你还不会如何安装和登录机器人,也请查阅用户文档
使用
kotlin
或java
来编写mirai
衍生软件: 开发文档使用其他语言来编写
mirai
衍生软件:暂无文档,建议查阅官方文档在这个文档发布之前,已经有很多前辈编写了
mirai-api-http
或者onebot-kotlin
的其他语言实现,你可以在 mirai 官方开发文档 找到相应语言的社区SDK以便快速开始开发如果你对更新 BlocklyMirai 有兴趣,可以查看 BlocklyMirai 帮助文档
更新
不定期更新,如果你有意愿更新文档,PRs welcome
赞助
本文档不接受赞助。
如果你喜欢这个文档并有意资助,开发组比我更需要赞助,请重定向到 【官方公告】关于论坛赞助/资金流向公示/可持续发展等
计划
- 开发文档以循循渐进的形式写,从部署到登录到事件到消息等等
- 不使用社区 SDK 的非 jvm 语言与 mirai-api-http 交互教程。因为社区 SDK 太多了很难讲明白 XD
- 考虑到 GitBook 日常前端崩溃,所以在本文档基本上完成之后,会在 MiraiForum 技术交流板块发一贴来备份以方便难以访问 Github 的用户查阅
-
RE: 请问大佬们有什么屏蔽消息的思路吗
@xing-c
因为上面已经有 kotlin 的示例了,这里只提 java 的示例。
所在环境是插件主类,所以可以用this.getCoroutineContext()
获取到当前协程,用 bot 实例的协程应该也是可以的。
Example1 - 使用事件频道注册单个事件eventChannel.subscribeAlways(GroupMessageEvent.class, this.getCoroutineContext(), ConcurrencyKind.CONCURRENT, EventPriority.HIGHEST, e ->{ if(e.getSender().getId() == 114514L) { e.intercept(); return; } });
Example2 - 在EventHost內注册事件
@EventHandler(priority = EventPriority.HIGHEST) public ListeningStatus onGroupMsg(GroupMessageEvent event) { if(event.getSender().getId() == 114514L) { event.intercept(); return ListeningStatus.LISTENING; } return ListeningStatus.LISTENING; }
只要多看文档都能写出来的,建议问前多翻阅文档 ✓
-
RE: Mirai闪照破解
@EventHandler public void onFriendMessage(FriendMessageEvent event){ Optional<FlashImage> flashImage = event.getMessage().stream().filter(it -> it instanceof FlashImage).findFirst() if (flashImage.isPresent()) { Image image = flashImage.get().getImage(); event.getSender().sendMessage(new PlainText("你发送了一张闪照\n").plus(image)); } }
-
RE: 面向新人的 mirai 开发/使用文档
@imldy 其实这个地方的 xwx 是乱写的(
在这段的前面我告诉在文档阅读者,之后消息通道都会用channel
代替了,然后下面这里给出了替换的示例,那个地方没加粗,好像在粗读的时候很难看到,以后改 -
RE: E/main: Failed to init MiraiConsole.
不要的眼睛可以捐给别人,1.3.0 的更新日志说得很清楚了
此版本仅供参考,无法使用,如需正常使用,请使用 1.2.0-beta 中的发布
-
获取回复消息(QuoteReplay)指向原文的实现思路
总所周知,腾讯服务器给你返回的 QuoteReply 的源消息并不是富文本消息,也就是说,图片会“退化”为
[图片]
等等。如果我们想做回复消息搜图之类的功能,这给我们带来了比较多的麻烦。但是,我们可以取到源消息的 MessageSource,只要你本地存了聊天记录,就能够通过 MessageSource 获取相应消息。按照这个思路,我们只要跟QQ客户端一样,把消息存到本地,需要时获取即可。
具体实现
本帖中将使用 Mirai Hibernate Plugin 插件储存聊天记录,演示获取回复消息原文的方法。
引用依赖
// build.gradle(.kts) repositories { mavenCentral() } dependencies { compileOnly("xyz.cssxsh.mirai:mirai-hibernate-plugin:依赖版本") } // hibernate 6 和 HikariCP 5 需要 jdk11 mirai { jvmTarget = JavaVersion.VERSION_11 }
//author("MrXiaoM") // 在主类插件信息处声明插件依赖关系 dependsOn("xyz.cssxsh.mirai.plugin.mirai-hibernate-plugin", false)
Kotlin
val QuoteReply.originalMessageFromLocal: MessageChain get() = MiraiHibernateRecorder[source].firstOrNull()?.toMessageChain() ?: source.originalMessage // 使用示例 @EventHandler fun GroupMessageEvent.listen() { // 检测回复消息 message[QuoteReply.Key]?.run { val original = originalMessageFromLocal // do sth. } }
Java
public static MessageChain getOriginalMessageFromLocal(QuoteReply quote) { Optional<MessageRecord> record = MiraiHibernateRecorder.INSTANCE.get(quote.getSource()).stream().findFirst(); return record.map(MessageRecord::toMessageChain).orElseGet(() -> quote.getSource().getOriginalMessage()); } // 使用示例 @EventHandler public void onGroupMessage(GroupMessageEvent event) { // 检测回复消息 QuoteReply quote = event.getMessage().get(QuoteReply.Key); if (quote != null) { MessageChain original = getOriginalMessageFromLocal(quote); // do sth. } }