edit group name supported

This commit is contained in:
jiahua.liu 2020-02-05 23:34:26 +08:00
parent 385f71e2ee
commit e43a5176e0
6 changed files with 109 additions and 12 deletions

View File

@ -82,9 +82,14 @@ internal class MemberImpl(
"Permission Denied when trying to edit group card for $this"
}
if (group.botPermission != MemberPermission.MEMBER && new != old) {
launch {
bot.network.run {
TroopManagement.EditGroupNametag(
bot.client,
this@MemberImpl,
new
).sendWithoutExpect()
}
}
}

View File

@ -90,7 +90,10 @@ fun <T : ProtoBuf> ByteArray.loadAs(deserializer: DeserializationStrategy<T>): T
/**
* load
*/
fun <T : ProtoBuf> ByteReadPacket.readProtoBuf(serializer: DeserializationStrategy<T>, length: Int = this.remaining.toInt()): T {
fun <T : ProtoBuf> ByteReadPacket.readProtoBuf(
serializer: DeserializationStrategy<T>,
length: Int = this.remaining.toInt()
): T {
return ProtoBufWithNullableSupport.load(serializer, this.readBytes(length))
}
@ -98,11 +101,20 @@ fun <T : ProtoBuf> ByteReadPacket.readProtoBuf(serializer: DeserializationStrate
* 构造 [RequestPacket] [RequestPacket.sBuffer]
*/
fun <T : JceStruct> jceRequestSBuffer(name: String, serializer: SerializationStrategy<T>, jceStruct: T): ByteArray {
return jceRequestSBuffer(name, serializer, jceStruct, JceCharset.GBK)
}
fun <T : JceStruct> jceRequestSBuffer(
name: String,
serializer: SerializationStrategy<T>,
jceStruct: T,
charset: JceCharset
): ByteArray {
return RequestDataVersion3(
mapOf(
name to JCE_STRUCT_HEAD_OF_TAG_0 + jceStruct.toByteArray(serializer) + JCE_STRUCT_TAIL_OF_TAG_0
)
).toByteArray(RequestDataVersion3.serializer())
).toByteArray(RequestDataVersion3.serializer(), charset)
}
private val JCE_STRUCT_HEAD_OF_TAG_0 = byteArrayOf(0x0A)

View File

@ -4,6 +4,25 @@ import kotlinx.serialization.SerialId
import kotlinx.serialization.Serializable
import net.mamoe.mirai.qqandroid.io.JceStruct
@Serializable
internal class ModifyGroupCardReq(
@SerialId(0) val dwZero: Long,
@SerialId(1) val dwGroupCode: Long,
@SerialId(2) val dwNewSeq: Long,
@SerialId(3) val vecUinInfo: List<stUinInfo>
) : JceStruct
@Serializable
internal class stUinInfo(
@SerialId(0) val dwuin: Long,
@SerialId(1) val dwFlag: Long,
@SerialId(2) val sName: String = "",
@SerialId(3) val gender: Byte,
@SerialId(4) val sPhone: String = "",
@SerialId(5) val sEmail: String = "",
@SerialId(6) val sRemark: String = ""
) : JceStruct
@Serializable
internal class GetFriendListReq(
@SerialId(0) val reqtype: Int? = null,

View File

@ -128,7 +128,8 @@ internal object KnownPacketFactories {
TroopManagement.EditSpecialTitle,
TroopManagement.Mute,
TroopManagement.GroupOperation,
TroopManagement.GetGroupOperationInfo
TroopManagement.GetGroupOperationInfo,
TroopManagement.EditGroupNametag
)
object IncomingFactories : List<IncomingPacketFactory<*>> by mutableListOf(

View File

@ -1,16 +1,18 @@
package net.mamoe.mirai.qqandroid.network.protocol.packet.chat
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.buildPacket
import kotlinx.io.core.readBytes
import kotlinx.io.core.toByteArray
import kotlinx.io.charsets.Charset
import kotlinx.io.charsets.encode
import kotlinx.io.core.*
import kotlinx.serialization.toUtf8Bytes
import net.mamoe.mirai.contact.Member
import net.mamoe.mirai.data.Packet
import net.mamoe.mirai.qqandroid.QQAndroidBot
import net.mamoe.mirai.qqandroid.io.serialization.loadAs
import net.mamoe.mirai.qqandroid.io.serialization.toByteArray
import net.mamoe.mirai.qqandroid.io.serialization.writeProtoBuf
import net.mamoe.mirai.qqandroid.io.serialization.*
import net.mamoe.mirai.qqandroid.network.QQAndroidClient
import net.mamoe.mirai.qqandroid.network.protocol.data.jce.GetTroopListReqV2Simplify
import net.mamoe.mirai.qqandroid.network.protocol.data.jce.ModifyGroupCardReq
import net.mamoe.mirai.qqandroid.network.protocol.data.jce.RequestPacket
import net.mamoe.mirai.qqandroid.network.protocol.data.jce.stUinInfo
import net.mamoe.mirai.qqandroid.network.protocol.data.proto.Oidb0x88d
import net.mamoe.mirai.qqandroid.network.protocol.data.proto.Oidb0x89a
import net.mamoe.mirai.qqandroid.network.protocol.data.proto.Oidb0x8fc
@ -20,6 +22,8 @@ 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.buildOutgoingUniPacket
import net.mamoe.mirai.utils.daysToSeconds
import net.mamoe.mirai.utils.io.encodeToGBKString
import net.mamoe.mirai.utils.io.encodeToString
internal object TroopManagement {
@ -316,6 +320,57 @@ internal object TroopManagement {
}
}
internal object EditGroupNametag :
OutgoingPacketFactory<EditGroupNametag.Response>("friendlist.ModifyGroupCardReq") {
object Response : Packet
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): EditGroupNametag.Response {
return Response
}
operator fun invoke(
client: QQAndroidClient,
member: Member,
newName: String
): OutgoingPacket {
return buildOutgoingUniPacket(client) {
writeJceStruct(
RequestPacket.serializer(),
RequestPacket(
sFuncName = "ModifyGroupCardReq",
sServantName = "mqq.IMService.FriendListServiceServantObj",
iVersion = 3,
cPacketType = 0x00,
iMessageType = 0x00000,
iRequestId = client.nextRequestPacketRequestId(),
sBuffer = jceRequestSBuffer(
"MGCREQ",
ModifyGroupCardReq.serializer(),
ModifyGroupCardReq(
dwZero = 0L,
dwGroupCode = member.group.id,
dwNewSeq = 0L,
vecUinInfo = listOf(
stUinInfo(
gender = 0,
dwuin = member.id,
dwFlag = 31,
sName = newName.toUtf8Bytes().encodeToGBKString(),
sPhone = "",
sEmail = "",
sRemark = ""
)
)
),
JceCharset.GBK
)
)
)
}
}
}
/*
internal object Recall: OutgoingPacketFactory<LoginPacket.LoginPacketResponse>("wtlogin.login"){
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): LoginPacket.LoginPacketResponse {

View File

@ -2,6 +2,7 @@
package net.mamoe.mirai.utils.io
import kotlinx.io.charsets.Charset
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.String
import kotlinx.io.core.use
@ -81,7 +82,11 @@ fun UByteArray.toUHexString(separator: String = " ", offset: Int = 0, length: In
@Suppress("NOTHING_TO_INLINE")
inline fun ByteArray.encodeToString(): String = String(this)
fun ByteArray.toReadPacket(offset: Int = 0, length: Int = this.size - offset) = ByteReadPacket(this, offset = offset, length = length)
fun ByteArray.encodeToGBKString(): String = String(this, 0, this.size, Charset.forName("GBK"))
fun ByteArray.toReadPacket(offset: Int = 0, length: Int = this.size - offset) =
ByteReadPacket(this, offset = offset, length = length)
@UseExperimental(ExperimentalContracts::class)
inline fun <R> ByteArray.read(t: ByteReadPacket.() -> R): R {