你想要的功能已经被加到不确定在什么版本更新的“Backlog”里程碑里了
https://github.com/mamoe/mirai/issues/1265
等就完事了,不知道在什么时候会增加这个新特性
Posts made by MrXiaoM
-
RE: 掉线期间的消息怎么接受
-
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>()
-
RE: mirai 有退群 协议吗?假如,复读机
我的代码质量老低了… 仅供参考
if(event.getSender().getPermission() == MemberPermission.ADMINISTRATOR|| event.getSender().getPermission() == MemberPermission.OWNER) { boolean atFlag = false; for(int i = 0;i<event.getMessage().size();i++) { SingleMessage single = event.getMessage().get(i); if(!atFlag) { if(single instanceof At) { if(((At)single).getTarget() == event.getBot().getId()) { atFlag = true; } } } else { if(single.contentToString().contains("有缘再会")) { event.getGroup().sendMessage("拜拜了您嘞"); event.getGroup().quit(); break; } } } }
-
RE: mirai 有退群 协议吗?假如,复读机
监听
GroupMessageEvent
判断发送者的身份和发送的内容,如果符合你指定的条件就event.getGroup().quit();
-
RE: *卡在开头的萌新()
@zuichen 一是载入 chat-commands 时找不到类,二是找不到方法 java.nio.file.Files.exist(Path, [LinkOption]),毕竟载入插件是个实验性功能,不能要求太高,在插件功能稳定前最好使用 mirai-console 而不是 MiraiAndroid
-
RE: idea这里gradle下载有403
bintray 通道早就停止提供服务了说…
如果能找到其他下载源就好,我用 Eclipse 因为只要新建个文件指定插件主类路径一直都莫得问题(
多翻文档 -
RE: *卡在开头的萌新()
啊这,建议问问题时带上你使用的mirai各组件名称及其版本
然后我更推荐使用 mirai-console 而不是 MiraiAndroid
我顺藤摸瓜找到的 MiraiAndroid,它的页面说明了兼容 mirai-console 插件(实验性)
对于新手,与其使用不稳定的版本,不如租台云服务器或者使用自家电脑来使用 mirai-console补充
对于其他插件请自行尝试;此外,如果你的插件使用了一些 Android 不支持的 api(例如BufferedImage) 那么使用了这个api的功能将绝对不能正常工作
补充×2