mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-26 07:20:09 +08:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
96c3e775b3
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid
mirai-demos/mirai-demo-gentleman/src/main/kotlin/demo/gentleman
@ -20,7 +20,6 @@ import net.mamoe.mirai.qqandroid.utils.toIpV4AddressString
|
||||
import net.mamoe.mirai.utils.*
|
||||
import net.mamoe.mirai.utils.io.toUHexString
|
||||
import kotlin.coroutines.CoroutineContext
|
||||
import kotlin.properties.Delegates
|
||||
|
||||
internal abstract class ContactImpl : Contact {
|
||||
override fun hashCode(): Int {
|
||||
@ -51,6 +50,7 @@ internal class QQImpl(bot: QQAndroidBot, override val coroutineContext: Coroutin
|
||||
) { "send message failed" }
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun uploadImage(image: ExternalImage): Image = try {
|
||||
bot.network.run {
|
||||
val response = LongConn.OffPicUp(
|
||||
@ -129,8 +129,8 @@ internal class QQImpl(bot: QQAndroidBot, override val coroutineContext: Coroutin
|
||||
|
||||
internal class MemberImpl(
|
||||
qq: QQImpl,
|
||||
initGroupCard: String,
|
||||
initSpecialTitle: String,
|
||||
var _groupCard: String,
|
||||
var _specialTitle: String,
|
||||
group: GroupImpl,
|
||||
override val coroutineContext: CoroutineContext,
|
||||
override val permission: MemberPermission
|
||||
@ -138,37 +138,41 @@ internal class MemberImpl(
|
||||
override val group: GroupImpl by group.unsafeWeakRef()
|
||||
val qq: QQImpl by qq.unsafeWeakRef()
|
||||
|
||||
|
||||
override var groupCard: String by Delegates.observable(initGroupCard) { _, old, new ->
|
||||
group.checkBotPermissionOperator()
|
||||
if (new != old) {
|
||||
|
||||
launch {
|
||||
bot.network.run {
|
||||
TroopManagement.EditGroupNametag(
|
||||
bot.client,
|
||||
this@MemberImpl,
|
||||
new
|
||||
).sendWithoutExpect()
|
||||
override var groupCard: String
|
||||
get() = _groupCard
|
||||
set(newValue) {
|
||||
group.checkBotPermissionOperator()
|
||||
if (_groupCard != newValue) {
|
||||
_groupCard = newValue
|
||||
launch {
|
||||
bot.network.run {
|
||||
TroopManagement.EditGroupNametag(
|
||||
bot.client,
|
||||
this@MemberImpl,
|
||||
newValue
|
||||
).sendWithoutExpect()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override var specialTitle: String by Delegates.observable(initSpecialTitle) { _, old, new ->
|
||||
group.checkBotPermissionOperator()
|
||||
if (new != old) {
|
||||
launch {
|
||||
bot.network.run {
|
||||
TroopManagement.EditSpecialTitle(
|
||||
bot.client,
|
||||
this@MemberImpl,
|
||||
new
|
||||
).sendWithoutExpect()
|
||||
override var specialTitle: String
|
||||
get() = _specialTitle
|
||||
set(newValue) {
|
||||
group.checkBotPermissionOperator()
|
||||
if (_specialTitle != newValue) {
|
||||
_specialTitle = newValue
|
||||
launch {
|
||||
bot.network.run {
|
||||
TroopManagement.EditSpecialTitle(
|
||||
bot.client,
|
||||
this@MemberImpl,
|
||||
newValue
|
||||
).sendWithoutExpect()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override val bot: QQAndroidBot get() = qq.bot
|
||||
|
||||
@ -233,100 +237,119 @@ internal class GroupImpl(
|
||||
bot: QQAndroidBot, override val coroutineContext: CoroutineContext,
|
||||
override val id: Long,
|
||||
val uin: Long,
|
||||
initName: String,
|
||||
initAnnouncement: String,
|
||||
initAllowMemberInvite: Boolean,
|
||||
initConfessTalk: Boolean,
|
||||
initMuteAll: Boolean,
|
||||
initAutoApprove: Boolean,
|
||||
initAnonymousChat: Boolean,
|
||||
var _name: String,
|
||||
var _announcement: String,
|
||||
var _allowMemberInvite: Boolean,
|
||||
var _confessTalk: Boolean,
|
||||
var _muteAll: Boolean,
|
||||
var _autoApprove: Boolean,
|
||||
var _anonymousChat: Boolean,
|
||||
override val members: ContactList<Member>
|
||||
) : ContactImpl(), Group {
|
||||
|
||||
override var name by Delegates.observable(initName) { _, oldValue, newValue ->
|
||||
this.checkBotPermissionOperator()
|
||||
if (oldValue != newValue) {
|
||||
launch {
|
||||
bot.network.run {
|
||||
TroopManagement.GroupOperation.name(
|
||||
client = bot.client,
|
||||
groupCode = id,
|
||||
newName = newValue
|
||||
).sendWithoutExpect()
|
||||
override var name: String
|
||||
get() = _name
|
||||
set(newValue) {
|
||||
this.checkBotPermissionOperator()
|
||||
if (_name != newValue) {
|
||||
_name = newValue
|
||||
launch {
|
||||
bot.network.run {
|
||||
TroopManagement.GroupOperation.name(
|
||||
client = bot.client,
|
||||
groupCode = id,
|
||||
newName = newValue
|
||||
).sendWithoutExpect()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override var announcement: String by Delegates.observable(initAnnouncement) { _, oldValue, newValue ->
|
||||
this.checkBotPermissionOperator()
|
||||
if (oldValue != newValue) {
|
||||
launch {
|
||||
bot.network.run {
|
||||
TroopManagement.GroupOperation.memo(
|
||||
client = bot.client,
|
||||
groupCode = id,
|
||||
newMemo = newValue
|
||||
).sendWithoutExpect()
|
||||
override var announcement: String
|
||||
get() = _announcement
|
||||
set(newValue) {
|
||||
this.checkBotPermissionOperator()
|
||||
if (_announcement != newValue) {
|
||||
_announcement = newValue
|
||||
launch {
|
||||
bot.network.run {
|
||||
TroopManagement.GroupOperation.memo(
|
||||
client = bot.client,
|
||||
groupCode = id,
|
||||
newMemo = newValue
|
||||
).sendWithoutExpect()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
override var allowMemberInvite: Boolean by Delegates.observable(initAllowMemberInvite) { _, oldValue, newValue ->
|
||||
this.checkBotPermissionOperator()
|
||||
if (oldValue != newValue) {
|
||||
launch {
|
||||
bot.network.run {
|
||||
TroopManagement.GroupOperation.allowMemberInvite(
|
||||
client = bot.client,
|
||||
groupCode = id,
|
||||
switch = newValue
|
||||
).sendWithoutExpect()
|
||||
override var allowMemberInvite: Boolean
|
||||
get() = _allowMemberInvite
|
||||
set(newValue) {
|
||||
this.checkBotPermissionOperator()
|
||||
if (_allowMemberInvite != newValue) {
|
||||
_allowMemberInvite = newValue
|
||||
launch {
|
||||
bot.network.run {
|
||||
TroopManagement.GroupOperation.allowMemberInvite(
|
||||
client = bot.client,
|
||||
groupCode = id,
|
||||
switch = newValue
|
||||
).sendWithoutExpect()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override var autoApprove: Boolean by Delegates.observable(initAutoApprove) { _, oldValue, newValue ->
|
||||
TODO("Group.autoApprove implementation")
|
||||
}
|
||||
override var autoApprove: Boolean
|
||||
get() = _autoApprove
|
||||
set(newValue) {
|
||||
TODO()
|
||||
}
|
||||
|
||||
override val anonymousChat: Boolean by Delegates.observable(initAnonymousChat) { _, oldValue, newValue ->
|
||||
TODO("Group.anonymousChat implementation")
|
||||
}
|
||||
override var anonymousChat: Boolean
|
||||
get() = _anonymousChat
|
||||
set(newValue) {
|
||||
TODO()
|
||||
}
|
||||
|
||||
override var confessTalk: Boolean by Delegates.observable(initConfessTalk) { _, oldValue, newValue ->
|
||||
this.checkBotPermissionOperator()
|
||||
if (oldValue != newValue) {
|
||||
launch {
|
||||
bot.network.run {
|
||||
TroopManagement.GroupOperation.confessTalk(
|
||||
client = bot.client,
|
||||
groupCode = id,
|
||||
switch = newValue
|
||||
).sendWithoutExpect()
|
||||
override var confessTalk: Boolean
|
||||
get() = _confessTalk
|
||||
set(newValue) {
|
||||
this.checkBotPermissionOperator()
|
||||
if (_confessTalk != newValue) {
|
||||
_confessTalk = newValue
|
||||
launch {
|
||||
bot.network.run {
|
||||
TroopManagement.GroupOperation.confessTalk(
|
||||
client = bot.client,
|
||||
groupCode = id,
|
||||
switch = newValue
|
||||
).sendWithoutExpect()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
override var muteAll: Boolean by Delegates.observable(initMuteAll) { _, oldValue, newValue ->
|
||||
this.checkBotPermissionOperator()
|
||||
if (oldValue != newValue) {
|
||||
launch {
|
||||
bot.network.run {
|
||||
TroopManagement.GroupOperation.muteAll(
|
||||
client = bot.client,
|
||||
groupCode = id,
|
||||
switch = newValue
|
||||
).sendWithoutExpect()
|
||||
override var muteAll: Boolean
|
||||
get() = _muteAll
|
||||
set(newValue) {
|
||||
this.checkBotPermissionOperator()
|
||||
if (_muteAll != newValue) {
|
||||
_muteAll = newValue
|
||||
launch {
|
||||
bot.network.run {
|
||||
TroopManagement.GroupOperation.muteAll(
|
||||
client = bot.client,
|
||||
groupCode = id,
|
||||
switch = newValue
|
||||
).sendWithoutExpect()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
override lateinit var owner: Member
|
||||
@ -340,7 +363,7 @@ internal class GroupImpl(
|
||||
|
||||
|
||||
override operator fun get(id: Long): Member {
|
||||
return members.delegate.filteringGetOrNull { it.id == id } ?: throw NoSuchElementException("for group id $id")
|
||||
return members.delegate.filteringGetOrNull { it.id == id } ?: throw NoSuchElementException("member $id not found in group $uin")
|
||||
}
|
||||
|
||||
override fun contains(id: Long): Boolean {
|
||||
|
@ -390,10 +390,10 @@ class Jce private constructor(private val charset: JceCharset, context: SerialMo
|
||||
}
|
||||
|
||||
override fun decodeTaggedNotNullMark(tag: Int): Boolean {
|
||||
return !isTagOptional(tag)
|
||||
return !isTagMissing(tag)
|
||||
}
|
||||
|
||||
fun isTagOptional(tag: Int): Boolean {
|
||||
fun isTagMissing(tag: Int): Boolean {
|
||||
val head = input.peakHeadOrNull()
|
||||
return input.isEndOfInput || head == null || head.tag > tag
|
||||
}
|
||||
@ -405,10 +405,15 @@ class Jce private constructor(private val charset: JceCharset, context: SerialMo
|
||||
if (deserializer is NullReader) {
|
||||
return null
|
||||
}
|
||||
currentTagOrNull?.let {
|
||||
if (this.isTagMissing(it)) {
|
||||
return null
|
||||
}
|
||||
}
|
||||
when (deserializer.descriptor) {
|
||||
ByteArraySerializer.descriptor -> {
|
||||
val tag = popTag()
|
||||
return if (isTagOptional(tag)) input.readByteArrayOrNull(tag) as? T
|
||||
return if (isTagMissing(tag)) input.readByteArrayOrNull(tag) as? T
|
||||
else input.readByteArray(tag) as T
|
||||
}
|
||||
is ListLikeDescriptor -> {
|
||||
@ -417,14 +422,14 @@ class Jce private constructor(private val charset: JceCharset, context: SerialMo
|
||||
&& (deserializer as ListLikeSerializer<Any?, T, Any?>).typeParams[0] is ByteSerializer
|
||||
) {
|
||||
val tag = popTag()
|
||||
return if (isTagOptional(tag)) input.readByteArrayOrNull(tag)?.toTypedArray() as? T
|
||||
return if (isTagMissing(tag)) input.readByteArrayOrNull(tag)?.toTypedArray() as? T
|
||||
else input.readByteArray(tag).toTypedArray() as T
|
||||
} else if (deserializer is ArrayListSerializer<*>
|
||||
&& (deserializer as ArrayListSerializer<*>).typeParams.isNotEmpty()
|
||||
&& (deserializer as ArrayListSerializer<*>).typeParams[0] is ByteSerializer
|
||||
) {
|
||||
val tag = popTag()
|
||||
return if (isTagOptional(tag)) input.readByteArrayOrNull(tag)?.toMutableList() as? T
|
||||
return if (isTagMissing(tag)) input.readByteArrayOrNull(tag)?.toMutableList() as? T
|
||||
else input.readByteArray(tag).toMutableList() as T
|
||||
}
|
||||
val tag = currentTag
|
||||
@ -433,7 +438,7 @@ class Jce private constructor(private val charset: JceCharset, context: SerialMo
|
||||
if (input.skipToTagOrNull(tag) {
|
||||
return deserializer.deserialize(JceListReader(input.readInt(0), input))
|
||||
} == null) {
|
||||
if (isTagOptional(tag)) {
|
||||
if (isTagMissing(tag)) {
|
||||
return null
|
||||
} else error("property is notnull but cannot find tag $tag")
|
||||
}
|
||||
@ -442,15 +447,15 @@ class Jce private constructor(private val charset: JceCharset, context: SerialMo
|
||||
is MapLikeDescriptor -> {
|
||||
val tag = popTag()
|
||||
@Suppress("SENSELESS_COMPARISON")
|
||||
if (input.skipToTagOrNull(tag) {
|
||||
check(it.type == MAP) { "type mismatch: ${it.type}" }
|
||||
if (input.skipToTagOrNull(tag) { head ->
|
||||
check(head.type == MAP) { "type mismatch: ${head.type}" }
|
||||
// 将 mapOf(k1 to v1, k2 to v2, ...) 转换为 listOf(k1, v1, k2, v2, ...) 以便于写入.
|
||||
val serializer = (deserializer as MapLikeSerializer<Any?, Any?, T, *>)
|
||||
val mapEntrySerial = MapEntrySerializer(serializer.keySerializer, serializer.valueSerializer)
|
||||
val setOfEntries = HashSetSerializer(mapEntrySerial).deserialize(JceMapReader(input.readInt(0), input))
|
||||
return setOfEntries.associateBy({ it.key }, { it.value }) as T
|
||||
} == null) {
|
||||
if (isTagOptional(tag)) {
|
||||
if (isTagMissing(tag)) {
|
||||
return null
|
||||
} else error("property is notnull but cannot find tag $tag")
|
||||
}
|
||||
@ -471,7 +476,7 @@ class Jce private constructor(private val charset: JceCharset, context: SerialMo
|
||||
}
|
||||
input.readHeadOrNull()
|
||||
}
|
||||
} == null && isTagOptional(tag)) {
|
||||
} == null && isTagMissing(tag)) {
|
||||
return null
|
||||
} else error("cannot find tag $tag")
|
||||
}
|
||||
@ -480,8 +485,13 @@ class Jce private constructor(private val charset: JceCharset, context: SerialMo
|
||||
}
|
||||
|
||||
val tag = currentTagOrNull ?: return deserializer.deserialize(JceDecoder(this.input))
|
||||
return if (this.decodeTaggedNotNullMark(tag)) {
|
||||
deserializer.deserialize(this)
|
||||
return if (!this.isTagMissing(tag)) {
|
||||
try {
|
||||
deserializer.deserialize(this)
|
||||
} catch (e: Exception) {
|
||||
println("exception when tag=$tag")
|
||||
throw e
|
||||
}
|
||||
} else {
|
||||
// popTag()
|
||||
null
|
||||
@ -502,7 +512,7 @@ class Jce private constructor(private val charset: JceCharset, context: SerialMo
|
||||
internal val input: ByteReadPacket,
|
||||
maxReadSize: Long = input.remaining
|
||||
) : Closeable {
|
||||
internal val leastRemaining = input.remaining - maxReadSize
|
||||
private val leastRemaining = input.remaining - maxReadSize
|
||||
internal val isEndOfInput: Boolean get() = input.remaining <= leastRemaining
|
||||
|
||||
internal var currentJceHead: JceHead? = input.doReadHead()
|
||||
@ -510,7 +520,6 @@ class Jce private constructor(private val charset: JceCharset, context: SerialMo
|
||||
override fun close() = input.close()
|
||||
|
||||
internal fun peakHeadOrNull(): JceHead? = currentJceHead ?: readHeadOrNull()
|
||||
internal fun peakHead(): JceHead = peakHeadOrNull() ?: error("no enough data to read head")
|
||||
|
||||
@PublishedApi
|
||||
internal fun readHead(): JceHead = readHeadOrNull() ?: error("no enough data to read head")
|
||||
@ -554,43 +563,6 @@ class Jce private constructor(private val charset: JceCharset, context: SerialMo
|
||||
fun readString(tag: Int): String = readStringOrNull(tag) ?: error("cannot find tag $tag, currentJceHead=$currentJceHead")
|
||||
|
||||
fun readByteArray(tag: Int): ByteArray = readByteArrayOrNull(tag) ?: error("cannot find tag $tag, currentJceHead=$currentJceHead")
|
||||
fun readShortArray(tag: Int): ShortArray = readShortArrayOrNull(tag) ?: error("cannot find tag $tag, currentJceHead=$currentJceHead")
|
||||
fun readLongArray(tag: Int): LongArray = readLongArrayOrNull(tag) ?: error("cannot find tag $tag, currentJceHead=$currentJceHead")
|
||||
fun readFloatArray(tag: Int): FloatArray = readFloatArrayOrNull(tag) ?: error("cannot find tag $tag, currentJceHead=$currentJceHead")
|
||||
fun readDoubleArray(tag: Int): DoubleArray = readDoubleArrayOrNull(tag) ?: error("cannot find tag $tag, currentJceHead=$currentJceHead")
|
||||
fun readIntArray(tag: Int): IntArray = readIntArrayOrNull(tag) ?: error("cannot find tag $tag, currentJceHead=$currentJceHead")
|
||||
fun readBooleanArray(tag: Int): BooleanArray = readBooleanArrayOrNull(tag) ?: error("cannot find tag $tag, currentJceHead=$currentJceHead")
|
||||
|
||||
|
||||
fun readShortArrayOrNull(tag: Int): ShortArray? = skipToTagOrNull(tag) {
|
||||
require(it.type.toInt() == 9) { "type mismatch, expected=9(List), got=${it.type}" }
|
||||
ShortArray(readInt(0)) { readShort(0) }
|
||||
}
|
||||
|
||||
fun readDoubleArrayOrNull(tag: Int): DoubleArray? = skipToTagOrNull(tag) {
|
||||
require(it.type.toInt() == 9) { "type mismatch, expected=9(List), got=${it.type}" }
|
||||
DoubleArray(readInt(0)) { readDouble(0) }
|
||||
}
|
||||
|
||||
fun readFloatArrayOrNull(tag: Int): FloatArray? = skipToTagOrNull(tag) {
|
||||
require(it.type.toInt() == 9) { "type mismatch, expected=9(List), got=${it.type}" }
|
||||
FloatArray(readInt(0)) { readFloat(0) }
|
||||
}
|
||||
|
||||
fun readIntArrayOrNull(tag: Int): IntArray? = skipToTagOrNull(tag) {
|
||||
require(it.type.toInt() == 9) { "type mismatch, expected=9(List), got=${it.type}" }
|
||||
IntArray(readInt(0)) { readInt(0) }
|
||||
}
|
||||
|
||||
fun readLongArrayOrNull(tag: Int): LongArray? = skipToTagOrNull(tag) {
|
||||
require(it.type.toInt() == 9) { "type mismatch, expected=9(List), got=${it.type}" }
|
||||
LongArray(readInt(0)) { readLong(0) }
|
||||
}
|
||||
|
||||
fun readBooleanArrayOrNull(tag: Int): BooleanArray? = skipToTagOrNull(tag) {
|
||||
require(it.type.toInt() == 9) { "type mismatch, expected=9(List), got=${it.type}" }
|
||||
BooleanArray(readInt(0)) { readBoolean(0) }
|
||||
}
|
||||
|
||||
fun readByteArrayOrNull(tag: Int): ByteArray? = skipToTagOrNull(tag) {
|
||||
when (it.type) {
|
||||
@ -605,20 +577,7 @@ class Jce private constructor(private val charset: JceCharset, context: SerialMo
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("IMPLICIT_CAST_TO_ANY", "UNCHECKED_CAST")
|
||||
fun <T> readObject(default: T, tag: Int): T = when (default) {
|
||||
is Byte -> readByte(tag)
|
||||
is Boolean -> readBoolean(tag)
|
||||
is Short -> readShort(tag)
|
||||
is Int -> readInt(tag)
|
||||
is Long -> readLong(tag)
|
||||
is Float -> readFloat(tag)
|
||||
is Double -> readDouble(tag)
|
||||
is String -> readString(tag)
|
||||
else -> error("unsupported type: ${default.getClassName()}")
|
||||
} as T
|
||||
|
||||
fun readStringOrNull(tag: Int): String? = skipToTagOrNull(tag) { head ->
|
||||
private fun readStringOrNull(tag: Int): String? = skipToTagOrNull(tag) { head ->
|
||||
return when (head.type) {
|
||||
STRING1 -> input.readString(input.readUByte().toInt(), charset = charset.kotlinCharset)
|
||||
STRING4 -> input.readString(
|
||||
@ -629,7 +588,7 @@ class Jce private constructor(private val charset: JceCharset, context: SerialMo
|
||||
}
|
||||
}
|
||||
|
||||
fun readLongOrNull(tag: Int): Long? = skipToTagOrNull(tag) {
|
||||
private fun readLongOrNull(tag: Int): Long? = skipToTagOrNull(tag) {
|
||||
return when (it.type) {
|
||||
ZERO_TYPE -> 0
|
||||
BYTE -> input.readByte().toLong()
|
||||
@ -640,7 +599,7 @@ class Jce private constructor(private val charset: JceCharset, context: SerialMo
|
||||
}
|
||||
}
|
||||
|
||||
fun readShortOrNull(tag: Int): Short? = skipToTagOrNull(tag) {
|
||||
private fun readShortOrNull(tag: Int): Short? = skipToTagOrNull(tag) {
|
||||
return when (it.type.toInt()) {
|
||||
12 -> 0
|
||||
0 -> input.readByte().toShort()
|
||||
@ -649,7 +608,7 @@ class Jce private constructor(private val charset: JceCharset, context: SerialMo
|
||||
}
|
||||
}
|
||||
|
||||
fun readIntOrNull(tag: Int): Int? = skipToTagOrNull(tag) {
|
||||
private fun readIntOrNull(tag: Int): Int? = skipToTagOrNull(tag) {
|
||||
return when (it.type.toInt()) {
|
||||
12 -> 0
|
||||
0 -> input.readByte().toInt()
|
||||
@ -659,7 +618,7 @@ class Jce private constructor(private val charset: JceCharset, context: SerialMo
|
||||
}
|
||||
}
|
||||
|
||||
fun readByteOrNull(tag: Int): Byte? = skipToTagOrNull(tag) {
|
||||
private fun readByteOrNull(tag: Int): Byte? = skipToTagOrNull(tag) {
|
||||
return when (it.type.toInt()) {
|
||||
12 -> 0
|
||||
0 -> input.readByte()
|
||||
@ -667,7 +626,7 @@ class Jce private constructor(private val charset: JceCharset, context: SerialMo
|
||||
}
|
||||
}
|
||||
|
||||
fun readFloatOrNull(tag: Int): Float? = skipToTagOrNull(tag) {
|
||||
private fun readFloatOrNull(tag: Int): Float? = skipToTagOrNull(tag) {
|
||||
return when (it.type.toInt()) {
|
||||
12 -> 0f
|
||||
4 -> input.readFloat()
|
||||
@ -675,7 +634,7 @@ class Jce private constructor(private val charset: JceCharset, context: SerialMo
|
||||
}
|
||||
}
|
||||
|
||||
fun readDoubleOrNull(tag: Int): Double? = skipToTagOrNull(tag) {
|
||||
private fun readDoubleOrNull(tag: Int): Double? = skipToTagOrNull(tag) {
|
||||
return when (it.type.toInt()) {
|
||||
12 -> 0.0
|
||||
4 -> input.readFloat().toDouble()
|
||||
@ -684,7 +643,7 @@ class Jce private constructor(private val charset: JceCharset, context: SerialMo
|
||||
}
|
||||
}
|
||||
|
||||
fun readBooleanOrNull(tag: Int): Boolean? = this.readByteOrNull(tag)?.let { it.toInt() != 0 }
|
||||
private fun readBooleanOrNull(tag: Int): Boolean? = this.readByteOrNull(tag)?.let { it.toInt() != 0 }
|
||||
|
||||
|
||||
private fun skipField() {
|
||||
@ -734,6 +693,7 @@ class Jce private constructor(private val charset: JceCharset, context: SerialMo
|
||||
|
||||
}
|
||||
|
||||
@Suppress("MemberVisibilityCanBePrivate")
|
||||
companion object {
|
||||
val UTF8 = Jce(JceCharset.UTF8)
|
||||
val GBK = Jce(JceCharset.GBK)
|
||||
@ -816,9 +776,9 @@ internal inline fun <R> Jce.JceInput.skipToTagOrNull(tag: Int, block: (JceHead)
|
||||
currentJceHead = null
|
||||
// println("skipping to $tag: run block")
|
||||
return block(head)
|
||||
} else {
|
||||
// println("skipping to $tag: tag not matching")
|
||||
}
|
||||
|
||||
// println("skipping to $tag: tag not matching")
|
||||
// println("skipping to $tag: skipField")
|
||||
this.skipField(head.type)
|
||||
currentJceHead = readHeadOrNull()
|
||||
|
@ -185,13 +185,13 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler
|
||||
coroutineContext = bot.coroutineContext,
|
||||
id = troopNum.groupCode,
|
||||
uin = troopNum.groupUin,
|
||||
initName = troopNum.groupName,
|
||||
initAnnouncement = troopNum.groupMemo,
|
||||
initAllowMemberInvite = groupInfoResponse.allowMemberInvite,
|
||||
initConfessTalk = groupInfoResponse.confessTalk,
|
||||
initMuteAll = troopNum.dwShutUpTimestamp != 0L,
|
||||
initAutoApprove = groupInfoResponse.autoApprove,
|
||||
initAnonymousChat = groupInfoResponse.allowAnonymousChat,
|
||||
_name = troopNum.groupName,
|
||||
_announcement = troopNum.groupMemo,
|
||||
_allowMemberInvite = groupInfoResponse.allowMemberInvite,
|
||||
_confessTalk = groupInfoResponse.confessTalk,
|
||||
_muteAll = troopNum.dwShutUpTimestamp != 0L,
|
||||
_autoApprove = groupInfoResponse.autoApprove,
|
||||
_anonymousChat = groupInfoResponse.allowAnonymousChat,
|
||||
members = contactList
|
||||
)
|
||||
toGet[group] = contactList
|
||||
@ -260,8 +260,8 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler
|
||||
data.members.forEach {
|
||||
val member = MemberImpl(
|
||||
qq = bot.QQ(it.memberUin) as QQImpl,
|
||||
initGroupCard = it.autoRemark ?: it.nick,
|
||||
initSpecialTitle = it.sSpecialTitle ?: "",
|
||||
_groupCard = it.autoRemark ?: it.nick,
|
||||
_specialTitle = it.sSpecialTitle ?: "",
|
||||
group = group,
|
||||
coroutineContext = group.coroutineContext,
|
||||
permission = when {
|
||||
|
@ -26,7 +26,7 @@ internal data class RequestPushNotify(
|
||||
) : JceStruct, Packet
|
||||
|
||||
@Serializable
|
||||
internal data class MsgInfo(
|
||||
internal class MsgInfo(
|
||||
@SerialId(0) val lFromUin: Long? = 0L,
|
||||
@SerialId(1) val uMsgTime: Long? = 0L,
|
||||
@SerialId(2) val shMsgType: Short,
|
||||
|
@ -33,7 +33,7 @@ class GentleImage(val contact: Contact, val keyword: String) {
|
||||
)
|
||||
|
||||
val result =
|
||||
Json.plain.parse(
|
||||
Json.nonstrict.parse(
|
||||
Result.serializer(),
|
||||
Jsoup.connect("https://api.lolicon.app/setu/?r18=$r18" + if (keyword.isNotBlank()) "&keyword=$keyword&num=10" else "")
|
||||
.ignoreContentType(true)
|
||||
|
Loading…
Reference in New Issue
Block a user