mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-03 15:10:14 +08:00
MN
This commit is contained in:
parent
24ef0c1d93
commit
e342261ea1
@ -4,22 +4,30 @@ import lombok.Getter;
|
||||
import net.mamoe.mirai.event.MiraiEventManager;
|
||||
import net.mamoe.mirai.event.events.server.ServerDisableEvent;
|
||||
import net.mamoe.mirai.event.events.server.ServerEnableEvent;
|
||||
import net.mamoe.mirai.network.Network;
|
||||
import net.mamoe.mirai.network.MiraiNetwork;
|
||||
import net.mamoe.mirai.task.MiraiTaskManager;
|
||||
import net.mamoe.mirai.utils.LoggerTextFormat;
|
||||
import net.mamoe.mirai.utils.MiraiLogger;
|
||||
import net.mamoe.mirai.utils.config.MiraiConfig;
|
||||
import net.mamoe.mirai.utils.config.MiraiMapSection;
|
||||
|
||||
import java.awt.*;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
import java.util.HashMap;
|
||||
import java.util.Scanner;
|
||||
|
||||
public class MiraiServer {
|
||||
@Getter
|
||||
private static MiraiServer instance;
|
||||
|
||||
@Getter //mirai version
|
||||
private final static String miraiVersion = "1.0.0";
|
||||
//mirai version
|
||||
private final static String MIRAI_VERSION = "1.0.0";
|
||||
|
||||
//qq version
|
||||
private final static String QQ_VERSION = "4.9.0";
|
||||
|
||||
|
||||
@Getter //is running under UNIX
|
||||
private boolean unix;
|
||||
@ -34,6 +42,8 @@ public class MiraiServer {
|
||||
@Getter
|
||||
MiraiLogger logger;
|
||||
|
||||
MiraiConfig setting;
|
||||
|
||||
|
||||
protected MiraiServer(){
|
||||
instance = this;
|
||||
@ -63,28 +73,61 @@ public class MiraiServer {
|
||||
this.eventManager = MiraiEventManager.getInstance();
|
||||
this.taskManager = MiraiTaskManager.getInstance();
|
||||
|
||||
this.getLogger().log(LoggerTextFormat.SKY_BLUE + "About to run Mirai (" + MiraiServer.getMiraiVersion() + ") under " + (isUnix()?"unix":"windows") );
|
||||
this.getLogger().log(LoggerTextFormat.SKY_BLUE + "About to run Mirai (" + MiraiServer.MIRAI_VERSION + ") under " + (isUnix()?"unix":"windows") );
|
||||
this.getLogger().log("Loading data under " + LoggerTextFormat.GREEN + this.parentFolder);
|
||||
|
||||
|
||||
/*
|
||||
try {
|
||||
Network.start(Network.getAvailablePort());
|
||||
} catch (InterruptedException | IOException e) {
|
||||
e.printStackTrace();
|
||||
this.shutdown();
|
||||
File setting = new File(this.parentFolder + "/Mirai.ini");
|
||||
|
||||
if(!setting.exists()){
|
||||
this.initSetting(setting);
|
||||
}else {
|
||||
this.setting = new MiraiConfig(setting);
|
||||
}
|
||||
|
||||
*/
|
||||
int port = this.setting.getMapSection("network").getInt("port");
|
||||
MiraiNetwork.start(port);
|
||||
Thread.yield();
|
||||
if(MiraiNetwork.getLastError()!=null){
|
||||
this.getLogger().log(LoggerTextFormat.RED + "an error occurred when staring network layer");
|
||||
this.shutdown();
|
||||
}
|
||||
|
||||
this.getLogger().log(LoggerTextFormat.SKY_BLUE + "Listening on port " + port);
|
||||
|
||||
}
|
||||
|
||||
public void initSetting(File setting){
|
||||
this.getLogger().log(LoggerTextFormat.SKY_BLUE + "Thanks for using Mirai");
|
||||
this.getLogger().log(LoggerTextFormat.SKY_BLUE + "initializing Settings");
|
||||
try {
|
||||
if(setting.createNewFile()){
|
||||
this.getLogger().log(LoggerTextFormat.SKY_BLUE + "Mirai Config Created");
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
this.setting = new MiraiConfig(setting);
|
||||
MiraiMapSection network = this.setting.getMapSection("network");
|
||||
network.put("port",19139);
|
||||
MiraiMapSection qqs = this.setting.getMapSection("qq");
|
||||
Scanner scanner = new Scanner(System.in);
|
||||
this.getLogger().log(LoggerTextFormat.SKY_BLUE + "input one " + LoggerTextFormat.RED + " QQ number " + LoggerTextFormat.SKY_BLUE +"for default robot");
|
||||
this.getLogger().log(LoggerTextFormat.SKY_BLUE + "输入用于默认机器人的QQ号");
|
||||
long qqNumber = scanner.nextLong();
|
||||
this.getLogger().log(LoggerTextFormat.SKY_BLUE + "input the password for that QQ account");
|
||||
this.getLogger().log(LoggerTextFormat.SKY_BLUE + "输入该QQ号对应密码");
|
||||
String qqPassword = scanner.next();
|
||||
this.getLogger().log(LoggerTextFormat.SKY_BLUE + "initialized; changing can be made in config file: " + setting.toString());
|
||||
qqs.put(String.valueOf(qqNumber),qqPassword);
|
||||
this.setting.save();
|
||||
}
|
||||
|
||||
private void onEnable(){
|
||||
this.eventManager.boardcastEvent(new ServerEnableEvent());
|
||||
this.enabled = true;
|
||||
this.getLogger().log(LoggerTextFormat.GREEN + "Server enabled; Welcome to Mirai");
|
||||
this.getLogger().log( "Mirai Version=" + MiraiServer.MIRAI_VERSION + " QQ Version=" + MiraiServer.QQ_VERSION);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -1,4 +1,77 @@
|
||||
package net.mamoe.mirai.network;
|
||||
|
||||
import io.netty.bootstrap.ServerBootstrap;
|
||||
import io.netty.channel.ChannelInitializer;
|
||||
import io.netty.channel.ChannelPipeline;
|
||||
import io.netty.channel.EventLoopGroup;
|
||||
import io.netty.channel.nio.NioEventLoopGroup;
|
||||
import io.netty.channel.socket.SocketChannel;
|
||||
import io.netty.channel.socket.nio.NioServerSocketChannel;
|
||||
import io.netty.handler.codec.bytes.ByteArrayDecoder;
|
||||
import io.netty.handler.codec.bytes.ByteArrayEncoder;
|
||||
import lombok.Getter;
|
||||
import net.mamoe.mirai.MiraiServer;
|
||||
import net.mamoe.mirai.event.events.server.ServerDisableEvent;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.ServerSocket;
|
||||
|
||||
public class MiraiNetwork {
|
||||
|
||||
private static ServerBootstrap server;
|
||||
private static Thread thread;
|
||||
|
||||
@Getter
|
||||
private static volatile Throwable lastError = null;
|
||||
|
||||
public static void start(int port){
|
||||
thread = new Thread(() -> {
|
||||
if (server != null) {
|
||||
throw new RuntimeException("there is already a ServerBootstrap instance");
|
||||
}
|
||||
|
||||
EventLoopGroup bossGroup = new NioEventLoopGroup();
|
||||
EventLoopGroup workerGroup = new NioEventLoopGroup();
|
||||
try {
|
||||
server = new ServerBootstrap();
|
||||
server.group(bossGroup, workerGroup);
|
||||
server.channel(NioServerSocketChannel.class);
|
||||
//b.option(ChannelOption.SO_BACKLOG, 100);
|
||||
//b.handler(new LoggingHandler(LogLevel.INFO));
|
||||
server.childHandler(new ChannelInitializer<SocketChannel>() {
|
||||
@Override
|
||||
protected void initChannel(SocketChannel ch) throws Exception {
|
||||
ChannelPipeline pipeline = ch.pipeline();
|
||||
pipeline.addLast("bytesDecoder", new ByteArrayDecoder());
|
||||
pipeline.addLast("bytesEncoder", new ByteArrayEncoder());
|
||||
pipeline.addLast("handler", new NetworkPacketHandler());
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
server.bind(port).sync().channel().closeFuture().sync();
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
lastError = e;
|
||||
} finally {
|
||||
bossGroup.shutdownGracefully();
|
||||
workerGroup.shutdownGracefully();
|
||||
}
|
||||
});
|
||||
thread.start();
|
||||
MiraiServer.getInstance().getEventManager().onEvent(ServerDisableEvent.class).setHandler(a -> {
|
||||
thread.interrupt();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
public static int getAvailablePort() throws IOException {
|
||||
ServerSocket serverSocket = new ServerSocket(0); //读取空闲的可用端口
|
||||
int port = serverSocket.getLocalPort();
|
||||
serverSocket.close();
|
||||
return port;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -1,69 +0,0 @@
|
||||
package net.mamoe.mirai.network;
|
||||
|
||||
import io.netty.bootstrap.ServerBootstrap;
|
||||
import io.netty.channel.ChannelInitializer;
|
||||
import io.netty.channel.ChannelPipeline;
|
||||
import io.netty.channel.EventLoopGroup;
|
||||
import io.netty.channel.nio.NioEventLoopGroup;
|
||||
import io.netty.channel.socket.SocketChannel;
|
||||
import io.netty.channel.socket.nio.NioServerSocketChannel;
|
||||
import io.netty.handler.codec.bytes.ByteArrayDecoder;
|
||||
import io.netty.handler.codec.bytes.ByteArrayEncoder;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.ServerSocket;
|
||||
|
||||
/**
|
||||
* JPRE 网络层启动器.
|
||||
* 本类用于启动网络服务器. 包接受器请参考 {@link NetworkPacketHandler}
|
||||
* (插件请不要使用本类, 用了也会因端口占用而抛出异常)
|
||||
*
|
||||
* @author Him188 @ JPRE Project
|
||||
*/
|
||||
public final class Network {
|
||||
private static ServerBootstrap server;
|
||||
|
||||
/**
|
||||
* 启动网络服务器. 会阻塞线程直到关闭网络服务器.
|
||||
*
|
||||
* @param port 端口号
|
||||
* @throws RuntimeException 服务器已经启动时抛出
|
||||
*/
|
||||
public static void start(int port) throws InterruptedException {
|
||||
if (server != null) {
|
||||
throw new RuntimeException("there is already a ServerBootstrap instance");
|
||||
}
|
||||
|
||||
EventLoopGroup bossGroup = new NioEventLoopGroup();
|
||||
EventLoopGroup workerGroup = new NioEventLoopGroup();
|
||||
try {
|
||||
server = new ServerBootstrap();
|
||||
server.group(bossGroup, workerGroup);
|
||||
server.channel(NioServerSocketChannel.class);
|
||||
//b.option(ChannelOption.SO_BACKLOG, 100);
|
||||
//b.handler(new LoggingHandler(LogLevel.INFO));
|
||||
server.childHandler(new ChannelInitializer<SocketChannel>() {
|
||||
@Override
|
||||
protected void initChannel(SocketChannel ch) throws Exception {
|
||||
ChannelPipeline pipeline = ch.pipeline();
|
||||
pipeline.addLast("bytesDecoder", new ByteArrayDecoder());
|
||||
pipeline.addLast("bytesEncoder", new ByteArrayEncoder());
|
||||
pipeline.addLast("handler", new NetworkPacketHandler());
|
||||
}
|
||||
});
|
||||
|
||||
server.bind(port).sync().channel().closeFuture().sync();
|
||||
} finally {
|
||||
bossGroup.shutdownGracefully();
|
||||
workerGroup.shutdownGracefully();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static int getAvailablePort() throws IOException {
|
||||
ServerSocket serverSocket = new ServerSocket(0); //读取空闲的可用端口
|
||||
int port = serverSocket.getLocalPort();
|
||||
serverSocket.close();
|
||||
return port;
|
||||
}
|
||||
}
|
@ -7,6 +7,7 @@ import org.ini4j.Profile;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Vector;
|
||||
@ -25,7 +26,6 @@ public class MiraiConfig {
|
||||
private Ini ini;
|
||||
|
||||
private volatile Map<String, MiraiConfigSection> cacheSection = new ConcurrentHashMap<>();
|
||||
private volatile List<String> needSaving = new Vector<>();
|
||||
|
||||
public MiraiConfig(File file){
|
||||
if(!file.getName().contains(".")){
|
||||
@ -45,14 +45,15 @@ public class MiraiConfig {
|
||||
|
||||
public void setSection(String key, MiraiConfigSection section){
|
||||
cacheSection.put(key, section);
|
||||
needSaving.add(key);
|
||||
}
|
||||
|
||||
|
||||
public MiraiMapSection getMapSection(String key){
|
||||
if(!cacheSection.containsKey(key)) {
|
||||
MiraiMapSection section = new MiraiMapSection();
|
||||
section.putAll(ini.get(key));
|
||||
if(ini.containsKey(key)){
|
||||
section.putAll(ini.get(key));
|
||||
}
|
||||
cacheSection.put(key, section);
|
||||
}
|
||||
return (MiraiMapSection) cacheSection.get(key);
|
||||
@ -61,7 +62,9 @@ public class MiraiConfig {
|
||||
public MiraiListSection getListSection(String key){
|
||||
if(!cacheSection.containsKey(key)) {
|
||||
MiraiListSection section = new MiraiListSection();
|
||||
section.addAll(ini.get(key).values());
|
||||
if(ini.containsKey(key)){
|
||||
section.addAll(ini.get(key).values());
|
||||
}
|
||||
cacheSection.put(key, section);
|
||||
}
|
||||
return (MiraiListSection) cacheSection.get(key);
|
||||
@ -69,19 +72,20 @@ public class MiraiConfig {
|
||||
|
||||
|
||||
public synchronized void save(){
|
||||
needSaving.forEach(a -> {
|
||||
cacheSection.get(a).saveAsSection(ini.get(a));
|
||||
cacheSection.forEach((k,a) -> {
|
||||
if(!ini.containsKey(k)) {
|
||||
ini.put(k,"",new HashMap<>());
|
||||
}
|
||||
a.saveAsSection(ini.get(k));
|
||||
});
|
||||
try {
|
||||
ini.store(file);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
needSaving.clear();
|
||||
}
|
||||
|
||||
public void clearCache(){
|
||||
needSaving.clear();
|
||||
cacheSection.clear();
|
||||
}
|
||||
}
|
||||
|
@ -41,7 +41,7 @@ public class MiraiMapSection extends ConcurrentHashMap<String, Object> implement
|
||||
}
|
||||
|
||||
public int getInt(String key, int defaultValue) {
|
||||
return this.get(key, defaultValue);
|
||||
return Integer.parseInt(String.valueOf(this.get(key, defaultValue)));
|
||||
}
|
||||
|
||||
public double getDouble(String key) {
|
||||
@ -49,7 +49,7 @@ public class MiraiMapSection extends ConcurrentHashMap<String, Object> implement
|
||||
}
|
||||
|
||||
public double getDouble(String key, double defaultValue) {
|
||||
return this.get(key, defaultValue);
|
||||
return Double.parseDouble(String.valueOf(this.get(key, defaultValue)));
|
||||
}
|
||||
|
||||
public float getFloat(String key) {
|
||||
@ -57,7 +57,7 @@ public class MiraiMapSection extends ConcurrentHashMap<String, Object> implement
|
||||
}
|
||||
|
||||
public float getFloat(String key, float defaultValue) {
|
||||
return this.get(key, defaultValue);
|
||||
return Float.parseFloat(String.valueOf(this.get(key, defaultValue)));
|
||||
}
|
||||
|
||||
public String getString(String key) {
|
||||
|
Loading…
Reference in New Issue
Block a user