Commit 04823b35 authored by Him188moe's avatar Him188moe

update

parent 801d7276
package net.mamoe.mirai.contact package net.mamoe.mirai.contact
import net.mamoe.mirai.message.Message
import net.mamoe.mirai.message.defaults.PlainText
/** /**
* A contact is a QQ account or a QQ Group. * A contact is a [QQ] or a [Group] for one particular [Robot] instance only.
* *
* @author Him188moe * @author Him188moe
*/ */
...@@ -10,11 +13,14 @@ abstract class Contact(val number: Int) { ...@@ -10,11 +13,14 @@ abstract class Contact(val number: Int) {
/** /**
* Async * Async
*/ */
abstract fun sendMessage(message: String) abstract fun sendMessage(message: Message)
fun sendMessage(message: String) {
this.sendMessage(PlainText(message))
}
/** /**
* Async * Async
*/ */
abstract fun sendObjectMessage(message: String) abstract fun sendXMLMessage(message: String)
} }
package net.mamoe.mirai.contact package net.mamoe.mirai.contact
import net.mamoe.mirai.message.Message
class Group(number: Int) : Contact(number) { class Group(number: Int) : Contact(number) {
val groupId = groupNumberToId(number)
init { init {
Instances.groups.add(this) Instances.groups.add(this)
} }
override fun sendMessage(message: String) { override fun sendMessage(message: Message) {
}
override fun sendXMLMessage(message: String) {
} }
override fun sendObjectMessage(message: String) { companion object {
fun groupNumberToId(number: Int): Int {
val left: Int = number.toString().let {
if (it.length < 6) {
return@groupNumberToId number
}
it.substring(0, it.length - 6).toInt()
}
val right: Int = number.toString().let {
it.substring(it.length - 6).toInt()
}
return when (left) {
in 1..10 -> {
((left + 202).toString() + right.toString()).toInt()
}
in 11..19 -> {
((left + 469).toString() + right.toString()).toInt()
}
in 20..66 -> {
((left + 208).toString() + right.toString()).toInt()
}
in 67..156 -> {
((left + 1943).toString() + right.toString()).toInt()
}
in 157..209 -> {
((left + 199).toString() + right.toString()).toInt()
}
in 210..309 -> {
((left + 389).toString() + right.toString()).toInt()
}
in 310..499 -> {
((left + 349).toString() + right.toString()).toInt()
}
else -> number
}
}
fun groupIdToNumber(id: Int): Int {
var left: Int = id.toString().let {
if (it.length < 6) {
return@groupIdToNumber id
}
it.substring(0 until it.length - 6).toInt()
}
return when (left) {
in 203..212 -> {
val right: Int = id.toString().let {
it.substring(it.length - 6).toInt()
}
((left - 202).toString() + right.toString()).toInt()
}
in 480..488 -> {
val right: Int = id.toString().let {
it.substring(it.length - 6).toInt()
}
((left - 469).toString() + right.toString()).toInt()
}
in 2100..2146 -> {
val right: Int = id.toString().let {
it.substring(it.length - 7).toInt()
}
left = left.toString().substring(0 until 3).toInt()
((left - 208).toString() + right.toString()).toInt()
}
in 2010..2099 -> {
val right: Int = id.toString().let {
it.substring(it.length - 6).toInt()
}
((left - 1943).toString() + right.toString()).toInt()
}
in 2147..2199 -> {
val right: Int = id.toString().let {
it.substring(it.length - 7).toInt()
}
left = left.toString().substring(0 until 3).toInt()
((left - 199).toString() + right.toString()).toInt()
}
in 4100..4199 -> {
val right: Int = id.toString().let {
it.substring(it.length - 7).toInt()
}
left = left.toString().substring(0 until 3).toInt()
((left - 389).toString() + right.toString()).toInt()
}
in 3800..3989 -> {
val right: Int = id.toString().let {
it.substring(it.length - 7).toInt()
}
left = left.toString().substring(0 until 3).toInt()
((left - 349).toString() + right.toString()).toInt()
}
else -> id
}
}
} }
} }
package net.mamoe.mirai.contact package net.mamoe.mirai.contact
import net.mamoe.mirai.message.Message
import net.mamoe.mirai.message.defaults.At import net.mamoe.mirai.message.defaults.At
/** /**
...@@ -10,11 +11,11 @@ class QQ(number: Int) : Contact(number) { ...@@ -10,11 +11,11 @@ class QQ(number: Int) : Contact(number) {
Instances.qqs.add(this) Instances.qqs.add(this)
} }
override fun sendMessage(message: String) { override fun sendMessage(message: Message) {
} }
override fun sendObjectMessage(message: String) { override fun sendXMLMessage(message: String) {
} }
......
...@@ -6,6 +6,7 @@ import net.mamoe.mirai.event.events.robot.RobotLoginSucceedEvent ...@@ -6,6 +6,7 @@ import net.mamoe.mirai.event.events.robot.RobotLoginSucceedEvent
import net.mamoe.mirai.network.packet.* import net.mamoe.mirai.network.packet.*
import net.mamoe.mirai.network.packet.login.* import net.mamoe.mirai.network.packet.login.*
import net.mamoe.mirai.network.packet.message.ClientSendFriendMessagePacket import net.mamoe.mirai.network.packet.message.ClientSendFriendMessagePacket
import net.mamoe.mirai.network.packet.message.ClientSendGroupMessagePacket
import net.mamoe.mirai.network.packet.verification.ServerVerificationCodePacket import net.mamoe.mirai.network.packet.verification.ServerVerificationCodePacket
import net.mamoe.mirai.network.packet.verification.ServerVerificationCodePacketEncrypted import net.mamoe.mirai.network.packet.verification.ServerVerificationCodePacketEncrypted
import net.mamoe.mirai.task.MiraiThreadPool import net.mamoe.mirai.task.MiraiThreadPool
...@@ -238,6 +239,9 @@ class RobotNetworkHandler(val robot: Robot, val number: Int, private val passwor ...@@ -238,6 +239,9 @@ class RobotNetworkHandler(val robot: Robot, val number: Int, private val passwor
is ServerGroupMessageEventPacket -> { is ServerGroupMessageEventPacket -> {
//group message //group message
if (packet.message == "牛逼") {
sendPacket(ClientSendGroupMessagePacket(packet.group, this.number, this.sessionKey, "牛逼!"))
}
} }
is UnknownServerEventPacket -> { is UnknownServerEventPacket -> {
......
package net.mamoe.mirai.network.connection;
import lombok.AllArgsConstructor;
import lombok.Getter;
import net.mamoe.mirai.utils.MiraiLogger;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* UDP Client
* Try to keep long-alive UDP connection in order to improve performance
*
*/
public class MiraiUDPClient {
private LocalUDPListener listener;
public MiraiUDPClient(InetAddress address, short serverPort, short localPort){
this.listener = new LocalUDPListener(new LocalUDPSocketProvider(
address,localPort,serverPort,null
));
this.listener.startup();
}
}
@AllArgsConstructor
class LocalUDPSocketProvider
{
private InetAddress address;
private short localPort;
private short serverPort;
@Getter
private DatagramSocket socket = null;
public void initSocket()
{
try
{
this.socket = new DatagramSocket(this.localPort);
this.socket.connect(this.address, this.serverPort);
this.socket.setReuseAddress(true);
}
catch (Exception e)
{
MiraiLogger.INSTANCE.catching(e);
}
}
}
class LocalUDPListener
{
private Thread thread = null;
protected LocalUDPSocketProvider provider;
public LocalUDPListener(LocalUDPSocketProvider provider){
this.provider = provider;
if(this.provider.getSocket() == null){
this.provider.initSocket();
}
}
public void startup()
{
this.thread = new Thread(() -> {
try
{
LocalUDPListener.this.listener();
}
catch (Exception e)
{
MiraiLogger.INSTANCE.catching(e);
}
});
this.thread.start();
}
private void listener() throws Exception
{
while (true)
{
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
DatagramSocket localUDPSocket = this.provider.getSocket();
if ((localUDPSocket == null) || (localUDPSocket.isClosed()))
continue;
localUDPSocket.receive(packet);
//todo use CALLBACK
String pFromServer = new String(packet.getData(), 0 , packet.getLength(), "UTF-8");
System.out.println("【NOTE】>>>>>> 收到服务端的消息:"+pFromServer);
}
}
}
\ No newline at end of file
...@@ -73,6 +73,10 @@ fun DataOutputStream.writeIP(ip: String) { ...@@ -73,6 +73,10 @@ fun DataOutputStream.writeIP(ip: String) {
} }
} }
@Throws(IOException::class)
fun DataOutputStream.writeTime() {
this.writeInt(System.currentTimeMillis().toInt())
}
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
@Throws(IOException::class) @Throws(IOException::class)
......
package net.mamoe.mirai.network.packet package net.mamoe.mirai.network.packet
import net.mamoe.mirai.network.packet.login.* import net.mamoe.mirai.network.packet.login.*
import net.mamoe.mirai.network.packet.message.ServerSendFriendMessageResponsePacket
import net.mamoe.mirai.network.packet.message.ServerSendGroupMessageResponsePacket
import net.mamoe.mirai.network.packet.verification.ServerVerificationCodePacketEncrypted import net.mamoe.mirai.network.packet.verification.ServerVerificationCodePacketEncrypted
import net.mamoe.mirai.utils.getAllDeclaredFields import net.mamoe.mirai.utils.getAllDeclaredFields
import net.mamoe.mirai.utils.hexToBytes import net.mamoe.mirai.utils.hexToBytes
...@@ -78,6 +80,9 @@ abstract class ServerPacket(val input: DataInputStream) : Packet { ...@@ -78,6 +80,9 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
"00 81" -> UnknownServerPacket(stream) "00 81" -> UnknownServerPacket(stream)
"00 CD" -> ServerSendFriendMessageResponsePacket(stream)
"00 02" -> ServerSendGroupMessageResponsePacket(stream)
else -> throw IllegalArgumentException(idHex) else -> throw IllegalArgumentException(idHex)
} }
} }
......
...@@ -3,7 +3,7 @@ package net.mamoe.mirai.network.packet.message ...@@ -3,7 +3,7 @@ package net.mamoe.mirai.network.packet.message
import net.mamoe.mirai.network.Protocol import net.mamoe.mirai.network.Protocol
import net.mamoe.mirai.network.packet.* import net.mamoe.mirai.network.packet.*
import net.mamoe.mirai.utils.lazyEncode import net.mamoe.mirai.utils.lazyEncode
import net.mamoe.mirai.utils.toUHexString import java.io.DataInputStream
/** /**
* @author Him188moe * @author Him188moe
...@@ -31,9 +31,9 @@ class ClientSendFriendMessagePacket( ...@@ -31,9 +31,9 @@ class ClientSendFriendMessagePacket(
it.write(md5(lazyEncode { md5Key -> md5Key.writeQQ(targetQQ); md5Key.write(sessionKey) })) it.write(md5(lazyEncode { md5Key -> md5Key.writeQQ(targetQQ); md5Key.write(sessionKey) }))
it.writeHex("00 0B") it.writeHex("00 0B")
it.writeRandom(2) it.writeRandom(2)
it.writeInt(System.currentTimeMillis().toInt()) it.writeTime()
it.writeHex("00 00 00 00 00 00 01 00 00 00 01 4D 53 47 00 00 00 00 00") it.writeHex("00 00 00 00 00 00 01 00 00 00 01 4D 53 47 00 00 00 00 00")
it.writeInt(System.currentTimeMillis().toInt()) it.writeTime()
it.writeRandom(4) it.writeRandom(4)
it.writeHex("00 00 00 00 09 00 86 00 00 0C E5 BE AE E8 BD AF E9 9B 85 E9 BB 91") it.writeHex("00 00 00 00 09 00 86 00 00 0C E5 BE AE E8 BD AF E9 9B 85 E9 BB 91")
it.writeZero(2) it.writeZero(2)
...@@ -48,22 +48,17 @@ class ClientSendFriendMessagePacket( ...@@ -48,22 +48,17 @@ class ClientSendFriendMessagePacket(
//Plain text //Plain text
val bytes = message.toByteArray() val bytes = message.toByteArray()
it.writeByte(0x01) it.writeByte(0x01)
it.writeShort(bytes.size) it.writeShort(bytes.size + 3)
it.writeByte(0x01) it.writeByte(0x01)
it.writeShort(bytes.size - 1) it.writeShort(bytes.size)
it.write(bytes) it.write(bytes)
}//todo check }//todo check
} }
} }
} }
fun main() { @PacketId("00 CD")
println(lazyEncode { class ServerSendFriendMessageResponsePacket(input: DataInputStream) : ServerPacket(input) {
val bytes = "hahaha".toByteArray() override fun decode() {
it.writeByte(0x01) }
it.writeShort(bytes.size)
it.writeByte(0x01)
it.writeShort(bytes.size - 1)
it.write(bytes)
}.toUHexString())
} }
\ No newline at end of file
package net.mamoe.mirai.network.packet.message package net.mamoe.mirai.network.packet.message
import net.mamoe.mirai.network.packet.ClientPacket import net.mamoe.mirai.network.Protocol
import net.mamoe.mirai.network.packet.PacketId import net.mamoe.mirai.network.packet.*
import net.mamoe.mirai.network.packet.encryptAndWrite import java.io.DataInputStream
/** /**
* @author Him188moe * @author Him188moe
*/ */
@PacketId("00 CD") @PacketId("00 02")
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
class ClientSendGroupMessagePacket( class ClientSendGroupMessagePacket(
val group: Int, private val groupId: Int,//不是 number
val qq: Int, private val qq: Int,
val sessionKey: ByteArray, private val sessionKey: ByteArray,
val message: String private val message: String
) : ClientPacket() { ) : ClientPacket() {
override fun encode() { override fun encode() {
TODO() this.writeRandom(2)//part of packet id
this.writeQQ(qq)
this.writeHex(Protocol._fixVer)
this.encryptAndWrite(sessionKey) { this.encryptAndWrite(sessionKey) {
// it.write() it.writeHex("00 01 01 00 00 00 00 00 00 00 4D 53 47 00 00 00 00 00")
it.writeTime()
it.writeRandom(4)
it.writeHex("00 00 00 00 09 00 86 00 00 0C E5 BE AE E8 BD AF E9 9B 85 E9 BB 91")
it.writeZero(2)
//messages
val bytes = message.toByteArray()
it.writeByte(0x2A)
it.writeInt(groupId)
it.writeShort(19 + bytes.size)
it.writeByte(0x01)
it.writeByte(0x01)
it.writeShort(bytes.size + 3)
it.writeByte(0x01)
it.writeShort(bytes.size)
it.write(bytes)
}
} }
}
@PacketId("00 02")
class ServerSendGroupMessageResponsePacket(input: DataInputStream) : ServerPacket(input) {
override fun decode() {
} }
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment