mamoe/mirai 的readme里有提到
mirai 采用 AGPLv3 协议开源。为了整个社区的良性发展,我们强烈建议您做到以下几点:
间接接触(包括但不限于使用 Http API 或 跨进程技术)到 mirai 的软件使用 AGPLv3 开源
mamoe/mirai 的readme里有提到
mirai 采用 AGPLv3 协议开源。为了整个社区的良性发展,我们强烈建议您做到以下几点:
间接接触(包括但不限于使用 Http API 或 跨进程技术)到 mirai 的软件使用 AGPLv3 开源
我有一个朋友,他买了个域名,然后绑了 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;
}
}
}
那个朋友真不是我自己
我都是直接
java -cp ./content/*;./libraries/* net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader
到 Maven Central 补全 mirai 的包 (bcprov-jdk15on, mirai-core-all, mirai-console, mirai-console-terminal),丢到 content 文件夹里,一直没出过事(
可能是我爱折腾不喜欢用启动器吧
@picpo 很蠢的方法…难道是跟我一样吗(
// onGroupMessage(GroupMessageEvent event)
if(this.main.getConfig().isBlackList(sender.getSenderID())) return;
// do sth
@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>()
我的代码质量老低了… 仅供参考
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;
}
}
}
}
监听 GroupMessageEvent
判断发送者的身份和发送的内容,如果符合你指定的条件就
event.getGroup().quit();
@zuichen 一是载入 chat-commands 时找不到类,二是找不到方法 java.nio.file.Files.exist(Path, [LinkOption]),毕竟载入插件是个实验性功能,不能要求太高,在插件功能稳定前最好使用 mirai-console 而不是 MiraiAndroid
bintray 通道早就停止提供服务了说…
如果能找到其他下载源就好,我用 Eclipse 因为只要新建个文件指定插件主类路径一直都莫得问题(
多翻文档
啊这,建议问问题时带上你使用的mirai各组件名称及其版本
然后我更推荐使用 mirai-console 而不是 MiraiAndroid
我顺藤摸瓜找到的 MiraiAndroid,它的页面说明了 兼容 mirai-console 插件(实验性)
对于新手,与其使用不稳定的版本,不如租台云服务器或者使用自家电脑来使用 mirai-console
补充
对于其他插件请自行尝试;此外,如果你的插件使用了一些 Android 不支持的 api(例如BufferedImage) 那么使用了这个api的功能将绝对不能正常工作
补充×2
我觉得我这个写得一塌糊涂的机器人不应该发在插件版…
Github: MrXiaoM/Natsuko
之前我在我群里一直要承诺把我的机器人开源的,
但是因为一直没写配置文件让机器人更好编辑而搁置了
现在懒得写了,写了一半不到的配置文件,剩下一些功能自己去源码改,
因为这个原因我不会给出编译好的jar,若要使用务必自行编译
当前 Natsuko 的功能如下
一切以Github页面的README为准