diff --git a/mirai-core/src/main/java/net/mamoe/mirai/MiraiMain.java b/mirai-core/src/main/java/net/mamoe/mirai/MiraiMain.java index d94cc2fc1..77c77cbfd 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/MiraiMain.java +++ b/mirai-core/src/main/java/net/mamoe/mirai/MiraiMain.java @@ -1,6 +1,9 @@ package net.mamoe.mirai; +import net.mamoe.mirai.utils.config.MiraiConfig; +import net.mamoe.mirai.utils.config.MiraiConfigSection; + /** * @author Him188moe */ @@ -11,5 +14,15 @@ public final class MiraiMain { Runtime.getRuntime().addShutdownHook(new Thread(() -> { server.shutdown(); })); + MiraiConfig config = new MiraiConfig("QQ.yml"); + MiraiConfigSection data = config.getSection("123123"); + data.put("account","123123a"); + try { + Robot robot = new Robot(data); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + + } } diff --git a/mirai-core/src/main/java/net/mamoe/mirai/MiraiServer.java b/mirai-core/src/main/java/net/mamoe/mirai/MiraiServer.java index f3d307ba3..0e7fd1d03 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/MiraiServer.java +++ b/mirai-core/src/main/java/net/mamoe/mirai/MiraiServer.java @@ -4,8 +4,6 @@ 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.Robot; -import net.mamoe.mirai.network.packet.client.touch.ClientTouchPacket; import net.mamoe.mirai.task.MiraiTaskManager; import net.mamoe.mirai.utils.LoggerTextFormat; import net.mamoe.mirai.utils.MiraiLogger; @@ -60,7 +58,7 @@ public class MiraiServer { protected void shutdown(){ if(this.enabled) { getLogger().info(LoggerTextFormat.SKY_BLUE + "About to shutdown Mirai"); - this.getEventManager().boardcastEvent(new ServerDisableEvent()); + this.getEventManager().broadcastEvent(new ServerDisableEvent()); getLogger().info(LoggerTextFormat.SKY_BLUE + "Data have been saved"); } @@ -137,17 +135,18 @@ public class MiraiServer { */ - Robot robot = new Robot(1994701021, "xiaoqqq"); + /* + RobotNetworkHandler robotNetworkHandler = new RobotNetworkHandler(1994701021, "xiaoqqq"); try { //System.out.println(Protocol.Companion.getSERVER_IP().get(3)); //System.out.println(Protocol.Companion.getSERVER_IP().toString()); - robot.setServerIP("14.116.136.106"); - robot.sendPacket(new ClientTouchPacket(1994701021, "14.116.136.106")); + robotNetworkHandler.setServerIP("14.116.136.106"); + robotNetworkHandler.sendPacket(new ClientTouchPacket(1994701021, "14.116.136.106")); while (true) ; - //robot.connect("14.116.136.106"); - //robot.connect(Protocol.Companion.getSERVER_IP().get(2)); - //robot.connect("125.39.132.242"); + //robotNetworkHandler.connect("14.116.136.106"); + //robotNetworkHandler.connect(Protocol.Companion.getSERVER_IP().get(2)); + //robotNetworkHandler.connect("125.39.132.242"); } catch (Exception e) { e.printStackTrace(); System.exit(1); @@ -207,7 +206,7 @@ public class MiraiServer { System.out.println("/"); Scanner scanner = new Scanner(System.in); - getLogger().info(LoggerTextFormat.SKY_BLUE + "input one " + LoggerTextFormat.RED + " QQ number " + LoggerTextFormat.SKY_BLUE + "for default robot"); + getLogger().info(LoggerTextFormat.SKY_BLUE + "input one " + LoggerTextFormat.RED + " QQ number " + LoggerTextFormat.SKY_BLUE + "for default robotNetworkHandler"); getLogger().info(LoggerTextFormat.SKY_BLUE + "输入用于默认机器人的QQ号"); long qqNumber = scanner.nextLong(); getLogger().info(LoggerTextFormat.SKY_BLUE + "input the password for that QQ account"); @@ -223,7 +222,7 @@ public class MiraiServer { } private void onEnable(){ - this.eventManager.boardcastEvent(new ServerEnableEvent()); + this.eventManager.broadcastEvent(new ServerEnableEvent()); this.enabled = true; getLogger().info(LoggerTextFormat.GREEN + "Server enabled; Welcome to Mirai"); getLogger().info("Mirai Version=" + MiraiServer.MIRAI_VERSION + " QQ Version=" + MiraiServer.QQ_VERSION); diff --git a/mirai-core/src/main/java/net/mamoe/mirai/Robot.java b/mirai-core/src/main/java/net/mamoe/mirai/Robot.java new file mode 100644 index 000000000..9ee465ae8 --- /dev/null +++ b/mirai-core/src/main/java/net/mamoe/mirai/Robot.java @@ -0,0 +1,58 @@ +package net.mamoe.mirai; + +import lombok.Getter; +import net.mamoe.mirai.network.RobotNetworkHandler; +import net.mamoe.mirai.utils.config.MiraiConfigSection; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Robot { + + private final int qq; + private final String password; + private final RobotNetworkHandler handler ; + + /** + * Ref list + */ + @Getter + private final List owners; + + public boolean isOwnBy(String ownerName){ + return owners.contains(ownerName); + } + + + public Robot(MiraiConfigSection data) throws Throwable { + this( + data.getIntOrThrow("account", () -> new Exception("can not parse QQ account")), + data.getStringOrThrow("password", () -> new Exception("can not parse QQ password")), + data.getAsOrDefault("owners",new ArrayList<>()) + ); + + } + + + public Robot(int qq, String password, List owners){ + this.qq = qq; + this.password = password; + this.owners = Collections.unmodifiableList(owners); + this.handler = new RobotNetworkHandler(this.qq,this.password); + + + } + + + public void connect(){ + + } + + + public void onPacketReceive(){ + + } + +} + diff --git a/mirai-core/src/main/java/net/mamoe/mirai/event/MiraiEventManager.java b/mirai-core/src/main/java/net/mamoe/mirai/event/MiraiEventManager.java index 7eabb7b7d..50051df38 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/event/MiraiEventManager.java +++ b/mirai-core/src/main/java/net/mamoe/mirai/event/MiraiEventManager.java @@ -1,10 +1,13 @@ package net.mamoe.mirai.event; +import net.mamoe.mirai.MiraiServer; import net.mamoe.mirai.event.events.MiraiEvent; import java.util.*; +import java.util.concurrent.Callable; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -90,7 +93,7 @@ public class MiraiEventManager { - public void boardcastEvent(MiraiEvent event){ + public void broadcastEvent(MiraiEvent event){ hooksLock.lock(); if(hooks.containsKey(event.getClass())){ hooks.put(event.getClass(), @@ -104,6 +107,20 @@ public class MiraiEventManager { hooksLock.unlock(); } + + public void ansycBroadcastEvent(MiraiEvent event){ + this.ansycBroadcastEvent(event,a -> {}); + } + + public void ansycBroadcastEvent(D event, Consumer callback){ + MiraiServer.getInstance().getTaskManager().ansycTask(() -> { + MiraiEventManager.this.broadcastEvent(event); + return event; + },callback); + } + + } + diff --git a/mirai-core/src/main/java/net/mamoe/mirai/event/events/robot/RobotConnectedEvent.java b/mirai-core/src/main/java/net/mamoe/mirai/event/events/robot/RobotConnectedEvent.java new file mode 100644 index 000000000..02c578a7b --- /dev/null +++ b/mirai-core/src/main/java/net/mamoe/mirai/event/events/robot/RobotConnectedEvent.java @@ -0,0 +1,11 @@ +package net.mamoe.mirai.event.events.robot; + +import net.mamoe.mirai.Robot; + +public class RobotConnectedEvent extends RobotEvent { + + public RobotConnectedEvent(Robot robot) { + super(robot); + } + +} diff --git a/mirai-core/src/main/java/net/mamoe/mirai/event/events/robot/RobotEvent.java b/mirai-core/src/main/java/net/mamoe/mirai/event/events/robot/RobotEvent.java new file mode 100644 index 000000000..e98e743b4 --- /dev/null +++ b/mirai-core/src/main/java/net/mamoe/mirai/event/events/robot/RobotEvent.java @@ -0,0 +1,14 @@ +package net.mamoe.mirai.event.events.robot; + +import lombok.Getter; +import net.mamoe.mirai.Robot; +import net.mamoe.mirai.event.events.MiraiEvent; + +public abstract class RobotEvent extends MiraiEvent { + @Getter + private final Robot robot; + + public RobotEvent(Robot robot){ + this.robot = robot; + } +} diff --git a/mirai-core/src/main/java/net/mamoe/mirai/event/events/robot/RobotEvents.kt b/mirai-core/src/main/java/net/mamoe/mirai/event/events/robot/RobotEvents.kt index 129424b72..581f92e87 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/event/events/robot/RobotEvents.kt +++ b/mirai-core/src/main/java/net/mamoe/mirai/event/events/robot/RobotEvents.kt @@ -1,16 +1,16 @@ package net.mamoe.mirai.event.events.robot import net.mamoe.mirai.event.events.MiraiEvent -import net.mamoe.mirai.network.Robot +import net.mamoe.mirai.network.RobotNetworkHandler /** * @author Him188moe */ -class RobotLoginEvent(val robot: Robot) : MiraiEvent() +class RobotLoginEvent(val robotNetworkHandler: RobotNetworkHandler) : MiraiEvent() -class RobotLogoutEvent(val robot: Robot) : MiraiEvent() +class RobotLogoutEvent(val robotNetworkHandler: RobotNetworkHandler) : MiraiEvent() -class RobotMessageReceivedEvent(val robot: Robot, val type: Type, val message: String) : MiraiEvent() { +class RobotMessageReceivedEvent(val robotNetworkHandler: RobotNetworkHandler, val type: Type, val message: String) : MiraiEvent() { enum class Type { FRIEND, GROUP diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/RobotNetworkHandler.kt similarity index 95% rename from mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt rename to mirai-core/src/main/java/net/mamoe/mirai/network/RobotNetworkHandler.kt index 8161f9b44..5842f6b83 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt +++ b/mirai-core/src/main/java/net/mamoe/mirai/network/RobotNetworkHandler.kt @@ -18,11 +18,11 @@ import java.net.DatagramSocket import java.net.InetSocketAddress /** - * A robot account. + * A robotNetworkHandler account. * * @author Him188moe */ -class Robot(val number: Int, private val password: String) { +class RobotNetworkHandler(val number: Int, private val password: String) { private var sequence: Int = 0 private var channel: Channel? = null @@ -205,7 +205,7 @@ private lateinit var ctx: ChannelHandlerContext .handler(object : ChannelInitializer() { override fun channelActive(ctx: ChannelHandlerContext?) { - this@Robot.ctx = ctx!! + this@RobotNetworkHandler.ctx = ctx!! super.channelActive(ctx) } @@ -217,7 +217,7 @@ private lateinit var ctx: ChannelHandlerContext ch.pipeline().addLast(object : SimpleChannelInboundHandler() { override fun channelRead0(ctx: ChannelHandlerContext, bytes: ByteArray) { try { - this@Robot.onPacketReceived(ServerPacket.ofByteArray(bytes)) + this@RobotNetworkHandler.onPacketReceived(ServerPacket.ofByteArray(bytes)) } catch (e: Exception) { MiraiLogger.catching(e) } @@ -231,7 +231,7 @@ private lateinit var ctx: ChannelHandlerContext ch.pipeline().addLast(object : SimpleChannelInboundHandler() { override fun channelRead0(ctx: ChannelHandlerContext, bytes: DatagramPacket) { try { - this@Robot.onPacketReceived(ServerPacket.ofByteArray(bytes.data)) + this@RobotNetworkHandler.onPacketReceived(ServerPacket.ofByteArray(bytes.data)) } catch (e: Exception) { MiraiLogger.catching(e) } @@ -247,7 +247,7 @@ private lateinit var ctx: ChannelHandlerContext channel = b.bind(15345).sync().channel() MiraiLogger info "Succeed" - sendPacket(ClientTouchPacket(this@Robot.number, serverIP)) + sendPacket(ClientTouchPacket(this@RobotNetworkHandler.number, serverIP)) channel!!.closeFuture().sync() } finally { group.shutdownGracefully().sync() diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/login/ServerLoginResponseResendPacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/login/ServerLoginResponseResendPacket.kt index 1a336c2ae..c3fbb0f92 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/login/ServerLoginResponseResendPacket.kt +++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/login/ServerLoginResponseResendPacket.kt @@ -34,7 +34,7 @@ class ServerLoginResponseResendPacket(input: DataInputStream, val flag: Flag) : Flag.OTHER -> { //do nothing in this packet. - //[this.token] will be set in [Robot] + //[this.token] will be set in [RobotNetworkHandler] //token } } diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/security/ServerSessionKeyResponsePacketEncrypted.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/security/ServerSessionKeyResponsePacketEncrypted.kt index f27be641c..88d952031 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/security/ServerSessionKeyResponsePacketEncrypted.kt +++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/security/ServerSessionKeyResponsePacketEncrypted.kt @@ -37,7 +37,7 @@ class ServerSessionKeyResponsePacket(inputStream: DataInputStream) : ServerPacke } /** - * Encrypted using []0828_rec_decr_key], decrypting in Robot + * Encrypted using []0828_rec_decr_key], decrypting in RobotNetworkHandler * * @author Him188moe */ diff --git a/mirai-core/src/main/java/net/mamoe/mirai/util/Utils.kt b/mirai-core/src/main/java/net/mamoe/mirai/util/Utils.kt index b13b2ec2a..81e5a0d60 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/util/Utils.kt +++ b/mirai-core/src/main/java/net/mamoe/mirai/util/Utils.kt @@ -14,18 +14,18 @@ object Utils { fun toHexString(byteArray: ByteArray, separator: String = " "): String = byteArray.joinToString(separator) { var ret = it.toString(16).toUpperCase(); if (ret.length == 1) { - ret = "0$ret"; + ret = "0$ret" } - return@joinToString ret; + return@joinToString ret } @ExperimentalUnsignedTypes fun toHexString(byteArray: UByteArray, separator: String = " "): String = byteArray.joinToString(separator) { var ret = it.toString(16).toUpperCase(); if (ret.length == 1) { - ret = "0$ret"; + ret = "0$ret" } - return@joinToString ret; + return@joinToString ret } } @@ -68,7 +68,7 @@ fun lazyEncode(t: (ByteArrayDataOutputStream) -> Unit): ByteArray = ByteArrayDat @ExperimentalUnsignedTypes fun getRandomKey(length: Int): ByteArray { - val bytes = LinkedList(); + val bytes = LinkedList() repeat(length) { bytes.add((Math.random() * 255).toByte()) } return bytes.toByteArray(); } diff --git a/mirai-core/src/main/java/net/mamoe/mirai/utils/config/MiraiConfig.java b/mirai-core/src/main/java/net/mamoe/mirai/utils/config/MiraiConfig.java index 75e64a66f..617cefcaf 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/utils/config/MiraiConfig.java +++ b/mirai-core/src/main/java/net/mamoe/mirai/utils/config/MiraiConfig.java @@ -68,4 +68,5 @@ public class MiraiConfig extends MiraiConfigSection { } + } diff --git a/mirai-core/src/main/java/net/mamoe/mirai/utils/config/MiraiConfigSection.java b/mirai-core/src/main/java/net/mamoe/mirai/utils/config/MiraiConfigSection.java index e1133f472..a7c150919 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/utils/config/MiraiConfigSection.java +++ b/mirai-core/src/main/java/net/mamoe/mirai/utils/config/MiraiConfigSection.java @@ -1,8 +1,10 @@ package net.mamoe.mirai.utils.config; import org.jetbrains.annotations.Nullable; +import java.util.IllegalFormatException; import java.util.LinkedHashMap; import java.util.Map; +import java.util.concurrent.Callable; public class MiraiConfigSection extends MiraiSynchronizedLinkedListMap { @@ -14,24 +16,122 @@ public class MiraiConfigSection extends MiraiSynchronizedLinkedListMap throwableCallable) throws Throwable { + Object result = this.getOrDefault(key, null); + if(result == null){ + throw throwableCallable.call(); + } + try { + return Integer.valueOf(result.toString()); + }catch (NumberFormatException ignored){ + throw throwableCallable.call(); + } + } + + public double getDouble(String key){ return Double.valueOf(this.get(key).toString()); } - public Float getFloat(String key){ + public double getDoubleOrDefault(String key, double defaultV){ + Object result = this.getOrDefault(key, null); + try { + return result==null?defaultV:Double.valueOf(result.toString()); + }catch (NumberFormatException ignored){ + return defaultV; + } + } + + public double getDoubleOrThrow(String key, Callable throwableCallable) throws Throwable { + Object result = this.getOrDefault(key, null); + if(result == null){ + throw throwableCallable.call(); + } + try { + return Double.valueOf(result.toString()); + }catch (NumberFormatException ignored){ + throw throwableCallable.call(); + } + } + + public float getFloat(String key){ return Float.valueOf(this.get(key).toString()); } + public float getFloatOrDefault(String key, float defaultV){ + Object result = this.getOrDefault(key, null); + try { + return result == null ? defaultV : Float.valueOf(result.toString()); + }catch (NumberFormatException ignored){ + return defaultV; + } + } + + public float getFloatOrThrow(String key, Callable throwableCallable) throws Throwable { + Object result = this.getOrDefault(key, null); + if(result == null){ + throw throwableCallable.call(); + } + try { + return Float.valueOf(result.toString()); + }catch (NumberFormatException ignored){ + throw throwableCallable.call(); + } + } + + public long getLong(String key){ + return Long.valueOf(this.get(key).toString()); + } + + public long getLongOrDefault(String key, long defaultV){ + Object result = this.getOrDefault(key, null); + try { + return result == null ? defaultV : Long.valueOf(result.toString()); + }catch (NumberFormatException ignored){ + return defaultV; + } + } + + public long getLongOrThrow(String key, Callable throwableCallable) throws Throwable { + Object result = this.getOrDefault(key, null); + if(result == null){ + throw throwableCallable.call(); + } + try { + return Long.valueOf(result.toString()); + }catch (NumberFormatException ignored){ + throw throwableCallable.call(); + } + } + public String getString(String key){ return String.valueOf(this.get(key)); } + public String getStringOrDefault(String key, String defaultV){ + Object result = this.getOrDefault(key, null); + return result==null?defaultV:result.toString(); + } + + public String getStringOrThrow(String key, Callable throwableCallable) throws Throwable { + Object result = this.getOrDefault(key, null); + if(result == null){ + throw throwableCallable.call(); + } + return result.toString(); + } @Nullable @Override @@ -57,6 +157,8 @@ public class MiraiConfigSection extends MiraiSynchronizedLinkedListMap D getAsOrDefault(String key, D defaultV){ + return (D)this.getOrDefault(key,defaultV); + } } diff --git a/mirai-core/src/main/java/net/mamoe/mirai/utils/config/MiraiSynchronizedLinkedListMap.java b/mirai-core/src/main/java/net/mamoe/mirai/utils/config/MiraiSynchronizedLinkedListMap.java index 22cfa38bf..611a4752c 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/utils/config/MiraiSynchronizedLinkedListMap.java +++ b/mirai-core/src/main/java/net/mamoe/mirai/utils/config/MiraiSynchronizedLinkedListMap.java @@ -153,8 +153,13 @@ public class MiraiSynchronizedLinkedListMap extends AbstractMap { return this.sortedMap.merge(key,value,remappingFunction); } + public boolean equals(MiraiSynchronizedLinkedListMap o) { + return this.sortedMap.equals(o.sortedMap); + } + @Override public boolean equals(Object o) { - return this.sortedMap.equals(o); + return o instanceof MiraiSynchronizedLinkedListMap?this.equals((MiraiSynchronizedLinkedListMap)o):super.equals(o); } + } diff --git a/mirai-core/src/test/java/ConfigTest.java b/mirai-core/src/test/java/ConfigTest.java new file mode 100644 index 000000000..d8e883600 --- /dev/null +++ b/mirai-core/src/test/java/ConfigTest.java @@ -0,0 +1,8 @@ +import net.mamoe.mirai.MiraiServer; +import net.mamoe.mirai.utils.config.MiraiConfig; + +public class ConfigTest { + public static void main(String[] args){ + MiraiConfig config = new MiraiConfig("QQ.yml"); + } +}