Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
M
Mirai
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
MyCard
Mirai
Commits
2b02121b
Commit
2b02121b
authored
Sep 22, 2019
by
Him188moe
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Kotlin coroutine
parent
b10e0104
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
53 additions
and
38 deletions
+53
-38
mirai-core/src/main/java/net/mamoe/mirai/contact/Contact.kt
mirai-core/src/main/java/net/mamoe/mirai/contact/Contact.kt
+1
-1
mirai-core/src/main/java/net/mamoe/mirai/event/MiraiEventHookKt.kt
...e/src/main/java/net/mamoe/mirai/event/MiraiEventHookKt.kt
+13
-4
mirai-core/src/main/java/net/mamoe/mirai/event/MiraiEventManagerKt.kt
...rc/main/java/net/mamoe/mirai/event/MiraiEventManagerKt.kt
+21
-10
mirai-core/src/main/java/net/mamoe/mirai/message/defaults/UnsolvedImage.kt
...in/java/net/mamoe/mirai/message/defaults/UnsolvedImage.kt
+1
-1
mirai-core/src/main/java/net/mamoe/mirai/network/BotNetworkHandlerImpl.kt
...ain/java/net/mamoe/mirai/network/BotNetworkHandlerImpl.kt
+15
-5
mirai-core/src/main/java/net/mamoe/mirai/network/NetworkScope.kt
...ore/src/main/java/net/mamoe/mirai/network/NetworkScope.kt
+2
-17
No files found.
mirai-core/src/main/java/net/mamoe/mirai/contact/Contact.kt
View file @
2b02121b
...
@@ -23,7 +23,7 @@ abstract class Contact internal constructor(val bot: Bot, val number: Long) {
...
@@ -23,7 +23,7 @@ abstract class Contact internal constructor(val bot: Bot, val number: Long) {
/**
/**
* 上传图片
* 上传图片
*/
*/
suspend
fun
uploadImage
(
session
:
LoginSession
,
image
:
UnsolvedImage
):
CompletableFuture
<
Unit
>
{
fun
uploadImage
(
session
:
LoginSession
,
image
:
UnsolvedImage
):
CompletableFuture
<
Unit
>
{
return
image
.
upload
(
session
,
this
)
return
image
.
upload
(
session
,
this
)
}
}
...
...
mirai-core/src/main/java/net/mamoe/mirai/event/MiraiEventHookKt.kt
View file @
2b02121b
package
net.mamoe.mirai.event
package
net.mamoe.mirai.event
import
kotlinx.coroutines.runBlocking
import
java.util.function.Consumer
import
java.util.function.Consumer
import
java.util.function.Predicate
import
java.util.function.Predicate
...
@@ -7,12 +8,20 @@ import java.util.function.Predicate
...
@@ -7,12 +8,20 @@ import java.util.function.Predicate
* @author Him188moe
* @author Him188moe
*/
*/
class
MiraiEventHookKt
<
E
:
MiraiEvent
>(
eventClass
:
Class
<
E
>)
:
MiraiEventHook
<
E
>(
eventClass
)
{
class
MiraiEventHookKt
<
E
:
MiraiEvent
>(
eventClass
:
Class
<
E
>)
:
MiraiEventHook
<
E
>(
eventClass
)
{
fun
onEvent
(
handler
:
(
E
)
->
Unit
)
{
fun
onEvent
(
handler
:
suspend
(
E
)
->
Unit
)
{
this
@MiraiEventHookKt
.
handler
=
Consumer
(
handler
)
this
@MiraiEventHookKt
.
handler
=
Consumer
{
runBlocking
{
handler
(
it
)
}
}
}
}
fun
validChecker
(
predicate
:
(
E
)
->
Boolean
)
{
fun
validChecker
(
predicate
:
suspend
(
E
)
->
Boolean
)
{
//todo 把 mirai event 变为 suspend, 而不是在这里 run blocking
this
@MiraiEventHookKt
.
validChecker
=
Predicate
(
predicate
)
this
@MiraiEventHookKt
.
validChecker
=
Predicate
{
runBlocking
{
predicate
(
it
)
}
}
}
}
}
}
...
...
mirai-core/src/main/java/net/mamoe/mirai/event/MiraiEventManagerKt.kt
View file @
2b02121b
...
@@ -2,6 +2,7 @@
...
@@ -2,6 +2,7 @@
package
net.mamoe.mirai.event
package
net.mamoe.mirai.event
import
kotlinx.coroutines.runBlocking
import
kotlin.reflect.KClass
import
kotlin.reflect.KClass
/**
/**
...
@@ -18,21 +19,29 @@ object EventManager : MiraiEventManager()
...
@@ -18,21 +19,29 @@ object EventManager : MiraiEventManager()
/**
/**
* 每次事件触发时都会调用 hook
* 每次事件触发时都会调用 hook
*/
*/
fun
<
C
:
Class
<
E
>,
E
:
MiraiEvent
>
C
.
hookAlways
(
hook
:
(
E
)
->
Unit
)
{
fun
<
C
:
Class
<
E
>,
E
:
MiraiEvent
>
C
.
hookAlways
(
hook
:
suspend
(
E
)
->
Unit
)
{
MiraiEventManager
.
getInstance
().
hookAlways
(
MiraiEventHook
<
E
>(
this
,
hook
))
MiraiEventManager
.
getInstance
().
hookAlways
(
MiraiEventHook
<
E
>(
this
)
{
runBlocking
{
hook
(
it
)
}
})
}
}
/**
/**
* 当下一次事件触发时调用 hook
* 当下一次事件触发时调用 hook
*/
*/
fun
<
C
:
Class
<
E
>,
E
:
MiraiEvent
>
C
.
hookOnce
(
hook
:
(
E
)
->
Unit
)
{
fun
<
C
:
Class
<
E
>,
E
:
MiraiEvent
>
C
.
hookOnce
(
hook
:
suspend
(
E
)
->
Unit
)
{
MiraiEventManager
.
getInstance
().
hookOnce
(
MiraiEventHook
<
E
>(
this
,
hook
))
MiraiEventManager
.
getInstance
().
hookOnce
(
MiraiEventHook
<
E
>(
this
)
{
runBlocking
{
hook
(
it
)
}
})
}
}
/**
/**
* 每次事件触发时都会调用 hook, 直到 hook 返回 false 时停止 hook
* 每次事件触发时都会调用 hook, 直到 hook 返回 false 时停止 hook
*/
*/
fun
<
C
:
Class
<
E
>,
E
:
MiraiEvent
>
C
.
hookWhile
(
hook
:
(
E
)
->
Boolean
)
{
fun
<
C
:
Class
<
E
>,
E
:
MiraiEvent
>
C
.
hookWhile
(
hook
:
suspend
(
E
)
->
Boolean
)
{
MiraiEventManager
.
getInstance
().
hookAlways
(
MiraiEventHookSimple
(
this
,
hook
))
MiraiEventManager
.
getInstance
().
hookAlways
(
MiraiEventHookSimple
(
this
,
hook
))
}
}
...
@@ -40,28 +49,30 @@ fun <C : Class<E>, E : MiraiEvent> C.hookWhile(hook: (E) -> Boolean) {
...
@@ -40,28 +49,30 @@ fun <C : Class<E>, E : MiraiEvent> C.hookWhile(hook: (E) -> Boolean) {
/**
/**
* 每次事件触发时都会调用 hook
* 每次事件触发时都会调用 hook
*/
*/
fun
<
C
:
KClass
<
E
>,
E
:
MiraiEvent
>
C
.
hookAlways
(
hook
:
(
E
)
->
Unit
)
{
fun
<
C
:
KClass
<
E
>,
E
:
MiraiEvent
>
C
.
hookAlways
(
hook
:
suspend
(
E
)
->
Unit
)
{
this
.
java
.
hookAlways
(
hook
)
this
.
java
.
hookAlways
(
hook
)
}
}
/**
/**
* 当下一次事件触发时调用 hook
* 当下一次事件触发时调用 hook
*/
*/
fun
<
C
:
KClass
<
E
>,
E
:
MiraiEvent
>
C
.
hookOnce
(
hook
:
(
E
)
->
Unit
)
{
fun
<
C
:
KClass
<
E
>,
E
:
MiraiEvent
>
C
.
hookOnce
(
hook
:
suspend
(
E
)
->
Unit
)
{
this
.
java
.
hookOnce
(
hook
)
this
.
java
.
hookOnce
(
hook
)
}
}
/**
/**
* 每次事件触发时都会调用 hook, 直到 hook 返回 false 时停止 hook
* 每次事件触发时都会调用 hook, 直到 hook 返回 false 时停止 hook
*/
*/
fun
<
C
:
KClass
<
E
>,
E
:
MiraiEvent
>
C
.
hookWhile
(
hook
:
(
E
)
->
Boolean
)
{
fun
<
C
:
KClass
<
E
>,
E
:
MiraiEvent
>
C
.
hookWhile
(
hook
:
suspend
(
E
)
->
Boolean
)
{
this
.
java
.
hookWhile
(
hook
)
this
.
java
.
hookWhile
(
hook
)
}
}
private
class
MiraiEventHookSimple
<
E
:
MiraiEvent
>(
clazz
:
Class
<
E
>,
val
hook
:
(
E
)
->
Boolean
)
:
MiraiEventHook
<
E
>(
clazz
)
{
private
class
MiraiEventHookSimple
<
E
:
MiraiEvent
>(
clazz
:
Class
<
E
>,
val
hook
:
suspend
(
E
)
->
Boolean
)
:
MiraiEventHook
<
E
>(
clazz
)
{
override
fun
accept
(
event
:
MiraiEvent
?):
Boolean
{
override
fun
accept
(
event
:
MiraiEvent
?):
Boolean
{
@Suppress
(
"UNCHECKED_CAST"
)
@Suppress
(
"UNCHECKED_CAST"
)
return
!
hook
.
invoke
(
event
as
E
)
return
runBlocking
{
return
@
runBlocking
!
hook
.
invoke
(
event
as
E
)
}
}
}
}
}
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/message/defaults/UnsolvedImage.kt
View file @
2b02121b
...
@@ -26,7 +26,7 @@ class UnsolvedImage(filename: String, val image: BufferedImage) : Image(getImage
...
@@ -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
))
suspend
fun
upload
(
session
:
LoginSession
,
contact
:
Contact
):
CompletableFuture
<
Unit
>
{
//todo be suspend
fun
upload
(
session
:
LoginSession
,
contact
:
Contact
):
CompletableFuture
<
Unit
>
{
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
)
}
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/BotNetworkHandlerImpl.kt
View file @
2b02121b
...
@@ -117,8 +117,10 @@ internal class BotNetworkHandlerImpl(private val bot: Bot) : BotNetworkHandler {
...
@@ -117,8 +117,10 @@ internal class BotNetworkHandlerImpl(private val bot: Bot) : BotNetworkHandler {
if
(!
packet
.
javaClass
.
name
.
endsWith
(
"Encrypted"
)
&&
!
packet
.
javaClass
.
name
.
endsWith
(
"Raw"
))
{
if
(!
packet
.
javaClass
.
name
.
endsWith
(
"Encrypted"
)
&&
!
packet
.
javaClass
.
name
.
endsWith
(
"Raw"
))
{
bot
.
notice
(
"Packet received: $packet"
)
bot
.
notice
(
"Packet received: $packet"
)
}
}
}
if
(
packet
is
ServerEventPacket
)
{
if
(
packet
is
ServerEventPacket
)
{
NetworkScope
.
launch
{
sendPacket
(
ClientEventResponsePacket
(
bot
.
account
.
qqNumber
,
packet
.
packetId
,
sessionKey
,
packet
.
eventIdentity
))
sendPacket
(
ClientEventResponsePacket
(
bot
.
account
.
qqNumber
,
packet
.
packetId
,
sessionKey
,
packet
.
eventIdentity
))
}
}
}
}
...
@@ -127,11 +129,19 @@ internal class BotNetworkHandlerImpl(private val bot: Bot) : BotNetworkHandler {
...
@@ -127,11 +129,19 @@ internal class BotNetworkHandlerImpl(private val bot: Bot) : BotNetworkHandler {
return
return
}
}
withContext
(
NetworkScope
.
coroutineContext
)
{
launch
{
login
.
onPacketReceived
(
packet
)
login
.
onPacketReceived
(
packet
)
}
packetHandlers
.
forEach
{
packetHandlers
.
forEach
{
launch
{
it
.
instance
.
onPacketReceived
(
packet
)
it
.
instance
.
onPacketReceived
(
packet
)
}
}
}
}
}
//awaits all coroutines launched in this block
}
private
var
socket
:
DatagramSocket
?
=
null
private
var
socket
:
DatagramSocket
?
=
null
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/NetworkScope.kt
View file @
2b02121b
package
net.mamoe.mirai.network
package
net.mamoe.mirai.network
import
kotlinx.coroutines.CoroutineScope
import
kotlinx.coroutines.CoroutineScope
import
kotlinx.coroutines.asCoroutineDispatcher
import
kotlinx.coroutines.Dispatchers
import
java.util.concurrent.SynchronousQueue
import
java.util.concurrent.ThreadPoolExecutor
import
java.util.concurrent.TimeUnit
import
kotlin.coroutines.CoroutineContext
object
NetworkScope
:
CoroutineScope
{
object
NetworkScope
:
CoroutineScope
by
CoroutineScope
(
Dispatchers
.
Default
)
override
val
coroutineContext
:
CoroutineContext
\ No newline at end of file
get
()
=
lazy
{
ThreadPoolExecutor
(
1
,
4
,
8000
,
TimeUnit
.
MILLISECONDS
,
SynchronousQueue
()
).
asCoroutineDispatcher
()
}.
value
//todo improve
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment