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
1922fdc5
Commit
1922fdc5
authored
Feb 04, 2020
by
Him188
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/master'
parents
2232d51a
35742632
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
95 additions
and
40 deletions
+95
-40
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt
...ommonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt
+1
-0
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt
...moe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt
+25
-17
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/TroopManagement.kt
...qqandroid/network/protocol/packet/chat/TroopManagement.kt
+24
-3
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Member.kt
...e/src/commonMain/kotlin/net.mamoe.mirai/contact/Member.kt
+6
-0
mirai-demos/mirai-demo-gentleman/src/main/kotlin/demo/gentleman/GentleImage.kt
...o-gentleman/src/main/kotlin/demo/gentleman/GentleImage.kt
+29
-19
mirai-demos/mirai-demo-gentleman/src/main/kotlin/demo/gentleman/Main.kt
...rai-demo-gentleman/src/main/kotlin/demo/gentleman/Main.kt
+10
-1
No files found.
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt
View file @
1922fdc5
...
@@ -61,6 +61,7 @@ internal class QQImpl(bot: QQAndroidBot, override val coroutineContext: Coroutin
...
@@ -61,6 +61,7 @@ internal class QQImpl(bot: QQAndroidBot, override val coroutineContext: Coroutin
internal
class
MemberImpl
(
internal
class
MemberImpl
(
qq
:
QQImpl
,
qq
:
QQImpl
,
override
var
groupCard
:
String
,
group
:
GroupImpl
,
group
:
GroupImpl
,
override
val
coroutineContext
:
CoroutineContext
,
override
val
coroutineContext
:
CoroutineContext
,
override
val
permission
:
MemberPermission
override
val
permission
:
MemberPermission
...
...
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt
View file @
1922fdc5
...
@@ -174,12 +174,13 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler
...
@@ -174,12 +174,13 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler
group
.
owner
=
group
.
owner
=
MemberImpl
(
MemberImpl
(
qq
=
bot
.
QQ
(
it
.
dwGroupOwnerUin
)
as
QQImpl
,
qq
=
bot
.
QQ
(
it
.
dwGroupOwnerUin
)
as
QQImpl
,
groupCard
=
""
,
//unknown now
group
=
group
,
group
=
group
,
coroutineContext
=
group
.
coroutineContext
,
coroutineContext
=
group
.
coroutineContext
,
permission
=
MemberPermission
.
OWNER
permission
=
MemberPermission
.
OWNER
)
)
if
(
it
.
dwGroupOwnerUin
==
bot
.
uin
)
{
if
(
it
.
dwGroupOwnerUin
==
bot
.
uin
)
{
group
.
botPermission
=
=
MemberPermission
.
OWNER
group
.
botPermission
=
MemberPermission
.
OWNER
}
}
toGet
[
group
]
=
contactList
toGet
[
group
]
=
contactList
bot
.
groups
.
delegate
.
addLast
(
group
)
bot
.
groups
.
delegate
.
addLast
(
group
)
...
@@ -189,9 +190,9 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler
...
@@ -189,9 +190,9 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler
launch
{
launch
{
try
{
try
{
getTroopMemberList
(
it
.
key
,
it
.
value
,
it
.
key
.
owner
.
id
)
getTroopMemberList
(
it
.
key
,
it
.
value
,
it
.
key
.
owner
.
id
)
groupInfo
[
it
.
key
.
uin
]
=
it
.
value
.
size
groupInfo
[
it
.
key
.
id
]
=
it
.
value
.
size
}
catch
(
e
:
Exception
)
{
}
catch
(
e
:
Exception
)
{
groupInfo
[
it
.
key
.
uin
]
=
-
1
groupInfo
[
it
.
key
.
id
]
=
-
1
bot
.
logger
.
info
(
"群${it.key.uin}的列表拉取失败, 将采用动态加入"
)
bot
.
logger
.
info
(
"群${it.key.uin}的列表拉取失败, 将采用动态加入"
)
}
}
}
}
...
@@ -206,25 +207,30 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler
...
@@ -206,25 +207,30 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler
}
}
//===log===//
//===log===//
fun
fillUntil
9
(
long
:
Number
):
String
{
fun
fillUntil
(
long
:
Number
,
size
:
Int
):
String
{
val
x
=
long
.
toString
()
val
x
=
long
.
toString
()
return
" "
.
repeat
(
return
x
+
" "
.
repeat
(
if
(
9
-
x
.
length
>
0
)
{
if
(
size
-
x
.
length
>
0
)
{
9
-
x
.
length
size
-
x
.
length
}
else
{
}
else
{
0
0
}
}
)
+
x
)
}
}
bot
.
logger
.
info
(
"====================Mirai Bot List初始化完毕===================="
)
bot
.
logger
.
info
(
"====================Mirai Bot List初始化完毕===================="
)
bot
.
logger
.
info
(
"好友数量: ${fillUntil
9(bot.qqs.size
)}\t\t\t 加载时间: ${friendLoadFinish - startTime}ms"
)
bot
.
logger
.
info
(
"好友数量: ${fillUntil
(bot.qqs.size, 9
)}\t\t\t 加载时间: ${friendLoadFinish - startTime}ms"
)
bot
.
logger
.
info
(
"加入群组: ${fillUntil
9(bot.groups.size
)}\t\t\t 加载时间: ${currentTimeMillis - friendLoadFinish}ms"
)
bot
.
logger
.
info
(
"加入群组: ${fillUntil
(bot.groups.size, 9
)}\t\t\t 加载时间: ${currentTimeMillis - friendLoadFinish}ms"
)
groupInfo
.
forEach
{
groupInfo
.
forEach
{
if
(
it
.
value
==
-
1
)
{
if
(
it
.
value
==
-
1
)
{
bot
.
logger
.
error
(
"群组号码: ${fillUntil
9(it.key
)}\t 成员数量加载失败"
)
bot
.
logger
.
error
(
"群组号码: ${fillUntil
(it.key, 9
)}\t 成员数量加载失败"
)
}
else
{
}
else
{
bot
.
logger
.
info
(
"群组号码: ${fillUntil9(it.key)}\t 成员数量: ${it.value}\t BOT权限: "
+
bot
.
groups
[
it
.
key
].
botPermission
.
toString
()
+
""
)
bot
.
logger
.
info
(
"群组号码: ${fillUntil(it.key, 9)}\t 成员数量: ${fillUntil(
it
.
value
,
4
)}
\
t
BOT
权限
:
" + bot.groups[it.key].botPermission.toString() + ""
)
}
}
}
}
bot
.
logger
.
info
(
"====================Mirai Bot List初始化完毕===================="
)
bot
.
logger
.
info
(
"====================Mirai Bot List初始化完毕===================="
)
...
@@ -248,19 +254,21 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler
...
@@ -248,19 +254,21 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler
list
.
delegate
.
addLast
(
list
.
delegate
.
addLast
(
MemberImpl
(
MemberImpl
(
qq
=
bot
.
QQ
(
it
.
memberUin
)
as
QQImpl
,
qq
=
bot
.
QQ
(
it
.
memberUin
)
as
QQImpl
,
groupCard
=
it
.
sShowName
?:
it
.
sName
?:
it
.
nick
,
group
=
group
,
group
=
group
,
coroutineContext
=
group
.
coroutineContext
,
coroutineContext
=
group
.
coroutineContext
,
permission
=
when
{
permission
=
when
{
it
.
memberUin
==
owner
->
MemberPermission
.
OWNER
it
.
memberUin
==
owner
->
MemberPermission
.
OWNER
it
.
dwFlag
==
1L
->
MemberPermission
.
ADMINISTRATOR
.
apply
{
it
.
dwFlag
==
1L
->
MemberPermission
.
ADMINISTRATOR
if
(
it
.
memberUin
==
bot
.
uin
)
{
group
.
botPermission
=
MemberPermission
.
ADMINISTRATOR
}
}
else
->
MemberPermission
.
MEMBER
else
->
MemberPermission
.
MEMBER
}
}
)
)
)
)
}
else
{
group
.
owner
.
groupCard
=
it
.
sShowName
?:
it
.
sName
?:
it
.
nick
if
(
it
.
dwFlag
==
1L
)
{
group
.
botPermission
=
MemberPermission
.
ADMINISTRATOR
}
}
}
}
}
size
+=
data
.
members
.
size
size
+=
data
.
members
.
size
...
...
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/TroopManagement.kt
View file @
1922fdc5
...
@@ -8,6 +8,7 @@ import net.mamoe.mirai.qqandroid.QQAndroidBot
...
@@ -8,6 +8,7 @@ import net.mamoe.mirai.qqandroid.QQAndroidBot
import
net.mamoe.mirai.qqandroid.io.serialization.writeProtoBuf
import
net.mamoe.mirai.qqandroid.io.serialization.writeProtoBuf
import
net.mamoe.mirai.qqandroid.network.QQAndroidClient
import
net.mamoe.mirai.qqandroid.network.QQAndroidClient
import
net.mamoe.mirai.qqandroid.network.protocol.data.proto.OidbSso
import
net.mamoe.mirai.qqandroid.network.protocol.data.proto.OidbSso
import
net.mamoe.mirai.qqandroid.network.protocol.packet.EMPTY_BYTE_ARRAY
import
net.mamoe.mirai.qqandroid.network.protocol.packet.OutgoingPacket
import
net.mamoe.mirai.qqandroid.network.protocol.packet.OutgoingPacket
import
net.mamoe.mirai.qqandroid.network.protocol.packet.OutgoingPacketFactory
import
net.mamoe.mirai.qqandroid.network.protocol.packet.OutgoingPacketFactory
import
net.mamoe.mirai.qqandroid.network.protocol.packet.buildOutgoingUniPacket
import
net.mamoe.mirai.qqandroid.network.protocol.packet.buildOutgoingUniPacket
...
@@ -47,14 +48,34 @@ internal object TroopManagement {
...
@@ -47,14 +48,34 @@ internal object TroopManagement {
)
)
}
}
}
}
object
Response
:
Packet
object
Response
:
Packet
}
}
internal
object
MuteAll
:
OutgoingPacketFactory
<
LoginPacket
.
LoginPacketResponse
>(
"OidbSvc.0x89a_0"
)
{
internal
object
MuteAll
:
OutgoingPacketFactory
<
MuteAll
.
Response
>(
"OidbSvc.0x89a_0"
)
{
override
suspend
fun
ByteReadPacket
.
decode
(
bot
:
QQAndroidBot
):
LoginPacket
.
LoginPacketResponse
{
override
suspend
fun
ByteReadPacket
.
decode
(
bot
:
QQAndroidBot
):
Response
{
TODO
(
"not implemented"
)
//To change body of created functions use File | Settings | File Templates.
return
Response
}
operator
fun
invoke
(
client
:
QQAndroidClient
,
groupCode
:
Long
):
OutgoingPacket
{
return
buildOutgoingUniPacket
(
client
)
{
writeProtoBuf
(
OidbSso
.
OIDBSSOPkg
.
serializer
(),
OidbSso
.
OIDBSSOPkg
(
command
=
2202
,
serviceType
=
0
,
result
=
0
,
bodybuffer
=
EMPTY_BYTE_ARRAY
//TODO
)
)
}
}
}
object
Response
:
Packet
}
}
internal
object
EditNametag
:
OutgoingPacketFactory
<
LoginPacket
.
LoginPacketResponse
>(
"OidbSvc.0x8fc_2"
)
{
internal
object
EditNametag
:
OutgoingPacketFactory
<
LoginPacket
.
LoginPacketResponse
>(
"OidbSvc.0x8fc_2"
)
{
...
...
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Member.kt
View file @
1922fdc5
...
@@ -21,6 +21,11 @@ interface Member : QQ, Contact {
...
@@ -21,6 +21,11 @@ interface Member : QQ, Contact {
*/
*/
val
permission
:
MemberPermission
val
permission
:
MemberPermission
/**
*
*/
var
groupCard
:
String
/**
/**
* 禁言
* 禁言
*
*
...
@@ -37,6 +42,7 @@ interface Member : QQ, Contact {
...
@@ -37,6 +42,7 @@ interface Member : QQ, Contact {
* 解除禁言
* 解除禁言
*/
*/
suspend
fun
unmute
():
Boolean
suspend
fun
unmute
():
Boolean
}
}
@ExperimentalTime
@ExperimentalTime
...
...
mirai-demos/mirai-demo-gentleman/src/main/kotlin/demo/gentleman/GentleImage.kt
View file @
1922fdc5
...
@@ -12,31 +12,41 @@ class GentleImage {
...
@@ -12,31 +12,41 @@ class GentleImage {
// `Deferred<Image?>` causes a runtime ClassCastException
// `Deferred<Image?>` causes a runtime ClassCastException
val
image
:
Deferred
<
Image
>
by
lazy
{
val
image
:
Deferred
<
Image
>
by
lazy
{
getImage
(
0
)
}
GlobalScope
.
async
{
//delay((Math.random() * 5000L).toLong())
val
seImage
:
Deferred
<
Image
>
by
lazy
{
getImage
(
1
)
}
class
Result
{
var
id
:
String
=
""
}
fun
getImage
(
r18
:
Int
):
Deferred
<
Image
>
{
return
GlobalScope
.
async
{
withTimeoutOrNull
(
5
*
1000
)
{
withTimeoutOrNull
(
5
*
1000
)
{
withContext
(
Dispatchers
.
IO
)
{
withContext
(
Dispatchers
.
IO
)
{
val
result
=
JSON
.
parseObject
(
val
result
=
Jsoup
.
connect
(
"http://dev.itxtech.org:10322/v2/randomImg.uue"
).
ignoreContentType
(
true
).
timeout
(
10
_0000
).
get
().
body
().
text
(),
JSON
.
parseObject
(
Result
::
class
.
java
Jsoup
.
connect
(
"https://api.lolicon.app/setu/?r18=$r18"
).
ignoreContentType
(
true
).
timeout
(
10
_0000
).
get
().
body
().
text
()
)
)
Jsoup
.
connect
(
"http://dev.itxtech.org:10322/img.uue?size=large&id=${result.id}"
)
val
url
:
String
.
userAgent
(
UserAgent
.
randomUserAgent
)
val
pid
:
String
.
timeout
(
10
_0000
)
with
(
result
.
getJSONArray
(
"data"
).
getJSONObject
(
0
))
{
url
=
this
.
getString
(
"url"
)
pid
=
this
.
getString
(
"pid"
)
}
Jsoup
.
connect
(
url
)
.
followRedirects
(
true
)
.
timeout
(
180
_000
)
.
ignoreContentType
(
true
)
.
ignoreContentType
(
true
)
.
maxBodySize
(
Int
.
MAX_VALUE
)
.
userAgent
(
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"
)
.
execute
()
.
referrer
(
"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=$pid"
)
.
bodyStream
()
.
ignoreHttpErrors
(
true
)
.
maxBodySize
(
10000000
)
.
execute
().
also
{
check
(
it
.
statusCode
()
==
200
)
{
"Failed to download image"
}
}
}
}
}
?.
uploadAsImage
(
contact
)
?:
error
(
"Unable to download image"
)
}
?.
bodyStream
()
?.
uploadAsImage
(
contact
)
?:
error
(
"Unable to download image"
)
}
}
}
}
}
}
mirai-demos/mirai-demo-gentleman/src/main/kotlin/demo/gentleman/Main.kt
View file @
1922fdc5
...
@@ -151,7 +151,7 @@ suspend fun main() {
...
@@ -151,7 +151,7 @@ suspend fun main() {
file
.
sendAsImageTo
(
subject
)
file
.
sendAsImageTo
(
subject
)
}
}
startsWith
(
"
随机图片
"
,
removePrefix
=
true
)
{
startsWith
(
"
色图
"
,
removePrefix
=
true
)
{
repeat
(
it
.
toIntOrNull
()
?:
1
)
{
repeat
(
it
.
toIntOrNull
()
?:
1
)
{
GlobalScope
.
launch
{
GlobalScope
.
launch
{
delay
(
Random
.
Default
.
nextLong
(
100
,
1000
))
delay
(
Random
.
Default
.
nextLong
(
100
,
1000
))
...
@@ -160,6 +160,15 @@ suspend fun main() {
...
@@ -160,6 +160,15 @@ suspend fun main() {
}
}
}
}
startsWith
(
"不够色"
,
removePrefix
=
true
)
{
repeat
(
it
.
toIntOrNull
()
?:
1
)
{
GlobalScope
.
launch
{
delay
(
Random
.
Default
.
nextLong
(
100
,
1000
))
Gentlemen
.
provide
(
subject
).
receive
().
seImage
.
await
().
send
()
}
}
}
startsWith
(
"添加好友"
,
removePrefix
=
true
)
{
startsWith
(
"添加好友"
,
removePrefix
=
true
)
{
reply
(
bot
.
addFriend
(
it
.
toLong
()).
toString
())
reply
(
bot
.
addFriend
(
it
.
toLong
()).
toString
())
}
}
...
...
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