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
b6c24e00
Commit
b6c24e00
authored
Mar 29, 2020
by
Him188
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Plan for redesigning of MessageSource
parent
6d5b3086
Changes
19
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
90 additions
and
15 deletions
+90
-15
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/QQAndroidBot.kt
...mmonMain/kotlin/net/mamoe/mirai/qqandroid/QQAndroidBot.kt
+4
-2
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/GroupImpl.kt
...ain/kotlin/net/mamoe/mirai/qqandroid/contact/GroupImpl.kt
+1
-1
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/MemberImpl.kt
...in/kotlin/net/mamoe/mirai/qqandroid/contact/MemberImpl.kt
+2
-0
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/QQImpl.kt
...onMain/kotlin/net/mamoe/mirai/qqandroid/contact/QQImpl.kt
+1
-0
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/MessageSourceImpl.kt
...in/net/mamoe/mirai/qqandroid/message/MessageSourceImpl.kt
+3
-1
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/messages.kt
...Main/kotlin/net/mamoe/mirai/qqandroid/message/messages.kt
+1
-0
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/MultiMsg.kt
.../mirai/qqandroid/network/protocol/packet/chat/MultiMsg.kt
+1
-1
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.kt
...ndroid/network/protocol/packet/chat/receive/MessageSvc.kt
+2
-2
mirai-core/src/androidMain/kotlin/net/mamoe/mirai/Bot.kt
mirai-core/src/androidMain/kotlin/net/mamoe/mirai/Bot.kt
+2
-0
mirai-core/src/androidMain/kotlin/net/mamoe/mirai/BotJavaFriendlyAPI.kt
.../androidMain/kotlin/net/mamoe/mirai/BotJavaFriendlyAPI.kt
+4
-0
mirai-core/src/androidMain/kotlin/net/mamoe/mirai/message/MessageReceipt.kt
...roidMain/kotlin/net/mamoe/mirai/message/MessageReceipt.kt
+7
-2
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/Bot.kt
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/Bot.kt
+11
-0
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/MessageReceipt.kt
...mmonMain/kotlin/net.mamoe.mirai/message/MessageReceipt.kt
+15
-1
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageChain.kt
...nMain/kotlin/net.mamoe.mirai/message/data/MessageChain.kt
+1
-0
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageSource.kt
...Main/kotlin/net.mamoe.mirai/message/data/MessageSource.kt
+20
-2
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/QuoteReply.kt
...monMain/kotlin/net.mamoe.mirai/message/data/QuoteReply.kt
+4
-2
mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/Bot.kt
mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/Bot.kt
+2
-0
mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/BotJavaFriendlyAPI.kt
.../src/jvmMain/kotlin/net/mamoe/mirai/BotJavaFriendlyAPI.kt
+4
-0
mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/MessageReceipt.kt
.../jvmMain/kotlin/net/mamoe/mirai/message/MessageReceipt.kt
+5
-1
No files found.
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/QQAndroidBot.kt
View file @
b6c24e00
...
...
@@ -163,6 +163,7 @@ internal abstract class QQAndroidBotBase constructor(
TODO
(
"not implemented"
)
}
@ExperimentalMessageSource
override
suspend
fun
recall
(
source
:
MessageSource
)
{
if
(
source
.
senderId
!=
uin
&&
source
.
groupId
!=
0L
)
{
getGroup
(
source
.
groupId
).
checkBotPermissionOperator
()
...
...
@@ -382,8 +383,9 @@ internal abstract class QQAndroidBotBase constructor(
val
data
=
chain
.
calculateValidationDataForGroup
(
sequenceId
=
client
.
atomicNextMessageSequenceId
(),
time
=
time
.
toInt
(),
random
=
Random
.
nextInt
().
absoluteValue
.
toULong
().
toLong
(),
group
random
=
Random
.
nextInt
().
absoluteValue
.
toUInt
(),
groupCode
,
group
.
botAsMember
.
nameCardOrNick
)
val
response
=
...
...
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/GroupImpl.kt
View file @
b6c24e00
...
...
@@ -278,7 +278,7 @@ internal class GroupImpl(
check
(!
isBotMuted
)
{
"bot is muted. Remaining seconds=$botMuteRemaining"
}
val
event
=
GroupMessageSendEvent
(
this
,
message
.
asMessageChain
()).
broadcast
()
if
(
event
.
isCancelled
)
{
throw
EventCancelledException
(
"cancelled by
Friend
MessageSendEvent"
)
throw
EventCancelledException
(
"cancelled by
Group
MessageSendEvent"
)
}
lateinit
var
source
:
MessageSourceFromSendGroup
bot
.
network
.
run
{
...
...
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/MemberImpl.kt
View file @
b6c24e00
...
...
@@ -7,6 +7,8 @@
* https://github.com/mamoe/mirai/blob/master/LICENSE
*/
@
file
:
Suppress
(
"EXPERIMENTAL_API_USAGE"
)
package
net.mamoe.mirai.qqandroid.contact
import
kotlinx.coroutines.launch
...
...
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/QQImpl.kt
View file @
b6c24e00
...
...
@@ -8,6 +8,7 @@
*/
@
file
:
OptIn
(
MiraiInternalAPI
::
class
,
LowLevelAPI
::
class
)
@
file
:
Suppress
(
"EXPERIMENTAL_API_USAGE"
)
package
net.mamoe.mirai.qqandroid.contact
...
...
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/MessageSourceImpl.kt
View file @
b6c24e00
...
...
@@ -7,6 +7,8 @@
* https://github.com/mamoe/mirai/blob/master/LICENSE
*/
@
file
:
Suppress
(
"EXPERIMENTAL_API_USAGE"
,
"EXPERIMENTAL_OVERRIDE"
)
package
net.mamoe.mirai.qqandroid.message
import
kotlinx.coroutines.CoroutineScope
...
...
@@ -146,7 +148,7 @@ internal abstract class MessageSourceFromSend : MessageSource {
}
private
val
elems
by
lazy
{
originalMessage
.
toRichTextElems
(
groupId
!=
0L
)
originalMessage
.
toRichTextElems
(
groupId
!=
0L
,
true
)
}
private
fun
toJceDataImplForFriend
():
ImMsgBody
.
SourceMsg
{
...
...
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/messages.kt
View file @
b6c24e00
...
...
@@ -7,6 +7,7 @@
* https://github.com/mamoe/mirai/blob/master/LICENSE
*/
@
file
:
OptIn
(
MiraiExperimentalAPI
::
class
,
MiraiInternalAPI
::
class
,
LowLevelAPI
::
class
,
ExperimentalUnsignedTypes
::
class
)
@
file
:
Suppress
(
"EXPERIMENTAL_API_USAGE"
)
package
net.mamoe.mirai.qqandroid.message
...
...
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/MultiMsg.kt
View file @
b6c24e00
...
...
@@ -52,7 +52,7 @@ internal fun MessageChain.calculateValidationDataForGroup(
groupCode
:
Long
,
botMemberNameCard
:
String
):
MessageValidationData
{
val
richTextElems
=
this
.
toRichTextElems
(
true
)
val
richTextElems
=
this
.
toRichTextElems
(
true
,
false
)
val
msgTransmit
=
MsgTransmit
.
PbMultiMsgTransmit
(
msg
=
listOf
(
...
...
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.kt
View file @
b6c24e00
...
...
@@ -319,7 +319,7 @@ internal class MessageSvc {
contentHead
=
MsgComm
.
ContentHead
(
pkgNum
=
1
),
msgBody
=
ImMsgBody
.
MsgBody
(
richText
=
ImMsgBody
.
RichText
(
elems
=
message
.
toRichTextElems
(
false
)
elems
=
message
.
toRichTextElems
(
false
,
true
)
)
),
msgSeq
=
source
.
sequenceId
,
...
...
@@ -372,7 +372,7 @@ internal class MessageSvc {
contentHead
=
MsgComm
.
ContentHead
(
pkgNum
=
1
),
msgBody
=
ImMsgBody
.
MsgBody
(
richText
=
ImMsgBody
.
RichText
(
elems
=
message
.
toRichTextElems
(
true
)
elems
=
message
.
toRichTextElems
(
true
,
true
)
)
),
msgSeq
=
client
.
atomicNextMessageSequenceId
(),
...
...
mirai-core/src/androidMain/kotlin/net/mamoe/mirai/Bot.kt
View file @
b6c24e00
...
...
@@ -7,6 +7,7 @@ import kotlinx.coroutines.io.ByteReadChannel
import
net.mamoe.mirai.contact.*
import
net.mamoe.mirai.data.AddFriendResult
import
net.mamoe.mirai.message.MessageReceipt
import
net.mamoe.mirai.message.data.ExperimentalMessageSource
import
net.mamoe.mirai.message.data.Image
import
net.mamoe.mirai.message.data.MessageChain
import
net.mamoe.mirai.message.data.MessageSource
...
...
@@ -152,6 +153,7 @@ actual abstract class Bot actual constructor() : CoroutineScope, LowLevelBotAPIA
* @see _lowLevelRecallFriendMessage 低级 API
* @see _lowLevelRecallGroupMessage 低级 API
*/
@ExperimentalMessageSource
@JvmSynthetic
actual
abstract
suspend
fun
recall
(
source
:
MessageSource
)
...
...
mirai-core/src/androidMain/kotlin/net/mamoe/mirai/BotJavaFriendlyAPI.kt
View file @
b6c24e00
...
...
@@ -5,6 +5,7 @@ import net.mamoe.mirai.contact.PermissionDeniedException
import
net.mamoe.mirai.contact.recall
import
net.mamoe.mirai.data.AddFriendResult
import
net.mamoe.mirai.message.MessageReceipt
import
net.mamoe.mirai.message.data.ExperimentalMessageSource
import
net.mamoe.mirai.message.data.Image
import
net.mamoe.mirai.message.data.MessageChain
import
net.mamoe.mirai.message.data.MessageSource
...
...
@@ -61,6 +62,7 @@ actual abstract class BotJavaFriendlyAPI actual constructor() {
*
* @see Bot.recall (扩展函数) 接受参数 [MessageChain]
*/
@ExperimentalMessageSource
@JvmName
(
"recall"
)
fun
__recallBlockingForJava__
(
source
:
MessageSource
)
{
runBlocking
{
recall
(
source
)
}
...
...
@@ -88,6 +90,7 @@ actual abstract class BotJavaFriendlyAPI actual constructor() {
* @param millis 延迟的时间, 单位为毫秒
* @see recall
*/
@ExperimentalMessageSource
@JvmName
(
"recallIn"
)
fun
__recallIn_MemberForJava__
(
source
:
MessageSource
,
millis
:
Long
)
{
runBlocking
{
recallIn
(
source
,
millis
)
}
...
...
@@ -148,6 +151,7 @@ actual abstract class BotJavaFriendlyAPI actual constructor() {
/**
* 异步调用 [__recallBlockingForJava__]
*/
@ExperimentalMessageSource
@JvmName
(
"recallAsync"
)
fun
__recallAsyncForJava__
(
source
:
MessageSource
):
Future
<
Unit
>
{
return
future
{
recall
(
source
)
}
...
...
mirai-core/src/androidMain/kotlin/net/mamoe/mirai/message/MessageReceipt.kt
View file @
b6c24e00
...
...
@@ -29,7 +29,8 @@ import net.mamoe.mirai.utils.unsafeWeakRef
*/
@Suppress
(
"FunctionName"
)
@OptIn
(
MiraiInternalAPI
::
class
)
actual
open
class
MessageReceipt
<
C
:
Contact
>
actual
constructor
(
actual
open
class
MessageReceipt
<
C
:
Contact
>
@OptIn
(
ExperimentalMessageSource
::
class
)
actual
constructor
(
actual
val
source
:
MessageSource
,
target
:
C
,
private
val
botAsMember
:
Member
?
...
...
@@ -56,6 +57,7 @@ actual open class MessageReceipt<C : Contact> actual constructor(
* @see Bot.recall
* @throws IllegalStateException 当此消息已经被撤回或正计划撤回时
*/
@OptIn
(
ExperimentalMessageSource
::
class
)
actual
suspend
fun
recall
()
{
@Suppress
(
"BooleanLiteralArgument"
)
if
(
_isRecalled
.
compareAndSet
(
false
,
true
))
{
...
...
@@ -82,7 +84,8 @@ actual open class MessageReceipt<C : Contact> actual constructor(
if
(
_isRecalled
.
compareAndSet
(
false
,
true
))
{
return
when
(
val
contact
=
target
)
{
is
QQ
,
is
Group
->
contact
.
bot
.
recallIn
(
source
,
millis
)
is
Group
,
->
contact
.
bot
.
recallIn
(
source
,
millis
)
else
->
error
(
"Unknown contact type"
)
}
}
else
error
(
"message is already or planned to be recalled"
)
...
...
@@ -92,6 +95,7 @@ actual open class MessageReceipt<C : Contact> actual constructor(
* [确保 sequenceId可用][MessageSource.ensureSequenceIdAvailable] 然后引用这条消息.
* @see MessageChain.quote 引用一条消息
*/
@OptIn
(
ExperimentalMessageSource
::
class
)
actual
open
suspend
fun
quote
():
QuoteReplyToSend
{
this
.
source
.
ensureSequenceIdAvailable
()
@OptIn
(
LowLevelAPI
::
class
)
...
...
@@ -105,6 +109,7 @@ actual open class MessageReceipt<C : Contact> actual constructor(
*
* @see MessageChain.quote 引用一条消息
*/
@OptIn
(
ExperimentalMessageSource
::
class
)
@LowLevelAPI
@Suppress
(
"FunctionName"
)
actual
fun
_unsafeQuote
():
QuoteReplyToSend
{
...
...
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/Bot.kt
View file @
b6c24e00
...
...
@@ -19,6 +19,7 @@ import kotlinx.coroutines.launch
import
net.mamoe.mirai.contact.*
import
net.mamoe.mirai.data.AddFriendResult
import
net.mamoe.mirai.message.MessageReceipt
import
net.mamoe.mirai.message.data.ExperimentalMessageSource
import
net.mamoe.mirai.message.data.Image
import
net.mamoe.mirai.message.data.MessageChain
import
net.mamoe.mirai.message.data.MessageSource
...
...
@@ -33,6 +34,7 @@ import kotlin.jvm.JvmSynthetic
/**
* 登录, 返回 [this]
*/
@JvmSynthetic
suspend
inline
fun
<
B
:
Bot
>
B
.
alsoLogin
():
B
=
also
{
login
()
}
// 任何人都能看到这个方法
...
...
@@ -167,6 +169,7 @@ expect abstract class Bot() : CoroutineScope, LowLevelBotAPIAccessor {
* @see _lowLevelRecallFriendMessage 低级 API
* @see _lowLevelRecallGroupMessage 低级 API
*/
@ExperimentalMessageSource
@JvmSynthetic
abstract
suspend
fun
recall
(
source
:
MessageSource
)
...
...
@@ -223,6 +226,7 @@ expect abstract class Bot() : CoroutineScope, LowLevelBotAPIAccessor {
* @throws PermissionDeniedException 当 [Bot] 无权限操作时
* @see Bot.recall
*/
@JvmSynthetic
suspend
inline
fun
Bot
.
recall
(
message
:
MessageChain
)
=
this
.
recall
(
message
[
MessageSource
])
/**
...
...
@@ -233,6 +237,7 @@ suspend inline fun Bot.recall(message: MessageChain) = this.recall(message[Messa
* @param coroutineContext 额外的 [CoroutineContext]
* @see recall
*/
@JvmSynthetic
inline
fun
Bot
.
recallIn
(
source
:
MessageSource
,
millis
:
Long
,
...
...
@@ -249,6 +254,7 @@ inline fun Bot.recallIn(
* @param coroutineContext 额外的 [CoroutineContext]
* @see recall
*/
@JvmSynthetic
inline
fun
Bot
.
recallIn
(
message
:
MessageChain
,
millis
:
Long
,
...
...
@@ -265,15 +271,20 @@ inline fun Bot.recallIn(
*
* @param cause 原因. 为 null 时视为正常关闭, 非 null 时视为异常关闭
*/
@JvmSynthetic
suspend
inline
fun
Bot
.
closeAndJoin
(
cause
:
Throwable
?
=
null
)
{
close
(
cause
)
coroutineContext
[
Job
]
?.
join
()
}
@JvmSynthetic
inline
fun
Bot
.
containsFriend
(
id
:
Long
):
Boolean
=
this
.
friends
.
contains
(
id
)
@JvmSynthetic
inline
fun
Bot
.
containsGroup
(
id
:
Long
):
Boolean
=
this
.
groups
.
contains
(
id
)
@JvmSynthetic
inline
fun
Bot
.
getFriendOrNull
(
id
:
Long
):
QQ
?
=
this
.
friends
.
getOrNull
(
id
)
@JvmSynthetic
inline
fun
Bot
.
getGroupOrNull
(
id
:
Long
):
Group
?
=
this
.
groups
.
getOrNull
(
id
)
\ No newline at end of file
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/MessageReceipt.kt
View file @
b6c24e00
...
...
@@ -15,12 +15,16 @@ import net.mamoe.mirai.LowLevelAPI
import
net.mamoe.mirai.contact.*
import
net.mamoe.mirai.message.data.*
import
net.mamoe.mirai.recallIn
import
kotlin.jvm.JvmSynthetic
/**
* 发送消息后得到的回执. 可用于撤回.
*
* 此对象持有 [Contact] 的弱引用, [Bot] 离线后将会释放引用, 届时 [target] 将无法访问.
*
* @param source 指代发送出去的消息
* @param target 消息发送对象
*
* @see Group.sendMessage 发送群消息, 返回回执(此对象)
* @see QQ.sendMessage 发送群消息, 返回回执(此对象)
*
...
...
@@ -28,11 +32,15 @@ import net.mamoe.mirai.recallIn
* @see MessageReceipt.sourceSequenceId 源序列号
* @see MessageReceipt.sourceTime 源时间
*/
expect
open
class
MessageReceipt
<
C
:
Contact
>(
expect
open
class
MessageReceipt
<
C
:
Contact
>
@OptIn
(
ExperimentalMessageSource
::
class
)
constructor
(
source
:
MessageSource
,
target
:
C
,
botAsMember
:
Member
?
)
{
/**
* 指代发送出去的消息
*/
@ExperimentalMessageSource
val
source
:
MessageSource
/**
...
...
@@ -90,6 +98,8 @@ expect open class MessageReceipt<C : Contact>(
*
* @see MessageSource.id
*/
@
get
:
JvmSynthetic
@ExperimentalMessageSource
inline
val
MessageReceipt
<*>.
sourceId
:
Long
get
()
=
this
.
source
.
id
/**
...
...
@@ -97,6 +107,8 @@ inline val MessageReceipt<*>.sourceId: Long get() = this.source.id
*
* @see MessageSource.sequenceId
*/
@
get
:
JvmSynthetic
@ExperimentalMessageSource
inline
val
MessageReceipt
<*>.
sourceSequenceId
:
Int
get
()
=
this
.
source
.
sequenceId
/**
...
...
@@ -104,6 +116,8 @@ inline val MessageReceipt<*>.sourceSequenceId: Int get() = this.source.sequenceI
*
* @see MessageSource.time
*/
@
get
:
JvmSynthetic
@ExperimentalMessageSource
inline
val
MessageReceipt
<*>.
sourceTime
:
Long
get
()
=
this
.
source
.
time
suspend
inline
fun
MessageReceipt
<
out
Contact
>.
quoteReply
(
message
:
Message
)
{
...
...
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageChain.kt
View file @
b6c24e00
...
...
@@ -127,6 +127,7 @@ inline fun <reified M : Message> MessageChain.any(): Boolean = this.any { it is
/**
* 获取第一个 [M] 类型的 [Message] 实例
*/
@OptIn
(
ExperimentalMessageSource
::
class
)
@JvmSynthetic
@Suppress
(
"UNCHECKED_CAST"
)
fun
<
M
:
Message
>
MessageChain
.
firstOrNull
(
key
:
Message
.
Key
<
M
>):
M
?
=
when
(
key
)
{
...
...
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageSource.kt
View file @
b6c24e00
...
...
@@ -19,6 +19,12 @@ import kotlin.jvm.JvmMultifileClass
import
kotlin.jvm.JvmName
import
kotlin.jvm.JvmSynthetic
/**
* MessageSource 正计划于 0.32 或 0.33 或之后进行 API 不兼容的重写.
*/
@RequiresOptIn
(
message
=
"MessageSource 正计划于 0.32 或 0.33 或之后进行 API 不兼容的重写"
,
level
=
RequiresOptIn
.
Level
.
WARNING
)
annotation
class
ExperimentalMessageSource
/**
* 消息源, 它存在于 [MessageChain] 中, 用于表示这个消息的来源.
*
...
...
@@ -29,6 +35,7 @@ import kotlin.jvm.JvmSynthetic
* @see Bot.recall 撤回一条消息
* @see MessageSource.quote 引用这条消息, 创建 [MessageChain]
*/
@ExperimentalMessageSource
interface
MessageSource
:
Message
,
MessageMetadata
{
companion
object
Key
:
Message
.
Key
<
MessageSource
>
...
...
@@ -82,6 +89,7 @@ interface MessageSource : Message, MessageMetadata {
* 序列号. 若是机器人发出去的消息, 请先 [确保 sequenceId 可用][MessageSource.ensureSequenceIdAvailable]
* @see MessageSource.id
*/
@ExperimentalMessageSource
@
get
:
JvmSynthetic
inline
val
MessageSource
.
sequenceId
:
Int
get
()
=
(
this
.
id
shr
32
).
toInt
()
...
...
@@ -90,6 +98,7 @@ inline val MessageSource.sequenceId: Int
* 消息随机数. 由服务器或客户端指定后不能更改. 它是消息 id 的一部分.
* @see MessageSource.id
*/
@ExperimentalMessageSource
@
get
:
JvmSynthetic
inline
val
MessageSource
.
messageRandom
:
Int
get
()
=
this
.
id
.
toInt
()
...
...
@@ -98,24 +107,33 @@ inline val MessageSource.messageRandom: Int
/**
* 消息 id.
*
* 仅接收到的消息才可以获取这个 id.
*
* @see MessageSource.id
*/
@ExperimentalMessageSource
@
get
:
JvmSynthetic
inline
val
MessageChain
.
id
:
Long
get
()
=
this
[
MessageSource
].
id
/**
* 消息序列号, 可能来自服务器也可以发送时赋值, 不唯一.
*
* 仅接收到的消息才可以获取这个序列号.
*
* @see MessageSource.id
*/
@ExperimentalMessageSource
@
get
:
JvmSynthetic
inline
val
MessageChain
.
sequenceId
:
Int
get
()
=
this
[
MessageSource
].
sequenceId
get
()
=
this
.
getOrNull
(
MessageSource
)
?.
sequenceId
?:
error
(
"Only MessageChain from server has sequenceId"
)
/**
* 消息随机数. 由服务器或客户端指定后不能更改. 它是消息 id 的一部分.
* @see MessageSource.id
*/
@ExperimentalMessageSource
@
get
:
JvmSynthetic
inline
val
MessageChain
.
messageRandom
:
Int
get
()
=
this
[
MessageSource
].
messageRandom
get
()
=
this
.
getOrNull
(
MessageSource
)
?.
messageRandom
?:
error
(
"Only MessageChain from server has sequenceId"
)
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/QuoteReply.kt
View file @
b6c24e00
...
...
@@ -29,6 +29,7 @@ import kotlin.jvm.JvmName
* 总是使用 [quote] 来构造这个实例.
*/
open
class
QuoteReply
@OptIn
(
ExperimentalMessageSource
::
class
)
@MiraiInternalAPI
constructor
(
val
source
:
MessageSource
)
:
Message
,
MessageMetadata
{
companion
object
Key
:
Message
.
Key
<
QuoteReply
>
...
...
@@ -39,7 +40,7 @@ open class QuoteReply
* 用于发送的引用回复.
* 总是使用 [quote] 来构造实例.
*/
@OptIn
(
MiraiInternalAPI
::
class
)
@OptIn
(
MiraiInternalAPI
::
class
,
ExperimentalMessageSource
::
class
)
sealed
class
QuoteReplyToSend
@MiraiInternalAPI
constructor
(
source
:
MessageSource
)
:
QuoteReply
(
source
)
{
class
ToGroup
(
source
:
MessageSource
,
val
sender
:
QQ
)
:
QuoteReplyToSend
(
source
)
{
...
...
@@ -53,7 +54,7 @@ sealed class QuoteReplyToSend
* 引用这条消息.
* @see sender 消息发送人.
*/
@OptIn
(
MiraiInternalAPI
::
class
)
@OptIn
(
MiraiInternalAPI
::
class
,
ExperimentalMessageSource
::
class
)
fun
MessageChain
.
quote
(
sender
:
QQ
?):
QuoteReplyToSend
{
this
.
firstOrNull
<
MessageSource
>()
?.
let
{
return
it
.
quote
(
sender
)
...
...
@@ -65,6 +66,7 @@ fun MessageChain.quote(sender: QQ?): QuoteReplyToSend {
* 引用这条消息.
* @see from 消息来源. 若是好友发送
*/
@ExperimentalMessageSource
@OptIn
(
MiraiInternalAPI
::
class
)
fun
MessageSource
.
quote
(
from
:
QQ
?):
QuoteReplyToSend
{
return
if
(
this
.
groupId
!=
0L
)
{
...
...
mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/Bot.kt
View file @
b6c24e00
...
...
@@ -7,6 +7,7 @@ import kotlinx.coroutines.io.ByteReadChannel
import
net.mamoe.mirai.contact.*
import
net.mamoe.mirai.data.AddFriendResult
import
net.mamoe.mirai.message.MessageReceipt
import
net.mamoe.mirai.message.data.ExperimentalMessageSource
import
net.mamoe.mirai.message.data.Image
import
net.mamoe.mirai.message.data.MessageChain
import
net.mamoe.mirai.message.data.MessageSource
...
...
@@ -162,6 +163,7 @@ actual abstract class Bot actual constructor() : CoroutineScope, LowLevelBotAPIA
* @see _lowLevelRecallFriendMessage 低级 API
* @see _lowLevelRecallGroupMessage 低级 API
*/
@ExperimentalMessageSource
@JvmSynthetic
actual
abstract
suspend
fun
recall
(
source
:
MessageSource
)
...
...
mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/BotJavaFriendlyAPI.kt
View file @
b6c24e00
...
...
@@ -5,6 +5,7 @@ import net.mamoe.mirai.contact.PermissionDeniedException
import
net.mamoe.mirai.contact.recall
import
net.mamoe.mirai.data.AddFriendResult
import
net.mamoe.mirai.message.MessageReceipt
import
net.mamoe.mirai.message.data.ExperimentalMessageSource
import
net.mamoe.mirai.message.data.Image
import
net.mamoe.mirai.message.data.MessageChain
import
net.mamoe.mirai.message.data.MessageSource
...
...
@@ -61,6 +62,7 @@ actual abstract class BotJavaFriendlyAPI actual constructor() {
*
* @see Bot.recall (扩展函数) 接受参数 [MessageChain]
*/
@ExperimentalMessageSource
@JvmName
(
"recall"
)
fun
__recallBlockingForJava__
(
source
:
MessageSource
)
{
runBlocking
{
recall
(
source
)
}
...
...
@@ -88,6 +90,7 @@ actual abstract class BotJavaFriendlyAPI actual constructor() {
* @param millis 延迟的时间, 单位为毫秒
* @see recall
*/
@ExperimentalMessageSource
@JvmName
(
"recallIn"
)
fun
__recallIn_MemberForJava__
(
source
:
MessageSource
,
millis
:
Long
)
{
runBlocking
{
recallIn
(
source
,
millis
)
}
...
...
@@ -148,6 +151,7 @@ actual abstract class BotJavaFriendlyAPI actual constructor() {
/**
* 异步调用 [__recallBlockingForJava__]
*/
@ExperimentalMessageSource
@JvmName
(
"recallAsync"
)
fun
__recallAsyncForJava__
(
source
:
MessageSource
):
Future
<
Unit
>
{
return
future
{
recall
(
source
)
}
...
...
mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/MessageReceipt.kt
View file @
b6c24e00
...
...
@@ -29,7 +29,8 @@ import net.mamoe.mirai.utils.unsafeWeakRef
*/
@Suppress
(
"FunctionName"
)
@OptIn
(
MiraiInternalAPI
::
class
)
actual
open
class
MessageReceipt
<
C
:
Contact
>
actual
constructor
(
actual
open
class
MessageReceipt
<
C
:
Contact
>
@OptIn
(
ExperimentalMessageSource
::
class
)
actual
constructor
(
actual
val
source
:
MessageSource
,
target
:
C
,
private
val
botAsMember
:
Member
?
...
...
@@ -56,6 +57,7 @@ actual open class MessageReceipt<C : Contact> actual constructor(
* @see Bot.recall
* @throws IllegalStateException 当此消息已经被撤回或正计划撤回时
*/
@OptIn
(
ExperimentalMessageSource
::
class
)
actual
suspend
fun
recall
()
{
@Suppress
(
"BooleanLiteralArgument"
)
if
(
_isRecalled
.
compareAndSet
(
false
,
true
))
{
...
...
@@ -84,6 +86,7 @@ actual open class MessageReceipt<C : Contact> actual constructor(
* [确保 sequenceId可用][MessageSource.ensureSequenceIdAvailable] 然后引用这条消息.
* @see MessageChain.quote 引用一条消息
*/
@OptIn
(
ExperimentalMessageSource
::
class
)
actual
open
suspend
fun
quote
():
QuoteReplyToSend
{
this
.
source
.
ensureSequenceIdAvailable
()
@OptIn
(
LowLevelAPI
::
class
)
...
...
@@ -97,6 +100,7 @@ actual open class MessageReceipt<C : Contact> actual constructor(
*
* @see MessageChain.quote 引用一条消息
*/
@OptIn
(
ExperimentalMessageSource
::
class
)
@LowLevelAPI
@Suppress
(
"FunctionName"
)
actual
fun
_unsafeQuote
():
QuoteReplyToSend
{
...
...
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