mirror of
https://github.com/mamoe/mirai.git
synced 2025-02-24 02:40:13 +08:00
Kotlin coroutine
This commit is contained in:
parent
4b96bf0ee8
commit
4f4bc05da6
@ -21,23 +21,23 @@ abstract class Contact internal constructor(val bot: Bot, val number: Long) {
|
|||||||
/**
|
/**
|
||||||
* Async
|
* Async
|
||||||
*/
|
*/
|
||||||
abstract fun sendMessage(message: MessageChain)
|
abstract suspend fun sendMessage(message: MessageChain)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 上传图片
|
* 上传图片
|
||||||
*/
|
*/
|
||||||
fun uploadImage(session: LoginSession, image: UnsolvedImage): CompletableFuture<Unit> {
|
suspend fun uploadImage(session: LoginSession, image: UnsolvedImage): CompletableFuture<Unit> {
|
||||||
return image.upload(session, this)
|
return image.upload(session, this)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun sendMessage(message: Message) {
|
suspend fun sendMessage(message: Message) {
|
||||||
if (message is MessageChain) {
|
if (message is MessageChain) {
|
||||||
return sendMessage(message)
|
return sendMessage(message)
|
||||||
}
|
}
|
||||||
return sendMessage(message.toChain())
|
return sendMessage(message.toChain())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun sendMessage(message: String) {
|
suspend fun sendMessage(message: String) {
|
||||||
this.sendMessage(PlainText(message))
|
this.sendMessage(PlainText(message))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ class Group(bot: Bot, number: Long) : Contact(bot, number), Closeable {
|
|||||||
val groupId = groupNumberToId(number)
|
val groupId = groupNumberToId(number)
|
||||||
val members = ContactList<QQ>()
|
val members = ContactList<QQ>()
|
||||||
|
|
||||||
override fun sendMessage(message: MessageChain) {
|
override suspend fun sendMessage(message: MessageChain) {
|
||||||
bot.network.message.sendGroupMessage(this, message)
|
bot.network.message.sendGroupMessage(this, message)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ import net.mamoe.mirai.message.defaults.MessageChain
|
|||||||
* @author Him188moe
|
* @author Him188moe
|
||||||
*/
|
*/
|
||||||
class QQ(bot: Bot, number: Long) : Contact(bot, number) {
|
class QQ(bot: Bot, number: Long) : Contact(bot, number) {
|
||||||
override fun sendMessage(message: MessageChain) {
|
override suspend fun sendMessage(message: MessageChain) {
|
||||||
bot.network.message.sendFriendMessage(this, message)
|
bot.network.message.sendFriendMessage(this, message)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ class UnsolvedImage(filename: String, val image: BufferedImage) : Image(getImage
|
|||||||
constructor(imageFile: File) : this(imageFile.name, ImageIO.read(imageFile))
|
constructor(imageFile: File) : this(imageFile.name, ImageIO.read(imageFile))
|
||||||
constructor(url: URL) : this(File(url.file))
|
constructor(url: URL) : this(File(url.file))
|
||||||
|
|
||||||
fun upload(session: LoginSession, contact: Contact): CompletableFuture<Unit> {
|
suspend fun upload(session: LoginSession, contact: Contact): CompletableFuture<Unit> {//todo be suspend
|
||||||
return session.expectPacket<ServerTryGetImageIDResponsePacket> {
|
return session.expectPacket<ServerTryGetImageIDResponsePacket> {
|
||||||
toSend { ClientTryGetImageIDPacket(session.bot.account.qqNumber, session.sessionKey, contact.number, image) }
|
toSend { ClientTryGetImageIDPacket(session.bot.account.qqNumber, session.sessionKey, contact.number, image) }
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package net.mamoe.mirai.network
|
package net.mamoe.mirai.network
|
||||||
|
|
||||||
|
import kotlinx.coroutines.*
|
||||||
import net.mamoe.mirai.Bot
|
import net.mamoe.mirai.Bot
|
||||||
import net.mamoe.mirai.MiraiServer
|
import net.mamoe.mirai.MiraiServer
|
||||||
import net.mamoe.mirai.event.events.bot.BotLoginSucceedEvent
|
import net.mamoe.mirai.event.events.bot.BotLoginSucceedEvent
|
||||||
@ -40,8 +41,11 @@ internal class BotNetworkHandlerImpl(private val bot: Bot) : BotNetworkHandler {
|
|||||||
|
|
||||||
internal val temporaryPacketHandlers = Collections.synchronizedList(mutableListOf<TemporaryPacketHandler<*>>())
|
internal val temporaryPacketHandlers = Collections.synchronizedList(mutableListOf<TemporaryPacketHandler<*>>())
|
||||||
|
|
||||||
|
|
||||||
override fun addHandler(temporaryPacketHandler: TemporaryPacketHandler<*>) {
|
override fun addHandler(temporaryPacketHandler: TemporaryPacketHandler<*>) {
|
||||||
|
runBlocking {
|
||||||
temporaryPacketHandler.send(action.session)
|
temporaryPacketHandler.send(action.session)
|
||||||
|
}
|
||||||
temporaryPacketHandlers.add(temporaryPacketHandler)
|
temporaryPacketHandlers.add(temporaryPacketHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,7 +99,7 @@ internal class BotNetworkHandlerImpl(private val bot: Bot) : BotNetworkHandler {
|
|||||||
|
|
||||||
|
|
||||||
internal inner class BotSocket : Closeable, DataPacketSocket {
|
internal inner class BotSocket : Closeable, DataPacketSocket {
|
||||||
override fun distributePacket(packet: ServerPacket) {
|
override suspend fun distributePacket(packet: ServerPacket) {
|
||||||
try {
|
try {
|
||||||
packet.decode()
|
packet.decode()
|
||||||
} catch (e: java.lang.Exception) {
|
} catch (e: java.lang.Exception) {
|
||||||
@ -150,12 +154,8 @@ internal class BotNetworkHandlerImpl(private val bot: Bot) : BotNetworkHandler {
|
|||||||
val packet = DatagramPacket(ByteArray(2048), 2048)
|
val packet = DatagramPacket(ByteArray(2048), 2048)
|
||||||
kotlin.runCatching { socket?.receive(packet) }
|
kotlin.runCatching { socket?.receive(packet) }
|
||||||
.onSuccess {
|
.onSuccess {
|
||||||
MiraiThreadPool.getInstance().submit {
|
GlobalScope.launch {
|
||||||
try {
|
|
||||||
distributePacket(ServerPacket.ofByteArray(packet.data.removeZeroTail()))
|
distributePacket(ServerPacket.ofByteArray(packet.data.removeZeroTail()))
|
||||||
} catch (e: Exception) {
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}.onFailure {
|
}.onFailure {
|
||||||
if (it.message == "Socket closed" || it.message == "socket closed") {
|
if (it.message == "Socket closed" || it.message == "socket closed") {
|
||||||
@ -184,7 +184,9 @@ internal class BotNetworkHandlerImpl(private val bot: Bot) : BotNetworkHandler {
|
|||||||
bot.waitForPacket(ServerPacket::class, timeoutMillis) {
|
bot.waitForPacket(ServerPacket::class, timeoutMillis) {
|
||||||
loginFuture!!.complete(LoginState.TIMEOUT)
|
loginFuture!!.complete(LoginState.TIMEOUT)
|
||||||
}
|
}
|
||||||
|
runBlocking {
|
||||||
sendPacket(ClientTouchPacket(bot.account.qqNumber, serverIP))
|
sendPacket(ClientTouchPacket(bot.account.qqNumber, serverIP))
|
||||||
|
}
|
||||||
|
|
||||||
return this.loginFuture!!
|
return this.loginFuture!!
|
||||||
}
|
}
|
||||||
@ -193,8 +195,7 @@ internal class BotNetworkHandlerImpl(private val bot: Bot) : BotNetworkHandler {
|
|||||||
* Not async
|
* Not async
|
||||||
*/
|
*/
|
||||||
@Synchronized
|
@Synchronized
|
||||||
|
override suspend fun sendPacket(packet: ClientPacket) {
|
||||||
override fun sendPacket(packet: ClientPacket) {
|
|
||||||
checkNotNull(socket) { "network closed" }
|
checkNotNull(socket) { "network closed" }
|
||||||
if (socket!!.isClosed) {
|
if (socket!!.isClosed) {
|
||||||
return
|
return
|
||||||
@ -208,7 +209,9 @@ internal class BotNetworkHandlerImpl(private val bot: Bot) : BotNetworkHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val data = packet.toByteArray()
|
val data = packet.toByteArray()
|
||||||
|
withContext(Dispatchers.IO) {
|
||||||
socket!!.send(DatagramPacket(data, data.size))
|
socket!!.send(DatagramPacket(data, data.size))
|
||||||
|
}
|
||||||
bot.cyanL("Packet sent: $packet")
|
bot.cyanL("Packet sent: $packet")
|
||||||
|
|
||||||
PacketSentEvent(bot, packet).broadcast()
|
PacketSentEvent(bot, packet).broadcast()
|
||||||
@ -255,7 +258,7 @@ internal class BotNetworkHandlerImpl(private val bot: Bot) : BotNetworkHandler {
|
|||||||
private var heartbeatFuture: ScheduledFuture<*>? = null
|
private var heartbeatFuture: ScheduledFuture<*>? = null
|
||||||
|
|
||||||
|
|
||||||
fun onPacketReceived(packet: ServerPacket) {
|
suspend fun onPacketReceived(packet: ServerPacket) {
|
||||||
when (packet) {
|
when (packet) {
|
||||||
is ServerTouchResponsePacket -> {
|
is ServerTouchResponsePacket -> {
|
||||||
if (packet.serverIP != null) {//redirection
|
if (packet.serverIP != null) {//redirection
|
||||||
@ -304,7 +307,9 @@ internal class BotNetworkHandlerImpl(private val bot: Bot) : BotNetworkHandler {
|
|||||||
this.token00BA = packet.token00BA
|
this.token00BA = packet.token00BA
|
||||||
|
|
||||||
if (packet.transmissionCompleted) {
|
if (packet.transmissionCompleted) {
|
||||||
bot.notice(CharImageUtil.createCharImg(ImageIO.read(this.captchaCache!!.inputStream())))
|
withContext(Dispatchers.IO) {
|
||||||
|
bot.notice(CharImageUtil.createCharImg(ImageIO.read(captchaCache!!.inputStream())))
|
||||||
|
}
|
||||||
bot.notice("需要验证码登录, 验证码为 4 字母")
|
bot.notice("需要验证码登录, 验证码为 4 字母")
|
||||||
try {
|
try {
|
||||||
(MiraiServer.getInstance().parentFolder + "VerificationCode.png").writeBytes(this.captchaCache!!)
|
(MiraiServer.getInstance().parentFolder + "VerificationCode.png").writeBytes(this.captchaCache!!)
|
||||||
@ -350,7 +355,9 @@ internal class BotNetworkHandlerImpl(private val bot: Bot) : BotNetworkHandler {
|
|||||||
is ServerSessionKeyResponsePacket -> {
|
is ServerSessionKeyResponsePacket -> {
|
||||||
sessionKey = packet.sessionKey
|
sessionKey = packet.sessionKey
|
||||||
heartbeatFuture = MiraiThreadPool.getInstance().scheduleWithFixedDelay({
|
heartbeatFuture = MiraiThreadPool.getInstance().scheduleWithFixedDelay({
|
||||||
|
runBlocking {
|
||||||
socket.sendPacket(ClientHeartbeatPacket(bot.account.qqNumber, sessionKey))
|
socket.sendPacket(ClientHeartbeatPacket(bot.account.qqNumber, sessionKey))
|
||||||
|
}
|
||||||
}, 90000, 90000, TimeUnit.MILLISECONDS)
|
}, 90000, 90000, TimeUnit.MILLISECONDS)
|
||||||
|
|
||||||
socket.loginFuture!!.complete(LoginState.SUCCESS)
|
socket.loginFuture!!.complete(LoginState.SUCCESS)
|
||||||
@ -390,8 +397,10 @@ internal class BotNetworkHandlerImpl(private val bot: Bot) : BotNetworkHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun changeOnlineStatus(status: ClientLoginStatus) {
|
fun changeOnlineStatus(status: ClientLoginStatus) {
|
||||||
|
NetworkScope.launch {
|
||||||
socket.sendPacket(ClientChangeOnlineStatusPacket(bot.account.qqNumber, sessionKey, status))
|
socket.sendPacket(ClientChangeOnlineStatusPacket(bot.account.qqNumber, sessionKey, status))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun close() {
|
override fun close() {
|
||||||
this.captchaCache = null
|
this.captchaCache = null
|
||||||
|
@ -0,0 +1,21 @@
|
|||||||
|
package net.mamoe.mirai.network
|
||||||
|
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.asCoroutineDispatcher
|
||||||
|
import java.util.concurrent.SynchronousQueue
|
||||||
|
import java.util.concurrent.ThreadPoolExecutor
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
|
import kotlin.coroutines.CoroutineContext
|
||||||
|
|
||||||
|
object NetworkScope : CoroutineScope {
|
||||||
|
override val coroutineContext: CoroutineContext
|
||||||
|
get() = lazy {
|
||||||
|
ThreadPoolExecutor(
|
||||||
|
1,
|
||||||
|
4,
|
||||||
|
8000, TimeUnit.MILLISECONDS,
|
||||||
|
SynchronousQueue()
|
||||||
|
).asCoroutineDispatcher()
|
||||||
|
}.value//todo improve
|
||||||
|
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
package net.mamoe.mirai.network.handler
|
package net.mamoe.mirai.network.handler
|
||||||
|
|
||||||
|
import kotlinx.coroutines.runBlocking
|
||||||
import net.mamoe.mirai.network.LoginSession
|
import net.mamoe.mirai.network.LoginSession
|
||||||
import net.mamoe.mirai.network.packet.*
|
import net.mamoe.mirai.network.packet.*
|
||||||
import net.mamoe.mirai.network.packet.action.AddFriendResult
|
import net.mamoe.mirai.network.packet.action.AddFriendResult
|
||||||
@ -32,7 +33,7 @@ class ActionPacketHandler(session: LoginSession) : PacketHandler(session) {
|
|||||||
private var sKeyRefresherFuture: ScheduledFuture<*>? = null
|
private var sKeyRefresherFuture: ScheduledFuture<*>? = null
|
||||||
|
|
||||||
|
|
||||||
override fun onPacketReceived(packet: ServerPacket) {
|
override suspend fun onPacketReceived(packet: ServerPacket) {
|
||||||
when (packet) {
|
when (packet) {
|
||||||
is ServerCanAddFriendResponsePacket -> {
|
is ServerCanAddFriendResponsePacket -> {
|
||||||
this.uploadImageSessions.forEach {
|
this.uploadImageSessions.forEach {
|
||||||
@ -60,7 +61,9 @@ class ActionPacketHandler(session: LoginSession) : PacketHandler(session) {
|
|||||||
session.cookies = "uin=o" + session.bot.account.qqNumber + ";skey=" + session.sKey + ";"
|
session.cookies = "uin=o" + session.bot.account.qqNumber + ";skey=" + session.sKey + ";"
|
||||||
|
|
||||||
sKeyRefresherFuture = MiraiThreadPool.getInstance().scheduleWithFixedDelay({
|
sKeyRefresherFuture = MiraiThreadPool.getInstance().scheduleWithFixedDelay({
|
||||||
|
runBlocking {
|
||||||
session.socket.sendPacket(ClientSKeyRefreshmentRequestPacket(session.bot.account.qqNumber, session.sessionKey))
|
session.socket.sendPacket(ClientSKeyRefreshmentRequestPacket(session.bot.account.qqNumber, session.sessionKey))
|
||||||
|
}
|
||||||
}, 1800000, 1800000, TimeUnit.MILLISECONDS)
|
}, 1800000, 1800000, TimeUnit.MILLISECONDS)
|
||||||
|
|
||||||
session.gtk = getGTK(session.sKey)
|
session.gtk = getGTK(session.sKey)
|
||||||
@ -75,13 +78,13 @@ class ActionPacketHandler(session: LoginSession) : PacketHandler(session) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun addFriend(qqNumber: Long, message: Supplier<String>) {
|
suspend fun addFriend(qqNumber: Long, message: Supplier<String>) {
|
||||||
addFriend(qqNumber, lazy { message.get() })
|
addFriend(qqNumber, lazy { message.get() })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@JvmSynthetic
|
@JvmSynthetic
|
||||||
fun addFriend(qqNumber: Long, message: Lazy<String> = lazyOf("")): CompletableFuture<AddFriendResult> {
|
suspend fun addFriend(qqNumber: Long, message: Lazy<String> = lazyOf("")): CompletableFuture<AddFriendResult> {
|
||||||
val future = CompletableFuture<AddFriendResult>()
|
val future = CompletableFuture<AddFriendResult>()
|
||||||
val session = AddFriendSession(qqNumber, future, message)
|
val session = AddFriendSession(qqNumber, future, message)
|
||||||
// uploadImageSessions.add(session)
|
// uploadImageSessions.add(session)
|
||||||
@ -90,12 +93,12 @@ class ActionPacketHandler(session: LoginSession) : PacketHandler(session) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun requestSKey() {
|
suspend fun requestSKey() {
|
||||||
session.socket.sendPacket(ClientSKeyRequestPacket(session.bot.account.qqNumber, session.sessionKey))
|
session.socket.sendPacket(ClientSKeyRequestPacket(session.bot.account.qqNumber, session.sessionKey))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun requestAccountInfo() {
|
suspend fun requestAccountInfo() {
|
||||||
session.socket.sendPacket(ClientAccountInfoRequestPacket(session.bot.account.qqNumber, session.sessionKey))
|
session.socket.sendPacket(ClientAccountInfoRequestPacket(session.bot.account.qqNumber, session.sessionKey))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -165,7 +168,7 @@ class ActionPacketHandler(session: LoginSession) : PacketHandler(session) {
|
|||||||
lateinit var id: ByteArray
|
lateinit var id: ByteArray
|
||||||
|
|
||||||
|
|
||||||
fun onPacketReceived(packet: ServerPacket) {
|
suspend fun onPacketReceived(packet: ServerPacket) {
|
||||||
if (!::id.isInitialized) {
|
if (!::id.isInitialized) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -202,7 +205,7 @@ class ActionPacketHandler(session: LoginSession) : PacketHandler(session) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun sendAddRequest() {
|
suspend fun sendAddRequest() {
|
||||||
session.socket.sendPacket(ClientCanAddFriendPacket(session.bot.account.qqNumber, qq, session.sessionKey).also { this.id = it.packetIdLast })
|
session.socket.sendPacket(ClientCanAddFriendPacket(session.bot.account.qqNumber, qq, session.sessionKey).also { this.id = it.packetIdLast })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,9 +6,7 @@ import net.mamoe.mirai.network.BotNetworkHandlerImpl
|
|||||||
import net.mamoe.mirai.network.LoginSession
|
import net.mamoe.mirai.network.LoginSession
|
||||||
import net.mamoe.mirai.network.packet.ClientPacket
|
import net.mamoe.mirai.network.packet.ClientPacket
|
||||||
import net.mamoe.mirai.network.packet.ServerPacket
|
import net.mamoe.mirai.network.packet.ServerPacket
|
||||||
import net.mamoe.mirai.task.MiraiThreadPool
|
|
||||||
import java.io.Closeable
|
import java.io.Closeable
|
||||||
import java.util.concurrent.Future
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 网络接口.
|
* 网络接口.
|
||||||
@ -23,7 +21,7 @@ interface DataPacketSocket : Closeable {
|
|||||||
/**
|
/**
|
||||||
* 分发数据包给 [PacketHandler]
|
* 分发数据包给 [PacketHandler]
|
||||||
*/
|
*/
|
||||||
fun distributePacket(packet: ServerPacket)
|
suspend fun distributePacket(packet: ServerPacket)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 发送一个数据包(非异步).
|
* 发送一个数据包(非异步).
|
||||||
@ -32,20 +30,7 @@ interface DataPacketSocket : Closeable {
|
|||||||
*
|
*
|
||||||
* @see [LoginSession.expectPacket] kotlin DSL
|
* @see [LoginSession.expectPacket] kotlin DSL
|
||||||
*/
|
*/
|
||||||
fun sendPacket(packet: ClientPacket)
|
suspend fun sendPacket(packet: ClientPacket)
|
||||||
|
|
||||||
/**
|
|
||||||
* 发送一个数据包(异步).
|
|
||||||
*
|
|
||||||
* 可通过 hook 事件 [ServerPacketReceivedEvent] 来获取服务器返回.
|
|
||||||
*
|
|
||||||
* @see [LoginSession.expectPacket] kotlin DSL
|
|
||||||
*/
|
|
||||||
fun sendPacketAsync(packet: ClientPacket): Future<*> {
|
|
||||||
return MiraiThreadPool.getInstance().submit {
|
|
||||||
sendPacket(packet)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun isClosed(): Boolean
|
fun isClosed(): Boolean
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package net.mamoe.mirai.network.handler
|
package net.mamoe.mirai.network.handler
|
||||||
|
|
||||||
|
import kotlinx.coroutines.runBlocking
|
||||||
import net.mamoe.mirai.contact.Group
|
import net.mamoe.mirai.contact.Group
|
||||||
import net.mamoe.mirai.contact.QQ
|
import net.mamoe.mirai.contact.QQ
|
||||||
import net.mamoe.mirai.event.events.group.GroupMessageEvent
|
import net.mamoe.mirai.event.events.group.GroupMessageEvent
|
||||||
@ -30,8 +31,9 @@ class MessagePacketHandler(session: LoginSession) : PacketHandler(session) {
|
|||||||
init {
|
init {
|
||||||
//todo for test
|
//todo for test
|
||||||
FriendMessageEvent::class.hookWhile {
|
FriendMessageEvent::class.hookWhile {
|
||||||
|
return@hookWhile runBlocking {
|
||||||
if (session.socket.isClosed()) {
|
if (session.socket.isClosed()) {
|
||||||
return@hookWhile false
|
return@runBlocking false
|
||||||
}
|
}
|
||||||
when {
|
when {
|
||||||
it.message valueEquals "你好" -> it.sender.sendMessage("你好!")
|
it.message valueEquals "你好" -> it.sender.sendMessage("你好!")
|
||||||
@ -52,24 +54,26 @@ class MessagePacketHandler(session: LoginSession) : PacketHandler(session) {
|
|||||||
it.message valueEquals "发图片2" -> sendFriendMessage(it.sender, PlainText("test") + Image("{7AA4B3AA-8C3C-0F45-2D9B-7F302A0ACEAA}.jpg"))
|
it.message valueEquals "发图片2" -> sendFriendMessage(it.sender, PlainText("test") + Image("{7AA4B3AA-8C3C-0F45-2D9B-7F302A0ACEAA}.jpg"))
|
||||||
}
|
}
|
||||||
|
|
||||||
return@hookWhile true
|
return@runBlocking true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GroupMessageEvent::class.hookWhile {
|
GroupMessageEvent::class.hookWhile {
|
||||||
|
return@hookWhile runBlocking {
|
||||||
if (session.socket.isClosed()) {
|
if (session.socket.isClosed()) {
|
||||||
return@hookWhile false
|
return@runBlocking false
|
||||||
}
|
}
|
||||||
|
|
||||||
when {
|
when {
|
||||||
it.message.contains("复读") -> it.group.sendMessage(it.chain)
|
it.message.contains("复读") -> it.group.sendMessage(it.chain)
|
||||||
}
|
}
|
||||||
|
|
||||||
return@hookWhile true
|
return@runBlocking true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onPacketReceived(packet: ServerPacket) {
|
override suspend fun onPacketReceived(packet: ServerPacket) {
|
||||||
when (packet) {
|
when (packet) {
|
||||||
is ServerGroupUploadFileEventPacket -> {
|
is ServerGroupUploadFileEventPacket -> {
|
||||||
//todo
|
//todo
|
||||||
@ -99,11 +103,11 @@ class MessagePacketHandler(session: LoginSession) : PacketHandler(session) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun sendFriendMessage(qq: QQ, message: MessageChain) {
|
suspend fun sendFriendMessage(qq: QQ, message: MessageChain) {
|
||||||
session.socket.sendPacketAsync(ClientSendFriendMessagePacket(session.bot.account.qqNumber, qq.number, session.sessionKey, message))
|
session.socket.sendPacket(ClientSendFriendMessagePacket(session.bot.account.qqNumber, qq.number, session.sessionKey, message))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun sendGroupMessage(group: Group, message: MessageChain) {
|
suspend fun sendGroupMessage(group: Group, message: MessageChain) {
|
||||||
session.socket.sendPacket(ClientSendGroupMessagePacket(session.bot.account.qqNumber, group.groupId, session.sessionKey, message))
|
session.socket.sendPacket(ClientSendGroupMessagePacket(session.bot.account.qqNumber, group.groupId, session.sessionKey, message))
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -11,7 +11,7 @@ import java.io.Closeable
|
|||||||
abstract class PacketHandler(
|
abstract class PacketHandler(
|
||||||
val session: LoginSession
|
val session: LoginSession
|
||||||
) : Closeable {
|
) : Closeable {
|
||||||
abstract fun onPacketReceived(packet: ServerPacket)
|
abstract suspend fun onPacketReceived(packet: ServerPacket)
|
||||||
|
|
||||||
override fun close() {
|
override fun close() {
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ open class TemporaryPacketHandler<P : ServerPacket>(
|
|||||||
this.expect = handler
|
this.expect = handler
|
||||||
}
|
}
|
||||||
|
|
||||||
fun send(session: LoginSession) {
|
suspend fun send(session: LoginSession) {
|
||||||
this.session = session
|
this.session = session
|
||||||
session.socket.sendPacket(toSend)
|
session.socket.sendPacket(toSend)
|
||||||
}
|
}
|
||||||
|
@ -6,8 +6,6 @@ import lombok.Data;
|
|||||||
@Data
|
@Data
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class BotAccount {
|
public class BotAccount {
|
||||||
|
|
||||||
public final long qqNumber;
|
public final long qqNumber;
|
||||||
private final String password;
|
public final String password;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,7 @@ object Main {
|
|||||||
println("-------------------------------------------")
|
println("-------------------------------------------")
|
||||||
exitProcess(0)*/
|
exitProcess(0)*/
|
||||||
|
|
||||||
var jpcap: JpcapCaptor? = null
|
val jpcap: JpcapCaptor?
|
||||||
val caplen = 4096
|
val caplen = 4096
|
||||||
val promiscCheck = true
|
val promiscCheck = true
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user