MrXiaoM 发布的帖子
-
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: 掉线期间的消息怎么接受
你想要的功能已经被加到不确定在什么版本更新的“Backlog”里程碑里了
https://github.com/mamoe/mirai/issues/1265
等就完事了,不知道在什么时候会增加这个新特性 -
RE: 有关于开源协议
mamoe/mirai 的readme里有提到
mirai 采用 AGPLv3 协议开源。为了整个社区的良性发展,我们强烈建议您做到以下几点:
间接接触(包括但不限于使用 Http API 或 跨进程技术)到 mirai 的软件使用 AGPLv3 开源
-
[Java][踩坑] 关于中文域名解析 Punycode 编码
我有一个朋友,他买了个域名,然后绑了 CNAME 和 SRV 记录到我的 Minecraft 服务器上,但可惜的是,Minecraft 客户端并无 Punycode 编码域名支持,然后我用网络爬虫 (低情商: 百度) 搜找到了 Punycode 转码的码子,以为就一劳永逸了,结果这玩意并不完全,下面的是我补好可以直接用的轮子。写得不是很好,如有错希望大佬能指出
public class Punycode { private static int TMIN = 1; private static int TMAX = 26; private static int BASE = 36; private static int INITIAL_N = 128; private static int INITIAL_BIAS = 72; private static int DAMP = 700; private static int SKEW = 38; private static char DELIMITER = '-'; public static String encodeURL(String url) { if (!url.contains(".")) return url; String mainContent = url.substring(0, url.lastIndexOf(".")); String prefix = mainContent.contains(".") ? mainContent.substring(0, mainContent.lastIndexOf(".") + 1) : ""; if (mainContent.contains(".")) mainContent = mainContent.substring(mainContent.lastIndexOf(".") + 1); mainContent = Punycode.encode(mainContent, "xn--"); String suffix = url.substring(url.lastIndexOf(".")); return prefix + mainContent + suffix; } /** * * Punycodes a unicode string. THIS IS NOT SUITABLE FOR UNICODE AND LETTER * MIXING * * @param input Unicode string. * * @return Punycoded string, but original text for throw an exception * */ public static String encode(String input) { return Punycode.encode(input, ""); } /** * * Punycodes a unicode string. THIS IS NOT SUITABLE FOR UNICODE AND LETTER * MIXING * * @param input Unicode string. * * @return Punycoded string, but original text for throw an exception * */ public static String encode(String input, String successPrefix) { int n = INITIAL_N; int delta = 0; int bias = INITIAL_BIAS; StringBuilder output = new StringBuilder(); int b = 0; for (int i = 0; i < input.length(); i++) { char c = input.charAt(i); if (isBasic(c)) { output.append(c); b++; } } if(b >= input.length()) return output.toString(); if (b > 0) { output.append(DELIMITER); } int h = b; while (h < input.length()) { int m = Integer.MAX_VALUE; for (int i = 0; i < input.length(); i++) { int c = input.charAt(i); if (c >= n && c < m) { m = c; } } if (m - n > (Integer.MAX_VALUE - delta) / (h + 1)) { return input; } delta = delta + (m - n) * (h + 1); n = m; for (int j = 0; j < input.length(); j++) { int c = input.charAt(j); if (c < n) { delta++; if (0 == delta) { return input; } } if (c == n) { int q = delta; for (int k = BASE;; k += BASE) { int t; if (k <= bias) { t = TMIN; } else if (k >= bias + TMAX) { t = TMAX; } else { t = k - bias; } if (q < t) { break; } output.append((char) digit2codepoint(t + (q - t) % (BASE - t))); q = (q - t) / (BASE - t); } output.append((char) digit2codepoint(q)); bias = adapt(delta, h + 1, h == b); delta = 0; h++; } } delta++; n++; } output.insert(0, successPrefix); return output.toString(); } private static int adapt(int delta, int numpoints, boolean first) { if (first) { delta = delta / DAMP; } else { delta = delta / 2; } delta = delta + (delta / numpoints); int k = 0; while (delta > ((BASE - TMIN) * TMAX) / 2) { delta = delta / (BASE - TMIN); k = k + BASE; } return k + ((BASE - TMIN + 1) * delta) / (delta + SKEW); } private static boolean isBasic(char c) { return c < 0x80; } private static int digit2codepoint(int d) { if (d < 26) { return d + 'a'; } else if (d < 36) { return d - 26 + '0'; } else { return d; } } }
那个朋友真不是我自己
-
RE: mirai更新到2.7M1后mirai-api-http插件无法使用
我都是直接
java -cp ./content/*;./libraries/* net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader
到 Maven Central 补全 mirai 的包 (bcprov-jdk15on, mirai-core-all, mirai-console, mirai-console-terminal),丢到 content 文件夹里,一直没出过事(
可能是我爱折腾不喜欢用启动器吧 -
RE: 请问大佬们有什么屏蔽消息的思路吗
@picpo 很蠢的方法…难道是跟我一样吗(
// onGroupMessage(GroupMessageEvent event) if(this.main.getConfig().isBlackList(sender.getSenderID())) return; // do sth
-
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>()