mirror of
https://github.com/mamoe/mirai.git
synced 2025-02-11 07:04:53 +08:00
update
This commit is contained in:
parent
801d727629
commit
04823b3557
@ -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)
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
|
||||
}
|
||||
|
||||
|
@ -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 -> {
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -73,6 +73,10 @@ fun DataOutputStream.writeIP(ip: String) {
|
||||
}
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
fun DataOutputStream.writeTime() {
|
||||
this.writeInt(System.currentTimeMillis().toInt())
|
||||
}
|
||||
|
||||
@ExperimentalUnsignedTypes
|
||||
@Throws(IOException::class)
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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() {
|
||||
}
|
||||
}
|
@ -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() {
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user