Skip to content

Commit e84d2c2

Browse files
committed
Test colored member card
1 parent 4e95154 commit e84d2c2

File tree

5 files changed

+70
-10
lines changed

5 files changed

+70
-10
lines changed

mirai-core/src/commonMain/kotlin/contact/NormalMemberImpl.kt

+14-6
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@ import net.mamoe.mirai.contact.*
1919
import net.mamoe.mirai.data.MemberInfo
2020
import net.mamoe.mirai.event.broadcast
2121
import net.mamoe.mirai.event.events.*
22-
import net.mamoe.mirai.internal.message.OnlineMessageSourceToGroupImpl
23-
import net.mamoe.mirai.internal.message.OnlineMessageSourceToStrangerImpl
2422
import net.mamoe.mirai.internal.message.OnlineMessageSourceToTempImpl
2523
import net.mamoe.mirai.internal.message.createMessageReceipt
2624
import net.mamoe.mirai.internal.network.protocol.packet.chat.TroopManagement
25+
import net.mamoe.mirai.internal.network.protocol.packet.chat.toResult
2726
import net.mamoe.mirai.message.MessageReceipt
2827
import net.mamoe.mirai.message.data.Message
28+
import net.mamoe.mirai.utils.autoHexToBytes
2929
import net.mamoe.mirai.utils.cast
3030
import net.mamoe.mirai.utils.currentTimeSeconds
3131
import kotlin.contracts.ExperimentalContracts
@@ -96,11 +96,19 @@ internal class NormalMemberImpl constructor(
9696
_nameCard = newValue
9797
launch {
9898
bot.network.run {
99-
TroopManagement.EditGroupNametag(
99+
TroopManagement.SetMemberNameNew(
100100
bot.client,
101-
this@NormalMemberImpl,
102-
newValue,
103-
).sendWithoutExpect()
101+
group.groupCode,
102+
this@NormalMemberImpl.id,
103+
TroopManagement.RichName(newValue, "25 C4 80 C4 80 07 C3 95".autoHexToBytes())
104+
).sendAndExpect().also {
105+
it.toResult("Set member nick").getOrThrow()
106+
}
107+
// TroopManagement.EditGroupNametag(
108+
// bot.client,
109+
// this@NormalMemberImpl,
110+
// newValue,
111+
// ).sendWithoutExpect()
104112
}
105113
MemberCardChangeEvent(oldValue, newValue, this@NormalMemberImpl).broadcast()
106114
}

mirai-core/src/commonMain/kotlin/network/notice/GroupMessageProcessor.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ internal class GroupMessageProcessor : SimpleNoticeProcessor<MsgOnlinePush.PbPus
188188
if (this[0] == 0x0A.toByte()) {
189189
val nameBuf = loadAs(Oidb0x8fc.CommCardNameBuf.serializer())
190190
if (nameBuf.richCardName.isNotEmpty()) {
191-
return@runCatching nameBuf.richCardName.joinToString("") { it.text.encodeToString() }
191+
return@runCatching nameBuf.richCardName.joinToString("") { it.text }
192192
}
193193
}
194194
return@runCatching null

mirai-core/src/commonMain/kotlin/network/protocol/data/proto/OIDB.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ internal class Oidb0x8fc : ProtoBuf {
240240
@Serializable
241241
internal class CommCardNameBuf(
242242
@ProtoNumber(1) @JvmField val richCardName: List<RichCardNameElem> = emptyList(),
243+
@ProtoNumber(2) @JvmField val coolId: Int,
243244
) : ProtoBuf
244245

245246
@Serializable
@@ -264,7 +265,7 @@ internal class Oidb0x8fc : ProtoBuf {
264265
@ProtoNumber(5) @JvmField val specialTitle: ByteArray = EMPTY_BYTE_ARRAY,
265266
@ProtoNumber(6) @JvmField val specialTitleExpireTime: Int = 0,
266267
@ProtoNumber(7) @JvmField val uinName: ByteArray = EMPTY_BYTE_ARRAY,
267-
@ProtoNumber(8) @JvmField val memberCardName: ByteArray = EMPTY_BYTE_ARRAY,
268+
@ProtoNumber(8) @JvmField val memberCardName: String = "",
268269
@ProtoNumber(9) @JvmField val phone: ByteArray = EMPTY_BYTE_ARRAY,
269270
@ProtoNumber(10) @JvmField val email: ByteArray = EMPTY_BYTE_ARRAY,
270271
@ProtoNumber(11) @JvmField val remark: ByteArray = EMPTY_BYTE_ARRAY,
@@ -279,7 +280,7 @@ internal class Oidb0x8fc : ProtoBuf {
279280
@Serializable
280281
internal class RichCardNameElem(
281282
@ProtoNumber(1) @JvmField val ctrl: ByteArray = EMPTY_BYTE_ARRAY,
282-
@ProtoNumber(2) @JvmField val text: ByteArray = EMPTY_BYTE_ARRAY,
283+
@ProtoNumber(2) @JvmField val text: String = "",
283284
) : ProtoBuf
284285

285286
@Serializable

mirai-core/src/commonMain/kotlin/network/protocol/packet/PacketFactory.kt

+1
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ internal object KnownPacketFactories {
152152
TroopManagement.GetAdmin,
153153
// TroopManagement.GetGroupInfo,
154154
TroopManagement.EditGroupNametag,
155+
TroopManagement.SetMemberNameNew,
155156
TroopManagement.Kick,
156157
TroopEssenceMsgManager.SetEssence,
157158
NudgePacket,

mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/TroopManagement.kt

+51-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ import net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory
2727
import net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket
2828
import net.mamoe.mirai.internal.network.subAppId
2929
import net.mamoe.mirai.internal.utils.io.serialization.*
30+
import net.mamoe.mirai.utils.autoHexToBytes
3031
import net.mamoe.mirai.utils.daysToSeconds
32+
import net.mamoe.mirai.utils.encodeToString
3133

3234
internal class TroopManagement {
3335

@@ -323,6 +325,53 @@ internal class TroopManagement {
323325
}
324326
}
325327

328+
class RichName(
329+
val name: String,
330+
val control: ByteArray? = null
331+
) {
332+
fun toRichCardNames(): List<Oidb0x8fc.RichCardNameElem> {
333+
return if (control == null) listOf(Oidb0x8fc.RichCardNameElem(text = name))
334+
else listOf(Oidb0x8fc.RichCardNameElem(text = name))
335+
}
336+
}
337+
338+
internal object SetMemberNameNew : OutgoingPacketFactory<CommonOidbResponse<Oidb0x8fc.RspBody>>("OidbSvc.0x8fc_3") {
339+
operator fun invoke(
340+
client: QQAndroidClient,
341+
groupCode: Long,
342+
memberId: Long,
343+
richName: RichName
344+
) = buildOutgoingUniPacket(client) {
345+
writeOidb(
346+
2300, 3, Oidb0x8fc.ReqBody.serializer(), Oidb0x8fc.ReqBody(
347+
groupCode = groupCode,
348+
memLevelInfo = listOf(
349+
Oidb0x8fc.MemberInfo(
350+
uin = memberId,
351+
memberCardName = richName.name,
352+
commRichCardName = Oidb0x8fc.CommCardNameBuf(
353+
richCardName = listOfNotNull(
354+
if (richName.control != null) Oidb0x8fc.RichCardNameElem(ctrl = richName.control) else null,
355+
Oidb0x8fc.RichCardNameElem(text = richName.name)
356+
),
357+
coolId = 0,
358+
).toByteArray(Oidb0x8fc.CommCardNameBuf.serializer()),
359+
360+
)
361+
),
362+
msgClientInfo = Oidb0x8fc.ClientInfo(
363+
implat = 109,
364+
ingClientver = client.buildVer
365+
)
366+
)
367+
)
368+
}
369+
370+
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): CommonOidbResponse<Oidb0x8fc.RspBody> {
371+
return readOidbRespCommon(Oidb0x8fc.RspBody.serializer()) { it }
372+
}
373+
}
374+
326375
internal object EditGroupNametag :
327376
OutgoingPacketFactory<EditGroupNametag.Response>("friendlist.ModifyGroupCardReq") {
328377
object Response : Packet {
@@ -362,7 +411,8 @@ internal class TroopManagement {
362411
gender = 0,
363412
dwuin = member.id,
364413
dwFlag = 31,
365-
sName = newName,
414+
sName = "<" + "25 C4 80 C4 80 07 C3 95".autoHexToBytes()
415+
.encodeToString() + ">" + newName,
366416
sPhone = "",
367417
sEmail = "",
368418
sRemark = ""

0 commit comments

Comments
 (0)