Appearance
消息推送
可在脚本或源码内调用机器人主动发送消息
使用场景
- 当玩家抽奖获得极品道具时
- BOSS 击杀竞速刷新榜单时
- 副本组队召集队友时
- 秒杀活动即将售空时
截图
提示
推送的内容是完全自定义的, 图中内容仅作演示
在抽奖脚本中, 获取抽到的道具名, 获取道具属性, 获取中奖玩家名, 然后拼接模板, 最后调用机器人发送消息
教学
js code
js
function pushMsg(msg) {
var api = "http://localhost:9600/bot/api/sendGroup"
var ar = new java.lang.Runnable {
run: function() {
var out = null;
var conn = null;
try{
conn = new java.net.URL(api).openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
//获取输出流
out = new java.io.OutputStreamWriter(conn.getOutputStream(), "UTF-8");
out.write(JSON.stringify({
content: String(msg)
}));
out.flush();
out.close();
// 发送请求
conn.getResponseCode();
} catch (e) {
print(e);
} finally {
try{
if (out != null) {
out.close();
}
}catch (e){
print(e);
}
try {
if (conn != null) {
conn.disconnect();
}
} catch (e) {
print(e);
}
}
}
}
new java.lang.Thread(ar).start();
}
java code
java
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import server.ServerProperties;
public class Bot {
// 建议这个值改为配置文件加载
private static final String baseUrl = ServerProperties.getProperty("bot.baseUrl", "http://localhst:9600");
// 建议这个值改为配置文件加载, 是否启用
private static boolean enable = ServerProperties.getProperty("bot.enable", false);
// 建议这个值改为配置文件加载, 群号, 保留值, 现在没用到
private static String groupId = "";
// 纯网络 IO, 非 CPU 密集型任务, 可以多分配一下工作线程
private static ExecutorService executorService = Executors.newFixedThreadPool(16);
public static void enable() {
enable = true;
}
public static void disable() {
enable = false;
}
/**
* 异步发送消息, 不阻塞线程, < > & 这 3 个特殊字符要使用 html 字符转义
* @param content
*/
public static void sendGroupMessage(String content) {
if (!enable) return;
executorService.execute(() -> {
// 因为部分用户没有 JSON 库, 我这里实现了一个手动转义
sendPostForJson(baseUrl + "/bot/api/sendGroup", String.format("{\"content\": \"%s\"}", escape(content)));
});
}
/**
* 异步发送消息, 不阻塞线程, < > & 这 3 个特殊字符要使用 html 字符转义
* @param content
*/
public static void sendGroupMessage(String content, String groupId) {
if (!enable) return;
executorService.execute(() -> {
// 因为部分用户没有 JSON 库, 我这里实现了一个手动转义
// 常见 JSON 库, Jackson FastJson FastJson2
sendPostForJson(baseUrl + "/bot/api/sendGroup", String.format("{\"content\": \"%s\", \"groupId\": \"%s\"}", escape(content), escape(groupId)));
});
}
private static void sendPostForJson(String url, String data) {
// 部分老项目没有 http 库, 使用原生方式
// 有 HttpClient OkHttp 的话, 不建议使用本方式
HttpURLConnection connection = null;
OutputStream outputStream = null;
try {
connection = (HttpURLConnection)new URL(url).openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/json");
connection.setDoOutput(true);
outputStream = connection.getOutputStream();
outputStream.write(data.getBytes(StandardCharsets.UTF_8));
connection.getResponseCode();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
private static String escape(String s) {
StringBuilder sb = new StringBuilder();
for (char c : s.toCharArray()) {
if (c == '\\') {
sb.append("\\\\");
} else if (c == '\"') {
sb.append("\\\"");
} else if (c == '\t') {
sb.append("\\t");
} else if (c == '\r') {
sb.append("\\r");
} else if (c == '\b') {
sb.append("\\b");
} else if (c == '\n') {
sb.append("\\n");
} else {
sb.append(c);
}
}
return sb.toString();
}
}
class CM {
/**
* 发送群消息
* 可变参
* 1. message
* 1. message groupId
*/
public void sendGroup(String... args){
if (args == null || args.length == 0) {
// ignore
} else if (args.length == 1) {
Bot.sendGroupMessage(args[0]);
} else if (args.length == 2) {
Bot.sendGroupMessage(args[0], args[1]);
}
}
/**
* 更新群消息开关(是否能发送)
* @param enable
*/
public void updateBotEnable(boolean enable){
if (enable) {
Bot.enable();
} else {
Bot.disable();
}
}
}
js item code
js
function getItemName(item){
return Packages.server.MapleItemInformationProvider.getInstance().getName(item.getItemId())
}
function getItemNameById(id){
return Packages.server.MapleItemInformationProvider.getInstance().getName(id)
}