This commit is contained in:
Him188moe 2019-09-01 17:02:57 +08:00
parent 801d727629
commit 04823b3557
9 changed files with 173 additions and 138 deletions

View File

@ -1,7 +1,10 @@
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
*/
@ -10,11 +13,14 @@ abstract class Contact(val number: Int) {
/**
* Async
*/
abstract fun sendMessage(message: String)
abstract fun sendMessage(message: Message)
fun sendMessage(message: String) {
this.sendMessage(PlainText(message))
}
/**
* Async
*/
abstract fun sendObjectMessage(message: String)
abstract fun sendXMLMessage(message: String)
}

View File

@ -1,15 +1,117 @@
package net.mamoe.mirai.contact
import net.mamoe.mirai.message.Message
class Group(number: Int) : Contact(number) {
val groupId = groupNumberToId(number)
init {
Instances.groups.add(this)
}
override fun sendMessage(message: String) {
override fun sendMessage(message: Message) {
}
override fun sendObjectMessage(message: String) {
override fun sendXMLMessage(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
}
}
}
}

View File

@ -1,5 +1,6 @@
package net.mamoe.mirai.contact
import net.mamoe.mirai.message.Message
import net.mamoe.mirai.message.defaults.At
/**
@ -10,11 +11,11 @@ class QQ(number: Int) : Contact(number) {
Instances.qqs.add(this)
}
override fun sendMessage(message: String) {
override fun sendMessage(message: Message) {
}
override fun sendObjectMessage(message: String) {
override fun sendXMLMessage(message: String) {
}

View File

@ -6,6 +6,7 @@ import net.mamoe.mirai.event.events.robot.RobotLoginSucceedEvent
import net.mamoe.mirai.network.packet.*
import net.mamoe.mirai.network.packet.login.*
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.ServerVerificationCodePacketEncrypted
import net.mamoe.mirai.task.MiraiThreadPool
@ -238,6 +239,9 @@ class RobotNetworkHandler(val robot: Robot, val number: Int, private val passwor
is ServerGroupMessageEventPacket -> {
//group message
if (packet.message == "牛逼") {
sendPacket(ClientSendGroupMessagePacket(packet.group, this.number, this.sessionKey, "牛逼!"))
}
}
is UnknownServerEventPacket -> {

View File

@ -1,106 +0,0 @@
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);
}
}
}

View File

@ -73,6 +73,10 @@ fun DataOutputStream.writeIP(ip: String) {
}
}
@Throws(IOException::class)
fun DataOutputStream.writeTime() {
this.writeInt(System.currentTimeMillis().toInt())
}
@ExperimentalUnsignedTypes
@Throws(IOException::class)

View File

@ -1,6 +1,8 @@
package net.mamoe.mirai.network.packet
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.utils.getAllDeclaredFields
import net.mamoe.mirai.utils.hexToBytes
@ -78,6 +80,9 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
"00 81" -> UnknownServerPacket(stream)
"00 CD" -> ServerSendFriendMessageResponsePacket(stream)
"00 02" -> ServerSendGroupMessageResponsePacket(stream)
else -> throw IllegalArgumentException(idHex)
}
}

View File

@ -3,7 +3,7 @@ package net.mamoe.mirai.network.packet.message
import net.mamoe.mirai.network.Protocol
import net.mamoe.mirai.network.packet.*
import net.mamoe.mirai.utils.lazyEncode
import net.mamoe.mirai.utils.toUHexString
import java.io.DataInputStream
/**
* @author Him188moe
@ -31,9 +31,9 @@ class ClientSendFriendMessagePacket(
it.write(md5(lazyEncode { md5Key -> md5Key.writeQQ(targetQQ); md5Key.write(sessionKey) }))
it.writeHex("00 0B")
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.writeInt(System.currentTimeMillis().toInt())
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)
@ -48,22 +48,17 @@ class ClientSendFriendMessagePacket(
//Plain text
val bytes = message.toByteArray()
it.writeByte(0x01)
it.writeShort(bytes.size)
it.writeShort(bytes.size + 3)
it.writeByte(0x01)
it.writeShort(bytes.size - 1)
it.writeShort(bytes.size)
it.write(bytes)
}//todo check
}
}
}
fun main() {
println(lazyEncode {
val bytes = "hahaha".toByteArray()
it.writeByte(0x01)
it.writeShort(bytes.size)
it.writeByte(0x01)
it.writeShort(bytes.size - 1)
it.write(bytes)
}.toUHexString())
@PacketId("00 CD")
class ServerSendFriendMessageResponsePacket(input: DataInputStream) : ServerPacket(input) {
override fun decode() {
}
}

View File

@ -1,26 +1,50 @@
package net.mamoe.mirai.network.packet.message
import net.mamoe.mirai.network.packet.ClientPacket
import net.mamoe.mirai.network.packet.PacketId
import net.mamoe.mirai.network.packet.encryptAndWrite
import net.mamoe.mirai.network.Protocol
import net.mamoe.mirai.network.packet.*
import java.io.DataInputStream
/**
* @author Him188moe
*/
@PacketId("00 CD")
@PacketId("00 02")
@ExperimentalUnsignedTypes
class ClientSendGroupMessagePacket(
val group: Int,
val qq: Int,
val sessionKey: ByteArray,
val message: String
private val groupId: Int,//不是 number
private val qq: Int,
private val sessionKey: ByteArray,
private val message: String
) : ClientPacket() {
override fun encode() {
TODO()
this.writeRandom(2)//part of packet id
this.writeQQ(qq)
this.writeHex(Protocol._fixVer)
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() {
}
}