diff --git a/annotations/.gitignore b/annotations/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/annotations/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/annotations/build.gradle.kts b/annotations/build.gradle.kts new file mode 100644 index 0000000..b0ca592 --- /dev/null +++ b/annotations/build.gradle.kts @@ -0,0 +1,9 @@ +plugins { + id("java-library") + id("org.jetbrains.kotlin.jvm") +} + +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} \ No newline at end of file diff --git a/annotations/src/main/java/moe/fuqiuluo/symbols/OneBotHandler.kt b/annotations/src/main/java/moe/fuqiuluo/symbols/OneBotHandler.kt new file mode 100644 index 0000000..d8326df --- /dev/null +++ b/annotations/src/main/java/moe/fuqiuluo/symbols/OneBotHandler.kt @@ -0,0 +1,8 @@ +package moe.fuqiuluo.symbols + +@Retention(AnnotationRetention.SOURCE) +@Target(AnnotationTarget.CLASS) +annotation class OneBotHandler( + val actionName: String, + val alias: Array = [] +) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8df9d7f..0705e68 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -4,7 +4,7 @@ import java.io.ByteArrayOutputStream plugins { id("com.android.application") id("org.jetbrains.kotlin.android") - kotlin("plugin.serialization") version "1.8.10" + kotlin("plugin.serialization") version "1.9.21" } android { @@ -17,7 +17,7 @@ android { minSdk = 27 targetSdk = 34 versionCode = getVersionCode() - versionName = "1.0.7" + ".r${getGitCommitCount()}." + getVersionName() + versionName = "1.0.8" + ".r${getGitCommitCount()}." + getVersionName() testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { @@ -92,7 +92,7 @@ android { compose = true } composeOptions { - kotlinCompilerExtensionVersion = "1.4.3" + kotlinCompilerExtensionVersion = "1.5.4" } packaging { jniLibs { @@ -187,10 +187,13 @@ fun getVersionName(): String { } dependencies { - implementation("androidx.core:core-ktx:1.9.0") - implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1") - implementation("androidx.activity:activity-compose:1.7.2") - implementation(platform("androidx.compose:compose-bom:2023.06.01")) + val composeBom = platform("androidx.compose:compose-bom:2023.10.01") + implementation(composeBom) + + DEPENDENCY_ANDROIDX.forEach { + implementation(it) + } + implementation("androidx.compose.ui:ui") implementation("androidx.compose.ui:ui-graphics") implementation("androidx.compose.ui:ui-tooling-preview") @@ -199,31 +202,26 @@ dependencies { implementation("com.google.accompanist:accompanist-pager:0.31.5+") //noinspection GradleDynamicVersion implementation("com.google.accompanist:accompanist-systemuicontroller:0.31.5+") - //noinspection GradleDynamicVersion useless - // implementation("androidx.constraintlayout:constraintlayout-compose:1.1.0+") implementation("io.coil-kt:coil:2.4.0") implementation("io.coil-kt:coil-compose:2.4.0") - implementation("org.jetbrains.kotlinx:kotlinx-io-jvm:0.1.16") - - val ktorVersion = "2.3.3" - implementation("io.ktor:ktor-server-core:$ktorVersion") - implementation("io.ktor:ktor-server-host-common:$ktorVersion") - implementation("io.ktor:ktor-server-status-pages:$ktorVersion") - implementation("io.ktor:ktor-server-netty:$ktorVersion") - implementation("io.ktor:ktor-server-content-negotiation:$ktorVersion") - implementation("io.ktor:ktor-client-core:$ktorVersion") - implementation("io.ktor:ktor-client-cio:$ktorVersion") - implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion") - implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion") - //implementation("io.ktor:ktor-serialization-kotlinx-protobuf:$ktorVersion") + implementation(kotlinx("io-jvm", "0.1.16")) + implementation(ktor("server", "core")) + implementation(ktor("server", "host-common")) + implementation(ktor("server", "status-pages")) + implementation(ktor("server", "netty")) + implementation(ktor("server", "content-negotiation")) + implementation(ktor("client", "core")) + implementation(ktor("client", "content-negotiation")) + implementation(ktor("client", "cio")) + implementation(ktor("serialization", "kotlinx-json")) implementation(project(":xposed")) testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") - androidTestImplementation(platform("androidx.compose:compose-bom:2023.06.01")) + androidTestImplementation(platform("androidx.compose:compose-bom:2023.10.01")) androidTestImplementation("androidx.compose.ui:ui-test-junit4") debugImplementation("androidx.compose.ui:ui-tooling") debugImplementation("androidx.compose.ui:ui-test-manifest") diff --git a/app/src/main/java/moe/fuqiuluo/shamrock/MainActivity.kt b/app/src/main/java/moe/fuqiuluo/shamrock/MainActivity.kt index e5d619c..5b0b155 100644 --- a/app/src/main/java/moe/fuqiuluo/shamrock/MainActivity.kt +++ b/app/src/main/java/moe/fuqiuluo/shamrock/MainActivity.kt @@ -85,6 +85,7 @@ import moe.fuqiuluo.shamrock.ui.tools.getShamrockVersion class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + setContent { CompositionLocalProvider( LocalIndication provides NoIndication diff --git a/build.gradle.kts b/build.gradle.kts index 1255c52..7ffa57f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,6 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { id("com.android.application") version "8.2.0" apply false - id("org.jetbrains.kotlin.android") version "1.8.10" apply false + id("org.jetbrains.kotlin.android") version "1.9.20" apply false id("com.android.library") version "8.2.0" apply false - //id("io.realm.kotlin") version "1.11.0" apply false -} \ No newline at end of file +} diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 0000000..b2cd521 --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,10 @@ +plugins { + kotlin("jvm") version "1.9.21" +} + +repositories { + mavenCentral() +} + +dependencies { +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt new file mode 100644 index 0000000..13e0d4c --- /dev/null +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -0,0 +1,26 @@ +val DEPENDENCY_ANDROIDX = arrayOf( + "androidx.core:core-ktx:1.12.0", + "androidx.appcompat:appcompat:1.6.1", + "com.google.android.material:material:1.11.0", + "androidx.exifinterface:exifinterface:1.3.7", + "androidx.lifecycle:lifecycle-runtime-ktx:2.6.1", + "androidx.activity:activity-compose:1.7.2", +) + +const val DEPENDENCY_JSON5K = "io.github.xn32:json5k:0.3.0" +const val DEPENDENCY_PROTOBUF = "com.google.protobuf:protobuf-java:3.24.0" +const val DEPENDENCY_JAVA_WEBSOCKET = "org.java-websocket:Java-WebSocket:1.5.4" + +fun room(name: String) = "androidx.room:room-$name:${Versions.roomVersion}" + +fun kotlinx(name: String, version: String) = "org.jetbrains.kotlinx:kotlinx-$name:$version" + +fun ktor(target: String, name: String): String { + return "io.ktor:ktor-$target-$name:${Versions.ktorVersion}" +} + +object Versions { + const val roomVersion = "2.5.0" + + const val ktorVersion = "2.3.3" +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 6dd9f92..a4fa560 100644 --- a/gradle.properties +++ b/gradle.properties @@ -21,4 +21,6 @@ kotlin.code.style=official # resources declared in the library itself and none from the library's dependencies, # thereby reducing the size of the R class for that library android.nonTransitiveRClass=true -android.default.buildFeatures.aidl=true \ No newline at end of file +android.default.buildFeatures.aidl=true +kotlin.experimental.tryK2=true +ksp.incremental=false \ No newline at end of file diff --git a/processor/.gitignore b/processor/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/processor/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/processor/build.gradle.kts b/processor/build.gradle.kts new file mode 100644 index 0000000..6a901b7 --- /dev/null +++ b/processor/build.gradle.kts @@ -0,0 +1,18 @@ +plugins { + kotlin("jvm") + id("com.google.devtools.ksp") version "1.9.21-1.0.15" +} + +ksp { + arg("autoserviceKsp.verify", "true") + arg("autoserviceKsp.verbose", "true") +} + +dependencies { + implementation(project(":annotations")) + implementation("com.google.auto.service:auto-service-annotations:1.1.1") + implementation("com.google.devtools.ksp:symbol-processing-api:1.9.21-1.0.15") + implementation("com.squareup:kotlinpoet:1.14.2") + + ksp("dev.zacsweers.autoservice:auto-service-ksp:1.1.0") +} \ No newline at end of file diff --git a/processor/consumer-rules.pro b/processor/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/processor/proguard-rules.pro b/processor/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/processor/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/processor/src/main/AndroidManifest.xml b/processor/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a5918e6 --- /dev/null +++ b/processor/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/processor/src/main/java/moe/fuqiuluo/ksp/impl/OneBotHandlerProcessor.kt b/processor/src/main/java/moe/fuqiuluo/ksp/impl/OneBotHandlerProcessor.kt new file mode 100644 index 0000000..3452e46 --- /dev/null +++ b/processor/src/main/java/moe/fuqiuluo/ksp/impl/OneBotHandlerProcessor.kt @@ -0,0 +1,84 @@ +@file:OptIn(KspExperimental::class) +@file:Suppress("LocalVariableName", "UNCHECKED_CAST") + +package moe.fuqiuluo.ksp.impl + +import com.google.devtools.ksp.KspExperimental +import com.google.devtools.ksp.getAnnotationsByType +import com.google.devtools.ksp.getClassDeclarationByName +import com.google.devtools.ksp.processing.CodeGenerator +import com.google.devtools.ksp.processing.Dependencies +import com.google.devtools.ksp.processing.KSPLogger +import com.google.devtools.ksp.processing.Resolver +import com.google.devtools.ksp.processing.SymbolProcessor +import com.google.devtools.ksp.symbol.ClassKind +import com.google.devtools.ksp.symbol.KSAnnotated +import com.google.devtools.ksp.symbol.KSClassDeclaration +import com.google.devtools.ksp.symbol.KSVisitorVoid +import com.google.devtools.ksp.validate +import com.squareup.kotlinpoet.FileSpec +import com.squareup.kotlinpoet.FunSpec +import moe.fuqiuluo.symbols.OneBotHandler + +class OneBotHandlerProcessor( + private val codeGenerator: CodeGenerator, + private val logger: KSPLogger +): SymbolProcessor { + override fun process(resolver: Resolver): List { + val ActionManagerNode = resolver.getClassDeclarationByName("moe.fuqiuluo.shamrock.remote.action.ActionManager") + if (ActionManagerNode == null) { + logger.error("OneBotHandlerProcessor: ActionManager not found") + return emptyList() + } + val symbols = resolver.getSymbolsWithAnnotation(OneBotHandler::class.qualifiedName!!) + val unableToProcess = symbols.filterNot { it.validate() } + val oneBotHandlers = (symbols.filter { + it is KSClassDeclaration && it.validate() && it.classKind == ClassKind.OBJECT + } as Sequence).toList() + + if (oneBotHandlers.isNotEmpty()) { + ActionManagerNode.accept(ActionManagerVisitor(oneBotHandlers), Unit) + } + + return unableToProcess.toList() + } + + inner class ActionManagerVisitor( + private val actionHandlers: List + ): KSVisitorVoid() { + override fun visitClassDeclaration(classDeclaration: KSClassDeclaration, data: Unit) { + val packageName = classDeclaration.packageName.asString() + + // generate kotlin `init { }` + val fileSpec = FileSpec.builder(packageName, classDeclaration.qualifiedName?.asString() ?: run { + throw IllegalStateException("ActionManagerVisitor: classDeclaration.qualifiedName is null") + }).addFunction(FunSpec.builder("initManager").apply { + actionHandlers.forEach { handler -> + // fetch the params of the annotation + val annotation = handler.getAnnotationsByType(OneBotHandler::class).first() + val actionName = annotation.actionName + val alias = annotation.alias + alias.forEach { name -> + addStatement("actionMap[\"$name\"] = ${handler.simpleName.asString()}") + } + addStatement("actionMap[\"$actionName\"] = ${handler.simpleName.asString()}") + } + }.build()).apply { + addImport("moe.fuqiuluo.shamrock.remote.action.ActionManager", "actionMap") + actionHandlers.forEach { + addImport("moe.fuqiuluo.shamrock.remote.action.handlers", it.simpleName.asString()) + } + }.build() + + codeGenerator.createNewFile( + dependencies = Dependencies(aggregating = false), + packageName = packageName, + fileName = "Auto" + classDeclaration.simpleName.asString() + ).use { outputStream -> + outputStream.writer().use { + fileSpec.writeTo(it) + } + } + } + } +} \ No newline at end of file diff --git a/processor/src/main/java/moe/fuqiuluo/ksp/providers/OneBotHandlerProcessorProvider.kt b/processor/src/main/java/moe/fuqiuluo/ksp/providers/OneBotHandlerProcessorProvider.kt new file mode 100644 index 0000000..102d546 --- /dev/null +++ b/processor/src/main/java/moe/fuqiuluo/ksp/providers/OneBotHandlerProcessorProvider.kt @@ -0,0 +1,17 @@ +package moe.fuqiuluo.ksp.providers + +import com.google.auto.service.AutoService +import com.google.devtools.ksp.processing.SymbolProcessor +import com.google.devtools.ksp.processing.SymbolProcessorEnvironment +import com.google.devtools.ksp.processing.SymbolProcessorProvider +import moe.fuqiuluo.ksp.impl.OneBotHandlerProcessor + +@AutoService(SymbolProcessorProvider::class) +class OneBotHandlerProcessorProvider: SymbolProcessorProvider { + override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor { + return OneBotHandlerProcessor( + environment.codeGenerator, + environment.logger + ) + } +} \ No newline at end of file diff --git a/protobuf/.gitignore b/protobuf/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/protobuf/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/protobuf/build.gradle.kts b/protobuf/build.gradle.kts new file mode 100644 index 0000000..01c7349 --- /dev/null +++ b/protobuf/build.gradle.kts @@ -0,0 +1,41 @@ +plugins { + id("com.android.library") + id("org.jetbrains.kotlin.android") + kotlin("plugin.serialization") version "1.9.21" +} + +android { + namespace = "moe.whitechi73.protobuf" + compileSdk = 34 + + defaultConfig { + minSdk = 24 + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } +} + +dependencies { + implementation(DEPENDENCY_PROTOBUF) + implementation(kotlinx("serialization-protobuf", "1.6.2")) + implementation(kotlinx("serialization-json", "1.6.2")) + +} \ No newline at end of file diff --git a/protobuf/consumer-rules.pro b/protobuf/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/protobuf/proguard-rules.pro b/protobuf/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/protobuf/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/protobuf/src/main/AndroidManifest.xml b/protobuf/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a5918e6 --- /dev/null +++ b/protobuf/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunAddRichMediaReq.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunAddRichMediaReq.kt new file mode 100644 index 0000000..aadd885 --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunAddRichMediaReq.kt @@ -0,0 +1,128 @@ +@file:OptIn(ExperimentalSerializationApi::class) +@file:Suppress("ArrayInDataClass") + +package moe.whitechi73.protobuf.fav + +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class WeiyunAddRichMediaReq( + @ProtoNumber(1) val commInfo: WeiyunCollectCommInfo? = null, + @ProtoNumber(2) val summary: WeiyunRichMediaSummary? = null, + @ProtoNumber(3) val richMediaContent: List? = null, + @ProtoNumber(4) val needShareUrl: Boolean = false, +) + +@Serializable +data class WeiyunRichMediaSummary( + @ProtoNumber(1) val title: String? = null, + @ProtoNumber(2) val subTitle: String = "", + @ProtoNumber(3) val brief: String = "", + @ProtoNumber(4) val picList: List? = null, + @ProtoNumber(5) val contentType: UInt = UInt.MIN_VALUE, + @ProtoNumber(6) val originalUri: String = "", + @ProtoNumber(7) val publisher: String = "", + @ProtoNumber(8) val richMediaVersion: UInt = UInt.MIN_VALUE, +) + +@Serializable +data class WeiyunRichMediaContent( + @ProtoNumber(1) val richMedia: WeiyunRichMedia? = null, + @ProtoNumber(2) val rawData: ByteArray? = null, + @ProtoNumber(3) val bizDataList: List? = null, + @ProtoNumber(4) val picList: List? = null, + @ProtoNumber(5) val fileList: List? = null, +) + +@Serializable +data class WeiyunFileInfo( + @ProtoNumber(1) val src: UInt = UInt.MIN_VALUE, + @ProtoNumber(2) val uid: ULong = ULong.MIN_VALUE, + @ProtoNumber(3) val bid: UInt = UInt.MIN_VALUE, + @ProtoNumber(4) val fid: String = "", + @ProtoNumber(5) val name: String = "", + @ProtoNumber(6) val size: ULong = ULong.MIN_VALUE, + @ProtoNumber(7) val md5: ByteArray? = null, + @ProtoNumber(8) val sha1: ByteArray? = null, + @ProtoNumber(9) val category: UInt = UInt.MIN_VALUE, +) + +@Serializable +data class WeiyunRichMedia( + @ProtoNumber(1) val sections: List? = null +) + +@Serializable +data class WeiyunSection( + @ProtoNumber(1) val items: List? = null +) + +@Serializable +data class WeiyunItem( + @ProtoNumber(1) val itemType: UInt = UInt.MIN_VALUE, + @ProtoNumber(2) val paragraph: WeiyunParagraph? = null, + @ProtoNumber(3) val anchor: WeiyunAnchor? = null, + @ProtoNumber(4) val picInfo: WeiyunPicInfo? = null, +) + +@Serializable +data class WeiyunPicInfo( + @ProtoNumber(1) val uri: String = "", + @ProtoNumber(2) val md5: ByteArray? = null, + @ProtoNumber(3) val sha1: ByteArray? = null, + @ProtoNumber(4) val name: String = "", + @ProtoNumber(5) val note: String = "", + @ProtoNumber(6) val width: UInt = UInt.MIN_VALUE, + @ProtoNumber(7) val height: UInt = UInt.MIN_VALUE, + @ProtoNumber(8) val size: ULong = ULong.MIN_VALUE, + @ProtoNumber(9) val type: UInt = UInt.MIN_VALUE, + @ProtoNumber(10) val owner: WeiyunAuthor? = null, + @ProtoNumber(11) val picId: String = "", +) + +@Serializable +data class WeiyunAnchor( + @ProtoNumber(1) val url: String = "", + @ProtoNumber(2) val desc: String = "", +) + +@Serializable +data class WeiyunParagraph( + @ProtoNumber(1) val content: String = "", + @ProtoNumber(2) val style: WeiyunStyle? = null, +) + +@Serializable +data class WeiyunStyle( + @ProtoNumber(1) val color: String = "#FFFFFF", + @ProtoNumber(2) val fontFamily: String = "", + @ProtoNumber(3) val fontWeight: String = "normal", + @ProtoNumber(4) val fontSize: String = "", +) + +@Serializable +data class WeiyunCollectCommInfo( + @ProtoNumber(1) val bid: UInt = UInt.MIN_VALUE, + @ProtoNumber(2) val category: UInt = UInt.MIN_VALUE, + @ProtoNumber(3) val author: WeiyunAuthor? = null, + @ProtoNumber(4) val createTime: ULong = ULong.MIN_VALUE, + @ProtoNumber(5) val seq: ULong = ULong.MIN_VALUE, + @ProtoNumber(6) val bizKey: String = "", + @ProtoNumber(7) val bizDataList: List? = null, + @ProtoNumber(8) val shareUrl: String = "", + @ProtoNumber(9) val originalAppId: UInt = UInt.MIN_VALUE, + @ProtoNumber(10) val customGroupId: UInt = UInt.MIN_VALUE, + @ProtoNumber(11) val modifyTime: ULong = ULong.MIN_VALUE, + @ProtoNumber(12) val qzoneUgcKey: String = "", +) + +@Serializable +data class WeiyunAuthor( + @ProtoNumber(1) val type: UInt = UInt.MIN_VALUE, + @ProtoNumber(2) val numId: ULong = ULong.MIN_VALUE, + @ProtoNumber(3) val strId: String = "", + @ProtoNumber(4) val groupId: ULong = ULong.MIN_VALUE, + @ProtoNumber(5) val groupName: String = "", +) \ No newline at end of file diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunAddRichMediaResp.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunAddRichMediaResp.kt new file mode 100644 index 0000000..839eb25 --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunAddRichMediaResp.kt @@ -0,0 +1,13 @@ +@file:OptIn(ExperimentalSerializationApi::class) +package moe.whitechi73.protobuf.fav + +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class WeiyunAddRichMediaResp( + @ProtoNumber(1) val cid: String = "", + @ProtoNumber(2) val collectTime: ULong = ULong.MIN_VALUE, + @ProtoNumber(3) val shareUrl: String = "", +) diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunComm.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunComm.kt new file mode 100644 index 0000000..3439445 --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunComm.kt @@ -0,0 +1,10 @@ +package moe.whitechi73.protobuf.fav + +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class WeiyunComm( + @ProtoNumber(1) val req: WeiyunCommonReq? = null, + @ProtoNumber(2) val resp: WeiyunCommonResp? = null +) diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunCommonReq.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunCommonReq.kt new file mode 100644 index 0000000..98f2f40 --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunCommonReq.kt @@ -0,0 +1,15 @@ +@file:OptIn(ExperimentalSerializationApi::class) +package moe.whitechi73.protobuf.fav + +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class WeiyunCommonReq ( + @ProtoNumber(2000) val getFavListReq: WeiyunGetFavListReq? = null, + @ProtoNumber(2001) val getFavContentReq: WeiyunGetFavContentReq? = null, + @ProtoNumber(2009) val addRichMediaReq: WeiyunAddRichMediaReq? = null, + @ProtoNumber(2010) val fastUploadResourceReq: WeiyunFastUploadResourceReq? = null, + +) \ No newline at end of file diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunCommonResp.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunCommonResp.kt new file mode 100644 index 0000000..92405e6 --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunCommonResp.kt @@ -0,0 +1,14 @@ +@file:OptIn(ExperimentalSerializationApi::class) +package moe.whitechi73.protobuf.fav + +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class WeiyunCommonResp( + @ProtoNumber(20000) val getFavListResp: WeiyunGetFavListResp? = null, + @ProtoNumber(20001) val getFavContentResp: WeiyunGetFavContentResp? = null, + @ProtoNumber(20009) val addRichMediaResp: WeiyunAddRichMediaResp? = null, + @ProtoNumber(20010) val fastUploadResourceResp: WeiyunFastUploadResourceResp? = null, +) diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunFastUploadResourceReq.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunFastUploadResourceReq.kt new file mode 100644 index 0000000..62b03bd --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunFastUploadResourceReq.kt @@ -0,0 +1,14 @@ +@file:OptIn(ExperimentalSerializationApi::class) +package moe.whitechi73.protobuf.fav + +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class WeiyunFastUploadResourceReq( + @ProtoNumber(1) val picInfoList: List? = null, + @ProtoNumber(2) val fileInfoList: List? = null, + @ProtoNumber(3) val hostFlag: UInt = UInt.MIN_VALUE, + @ProtoNumber(4) val httpsFlag: UInt = UInt.MIN_VALUE, +) diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunFastUploadResourceResp.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunFastUploadResourceResp.kt new file mode 100644 index 0000000..1fb9cb1 --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunFastUploadResourceResp.kt @@ -0,0 +1,39 @@ +@file:OptIn(ExperimentalSerializationApi::class) + +package moe.whitechi73.protobuf.fav + +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class WeiyunFastUploadResourceResp( + @ProtoNumber(1) val picResultList: List? = null, + @ProtoNumber(2) val fileResultList: List? = null, +) + +@Serializable +data class WeiyunFastUploadPicResult( + @ProtoNumber(1) val result: UInt = UInt.MIN_VALUE, + @ProtoNumber(2) val picInfo: WeiyunPicInfo? = null, +) + +@Serializable +data class WeiyunFastUploadFileResult( + @ProtoNumber(1) val result: UInt = UInt.MIN_VALUE, + @ProtoNumber(2) val picInfo: WeiyunPicInfo? = null, + @ProtoNumber(3) val uploadFileInfo: WeiyunUploadFileInfo? = null, + @ProtoNumber(4) val notRetransmission: UInt = UInt.MIN_VALUE, + @ProtoNumber(5) val failedTips: String = "", +) + +@Serializable +data class WeiyunUploadFileInfo( + @ProtoNumber(1) val fileId: String = "", + @ProtoNumber(2) val sha1: ByteArray? = null, + @ProtoNumber(3) val checkKey: ByteArray? = null, + @ProtoNumber(4) val host: String = "", + @ProtoNumber(5) val port: UInt = UInt.MIN_VALUE, + @ProtoNumber(6) val httpsHost: String = "", + @ProtoNumber(7) val httpsPort: UInt = UInt.MIN_VALUE, +) \ No newline at end of file diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunGetFavContentReq.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunGetFavContentReq.kt new file mode 100644 index 0000000..a78c705 --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunGetFavContentReq.kt @@ -0,0 +1,11 @@ +@file:OptIn(ExperimentalSerializationApi::class) +package moe.whitechi73.protobuf.fav + +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class WeiyunGetFavContentReq( + @ProtoNumber(1) var cidList: List = emptyList(), +) diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunGetFavContentResp.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunGetFavContentResp.kt new file mode 100644 index 0000000..67ebcec --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunGetFavContentResp.kt @@ -0,0 +1,50 @@ +@file:OptIn(ExperimentalSerializationApi::class) +package moe.whitechi73.protobuf.fav + +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class WeiyunGetFavContentResp( + @ProtoNumber(1) val content: List? = null +) + +@Serializable +data class WeiyunContent( + @ProtoNumber(1) val text: WeiyunTextContent? = null, + @ProtoNumber(2) val link: WeiyunLinkContent? = null, + @ProtoNumber(3) val galley: WeiyunGalleyContent? = null, + @ProtoNumber(4) val audio: WeiyunAudioContent? = null, + @ProtoNumber(5) val video: WeiyunVideoContent? = null, + @ProtoNumber(6) val file: WeiyunFileContent? = null, + @ProtoNumber(7) val location: WeiyunLocationContent? = null, + @ProtoNumber(8) val richMedia: WeiyunRichMediaContent? = null, +) + +@Serializable +data class WeiyunTextContent( + @ProtoNumber(1) val data: String, + @ProtoNumber(2) val hasEmoji: Boolean = false +) + +@Serializable +class WeiyunLinkContent + +@Serializable +class WeiyunGalleyContent + +@Serializable +data class WeiyunAudioContent( + @ProtoNumber(1) val data: ByteArray, +) + +@Serializable +class WeiyunVideoContent + +@Serializable +class WeiyunFileContent + +@Serializable +class WeiyunLocationContent + diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunGetFavListReq.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunGetFavListReq.kt new file mode 100644 index 0000000..3661bb5 --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunGetFavListReq.kt @@ -0,0 +1,19 @@ +@file:OptIn(ExperimentalSerializationApi::class) +package moe.whitechi73.protobuf.fav + +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class WeiyunGetFavListReq( + @ProtoNumber(1) val type: UInt = UInt.MIN_VALUE, + @ProtoNumber(2) val bid: UInt = UInt.MIN_VALUE, + @ProtoNumber(3) val category: UInt = UInt.MIN_VALUE, + @ProtoNumber(4) val startTime: ULong = ULong.MIN_VALUE, + @ProtoNumber(5) val orderType: UInt = UInt.MIN_VALUE, + @ProtoNumber(6) val startPos: UInt = UInt.MIN_VALUE, + @ProtoNumber(7) val pageSize: UInt = UInt.MIN_VALUE, + @ProtoNumber(8) val syncPolicy: UInt = UInt.MIN_VALUE, + @ProtoNumber(9) val reqSource: UInt = UInt.MIN_VALUE, +) diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunGetFavListResp.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunGetFavListResp.kt new file mode 100644 index 0000000..a5f7ead --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunGetFavListResp.kt @@ -0,0 +1,41 @@ +@file:OptIn(ExperimentalSerializationApi::class) + +package moe.whitechi73.protobuf.fav + +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class WeiyunGetFavListResp( + @ProtoNumber(1) val collections: List? = null, + @ProtoNumber(2) val totalCnt: UInt = UInt.MIN_VALUE, + @ProtoNumber(3) val result: UInt = UInt.MIN_VALUE, +) + +@Serializable +data class WeiyunCollection( + @ProtoNumber(1) val cid: String = "", + @ProtoNumber(2) val type: Int = Int.MIN_VALUE, + @ProtoNumber(3) val status: Int = Int.MIN_VALUE, + @ProtoNumber(4) val author: WeiyunAuthor? = null, + @ProtoNumber(5) val bid: UInt = UInt.MIN_VALUE, + @ProtoNumber(6) val srcAppId: UInt = UInt.MIN_VALUE, + @ProtoNumber(7) val srcAppVer: String = "", + @ProtoNumber(8) val category: UInt = UInt.MIN_VALUE, + @ProtoNumber(9) val createTime: ULong = ULong.MIN_VALUE, + @ProtoNumber(10) val collectTime: ULong = ULong.MIN_VALUE, + @ProtoNumber(11) val modifyTime: ULong = ULong.MIN_VALUE, + @ProtoNumber(12) val seq: ULong = ULong.MIN_VALUE, + @ProtoNumber(13) val bizKey: String = "", + @ProtoNumber(14) val bizDataList: List? = null, + @ProtoNumber(15) val summary: String = "", + @ProtoNumber(16) val starMark: Boolean = false, + @ProtoNumber(17) val starTime: ULong = ULong.MIN_VALUE, + @ProtoNumber(18) val shareUrl: String = "", + @ProtoNumber(19) val originalAppId: UInt = UInt.MIN_VALUE, + @ProtoNumber(20) val customGroupId: UInt = UInt.MIN_VALUE, + @ProtoNumber(21) val securityBeat: UInt = UInt.MIN_VALUE, + @ProtoNumber(22) val qzoneUgcKey: String = "", +) + diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunMsgHead.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunMsgHead.kt new file mode 100644 index 0000000..90a071b --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/fav/WeiyunMsgHead.kt @@ -0,0 +1,30 @@ +@file:OptIn(ExperimentalSerializationApi::class) +@file:Suppress("ArrayInDataClass") + +package moe.whitechi73.protobuf.fav + +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class WeiyunMsgHead( + @ProtoNumber(1) val uin: ULong = ULong.MIN_VALUE, + @ProtoNumber(2) val seq: UInt = UInt.MIN_VALUE, + @ProtoNumber(3) val type: UInt = UInt.MIN_VALUE, + @ProtoNumber(4) val cmd: UInt = UInt.MIN_VALUE, + @ProtoNumber(5) val appId: UInt = UInt.MIN_VALUE, + @ProtoNumber(6) val version: UInt = UInt.MIN_VALUE, + @ProtoNumber(7) val netType: UInt = UInt.MIN_VALUE, + @ProtoNumber(8) val clientIp: String? = null, + @ProtoNumber(9) val encrypt: UInt = UInt.MIN_VALUE, + @ProtoNumber(10) val keyType: UInt = UInt.MIN_VALUE, + @ProtoNumber(11) val key: ByteArray? = null, + @ProtoNumber(14) val majorVersion: UInt = UInt.MIN_VALUE, + @ProtoNumber(15) val minorVersion: UInt = UInt.MIN_VALUE, + @ProtoNumber(101) val retCode: UInt = UInt.MIN_VALUE, + @ProtoNumber(102) val retMsg: String? = null, + @ProtoNumber(103) val promptMsg: String? = null, + @ProtoNumber(111) val totalSpace: ULong = ULong.MIN_VALUE, + @ProtoNumber(112) val usedSpace: ULong = ULong.MIN_VALUE, +) diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/group_file_common/FolderInfo.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/group_file_common/FolderInfo.kt new file mode 100644 index 0000000..f5c4cc7 --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/group_file_common/FolderInfo.kt @@ -0,0 +1,20 @@ +package moe.whitechi73.protobuf.group_file_common + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class FolderInfo( + @SerialName("folder_id") @ProtoNumber(1) val folderId: String = "", + @SerialName("parent_folder_id") @ProtoNumber(2) val parentFolderId: String = "", + @SerialName("folder_name") @ProtoNumber(3) val folderName: String = "", + @SerialName("create_time") @ProtoNumber(4) val createTime: UInt = UInt.MIN_VALUE, + @SerialName("modify_time") @ProtoNumber(5) val modifyTime: UInt = UInt.MIN_VALUE, + @SerialName("creator_uin") @ProtoNumber(6) val createUin: ULong = ULong.MIN_VALUE, + @SerialName("creator_name") @ProtoNumber(7) val creatorName: String? = null, + @SerialName("total_file_cnt") @ProtoNumber(8) val totalFileCnt: UInt = UInt.MIN_VALUE, + @SerialName("modifier_uin") @ProtoNumber(9) val modifyUin: ULong? = null, + @SerialName("modifier_name") @ProtoNumber(10) val modifierName: String? = null, + @SerialName("used_space") @ProtoNumber(11) val usedSpace: ULong = ULong.MIN_VALUE, +) diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/message/Message.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/message/Message.kt new file mode 100644 index 0000000..34b1306 --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/message/Message.kt @@ -0,0 +1,57 @@ +@file:OptIn(ExperimentalSerializationApi::class) +package moe.whitechi73.protobuf.message + +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class MessageBody( + @ProtoNumber(1) val msgHead: MessageHead? = null, + @ProtoNumber(2) val contentHead: MessageContentHead? = null, + @ProtoNumber(3) val richMsg: RichMessage? = null, +) + +@Serializable +data class RichMessage( + @ProtoNumber(1) val elements: MessageElementList? = null, + @ProtoNumber(2) val rawBuffer: ByteArray? = null, +) + +@Serializable +data class MessageElementList( + @ProtoNumber(2) val elements: List? = null +) + +@Serializable +data class MessageElement( + @ProtoNumber(51) val json: JsonElement? = null, +) + +@Serializable +data class JsonElement( + @ProtoNumber(1) val data: ByteArray? = null, +) + +@Serializable +data class MessageHead( + @ProtoNumber(1) val peer: Long = Long.MIN_VALUE, + @ProtoNumber(2) val peerUid: String? = null, + @ProtoNumber(3) val flag: Int = Int.MIN_VALUE, + @ProtoNumber(5) val receiver: Long? = null, + @ProtoNumber(6) val receiverUid: String? = null, +) + +@Serializable +data class MessageContentHead( + @ProtoNumber(1) val msgType: Int = Int.MIN_VALUE, + @ProtoNumber(2) val msgSubType: Int = Int.MIN_VALUE, + @ProtoNumber(4) val u1: Long = Long.MIN_VALUE, + @ProtoNumber(5) val msgSeq: Long = Long.MIN_VALUE, + @ProtoNumber(6) val msgTime: Long? = null, + @ProtoNumber(7) val u2: Int? = null, + @ProtoNumber(11) val u3: Long? = null, + @ProtoNumber(12) val msgRandom: Long = Long.MIN_VALUE, + @ProtoNumber(14) val u4: Long? = null, + @ProtoNumber(28) val u5: Long? = null, +) \ No newline at end of file diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/oidb/TrpcOidb.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/oidb/TrpcOidb.kt new file mode 100644 index 0000000..8c56bab --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/oidb/TrpcOidb.kt @@ -0,0 +1,14 @@ +@file:OptIn(ExperimentalSerializationApi::class) +package moe.whitechi73.protobuf.oidb + +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class TrpcOidb( + @ProtoNumber(1) val cmd: Int = Int.MIN_VALUE, + @ProtoNumber(2) val service: Int = Int.MIN_VALUE, + @ProtoNumber(4) val buffer: ByteArray, + @ProtoNumber(12) val flag: Int = Int.MIN_VALUE, +) diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/oidb/cmd0x6d7/Oidb0x6d7.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/oidb/cmd0x6d7/Oidb0x6d7.kt new file mode 100644 index 0000000..fdee8dc --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/oidb/cmd0x6d7/Oidb0x6d7.kt @@ -0,0 +1,87 @@ +@file:OptIn(ExperimentalSerializationApi::class) + +package moe.whitechi73.protobuf.oidb.cmd0x6d7 + +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber +import moe.whitechi73.protobuf.group_file_common.FolderInfo + +@Serializable +data class Oidb0x6d7ReqBody( + @ProtoNumber(1) val createFolder: CreateFolderReq? = null, + @ProtoNumber(2) val deleteFolder: DeleteFolderReq? = null, + @ProtoNumber(3) val moveFolder: MoveFolderReq? = null, + @ProtoNumber(4) val renameFolder: RenameFolderReq? = null, +) + +@Serializable +data class CreateFolderReq( + @ProtoNumber(1) val groupCode: ULong = ULong.MIN_VALUE, + @ProtoNumber(2) val appId: UInt = UInt.MIN_VALUE, + @ProtoNumber(3) val parentFolderId: String = "", + @ProtoNumber(4) val folderName: String = "", +) + +@Serializable +data class DeleteFolderReq( + @ProtoNumber(1) val groupCode: ULong = ULong.MIN_VALUE, + @ProtoNumber(2) val appId: UInt = UInt.MIN_VALUE, + @ProtoNumber(3) val folderId: String = "", +) + +@Serializable +data class MoveFolderReq( + @ProtoNumber(1) val groupCode: ULong = ULong.MIN_VALUE, + @ProtoNumber(2) val appId: UInt = UInt.MIN_VALUE, + @ProtoNumber(3) val folderId: String = "", + @ProtoNumber(4) val parentFolderId: String = "", + @ProtoNumber(5) val destFolderId: String = "", +) + +@Serializable +data class RenameFolderReq( + @ProtoNumber(1) val groupCode: ULong = ULong.MIN_VALUE, + @ProtoNumber(2) val appId: UInt = UInt.MIN_VALUE, + @ProtoNumber(3) val folderId: String = "", + @ProtoNumber(4) val folderName: String = "", +) + +@Serializable +data class Oidb0x6d7RespBody( + @ProtoNumber(1) val createFolder: CreateFolderResp? = null, + @ProtoNumber(2) val deleteFolder: DeleteFolderResp? = null, + @ProtoNumber(3) val moveFolder: MoveFolderResp? = null, + @ProtoNumber(4) val renameFolder: RenameFolderResp? = null, +) + +@Serializable +data class CreateFolderResp( + @ProtoNumber(1) val retCode: Int = Int.MIN_VALUE, + @ProtoNumber(2) val retMsg: String = "", + @ProtoNumber(3) val clientWording: String = "", + @ProtoNumber(4) val folderInfo: FolderInfo? = null, +) + +@Serializable +data class DeleteFolderResp( + @ProtoNumber(1) val retCode: Int = Int.MIN_VALUE, + @ProtoNumber(2) val retMsg: String = "", + @ProtoNumber(3) val clientWording: String = "", +) + +@Serializable +data class MoveFolderResp( + @ProtoNumber(1) val retCode: Int = Int.MIN_VALUE, + @ProtoNumber(2) val retMsg: String = "", + @ProtoNumber(3) val clientWording: String = "", + @ProtoNumber(4) val folderInfo: FolderInfo? = null, +) + +@Serializable +data class RenameFolderResp( + @ProtoNumber(1) val retCode: Int = Int.MIN_VALUE, + @ProtoNumber(2) val retMsg: String = "", + @ProtoNumber(3) val clientWording: String = "", + @ProtoNumber(4) val folderInfo: FolderInfo? = null, +) diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/push/C2CCommonTipsEvent.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/push/C2CCommonTipsEvent.kt new file mode 100644 index 0000000..5ef2b7f --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/push/C2CCommonTipsEvent.kt @@ -0,0 +1,16 @@ +package moe.whitechi73.protobuf.push + +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class C2CCommonTipsEvent( + @ProtoNumber(7) val params: List? = null, + @ProtoNumber(8) val xmlTips: String? = null, +) + +@Serializable +data class PokeParam( + @ProtoNumber(1) val key: String = "", + @ProtoNumber(2) val value: String = "", +) \ No newline at end of file diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/push/C2CRecallEvent.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/push/C2CRecallEvent.kt new file mode 100644 index 0000000..b30511f --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/push/C2CRecallEvent.kt @@ -0,0 +1,21 @@ +package moe.whitechi73.protobuf.push + +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class C2CRecallEvent( + @ProtoNumber(1) val head: C2CRecallHead? = null, +) + +@Serializable +data class C2CRecallHead( + @ProtoNumber(1) val operator: String? = null, + @ProtoNumber(13) val wording: RecallWording? = null, + @ProtoNumber(20) val msgSeq: Long = Long.MIN_VALUE, +) + +@Serializable +data class RecallWording( + @ProtoNumber(2) val wording: String? = null +) \ No newline at end of file diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/push/EssenceMessageEvent.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/push/EssenceMessageEvent.kt new file mode 100644 index 0000000..a3e7070 --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/push/EssenceMessageEvent.kt @@ -0,0 +1,6 @@ +package moe.whitechi73.protobuf.push + +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +// by GroupCommonTipsEvent diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/push/FriendApplyEvent.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/push/FriendApplyEvent.kt new file mode 100644 index 0000000..756e510 --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/push/FriendApplyEvent.kt @@ -0,0 +1,19 @@ +package moe.whitechi73.protobuf.push + +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class FriendApplyEvent( + @ProtoNumber(1) val head: FriendApplyHead? = null, +) + + +@Serializable +data class FriendApplyHead( + @ProtoNumber(2) val applierUid: String = "", + @ProtoNumber(7) val srcId: Int = Int.MIN_VALUE, + @ProtoNumber(8) val subSrc: Int = Int.MIN_VALUE, + @ProtoNumber(10) val applyMsg: String? = null, + @ProtoNumber(11) val source: String? = null, +) \ No newline at end of file diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupAdminChangeEvent.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupAdminChangeEvent.kt new file mode 100644 index 0000000..3c11031 --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupAdminChangeEvent.kt @@ -0,0 +1,11 @@ +package moe.whitechi73.protobuf.push + +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class GroupAdminChangeEvent( + @ProtoNumber(1) val groupCode: Long, + @ProtoNumber(4) val operation: GroupAdminChangedOperation? = null +) + diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupAdminChangedOperation.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupAdminChangedOperation.kt new file mode 100644 index 0000000..ce598f5 --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupAdminChangedOperation.kt @@ -0,0 +1,16 @@ +package moe.whitechi73.protobuf.push + +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class GroupAdminChangedOperation( + @ProtoNumber(1) val unsetInfo: GroupAdminSetInfo? = null, + @ProtoNumber(2) val setInfo: GroupAdminSetInfo? = null, +) + +@Serializable +data class GroupAdminSetInfo( + @ProtoNumber(1) val targetUid: String? = null, + @ProtoNumber(2) val operation: Int? = null, +) \ No newline at end of file diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupApplyEvent.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupApplyEvent.kt new file mode 100644 index 0000000..4b4e834 --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupApplyEvent.kt @@ -0,0 +1,11 @@ +package moe.whitechi73.protobuf.push + +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class GroupApplyEvent( + @ProtoNumber(1) val groupCode: Long = Long.MIN_VALUE, + @ProtoNumber(3) val applierUid: String = "", + @ProtoNumber(5) val applyMsg: String? = null, +) diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupBanEvent.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupBanEvent.kt new file mode 100644 index 0000000..8950298 --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupBanEvent.kt @@ -0,0 +1,22 @@ +package moe.whitechi73.protobuf.push + +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class GroupBanEvent( + @ProtoNumber(1) val groupCode: ULong = ULong.MIN_VALUE, + @ProtoNumber(4) val operatorUid: String = "", + @ProtoNumber(5) val target: GroupBanTarget? = null, +) + +@Serializable +data class GroupBanTarget( + @ProtoNumber(3) val target: GroupBanInfo? = null, +) + +@Serializable +data class GroupBanInfo( + @ProtoNumber(1) val targetUid: String? = null, + @ProtoNumber(2) val rawDuration: UInt = UInt.MIN_VALUE, +) \ No newline at end of file diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupCommonTipsEvent.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupCommonTipsEvent.kt new file mode 100644 index 0000000..9389beb --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupCommonTipsEvent.kt @@ -0,0 +1,27 @@ +package moe.whitechi73.protobuf.push + +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class GroupCommonTipsEvent( + @ProtoNumber(4) val groupCode: ULong = ULong.MIN_VALUE, + @ProtoNumber(5) val uniqueTitleChangeDetail: List? = null, + @ProtoNumber(11) val recallDetails: GroupRecallDetails? = null, + @ProtoNumber(26) val baseTips: List? = null, + @ProtoNumber(33) val essenceMsgInfo: List? = null, + @ProtoNumber(37) val msgSeq: ULong = ULong.MIN_VALUE, +) + +@Serializable +data class EssenceMsgInfo( + @ProtoNumber(4) val type: UInt = UInt.MIN_VALUE, + @ProtoNumber(5) val sender: ULong = ULong.MIN_VALUE, + @ProtoNumber(6) val operator: ULong = ULong.MIN_VALUE, +) + +@Serializable +data class GroupBaseTips( + @ProtoNumber(2) val type: UInt = UInt.MIN_VALUE, + @ProtoNumber(7) val params: List? = null +) diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupInviteEvent.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupInviteEvent.kt new file mode 100644 index 0000000..d3bb364 --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupInviteEvent.kt @@ -0,0 +1,10 @@ +package moe.whitechi73.protobuf.push + +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class GroupInviteEvent( + @ProtoNumber(1) val groupCode: Long, + @ProtoNumber(5) val inviterUid: String, +) diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupInvitedApplyEvent.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupInvitedApplyEvent.kt new file mode 100644 index 0000000..a50260b --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupInvitedApplyEvent.kt @@ -0,0 +1,16 @@ +package moe.whitechi73.protobuf.push + +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class GroupInvitedApplyEvent( + @ProtoNumber(2) val applyInfo: GroupInvitedApplyInfo? = null, +) + +@Serializable +data class GroupInvitedApplyInfo( + @ProtoNumber(1) val type: Int = Int.MIN_VALUE, + @ProtoNumber(3) val groupCode: Long = Long.MIN_VALUE, + @ProtoNumber(5) val applierUid: String = "", +) \ No newline at end of file diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupListChangeEvent.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupListChangeEvent.kt new file mode 100644 index 0000000..ff47f90 --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupListChangeEvent.kt @@ -0,0 +1,12 @@ +package moe.whitechi73.protobuf.push + +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class GroupListChangeEvent( + @ProtoNumber(1) val groupCode: Long = Long.MIN_VALUE, + @ProtoNumber(3) val memberUid: String = "", + @ProtoNumber(4) val type: Int = Int.MIN_VALUE, + @ProtoNumber(5) val operatorUid: String = "", +) \ No newline at end of file diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupRecallEvent.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupRecallEvent.kt new file mode 100644 index 0000000..5634ea9 --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupRecallEvent.kt @@ -0,0 +1,18 @@ +package moe.whitechi73.protobuf.push + +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class GroupRecallDetails( + @ProtoNumber(1) val operatorUid: String = "", + @ProtoNumber(3) val msgInfo: RecalledMessageInfo? = null, + @ProtoNumber(9) val wording: RecallWording? = null +) + +@Serializable +data class RecalledMessageInfo( + @ProtoNumber(1) val msgSeq: ULong, + @ProtoNumber(2) val msgTime: ULong, + @ProtoNumber(6) val senderUid: String, +) \ No newline at end of file diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupUniqueTitleChangeEvent.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupUniqueTitleChangeEvent.kt new file mode 100644 index 0000000..b03a5d4 --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/push/GroupUniqueTitleChangeEvent.kt @@ -0,0 +1,10 @@ +package moe.whitechi73.protobuf.push + +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class GroupUniqueTitleChangeDetail( + @ProtoNumber(2) val wording: String = "", + @ProtoNumber(5) val targetUin: ULong = ULong.MIN_VALUE, +) \ No newline at end of file diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/push/MessagePush.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/push/MessagePush.kt new file mode 100644 index 0000000..9436713 --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/push/MessagePush.kt @@ -0,0 +1,26 @@ +package moe.whitechi73.protobuf.push + +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber +import moe.whitechi73.protobuf.message.MessageBody + +@Serializable +data class MessagePush( + @ProtoNumber(1) val msgBody: MessageBody? = null, + @ProtoNumber(4) val clientInfo: MessagePushClientInfo? = null, +) + +@Serializable +data class MessagePushClientInfo( + @ProtoNumber(1) val clientIp: String? = null, + @ProtoNumber(3) val liteHead: MessagePushLiteHead? = null +) + +@Serializable +data class MessagePushLiteHead( + @ProtoNumber(2) val msgType: Int = Int.MIN_VALUE, + @ProtoNumber(3) val msgSeq: ULong = ULong.MIN_VALUE, + @ProtoNumber(4) val msgRandom: ULong = ULong.MIN_VALUE, + @ProtoNumber(6) val msgSubType: Int = Int.MIN_VALUE, + @ProtoNumber(8) val sender: ULong = ULong.MIN_VALUE, +) \ No newline at end of file diff --git a/qqinterface/build.gradle.kts b/qqinterface/build.gradle.kts index 53335d9..e0248f8 100644 --- a/qqinterface/build.gradle.kts +++ b/qqinterface/build.gradle.kts @@ -32,7 +32,7 @@ android { } dependencies { - implementation("androidx.core:core-ktx:1.9.0") - implementation("androidx.appcompat:appcompat:1.6.1") - implementation("com.google.android.material:material:1.9.0") + DEPENDENCY_ANDROIDX.forEach { + implementation(it) + } } \ No newline at end of file diff --git a/qqinterface/src/main/java/com/tencent/mobileqq/pb/PBStringField.java b/qqinterface/src/main/java/com/tencent/mobileqq/pb/PBStringField.java index b4a743b..754c72f 100644 --- a/qqinterface/src/main/java/com/tencent/mobileqq/pb/PBStringField.java +++ b/qqinterface/src/main/java/com/tencent/mobileqq/pb/PBStringField.java @@ -1,6 +1,8 @@ package com.tencent.mobileqq.pb; public class PBStringField extends PBPrimitiveField{ + public static PBStringField __repeatHelper__; + public PBStringField(String str, boolean z) { } diff --git a/qqinterface/src/main/java/com/tencent/mobileqq/pskey/oidb/cmd0x102a/oidb_cmd0x102a.java b/qqinterface/src/main/java/com/tencent/mobileqq/pskey/oidb/cmd0x102a/oidb_cmd0x102a.java new file mode 100644 index 0000000..54c632b --- /dev/null +++ b/qqinterface/src/main/java/com/tencent/mobileqq/pskey/oidb/cmd0x102a/oidb_cmd0x102a.java @@ -0,0 +1,32 @@ +package com.tencent.mobileqq.pskey.oidb.cmd0x102a; + +import com.tencent.mobileqq.pb.MessageMicro; +import com.tencent.mobileqq.pb.PBField; +import com.tencent.mobileqq.pb.PBInt64Field; +import com.tencent.mobileqq.pb.PBRepeatField; +import com.tencent.mobileqq.pb.PBRepeatMessageField; +import com.tencent.mobileqq.pb.PBStringField; +import com.tencent.mobileqq.pb.PBUInt32Field; + +public class oidb_cmd0x102a { + public static class GetPSkeyRequest extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{10, 16}, new String[]{"domains", "flag"}, new Object[]{"", 0}, GetPSkeyRequest.class); + public final PBRepeatField domains = PBField.initRepeat(PBStringField.__repeatHelper__); + public final PBUInt32Field flag = PBField.initUInt32(0); + } + + public static class GetPSkeyResponse extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{10}, new String[]{"private_keys"}, new Object[]{null}, GetPSkeyResponse.class); + public final PBRepeatMessageField private_keys = PBField.initRepeatMessage(PSKey.class); + } + + public static class PSKey extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{10, 18, 24, 34, 40}, new String[]{"domain", "key", "key_expire", "uskey", "uskey_expire"}, new Object[]{"", "", 0L, "", 0L}, PSKey.class); + public final PBStringField domain = PBField.initString(""); + public final PBStringField key = PBField.initString(""); + public final PBInt64Field key_expire = PBField.initInt64(0); + public final PBStringField uskey = PBField.initString(""); + public final PBInt64Field uskey_expire = PBField.initInt64(0); + } + +} diff --git a/qqinterface/src/main/java/com/tencent/mobileqq/relation/api/IAddFriendTempApi.java b/qqinterface/src/main/java/com/tencent/mobileqq/relation/api/IAddFriendTempApi.java index cd579ad..b397a6f 100644 --- a/qqinterface/src/main/java/com/tencent/mobileqq/relation/api/IAddFriendTempApi.java +++ b/qqinterface/src/main/java/com/tencent/mobileqq/relation/api/IAddFriendTempApi.java @@ -154,7 +154,7 @@ public interface IAddFriendTempApi extends QRouteApi { // void sendDelSingleSystemMsg(structmsg.StructMsg paramStructMsg, String paramString, int paramInt, long paramLong, AppInterface paramAppInterface); - void sendFriendSystemMsgAction(int msg_type, long msg_seq, long req_uin, int sub_type, int src_id, int sub_src_id, int group_msg_type, structmsg$SystemMsgActionInfo action_info, int system_msg_action_type, structmsg$StructMsg paramStructMsg, boolean isUncommonlyUsedFrd, AppInterface paramAppInterface); + void sendFriendSystemMsgAction(int msg_type, long msg_seq, long req_uin, int sub_type, int src_id, int sub_src_id, int group_msg_type, structmsg.SystemMsgActionInfo action_info, int system_msg_action_type, structmsg.StructMsg paramStructMsg, boolean isUncommonlyUsedFrd, AppInterface paramAppInterface); void sendFriendSystemMsgReadedReport(AppInterface paramAppInterface); diff --git a/qqinterface/src/main/java/tencent/im/cs/cmd0x346/cmd0x346.java b/qqinterface/src/main/java/tencent/im/cs/cmd0x346/cmd0x346.java new file mode 100644 index 0000000..d8f12c5 --- /dev/null +++ b/qqinterface/src/main/java/tencent/im/cs/cmd0x346/cmd0x346.java @@ -0,0 +1,298 @@ +package tencent.im.cs.cmd0x346; + +import com.tencent.mobileqq.pb.ByteStringMicro; +import com.tencent.mobileqq.pb.MessageMicro; +import com.tencent.mobileqq.pb.PBBytesField; +import com.tencent.mobileqq.pb.PBField; +import com.tencent.mobileqq.pb.PBInt32Field; +import com.tencent.mobileqq.pb.PBRepeatField; +import com.tencent.mobileqq.pb.PBStringField; +import com.tencent.mobileqq.pb.PBUInt32Field; +import com.tencent.mobileqq.pb.PBUInt64Field; + +public class cmd0x346 { + + public static class ReqBody extends MessageMicro { + //static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 26, 34, 42, 50, 58, 66, 74, 82, 90, 98, 106, 114, 122, 130, 138, 146, 154, 162, 170, + // SharedExtProcessor.CONFIG_ID, 816, 1600, 720002, 720010, 720018, 799994}, new String[]{ + // "uint32_cmd", + // "uint32_seq", + // "msg_recv_list_query_req", + // "msg_send_list_query_req", + // "msg_renew_file_req", + // "msg_recall_file_req", + // "msg_apply_upload_req", + // "msg_apply_upload_hit_req", + // "msg_apply_forward_file_req", + // "msg_upload_succ_req", + // "msg_delete_file_req", + // "msg_download_succ_req", + // "msg_apply_download_abs_req", + // "msg_apply_download_req", // 14 + // "msg_apply_list_download_req", "msg_file_query_req", "msg_apply_copy_from_req", "msg_apply_upload_req_v2", "msg_apply_upload_req_v3", "msg_apply_upload_hit_req_v2", "msg_apply_upload_hit_req_v3", + // "uint32_business_id", // 808 + // "uint32_client_type", // 816 + // "uint32_flag_support_mediaplatform", + // "msg_apply_copy_to_req", "msg_apply_clean_traffic_req", "msg_apply_get_traffic_req", + // "msg_extension_req"}, new Object[]{0, 0, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 0, 0, null, null, null, null}, ReqBody.class); + + public final PBUInt32Field uint32_cmd = PBField.initUInt32(0); + public final PBUInt32Field uint32_seq = PBField.initUInt32(0); + //public RecvListQueryReq msg_recv_list_query_req = new RecvListQueryReq(); + //public SendListQueryReq msg_send_list_query_req = new SendListQueryReq(); + //public RenewFileReq msg_renew_file_req = new MessageMicro() { // from class: tencent.im.cs.cmd0x346.RenewFileReq + // static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 18, 24}, new String[]{"uint64_uin", "bytes_uuid", "uint32_add_ttl"}, new Object[]{0L, ByteStringMicro.EMPTY, 0}, RenewFileReq.class); + // public final PBUInt64Field uint64_uin = PBField.initUInt64(0); + // public final PBBytesField bytes_uuid = PBField.initBytes(ByteStringMicro.EMPTY); + // public final PBUInt32Field uint32_add_ttl = PBField.initUInt32(0); + //}; + //public RecallFileReq msg_recall_file_req = new RecallFileReq(); + //public ApplyUploadReq msg_apply_upload_req = new ApplyUploadReq(); + //public ApplyUploadHitReq msg_apply_upload_hit_req = new MessageMicro() { // from class: tencent.im.cs.cmd0x346.ApplyUploadHitReq + // static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{80, 160, 240, 322, 402, 482, PlayerResources.ViewId.GET_MORE_TOGGLE_AREA, 640}, new String[]{"uint64_sender_uin", "uint64_recver_uin", "uint64_file_size", "str_file_name", "bytes_10m_md5", "str_local_filepath", "uint32_danger_level", "uint64_total_space"}, new Object[]{0L, 0L, 0L, "", ByteStringMicro.EMPTY, "", 0, 0L}, ApplyUploadHitReq.class); + // public final PBUInt64Field uint64_sender_uin = PBField.initUInt64(0); + // public final PBUInt64Field uint64_recver_uin = PBField.initUInt64(0); + // public final PBUInt64Field uint64_file_size = PBField.initUInt64(0); + // public final PBStringField str_file_name = PBField.initString(""); + // public final PBBytesField bytes_10m_md5 = PBField.initBytes(ByteStringMicro.EMPTY); + // public final PBStringField str_local_filepath = PBField.initString(""); + // public final PBUInt32Field uint32_danger_level = PBField.initUInt32(0); + // public final PBUInt64Field uint64_total_space = PBField.initUInt64(0); + //}; + //public ApplyForwardFileReq msg_apply_forward_file_req = new ApplyForwardFileReq(); + //public UploadSuccReq msg_upload_succ_req = new UploadSuccReq(); + //public DeleteFileReq msg_delete_file_req = new DeleteFileReq(); + //public DownloadSuccReq msg_download_succ_req = new DownloadSuccReq(); + //public ApplyDownloadAbsReq msg_apply_download_abs_req = new ApplyDownloadAbsReq(); + public ApplyDownloadReq msg_apply_download_req = new ApplyDownloadReq(); + //public ApplyListDownloadReq msg_apply_list_download_req = new MessageMicro() { // from class: tencent.im.cs.cmd0x346.ApplyListDownloadReq + // static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{80, 160, 240}, new String[]{"uint64_uin", "uint32_begin_index", "uint32_req_count"}, new Object[]{0L, 0, 0}, ApplyListDownloadReq.class); + // public final PBUInt64Field uint64_uin = PBField.initUInt64(0); + // public final PBUInt32Field uint32_begin_index = PBField.initUInt32(0); + // public final PBUInt32Field uint32_req_count = PBField.initUInt32(0); + //}; + //public FileQueryReq msg_file_query_req = new FileQueryReq(); + //public ApplyCopyFromReq msg_apply_copy_from_req = new MessageMicro() { // from class: tencent.im.cs.cmd0x346.ApplyCopyFromReq + // static final MessageMicro.FieldMap __fieldMap__; + // public final PBBytesField bytes_file_md5; + // public final PBBytesField bytes_src_parentfolder; + // public final PBBytesField bytes_src_uuid; + // public final PBStringField str_file_name; + // public final PBUInt32Field uint32_danger_level; + // public final PBUInt64Field uint64_dst_uin; + // public final PBUInt64Field uint64_file_size; + // public final PBUInt64Field uint64_total_space; + // public final PBUInt64Field uint64_src_uin = PBField.initUInt64(0); + // public final PBUInt64Field uint64_src_group = PBField.initUInt64(0); + // public final PBUInt32Field uint32_src_svcid = PBField.initUInt32(0); + + // static { + // ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + // __fieldMap__ = MessageMicro.initFieldMap(new int[]{80, 160, 240, 322, 402, 482, PlayerResources.ViewId.GET_MORE_TOGGLE_AREA, 640, QVipServiceAccountFolderProcessor.CMD, 800, x.CTRL_INDEX}, new String[]{"uint64_src_uin", "uint64_src_group", "uint32_src_svcid", "bytes_src_parentfolder", "bytes_src_uuid", "bytes_file_md5", "uint64_dst_uin", "uint64_file_size", "str_file_name", "uint32_danger_level", "uint64_total_space"}, new Object[]{0L, 0L, 0, byteStringMicro, byteStringMicro, byteStringMicro, 0L, 0L, "", 0, 0L}, ApplyCopyFromReq.class); + // } + + // { + // ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + // this.bytes_src_parentfolder = PBField.initBytes(byteStringMicro); + // this.bytes_src_uuid = PBField.initBytes(byteStringMicro); + // this.bytes_file_md5 = PBField.initBytes(byteStringMicro); + // this.uint64_dst_uin = PBField.initUInt64(0L); + // this.uint64_file_size = PBField.initUInt64(0L); + // this.str_file_name = PBField.initString(""); + // this.uint32_danger_level = PBField.initUInt32(0); + // this.uint64_total_space = PBField.initUInt64(0L); + // / } + //}; + //public ApplyUploadReqV2 msg_apply_upload_req_v2 = new ApplyUploadReqV2(); + //public ApplyUploadReqV3 msg_apply_upload_req_v3 = new ApplyUploadReqV3(); + //public ApplyUploadHitReqV2 msg_apply_upload_hit_req_v2 = new ApplyUploadHitReqV2(); + //public ApplyUploadHitReqV3 msg_apply_upload_hit_req_v3 = new MessageMicro() { // from class: tencent.im.cs.cmd0x346.ApplyUploadHitReqV3 + // static final MessageMicro.FieldMap __fieldMap__; + // public final PBBytesField bytes_10m_md5; + // public final PBBytesField bytes_sha; + // public final PBStringField str_local_filepath; + // public final PBUInt32Field uint32_danger_level; + // public final PBUInt64Field uint64_total_space; + // public final PBUInt64Field uint64_sender_uin = PBField.initUInt64(0); + // public final PBUInt64Field uint64_recver_uin = PBField.initUInt64(0); + // public final PBUInt64Field uint64_file_size = PBField.initUInt64(0); + // public final PBStringField str_file_name = PBField.initString(""); + + // static { + // ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + // __fieldMap__ = MessageMicro.initFieldMap(new int[]{80, 160, 240, 322, 402, 482, 562, 640, 720}, new String[]{"uint64_sender_uin", "uint64_recver_uin", "uint64_file_size", "str_file_name", "bytes_10m_md5", "bytes_sha", "str_local_filepath", "uint32_danger_level", "uint64_total_space"}, new Object[]{0L, 0L, 0L, "", byteStringMicro, byteStringMicro, "", 0, 0L}, ApplyUploadHitReqV3.class); + // } + + // { + // ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + // this.bytes_10m_md5 = PBField.initBytes(byteStringMicro); + // this.bytes_sha = PBField.initBytes(byteStringMicro); + // this.str_local_filepath = PBField.initString(""); + // this.uint32_danger_level = PBField.initUInt32(0); + // this.uint64_total_space = PBField.initUInt64(0L); + // } + //}; + //public ApplyCopyToReq msg_apply_copy_to_req = new ApplyCopyToReq(); + //public ApplyCleanTrafficReq msg_apply_clean_traffic_req = new MessageMicro() { // from class: tencent.im.cs.cmd0x346.ApplyCleanTrafficReq + // static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[0], new String[0], new Object[0], ApplyCleanTrafficReq.class); + //}; + //public ApplyGetTrafficReq msg_apply_get_traffic_req = new MessageMicro() { // from class: tencent.im.cs.cmd0x346.ApplyGetTrafficReq + // static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[0], new String[0], new Object[0], ApplyGetTrafficReq.class); + //}; + public final PBUInt32Field uint32_business_id = PBField.initUInt32(0); + public final PBUInt32Field uint32_client_type = PBField.initUInt32(0); + public final PBUInt32Field uint32_flag_support_mediaplatform = PBField.initUInt32(0); + public ExtensionReq msg_extension_req = new ExtensionReq(); + } + + public static class ExtensionReq extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 26, 32, 162, 800, 720802, 721600, 722400, 723200, 724000, 724800, 725600, 726400, 727200, 728000, 728800}, new String[]{ + "uint64_id", "uint64_type", "str_dst_phonenum", "int32_phone_convert_type", "bytes_sig", "uint64_route_id", "msg_del_message_req", + + "uint32_download_url_type", + + "uint32_ptt_format", "uint32_is_need_inner_ip", "uint32_net_type", "uint32_voice_type", "uint32_file_type", "uint32_ptt_time", "uint32_bdh_cmdid", "uint32_req_transfer_type", "uint32_is_auto"}, new Object[]{0L, 0L, "", 0, ByteStringMicro.EMPTY, 0L, null, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0},ExtensionReq.class); + public final PBUInt64Field uint64_id = PBField.initUInt64(0); + public final PBUInt64Field uint64_type = PBField.initUInt64(0); + public final PBStringField str_dst_phonenum = PBField.initString(""); + public final PBInt32Field int32_phone_convert_type = PBField.initInt32(0); + public final PBBytesField bytes_sig = PBField.initBytes(ByteStringMicro.EMPTY); + public final PBUInt64Field uint64_route_id = PBField.initUInt64(0); + /*public cmd0x346$DelMessageReq msg_del_message_req = new MessageMicro() { // from class: tencent.im.cs.cmd0x346.cmd0x346$DelMessageReq + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 80, 160, 240}, new String[]{"uint64_uin_sender", "uint64_uin_receiver", "uint32_msg_time", "uint32_msg_random", "uint32_msg_seq_no"}, new Object[]{0L, 0L, 0, 0, 0}, cmd0x346$DelMessageReq.class); + public final PBUInt64Field uint64_uin_sender = PBField.initUInt64(0); + public final PBUInt64Field uint64_uin_receiver = PBField.initUInt64(0); + public final PBUInt32Field uint32_msg_time = PBField.initUInt32(0); + public final PBUInt32Field uint32_msg_random = PBField.initUInt32(0); + public final PBUInt32Field uint32_msg_seq_no = PBField.initUInt32(0); + };*/ + public final PBUInt32Field uint32_download_url_type = PBField.initUInt32(0); + public final PBUInt32Field uint32_ptt_format = PBField.initUInt32(0); + public final PBUInt32Field uint32_is_need_inner_ip = PBField.initUInt32(0); + public final PBUInt32Field uint32_net_type = PBField.initUInt32(255); + public final PBUInt32Field uint32_voice_type = PBField.initUInt32(0); + public final PBUInt32Field uint32_file_type = PBField.initUInt32(0); + public final PBUInt32Field uint32_ptt_time = PBField.initUInt32(0); + public final PBUInt32Field uint32_bdh_cmdid = PBField.initUInt32(0); + public final PBUInt32Field uint32_req_transfer_type = PBField.initUInt32(0); + public final PBUInt32Field uint32_is_auto = PBField.initUInt32(0); + } + + public static class ApplyDownloadReq extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{80, 162, 240, 400, 482, 4000, 4008, 4802}, new String[]{ + "uint64_uin", // 10 + "bytes_uuid", // 20 + "uint32_owner_type", // 30 + + "uint32_filetype", // 50 + + "str_fileidcrc", // 60 + + "uint32_ext_uintype", "uint32_need_https_url", "str_fileid"}, new Object[]{0L, ByteStringMicro.EMPTY, 0, 0, "", 0, 0, ""}, ApplyDownloadReq.class); + public final PBUInt64Field uint64_uin = PBField.initUInt64(0); + public final PBBytesField bytes_uuid = PBField.initBytes(ByteStringMicro.EMPTY); + public final PBUInt32Field uint32_owner_type = PBField.initUInt32(0); + public final PBUInt32Field uint32_filetype = PBField.initUInt32(0); + public final PBStringField str_fileidcrc = PBField.initString(""); + public final PBUInt32Field uint32_ext_uintype = PBField.initUInt32(0); + public final PBUInt32Field uint32_need_https_url = PBField.initUInt32(0); + public final PBStringField str_fileid = PBField.initString(""); + } + + public static class RspBody extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 26, 34, 42, 50, 58, 66, 74, 82, 90, 98, 106, 114, 122, 130, 138, 146, 154, 162, 170, 400, 720002, 720010, 720018, 799994}, new String[]{"uint32_cmd", "uint32_seq", "msg_recv_list_query_rsp", "msg_send_list_query_rsp", "msg_renew_file_rsp", "msg_recall_file_rsp", "msg_apply_upload_rsp", "msg_apply_upload_hit_rsp", "msg_apply_forward_file_rsp", "msg_upload_succ_rsp", "msg_delete_file_rsp", "msg_download_succ_rsp", "msg_apply_download_abs_rsp", "msg_apply_download_rsp", "msg_apply_list_download_rsp", "msg_file_query_rsp", "msg_apply_copy_from_rsp", "msg_apply_upload_rsp_v2", "msg_apply_upload_rsp_v3", "msg_apply_upload_hit_rsp_v2", "msg_apply_upload_hit_rsp_v3", "uint32_flag_use_media_platform", "msg_apply_copy_to_rsp", "msg_apply_clean_traffic_rsp", "msg_apply_get_traffic_rsp", "msg_extension_rsp"}, new Object[]{0, 0, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, null, null, null}, RspBody.class); + public final PBUInt32Field uint32_cmd = PBField.initUInt32(0); + public final PBUInt32Field uint32_seq = PBField.initUInt32(0); + public ApplyDownloadRsp msg_apply_download_rsp = new ApplyDownloadRsp(); + } + + public static class ApplyDownloadRsp extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{80, 162, 242, 322, 402}, new String[]{"int32_ret_code", "str_ret_msg", "msg_download_info", "msg_file_info", "bytes_file_sha"}, new Object[]{0, "", null, null, ByteStringMicro.EMPTY}, ApplyDownloadRsp.class); + public final PBInt32Field int32_ret_code = PBField.initInt32(0); + public final PBStringField str_ret_msg = PBField.initString(""); + public DownloadInfo msg_download_info = new DownloadInfo(); + public FileInfo msg_file_info = new FileInfo(); + public final PBBytesField bytes_file_sha = PBField.initBytes(ByteStringMicro.EMPTY); + } + + public static class DownloadInfo extends MessageMicro { + //static final MessageMicro.FieldMap __fieldMap__; + public final PBBytesField bytes_download_key; + public final PBBytesField bytes_media_platform_download_key; + public final PBRepeatField rpt_str_downloadip_list; + public final PBStringField str_cookie; + public final PBStringField str_download_dns; + public final PBStringField str_download_domain; + public final PBStringField str_download_ip; + public final PBStringField str_download_url; + public final PBRepeatField str_downloadipv6_list; + public final PBStringField str_https_download_domain; + public final PBUInt32Field uint32_https_port; + public final PBUInt32Field uint32_port; + + static { + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + //__fieldMap__ = MessageMicro.initFieldMap(new int[]{82, 162, 242, 320, 402, 482, 562, 640, QVipServiceAccountFolderProcessor.CMD, 882, 962, 1042}, new String[] + // {"bytes_download_key", "str_download_ip", "str_download_domain", "uint32_port", "str_download_url", "rpt_str_downloadip_list", "str_cookie", "uint32_https_port", "str_https_download_domain", "str_download_dns", "bytes_media_platform_download_key", "str_downloadipv6_list"}, new Object[]{byteStringMicro, "", "", 0, "", "", "", Integer.valueOf((int) WebSocketImpl.DEFAULT_WSS_PORT), "", "", byteStringMicro, ""}, cmd0x346$DownloadInfo.class); + } + + public DownloadInfo() { + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + this.bytes_download_key = PBField.initBytes(byteStringMicro); + this.str_download_ip = PBField.initString(""); + this.str_download_domain = PBField.initString(""); + this.uint32_port = PBField.initUInt32(0); + this.str_download_url = PBField.initString(""); + PBStringField pBStringField = PBStringField.__repeatHelper__; + this.rpt_str_downloadip_list = PBField.initRepeat(pBStringField); + this.str_cookie = PBField.initString(""); + this.uint32_https_port = PBField.initUInt32(443); + this.str_https_download_domain = PBField.initString(""); + this.str_download_dns = PBField.initString(""); + this.bytes_media_platform_download_key = PBField.initBytes(byteStringMicro); + this.str_downloadipv6_list = PBField.initRepeat(pBStringField); + } + } + + public static class FileInfo extends MessageMicro { + //static final MessageMicro.FieldMap __fieldMap__; + public final PBBytesField bytes_10m_md5; + public final PBBytesField bytes_3sha; + public final PBBytesField bytes_md5; + public final PBBytesField bytes_sha; + public final PBBytesField bytes_uuid; + public final PBStringField str_file_name; + public final PBStringField str_fileidcrc; + public final PBUInt32Field uint32_abs_file_type; + public final PBUInt32Field uint32_client_type; + public final PBUInt32Field uint32_expire_time; + public final PBUInt64Field uint64_owner_uin; + public final PBUInt64Field uint64_peer_uin; + public final PBUInt64Field uint64_uin = PBField.initUInt64(0); + public final PBUInt32Field uint32_danger_evel = PBField.initUInt32(0); + public final PBUInt64Field uint64_file_size = PBField.initUInt64(0); + public final PBUInt32Field uint32_life_time = PBField.initUInt32(0); + public final PBUInt32Field uint32_upload_time = PBField.initUInt32(0); + + static { + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + //__fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 24, 32, 40, 50, 58, 720, 802, 810, x.CTRL_INDEX, 960, 968, 1040, gdt_analysis_event.EVENT_GET_SUBSCRIBER_ID, 1130, h.CTRL_INDEX}, new String[]{"uint64_uin", "uint32_danger_evel", "uint64_file_size", "uint32_life_time", "uint32_upload_time", "bytes_uuid", "str_file_name", "uint32_abs_file_type", "bytes_10m_md5", "bytes_sha", "uint32_client_type", "uint64_owner_uin", "uint64_peer_uin", "uint32_expire_time", "str_fileidcrc", "bytes_md5", "bytes_3sha"}, new Object[]{0L, 0, 0L, 0, 0, byteStringMicro, "", 0, byteStringMicro, byteStringMicro, 0, 0L, 0L, 0, "", byteStringMicro, byteStringMicro}, cmd0x346$FileInfo.class); + } + + public FileInfo() { + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + this.bytes_uuid = PBField.initBytes(byteStringMicro); + this.str_file_name = PBField.initString(""); + this.uint32_abs_file_type = PBField.initUInt32(0); + this.bytes_10m_md5 = PBField.initBytes(byteStringMicro); + this.bytes_sha = PBField.initBytes(byteStringMicro); + this.uint32_client_type = PBField.initUInt32(0); + this.uint64_owner_uin = PBField.initUInt64(0L); + this.uint64_peer_uin = PBField.initUInt64(0L); + this.uint32_expire_time = PBField.initUInt32(0); + this.str_fileidcrc = PBField.initString(""); + this.bytes_md5 = PBField.initBytes(byteStringMicro); + this.bytes_3sha = PBField.initBytes(byteStringMicro); + } + } +} diff --git a/qqinterface/src/main/java/tencent/im/oidb/cmd0x6d6/oidb_0x6d6.java b/qqinterface/src/main/java/tencent/im/oidb/cmd0x6d6/oidb_0x6d6.java new file mode 100644 index 0000000..01b5c67 --- /dev/null +++ b/qqinterface/src/main/java/tencent/im/oidb/cmd0x6d6/oidb_0x6d6.java @@ -0,0 +1,230 @@ +package tencent.im.oidb.cmd0x6d6; + +import com.tencent.mobileqq.pb.ByteStringMicro; +import com.tencent.mobileqq.pb.MessageMicro; +import com.tencent.mobileqq.pb.PBBoolField; +import com.tencent.mobileqq.pb.PBBytesField; +import com.tencent.mobileqq.pb.PBField; +import com.tencent.mobileqq.pb.PBInt32Field; +import com.tencent.mobileqq.pb.PBRepeatField; +import com.tencent.mobileqq.pb.PBStringField; +import com.tencent.mobileqq.pb.PBUInt32Field; +import com.tencent.mobileqq.pb.PBUInt64Field; + +public final class oidb_0x6d6 { + public static class ReqBody extends MessageMicro { + public UploadFileReqBody upload_file_req = new UploadFileReqBody(); + public ResendReqBody resend_file_req = new ResendReqBody(); + public DownloadFileReqBody download_file_req = new DownloadFileReqBody(); + public DeleteFileReqBody delete_file_req = new DeleteFileReqBody(); + public RenameFileReqBody rename_file_req = new RenameFileReqBody(); + public MoveFileReqBody move_file_req = new MoveFileReqBody(); + } + + public static class RspBody extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{10, 18, 26, 34, 42, 50}, new String[]{"upload_file_rsp", "resend_file_rsp", "download_file_rsp", "delete_file_rsp", "rename_file_rsp", "move_file_rsp"}, new Object[]{null, null, null, null, null, null}, RspBody.class); + public UploadFileRspBody upload_file_rsp = new UploadFileRspBody(); + public ResendRspBody resend_file_rsp = new ResendRspBody(); + public DownloadFileRspBody download_file_rsp = new DownloadFileRspBody(); + public DeleteFileRspBody delete_file_rsp = new DeleteFileRspBody(); + public RenameFileRspBody rename_file_rsp = new RenameFileRspBody(); + public MoveFileRspBody move_file_rsp = new MoveFileRspBody(); + } + + public static class ResendRspBody extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__; + public final PBBytesField bytes_check_key; + public final PBBytesField bytes_file_key; + public final PBInt32Field int32_ret_code = PBField.initInt32(0); + public final PBStringField str_ret_msg = PBField.initString(""); + public final PBStringField str_client_wording = PBField.initString(""); + public final PBStringField str_upload_ip = PBField.initString(""); + + static { + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 18, 26, 34, 42, 50}, new String[]{"int32_ret_code", "str_ret_msg", "str_client_wording", "str_upload_ip", "bytes_file_key", "bytes_check_key"}, new Object[]{0, "", "", "", byteStringMicro, byteStringMicro}, ResendRspBody.class); + } + + public ResendRspBody() { + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + this.bytes_file_key = PBField.initBytes(byteStringMicro); + this.bytes_check_key = PBField.initBytes(byteStringMicro); + } + } + + public static class DeleteFileRspBody extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 18, 26}, new String[]{"int32_ret_code", "str_ret_msg", "str_client_wording"}, new Object[]{0, "", ""}, DeleteFileRspBody.class); + public final PBInt32Field int32_ret_code = PBField.initInt32(0); + public final PBStringField str_ret_msg = PBField.initString(""); + public final PBStringField str_client_wording = PBField.initString(""); + } + + public static class MoveFileRspBody extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 18, 26, 34}, new String[]{"int32_ret_code", "str_ret_msg", "str_client_wording", "str_parent_folder_id"}, new Object[]{0, "", "", ""}, MoveFileRspBody.class); + public final PBInt32Field int32_ret_code = PBField.initInt32(0); + public final PBStringField str_ret_msg = PBField.initString(""); + public final PBStringField str_client_wording = PBField.initString(""); + public final PBStringField str_parent_folder_id = PBField.initString(""); + } + + public static class DownloadFileRspBody extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__; + public final PBBytesField bytes_cookie_val; + public final PBBytesField bytes_download_url; + public final PBBytesField bytes_md5; + public final PBBytesField bytes_sha; + public final PBBytesField bytes_sha3; + public final PBBytesField str_download_dns; + public final PBStringField str_download_dns_https; + public final PBStringField str_save_file_name; + public final PBUInt32Field uint32_preview_port; + public final PBUInt32Field uint32_preview_port_https; + public final PBInt32Field int32_ret_code = PBField.initInt32(0); + public final PBStringField str_ret_msg = PBField.initString(""); + public final PBStringField str_client_wording = PBField.initString(""); + public final PBStringField str_download_ip = PBField.initString(""); + + static { + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 18, 26, 34, 42, 50, 58, 66, 74, 82, 90, 96, 106, 112}, new String[]{"int32_ret_code", "str_ret_msg", "str_client_wording", "str_download_ip", "str_download_dns", "bytes_download_url", "bytes_sha", "bytes_sha3", "bytes_md5", "bytes_cookie_val", "str_save_file_name", "uint32_preview_port", "str_download_dns_https", "uint32_preview_port_https"}, new Object[]{0, "", "", "", byteStringMicro, byteStringMicro, byteStringMicro, byteStringMicro, byteStringMicro, byteStringMicro, "", 0, "", 0}, DownloadFileRspBody.class); + } + + public DownloadFileRspBody() { + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + this.str_download_dns = PBField.initBytes(byteStringMicro); + this.bytes_download_url = PBField.initBytes(byteStringMicro); + this.bytes_sha = PBField.initBytes(byteStringMicro); + this.bytes_sha3 = PBField.initBytes(byteStringMicro); + this.bytes_md5 = PBField.initBytes(byteStringMicro); + this.bytes_cookie_val = PBField.initBytes(byteStringMicro); + this.str_save_file_name = PBField.initString(""); + this.uint32_preview_port = PBField.initUInt32(0); + this.str_download_dns_https = PBField.initString(""); + this.uint32_preview_port_https = PBField.initUInt32(0); + } + } + + public static class UploadFileRspBody extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__; + public final PBBoolField bool_file_exist; + public final PBBytesField bytes_check_key; + public final PBBytesField bytes_file_key; + public final PBRepeatField str_upload_ip_lan_v4; + public final PBRepeatField str_upload_ip_lan_v6; + public final PBUInt32Field uint32_upload_port; + public final PBInt32Field int32_ret_code = PBField.initInt32(0); + public final PBStringField str_ret_msg = PBField.initString(""); + public final PBStringField str_client_wording = PBField.initString(""); + public final PBStringField str_upload_ip = PBField.initString(""); + public final PBStringField str_server_dns = PBField.initString(""); + public final PBUInt32Field uint32_bus_id = PBField.initUInt32(0); + public final PBStringField str_file_id = PBField.initString(""); + + static { + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 18, 26, 34, 42, 48, 58, 66, 74, 80, 98, 106, 112}, new String[]{"int32_ret_code", "str_ret_msg", "str_client_wording", "str_upload_ip", "str_server_dns", "uint32_bus_id", "str_file_id", "bytes_file_key", "bytes_check_key", "bool_file_exist", "str_upload_ip_lan_v4", "str_upload_ip_lan_v6", "uint32_upload_port"}, new Object[]{0, "", "", "", "", 0, "", byteStringMicro, byteStringMicro, Boolean.FALSE, "", "", 0}, UploadFileRspBody.class); + } + + public UploadFileRspBody() { + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + this.bytes_file_key = PBField.initBytes(byteStringMicro); + this.bytes_check_key = PBField.initBytes(byteStringMicro); + this.bool_file_exist = PBField.initBool(false); + PBStringField pBStringField = PBStringField.__repeatHelper__; + this.str_upload_ip_lan_v4 = PBField.initRepeat(pBStringField); + this.str_upload_ip_lan_v6 = PBField.initRepeat(pBStringField); + this.uint32_upload_port = PBField.initUInt32(0); + } + } + + public static class RenameFileRspBody extends MessageMicro { + public final PBInt32Field int32_ret_code = PBField.initInt32(0); + public final PBStringField str_ret_msg = PBField.initString(""); + public final PBStringField str_client_wording = PBField.initString(""); + } + + public static class ResendReqBody extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 24, 34, 42}, new String[]{"uint64_group_code", "uint32_app_id", "uint32_bus_id", "str_file_id", "bytes_sha"}, new Object[]{0L, 0, 0, "", ByteStringMicro.EMPTY}, ResendReqBody.class); + public final PBUInt64Field uint64_group_code = PBField.initUInt64(0); + public final PBUInt32Field uint32_app_id = PBField.initUInt32(0); + public final PBUInt32Field uint32_bus_id = PBField.initUInt32(0); + public final PBStringField str_file_id = PBField.initString(""); + public final PBBytesField bytes_sha = PBField.initBytes(ByteStringMicro.EMPTY); + } + + public static class DownloadFileReqBody extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__; + public final PBUInt64Field uint64_group_code = PBField.initUInt64(0); + public final PBUInt32Field uint32_app_id = PBField.initUInt32(0); + public final PBUInt32Field uint32_bus_id = PBField.initUInt32(0); + public final PBStringField str_file_id = PBField.initString(""); + public final PBBoolField bool_thumbnail_req = PBField.initBool(false); + public final PBUInt32Field uint32_url_type = PBField.initUInt32(0); + public final PBBoolField bool_preview_req = PBField.initBool(false); + public final PBUInt32Field uint32_src = PBField.initUInt32(0); + + static { + Boolean bool = Boolean.FALSE; + __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 24, 34, 40, 48, 56, 64}, new String[]{"uint64_group_code", "uint32_app_id", "uint32_bus_id", "str_file_id", "bool_thumbnail_req", "uint32_url_type", "bool_preview_req", "uint32_src"}, new Object[]{0L, 0, 0, "", bool, 0, bool, 0}, DownloadFileReqBody.class); + } + } + + public static class DeleteFileReqBody extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 24, 34, 42, 48, 56}, new String[]{"uint64_group_code", "uint32_app_id", "uint32_bus_id", "str_parent_folder_id", "str_file_id", "uint32_msgdb_seq", "uint32_msg_rand"}, new Object[]{0L, 0, 0, "", "", 0, 0}, DeleteFileReqBody.class); + public final PBUInt64Field uint64_group_code = PBField.initUInt64(0); + public final PBUInt32Field uint32_app_id = PBField.initUInt32(0); + public final PBUInt32Field uint32_bus_id = PBField.initUInt32(0); + public final PBStringField str_parent_folder_id = PBField.initString(""); + public final PBStringField str_file_id = PBField.initString(""); + public final PBUInt32Field uint32_msgdb_seq = PBField.initUInt32(0); + public final PBUInt32Field uint32_msg_rand = PBField.initUInt32(0); + } + + public static class MoveFileReqBody extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 24, 34, 42, 50}, new String[]{"uint64_group_code", "uint32_app_id", "uint32_bus_id", "str_file_id", "str_parent_folder_id", "str_dest_folder_id"}, new Object[]{0L, 0, 0, "", "", ""}, MoveFileReqBody.class); + public final PBUInt64Field uint64_group_code = PBField.initUInt64(0); + public final PBUInt32Field uint32_app_id = PBField.initUInt32(0); + public final PBUInt32Field uint32_bus_id = PBField.initUInt32(0); + public final PBStringField str_file_id = PBField.initString(""); + public final PBStringField str_parent_folder_id = PBField.initString(""); + public final PBStringField str_dest_folder_id = PBField.initString(""); + } + + public static class UploadFileReqBody extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__; + public final PBBoolField bool_support_multi_upload; + public final PBBytesField bytes_md5; + public final PBBytesField bytes_sha; + public final PBBytesField bytes_sha3; + public final PBUInt64Field uint64_group_code = PBField.initUInt64(0); + public final PBUInt32Field uint32_app_id = PBField.initUInt32(0); + public final PBUInt32Field uint32_bus_id = PBField.initUInt32(0); + public final PBUInt32Field uint32_entrance = PBField.initUInt32(0); + public final PBStringField str_parent_folder_id = PBField.initString(""); + public final PBStringField str_file_name = PBField.initString(""); + public final PBStringField str_local_path = PBField.initString(""); + public final PBUInt64Field uint64_file_size = PBField.initUInt64(0); + + static { + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 24, 32, 42, 50, 58, 64, 74, 82, 90, 120}, new String[]{"uint64_group_code", "uint32_app_id", "uint32_bus_id", "uint32_entrance", "str_parent_folder_id", "str_file_name", "str_local_path", "uint64_file_size", "bytes_sha", "bytes_sha3", "bytes_md5", "bool_support_multi_upload"}, new Object[]{0L, 0, 0, 0, "", "", "", 0L, byteStringMicro, byteStringMicro, byteStringMicro, Boolean.FALSE}, UploadFileReqBody.class); + } + + public UploadFileReqBody() { + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + this.bytes_sha = PBField.initBytes(byteStringMicro); + this.bytes_sha3 = PBField.initBytes(byteStringMicro); + this.bytes_md5 = PBField.initBytes(byteStringMicro); + this.bool_support_multi_upload = PBField.initBool(false); + } + } + + public static class RenameFileReqBody extends MessageMicro { + public final PBUInt64Field uint64_group_code = PBField.initUInt64(0); + public final PBUInt32Field uint32_app_id = PBField.initUInt32(0); + public final PBUInt32Field uint32_bus_id = PBField.initUInt32(0); + public final PBStringField str_file_id = PBField.initString(""); + public final PBStringField str_parent_folder_id = PBField.initString(""); + public final PBStringField str_new_file_name = PBField.initString(""); + } +} \ No newline at end of file diff --git a/qqinterface/src/main/java/tencent/im/oidb/cmd0xe37/cmd0xe37.java b/qqinterface/src/main/java/tencent/im/oidb/cmd0xe37/cmd0xe37.java new file mode 100644 index 0000000..c364650 --- /dev/null +++ b/qqinterface/src/main/java/tencent/im/oidb/cmd0xe37/cmd0xe37.java @@ -0,0 +1,18 @@ +package tencent.im.oidb.cmd0xe37; + +import com.tencent.mobileqq.pb.ByteStringMicro; +import com.tencent.mobileqq.pb.MessageMicro; +import com.tencent.mobileqq.pb.PBBytesField; +import com.tencent.mobileqq.pb.PBField; + +public class cmd0xe37 { + public static class Req0xe37 extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{10}, new String[]{"bytes_cmd_0x346_req_body"}, new Object[]{ByteStringMicro.EMPTY}, Req0xe37.class); + public final PBBytesField bytes_cmd_0x346_req_body = PBField.initBytes(ByteStringMicro.EMPTY); + } + + public static class Resp0xe37 extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{10}, new String[]{"bytes_cmd_0x346_rsp_body"}, new Object[]{ByteStringMicro.EMPTY}, Resp0xe37.class); + public final PBBytesField bytes_cmd_0x346_rsp_body = PBField.initBytes(ByteStringMicro.EMPTY); + } +} \ No newline at end of file diff --git a/qqinterface/src/main/java/tencent/im/oidb/cmd0xeac/oidb_0xeac.java b/qqinterface/src/main/java/tencent/im/oidb/cmd0xeac/oidb_0xeac.java new file mode 100644 index 0000000..f16a0f9 --- /dev/null +++ b/qqinterface/src/main/java/tencent/im/oidb/cmd0xeac/oidb_0xeac.java @@ -0,0 +1,46 @@ +package tencent.im.oidb.cmd0xeac; + +import com.tencent.mobileqq.pb.MessageMicro; +import com.tencent.mobileqq.pb.PBField; +import com.tencent.mobileqq.pb.PBRepeatMessageField; +import com.tencent.mobileqq.pb.PBStringField; +import com.tencent.mobileqq.pb.PBUInt32Field; +import com.tencent.mobileqq.pb.PBUInt64Field; + +public class oidb_0xeac { + public static class ReqBody extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 24}, new String[]{"group_code", "msg_seq", "msg_random"}, new Object[]{0L, 0, 0}, ReqBody.class); + public final PBUInt64Field group_code = PBField.initUInt64(0); + public final PBUInt32Field msg_seq = PBField.initUInt32(0); + public final PBUInt32Field msg_random = PBField.initUInt32(0); + } + + public static class RspBody extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{10, 16, 24, 34, 80}, new String[]{"wording", "digest_uin", "digest_time", "msg", "error_code"}, new Object[]{"", 0L, 0, null, 0}, RspBody.class); + public final PBStringField wording = PBField.initString(""); + public final PBUInt64Field digest_uin = PBField.initUInt64(0); + public final PBUInt32Field digest_time = PBField.initUInt32(0); + + /* renamed from: msg reason: collision with root package name */ + public DigestMsg f340993msg = new DigestMsg(); + public final PBUInt32Field error_code = PBField.initUInt32(0); + } + + public static class DigestMsg extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 24, 34, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112}, new String[]{"group_code", "msg_seq", "msg_random", "msg_content", "text_size", "pic_size", "video_size", "sender_uin", "sender_time", "add_digest_uin", "add_digest_time", "start_time", "latest_msg_seq", "op_type"}, new Object[]{0L, 0, 0, null, 0L, 0L, 0L, 0L, 0, 0L, 0, 0, 0, 0}, DigestMsg.class); + public final PBUInt64Field group_code = PBField.initUInt64(0); + public final PBUInt32Field msg_seq = PBField.initUInt32(0); + public final PBUInt32Field msg_random = PBField.initUInt32(0); + //public final PBRepeatMessageField msg_content = PBField.initRepeatMessage(MsgElem.class); + public final PBUInt64Field text_size = PBField.initUInt64(0); + public final PBUInt64Field pic_size = PBField.initUInt64(0); + public final PBUInt64Field video_size = PBField.initUInt64(0); + public final PBUInt64Field sender_uin = PBField.initUInt64(0); + public final PBUInt32Field sender_time = PBField.initUInt32(0); + public final PBUInt64Field add_digest_uin = PBField.initUInt64(0); + public final PBUInt32Field add_digest_time = PBField.initUInt32(0); + public final PBUInt32Field start_time = PBField.initUInt32(0); + public final PBUInt32Field latest_msg_seq = PBField.initUInt32(0); + public final PBUInt32Field op_type = PBField.initUInt32(0); + } +} diff --git a/qqinterface/src/main/java/tencent/im/oidb/cmd0xed3/oidb_cmd0xed3.java b/qqinterface/src/main/java/tencent/im/oidb/cmd0xed3/oidb_cmd0xed3.java new file mode 100644 index 0000000..15dd35e --- /dev/null +++ b/qqinterface/src/main/java/tencent/im/oidb/cmd0xed3/oidb_cmd0xed3.java @@ -0,0 +1,20 @@ +package tencent.im.oidb.cmd0xed3; + +import com.tencent.mobileqq.pb.MessageMicro; +import com.tencent.mobileqq.pb.PBField; +import com.tencent.mobileqq.pb.PBUInt32Field; +import com.tencent.mobileqq.pb.PBUInt64Field; + +public class oidb_cmd0xed3 { + public static class ReqBody extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 24, 32, 40, 48}, new String[]{"uint64_to_uin", "uint64_group_code", "uint32_msg_seq", "uint32_msg_rand", "uint64_aio_uin", "uint32_nudge_type"}, new Object[]{0L, 0L, 0, 0, 0L, 0}, ReqBody.class); + public final PBUInt64Field uint64_to_uin = PBField.initUInt64(0); + public final PBUInt64Field uint64_group_code = PBField.initUInt64(0); + public final PBUInt32Field uint32_msg_seq = PBField.initUInt32(0); + public final PBUInt32Field uint32_msg_rand = PBField.initUInt32(0); + public final PBUInt64Field uint64_aio_uin = PBField.initUInt64(0); + public final PBUInt32Field uint32_nudge_type = PBField.initUInt32(0); + } + + +} diff --git a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$AddFrdSNInfo.java b/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$AddFrdSNInfo.java deleted file mode 100644 index c1ee1e0..0000000 --- a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$AddFrdSNInfo.java +++ /dev/null @@ -1,19 +0,0 @@ -package tencent.mobileim.structmsg; - -import com.tencent.mobileqq.pb.MessageMicro; -import com.tencent.mobileqq.pb.PBField; -import com.tencent.mobileqq.pb.PBUInt32Field; - -public final class structmsg$AddFrdSNInfo extends MessageMicro { - static final FieldMap __fieldMap__; - - public final PBUInt32Field uint32_not_see_dynamic = PBField.initUInt32(0); - - public final PBUInt32Field uint32_set_sn = PBField.initUInt32(0); - - static { - Integer integer = Integer.valueOf(0); - __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16 }, new String[] { "uint32_not_see_dynamic", "uint32_set_sn" }, new Object[] { integer, integer }, structmsg$AddFrdSNInfo.class); - } -} - diff --git a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$FlagInfo.java b/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$FlagInfo.java deleted file mode 100644 index 6623d40..0000000 --- a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$FlagInfo.java +++ /dev/null @@ -1,54 +0,0 @@ -package tencent.mobileim.structmsg; - -import com.tencent.mobileqq.pb.MessageMicro; -import com.tencent.mobileqq.pb.PBField; -import com.tencent.mobileqq.pb.PBUInt32Field; - -public final class structmsg$FlagInfo extends MessageMicro { - static final FieldMap __fieldMap__; - - public final PBUInt32Field FrdMsg_Discuss2ManyChat = PBField.initUInt32(0); - - public final PBUInt32Field FrdMsg_GetBusiCard = PBField.initUInt32(0); - - public final PBUInt32Field FrdMsg_NeedWaitingMsg = PBField.initUInt32(0); - - public final PBUInt32Field FrdMsg_uint32_need_all_unread_msg = PBField.initUInt32(0); - - public final PBUInt32Field GrpMsg_GetC2cInviteJoinGroup = PBField.initUInt32(0); - - public final PBUInt32Field GrpMsg_GetDisbandedByAdmin = PBField.initUInt32(0); - - public final PBUInt32Field GrpMsg_GetOfficialAccount = PBField.initUInt32(0); - - public final PBUInt32Field GrpMsg_GetPayInGroup = PBField.initUInt32(0); - - public final PBUInt32Field GrpMsg_HiddenGrp = PBField.initUInt32(0); - - public final PBUInt32Field GrpMsg_Kick_Admin = PBField.initUInt32(0); - - public final PBUInt32Field GrpMsg_NeedAutoAdminWording = PBField.initUInt32(0); - - public final PBUInt32Field GrpMsg_NotAllowJoinGrp_InviteNotFrd = PBField.initUInt32(0); - - public final PBUInt32Field GrpMsg_WordingDown = PBField.initUInt32(0); - - public final PBUInt32Field GrpMsg_get_quit_pay_group_msg_flag = PBField.initUInt32(0); - - public final PBUInt32Field GrpMsg_get_transfer_group_msg_flag = PBField.initUInt32(0); - - public final PBUInt32Field GrpMsg_mask_invite_auto_join = PBField.initUInt32(0); - - public final PBUInt32Field GrpMsg_support_invite_auto_join = PBField.initUInt32(0); - - static { - Integer integer = Integer.valueOf(0); - __fieldMap__ = MessageMicro.initFieldMap(new int[] { - 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, - 88, 96, 104, 112, 120, 128, 136 }, new String[] { - "GrpMsg_Kick_Admin", "GrpMsg_HiddenGrp", "GrpMsg_WordingDown", "FrdMsg_GetBusiCard", "GrpMsg_GetOfficialAccount", "GrpMsg_GetPayInGroup", "FrdMsg_Discuss2ManyChat", "GrpMsg_NotAllowJoinGrp_InviteNotFrd", "FrdMsg_NeedWaitingMsg", "FrdMsg_uint32_need_all_unread_msg", - "GrpMsg_NeedAutoAdminWording", "GrpMsg_get_transfer_group_msg_flag", "GrpMsg_get_quit_pay_group_msg_flag", "GrpMsg_support_invite_auto_join", "GrpMsg_mask_invite_auto_join", "GrpMsg_GetDisbandedByAdmin", "GrpMsg_GetC2cInviteJoinGroup" }, new Object[] { - integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, - integer, integer, integer, integer, integer, integer, integer }, structmsg$FlagInfo.class); - } -} \ No newline at end of file diff --git a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$FriendInfo.java b/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$FriendInfo.java deleted file mode 100644 index 1f53b2b..0000000 --- a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$FriendInfo.java +++ /dev/null @@ -1,13 +0,0 @@ -package tencent.mobileim.structmsg; - -import com.tencent.mobileqq.pb.MessageMicro; -import com.tencent.mobileqq.pb.PBField; -import com.tencent.mobileqq.pb.PBStringField; - -public final class structmsg$FriendInfo extends MessageMicro { - static final FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18 }, new String[] { "msg_joint_friend", "msg_blacklist" }, new Object[] { "", "" }, structmsg$FriendInfo.class); - - public final PBStringField msg_blacklist = PBField.initString(""); - - public final PBStringField msg_joint_friend = PBField.initString(""); -} diff --git a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$GroupInfo.java b/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$GroupInfo.java deleted file mode 100644 index ea7523c..0000000 --- a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$GroupInfo.java +++ /dev/null @@ -1,27 +0,0 @@ -package tencent.mobileim.structmsg; - -import com.tencent.mobileqq.pb.MessageMicro; -import com.tencent.mobileqq.pb.PBField; -import com.tencent.mobileqq.pb.PBStringField; -import com.tencent.mobileqq.pb.PBUInt32Field; - -public final class structmsg$GroupInfo extends MessageMicro { - static final FieldMap __fieldMap__; - - public final PBUInt32Field display_action = PBField.initUInt32(0); - - public final PBUInt32Field group_auth_type = PBField.initUInt32(0); - - public final PBStringField msg_alert = PBField.initString(""); - - public final PBStringField msg_detail_alert = PBField.initString(""); - - public final PBStringField msg_other_admin_done = PBField.initString(""); - - public final PBUInt32Field uint32_app_privilege_flag = PBField.initUInt32(0); - - static { - Integer integer = Integer.valueOf(0); - __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 26, 34, 42, 48 }, new String[] { "group_auth_type", "display_action", "msg_alert", "msg_detail_alert", "msg_other_admin_done", "uint32_app_privilege_flag" }, new Object[] { integer, integer, "", "", "", integer }, structmsg$GroupInfo.class); - } -} diff --git a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$MsgInviteExt.java b/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$MsgInviteExt.java deleted file mode 100644 index a36c902..0000000 --- a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$MsgInviteExt.java +++ /dev/null @@ -1,21 +0,0 @@ -package tencent.mobileim.structmsg; - -import com.tencent.mobileqq.pb.MessageMicro; -import com.tencent.mobileqq.pb.PBField; -import com.tencent.mobileqq.pb.PBUInt32Field; -import com.tencent.mobileqq.pb.PBUInt64Field; - -public final class structmsg$MsgInviteExt extends MessageMicro { - static final FieldMap __fieldMap__; - - public final PBUInt32Field uint32_src_type = PBField.initUInt32(0); - - public final PBUInt32Field uint32_wait_state = PBField.initUInt32(0); - - public final PBUInt64Field uint64_src_code = PBField.initUInt64(0L); - - static { - Integer integer = Integer.valueOf(0); - __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 24 }, new String[] { "uint32_src_type", "uint64_src_code", "uint32_wait_state" }, new Object[] { integer, Long.valueOf(0L), integer }, structmsg$MsgInviteExt.class); - } -} diff --git a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$MsgPayGroupExt.java b/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$MsgPayGroupExt.java deleted file mode 100644 index 173eb8b..0000000 --- a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$MsgPayGroupExt.java +++ /dev/null @@ -1,18 +0,0 @@ -package tencent.mobileim.structmsg; - -import com.tencent.mobileqq.pb.MessageMicro; -import com.tencent.mobileqq.pb.PBField; -import com.tencent.mobileqq.pb.PBUInt64Field; - -public final class structmsg$MsgPayGroupExt extends MessageMicro { - static final FieldMap __fieldMap__; - - public final PBUInt64Field uint64_join_grp_time = PBField.initUInt64(0L); - - public final PBUInt64Field uint64_quit_grp_time = PBField.initUInt64(0L); - - static { - Long long_ = Long.valueOf(0L); - __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16 }, new String[] { "uint64_join_grp_time", "uint64_quit_grp_time" }, new Object[] { long_, long_ }, structmsg$MsgPayGroupExt.class); - } -} diff --git a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$ReqNextSystemMsg.java b/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$ReqNextSystemMsg.java deleted file mode 100644 index 29a8075..0000000 --- a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$ReqNextSystemMsg.java +++ /dev/null @@ -1,37 +0,0 @@ -package tencent.mobileim.structmsg; - -import com.tencent.mobileqq.pb.MessageMicro; -import com.tencent.mobileqq.pb.PBEnumField; -import com.tencent.mobileqq.pb.PBField; -import com.tencent.mobileqq.pb.PBUInt32Field; -import com.tencent.mobileqq.pb.PBUInt64Field; - -public final class structmsg$ReqNextSystemMsg extends MessageMicro { - static final FieldMap __fieldMap__; - - public final PBEnumField checktype = PBField.initEnum(1); - - public structmsg$FlagInfo flag = new structmsg$FlagInfo(); - - public final PBUInt64Field following_friend_seq = PBField.initUInt64(0L); - - public final PBUInt64Field following_group_seq = PBField.initUInt64(0L); - - public final PBUInt64Field friend_msg_type_flag = PBField.initUInt64(0L); - - public final PBUInt32Field language = PBField.initUInt32(0); - - public final PBUInt32Field msg_num = PBField.initUInt32(0); - - public final PBUInt32Field uint32_need_uid = PBField.initUInt32(0); - - public final PBUInt32Field uint32_req_msg_type = PBField.initUInt32(0); - - public final PBUInt32Field version = PBField.initUInt32(0); - - static { - Integer integer = Integer.valueOf(0); - Long long_ = Long.valueOf(0L); - __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 24, 32, 42, 48, 56, 64, 72, 128 }, new String[] { "msg_num", "following_friend_seq", "following_group_seq", "checktype", "flag", "language", "version", "friend_msg_type_flag", "uint32_req_msg_type", "uint32_need_uid" }, new Object[] { integer, long_, long_, Integer.valueOf(1), null, integer, integer, long_, integer, integer }, structmsg$ReqNextSystemMsg.class); - } -} diff --git a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$ReqSystemMsgAction.java b/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$ReqSystemMsgAction.java deleted file mode 100644 index 0d00216..0000000 --- a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$ReqSystemMsgAction.java +++ /dev/null @@ -1,35 +0,0 @@ -package tencent.mobileim.structmsg; - -import com.tencent.mobileqq.pb.MessageMicro; -import com.tencent.mobileqq.pb.PBEnumField; -import com.tencent.mobileqq.pb.PBField; -import com.tencent.mobileqq.pb.PBUInt32Field; -import com.tencent.mobileqq.pb.PBUInt64Field; - -public final class structmsg$ReqSystemMsgAction extends MessageMicro { - static final FieldMap __fieldMap__; - - public structmsg$SystemMsgActionInfo action_info = new structmsg$SystemMsgActionInfo(); - - public final PBUInt32Field group_msg_type = PBField.initUInt32(0); - - public final PBUInt32Field language = PBField.initUInt32(0); - - public final PBUInt64Field msg_seq = PBField.initUInt64(0L); - - public final PBEnumField msg_type = PBField.initEnum(1); - - public final PBUInt64Field req_uin = PBField.initUInt64(0L); - - public final PBUInt32Field src_id = PBField.initUInt32(0); - - public final PBUInt32Field sub_src_id = PBField.initUInt32(0); - - public final PBUInt32Field sub_type = PBField.initUInt32(0); - - static { - Integer integer = Integer.valueOf(0); - Long long_ = Long.valueOf(0L); - __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 24, 32, 40, 48, 56, 66, 72 }, new String[] { "msg_type", "msg_seq", "req_uin", "sub_type", "src_id", "sub_src_id", "group_msg_type", "action_info", "language" }, new Object[] { Integer.valueOf(1), long_, long_, integer, integer, integer, integer, null, integer }, structmsg$ReqSystemMsgAction.class); - } -} diff --git a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$ReqSystemMsgNew.java b/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$ReqSystemMsgNew.java deleted file mode 100644 index a7e5bc2..0000000 --- a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$ReqSystemMsgNew.java +++ /dev/null @@ -1,49 +0,0 @@ -package tencent.mobileim.structmsg; - -import com.tencent.mobileqq.pb.MessageMicro; -import com.tencent.mobileqq.pb.PBBoolField; -import com.tencent.mobileqq.pb.PBEnumField; -import com.tencent.mobileqq.pb.PBField; -import com.tencent.mobileqq.pb.PBUInt32Field; -import com.tencent.mobileqq.pb.PBUInt64Field; - -public final class structmsg$ReqSystemMsgNew extends MessageMicro { - static final FieldMap __fieldMap__; - - public final PBEnumField checktype = PBField.initEnum(1); - - public structmsg$FlagInfo flag = new structmsg$FlagInfo(); - - public final PBUInt64Field friend_msg_type_flag = PBField.initUInt64(0L); - - public final PBBoolField is_get_frd_ribbon = PBField.initBool(true); - - public final PBBoolField is_get_grp_ribbon = PBField.initBool(true); - - public final PBUInt32Field language = PBField.initUInt32(0); - - public final PBUInt64Field latest_friend_seq = PBField.initUInt64(0L); - - public final PBUInt64Field latest_group_seq = PBField.initUInt64(0L); - - public final PBUInt32Field msg_num = PBField.initUInt32(0); - - public final PBUInt32Field uint32_need_uid = PBField.initUInt32(0); - - public final PBUInt32Field uint32_req_msg_type = PBField.initUInt32(0); - - public final PBUInt32Field version = PBField.initUInt32(0); - - static { - Integer integer = Integer.valueOf(0); - Long long_ = Long.valueOf(0L); - Boolean bool = Boolean.TRUE; - __fieldMap__ = MessageMicro.initFieldMap(new int[] { - 8, 16, 24, 32, 40, 50, 56, 64, 72, 80, - 88, 128 }, new String[] { - "msg_num", "latest_friend_seq", "latest_group_seq", "version", "checktype", "flag", "language", "is_get_frd_ribbon", "is_get_grp_ribbon", "friend_msg_type_flag", - "uint32_req_msg_type", "uint32_need_uid" }, new Object[] { - integer, long_, long_, integer, Integer.valueOf(1), null, integer, bool, bool, long_, - integer, integer }, structmsg$ReqSystemMsgNew.class); - } -} diff --git a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$ReqSystemMsgRead.java b/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$ReqSystemMsgRead.java deleted file mode 100644 index 8e56d06..0000000 --- a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$ReqSystemMsgRead.java +++ /dev/null @@ -1,27 +0,0 @@ -package tencent.mobileim.structmsg; - -import com.tencent.mobileqq.pb.MessageMicro; -import com.tencent.mobileqq.pb.PBEnumField; -import com.tencent.mobileqq.pb.PBField; -import com.tencent.mobileqq.pb.PBUInt32Field; -import com.tencent.mobileqq.pb.PBUInt64Field; - -public final class structmsg$ReqSystemMsgRead extends MessageMicro { - static final FieldMap __fieldMap__; - - public final PBEnumField checktype = PBField.initEnum(1); - - public final PBUInt64Field latest_friend_seq = PBField.initUInt64(0L); - - public final PBUInt64Field latest_group_seq = PBField.initUInt64(0L); - - public final PBUInt32Field type = PBField.initUInt32(0); - - public final PBUInt32Field uint32_req_msg_type = PBField.initUInt32(0); - - static { - Long long_ = Long.valueOf(0L); - Integer integer = Integer.valueOf(0); - __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 24, 32, 40 }, new String[] { "latest_friend_seq", "latest_group_seq", "type", "checktype", "uint32_req_msg_type" }, new Object[] { long_, long_, integer, Integer.valueOf(1), integer }, structmsg$ReqSystemMsgRead.class); - } -} diff --git a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$RspHead.java b/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$RspHead.java deleted file mode 100644 index 6a4db67..0000000 --- a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$RspHead.java +++ /dev/null @@ -1,15 +0,0 @@ -package tencent.mobileim.structmsg; - -import com.tencent.mobileqq.pb.MessageMicro; -import com.tencent.mobileqq.pb.PBField; -import com.tencent.mobileqq.pb.PBInt32Field; -import com.tencent.mobileqq.pb.PBStringField; - -public final class structmsg$RspHead extends MessageMicro { - static final FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 18 }, new String[] { "result", "msg_fail" }, new Object[] { Integer.valueOf(0), "" }, structmsg$RspHead.class); - - public final PBStringField msg_fail = PBField.initString(""); - - public final PBInt32Field result = PBField.initInt32(0); -} - diff --git a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$RspNextSystemMsg.java b/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$RspNextSystemMsg.java deleted file mode 100644 index 8913f13..0000000 --- a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$RspNextSystemMsg.java +++ /dev/null @@ -1,37 +0,0 @@ -package tencent.mobileim.structmsg; - -import com.tencent.mobileqq.pb.ByteStringMicro; -import com.tencent.mobileqq.pb.MessageMicro; -import com.tencent.mobileqq.pb.PBBytesField; -import com.tencent.mobileqq.pb.PBEnumField; -import com.tencent.mobileqq.pb.PBField; -import com.tencent.mobileqq.pb.PBRepeatMessageField; -import com.tencent.mobileqq.pb.PBStringField; -import com.tencent.mobileqq.pb.PBUInt32Field; -import com.tencent.mobileqq.pb.PBUInt64Field; - -public final class structmsg$RspNextSystemMsg extends MessageMicro { - static final FieldMap __fieldMap__; - - public final PBStringField bytes_game_nick = PBField.initString(""); - - public final PBBytesField bytes_undecid_for_qim = PBField.initBytes(ByteStringMicro.EMPTY); - - public final PBEnumField checktype = PBField.initEnum(1); - - public final PBUInt64Field following_friend_seq = PBField.initUInt64(0L); - - public final PBUInt64Field following_group_seq = PBField.initUInt64(0L); - - public structmsg$RspHead head = new structmsg$RspHead(); - - public final PBRepeatMessageField msgs = PBField.initRepeatMessage(structmsg$StructMsg.class); - - public final PBUInt32Field uint32_un_read_count3 = PBField.initUInt32(0); - - static { - Long long_ = Long.valueOf(0L); - ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; - __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 24, 32, 40, 802, 810, 816 }, new String[] { "head", "msgs", "following_friend_seq", "following_group_seq", "checktype", "bytes_game_nick", "bytes_undecid_for_qim", "uint32_un_read_count3" }, new Object[] { null, null, long_, long_, Integer.valueOf(1), "", byteStringMicro, Integer.valueOf(0) }, structmsg$RspNextSystemMsg.class); - } -} diff --git a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$RspSystemMsgAction.java b/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$RspSystemMsgAction.java deleted file mode 100644 index a32e3fc..0000000 --- a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$RspSystemMsgAction.java +++ /dev/null @@ -1,25 +0,0 @@ -package tencent.mobileim.structmsg; - -import com.tencent.mobileqq.pb.MessageMicro; -import com.tencent.mobileqq.pb.PBField; -import com.tencent.mobileqq.pb.PBStringField; -import com.tencent.mobileqq.pb.PBUInt32Field; - -public final class structmsg$RspSystemMsgAction extends MessageMicro { - static final FieldMap __fieldMap__; - - public structmsg$RspHead head = new structmsg$RspHead(); - - public final PBStringField msg_detail = PBField.initString(""); - - public final PBStringField msg_invalid_decided = PBField.initString(""); - - public final PBUInt32Field remark_result = PBField.initUInt32(0); - - public final PBUInt32Field type = PBField.initUInt32(0); - - static { - Integer integer = Integer.valueOf(0); - __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 24, 42, 48 }, new String[] { "head", "msg_detail", "type", "msg_invalid_decided", "remark_result" }, new Object[] { null, "", integer, "", integer }, structmsg$RspSystemMsgAction.class); - } -} diff --git a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$RspSystemMsgNew.java b/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$RspSystemMsgNew.java deleted file mode 100644 index b192571..0000000 --- a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$RspSystemMsgNew.java +++ /dev/null @@ -1,66 +0,0 @@ -package tencent.mobileim.structmsg; - -import com.tencent.mobileqq.pb.ByteStringMicro; -import com.tencent.mobileqq.pb.MessageMicro; -import com.tencent.mobileqq.pb.PBBytesField; -import com.tencent.mobileqq.pb.PBEnumField; -import com.tencent.mobileqq.pb.PBField; -import com.tencent.mobileqq.pb.PBRepeatMessageField; -import com.tencent.mobileqq.pb.PBStringField; -import com.tencent.mobileqq.pb.PBUInt32Field; -import com.tencent.mobileqq.pb.PBUInt64Field; - -public final class structmsg$RspSystemMsgNew extends MessageMicro { - static final FieldMap __fieldMap__; - - public final PBStringField bytes_game_nick = PBField.initString(""); - - public final PBBytesField bytes_undecid_for_qim = PBField.initBytes(ByteStringMicro.EMPTY); - - public final PBEnumField checktype = PBField.initEnum(1); - - public final PBUInt64Field following_friend_seq = PBField.initUInt64(0L); - - public final PBUInt64Field following_group_seq = PBField.initUInt64(0L); - - public final PBRepeatMessageField friendmsgs = PBField.initRepeatMessage(structmsg$StructMsg.class); - - public final PBRepeatMessageField groupmsgs = PBField.initRepeatMessage(structmsg$StructMsg.class); - - public final PBStringField grp_msg_display = PBField.initString(""); - - public structmsg$RspHead head = new structmsg$RspHead(); - - public final PBUInt64Field latest_friend_seq = PBField.initUInt64(0L); - - public final PBUInt64Field latest_group_seq = PBField.initUInt64(0L); - - public final PBStringField msg_display = PBField.initString(""); - - public structmsg$StructMsg msg_ribbon_friend = new structmsg$StructMsg(); - - public structmsg$StructMsg msg_ribbon_group = new structmsg$StructMsg(); - - public final PBUInt32Field uint32_has_suspicious_flag = PBField.initUInt32(0); - - public final PBUInt32Field uint32_over = PBField.initUInt32(0); - - public final PBUInt32Field uint32_un_read_count3 = PBField.initUInt32(0); - - public final PBUInt32Field unread_friend_count = PBField.initUInt32(0); - - public final PBUInt32Field unread_group_count = PBField.initUInt32(0); - - static { - Integer integer = Integer.valueOf(0); - Long long_ = Long.valueOf(0L); - ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; - __fieldMap__ = MessageMicro.initFieldMap(new int[] { - 10, 16, 24, 32, 40, 48, 56, 74, 82, 90, - 98, 106, 114, 120, 160, 802, 810, 816, 824 }, new String[] { - "head", "unread_friend_count", "unread_group_count", "latest_friend_seq", "latest_group_seq", "following_friend_seq", "following_group_seq", "friendmsgs", "groupmsgs", "msg_ribbon_friend", - "msg_ribbon_group", "msg_display", "grp_msg_display", "uint32_over", "checktype", "bytes_game_nick", "bytes_undecid_for_qim", "uint32_un_read_count3", "uint32_has_suspicious_flag" }, new Object[] { - null, integer, integer, long_, long_, long_, long_, null, null, null, - null, "", "", integer, Integer.valueOf(1), "", byteStringMicro, integer, integer }, structmsg$RspSystemMsgNew.class); - } -} diff --git a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$RspSystemMsgRead.java b/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$RspSystemMsgRead.java deleted file mode 100644 index 61e02c0..0000000 --- a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$RspSystemMsgRead.java +++ /dev/null @@ -1,17 +0,0 @@ -package tencent.mobileim.structmsg; - -import com.tencent.mobileqq.pb.MessageMicro; -import com.tencent.mobileqq.pb.PBEnumField; -import com.tencent.mobileqq.pb.PBField; -import com.tencent.mobileqq.pb.PBUInt32Field; - -public final class structmsg$RspSystemMsgRead extends MessageMicro { - static final FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 16, 24 }, new String[] { "head", "type", "checktype" }, new Object[] { null, Integer.valueOf(0), Integer.valueOf(1) }, structmsg$RspSystemMsgRead.class); - - public final PBEnumField checktype = PBField.initEnum(1); - - public structmsg$RspHead head = new structmsg$RspHead(); - - public final PBUInt32Field type = PBField.initUInt32(0); -} - diff --git a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$StructMsg.java b/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$StructMsg.java deleted file mode 100644 index dea91d5..0000000 --- a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$StructMsg.java +++ /dev/null @@ -1,31 +0,0 @@ -package tencent.mobileim.structmsg; - -import com.tencent.mobileqq.pb.MessageMicro; -import com.tencent.mobileqq.pb.PBEnumField; -import com.tencent.mobileqq.pb.PBField; -import com.tencent.mobileqq.pb.PBUInt32Field; -import com.tencent.mobileqq.pb.PBUInt64Field; - -public final class structmsg$StructMsg extends MessageMicro { - static final FieldMap __fieldMap__; - - public structmsg$SystemMsg msg = new structmsg$SystemMsg(); - - public final PBUInt64Field msg_seq = PBField.initUInt64(0L); - - public final PBUInt64Field msg_time = PBField.initUInt64(0L); - - public final PBEnumField msg_type = PBField.initEnum(1); - - public final PBUInt64Field req_uin = PBField.initUInt64(0L); - - public final PBUInt32Field uint32_unread_flag = PBField.initUInt32(0); - - public final PBUInt32Field version = PBField.initUInt32(0); - - static { - Integer integer = Integer.valueOf(0); - Long long_ = Long.valueOf(0L); - __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 24, 32, 40, 48, 402 }, new String[] { "version", "msg_type", "msg_seq", "msg_time", "req_uin", "uint32_unread_flag", "msg" }, new Object[] { integer, Integer.valueOf(1), long_, long_, long_, integer, null }, structmsg$StructMsg.class); - } -} diff --git a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$SystemMsg.java b/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$SystemMsg.java deleted file mode 100644 index 27b1972..0000000 --- a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$SystemMsg.java +++ /dev/null @@ -1,186 +0,0 @@ -package tencent.mobileim.structmsg; - -import com.tencent.mobileqq.pb.ByteStringMicro; -import com.tencent.mobileqq.pb.MessageMicro; -import com.tencent.mobileqq.pb.PBBytesField; -import com.tencent.mobileqq.pb.PBField; -import com.tencent.mobileqq.pb.PBInt32Field; -import com.tencent.mobileqq.pb.PBRepeatMessageField; -import com.tencent.mobileqq.pb.PBStringField; -import com.tencent.mobileqq.pb.PBUInt32Field; -import com.tencent.mobileqq.pb.PBUInt64Field; - -public final class structmsg$SystemMsg extends MessageMicro { - static final FieldMap __fieldMap__; - - public final PBUInt64Field action_uin = PBField.initUInt64(0L); - - public final PBStringField action_uin_nick; - - public final PBBytesField action_uin_qq_nick; - - public final PBBytesField action_uin_remark; - - public final PBRepeatMessageField actions = PBField.initRepeatMessage(structmsg$SystemMsgAction.class); - - public final PBUInt64Field actor_uin = PBField.initUInt64(0L); - - public final PBStringField actor_uin_nick; - - public final PBBytesField bytes_addtion; - - public final PBBytesField bytes_game_msg; - - public final PBBytesField bytes_game_nick; - - public final PBBytesField bytes_name_more; - - public final PBBytesField bytes_source_desc; - - public final PBBytesField bytes_transparent_group_notify; - - public final PBBytesField bytes_warning_tips; - - public final PBUInt32Field card_switch; - - public final PBUInt64Field clone_uin = PBField.initUInt64(0L); - - public final PBStringField clone_uin_nick; - - public final PBBytesField eim_group_id_name; - - public structmsg$FriendInfo friend_info = new structmsg$FriendInfo(); - - public final PBUInt64Field group_code = PBField.initUInt64(0L); - - public final PBUInt32Field group_ext_flag; - - public structmsg$GroupInfo group_info = new structmsg$GroupInfo(); - - public final PBUInt32Field group_inviter_role = PBField.initUInt32(0); - - public final PBUInt32Field group_msg_type = PBField.initUInt32(0); - - public final PBStringField group_name; - - public final PBStringField msg_actor_describe = PBField.initString(""); - - public final PBStringField msg_additional = PBField.initString(""); - - public final PBStringField msg_additional_list = PBField.initString(""); - - public final PBStringField msg_decided = PBField.initString(""); - - public final PBStringField msg_describe = PBField.initString(""); - - public final PBStringField msg_detail; - - public structmsg$MsgInviteExt msg_invite_extinfo = new structmsg$MsgInviteExt(); - - public structmsg$MsgPayGroupExt msg_pay_group_extinfo = new structmsg$MsgPayGroupExt(); - - public final PBStringField msg_qna; - - public final PBStringField msg_source = PBField.initString(""); - - public final PBStringField msg_title = PBField.initString(""); - - public final PBBytesField pic_url; - - public final PBUInt32Field relation = PBField.initUInt32(0); - - public final PBUInt32Field req_uin_age; - - public final PBBytesField req_uin_business_card; - - public final PBInt32Field req_uin_faceid; - - public final PBUInt32Field req_uin_gender; - - public final PBStringField req_uin_nick; - - public final PBBytesField req_uin_pre_remark; - - public final PBUInt32Field reqsubtype = PBField.initUInt32(0); - - public final PBUInt32Field src_id = PBField.initUInt32(0); - - public final PBUInt32Field sub_src_id = PBField.initUInt32(0); - - public final PBUInt32Field sub_type = PBField.initUInt32(0); - - public final PBStringField uid; - - public final PBUInt32Field uint32_c2c_invite_join_group_flag; - - public final PBUInt32Field uint32_doubt_flag; - - public final PBUInt32Field uint32_group_flagext3; - - public final PBUInt32Field uint32_source_flag = PBField.initUInt32(0); - - public final PBUInt64Field uint64_discuss_uin = PBField.initUInt64(0L); - - public final PBUInt64Field uint64_eim_group_id = PBField.initUInt64(0L); - - public final PBUInt64Field uint64_group_owner_uin; - - static { - Integer integer = Integer.valueOf(0); - Long long_ = Long.valueOf(0L); - ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; - __fieldMap__ = MessageMicro.initFieldMap(new int[] { - 8, 18, 26, 34, 42, 50, 56, 64, 74, 80, - 88, 96, 104, 114, 122, 128, 138, 146, 152, 160, - 168, 176, 184, 194, 202, 208, 218, 226, 232, 240, - 248, 258, 266, 274, 282, 400, 410, 418, 426, 434, - 442, 456, 466, 474, 482, 490, 506, 514, 522, 530, - 536, 544, 552, 808, 866, 882 }, new String[] { - "sub_type", "msg_title", "msg_describe", "msg_additional", "msg_source", "msg_decided", "src_id", "sub_src_id", "actions", "group_code", - "action_uin", "group_msg_type", "group_inviter_role", "friend_info", "group_info", "actor_uin", "msg_actor_describe", "msg_additional_list", "relation", "reqsubtype", - "clone_uin", "uint64_discuss_uin", "uint64_eim_group_id", "msg_invite_extinfo", "msg_pay_group_extinfo", "uint32_source_flag", "bytes_game_nick", "bytes_game_msg", "uint32_group_flagext3", "uint64_group_owner_uin", - "uint32_doubt_flag", "bytes_warning_tips", "bytes_name_more", "bytes_addtion", "bytes_transparent_group_notify", "req_uin_faceid", "req_uin_nick", "group_name", "action_uin_nick", "msg_qna", - "msg_detail", "group_ext_flag", "actor_uin_nick", "pic_url", "clone_uin_nick", "req_uin_business_card", "eim_group_id_name", "req_uin_pre_remark", "action_uin_qq_nick", "action_uin_remark", - "req_uin_gender", "req_uin_age", "uint32_c2c_invite_join_group_flag", "card_switch", "bytes_source_desc", "uid" }, new Object[] { - integer, "", "", "", "", "", integer, integer, null, long_, - long_, integer, integer, null, null, long_, "", "", integer, integer, - long_, long_, long_, null, null, integer, byteStringMicro, byteStringMicro, integer, long_, - integer, byteStringMicro, byteStringMicro, byteStringMicro, byteStringMicro, integer, "", "", "", "", - "", integer, "", byteStringMicro, "", byteStringMicro, byteStringMicro, byteStringMicro, byteStringMicro, byteStringMicro, - integer, integer, integer, integer, byteStringMicro, "" }, structmsg$SystemMsg.class); - } - - public structmsg$SystemMsg() { - ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; - this.bytes_game_nick = PBField.initBytes(byteStringMicro); - this.bytes_game_msg = PBField.initBytes(byteStringMicro); - this.uint32_group_flagext3 = PBField.initUInt32(0); - this.uint64_group_owner_uin = PBField.initUInt64(0L); - this.uint32_doubt_flag = PBField.initUInt32(0); - this.bytes_warning_tips = PBField.initBytes(byteStringMicro); - this.bytes_name_more = PBField.initBytes(byteStringMicro); - this.bytes_addtion = PBField.initBytes(byteStringMicro); - this.bytes_transparent_group_notify = PBField.initBytes(byteStringMicro); - this.req_uin_faceid = PBField.initInt32(0); - this.req_uin_nick = PBField.initString(""); - this.group_name = PBField.initString(""); - this.action_uin_nick = PBField.initString(""); - this.msg_qna = PBField.initString(""); - this.msg_detail = PBField.initString(""); - this.group_ext_flag = PBField.initUInt32(0); - this.actor_uin_nick = PBField.initString(""); - this.pic_url = PBField.initBytes(byteStringMicro); - this.clone_uin_nick = PBField.initString(""); - this.req_uin_business_card = PBField.initBytes(byteStringMicro); - this.eim_group_id_name = PBField.initBytes(byteStringMicro); - this.req_uin_pre_remark = PBField.initBytes(byteStringMicro); - this.action_uin_qq_nick = PBField.initBytes(byteStringMicro); - this.action_uin_remark = PBField.initBytes(byteStringMicro); - this.req_uin_gender = PBField.initUInt32(0); - this.req_uin_age = PBField.initUInt32(0); - this.uint32_c2c_invite_join_group_flag = PBField.initUInt32(0); - this.card_switch = PBField.initUInt32(0); - this.bytes_source_desc = PBField.initBytes(byteStringMicro); - this.uid = PBField.initString(""); - } -} diff --git a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$SystemMsgAction.java b/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$SystemMsgAction.java deleted file mode 100644 index 3f4ca07..0000000 --- a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$SystemMsgAction.java +++ /dev/null @@ -1,20 +0,0 @@ -package tencent.mobileim.structmsg; - -import com.tencent.mobileqq.pb.MessageMicro; -import com.tencent.mobileqq.pb.PBField; -import com.tencent.mobileqq.pb.PBStringField; -import com.tencent.mobileqq.pb.PBUInt32Field; - -public final class structmsg$SystemMsgAction extends MessageMicro { - static final FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 24, 34, 42 }, new String[] { "name", "result", "action", "action_info", "detail_name" }, new Object[] { "", "", Integer.valueOf(0), null, "" }, structmsg$SystemMsgAction.class); - - public final PBUInt32Field action = PBField.initUInt32(0); - - public structmsg$SystemMsgActionInfo action_info = new structmsg$SystemMsgActionInfo(); - - public final PBStringField detail_name = PBField.initString(""); - - public final PBStringField name = PBField.initString(""); - - public final PBStringField result = PBField.initString(""); -} diff --git a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$SystemMsgActionInfo.java b/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$SystemMsgActionInfo.java deleted file mode 100644 index fa79728..0000000 --- a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg$SystemMsgActionInfo.java +++ /dev/null @@ -1,40 +0,0 @@ -package tencent.mobileim.structmsg; - -import com.tencent.mobileqq.pb.ByteStringMicro; -import com.tencent.mobileqq.pb.MessageMicro; -import com.tencent.mobileqq.pb.PBBoolField; -import com.tencent.mobileqq.pb.PBBytesField; -import com.tencent.mobileqq.pb.PBEnumField; -import com.tencent.mobileqq.pb.PBField; -import com.tencent.mobileqq.pb.PBStringField; -import com.tencent.mobileqq.pb.PBUInt32Field; -import com.tencent.mobileqq.pb.PBUInt64Field; - -public final class structmsg$SystemMsgActionInfo extends MessageMicro { - static final FieldMap __fieldMap__; - - public structmsg$AddFrdSNInfo addFrdSNInfo = new structmsg$AddFrdSNInfo(); - - public final PBBoolField blacklist = PBField.initBool(false); - - public final PBUInt64Field group_code = PBField.initUInt64(0L); - - public final PBUInt32Field group_id = PBField.initUInt32(0); - - public final PBStringField msg = PBField.initString(""); - - public final PBStringField remark = PBField.initString(""); - - public final PBBytesField sig = PBField.initBytes(ByteStringMicro.EMPTY); - - public final PBEnumField type = PBField.initEnum(1); - - public final PBUInt32Field uint32_req_msg_type = PBField.initUInt32(0); - - static { - Integer integer = Integer.valueOf(0); - ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; - Boolean bool = Boolean.FALSE; - __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 26, 402, 408, 418, 424, 434, 440 }, new String[] { "type", "group_code", "sig", "msg", "group_id", "remark", "blacklist", "addFrdSNInfo", "uint32_req_msg_type" }, new Object[] { Integer.valueOf(1), Long.valueOf(0L), byteStringMicro, "", integer, "", bool, null, integer }, structmsg$SystemMsgActionInfo.class); - } -} diff --git a/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg.java b/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg.java new file mode 100644 index 0000000..08d296c --- /dev/null +++ b/qqinterface/src/main/java/tencent/mobileim/structmsg/structmsg.java @@ -0,0 +1,615 @@ +package tencent.mobileim.structmsg; + +import com.tencent.mobileqq.pb.ByteStringMicro; +import com.tencent.mobileqq.pb.MessageMicro; +import com.tencent.mobileqq.pb.PBBoolField; +import com.tencent.mobileqq.pb.PBBytesField; +import com.tencent.mobileqq.pb.PBEnumField; +import com.tencent.mobileqq.pb.PBField; +import com.tencent.mobileqq.pb.PBInt32Field; +import com.tencent.mobileqq.pb.PBRepeatMessageField; +import com.tencent.mobileqq.pb.PBStringField; +import com.tencent.mobileqq.pb.PBUInt32Field; +import com.tencent.mobileqq.pb.PBUInt64Field; + +public class structmsg { + public static class ReqSystemMsgAction extends MessageMicro< ReqSystemMsgAction> { + static final FieldMap __fieldMap__; + + public SystemMsgActionInfo action_info = new SystemMsgActionInfo(); + + public final PBUInt32Field group_msg_type = PBField.initUInt32(0); + + public final PBUInt32Field language = PBField.initUInt32(0); + + public final PBUInt64Field msg_seq = PBField.initUInt64(0L); + + public final PBEnumField msg_type = PBField.initEnum(1); + + public final PBUInt64Field req_uin = PBField.initUInt64(0L); + + public final PBUInt32Field src_id = PBField.initUInt32(0); + + public final PBUInt32Field sub_src_id = PBField.initUInt32(0); + + public final PBUInt32Field sub_type = PBField.initUInt32(0); + + static { + Integer integer = Integer.valueOf(0); + Long long_ = Long.valueOf(0L); + __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 24, 32, 40, 48, 56, 66, 72 }, new String[] { + "msg_type", "msg_seq", "req_uin", "sub_type", "src_id", "sub_src_id", "group_msg_type", "action_info", "language" + }, new Object[] { Integer.valueOf(1), long_, long_, integer, integer, integer, integer, null, integer }, ReqSystemMsgAction.class); + } + } + + public static class AddFrdSNInfo extends MessageMicro { + static final FieldMap __fieldMap__; + + public final PBUInt32Field uint32_not_see_dynamic = PBField.initUInt32(0); + + public final PBUInt32Field uint32_set_sn = PBField.initUInt32(0); + + static { + Integer integer = Integer.valueOf(0); + __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16 }, new String[] { "uint32_not_see_dynamic", "uint32_set_sn" }, new Object[] { integer, integer }, AddFrdSNInfo.class); + } + } + + public static class FlagInfo extends MessageMicro< FlagInfo> { + static final FieldMap __fieldMap__; + + public final PBUInt32Field FrdMsg_Discuss2ManyChat = PBField.initUInt32(0); + + public final PBUInt32Field FrdMsg_GetBusiCard = PBField.initUInt32(0); + + public final PBUInt32Field FrdMsg_NeedWaitingMsg = PBField.initUInt32(0); + + public final PBUInt32Field FrdMsg_uint32_need_all_unread_msg = PBField.initUInt32(0); + + public final PBUInt32Field GrpMsg_GetC2cInviteJoinGroup = PBField.initUInt32(0); + + public final PBUInt32Field GrpMsg_GetDisbandedByAdmin = PBField.initUInt32(0); + + public final PBUInt32Field GrpMsg_GetOfficialAccount = PBField.initUInt32(0); + + public final PBUInt32Field GrpMsg_GetPayInGroup = PBField.initUInt32(0); + + public final PBUInt32Field GrpMsg_HiddenGrp = PBField.initUInt32(0); + + public final PBUInt32Field GrpMsg_Kick_Admin = PBField.initUInt32(0); + + public final PBUInt32Field GrpMsg_NeedAutoAdminWording = PBField.initUInt32(0); + + public final PBUInt32Field GrpMsg_NotAllowJoinGrp_InviteNotFrd = PBField.initUInt32(0); + + public final PBUInt32Field GrpMsg_WordingDown = PBField.initUInt32(0); + + public final PBUInt32Field GrpMsg_get_quit_pay_group_msg_flag = PBField.initUInt32(0); + + public final PBUInt32Field GrpMsg_get_transfer_group_msg_flag = PBField.initUInt32(0); + + public final PBUInt32Field GrpMsg_mask_invite_auto_join = PBField.initUInt32(0); + + public final PBUInt32Field GrpMsg_support_invite_auto_join = PBField.initUInt32(0); + + static { + Integer integer = Integer.valueOf(0); + __fieldMap__ = MessageMicro.initFieldMap(new int[] { + 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, + 88, 96, 104, 112, 120, 128, 136 }, new String[] { + "GrpMsg_Kick_Admin", "GrpMsg_HiddenGrp", "GrpMsg_WordingDown", "FrdMsg_GetBusiCard", "GrpMsg_GetOfficialAccount", "GrpMsg_GetPayInGroup", "FrdMsg_Discuss2ManyChat", "GrpMsg_NotAllowJoinGrp_InviteNotFrd", "FrdMsg_NeedWaitingMsg", "FrdMsg_uint32_need_all_unread_msg", + "GrpMsg_NeedAutoAdminWording", "GrpMsg_get_transfer_group_msg_flag", "GrpMsg_get_quit_pay_group_msg_flag", "GrpMsg_support_invite_auto_join", "GrpMsg_mask_invite_auto_join", "GrpMsg_GetDisbandedByAdmin", "GrpMsg_GetC2cInviteJoinGroup" }, new Object[] { + integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, + integer, integer, integer, integer, integer, integer, integer }, FlagInfo.class); + } + } + + public static class FriendInfo extends MessageMicro< FriendInfo> { + static final FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18 }, new String[] { "msg_joint_friend", "msg_blacklist" }, new Object[] { "", "" }, FriendInfo.class); + + public final PBStringField msg_blacklist = PBField.initString(""); + + public final PBStringField msg_joint_friend = PBField.initString(""); + } + + public static class GroupInfo extends MessageMicro< GroupInfo> { + static final FieldMap __fieldMap__; + + public final PBUInt32Field display_action = PBField.initUInt32(0); + + public final PBUInt32Field group_auth_type = PBField.initUInt32(0); + + public final PBStringField msg_alert = PBField.initString(""); + + public final PBStringField msg_detail_alert = PBField.initString(""); + + public final PBStringField msg_other_admin_done = PBField.initString(""); + + public final PBUInt32Field uint32_app_privilege_flag = PBField.initUInt32(0); + + static { + Integer integer = Integer.valueOf(0); + __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 26, 34, 42, 48 }, new String[] { "group_auth_type", "display_action", "msg_alert", "msg_detail_alert", "msg_other_admin_done", "uint32_app_privilege_flag" }, new Object[] { integer, integer, "", "", "", integer }, GroupInfo.class); + } + } + + public static class MsgInviteExt extends MessageMicro< MsgInviteExt> { + static final FieldMap __fieldMap__; + + public final PBUInt32Field uint32_src_type = PBField.initUInt32(0); + + public final PBUInt32Field uint32_wait_state = PBField.initUInt32(0); + + public final PBUInt64Field uint64_src_code = PBField.initUInt64(0L); + + static { + Integer integer = Integer.valueOf(0); + __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 24 }, new String[] { "uint32_src_type", "uint64_src_code", "uint32_wait_state" }, new Object[] { integer, Long.valueOf(0L), integer }, MsgInviteExt.class); + } + } + + public static class MsgPayGroupExt extends MessageMicro< MsgPayGroupExt> { + static final FieldMap __fieldMap__; + + public final PBUInt64Field uint64_join_grp_time = PBField.initUInt64(0L); + + public final PBUInt64Field uint64_quit_grp_time = PBField.initUInt64(0L); + + static { + Long long_ = Long.valueOf(0L); + __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16 }, new String[] { "uint64_join_grp_time", "uint64_quit_grp_time" }, new Object[] { long_, long_ }, MsgPayGroupExt.class); + } + } + + public static class ReqNextSystemMsg extends MessageMicro< ReqNextSystemMsg> { + static final FieldMap __fieldMap__; + + public final PBEnumField checktype = PBField.initEnum(1); + + public FlagInfo flag = new FlagInfo(); + + public final PBUInt64Field following_friend_seq = PBField.initUInt64(0L); + + public final PBUInt64Field following_group_seq = PBField.initUInt64(0L); + + public final PBUInt64Field friend_msg_type_flag = PBField.initUInt64(0L); + + public final PBUInt32Field language = PBField.initUInt32(0); + + public final PBUInt32Field msg_num = PBField.initUInt32(0); + + public final PBUInt32Field uint32_need_uid = PBField.initUInt32(0); + + public final PBUInt32Field uint32_req_msg_type = PBField.initUInt32(0); + + public final PBUInt32Field version = PBField.initUInt32(0); + + static { + Integer integer = Integer.valueOf(0); + Long long_ = Long.valueOf(0L); + __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 24, 32, 42, 48, 56, 64, 72, 128 }, new String[] { "msg_num", "following_friend_seq", "following_group_seq", "checktype", "flag", "language", "version", "friend_msg_type_flag", "uint32_req_msg_type", "uint32_need_uid" }, new Object[] { integer, long_, long_, Integer.valueOf(1), null, integer, integer, long_, integer, integer }, ReqNextSystemMsg.class); + } + } + + public static class ReqSystemMsgNew extends MessageMicro< ReqSystemMsgNew> { + static final FieldMap __fieldMap__; + + public final PBEnumField checktype = PBField.initEnum(1); + + public FlagInfo flag = new FlagInfo(); + + public final PBUInt64Field friend_msg_type_flag = PBField.initUInt64(0L); + + public final PBBoolField is_get_frd_ribbon = PBField.initBool(true); + + public final PBBoolField is_get_grp_ribbon = PBField.initBool(true); + + public final PBUInt32Field language = PBField.initUInt32(0); + + public final PBUInt64Field latest_friend_seq = PBField.initUInt64(0L); + + public final PBUInt64Field latest_group_seq = PBField.initUInt64(0L); + + public final PBUInt32Field msg_num = PBField.initUInt32(0); + + public final PBUInt32Field uint32_need_uid = PBField.initUInt32(0); + + public final PBUInt32Field uint32_req_msg_type = PBField.initUInt32(0); + + public final PBUInt32Field version = PBField.initUInt32(0); + + static { + Integer integer = Integer.valueOf(0); + Long long_ = Long.valueOf(0L); + Boolean bool = Boolean.TRUE; + __fieldMap__ = MessageMicro.initFieldMap(new int[] { + 8, 16, 24, 32, 40, 50, 56, 64, 72, 80, + 88, 128 }, new String[] { + "msg_num", "latest_friend_seq", "latest_group_seq", "version", "checktype", "flag", "language", "is_get_frd_ribbon", "is_get_grp_ribbon", "friend_msg_type_flag", + "uint32_req_msg_type", "uint32_need_uid" }, new Object[] { + integer, long_, long_, integer, Integer.valueOf(1), null, integer, bool, bool, long_, + integer, integer }, ReqSystemMsgNew.class); + } + } + + public static class ReqSystemMsgRead extends MessageMicro< ReqSystemMsgRead> { + static final FieldMap __fieldMap__; + + public final PBEnumField checktype = PBField.initEnum(1); + + public final PBUInt64Field latest_friend_seq = PBField.initUInt64(0L); + + public final PBUInt64Field latest_group_seq = PBField.initUInt64(0L); + + public final PBUInt32Field type = PBField.initUInt32(0); + + public final PBUInt32Field uint32_req_msg_type = PBField.initUInt32(0); + + static { + Long long_ = Long.valueOf(0L); + Integer integer = Integer.valueOf(0); + __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 24, 32, 40 }, new String[] { "latest_friend_seq", "latest_group_seq", "type", "checktype", "uint32_req_msg_type" }, new Object[] { long_, long_, integer, Integer.valueOf(1), integer }, ReqSystemMsgRead.class); + } + } + + public static class RspHead extends MessageMicro< RspHead> { + static final FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 18 }, new String[] { "result", "msg_fail" }, new Object[] { Integer.valueOf(0), "" }, RspHead.class); + + public final PBStringField msg_fail = PBField.initString(""); + + public final PBInt32Field result = PBField.initInt32(0); + } + + public static class RspNextSystemMsg extends MessageMicro< RspNextSystemMsg> { + static final FieldMap __fieldMap__; + + public final PBStringField bytes_game_nick = PBField.initString(""); + + public final PBBytesField bytes_undecid_for_qim = PBField.initBytes(ByteStringMicro.EMPTY); + + public final PBEnumField checktype = PBField.initEnum(1); + + public final PBUInt64Field following_friend_seq = PBField.initUInt64(0L); + + public final PBUInt64Field following_group_seq = PBField.initUInt64(0L); + + public RspHead head = new RspHead(); + + public final PBRepeatMessageField< StructMsg> msgs = PBField.initRepeatMessage( StructMsg.class); + + public final PBUInt32Field uint32_un_read_count3 = PBField.initUInt32(0); + + static { + Long long_ = Long.valueOf(0L); + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 24, 32, 40, 802, 810, 816 }, new String[] { "head", "msgs", "following_friend_seq", "following_group_seq", "checktype", "bytes_game_nick", "bytes_undecid_for_qim", "uint32_un_read_count3" }, new Object[] { null, null, long_, long_, Integer.valueOf(1), "", byteStringMicro, Integer.valueOf(0) }, RspNextSystemMsg.class); + } + } + + public static class RspSystemMsgAction extends MessageMicro< RspSystemMsgAction> { + static final FieldMap __fieldMap__; + + public RspHead head = new RspHead(); + + public final PBStringField msg_detail = PBField.initString(""); + + public final PBStringField msg_invalid_decided = PBField.initString(""); + + public final PBUInt32Field remark_result = PBField.initUInt32(0); + + public final PBUInt32Field type = PBField.initUInt32(0); + + static { + Integer integer = Integer.valueOf(0); + __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 24, 42, 48 }, new String[] { "head", "msg_detail", "type", "msg_invalid_decided", "remark_result" }, new Object[] { null, "", integer, "", integer }, RspSystemMsgAction.class); + } + } + + public static class RspSystemMsgNew extends MessageMicro< RspSystemMsgNew> { + static final FieldMap __fieldMap__; + + public final PBStringField bytes_game_nick = PBField.initString(""); + + public final PBBytesField bytes_undecid_for_qim = PBField.initBytes(ByteStringMicro.EMPTY); + + public final PBEnumField checktype = PBField.initEnum(1); + + public final PBUInt64Field following_friend_seq = PBField.initUInt64(0L); + + public final PBUInt64Field following_group_seq = PBField.initUInt64(0L); + + public final PBRepeatMessageField< StructMsg> friendmsgs = PBField.initRepeatMessage( StructMsg.class); + + public final PBRepeatMessageField< StructMsg> groupmsgs = PBField.initRepeatMessage( StructMsg.class); + + public final PBStringField grp_msg_display = PBField.initString(""); + + public RspHead head = new RspHead(); + + public final PBUInt64Field latest_friend_seq = PBField.initUInt64(0L); + + public final PBUInt64Field latest_group_seq = PBField.initUInt64(0L); + + public final PBStringField msg_display = PBField.initString(""); + + public StructMsg msg_ribbon_friend = new StructMsg(); + + public StructMsg msg_ribbon_group = new StructMsg(); + + public final PBUInt32Field uint32_has_suspicious_flag = PBField.initUInt32(0); + + public final PBUInt32Field uint32_over = PBField.initUInt32(0); + + public final PBUInt32Field uint32_un_read_count3 = PBField.initUInt32(0); + + public final PBUInt32Field unread_friend_count = PBField.initUInt32(0); + + public final PBUInt32Field unread_group_count = PBField.initUInt32(0); + + static { + Integer integer = Integer.valueOf(0); + Long long_ = Long.valueOf(0L); + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + __fieldMap__ = MessageMicro.initFieldMap(new int[] { + 10, 16, 24, 32, 40, 48, 56, 74, 82, 90, + 98, 106, 114, 120, 160, 802, 810, 816, 824 }, new String[] { + "head", "unread_friend_count", "unread_group_count", "latest_friend_seq", "latest_group_seq", "following_friend_seq", "following_group_seq", "friendmsgs", "groupmsgs", "msg_ribbon_friend", + "msg_ribbon_group", "msg_display", "grp_msg_display", "uint32_over", "checktype", "bytes_game_nick", "bytes_undecid_for_qim", "uint32_un_read_count3", "uint32_has_suspicious_flag" }, new Object[] { + null, integer, integer, long_, long_, long_, long_, null, null, null, + null, "", "", integer, Integer.valueOf(1), "", byteStringMicro, integer, integer }, RspSystemMsgNew.class); + } + } + + public static class RspSystemMsgRead extends MessageMicro< RspSystemMsgRead> { + static final FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 16, 24 }, new String[] { "head", "type", "checktype" }, new Object[] { null, Integer.valueOf(0), Integer.valueOf(1) }, RspSystemMsgRead.class); + + public final PBEnumField checktype = PBField.initEnum(1); + + public RspHead head = new RspHead(); + + public final PBUInt32Field type = PBField.initUInt32(0); + } + + public static class StructMsg extends MessageMicro< StructMsg> { + static final FieldMap __fieldMap__; + + public SystemMsg msg = new SystemMsg(); + + public final PBUInt64Field msg_seq = PBField.initUInt64(0L); + + public final PBUInt64Field msg_time = PBField.initUInt64(0L); + + public final PBEnumField msg_type = PBField.initEnum(1); + + public final PBUInt64Field req_uin = PBField.initUInt64(0L); + + public final PBUInt32Field uint32_unread_flag = PBField.initUInt32(0); + + public final PBUInt32Field version = PBField.initUInt32(0); + + static { + Integer integer = Integer.valueOf(0); + Long long_ = Long.valueOf(0L); + __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 24, 32, 40, 48, 402 }, new String[] { "version", "msg_type", "msg_seq", "msg_time", "req_uin", "uint32_unread_flag", "msg" }, new Object[] { integer, Integer.valueOf(1), long_, long_, long_, integer, null }, StructMsg.class); + } + } + + public static class SystemMsg extends MessageMicro< SystemMsg> { + static final FieldMap __fieldMap__; + + public final PBUInt64Field action_uin = PBField.initUInt64(0L); + + public final PBStringField action_uin_nick; + + public final PBBytesField action_uin_qq_nick; + + public final PBBytesField action_uin_remark; + + public final PBRepeatMessageField< SystemMsgAction> actions = PBField.initRepeatMessage( SystemMsgAction.class); + + public final PBUInt64Field actor_uin = PBField.initUInt64(0L); + + public final PBStringField actor_uin_nick; + + public final PBBytesField bytes_addtion; + + public final PBBytesField bytes_game_msg; + + public final PBBytesField bytes_game_nick; + + public final PBBytesField bytes_name_more; + + public final PBBytesField bytes_source_desc; + + public final PBBytesField bytes_transparent_group_notify; + + public final PBBytesField bytes_warning_tips; + + public final PBUInt32Field card_switch; + + public final PBUInt64Field clone_uin = PBField.initUInt64(0L); + + public final PBStringField clone_uin_nick; + + public final PBBytesField eim_group_id_name; + + public FriendInfo friend_info = new FriendInfo(); + + public final PBUInt64Field group_code = PBField.initUInt64(0L); + + public final PBUInt32Field group_ext_flag; + + public GroupInfo group_info = new GroupInfo(); + + public final PBUInt32Field group_inviter_role = PBField.initUInt32(0); + + public final PBUInt32Field group_msg_type = PBField.initUInt32(0); + + public final PBStringField group_name; + + public final PBStringField msg_actor_describe = PBField.initString(""); + + public final PBStringField msg_additional = PBField.initString(""); + + public final PBStringField msg_additional_list = PBField.initString(""); + + public final PBStringField msg_decided = PBField.initString(""); + + public final PBStringField msg_describe = PBField.initString(""); + + public final PBStringField msg_detail; + + public MsgInviteExt msg_invite_extinfo = new MsgInviteExt(); + + public MsgPayGroupExt msg_pay_group_extinfo = new MsgPayGroupExt(); + + public final PBStringField msg_qna; + + public final PBStringField msg_source = PBField.initString(""); + + public final PBStringField msg_title = PBField.initString(""); + + public final PBBytesField pic_url; + + public final PBUInt32Field relation = PBField.initUInt32(0); + + public final PBUInt32Field req_uin_age; + + public final PBBytesField req_uin_business_card; + + public final PBInt32Field req_uin_faceid; + + public final PBUInt32Field req_uin_gender; + + public final PBStringField req_uin_nick; + + public final PBBytesField req_uin_pre_remark; + + public final PBUInt32Field reqsubtype = PBField.initUInt32(0); + + public final PBUInt32Field src_id = PBField.initUInt32(0); + + public final PBUInt32Field sub_src_id = PBField.initUInt32(0); + + public final PBUInt32Field sub_type = PBField.initUInt32(0); + + public final PBStringField uid; + + public final PBUInt32Field uint32_c2c_invite_join_group_flag; + + public final PBUInt32Field uint32_doubt_flag; + + public final PBUInt32Field uint32_group_flagext3; + + public final PBUInt32Field uint32_source_flag = PBField.initUInt32(0); + + public final PBUInt64Field uint64_discuss_uin = PBField.initUInt64(0L); + + public final PBUInt64Field uint64_eim_group_id = PBField.initUInt64(0L); + + public final PBUInt64Field uint64_group_owner_uin; + + static { + Integer integer = Integer.valueOf(0); + Long long_ = Long.valueOf(0L); + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + __fieldMap__ = MessageMicro.initFieldMap(new int[] { + 8, 18, 26, 34, 42, 50, 56, 64, 74, 80, + 88, 96, 104, 114, 122, 128, 138, 146, 152, 160, + 168, 176, 184, 194, 202, 208, 218, 226, 232, 240, + 248, 258, 266, 274, 282, 400, 410, 418, 426, 434, + 442, 456, 466, 474, 482, 490, 506, 514, 522, 530, + 536, 544, 552, 808, 866, 882 }, new String[] { + "sub_type", "msg_title", "msg_describe", "msg_additional", "msg_source", "msg_decided", "src_id", "sub_src_id", "actions", "group_code", + "action_uin", "group_msg_type", "group_inviter_role", "friend_info", "group_info", "actor_uin", "msg_actor_describe", "msg_additional_list", "relation", "reqsubtype", + "clone_uin", "uint64_discuss_uin", "uint64_eim_group_id", "msg_invite_extinfo", "msg_pay_group_extinfo", "uint32_source_flag", "bytes_game_nick", "bytes_game_msg", "uint32_group_flagext3", "uint64_group_owner_uin", + "uint32_doubt_flag", "bytes_warning_tips", "bytes_name_more", "bytes_addtion", "bytes_transparent_group_notify", "req_uin_faceid", "req_uin_nick", "group_name", "action_uin_nick", "msg_qna", + "msg_detail", "group_ext_flag", "actor_uin_nick", "pic_url", "clone_uin_nick", "req_uin_business_card", "eim_group_id_name", "req_uin_pre_remark", "action_uin_qq_nick", "action_uin_remark", + "req_uin_gender", "req_uin_age", "uint32_c2c_invite_join_group_flag", "card_switch", "bytes_source_desc", "uid" }, new Object[] { + integer, "", "", "", "", "", integer, integer, null, long_, + long_, integer, integer, null, null, long_, "", "", integer, integer, + long_, long_, long_, null, null, integer, byteStringMicro, byteStringMicro, integer, long_, + integer, byteStringMicro, byteStringMicro, byteStringMicro, byteStringMicro, integer, "", "", "", "", + "", integer, "", byteStringMicro, "", byteStringMicro, byteStringMicro, byteStringMicro, byteStringMicro, byteStringMicro, + integer, integer, integer, integer, byteStringMicro, "" }, SystemMsg.class); + } + + public SystemMsg() { + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + this.bytes_game_nick = PBField.initBytes(byteStringMicro); + this.bytes_game_msg = PBField.initBytes(byteStringMicro); + this.uint32_group_flagext3 = PBField.initUInt32(0); + this.uint64_group_owner_uin = PBField.initUInt64(0L); + this.uint32_doubt_flag = PBField.initUInt32(0); + this.bytes_warning_tips = PBField.initBytes(byteStringMicro); + this.bytes_name_more = PBField.initBytes(byteStringMicro); + this.bytes_addtion = PBField.initBytes(byteStringMicro); + this.bytes_transparent_group_notify = PBField.initBytes(byteStringMicro); + this.req_uin_faceid = PBField.initInt32(0); + this.req_uin_nick = PBField.initString(""); + this.group_name = PBField.initString(""); + this.action_uin_nick = PBField.initString(""); + this.msg_qna = PBField.initString(""); + this.msg_detail = PBField.initString(""); + this.group_ext_flag = PBField.initUInt32(0); + this.actor_uin_nick = PBField.initString(""); + this.pic_url = PBField.initBytes(byteStringMicro); + this.clone_uin_nick = PBField.initString(""); + this.req_uin_business_card = PBField.initBytes(byteStringMicro); + this.eim_group_id_name = PBField.initBytes(byteStringMicro); + this.req_uin_pre_remark = PBField.initBytes(byteStringMicro); + this.action_uin_qq_nick = PBField.initBytes(byteStringMicro); + this.action_uin_remark = PBField.initBytes(byteStringMicro); + this.req_uin_gender = PBField.initUInt32(0); + this.req_uin_age = PBField.initUInt32(0); + this.uint32_c2c_invite_join_group_flag = PBField.initUInt32(0); + this.card_switch = PBField.initUInt32(0); + this.bytes_source_desc = PBField.initBytes(byteStringMicro); + this.uid = PBField.initString(""); + } + } + + public static class SystemMsgAction extends MessageMicro< SystemMsgAction> { + static final FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 24, 34, 42 }, new String[] { "name", "result", "action", "action_info", "detail_name" }, new Object[] { "", "", Integer.valueOf(0), null, "" }, SystemMsgAction.class); + + public final PBUInt32Field action = PBField.initUInt32(0); + + public SystemMsgActionInfo action_info = new SystemMsgActionInfo(); + + public final PBStringField detail_name = PBField.initString(""); + + public final PBStringField name = PBField.initString(""); + + public final PBStringField result = PBField.initString(""); + } + + public static class SystemMsgActionInfo extends MessageMicro< SystemMsgActionInfo> { + static final FieldMap __fieldMap__; + + public AddFrdSNInfo addFrdSNInfo = new AddFrdSNInfo(); + + public final PBBoolField blacklist = PBField.initBool(false); + + public final PBUInt64Field group_code = PBField.initUInt64(0L); + + public final PBUInt32Field group_id = PBField.initUInt32(0); + + public final PBStringField msg = PBField.initString(""); + + public final PBStringField remark = PBField.initString(""); + + public final PBBytesField sig = PBField.initBytes(ByteStringMicro.EMPTY); + + public final PBEnumField type = PBField.initEnum(1); + + public final PBUInt32Field uint32_req_msg_type = PBField.initUInt32(0); + + static { + Integer integer = Integer.valueOf(0); + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + Boolean bool = Boolean.FALSE; + __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 26, 402, 408, 418, 424, 434, 440 }, new String[] { "type", "group_code", "sig", "msg", "group_id", "remark", "blacklist", "addFrdSNInfo", "uint32_req_msg_type" }, new Object[] { Integer.valueOf(1), Long.valueOf(0L), byteStringMicro, "", integer, "", bool, null, integer }, SystemMsgActionInfo.class); + } + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 21af189..bdfff11 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -35,4 +35,7 @@ include( ":app", ":xposed", ":qqinterface" -) \ No newline at end of file +) +include(":protobuf") +include(":processor") +include(":annotations") diff --git a/xposed/build.gradle.kts b/xposed/build.gradle.kts index 4e58de4..55799b6 100644 --- a/xposed/build.gradle.kts +++ b/xposed/build.gradle.kts @@ -1,9 +1,9 @@ plugins { id("com.android.library") id("org.jetbrains.kotlin.android") - //id("io.realm.kotlin") id("kotlin-kapt") - kotlin("plugin.serialization") version "1.8.10" + id("com.google.devtools.ksp") version "1.9.21-1.0.15" + kotlin("plugin.serialization") version "1.9.21" } android { @@ -49,54 +49,48 @@ android { } } +kotlin { + sourceSets.all { + languageSettings { + languageVersion = "2.0" + } + } +} + dependencies { compileOnly ("de.robv.android.xposed:api:82") compileOnly (project(":qqinterface")) - implementation("androidx.core:core-ktx:1.9.0") - implementation("androidx.appcompat:appcompat:1.6.1") - implementation("com.google.android.material:material:1.9.0") - - // 业务场景不适配 - //implementation("io.realm.kotlin:library-base:1.11.0") - //implementation("io.realm.kotlin:library-sync:1.11.0") - - val ktorVersion = "2.3.3" - //implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1") - implementation("io.github.xn32:json5k:0.3.0") - implementation("org.jetbrains.kotlinx:kotlinx-io-jvm:0.1.16") - implementation("io.ktor:ktor-server-core:$ktorVersion") - implementation("io.ktor:ktor-server-host-common:$ktorVersion") - implementation("io.ktor:ktor-server-status-pages:$ktorVersion") - implementation("io.ktor:ktor-server-netty:$ktorVersion") - implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion") - implementation("io.ktor:ktor-server-content-negotiation:$ktorVersion") - implementation("io.ktor:ktor-client-core:$ktorVersion") - implementation("io.ktor:ktor-client-cio:$ktorVersion") - implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion") - implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion") - //implementation("io.ktor:ktor-serialization-kotlinx-protobuf:$ktorVersion") - implementation("io.ktor:ktor-network-tls-certificates:$ktorVersion") - - /** - * 为什么不用Ktor的WebSocket呢? - * 因为那玩意使用了安卓9才有的Java API - */ - implementation("org.java-websocket:Java-WebSocket:1.5.4") + implementation(project(":protobuf")) + implementation(project(":annotations")) + ksp(project(":processor")) implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) - implementation("androidx.exifinterface:exifinterface:1.3.6") - implementation("com.google.protobuf:protobuf-java:3.24.0") - val roomVersion = "2.5.0" - implementation("androidx.room:room-runtime:$roomVersion") - //annotationProcessor("androidx.room:room-compiler:$roomVersion") - // To use Kotlin annotation processing tool (kapt) - kapt("androidx.room:room-compiler:$roomVersion") - // To use Kotlin Symbol Processing (KSP) - //ksp("androidx.room:room-compiler:$roomVersion") - // optional - Kotlin Extensions and Coroutines support for Room - implementation("androidx.room:room-ktx:$roomVersion") + DEPENDENCY_ANDROIDX.forEach { + implementation(it) + } + implementation(DEPENDENCY_JAVA_WEBSOCKET) + implementation(DEPENDENCY_PROTOBUF) + implementation(DEPENDENCY_JSON5K) + + implementation(room("runtime")) + kapt(room("compiler")) + implementation(room("ktx")) + + implementation(kotlinx("io-jvm", "0.1.16")) + implementation(kotlinx("serialization-protobuf", "1.6.2")) + + implementation(ktor("server", "core")) + implementation(ktor("server", "host-common")) + implementation(ktor("server", "status-pages")) + implementation(ktor("server", "netty")) + implementation(ktor("server", "content-negotiation")) + implementation(ktor("client", "core")) + implementation(ktor("client", "content-negotiation")) + implementation(ktor("client", "cio")) + implementation(ktor("serialization", "kotlinx-json")) + implementation(ktor("network", "tls-certificates")) testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") @@ -105,3 +99,4 @@ dependencies { androidTestImplementation("androidx.compose.ui:ui-test-junit4") } + diff --git a/xposed/src/androidTest/java/moe/fuqiuluo/xposed/ExampleInstrumentedTest.kt b/xposed/src/androidTest/java/moe/fuqiuluo/xposed/ExampleInstrumentedTest.kt deleted file mode 100644 index 2a17966..0000000 --- a/xposed/src/androidTest/java/moe/fuqiuluo/xposed/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package moe.fuqiuluo.xposed - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("moe.fuqiuluo.xposed.test", appContext.packageName) - } -} \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/proto/Proto.kt b/xposed/src/main/java/moe/fuqiuluo/proto/Proto.kt deleted file mode 100644 index acda873..0000000 --- a/xposed/src/main/java/moe/fuqiuluo/proto/Proto.kt +++ /dev/null @@ -1,69 +0,0 @@ -package moe.fuqiuluo.proto - -import com.google.protobuf.ByteString -import moe.fuqiuluo.proto.ProtoUtils.walkPairTags - -fun protobufOf(vararg pairs: Pair): ProtoMap { - val map = ProtoMap() - pairs.forEach { - val (k, v) = it - when (k) { - is Number -> map[k.toInt()] = ProtoUtils.any2proto(v!!) - is Pair<*, *> -> { - val tags = walkPairTags(k) - map.set(*tags.toIntArray(), v = ProtoUtils.any2proto(v!!)) - } - else -> error("Not support type for tag: ${k.toString()}") - } - } - return map -} - -fun protobufMapOf(struct: (ProtoMap) -> Unit): ProtoMap { - val map = ProtoMap() - struct.invoke(map) - return map -} - -val Number.proto: ProtoNumber - get() = ProtoNumber(this) - -val ByteString.proto: ProtoByteString - get() = ProtoByteString(this) - -val ByteArray.proto: ProtoByteString - get() = ProtoByteString(ByteString.copyFrom(this)) - -val String.proto: ProtoByteString - get() = ProtoByteString(ByteString.copyFromUtf8(this)) - -val ProtoValue.asString: ByteString - get() = (this as ProtoByteString).value - -val ProtoValue.asNumber: Number - get() = (this as ProtoNumber).value - -val ProtoValue.asInt: Int - get() = (this as ProtoNumber).value.toInt() - -val ProtoValue.asLong: Long - get() = (this as ProtoNumber).value.toLong() - -val ProtoValue.asULong: Long - get() = (this as ProtoNumber).value.toLong() and Long.MAX_VALUE - -val ProtoValue.asMap: ProtoMap - get() = (this as ProtoMap) - -val ProtoValue.asList: ProtoList - get() = (this as ProtoList) - -val ProtoValue.asByteArray: ByteArray - get() = if (this is ProtoMap) { - bytes?.toByteArray() ?: toByteArray() - } else { - (this as ProtoByteString).toByteArray() - } - -val ProtoValue.asUtf8String: String - get() = asByteArray.decodeToString() diff --git a/xposed/src/main/java/moe/fuqiuluo/proto/ProtoByteString.kt b/xposed/src/main/java/moe/fuqiuluo/proto/ProtoByteString.kt deleted file mode 100644 index 444805a..0000000 --- a/xposed/src/main/java/moe/fuqiuluo/proto/ProtoByteString.kt +++ /dev/null @@ -1,43 +0,0 @@ -package moe.fuqiuluo.proto - -import com.google.protobuf.ByteString -import com.google.protobuf.CodedOutputStream -import kotlinx.serialization.json.JsonElement -import moe.fuqiuluo.shamrock.tools.json -import moe.fuqiuluo.shamrock.tools.toHexString - -class ProtoByteString( - val value: ByteString -): ProtoValue, Iterable by value { - override fun toJson(): JsonElement { - return toByteArray().toHexString().json - } - - override fun computeSize(tag: Int): Int { - return CodedOutputStream.computeBytesSize(tag, value) - } - - override fun writeTo(output: CodedOutputStream, tag: Int) { - output.writeBytes(tag, value) - } - - fun toByteArray(): ByteArray { - return value.toByteArray() - } - - override fun equals(other: Any?): Boolean { - return this === other - } - - override fun hashCode(): Int { - return System.identityHashCode(this) - } - - fun toUtfString(): String { - return value.toStringUtf8() - } - - override fun toString(): String { - return "ByteString(${value.toByteArray().toHexString()})" - } -} \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/proto/ProtoList.kt b/xposed/src/main/java/moe/fuqiuluo/proto/ProtoList.kt deleted file mode 100644 index 33ad464..0000000 --- a/xposed/src/main/java/moe/fuqiuluo/proto/ProtoList.kt +++ /dev/null @@ -1,53 +0,0 @@ -package moe.fuqiuluo.proto - -import com.google.protobuf.CodedOutputStream -import kotlinx.serialization.json.JsonElement -import moe.fuqiuluo.shamrock.tools.jsonArray - -class ProtoList( - val value: ArrayList -): ProtoValue { - constructor(): this(arrayListOf()) - - override fun toJson(): JsonElement { - val array = arrayListOf() - value.forEach { - array.add(it.toJson()) - } - return array.jsonArray - } - - override fun computeSize(tag: Int): Int { - var size = 0 - value.forEach { - size += it.computeSize(tag) - } - return size - } - - override fun add(v: ProtoValue) { - value.add(v) - } - - override fun size(): Int { - return value.size - } - - override fun writeTo(output: CodedOutputStream, tag: Int) { - value.forEach { - it.writeTo(output, tag) - } - } - - override fun equals(other: Any?): Boolean { - return this === other - } - - override fun hashCode(): Int { - return System.identityHashCode(this) - } - - override fun toString(): String { - return toJson().toString() - } -} \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/proto/ProtoMap.kt b/xposed/src/main/java/moe/fuqiuluo/proto/ProtoMap.kt deleted file mode 100644 index ce06abd..0000000 --- a/xposed/src/main/java/moe/fuqiuluo/proto/ProtoMap.kt +++ /dev/null @@ -1,164 +0,0 @@ -package moe.fuqiuluo.proto - -import com.google.protobuf.ByteString -import com.google.protobuf.CodedOutputStream -import com.google.protobuf.WireFormat -import kotlinx.serialization.json.JsonElement -import moe.fuqiuluo.shamrock.tools.jsonObject - -class ProtoMap( - val value: HashMap, - val bytes: ByteString? -): ProtoValue { - constructor(): this(hashMapOf(), null) - constructor(value: HashMap): this(value, null) - - override fun has(vararg tags: Int): Boolean { - var curMap: ProtoMap = this - tags.forEachIndexed { index, tag -> - if (tag !in curMap) { - return false - } - if (index == tags.size - 1) { - return true - } - curMap = curMap[tag].asMap - } - return true - } - - override fun contains(tag: Int): Boolean { - return value.containsKey(tag) - } - - override fun set(tag: Int, v: ProtoValue) { - if (!contains(tag)) { - value[tag] = v - } else { - val oldValue = value[tag]!! - if (oldValue is ProtoList) { - oldValue.add(v) - } else { - value[tag] = ProtoList(arrayListOf(oldValue, v)) - } - } - } - - override fun set(tag: Int, v: Number) { - if (!contains(tag)) { - value[tag] = ProtoNumber(v) - } else { - val oldValue = value[tag]!! - if (oldValue is ProtoList) { - oldValue.add(v.proto) - } else { - value[tag] = ProtoList(arrayListOf(oldValue, v.proto)) - } - } - } - - override fun get(vararg tags: Int): ProtoValue { - var curMap = value - tags.forEachIndexed { index, tag -> - if (index == tags.size - 1) { - return curMap[tag] ?: error("pb[${tags.joinToString(", ")}][$index] Tag $tag not found") - } - curMap[tag]?.let { v -> - if (v is ProtoMap) { - curMap = v.value - } else { - return v - } - } ?: error("pb[${tags.joinToString(", ")}][$index] Tag $tag not found") - } - error("Instance is not ProtoMap for get(${tags.first()})") - } - - override fun size(): Int { - return value.size - } - - operator fun set(vararg tags: Int, v: ProtoValue) { - var curProtoMap: ProtoMap = this - tags.forEachIndexed { index, tag -> - if (index == tags.size - 1) { - return@forEachIndexed - } - if (!curProtoMap.contains(tag)) { - val tmp = ProtoMap() - curProtoMap[tag] = tmp - curProtoMap = tmp - } else { - curProtoMap = curProtoMap[tag].asMap - } - } - curProtoMap[tags.last()] = v - } - - operator fun set(vararg tags: Int, struct: (ProtoMap) -> Unit) { - val map = ProtoMap() - struct.invoke(map) - set(*tags, v = map) - } - - operator fun set(vararg tags: Int, v: String) { - set(*tags, v = v.proto) - } - - operator fun set(vararg tags: Int, v: ByteArray) { - set(*tags, v = v.proto) - } - - operator fun set(vararg tags: Int, v: Number) { - set(*tags, v = v.proto) - } - - operator fun set(vararg tags: Int, v: ByteString) { - set(*tags, v = v.proto) - } - - operator fun set(vararg tags: Int, v: Any) { - set(*tags, v = ProtoUtils.any2proto(v)) - } - - override fun toJson(): JsonElement { - val hashMap = hashMapOf() - value.forEach { (tag, field) -> - hashMap[tag.toString()] = field.toJson() - } - return hashMap.jsonObject - } - - override fun computeSize(tag: Int): Int { - var size = CodedOutputStream.computeTagSize(tag) - val dataSize = computeSizeDirectly() - size += ProtoUtils.computeRawVarint32Size(dataSize) - size += dataSize - return size - } - - override fun writeTo(output: CodedOutputStream, tag: Int) { - output.writeTag(tag, WireFormat.WIRETYPE_LENGTH_DELIMITED) - val dataSize = computeSizeDirectly() - output.writeUInt32NoTag(dataSize) - value.forEach { (tag, proto) -> - proto.writeTo(output, tag) - } - } - - override fun computeSizeDirectly(): Int { - var size = 0 - value.forEach { (tag, proto) -> - size += proto.computeSize(tag) - } - return size - } - - override fun toString(): String { - return toJson().toString() - } - - fun toByteArray(): ByteArray { - return ProtoUtils.encodeToByteArray(this) - } -} \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/proto/ProtoNumber.kt b/xposed/src/main/java/moe/fuqiuluo/proto/ProtoNumber.kt deleted file mode 100644 index 69cd557..0000000 --- a/xposed/src/main/java/moe/fuqiuluo/proto/ProtoNumber.kt +++ /dev/null @@ -1,45 +0,0 @@ -package moe.fuqiuluo.proto - -import com.google.protobuf.CodedOutputStream -import kotlinx.serialization.json.JsonElement -import moe.fuqiuluo.shamrock.tools.json - -class ProtoNumber( - val value: Number -): ProtoValue { - override fun toJson(): JsonElement { - return value.json - } - - override fun computeSize(tag: Int): Int { - return when (value) { - is Int -> CodedOutputStream.computeInt32Size(tag, value) - is Long -> CodedOutputStream.computeInt64Size(tag, value) - is Float -> CodedOutputStream.computeFloatSize(tag, value) - is Double -> CodedOutputStream.computeDoubleSize(tag, value) - else -> error("ProcCodec not support number type: ${value::class.simpleName}") - } - } - - override fun writeTo(output: CodedOutputStream, tag: Int) { - when (value) { - is Int -> output.writeInt32(tag, value) - is Long -> output.writeInt64(tag, value) - is Float -> output.writeFloat(tag, value) - is Double -> output.writeDouble(tag, value) - else -> error("ProcCodec not support number type: ${value::class.simpleName}") - } - } - - override fun equals(other: Any?): Boolean { - return this === other - } - - override fun hashCode(): Int { - return System.identityHashCode(this) - } - - override fun toString(): String { - return "Number($value)" - } -} \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/proto/ProtoUtils.kt b/xposed/src/main/java/moe/fuqiuluo/proto/ProtoUtils.kt deleted file mode 100644 index 0faf18f..0000000 --- a/xposed/src/main/java/moe/fuqiuluo/proto/ProtoUtils.kt +++ /dev/null @@ -1,115 +0,0 @@ -package moe.fuqiuluo.proto - -import com.google.protobuf.ByteString -import com.google.protobuf.CodedOutputStream -import com.google.protobuf.UnknownFieldSet - -object ProtoUtils { - fun decodeFromByteArray(data: ByteArray): ProtoMap { - val unknownFieldSet = UnknownFieldSet.parseFrom(data) - val dest = ProtoMap(hashMapOf(), ByteString.copyFrom(data)) - printUnknownFieldSet(unknownFieldSet, dest) - return dest - } - - fun encodeToByteArray(protoMap: ProtoMap): ByteArray { - val size = protoMap.computeSizeDirectly() - val dest = ByteArray(size) - val output = CodedOutputStream.newInstance(dest) - protoMap.value.forEach { (tag, proto) -> - proto.writeTo(output, tag) - } - output.checkNoSpaceLeft() - return dest - } - - internal fun computeRawVarint32Size(size: Int): Int { - if (size and -128 == 0) { - return 1 - } - if (size and -16384 == 0) { - return 2 - } - if (-2097152 and size == 0) { - return 3 - } - return if (size and -268435456 == 0) 4 else 5 - } - - internal fun any2proto(any: Any): ProtoValue { - return when(any) { - is Number -> any.proto - is ByteArray -> any.proto - is String -> any.proto - is ByteString -> any.proto - is Array<*> -> ProtoList(arrayListOf(*any.map { any2proto(it!!) }.toTypedArray())) - is Collection<*> -> ProtoList(arrayListOf(*any.map { any2proto(it!!) }.toTypedArray())) - is Map<*, *> -> ProtoMap().also { - any.forEach { (k, v) -> - when (k) { - is Number -> it[k.toInt()] = any2proto(v!!) - is Pair<*, *> -> { - val tags = walkPairTags(k) - it.set(*tags.toIntArray(), v = any2proto(v!!)) - } - else -> error("Not support type for tag: ${k.toString()}") - } - } - } - is Pair<*, *> -> { - val (tag, v) = any - val value = any2proto(v!!) - when (tag) { - is Pair<*, *> -> ProtoMap().apply { - val tags = walkPairTags(tag) - set(*tags.toIntArray(), v = value) - } - is Number -> ProtoMap(hashMapOf(tag.toInt() to value)) - else -> error("Not support type for tag: ${tag.toString()}") - } - } - else -> error("Not support type: ${any::class.simpleName}") - } - } - - fun walkPairTags(pair: Pair<*, *>, tags: MutableList = mutableListOf()): List { - val (k, v) = pair - if (k is Number) { - tags.add(k.toInt()) - } else { - walkPairTags(k as Pair<*, *>, tags) - } - tags.add(v as Int) - return tags - } - - private fun printUnknownFieldSet(set: UnknownFieldSet, dest: ProtoMap) { - set.asMap().forEach { (tag, field) -> - field.varintList.forEach { - dest[tag] = it - } - field.fixed32List.forEach { - dest[tag] = it - } - field.fixed64List.forEach { - dest[tag] = it - } - field.lengthDelimitedList.forEach { - try { - val unknownFieldSet = UnknownFieldSet.parseFrom(it) - val map = ProtoMap(hashMapOf(), it) - printUnknownFieldSet(unknownFieldSet, map) - dest[tag] = map - } catch (e: Throwable) { - dest[tag] = it.proto - } - } - field.groupList.forEach { - val map = ProtoMap() - printUnknownFieldSet(it, map) - dest[tag] = map - } - } - } -} - diff --git a/xposed/src/main/java/moe/fuqiuluo/proto/ProtoValue.kt b/xposed/src/main/java/moe/fuqiuluo/proto/ProtoValue.kt deleted file mode 100644 index dfde84d..0000000 --- a/xposed/src/main/java/moe/fuqiuluo/proto/ProtoValue.kt +++ /dev/null @@ -1,44 +0,0 @@ -package moe.fuqiuluo.proto - -import com.google.protobuf.CodedOutputStream -import kotlinx.serialization.json.JsonElement - -sealed interface ProtoValue { - fun toJson(): JsonElement - - fun computeSize(tag: Int): Int - - fun writeTo(output: CodedOutputStream, tag: Int) - - fun computeSizeDirectly(): Int { - return 0 - } - - fun has(vararg tags: Int): Boolean { - return false - } - - operator fun contains(tag: Int): Boolean { - return false - } - - operator fun set(tag: Int, v: ProtoValue) { - return - } - - operator fun set(tag: Int, v: Number) { - return - } - - operator fun get(vararg tags: Int): ProtoValue { - error("Instance is not ProtoMap for (${tags.first()})") - } - - fun add(v: ProtoValue) { - error("Instance is not ProtoList") - } - - fun size(): Int { - return 0 - } -} diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/entries/NtMessagePush.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/entries/NtMessagePush.kt deleted file mode 100644 index 47d01fc..0000000 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/entries/NtMessagePush.kt +++ /dev/null @@ -1,5 +0,0 @@ -@file:OptIn(ExperimentalSerializationApi::class) -package moe.fuqiuluo.qqinterface.entries - -import kotlinx.serialization.ExperimentalSerializationApi -import kotlinx.serialization.Serializable diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/BaseSvc.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/BaseSvc.kt index 51555dd..9014c96 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/BaseSvc.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/BaseSvc.kt @@ -13,17 +13,16 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withTimeoutOrNull -import moe.fuqiuluo.proto.protobufOf +import kotlinx.serialization.encodeToByteArray +import kotlinx.serialization.protobuf.ProtoBuf import moe.fuqiuluo.shamrock.utils.PlatformUtils import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher -import moe.fuqiuluo.shamrock.xposed.helper.PacketHandler import moe.fuqiuluo.shamrock.xposed.helper.internal.DynamicReceiver import moe.fuqiuluo.shamrock.xposed.helper.internal.IPCRequest +import moe.whitechi73.protobuf.oidb.TrpcOidb import mqq.app.MobileQQ import tencent.im.oidb.oidb_sso -import kotlin.concurrent.timer import kotlin.coroutines.resume -import kotlin.coroutines.suspendCoroutine internal abstract class BaseSvc { companion object { @@ -95,12 +94,15 @@ internal abstract class BaseSvc { fun sendTrpcOidb(cmd: String, cmdId: Int, serviceId: Int, buffer: ByteArray, seq: Int = -1) { val to = createToServiceMsg(cmd) - to.putWupBuffer(protobufOf( - 1 to cmdId, - 2 to serviceId, - 4 to buffer, - 12 to 0 - ).toByteArray()) + + val oidb = TrpcOidb( + cmd = cmdId, + service = serviceId, + buffer = buffer, + flag = 0 + ) + to.putWupBuffer(ProtoBuf.encodeToByteArray(oidb)) + to.addAttribute("req_pb_protocol_flag", true) if (seq != -1) { to.addAttribute("shamrock_seq", seq) diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/FileSvc.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/FileSvc.kt index d65c928..fc24722 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/FileSvc.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/FileSvc.kt @@ -1,7 +1,9 @@ package moe.fuqiuluo.qqinterface.servlet import com.tencent.mobileqq.pb.ByteStringMicro -import moe.fuqiuluo.proto.protobufOf +import kotlinx.serialization.decodeFromByteArray +import kotlinx.serialization.encodeToByteArray +import kotlinx.serialization.protobuf.ProtoBuf import moe.fuqiuluo.qqinterface.servlet.structures.* import moe.fuqiuluo.qqinterface.servlet.transfile.RichProtoSvc import moe.fuqiuluo.shamrock.helper.Level @@ -10,56 +12,100 @@ import moe.fuqiuluo.shamrock.tools.EMPTY_BYTE_ARRAY import moe.fuqiuluo.shamrock.tools.slice import moe.fuqiuluo.shamrock.tools.toHexString import moe.fuqiuluo.shamrock.utils.DeflateTools +import moe.whitechi73.protobuf.oidb.cmd0x6d7.CreateFolderReq +import moe.whitechi73.protobuf.oidb.cmd0x6d7.DeleteFolderReq +import moe.whitechi73.protobuf.oidb.cmd0x6d7.MoveFolderReq +import moe.whitechi73.protobuf.oidb.cmd0x6d7.Oidb0x6d7ReqBody +import moe.whitechi73.protobuf.oidb.cmd0x6d7.Oidb0x6d7RespBody +import moe.whitechi73.protobuf.oidb.cmd0x6d7.RenameFolderReq +import tencent.im.oidb.cmd0x6d6.oidb_0x6d6 import tencent.im.oidb.cmd0x6d8.oidb_0x6d8 import tencent.im.oidb.oidb_sso +import moe.whitechi73.protobuf.group_file_common.FolderInfo as GroupFileCommonFolderInfo internal object FileSvc: BaseSvc() { - fun createFileFolder(groupId: String, folderName: String) { - sendOidb("OidbSvc.0x6d7_0", 1751, 0, protobufOf( - 1 to mapOf( - 1 to groupId.toLong(), - 2 to 3, - 3 to "/", - 4 to folderName + suspend fun createFileFolder(groupId: String, folderName: String, parentFolderId: String = "/"): Result { + val data = ProtoBuf.encodeToByteArray(Oidb0x6d7ReqBody( + createFolder = CreateFolderReq( + groupCode = groupId.toULong(), + appId = 3u, + parentFolderId = parentFolderId, + folderName = folderName ) - ).toByteArray()) - } - - fun deleteGroupFolder(groupId: String, folderUid: String) { - sendOidb("OidbSvc.0x6d7_1", 1751, 1, protobufOf( - 2 to mapOf( - 1 to groupId.toLong(), - 2 to 3, - 3 to folderUid, - ) - ).toByteArray()) - } - - fun deleteGroupFile(groupId: String, bizId: Int, fileUid: String) { - /* - val kernelService = NTServiceFetcher.kernelService - val sessionService = kernelService.wrapperSession - val richMediaService = sessionService.richMediaService - - val result = withTimeoutOrNull(3000L) { - suspendCancellableCoroutine { - richMediaService.deleteGroupFile(groupId.toLong(), fileUid, bizId) { code, _, result -> - it.resume(code to result.result) - } - } + )) + val resultBuffer = sendOidbAW("OidbSvc.0x6d7_0", 1751, 0, data) + ?: return Result.failure(Exception("unable to fetch result")) + val oidbPkg = oidb_sso.OIDBSSOPkg() + oidbPkg.mergeFrom(resultBuffer.slice(4)) + val rsp = ProtoBuf.decodeFromByteArray(oidbPkg.bytes_bodybuffer.get().toByteArray()) + if (rsp.createFolder?.retCode != 0) { + return Result.failure(Exception("unable to create folder: ${rsp.createFolder?.retCode}")) } + return Result.success(rsp.createFolder!!.folderInfo!!) + } - return if (result == null) Result.failure(RuntimeException("delete group file timeout")) else Result.success(result)*/ - // 调用QQ内部实现会导致闪退! - sendOidb("OidbSvc.0x6d6_3", 1750, 3, protobufOf( - 4 to mapOf( - 1 to groupId.toLong(), - 2 to 3, - 3 to bizId, - 4 to "/", - 5 to fileUid + suspend fun deleteGroupFolder(groupId: String, folderUid: String): Boolean { + val buffer = sendOidbAW("OidbSvc.0x6d7_1", 1751, 1, ProtoBuf.encodeToByteArray(Oidb0x6d7ReqBody( + deleteFolder = DeleteFolderReq( + groupCode = groupId.toULong(), + appId = 3u, + folderId = folderUid ) - ).toByteArray()) + ))) ?: return false + val oidbPkg = oidb_sso.OIDBSSOPkg() + oidbPkg.mergeFrom(buffer.slice(4)) + val rsp = ProtoBuf.decodeFromByteArray(oidbPkg.bytes_bodybuffer.get().toByteArray()) + return rsp.deleteFolder?.retCode == 0 + } + + suspend fun moveGroupFolder(groupId: String, folderUid: String, newParentFolderUid: String): Boolean { + val buffer = sendOidbAW("OidbSvc.0x6d7_2", 1751, 2, ProtoBuf.encodeToByteArray(Oidb0x6d7ReqBody( + moveFolder = MoveFolderReq( + groupCode = groupId.toULong(), + appId = 3u, + folderId = folderUid, + parentFolderId = "/" + ) + ))) ?: return false + val oidbPkg = oidb_sso.OIDBSSOPkg() + oidbPkg.mergeFrom(buffer.slice(4)) + val rsp = ProtoBuf.decodeFromByteArray(oidbPkg.bytes_bodybuffer.get().toByteArray()) + return rsp.moveFolder?.retCode == 0 + } + + suspend fun renameFolder(groupId: String, folderUid: String, name: String): Boolean { + val buffer = sendOidbAW("OidbSvc.0x6d7_3", 1751, 3, ProtoBuf.encodeToByteArray(Oidb0x6d7ReqBody( + renameFolder = RenameFolderReq( + groupCode = groupId.toULong(), + appId = 3u, + folderId = folderUid, + folderName = name + ) + ))) ?: return false + val oidbPkg = oidb_sso.OIDBSSOPkg() + oidbPkg.mergeFrom(buffer.slice(4)) + val rsp = ProtoBuf.decodeFromByteArray(oidbPkg.bytes_bodybuffer.get().toByteArray()) + return rsp.renameFolder?.retCode == 0 + } + + suspend fun deleteGroupFile(groupId: String, bizId: Int, fileUid: String): Boolean { + val oidb0x6d6ReqBody = oidb_0x6d6.ReqBody().apply { + delete_file_req.set(oidb_0x6d6.DeleteFileReqBody().apply { + uint64_group_code.set(groupId.toLong()) + uint32_app_id.set(3) + uint32_bus_id.set(bizId) + str_parent_folder_id.set("/") + str_file_id.set(fileUid) + }) + } + val result = sendOidbAW("OidbSvc.0x6d6_3", 1750, 3, oidb0x6d6ReqBody.toByteArray()) + ?: return false + val oidbPkg = oidb_sso.OIDBSSOPkg() + oidbPkg.mergeFrom(result.slice(4)) + val rsp = oidb_0x6d6.RspBody().apply { + mergeFrom(oidbPkg.bytes_bodybuffer.get().toByteArray()) + } + return rsp.delete_file_rsp.int32_ret_code.get() == 0 } suspend fun getGroupFileSystemInfo(groupId: Long): FileSystemInfo { diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/FriendSvc.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/FriendSvc.kt index 44b44e1..953239b 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/FriendSvc.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/FriendSvc.kt @@ -16,13 +16,8 @@ import kotlinx.coroutines.suspendCancellableCoroutine import moe.fuqiuluo.shamrock.tools.slice import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher import mqq.app.AppRuntime -import tencent.mobileim.structmsg.`structmsg$FlagInfo` -import tencent.mobileim.structmsg.`structmsg$ReqSystemMsgNew` -import tencent.mobileim.structmsg.`structmsg$RspSystemMsgNew` +import tencent.mobileim.structmsg.structmsg import kotlin.coroutines.resume -import tencent.mobileim.structmsg.`structmsg$SystemMsgActionInfo` as ActionInfo -import tencent.mobileim.structmsg.`structmsg$AddFrdSNInfo` as AddFrdSNInfo -import tencent.mobileim.structmsg.`structmsg$StructMsg` as StructMsg internal object FriendSvc: BaseSvc() { @@ -43,30 +38,31 @@ internal object FriendSvc: BaseSvc() { if (app !is AppInterface) throw RuntimeException("AppRuntime cannot cast to AppInterface") val service = QRoute.api(IAddFriendTempApi::class.java) - val action = ActionInfo() + val action = structmsg.SystemMsgActionInfo() action.type.set(if (approve != false) 2 else 3) action.group_id.set(0) action.remark.set(remark) - val snInfo = AddFrdSNInfo() + val snInfo = structmsg.AddFrdSNInfo() snInfo.uint32_not_see_dynamic.set(if (notSee != false) 1 else 0) snInfo.uint32_set_sn.set(0) action.addFrdSNInfo.set(snInfo) - service.sendFriendSystemMsgAction(1, msgSeq, uin, 1, 2004, 11, 0, action, 0, StructMsg(), false, + service.sendFriendSystemMsgAction(1, msgSeq, uin, 1, 2004, 11, 0, action, 0, + structmsg.StructMsg(), false, app ) } - suspend fun requestFriendSystemMsgNew(msgNum: Int, latestFriendSeq: Long = 0, latestGroupSeq: Long = 0, retryCnt: Int = 3): List? { + suspend fun requestFriendSystemMsgNew(msgNum: Int, latestFriendSeq: Long = 0, latestGroupSeq: Long = 0, retryCnt: Int = 3): List? { if (retryCnt < 0) { return ArrayList() } - val req = `structmsg$ReqSystemMsgNew`() + val req = structmsg.ReqSystemMsgNew() req.msg_num.set(msgNum) req.latest_friend_seq.set(latestFriendSeq) req.latest_group_seq.set(latestGroupSeq) req.version.set(1000) req.checktype.set(2) - val flag = `structmsg$FlagInfo`() + val flag = structmsg.FlagInfo() // flag.GrpMsg_Kick_Admin.set(1) // flag.GrpMsg_HiddenGrp.set(1) // flag.GrpMsg_WordingDown.set(1) @@ -95,7 +91,7 @@ internal object FriendSvc: BaseSvc() { ArrayList() } else { try { - val msg = `structmsg$RspSystemMsgNew`() + val msg = structmsg.RspSystemMsgNew() msg.mergeFrom(respBuffer.slice(4)) return msg.friendmsgs.get() } catch (err: Throwable) { diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GroupSvc.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GroupSvc.kt index f6c21e1..1c7b0fe 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GroupSvc.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GroupSvc.kt @@ -46,10 +46,6 @@ import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.decodeFromStream import kotlinx.serialization.json.jsonObject -import moe.fuqiuluo.proto.ProtoUtils -import moe.fuqiuluo.proto.asInt -import moe.fuqiuluo.proto.asUtf8String -import moe.fuqiuluo.proto.protobufOf import moe.fuqiuluo.qqinterface.servlet.TicketSvc.getLongUin import moe.fuqiuluo.qqinterface.servlet.TicketSvc.getUin import moe.fuqiuluo.qqinterface.servlet.structures.GroupAtAllRemainInfo @@ -85,17 +81,16 @@ import tencent.im.oidb.cmd0x89a.oidb_0x89a import tencent.im.oidb.cmd0x8a0.oidb_0x8a0 import tencent.im.oidb.cmd0x8a7.cmd0x8a7 import tencent.im.oidb.cmd0x8fc.Oidb_0x8fc +import tencent.im.oidb.cmd0xeac.oidb_0xeac import tencent.im.oidb.cmd0xeb7.oidb_0xeb7 +import tencent.im.oidb.cmd0xed3.oidb_cmd0xed3 import tencent.im.oidb.oidb_sso import tencent.im.troop.honor.troop_honor +import tencent.mobileim.structmsg.structmsg import java.lang.reflect.Method import java.lang.reflect.Modifier import java.nio.ByteBuffer import kotlin.coroutines.resume -import tencent.mobileim.structmsg.`structmsg$FlagInfo` as FlagInfo -import tencent.mobileim.structmsg.`structmsg$ReqSystemMsgNew` as ReqSystemMsgNew -import tencent.mobileim.structmsg.`structmsg$RspSystemMsgNew` as RspSystemMsgNew -import tencent.mobileim.structmsg.`structmsg$StructMsg` as StructMsg internal object GroupSvc: BaseSvc() { private val RefreshTroopMemberInfoLock by lazy { @@ -155,11 +150,12 @@ internal object GroupSvc: BaseSvc() { } fun poke(groupId: String, userId: String) { - sendOidb("OidbSvc.0xed3", 3795, 1, protobufOf( - 1 to userId.toLong(), - 2 to groupId.toLong(), - 3 to 0 - ).toByteArray()) + val req = oidb_cmd0xed3.ReqBody().apply { + uint64_group_code.set(groupId.toLong()) + uint64_to_uin.set(userId.toLong()) + uint32_msg_seq.set(0) + } + sendOidb("OidbSvc.0xed3", 3795, 1, req.toByteArray()) } suspend fun getGroupMemberList(groupId: String, refresh: Boolean): Result> { @@ -272,46 +268,42 @@ internal object GroupSvc: BaseSvc() { } suspend fun setEssenceMessage(groupId: Long, seq: Long, rand: Long): Pair { - val array = protobufOf( - 1 to groupId, - 2 to seq, - 3 to rand - ).toByteArray() - val buffer = sendOidbAW("OidbSvc.0xeac_1", 3756, 1, array) - ?: return Pair(false, "unknown error") + val buffer = sendOidbAW("OidbSvc.0xeac_1", 3756, 1, oidb_0xeac.ReqBody().apply { + group_code.set(groupId) + msg_seq.set(seq.toInt()) + msg_random.set(rand.toInt()) + }.toByteArray()) ?: return Pair(false, "unknown error") val body = oidb_sso.OIDBSSOPkg() body.mergeFrom(buffer.slice(4)) - val result = ProtoUtils.decodeFromByteArray(body.bytes_bodybuffer.get().toByteArray()) - return if (result.has(1)) { - LogCenter.log("设置群精华失败: ${result[1].asUtf8String}") - Pair(false, "设置群精华失败: ${result[1].asUtf8String}") + val result = oidb_0xeac.RspBody().mergeFrom(body.bytes_bodybuffer.get().toByteArray()) + return if (result.wording.has()) { + LogCenter.log("设置群精华失败: ${result.wording.get()}") + Pair(false, "设置群精华失败: ${result.wording.get()}") } else { - LogCenter.log("设置群精华 -> $groupId:$seq") + LogCenter.log("设置群精华 -> $groupId: $seq") Pair(true, "ok") } } suspend fun deleteEssenceMessage(groupId: Long, seq: Long, rand: Long): Pair { - val array = protobufOf( - 1 to groupId, - 2 to seq, - 3 to rand - ).toByteArray() - val buffer = sendOidbAW("OidbSvc.0xeac_2", 3756, 2, array) + val buffer = sendOidbAW("OidbSvc.0xeac_2", 3756, 2, oidb_0xeac.ReqBody().apply { + group_code.set(groupId) + msg_seq.set(seq.toInt()) + msg_random.set(rand.toInt()) + }.toByteArray()) val body = oidb_sso.OIDBSSOPkg() if (buffer == null) { return Pair(false, "unknown error") } body.mergeFrom(buffer.slice(4)) - val result = ProtoUtils.decodeFromByteArray(body.bytes_bodybuffer.get().toByteArray()) - return if (result.has(1)) { - LogCenter.log("移除群精华失败: ${result[1].asUtf8String}") - Pair(false, "移除群精华失败: ${result[1].asUtf8String}") + val result = oidb_0xeac.RspBody().mergeFrom(body.bytes_bodybuffer.get().toByteArray()) + return if (result.wording.has()) { + LogCenter.log("移除群精华失败: ${result.wording.get()}") + Pair(false, "移除群精华失败: ${result.wording.get()}") } else { - LogCenter.log("移除群精华 -> $groupId:$seq") + LogCenter.log("移除群精华 -> $groupId: $seq") Pair(true, "ok") } - } fun setGroupAdmin(groupId: Long, userId: Long, enable: Boolean) { @@ -550,12 +542,12 @@ internal object GroupSvc: BaseSvc() { } } - suspend fun getTroopMemberInfoByUid(groupId: String, uid: String): Result { + suspend fun getTroopMemberInfoByUid(groupId: Long, uid: String): Result { val kernelService = NTServiceFetcher.kernelService val sessionService = kernelService.wrapperSession val groupService = sessionService.groupService val info = suspendCancellableCoroutine { - groupService.getTransferableMemberInfo(groupId.toLong()) { code, _, data -> + groupService.getTransferableMemberInfo(groupId) { code, _, data -> if (code != 0) { it.resume(null) return@getTransferableMemberInfo @@ -740,72 +732,56 @@ internal object GroupSvc: BaseSvc() { notSee: Boolean? = false, subType: String ): Result{ - // 实在找不到接口了 发pb吧 - val buffer: ByteArray - when (subType) { - "invite" -> { - buffer = protobufOf( - 1 to 1, - 2 to msgSeq, - 3 to uin, // self - 4 to 1, - 5 to 3, - 6 to 10016, - 7 to 2, - 8 to mapOf( - 1 to if (approve != false) 11 else 12, - 2 to gid - ), - 9 to 1000 - ).toByteArray() - } - "add" -> { - buffer = protobufOf( - 1 to 2, - 2 to msgSeq, - 3 to uin, - 4 to 1, - 5 to 2, - 6 to 30024, - 7 to 1, - 8 to mapOf( - 1 to if (approve != false) 11 else 12, - 2 to gid, - 50 to msg, - 53 to if (notSee != false) 1 else 0 - ), - 9 to 1000 - ).toByteArray() - } - else -> { - return Result.failure(Exception("不支持的sub_type")) - } - } - val respBuffer = sendBufferAW("ProfileService.Pb.ReqSystemMsgAction.Group", true, buffer) - ?: return Result.failure(Exception("操作失败")) - val result = ProtoUtils.decodeFromByteArray(respBuffer.slice(4)) - return if (result.has(1, 1)) { - if (result[1, 1].asInt == 0) { - Result.success(result[2].asUtf8String) + val req = structmsg.ReqSystemMsgAction().apply { + if (subType == "invite") { + msg_type.set(1) + src_id.set(3) + sub_src_id.set(10016) + group_msg_type.set(2) } else { - Result.failure(Exception(result[1, 2].asUtf8String)) + msg_type.set(2) + src_id.set(2) + sub_src_id.set(30024) + group_msg_type.set(1) + } + msg_seq.set(msgSeq) + req_uin.set(uin) + sub_type.set(1) + action_info.set(structmsg.SystemMsgActionInfo().apply { + type.set(if (approve != false) 11 else 12) + group_code.set(gid) + if (subType == "add") { + this.msg.set(msg) + this.blacklist.set(notSee != false) + } + }) + language.set(1000) + } + val respBuffer = sendBufferAW("ProfileService.Pb.ReqSystemMsgAction.Group", true, req.toByteArray()) + ?: return Result.failure(Exception("操作失败")) + val rsp = structmsg.RspSystemMsgAction().mergeFrom(respBuffer.slice(4)) + return if (rsp.head.result.has()) { + if (rsp.head.result.get() == 0) { + Result.success(rsp.msg_detail.get()) + } else { + Result.failure(Exception(rsp.head.msg_fail.get())) } } else { Result.failure(Exception("操作失败")) } } - suspend fun requestGroupSystemMsgNew(msgNum: Int, reqMsgType: Int = 1, latestFriendSeq: Long = 0, latestGroupSeq: Long = 0, retryCnt: Int = 5): List { + suspend fun requestGroupSystemMsgNew(msgNum: Int, reqMsgType: Int = 1, latestFriendSeq: Long = 0, latestGroupSeq: Long = 0, retryCnt: Int = 5): List { if (retryCnt < 0) { return ArrayList() } - val req = ReqSystemMsgNew() + val req = structmsg.ReqSystemMsgNew() req.msg_num.set(msgNum) req.latest_friend_seq.set(latestFriendSeq) req.latest_group_seq.set(latestGroupSeq) req.version.set(1000) req.checktype.set(3) - val flag = FlagInfo() + val flag = structmsg.FlagInfo() flag.GrpMsg_Kick_Admin.set(1) flag.GrpMsg_HiddenGrp.set(1) flag.GrpMsg_WordingDown.set(1) @@ -834,7 +810,7 @@ internal object GroupSvc: BaseSvc() { ArrayList() } else { try { - val msg = RspSystemMsgNew() + val msg = structmsg.RspSystemMsgNew() msg.mergeFrom(respBuffer.slice(4)) return msg.groupmsgs.get().orEmpty() } catch (err: Throwable) { @@ -873,7 +849,7 @@ internal object GroupSvc: BaseSvc() { messageSeq = msgSeq, messageContent = obj["msg_content"] ?: EmptyJsonArray ) - val mapping = MessageHelper.getMsgMappingBySeq(MsgConstant.KCHATTYPEGROUP, msgSeq) + val mapping = MessageHelper.getMsgMappingBySeq(MsgConstant.KCHATTYPEGROUP, groupId.toString(), msgSeq) if (mapping != null) { msg.messageId = mapping.msgHashId } diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/PacketSvc.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/PacketSvc.kt index 7fd8ccc..d667d75 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/PacketSvc.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/PacketSvc.kt @@ -10,33 +10,36 @@ import io.ktor.utils.io.core.writeFully import io.ktor.utils.io.core.writeInt import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withTimeoutOrNull -import moe.fuqiuluo.proto.protobufOf -import moe.fuqiuluo.shamrock.helper.MessageHelper +import kotlinx.serialization.encodeToByteArray +import kotlinx.serialization.protobuf.ProtoBuf import moe.fuqiuluo.shamrock.remote.action.handlers.GetHistoryMsg import moe.fuqiuluo.shamrock.remote.service.listener.AioListener import moe.fuqiuluo.shamrock.tools.broadcast import moe.fuqiuluo.shamrock.utils.DeflateTools +import moe.whitechi73.protobuf.message.JsonElement +import moe.whitechi73.protobuf.message.MessageBody +import moe.whitechi73.protobuf.message.MessageContentHead +import moe.whitechi73.protobuf.message.MessageElement +import moe.whitechi73.protobuf.message.MessageElementList +import moe.whitechi73.protobuf.message.MessageHead +import moe.whitechi73.protobuf.message.RichMessage +import moe.whitechi73.protobuf.push.MessagePush import mqq.app.MobileQQ import kotlin.coroutines.resume -import kotlin.coroutines.suspendCoroutine -import kotlin.math.abs -import kotlin.random.Random -import kotlin.random.nextInt -import kotlin.random.nextLong internal object PacketSvc: BaseSvc() { /** * 伪造收到Json卡片消息 */ suspend fun fakeSelfRecvJsonMsg(msgService: IKernelMsgService, content: String): Long { - return fakeReceiveSelfMsg(msgService) { arrayOf( - mapOf( - 51 to 1 to (byteArrayOf(1) + DeflateTools.compress(content.toByteArray())) - ) - ) } + return fakeReceiveSelfMsg(msgService) { + listOf(MessageElement( + json = JsonElement((byteArrayOf(1) + DeflateTools.compress(content.toByteArray()))) + )) + } } - private suspend fun fakeReceiveSelfMsg(msgService: IKernelMsgService, builder: () -> Array>): Long { + private suspend fun fakeReceiveSelfMsg(msgService: IKernelMsgService, builder: () -> List): Long { val latestMsg = withTimeoutOrNull(3000) { suspendCancellableCoroutine { msgService.getMsgs(Contact(MsgConstant.KCHATTYPEC2C, app.currentUid, ""), 0L, 1, true) { code, why, msgs -> @@ -45,30 +48,33 @@ internal object PacketSvc: BaseSvc() { } }?.data?.firstOrNull() val msgSeq = (latestMsg?.msgSeq ?: 0) + 1 - fakeReceive("trpc.msg.olpush.OlPushService.MsgPush", 10000, protobufOf( - 1 to mapOf( - 1 to mapOf( - 1 to app.currentUin.toLong(), - 2 to app.currentUid, - 3 to 1001, - 5 to app.currentUin.toLong(), - 6 to app.currentUid + + val msgPush = MessagePush( + msgBody = MessageBody( + msgHead = MessageHead( + peer = app.longAccountUin, + peerUid = app.currentUid, + flag = 1001, + receiver = app.longAccountUin, + receiverUid = app.currentUid ), - 2 to mapOf( - 1 to 166, - 3 to 11, - 4 to msgSeq, - 5 to msgSeq, - 6 to (System.currentTimeMillis() / 1000).toInt(), - 7 to 1, - 11 to msgSeq, - 12 to msgService.getMsgUniqueId(System.currentTimeMillis()), - 14 to msgSeq - 2, - 28 to msgSeq + contentHead = MessageContentHead( + msgType = 166, + msgSubType = 11, + msgSeq = msgSeq, + u1 = msgSeq, + msgTime = System.currentTimeMillis() / 1000, + u2 = 1, + u3 = msgSeq, + msgRandom = msgService.getMsgUniqueId(System.currentTimeMillis()), + u4 = msgSeq - 2, + u5 = msgSeq ), - 3 to 1 to 2 to builder() + richMsg = RichMessage(MessageElementList(builder())) ) - ).toByteArray()) + ) + + fakeReceive("trpc.msg.olpush.OlPushService.MsgPush", 10000, ProtoBuf.encodeToByteArray(msgPush)) return withTimeoutOrNull(5000L) { suspendCancellableCoroutine { AioListener.messageLessListenerMap[msgSeq] = { diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/QFavSvc.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/QFavSvc.kt index 7a4d70b..d616087 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/QFavSvc.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/QFavSvc.kt @@ -1,3 +1,5 @@ +@file:OptIn(ExperimentalSerializationApi::class) + package moe.fuqiuluo.qqinterface.servlet import android.graphics.BitmapFactory @@ -12,7 +14,9 @@ import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.io.core.BytePacketBuilder import kotlinx.io.core.readBytes import kotlinx.io.core.writeFully -import moe.fuqiuluo.proto.protobufMapOf +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.encodeToByteArray +import kotlinx.serialization.protobuf.ProtoBuf import moe.fuqiuluo.shamrock.helper.Level import moe.fuqiuluo.shamrock.helper.LogCenter import moe.fuqiuluo.shamrock.tools.hex2ByteArray @@ -20,6 +24,18 @@ import moe.fuqiuluo.shamrock.tools.toHexString import moe.fuqiuluo.shamrock.utils.DeflateTools import moe.fuqiuluo.shamrock.utils.MD5 import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher +import moe.whitechi73.protobuf.fav.WeiyunAddRichMediaReq +import moe.whitechi73.protobuf.fav.WeiyunAuthor +import moe.whitechi73.protobuf.fav.WeiyunCollectCommInfo +import moe.whitechi73.protobuf.fav.WeiyunComm +import moe.whitechi73.protobuf.fav.WeiyunCommonReq +import moe.whitechi73.protobuf.fav.WeiyunFastUploadResourceReq +import moe.whitechi73.protobuf.fav.WeiyunGetFavContentReq +import moe.whitechi73.protobuf.fav.WeiyunGetFavListReq +import moe.whitechi73.protobuf.fav.WeiyunMsgHead +import moe.whitechi73.protobuf.fav.WeiyunPicInfo +import moe.whitechi73.protobuf.fav.WeiyunRichMediaContent +import moe.whitechi73.protobuf.fav.WeiyunRichMediaSummary import mqq.manager.TicketManager import oicq.wlogin_sdk.request.Ticket import oicq.wlogin_sdk.request.WtTicketPromise @@ -56,40 +72,30 @@ internal object QFavSvc: BaseSvc() { startPos: Int, pageSize: Int, ): Result { - val data = protobufMapOf { - it[1] = mapOf( - 20000 to mapOf( - /** - * "type", "bid", "category", "start_time", "order_type", "start_pos", "page_size", "sync_policy", "req_source" - */ - 1 to 0, - 2 to 0, - 3 to category, - //4 to System.currentTimeMillis() - 1000 * 60, - //4 to System.currentTimeMillis(), - 4 to 0, - 5 to 0, - 6 to startPos, - 7 to pageSize, - 8 to 0, - 9 to 0 - ) + val baseReq = WeiyunCommonReq( + getFavListReq = WeiyunGetFavListReq( + type = 0u, + bid = 0u, + category = category.toUInt(), + startTime = 0u, + orderType = 0u, + startPos = startPos.toUInt(), + pageSize = pageSize.toUInt(), + syncPolicy = 0u, + reqSource = 0u ) - }.toByteArray() - return sendWeiyunReq(20000, data) + ) + return sendWeiyunReq(20000, baseReq) } suspend fun getItemContent( id: String ): Result { - val data = protobufMapOf { - it[1] = mapOf( - 20001 to mapOf( - 1 to id - ) + return sendWeiyunReq(20001, WeiyunCommonReq( + getFavContentReq = WeiyunGetFavContentReq( + cidList = arrayListOf(id) ) - }.toByteArray() - return sendWeiyunReq(20001, data) + )) } suspend fun addImageMsg( @@ -104,57 +110,60 @@ internal object QFavSvc: BaseSvc() { md5: String, ): Result { val md5Bytes = md5.hex2ByteArray() - val data = protobufMapOf { - it[1] = mapOf( - 20009 to mapOf( - 1 to mapOf( - 1 to 1, // bid - 2 to 1, // category - 3 to mapOf( // author - 1 to if (groupId == 0L) 1 else 2, // type - 2 to uin, // num_id - 3 to name, // str_id - 4 to groupId, // group_id - 5 to groupName // group_name - ), - 4 to System.currentTimeMillis() - 2000, // create_time - 5 to System.currentTimeMillis() - 1000, // sequence - 7 to """{"recordAudioOnly":false,"audioOnly":false,"fileOnly":false}""", - 9 to 0, // original_app_id - 10 to 0 // custom_group_id + return sendWeiyunReq(20009, WeiyunCommonReq( + addRichMediaReq = WeiyunAddRichMediaReq( + commInfo = WeiyunCollectCommInfo( + bid = 1u, + category = 1u, + author = WeiyunAuthor( + type = if (groupId == 0L) 1u else 2u, + numId = uin.toULong(), + strId = name, + groupId = groupId.toULong(), + groupName = groupName ), - 2 to mapOf( - 1 to "", - 3 to "[图片]", - 4 to mapOf( - 1 to picUrl, - 2 to md5Bytes, - 3 to md5, - 6 to width, - 7 to height, - 8 to size, - 9 to 0, - 11 to pid - ), - 5 to 1 - ), - 3 to mapOf( - 2 to """""", - 4 to mapOf( - 1 to picUrl, - 2 to md5Bytes, - 3 to md5, - 6 to width, - 7 to height, - 8 to size, - 9 to 0, - 11 to pid + createTime = System.currentTimeMillis().toULong() - 2000u, + seq = System.currentTimeMillis().toULong() - 1000u, + bizDataList = arrayListOf("""{"recordAudioOnly":false,"audioOnly":false,"fileOnly":false}""".toByteArray()), + originalAppId = 0u, + customGroupId = 0u + ), + summary = WeiyunRichMediaSummary( + title = "", + brief = "[图片]", + picList = arrayListOf( + WeiyunPicInfo( + uri = picUrl, + md5 = md5Bytes, + sha1 = md5.toByteArray(), + name = "", + note = "", + width = width.toUInt(), + height = height.toUInt(), + size = size.toULong(), + type = 0u, + picId = pid ) - ) - ) + ), + contentType = 1u + ), + richMediaContent = listOf(WeiyunRichMediaContent( + rawData = """""".toByteArray(), + picList = listOf(WeiyunPicInfo( + uri = picUrl, + md5 = md5Bytes, + sha1 = md5.toByteArray(), + name = "", + note = "", + width = width.toUInt(), + height = height.toUInt(), + size = size.toULong(), + type = 0u, + picId = pid + )) + )) ) - }.toByteArray() - return sendWeiyunReq(20009, data) + )) } suspend fun applyUpImageMsg( @@ -169,29 +178,26 @@ internal object QFavSvc: BaseSvc() { return Result.failure(IllegalArgumentException("image file not exists")) } val md5 = MD5.genFileMd5(image.absolutePath) - val data = protobufMapOf { - it[1] = mapOf( - 20010 to mapOf( - 1 to mapOf( - 2 to md5, - 4 to md5.toHexString(), - 10 to mapOf( // author - 1 to if (groupId == 0L) 1 else 2, // type - 2 to uin, // num_id - 3 to name, // str_id - 4 to groupId, // group_id - 5 to groupName // group_name - ), - 6 to width, // width - 7 to height, - 8 to image.length(), - 9 to 1, // type - 11 to "/storage/emulated/0/DCIM/ShamrockUpload.jpeg" // pic_id + return sendWeiyunReq(20010, WeiyunCommonReq( + fastUploadResourceReq = WeiyunFastUploadResourceReq( + picInfoList = listOf(WeiyunPicInfo( + md5 = md5, + name = md5.toHexString(), + width = width.toUInt(), + height = height.toUInt(), + size = image.length().toULong(), + type = 1u, + picId = "/storage/emulated/0/DCIM/temp.jpeg", + owner = WeiyunAuthor( + type = if (groupId == 0L) 1u else 2u, + numId = uin.toULong(), + strId = name, + groupId = groupId.toULong(), + groupName = groupName ) - ) + )), ) - }.toByteArray() - return sendWeiyunReq(20010, data) + )) } suspend fun addRichMediaMsg( @@ -202,66 +208,32 @@ internal object QFavSvc: BaseSvc() { time: Long = System.currentTimeMillis(), content: String ): Result { - val data = protobufMapOf { - it[1] = mapOf( - 20009 to mapOf( - 1 to mapOf( - /** - * 1 => bid - * 2 => category - * 3 => author - * 4 => create_time - * 5 => sequence - * 6 => biz_key - * 7 => biz_data_list - * 8 => share_url - * 9 => original_app_id - * 10 => custom_group_id - * 506 => modify_time - * 507 => qzone_ugc_key - */ - 1 to 1, // bid - 2 to 1, // category - 3 to mapOf( // author - 1 to if (groupId == 0L) 1 else 2, // type - 2 to uin, // num_id - 3 to name, // str_id - 4 to groupId, // group_id - 5 to groupName // group_name - ), - 4 to time - 2000, // create_time - 5 to time - 1000, // sequence - 9 to 0, // original_app_id - 10 to 0 // custom_group_id + return sendWeiyunReq(20009, WeiyunCommonReq( + addRichMediaReq = WeiyunAddRichMediaReq( + commInfo = WeiyunCollectCommInfo( + bid = 1u, + category = 1u, + author = WeiyunAuthor( + type = if (groupId == 0L) 1u else 2u, + numId = uin.toULong(), + strId = name, + groupId = groupId.toULong(), + groupName = groupName ), - 2 to mapOf( - /** - * 1 => title - * 2 => sub_title - * 3 => brief - * 4 => pic_list - * 5 => content_type - * 6 => original_uri - * 7 => publisher - * 8 => rich_media_version - */ - 3 to content, - 5 to 1 - ), - 3 to mapOf( - /** - * 1 => rich_media - * 2 => raw_data - * 3 => biz_data_list - * 4 => pic_list - * 5 => file_list - */ - 2 to content.textToHtml() - ) - ) + createTime = time.toULong() - 2000u, + seq = time.toULong() - 1000u, + originalAppId = 0u, + customGroupId = 0u + ), + summary = WeiyunRichMediaSummary( + brief = content, + contentType = 1u + ), + richMediaContent = listOf(WeiyunRichMediaContent( + rawData = content.textToHtml().toByteArray(), + )) ) - }.toByteArray() - return sendWeiyunReq(20009, data) + )) } private fun String.textToHtml(): String { @@ -327,7 +299,7 @@ internal object QFavSvc: BaseSvc() { suspend fun sendWeiyunReq( cmd: Int, - body: ByteArray, + req: WeiyunCommonReq, outputStream: ByteArrayOutputStream = ByteArrayOutputStream(), ): Result { return suspendCancellableCoroutine { @@ -346,7 +318,7 @@ internal object QFavSvc: BaseSvc() { } val pSKey = getWeiYunPSKey() httpNetReq.mHttpMethod = HttpNetReq.HTTP_POST - httpNetReq.mSendData = DeflateTools.gzip(packData(packHead(cmd, pSKey), body)) + httpNetReq.mSendData = DeflateTools.gzip(packData(packHead(cmd, pSKey), ProtoBuf.encodeToByteArray(WeiyunComm(req = req)))) httpNetReq.mOutStream = outputStream httpNetReq.mStartDownOffset = 0L httpNetReq.mReqProperties["Shamrock"] = "true" @@ -366,39 +338,19 @@ internal object QFavSvc: BaseSvc() { } private fun packHead(cmd: Int, pskey: String): ByteArray { - /** - * 1 => uin - * 2 => seq - * 3 => type - * 4 => cmd - * 5 => appid - * 6 => version - * 7 => nettype - * 8 => clientip - * 9 => encrypt - * 10 => keytype - * 11 => encryptkey - * 14 => major_version - * 15 => minor_version - * 101 => retcode - * 102 => retmsg - * 103 => promptmsg - * 111 => total_space - * 112 => used_space - */ - return protobufMapOf { - it[1] = app.longAccountUin - it[2] = seq++ // seq - it[3] = 1 // type - it[4] = cmd - it[5] = APPID - it[6] = VERSION // VERSION - it[7] = 3 // nettype - it[10] = 27 // keytype - it[11] = pskey - it[14] = MAJOR_VERSION - it[15] = MINOR_VERSION - }.toByteArray() + return ProtoBuf.encodeToByteArray(WeiyunMsgHead( + uin = app.longAccountUin.toULong(), + seq = seq++.toUInt(), + type = 1u, + cmd = cmd.toUInt(), + appId = APPID.toUInt(), + version = VERSION.toUInt(), + netType = 3u, + keyType = 27u, + key = pskey.toByteArray(), + majorVersion = MAJOR_VERSION.toUInt(), + minorVersion = MINOR_VERSION.toUInt(), + )) } private fun packData(head: ByteArray, body: ByteArray): ByteArray { diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/TicketSvc.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/TicketSvc.kt index fa89aa2..2b3551b 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/TicketSvc.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/TicketSvc.kt @@ -1,12 +1,9 @@ package moe.fuqiuluo.qqinterface.servlet import com.tencent.mobileqq.app.QQAppInterface +import com.tencent.mobileqq.pskey.oidb.cmd0x102a.oidb_cmd0x102a import io.ktor.client.request.get import io.ktor.client.request.header -import moe.fuqiuluo.proto.ProtoUtils -import moe.fuqiuluo.proto.asUtf8String -import moe.fuqiuluo.proto.protobufOf -import moe.fuqiuluo.qqinterface.servlet.BaseSvc import moe.fuqiuluo.shamrock.tools.GlobalClientNoRedirect import moe.fuqiuluo.shamrock.tools.slice import mqq.app.MobileQQ @@ -108,26 +105,22 @@ internal object TicketSvc: BaseSvc() { return manager.getSuperkey(uin) ?: "" } - suspend fun getLessPSKey(domain: String): String? { - val resp = sendOidbAW("OidbSvcTcp.0x102a", 4138, 0, protobufOf( - 1 to arrayOf(domain), - //2 to 3 - ).toByteArray()) ?: return null - + suspend fun getLessPSKey(vararg domain: String): Result> { + val req = oidb_cmd0x102a.GetPSkeyRequest() + req.domains.set(domain.toList()) + val buffer = sendOidbAW("OidbSvcTcp.0x102a", 4138, 0, req.toByteArray()) + ?: return Result.failure(Exception("getLessPSKey failed")) val body = oidb_sso.OIDBSSOPkg() - body.mergeFrom(resp.slice(4)) - - val pb = ProtoUtils.decodeFromByteArray(body.bytes_bodybuffer.get().toByteArray()) - return if (pb.has(1, 2)) { - pb[1][2].asUtf8String - } else { - null - } + body.mergeFrom(buffer.slice(4)) + val rsp = oidb_cmd0x102a.GetPSkeyResponse().mergeFrom(body.bytes_bodybuffer.get().toByteArray()) + return Result.success(rsp.private_keys.get()) } suspend fun getPSKey(uin: String, domain: String): String? { return (app.getManager(QQAppInterface.TICKET_MANAGER) as TicketManager).getPskey(uin, domain).let { - if (it.isNullOrBlank()) getLessPSKey(domain) else it + if (it.isNullOrBlank()) + getLessPSKey(domain).getOrNull()?.firstOrNull()?.key?.get() + else it } } @@ -141,7 +134,7 @@ internal object TicketSvc: BaseSvc() { var url = "https://ui.ptlogin2.qq.com/cgi-bin/login?pt_hide_ad=1&style=9&appid=$appid&pt_no_auth=1&pt_wxtest=1&daid=$daid&s_url=$jumpurl" var cookie = GlobalClientNoRedirect.get(url).headers.getAll("Set-Cookie")?.joinToString(";") url = "https://ssl.ptlogin2.qq.com/jump?u1=$jumpurl&pt_report=1&daid=$daid&style=9&keyindex=19&clientuin=$uin&clientkey=$clientkey" - var head = GlobalClientNoRedirect.get(url) { + GlobalClientNoRedirect.get(url) { header("Cookie", cookie) }.let { cookie = it.headers.getAll("Set-Cookie")?.joinToString(";") diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/transfile/RichProtoSvc.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/transfile/RichProtoSvc.kt index 50f72cc..fb51f2f 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/transfile/RichProtoSvc.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/transfile/RichProtoSvc.kt @@ -1,20 +1,12 @@ package moe.fuqiuluo.qqinterface.servlet.transfile -import com.tencent.av.utils.api.IAudioHelperApi -import com.tencent.mobileqq.qroute.QRoute +import com.tencent.mobileqq.pb.ByteStringMicro import com.tencent.mobileqq.transfile.FileMsg import com.tencent.mobileqq.transfile.api.IProtoReqManager import com.tencent.mobileqq.transfile.protohandler.RichProto import com.tencent.mobileqq.transfile.protohandler.RichProtoProc import kotlinx.coroutines.suspendCancellableCoroutine -import moe.fuqiuluo.proto.ProtoUtils -import moe.fuqiuluo.proto.asByteArray -import moe.fuqiuluo.proto.asInt -import moe.fuqiuluo.proto.asList -import moe.fuqiuluo.proto.asUtf8String -import moe.fuqiuluo.proto.protobufOf import moe.fuqiuluo.qqinterface.servlet.BaseSvc -import moe.fuqiuluo.shamrock.helper.ContactHelper import moe.fuqiuluo.shamrock.helper.Level import moe.fuqiuluo.shamrock.helper.LogCenter import moe.fuqiuluo.shamrock.tools.hex2ByteArray @@ -23,6 +15,9 @@ import moe.fuqiuluo.shamrock.tools.toHexString import moe.fuqiuluo.shamrock.utils.PlatformUtils import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher import mqq.app.MobileQQ +import tencent.im.cs.cmd0x346.cmd0x346 +import tencent.im.oidb.cmd0x6d6.oidb_0x6d6 +import tencent.im.oidb.cmd0xe37.cmd0xe37 import tencent.im.oidb.oidb_sso import kotlin.coroutines.resume @@ -32,27 +27,29 @@ internal object RichProtoSvc: BaseSvc() { fileId: String, bizId: Int = 102 ): String { - val buffer = sendOidbAW("OidbSvcTrpcTcp.0x6d6_2", 1750, 2, protobufOf( - 3 to mapOf( - 1 to peerId, - 2 to 3, - 3 to bizId, - 4 to fileId, - ) - ).toByteArray()) + val buffer = sendOidbAW("OidbSvcTrpcTcp.0x6d6_2", 1750, 2, oidb_0x6d6.ReqBody().apply { + download_file_req.set(oidb_0x6d6.DownloadFileReqBody().apply { + uint64_group_code.set(peerId) + uint32_app_id.set(3) + uint32_bus_id.set(bizId) + str_file_id.set(fileId) + }) + }.toByteArray()) if (buffer == null) { return "" } else { val body = oidb_sso.OIDBSSOPkg() body.mergeFrom(buffer.slice(4)) - val result = ProtoUtils.decodeFromByteArray(body.bytes_bodybuffer.get().toByteArray()) - - if (body.uint32_result.get() != 0 || result[3, 1].asInt != 0) { + val result = oidb_0x6d6.RspBody().mergeFrom(body.bytes_bodybuffer.get().toByteArray()) + if (body.uint32_result.get() != 0 + || result.download_file_rsp.int32_ret_code.get() != 0) { return "" } - val domain = if (result.has(3, 5)) ("https://" + result[3, 4].asUtf8String) else ("http://" + result[3, 5].asUtf8String) - val downloadUrl = result[3, 6].asByteArray.toHexString() + val domain = if (!result.download_file_rsp.str_download_dns.has()) + ("https://" + result.download_file_rsp.str_download_ip.get()) + else ("http://" + result.download_file_rsp.str_download_dns.get()) + val downloadUrl = result.download_file_rsp.bytes_download_url.get().toByteArray().toHexString() val appId = MobileQQ.getMobileQQ().appId val version = PlatformUtils.getQQVersion(MobileQQ.getContext()) @@ -65,23 +62,25 @@ internal object RichProtoSvc: BaseSvc() { subId: String, retryCnt: Int = 0 ): String { - val buffer = sendOidbAW("OidbSvc.0xe37_1200", 3639, 1200, protobufOf( - 1 to 1200, - 2 to 1 /* QRoute.api(IAudioHelperApi::class.java).genDebugSeq().toInt() */, /* seq */ - 14 to mapOf( - 10 to app.longAccountUin, - 20 to fileId, - 30 to 2, /* ver */ - 60 to subId, - 601 to 0 - ), - 101 to 3, // uint32_business_id - 102 to 104, /* client_type */ - 200 to 1, /* uint32_flag_support_mediaplatform */ - 99999 to mapOf( - 90200 to 1 // uint32_download_url_type - ) - ).toByteArray()) + val buffer = sendOidbAW("OidbSvc.0xe37_1200", 3639, 1200, cmd0xe37.Req0xe37().apply { + bytes_cmd_0x346_req_body.set(ByteStringMicro.copyFrom(cmd0x346.ReqBody().apply { + uint32_cmd.set(1200) + uint32_seq.set(1) + msg_apply_download_req.set(cmd0x346.ApplyDownloadReq().apply { + uint64_uin.set(app.longAccountUin) + bytes_uuid.set(ByteStringMicro.copyFrom(fileId.toByteArray())) + uint32_owner_type.set(2) + str_fileidcrc.set(subId) + + }) + uint32_business_id.set(3) + uint32_client_type.set(104) + uint32_flag_support_mediaplatform.set(1) + msg_extension_req.set(cmd0x346.ExtensionReq().apply { + uint32_download_url_type.set(1) + }) + }.toByteArray())) + }.toByteArray()) if (buffer == null) { if (retryCnt < 3) { @@ -91,17 +90,19 @@ internal object RichProtoSvc: BaseSvc() { } else { val body = oidb_sso.OIDBSSOPkg() body.mergeFrom(buffer.slice(4)) - val result = ProtoUtils.decodeFromByteArray(body.bytes_bodybuffer.get().toByteArray()) - - if (body.uint32_result.get() != 0 || result[14, 10].asInt != 0) { + val result = cmd0x346.RspBody().mergeFrom(cmd0xe37.Resp0xe37().mergeFrom( + body.bytes_bodybuffer.get().toByteArray() + ).bytes_cmd_0x346_rsp_body.get().toByteArray()) + if (body.uint32_result.get() != 0 || + result.msg_apply_download_rsp.int32_ret_code.has() && result.msg_apply_download_rsp.int32_ret_code.get() != 0) { return "" } - val oldData = result[14, 30] + val oldData = result.msg_apply_download_rsp.msg_download_info //val newData = result[14, 40] NTQQ 文件信息 - val domain = if (oldData.has(90)) ("https://" + oldData[90].asUtf8String) else ("http://" + oldData[60].asList.value.first().asUtf8String) - val params = oldData[50].asUtf8String + val domain = if (oldData.str_download_dns.has()) ("https://" + oldData.str_download_dns.get()) else ("http://" + oldData.rpt_str_downloadip_list.get().first()) + val params = oldData.str_download_url.get() val appId = MobileQQ.getMobileQQ().appId val version = PlatformUtils.getQQVersion(MobileQQ.getContext()) diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/MessageHelper.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/MessageHelper.kt index 18de550..9fae405 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/MessageHelper.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/MessageHelper.kt @@ -298,9 +298,9 @@ internal object MessageHelper { return db.messageMappingDao().queryByMsgHashId(hash) } - fun getMsgMappingBySeq(chatType: Int, msgSeq: Int): MessageMapping? { + fun getMsgMappingBySeq(chatType: Int, peerId: String, msgSeq: Int): MessageMapping? { val db = MessageDB.getInstance() - return db.messageMappingDao().queryByMsgSeq(chatType, msgSeq) + return db.messageMappingDao().queryByMsgSeq(chatType, peerId, msgSeq) } fun removeMsgByHashCode(hashCode: Int) { diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/db/MessageDB.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/db/MessageDB.kt index 6f832a0..f8536b0 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/db/MessageDB.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/db/MessageDB.kt @@ -50,8 +50,10 @@ interface MessageMappingDao { @Query("SELECT * FROM message_mapping WHERE peerId = :peerId AND chatType = :chatType") fun queryByPeerId(chatType: Int, peerId: String): List - @Query("SELECT * FROM message_mapping WHERE msgSeq = :msgSeq AND chatType = :chatType") - fun queryByMsgSeq(chatType: Int, msgSeq: Int): MessageMapping? + //@Query("SELECT * FROM message_mapping WHERE msgSeq = :msgSeq AND chatType = :chatType") + //fun queryByMsgSeq(chatType: Int, msgSeq: Int): MessageMapping? + // 不要调用这个,seq不唯一啊,老哥!!!!!!!!!!!!! + // 我就说怎么这么多bug @Query("SELECT * FROM message_mapping WHERE msgSeq = :msgSeq AND chatType = :chatType AND peerId = :peerId") fun queryByMsgSeq(chatType: Int, peerId: String, msgSeq: Int): MessageMapping? diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/ActionManager.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/ActionManager.kt index ddb5a78..f070610 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/ActionManager.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/ActionManager.kt @@ -15,54 +15,7 @@ internal object ActionManager { val actionMap = mutableMapOf() init { - arrayOf( - // Framework Info - TestHandler, GetLatestEvents, GetSupportedActions, GetStatus, GetVersionInfo, GetSelfInfo, GetLoginInfo, - SwitchAccount, - - // UserActions - GetProfileCard, GetFriendList, SendLike, GetUid, GetUinByUid, ScanQRCode, SetProfileCard, - GetCookies, GetCSRF, GetCredentials, RestartMe, CleanCache, GetModelShow, SetModelShow, - GetModelShowList, GetOnlineClients, GetStrangerInfo, IsBlackListUin, GetHttpCookies, GetFriendSystemMsg, - - // GroupInfo - GetTroopList, GetTroopInfo, GetTroopList, GetTroopMemberInfo, GetTroopMemberList, GetNotJoinedGroupInfo, - - // GroupActions - ModifyTroopName, LeaveTroop, KickTroopMember, BanTroopMember, SetGroupWholeBan, SetGroupAdmin, - ModifyTroopMemberName, SetGroupUnique, GetTroopHonor, GroupPoke, SetEssenceMessage, DeleteEssenceMessage, - GetGroupSystemMsg, GetProhibitedMemberList, GetEssenceMessageList, GetGroupNotice, SendGroupNotice, SendGroupSign, - GetGroupRemainAtAllRemain, - - // MSG ACTIONS - SendMessage, DeleteMessage, GetMsg, GetForwardMsg, SendPrivateForwardMessage, SendGroupMessage, SendPrivateMessage, - ClearMsgs, GetHistoryMsg, GetGroupMsgHistory, SendGroupForwardMessage, - - // RESOURCE ACTION - GetRecord, GetImage, UploadGroupFile, CreateGroupFileFolder, DeleteGroupFolder, - DeleteGroupFile, GetGroupFileSystemInfo, GetGroupRootFiles, GetGroupSubFiles, - GetGroupFileUrl, UploadPrivateFile, - - // REQUEST ACTION - SetFriendAddRequest, SetGroupAddRequest, - - // GUILD - GetGuildServiceProfile, GetGuildList, - - // WEATHER - GetWeatherCityCode, GetWeather, - - // FAV - FavAddTextMsg, FavAddImageMsg, FavGetItemContent, FavGetItemList, - - // OTHER - GetDeviceBattery, DownloadFile, QuickOperation - ).forEach { - it.alias.forEach { name -> - actionMap[name] = it - } - actionMap[it.path()] = it - } + initManager() } operator fun get(action: String): IActionHandler? { @@ -73,10 +26,6 @@ internal object ActionManager { internal abstract class IActionHandler { protected abstract suspend fun internalHandle(session: ActionSession): String - abstract fun path(): String - - open val alias: Array = arrayOf() - open val requiredParams: Array = arrayOf() suspend fun handle(session: ActionSession): String { diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/BanTroopMember.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/BanTroopMember.kt index cd9ee7a..571d1bd 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/BanTroopMember.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/BanTroopMember.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.qqinterface.servlet.GroupSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("set_group_ban") internal object BanTroopMember: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getLong("group_id") @@ -29,6 +31,4 @@ internal object BanTroopMember: IActionHandler() { } override val requiredParams: Array = arrayOf("group_id", "user_id") - - override fun path(): String = "set_group_ban" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/CleanCache.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/CleanCache.kt index 1823ca0..8fca2fa 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/CleanCache.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/CleanCache.kt @@ -6,7 +6,9 @@ import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString import moe.fuqiuluo.shamrock.utils.MMKVFetcher +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("clean_cache") internal object CleanCache: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { return invoke(session.echo) @@ -24,6 +26,4 @@ internal object CleanCache: IActionHandler() { .clear() return ok("成功", echo) } - - override fun path(): String = "clean_cache" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/ClearMsgs.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/ClearMsgs.kt index d3e7216..0ce56ed 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/ClearMsgs.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/ClearMsgs.kt @@ -6,7 +6,9 @@ import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString import moe.fuqiuluo.shamrock.xposed.helper.NTServiceFetcher +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("clear_msgs") internal object ClearMsgs: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val msgType = session.getString("message_type") @@ -27,6 +29,4 @@ internal object ClearMsgs: IActionHandler() { override val requiredParams: Array get() = arrayOf("message_type") - - override fun path(): String = "clear_msgs" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/CreateGroupFileFolder.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/CreateGroupFileFolder.kt index d7caa82..0227304 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/CreateGroupFileFolder.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/CreateGroupFileFolder.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.qqinterface.servlet.FileSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("create_group_file_folder") internal object CreateGroupFileFolder: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getString("group_id") @@ -14,12 +16,13 @@ internal object CreateGroupFileFolder: IActionHandler() { return invoke(groupId, folderName, echo) } - operator fun invoke(groupId: String, folderName: String, echo: JsonElement = EmptyJsonString): String { - FileSvc.createFileFolder(groupId, folderName) - return ok(msg = "成功", echo = echo) + suspend operator fun invoke(groupId: String, folderName: String, echo: JsonElement = EmptyJsonString): String { + val result = FileSvc.createFileFolder(groupId, folderName) + if (result.isFailure) { + return ok(msg = result.exceptionOrNull()?.message ?: "无法创建群文件夹", echo = echo) + } + return ok(data = result.getOrThrow(), msg = "成功", echo = echo) } override val requiredParams: Array = arrayOf("group_id", "name") - - override fun path(): String = "create_group_file_folder" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/DeleteEssenceMessage.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/DeleteEssenceMessage.kt index 90d4ada..89cd482 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/DeleteEssenceMessage.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/DeleteEssenceMessage.kt @@ -7,7 +7,9 @@ import moe.fuqiuluo.qqinterface.servlet.MsgSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("delete_essence_msg", ["delete_essence_message"]) internal object DeleteEssenceMessage: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val messageId = session.getInt("message_id") @@ -29,7 +31,4 @@ internal object DeleteEssenceMessage: IActionHandler() { logic(tip, echo) } } - - override val alias: Array = arrayOf("delete_essence_message") - override fun path(): String = "delete_essence_msg" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/DeleteGroupFile.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/DeleteGroupFile.kt index f2d2938..60636b5 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/DeleteGroupFile.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/DeleteGroupFile.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.qqinterface.servlet.FileSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("delete_group_file") internal object DeleteGroupFile: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getString("group_id") @@ -14,30 +16,12 @@ internal object DeleteGroupFile: IActionHandler() { return invoke(groupId, fileId, busid, session.echo) } - /* - suspend operator fun invoke( - groupId: String, - fileId: String, - bizId: Int, - echo: JsonElement = EmptyJsonString - ): String { - val result = FileSvc.deleteGroupFile(groupId, bizId, fileId) - if(result.isFailure) { - return error(result.exceptionOrNull()?.message ?: "删除群文件失败", echo) + suspend operator fun invoke(groupId: String, fileId: String, bizId: Int, echo: JsonElement = EmptyJsonString): String { + if(!FileSvc.deleteGroupFile(groupId, bizId, fileId)) { + return error("删除失败", echo = echo) } - val commonResult = result.getOrThrow() - if (commonResult.first != 0 || commonResult.second.retCode != 0) { - return error(commonResult.second.clientWording, echo) - } - return ok("成功", echo) - } - */ - operator fun invoke(groupId: String, fileId: String, bizId: Int, echo: JsonElement = EmptyJsonString): String { - FileSvc.deleteGroupFile(groupId, bizId, fileId) return ok("成功", echo) } override val requiredParams: Array = arrayOf("group_id", "file_id", "busid") - - override fun path(): String = "delete_group_file" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/DeleteGroupFolder.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/DeleteGroupFolder.kt index 339eebf..5efe8fe 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/DeleteGroupFolder.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/DeleteGroupFolder.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.qqinterface.servlet.FileSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("delete_group_folder") internal object DeleteGroupFolder: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getString("group_id") @@ -13,12 +15,12 @@ internal object DeleteGroupFolder: IActionHandler() { return invoke(groupId, folderId, session.echo) } - operator fun invoke(groupId: String, folderId: String, echo: JsonElement = EmptyJsonString): String { - FileSvc.deleteGroupFolder(groupId, folderId) + suspend operator fun invoke(groupId: String, folderId: String, echo: JsonElement = EmptyJsonString): String { + if(!FileSvc.deleteGroupFolder(groupId, folderId)) { + return error(why = "删除群文件夹失败", echo = echo) + } return ok(msg = "成功", echo = echo) } override val requiredParams: Array = arrayOf("group_id", "folder_id") - - override fun path(): String = "delete_group_folder" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/DeleteMessage.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/DeleteMessage.kt index 9b456d9..646d202 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/DeleteMessage.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/DeleteMessage.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.qqinterface.servlet.MsgSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("delete_message", ["delete_msg"]) internal object DeleteMessage: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val hashCode = session.getString("message_id").toInt() @@ -17,9 +19,5 @@ internal object DeleteMessage: IActionHandler() { return ok("成功", echo) } - override fun path(): String = "delete_message" - - override val alias: Array = arrayOf("delete_msg") - override val requiredParams: Array = arrayOf("message_id") } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/DownloadFile.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/DownloadFile.kt index 4a5c085..96b6902 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/DownloadFile.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/DownloadFile.kt @@ -11,7 +11,9 @@ import moe.fuqiuluo.shamrock.tools.asString import moe.fuqiuluo.shamrock.utils.DownloadUtils import moe.fuqiuluo.shamrock.utils.FileUtils import moe.fuqiuluo.shamrock.utils.MD5 +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("download_file") internal object DownloadFile: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val url = session.getStringOrNull("url") @@ -108,8 +110,6 @@ internal object DownloadFile: IActionHandler() { } } - override fun path(): String = "download_file" - @Serializable data class DownloadResult( val file: String, diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavAddImageMsg.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavAddImageMsg.kt index 2de21aa..334a3ef 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavAddImageMsg.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavAddImageMsg.kt @@ -5,9 +5,9 @@ import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.discardExact import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.decodeFromByteArray import kotlinx.serialization.json.JsonElement -import moe.fuqiuluo.proto.ProtoUtils -import moe.fuqiuluo.proto.asUtf8String +import kotlinx.serialization.protobuf.ProtoBuf import moe.fuqiuluo.qqinterface.servlet.QFavSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler @@ -15,7 +15,10 @@ import moe.fuqiuluo.shamrock.tools.EmptyJsonString import moe.fuqiuluo.shamrock.utils.CryptTools import moe.fuqiuluo.shamrock.utils.DeflateTools import moe.fuqiuluo.shamrock.utils.FileUtils +import moe.fuqiuluo.symbols.OneBotHandler +import moe.whitechi73.protobuf.fav.WeiyunComm +@OneBotHandler("fav.add_image_msg") internal object FavAddImageMsg: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val uin = session.getLong("user_id") @@ -70,11 +73,13 @@ internal object FavAddImageMsg: IActionHandler() { val data = ByteArray(dataLength).also { readPacket.readFully(it, 0, it.size) } - val pb = ProtoUtils.decodeFromByteArray(data) - val resp = pb[2, 20010, 1, 2] - picUrl = resp[1].asUtf8String - picId = resp[11].asUtf8String - md5 = resp[4].asUtf8String + + val resp = ProtoBuf.decodeFromByteArray(data) + .resp!!.fastUploadResourceResp!!.picResultList!!.first() + val picInfo = resp.picInfo!! + picUrl = picInfo.uri + picId = picInfo.picId + md5 = picInfo.name } else { return logic(it.mErrDesc, echo) } @@ -128,8 +133,8 @@ internal object FavAddImageMsg: IActionHandler() { val data = ByteArray(dataLength).also { readPacket.readFully(it, 0, it.size) } - val pb = ProtoUtils.decodeFromByteArray(data) - itemId = pb[2, 20009, 1].asUtf8String + val resp = ProtoBuf.decodeFromByteArray(data).resp!! + itemId = resp.addRichMediaResp!!.cid } System.gc() @@ -142,8 +147,6 @@ internal object FavAddImageMsg: IActionHandler() { ), echo) } - override fun path(): String = "fav.add_image_msg" - override val requiredParams: Array = arrayOf("user_id", "nick", "file") @Serializable diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavAddTextMsg.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavAddTextMsg.kt index e54ee41..06e7ee1 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavAddTextMsg.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavAddTextMsg.kt @@ -4,17 +4,18 @@ import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.discardExact import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.decodeFromByteArray import kotlinx.serialization.json.JsonElement -import moe.fuqiuluo.proto.ProtoUtils -import moe.fuqiuluo.proto.asUtf8String +import kotlinx.serialization.protobuf.ProtoBuf import moe.fuqiuluo.qqinterface.servlet.QFavSvc -import moe.fuqiuluo.shamrock.helper.LogCenter import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString -import moe.fuqiuluo.shamrock.tools.toHexString import moe.fuqiuluo.shamrock.utils.DeflateTools +import moe.fuqiuluo.symbols.OneBotHandler +import moe.whitechi73.protobuf.fav.WeiyunComm +@OneBotHandler("fav.add_text_msg") internal object FavAddTextMsg: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val uin = session.getLong("user_id") @@ -54,11 +55,8 @@ internal object FavAddTextMsg: IActionHandler() { val data = ByteArray(dataLength).also { readPacket.readFully(it, 0, it.size) } - val pb = ProtoUtils.decodeFromByteArray(data) - - ok(data = QFavItem( - pb[2, 20009, 1].asUtf8String - ), echo) + val resp = ProtoBuf.decodeFromByteArray(data).resp!!.addRichMediaResp!! + ok(data = QFavItem(resp.cid), echo) } else { logic(it.mErrDesc, echo) } @@ -66,8 +64,6 @@ internal object FavAddTextMsg: IActionHandler() { return ok("请求已提交", echo) } - override fun path(): String = "fav.add_text_msg" - override val requiredParams: Array = arrayOf("user_id", "nick", "content") @Serializable diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavGetItemContent.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavGetItemContent.kt index 3810551..458f515 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavGetItemContent.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavGetItemContent.kt @@ -1,19 +1,24 @@ +@file:OptIn(ExperimentalSerializationApi::class) + package moe.fuqiuluo.shamrock.remote.action.handlers import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.discardExact +import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.decodeFromByteArray import kotlinx.serialization.json.JsonElement -import moe.fuqiuluo.proto.ProtoUtils -import moe.fuqiuluo.proto.asUtf8String +import kotlinx.serialization.protobuf.ProtoBuf import moe.fuqiuluo.qqinterface.servlet.QFavSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString -import moe.fuqiuluo.shamrock.tools.toHexString import moe.fuqiuluo.shamrock.utils.DeflateTools +import moe.fuqiuluo.symbols.OneBotHandler +import moe.whitechi73.protobuf.fav.WeiyunComm +@OneBotHandler("fav.get_item_content") internal object FavGetItemContent: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val id = session.getString("id") @@ -41,13 +46,15 @@ internal object FavGetItemContent: IActionHandler() { val data = ByteArray(dataLength).also { readPacket.readFully(it, 0, it.size) } - val pb = ProtoUtils.decodeFromByteArray(data) - return ok(ItemContent(pb[2, 20001, 1, 8, 2].asUtf8String)) + val resp = ProtoBuf.decodeFromByteArray(data).resp!! + return ok(ItemContent( + resp.getFavContentResp!!.content!!.joinToString("") { + String(it.richMedia!!.rawData!!) + } + )) } - override fun path(): String = "fav.get_item_content" - override val requiredParams: Array = arrayOf("id") @Serializable diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavGetItemList.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavGetItemList.kt index 31ee778..10b183d 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavGetItemList.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavGetItemList.kt @@ -4,21 +4,18 @@ import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.discardExact import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.decodeFromByteArray import kotlinx.serialization.json.JsonElement -import moe.fuqiuluo.proto.ProtoUtils -import moe.fuqiuluo.proto.asInt -import moe.fuqiuluo.proto.asList -import moe.fuqiuluo.proto.asLong -import moe.fuqiuluo.proto.asMap -import moe.fuqiuluo.proto.asULong -import moe.fuqiuluo.proto.asUtf8String +import kotlinx.serialization.protobuf.ProtoBuf import moe.fuqiuluo.qqinterface.servlet.QFavSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString -import moe.fuqiuluo.shamrock.tools.toHexString import moe.fuqiuluo.shamrock.utils.DeflateTools +import moe.fuqiuluo.symbols.OneBotHandler +import moe.whitechi73.protobuf.fav.WeiyunComm +@OneBotHandler("fav.get_item_list") internal object FavGetItemList: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val category = session.getInt("category") @@ -58,31 +55,31 @@ internal object FavGetItemList: IActionHandler() { val data = ByteArray(dataLength).also { readPacket.readFully(it, 0, it.size) } - val pb = ProtoUtils.decodeFromByteArray(data) + val resp = ProtoBuf.decodeFromByteArray(data).resp!!.getFavListResp!! val itemList = arrayListOf() - val rawItemList = pb[2, 20000, 1].asList - rawItemList.value.forEach { - val item = it.asMap - val itemId = item[1].asUtf8String - val authorType = item[4, 1].asInt - val author = item[4, 2].asULong - val authorName = item[4, 3].asUtf8String + val rawItemList = resp.collections!! + rawItemList.forEach { + val itemId = it.cid + val author = it.author!! + val authorType = author.type.toInt() + val authorId = author.numId.toLong() + val authorName = author.strId val groupName: String val groupId: Long if (authorType == 2) { - groupName = item[4, 5].asUtf8String - groupId = item[4, 4].asULong + groupName = author.groupName + groupId = author.groupId.toLong() } else { groupName = "" groupId = 0L } - val clientVersion = item[7].asUtf8String - val time = item[9].asLong + val clientVersion = it.srcAppVer + val time = it.createTime.toLong() itemList.add(Item( id = itemId, authorType = authorType, - author = author, + author = authorId, authorName = authorName, groupName = groupName, groupId = groupId, @@ -96,8 +93,6 @@ internal object FavGetItemList: IActionHandler() { override val requiredParams: Array = arrayOf("category", "start_pos", "page_size") - override fun path(): String = "fav.get_item_list" - @Serializable private data class ItemList( val items: List diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetCSRF.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetCSRF.kt index 129cb58..6462125 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetCSRF.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetCSRF.kt @@ -6,7 +6,9 @@ import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.remote.service.data.Credentials import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_csrf_token") internal object GetCSRF: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val domain = session.getStringOrNull("domain") @@ -26,6 +28,4 @@ internal object GetCSRF: IActionHandler() { val pskey = TicketSvc.getPSKey(uin) return ok(Credentials(bkn = TicketSvc.getCSRF(pskey)), echo) } - - override fun path(): String = "get_csrf_token" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetCookies.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetCookies.kt index ee2f0dc..56f6adb 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetCookies.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetCookies.kt @@ -6,7 +6,9 @@ import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.remote.service.data.Credentials import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_cookies", ["get_cookie"]) internal object GetCookies: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val domain = session.getStringOrNull("domain") @@ -21,6 +23,4 @@ internal object GetCookies: IActionHandler() { suspend operator fun invoke(domain: String, echo: JsonElement = EmptyJsonString): String { return ok(Credentials(cookie = TicketSvc.getCookie(domain)), echo) } - - override fun path(): String = "get_cookies" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetCredentials.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetCredentials.kt index e6b83c7..468b3fb 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetCredentials.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetCredentials.kt @@ -6,7 +6,9 @@ import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.remote.service.data.Credentials import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_credentials") internal object GetCredentials: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val domain = session.getStringOrNull("domain") @@ -35,6 +37,4 @@ internal object GetCredentials: IActionHandler() { cookie = "o_cookie=$uin; ied_qq=o$uin; pac_uid=1_$uin; uin=o$uin; skey=$skey; p_uin=o$uin; p_skey=$pskey; pt4_token=$pt4token;" ), echo) } - - override fun path(): String = "get_credentials" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetDeviceBattery.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetDeviceBattery.kt index bc7b120..a4b0076 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetDeviceBattery.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetDeviceBattery.kt @@ -5,14 +5,14 @@ import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString import moe.fuqiuluo.shamrock.utils.PlatformUtils +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_device_battery") internal object GetDeviceBattery: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { return invoke(session.echo) } - override fun path(): String = "get_device_battery" - operator fun invoke(echo: JsonElement = EmptyJsonString): String { return ok(PlatformUtils.getDeviceBattery(), echo = echo) } diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetEssenceMessageList.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetEssenceMessageList.kt index 9e9f2f7..9a78f0a 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetEssenceMessageList.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetEssenceMessageList.kt @@ -1,13 +1,13 @@ package moe.fuqiuluo.shamrock.remote.action.handlers -import com.tencent.qqnt.kernel.nativeinterface.MsgConstant import kotlinx.serialization.json.JsonElement import moe.fuqiuluo.qqinterface.servlet.GroupSvc -import moe.fuqiuluo.qqinterface.servlet.MsgSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_essence_msg_list", ["get_essence_message_list"]) internal object GetEssenceMessageList: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getLong("group_id") @@ -25,9 +25,5 @@ internal object GetEssenceMessageList: IActionHandler() { return ok(essenceMessageList.getOrNull(), echo) } return logic(essenceMessageList.exceptionOrNull()?.message ?: "", echo) - } - - override val alias: Array = arrayOf("get_essence_message_list") - override fun path(): String = "get_essence_msg_list" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetForwardMsg.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetForwardMsg.kt index 510aeec..2fbe1f3 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetForwardMsg.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetForwardMsg.kt @@ -12,7 +12,9 @@ import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.remote.service.data.MessageDetail import moe.fuqiuluo.shamrock.remote.service.data.MessageSender import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_forward_msg") internal object GetForwardMsg: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val id = session.getString("id") @@ -57,6 +59,4 @@ internal object GetForwardMsg: IActionHandler() { ) override val requiredParams: Array = arrayOf("id") - - override fun path(): String = "get_forward_msg" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetFriendList.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetFriendList.kt index 97d9462..6c53edb 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetFriendList.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetFriendList.kt @@ -7,7 +7,9 @@ import moe.fuqiuluo.shamrock.remote.service.data.FriendEntry import moe.fuqiuluo.shamrock.remote.service.data.PlatformType import moe.fuqiuluo.qqinterface.servlet.FriendSvc import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_friend_list") internal object GetFriendList: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val refresh = session.getBooleanOrDefault("refresh", false) @@ -32,7 +34,4 @@ internal object GetFriendList: IActionHandler() { ) }, echo) } - - - override fun path(): String = "get_friend_list" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetFriendSystemMsg.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetFriendSystemMsg.kt index 21a2b6e..a7d5c66 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetFriendSystemMsg.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetFriendSystemMsg.kt @@ -8,7 +8,9 @@ import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.remote.service.data.FriendRequest import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_friend_system_msg") internal object GetFriendSystemMsg : IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { return invoke(echo = session.echo) @@ -40,6 +42,4 @@ internal object GetFriendSystemMsg : IActionHandler() { } ?: mutableListOf() return ok(msgs, echo = echo) } - - override fun path(): String = "get_friend_system_msg" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupFileSystemInfo.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupFileSystemInfo.kt index 722ec60..1a74d4f 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupFileSystemInfo.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupFileSystemInfo.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.qqinterface.servlet.FileSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_group_file_system_info") internal object GetGroupFileSystemInfo: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getString("group_id") @@ -17,6 +19,4 @@ internal object GetGroupFileSystemInfo: IActionHandler() { } override val requiredParams: Array = arrayOf("group_id") - - override fun path(): String = "get_group_file_system_info" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupFileUrl.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupFileUrl.kt index 0c76aab..bc48554 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupFileUrl.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupFileUrl.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.qqinterface.servlet.FileSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_group_file_url") internal object GetGroupFileUrl: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getString("group_id") @@ -19,6 +21,4 @@ internal object GetGroupFileUrl: IActionHandler() { } override val requiredParams: Array = arrayOf("group_id", "file_id", "busid") - - override fun path(): String = "get_group_file_url" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupMsgHistory.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupMsgHistory.kt index 9db021e..a45cf90 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupMsgHistory.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupMsgHistory.kt @@ -3,7 +3,9 @@ package moe.fuqiuluo.shamrock.remote.action.handlers import moe.fuqiuluo.shamrock.helper.db.MessageDB import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_group_msg_history") internal object GetGroupMsgHistory: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getString("group_id") @@ -17,8 +19,5 @@ internal object GetGroupMsgHistory: IActionHandler() { return GetHistoryMsg("group", groupId, cnt, startId, session.echo) } - override val requiredParams: Array - get() = arrayOf("group_id") - - override fun path(): String = "get_group_msg_history" + override val requiredParams: Array = arrayOf("group_id") } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupNotice.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupNotice.kt index 51f9f0a..54dd5cc 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupNotice.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupNotice.kt @@ -1,13 +1,13 @@ package moe.fuqiuluo.shamrock.remote.action.handlers -import com.tencent.qqnt.kernel.nativeinterface.MsgConstant import kotlinx.serialization.json.JsonElement import moe.fuqiuluo.qqinterface.servlet.GroupSvc -import moe.fuqiuluo.qqinterface.servlet.MsgSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("_get_group_notice", ["get_group_notice"]) internal object GetGroupNotice: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getLong("group_id") @@ -22,7 +22,4 @@ internal object GetGroupNotice: IActionHandler() { return logic(announcements.exceptionOrNull()?.message ?: "", echo) } - - override val alias: Array = arrayOf("get_group_notice") - override fun path(): String = "_get_group_notice" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupRemainAtAllRemain.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupRemainAtAllRemain.kt index ea1389f..b837da0 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupRemainAtAllRemain.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupRemainAtAllRemain.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.qqinterface.servlet.GroupSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_group_at_all_remain") internal object GetGroupRemainAtAllRemain: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getLong("group_id") @@ -24,6 +26,4 @@ internal object GetGroupRemainAtAllRemain: IActionHandler() { } override val requiredParams: Array = arrayOf("group_id") - - override fun path(): String = "get_group_at_all_remain" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupRootFiles.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupRootFiles.kt index aa46532..b9bf2f5 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupRootFiles.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupRootFiles.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.qqinterface.servlet.FileSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_group_root_files") internal object GetGroupRootFiles: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getString("group_id") @@ -16,10 +18,8 @@ internal object GetGroupRootFiles: IActionHandler() { FileSvc.getGroupRootFiles(groupId.toLong()).onSuccess { return ok(it, echo = echo) }.getOrNull() - return error(why = "获取失败,请查看日志", echo = echo) + return error(why = "获取失败", echo = echo) } override val requiredParams: Array = arrayOf("group_id") - - override fun path(): String = "get_group_root_files" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupSubFiles.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupSubFiles.kt index 31574f3..def2afc 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupSubFiles.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupSubFiles.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.qqinterface.servlet.FileSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_group_files_by_folder") internal object GetGroupSubFiles: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getString("group_id") @@ -17,10 +19,8 @@ internal object GetGroupSubFiles: IActionHandler() { FileSvc.getGroupFiles(groupId.toLong(), folderId).onSuccess { return ok(it, echo = echo) }.getOrNull() - return error(why = "获取失败,请查看日志", echo = echo) + return error(why = "获取失败", echo = echo) } override val requiredParams: Array = arrayOf("group_id", "folder_id") - - override fun path(): String = "get_group_files_by_folder" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupSystemMsg.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupSystemMsg.kt index 7ddae5a..0f96a0b 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupSystemMsg.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupSystemMsg.kt @@ -7,7 +7,9 @@ import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.remote.service.data.GroupRequest import moe.fuqiuluo.shamrock.remote.service.data.GroupSystemMessage import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_group_system_msg") internal object GetGroupSystemMsg: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { return invoke(echo = session.echo) @@ -60,6 +62,4 @@ internal object GetGroupSystemMsg: IActionHandler() { } return ok(msgs, echo = echo) } - - override fun path(): String = "get_group_system_msg" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGuildList.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGuildList.kt index 68f559b..60e7771 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGuildList.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGuildList.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonArray import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_guild_list") internal object GetGuildList : IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { return invoke(echo = session.echo) @@ -15,6 +17,4 @@ internal object GetGuildList : IActionHandler() { // TODO: get_guild_list return ok(EmptyJsonArray, echo, "此功能尚未实现") } - - override fun path(): String = "get_guild_list" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGuildServiceProfile.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGuildServiceProfile.kt index 3cfc41e..e00cde9 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGuildServiceProfile.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGuildServiceProfile.kt @@ -7,7 +7,9 @@ import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonObject import moe.fuqiuluo.shamrock.tools.EmptyJsonString import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_guild_service_profile") internal object GetGuildServiceProfile : IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { return invoke(echo = session.echo) @@ -27,6 +29,4 @@ internal object GetGuildServiceProfile : IActionHandler() { return ok(echo = echo) } - - override fun path(): String = "get_guild_service_profile" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetHistoryMsg.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetHistoryMsg.kt index ba8656a..e6bedaf 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetHistoryMsg.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetHistoryMsg.kt @@ -15,10 +15,12 @@ import moe.fuqiuluo.shamrock.remote.service.data.MessageDetail import moe.fuqiuluo.shamrock.remote.service.data.MessageSender import moe.fuqiuluo.shamrock.tools.EmptyJsonString import moe.fuqiuluo.shamrock.xposed.helper.NTServiceFetcher +import moe.fuqiuluo.symbols.OneBotHandler import java.util.ArrayList import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine +@OneBotHandler("get_history_msg") internal object GetHistoryMsg: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val msgType = session.getString("message_type") @@ -102,10 +104,7 @@ internal object GetHistoryMsg: IActionHandler() { return ok(data = GetHistoryMsgResult(msgList), echo = echo) } - override val requiredParams: Array - get() = arrayOf("message_type") - - override fun path(): String = "get_history_msg" + override val requiredParams: Array = arrayOf("message_type") @Serializable data class GetHistoryMsgResult( diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetHttpCookies.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetHttpCookies.kt index 94f2c13..4af7af6 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetHttpCookies.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetHttpCookies.kt @@ -6,7 +6,9 @@ import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.remote.service.data.Credentials import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_http_cookies") internal object GetHttpCookies : IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val appid = session.getString("appid") @@ -24,6 +26,4 @@ internal object GetHttpCookies : IActionHandler() { val ck = TicketSvc.GetHttpCookies(appid, daid, jumpurl) ?: "" return ok(Credentials(cookie = ck), echo) } - - override fun path(): String = "get_http_cookies" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetImage.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetImage.kt index 2ecfa48..f0a5c3c 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetImage.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetImage.kt @@ -8,7 +8,9 @@ import moe.fuqiuluo.shamrock.helper.db.ImageDB import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_image") internal object GetImage: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val echo = session.echo @@ -42,8 +44,6 @@ internal object GetImage: IActionHandler() { override val requiredParams: Array = arrayOf("file") - override fun path(): String = "get_image" - @Serializable data class GetImageResult( val size: Long, diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetLatestEvents.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetLatestEvents.kt index dd247a9..577f3b5 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetLatestEvents.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetLatestEvents.kt @@ -5,16 +5,13 @@ import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.entries.EmptyObject import moe.fuqiuluo.shamrock.remote.entries.Status import moe.fuqiuluo.shamrock.remote.entries.resultToString +import moe.fuqiuluo.symbols.OneBotHandler -// 弱智玩意,不予实现 -// 请开启HTTP回调 把事件回调回去 -// 而不是在我这里轮询 +@OneBotHandler("get_latest_events") internal object GetLatestEvents: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { return resultToString( true, Status.Ok, listOf(), echo = session.echo ) } - - override fun path(): String = "get_latest_events" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetLoginInfo.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetLoginInfo.kt index d422652..5220bcb 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetLoginInfo.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetLoginInfo.kt @@ -7,8 +7,10 @@ import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.remote.entries.StdAccount import moe.fuqiuluo.shamrock.tools.EmptyJsonString import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher +import moe.fuqiuluo.symbols.OneBotHandler import mqq.app.MobileQQ +@OneBotHandler("get_login_info") internal object GetLoginInfo: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { return invoke(session.echo) @@ -27,6 +29,4 @@ internal object GetLoginInfo: IActionHandler() { ), echo = echo) } } - - override fun path(): String = "get_login_info" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetModelShow.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetModelShow.kt index e79c70a..dc37988 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetModelShow.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetModelShow.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.qqinterface.servlet.CardSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_model_show") internal object GetModelShow: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val uin = session.getLongOrNull("user_id") @@ -26,6 +28,4 @@ internal object GetModelShow: IActionHandler() { } return ok(CardSvc.getModelShow(uin), echo) } - - override fun path(): String = "get_model_show" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetModelShowList.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetModelShowList.kt index 9043ba7..49963e7 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetModelShowList.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetModelShowList.kt @@ -18,7 +18,9 @@ import moe.fuqiuluo.shamrock.helper.Level import moe.fuqiuluo.shamrock.helper.LogCenter import moe.fuqiuluo.qqinterface.servlet.TicketSvc import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("_get_model_show") internal object GetModelShowList : IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { return invoke(session.getString("model"), session.echo) @@ -74,9 +76,6 @@ internal object GetModelShowList : IActionHandler() { override val requiredParams: Array = arrayOf("model") - override fun path(): String = "_get_model_show" - - @Serializable data class GetModelListResp( @SerialName("variants") val resp: List diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetMsg.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetMsg.kt index b34a576..bc65a57 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetMsg.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetMsg.kt @@ -10,7 +10,9 @@ import moe.fuqiuluo.shamrock.remote.service.data.MessageSender import moe.fuqiuluo.qqinterface.servlet.MsgSvc import moe.fuqiuluo.qqinterface.servlet.msg.convert.MessageConvert import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_message", ["get_msg"]) internal object GetMsg: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val hashCode = session.getIntOrNull("message_id") @@ -44,8 +46,4 @@ internal object GetMsg: IActionHandler() { } override val requiredParams: Array = arrayOf("message_id") - - override val alias: Array = arrayOf("get_message") - - override fun path(): String = "get_msg" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetNotJoinedGroupInfo.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetNotJoinedGroupInfo.kt index 9506081..40d6f43 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetNotJoinedGroupInfo.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetNotJoinedGroupInfo.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.qqinterface.servlet.GroupSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_not_joined_group_info") internal object GetNotJoinedGroupInfo: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getString("group_id") @@ -20,6 +22,4 @@ internal object GetNotJoinedGroupInfo: IActionHandler() { } return logic("Unable to obtain group information", echo) } - - override fun path(): String = "get_not_joined_group_info" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetOnlineClients.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetOnlineClients.kt index 8e8f97e..666c997 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetOnlineClients.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetOnlineClients.kt @@ -7,7 +7,9 @@ import moe.fuqiuluo.qqinterface.servlet.QSafeSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("_get_online_clients") internal object GetOnlineClients: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { return invoke(session.echo) @@ -19,13 +21,10 @@ internal object GetOnlineClients: IActionHandler() { return ok(clients.map { DevInfo(it.iAppId, it.strDeviceName, it.strDeviceTypeInfo, it.iLoginTime, it.iLoginPlatform, it.strLoginLocation - // it.vecGuid.toHexString() ignore this field ) }, echo) } - override fun path(): String = "_get_online_clients" - @Serializable data class DevInfo( @SerialName("app_id") val appId: Long, diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetProfileCard.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetProfileCard.kt index aaec75d..97545aa 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetProfileCard.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetProfileCard.kt @@ -10,7 +10,9 @@ import moe.fuqiuluo.shamrock.remote.service.data.VipInfo import moe.fuqiuluo.shamrock.remote.service.data.VipType import moe.fuqiuluo.shamrock.remote.service.data.profile.Location import moe.fuqiuluo.shamrock.remote.service.data.profile.ProfileCard +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_user_info", ["get_profile_card"]) internal object GetProfileCard: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val uin = session.getString("user_id") @@ -73,6 +75,4 @@ internal object GetProfileCard: IActionHandler() { private fun Card?.ok(): Boolean { return this != null && !strNick.isNullOrBlank() } - - override fun path(): String = "get_user_info" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetProhibitedMemberList.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetProhibitedMemberList.kt index 7bedb1a..55baff1 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetProhibitedMemberList.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetProhibitedMemberList.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.qqinterface.servlet.GroupSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_prohibited_member_list") internal object GetProhibitedMemberList: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupCode = session.getLong("group_id") @@ -24,6 +26,4 @@ internal object GetProhibitedMemberList: IActionHandler() { } override val requiredParams: Array = arrayOf("group_id") - - override fun path(): String = "get_prohibited_member_list" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetRecord.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetRecord.kt index 9502821..9a051f4 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetRecord.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetRecord.kt @@ -7,7 +7,9 @@ import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.remote.service.data.OutResource import moe.fuqiuluo.shamrock.tools.EmptyJsonString import moe.fuqiuluo.shamrock.utils.AudioUtils +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_record") internal object GetRecord: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val file = session.getString("file") @@ -37,6 +39,4 @@ internal object GetRecord: IActionHandler() { } override val requiredParams: Array = arrayOf("file", "out_format") - - override fun path(): String = "get_record" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetSelfInfo.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetSelfInfo.kt index c87ef7a..7e9aca0 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetSelfInfo.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetSelfInfo.kt @@ -7,8 +7,10 @@ import moe.fuqiuluo.shamrock.remote.entries.Status import moe.fuqiuluo.shamrock.remote.entries.resultToString import moe.fuqiuluo.shamrock.remote.service.data.UserDetail import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher +import moe.fuqiuluo.symbols.OneBotHandler import mqq.app.MobileQQ +@OneBotHandler("get_self_info") internal object GetSelfInfo: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { //val accounts = MobileQQ.getMobileQQ().allAccounts @@ -20,6 +22,4 @@ internal object GetSelfInfo: IActionHandler() { curUin.toLong(), runtime.currentNickname, runtime.currentNickname ), echo = session.echo) } - - override fun path(): String = "get_self_info" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetStatus.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetStatus.kt index 8d86c22..454952b 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetStatus.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetStatus.kt @@ -7,8 +7,10 @@ import moe.fuqiuluo.shamrock.remote.entries.resultToString import moe.fuqiuluo.shamrock.remote.service.data.BotStatus import moe.fuqiuluo.shamrock.remote.service.data.Self import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher +import moe.fuqiuluo.symbols.OneBotHandler import mqq.app.MobileQQ +@OneBotHandler("get_status", ["status"]) internal object GetStatus: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val runtime = AppRuntimeFetcher.appRuntime @@ -19,6 +21,4 @@ internal object GetStatus: IActionHandler() { ) ), echo = session.echo) } - - override fun path(): String = "get_status" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetStrangerInfo.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetStrangerInfo.kt index adcffb2..10b3bd6 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetStrangerInfo.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetStrangerInfo.kt @@ -9,12 +9,10 @@ import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.toHexString import moe.fuqiuluo.qqinterface.servlet.CardSvc import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_stranger_info", ["_get_stranger_info"]) internal object GetStrangerInfo: IActionHandler() { - override fun path(): String = "_get_stranger_info" - - override val alias: Array = arrayOf("get_stranger_info") - override suspend fun internalHandle(session: ActionSession): String { val uid = session.getString("user_id") return invoke(uid, session.echo) diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetSupportedActions.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetSupportedActions.kt index af910ff..d6d42e7 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetSupportedActions.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetSupportedActions.kt @@ -5,11 +5,11 @@ import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.entries.Status import moe.fuqiuluo.shamrock.remote.entries.resultToString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_supported_actions") internal object GetSupportedActions: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { return resultToString(true, Status.Ok, ActionManager.actionMap.keys.toList(), echo = session.echo) } - - override fun path(): String = "get_supported_actions" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetTroopHonor.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetTroopHonor.kt index 40a594b..8b57c9b 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetTroopHonor.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetTroopHonor.kt @@ -12,7 +12,9 @@ import moe.fuqiuluo.shamrock.remote.service.data.HONOR_HAPPY import moe.fuqiuluo.shamrock.remote.service.data.HONOR_NEWBIE import moe.fuqiuluo.shamrock.remote.service.data.HONOR_TALKATIVE import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_group_honor_info", ["get_troop_honor_info"]) internal object GetTroopHonor: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getString("group_id") @@ -53,7 +55,5 @@ internal object GetTroopHonor: IActionHandler() { override val requiredParams: Array = arrayOf("group_id", "refresh") - override fun path(): String = "get_group_honor_info" - private external fun nativeDecodeHonor(userId: String, honorId: Int, honorFlag: Byte): GroupMemberHonor? } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetTroopInfo.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetTroopInfo.kt index 57db4cb..e579059 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetTroopInfo.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetTroopInfo.kt @@ -6,7 +6,9 @@ import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.remote.service.data.SimpleTroopInfo import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_group_info") internal object GetTroopInfo: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getString("group_id") @@ -36,6 +38,4 @@ internal object GetTroopInfo: IActionHandler() { } override val requiredParams: Array = arrayOf("group_id") - - override fun path(): String = "get_group_info" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetTroopList.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetTroopList.kt index aa570b1..fe18d1e 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetTroopList.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetTroopList.kt @@ -6,7 +6,9 @@ import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.remote.service.data.SimpleTroopInfo import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_group_list") internal object GetTroopList : IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val refresh = session.getBooleanOrDefault("refresh", true) @@ -41,6 +43,4 @@ internal object GetTroopList : IActionHandler() { } return ok(troopList, echo) } - - override fun path(): String = "get_group_list" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetTroopMemberInfo.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetTroopMemberInfo.kt index e74889b..b243b13 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetTroopMemberInfo.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetTroopMemberInfo.kt @@ -9,7 +9,9 @@ import moe.fuqiuluo.shamrock.remote.service.data.SimpleTroopMemberInfo import moe.fuqiuluo.shamrock.remote.service.data.push.MemberRole import moe.fuqiuluo.shamrock.tools.EmptyJsonString import moe.fuqiuluo.shamrock.tools.ifNullOrEmpty +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_group_member_info") internal object GetTroopMemberInfo : IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val uin = session.getString("user_id") @@ -66,7 +68,5 @@ internal object GetTroopMemberInfo : IActionHandler() { } override val requiredParams: Array = arrayOf("user_id", "group_id") - - override fun path(): String = "get_group_member_info" } diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetTroopMemberList.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetTroopMemberList.kt index 2893d67..b5f51fe 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetTroopMemberList.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetTroopMemberList.kt @@ -9,7 +9,9 @@ import moe.fuqiuluo.shamrock.remote.service.data.SimpleTroopMemberInfo import moe.fuqiuluo.shamrock.remote.service.data.push.MemberRole import moe.fuqiuluo.shamrock.tools.EmptyJsonString import moe.fuqiuluo.shamrock.tools.ifNullOrEmpty +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_group_member_list") internal object GetTroopMemberList : IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getString("group_id") @@ -72,7 +74,5 @@ internal object GetTroopMemberList : IActionHandler() { } override val requiredParams: Array = arrayOf("group_id") - - override fun path(): String = "get_group_member_list" } diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetUid.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetUid.kt index f3472db..bc02af0 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetUid.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetUid.kt @@ -7,8 +7,10 @@ import moe.fuqiuluo.shamrock.remote.entries.Status import moe.fuqiuluo.shamrock.remote.entries.resultToString import moe.fuqiuluo.shamrock.tools.asString import moe.fuqiuluo.shamrock.xposed.helper.NTServiceFetcher +import moe.fuqiuluo.symbols.OneBotHandler import kotlin.coroutines.resume +@OneBotHandler("get_uid") internal object GetUid: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val kernelService = NTServiceFetcher.kernelService @@ -24,8 +26,4 @@ internal object GetUid: IActionHandler() { } return resultToString(true, Status.Ok, uidMap, echo = session.echo) } - - override fun path(): String = "get_uid" - - } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetUinByUid.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetUinByUid.kt index 023901e..bab283d 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetUinByUid.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetUinByUid.kt @@ -7,8 +7,10 @@ import moe.fuqiuluo.shamrock.remote.entries.Status import moe.fuqiuluo.shamrock.remote.entries.resultToString import moe.fuqiuluo.shamrock.tools.asString import moe.fuqiuluo.shamrock.xposed.helper.NTServiceFetcher +import moe.fuqiuluo.symbols.OneBotHandler import kotlin.coroutines.resume +@OneBotHandler("get_uin_by_uid") internal object GetUinByUid: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val kernelService = NTServiceFetcher.kernelService @@ -23,8 +25,4 @@ internal object GetUinByUid: IActionHandler() { } return resultToString(true, Status.Ok, uinMap, echo = session.echo) } - - override fun path(): String = "get_uin_by_uid" - - } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetVersionInfo.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetVersionInfo.kt index 8a7251a..6c264db 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetVersionInfo.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetVersionInfo.kt @@ -6,7 +6,9 @@ import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.remote.service.data.VersionInfo import moe.fuqiuluo.shamrock.tools.EmptyJsonString import moe.fuqiuluo.shamrock.tools.ShamrockVersion +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_version_info", ["get_version"]) internal object GetVersionInfo : IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { return invoke(session.echo) @@ -25,9 +27,4 @@ internal object GetVersionInfo : IActionHandler() { echo = echo ) } - - override val alias: Array = arrayOf("get_version") - - override fun path(): String = "get_version_info" - } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetWeather.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetWeather.kt index 6b364f9..0bd1f46 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetWeather.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetWeather.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.qqinterface.servlet.ark.WeatherSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_weather") internal object GetWeather: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { session.getIntOrNull("code")?.let { @@ -31,6 +33,4 @@ internal object GetWeather: IActionHandler() { } return invoke(code.getOrThrow().first().adcode, echo) } - - override fun path(): String = "get_weather" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetWeatherCityCode.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetWeatherCityCode.kt index f395615..9353571 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetWeatherCityCode.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetWeatherCityCode.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.qqinterface.servlet.ark.WeatherSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("get_weather_city_code") internal object GetWeatherCityCode: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val city = session.getString("city") @@ -23,8 +25,5 @@ internal object GetWeatherCityCode: IActionHandler() { return ok(regions, echo) } - override fun path(): String = "get_weather_city_code" - - override val requiredParams: Array = arrayOf("city") } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GroupPoke.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GroupPoke.kt index c0dbdde..f529761 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GroupPoke.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GroupPoke.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.qqinterface.servlet.GroupSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("poke") internal object GroupPoke: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getString("group_id") @@ -19,6 +21,4 @@ internal object GroupPoke: IActionHandler() { } override val requiredParams: Array = arrayOf("group_id", "user_id") - - override fun path(): String = "poke" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/IsBlackListUin.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/IsBlackListUin.kt index fa9855f..1b5a715 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/IsBlackListUin.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/IsBlackListUin.kt @@ -9,9 +9,11 @@ import kotlinx.serialization.json.JsonElement import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine +@OneBotHandler("is_blacklist_uin") internal object IsBlackListUin: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val userId = session.getString("user_id") @@ -32,8 +34,6 @@ internal object IsBlackListUin: IActionHandler() { override val requiredParams: Array = arrayOf("user_id") - override fun path(): String = "is_blacklist_uin" - @Serializable data class IsBlackListUinResult( @SerialName("is") val isBlack: Boolean diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/KickTroopMember.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/KickTroopMember.kt index 44f8959..f839749 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/KickTroopMember.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/KickTroopMember.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.qqinterface.servlet.GroupSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("set_group_kick", ["kick_group_member"]) internal object KickTroopMember: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getLong("group_id") @@ -21,6 +23,4 @@ internal object KickTroopMember: IActionHandler() { } override val requiredParams: Array = arrayOf("group_id", "user_id") - - override fun path(): String = "set_group_kick" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/LeaveTroop.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/LeaveTroop.kt index 3f27f9f..0750b8e 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/LeaveTroop.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/LeaveTroop.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.qqinterface.servlet.GroupSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("leave_group", ["set_group_leave"]) internal object LeaveTroop: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getString("group_id") @@ -21,8 +23,4 @@ internal object LeaveTroop: IActionHandler() { } override val requiredParams: Array = arrayOf("group_id") - - override val alias: Array = arrayOf("set_group_leave") - - override fun path(): String = "leave_group" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/ModifyTroopMemberName.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/ModifyTroopMemberName.kt index 54ff2be..ed495e0 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/ModifyTroopMemberName.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/ModifyTroopMemberName.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.qqinterface.servlet.GroupSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("set_group_card") internal object ModifyTroopMemberName: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getString("group_id") @@ -24,6 +26,4 @@ internal object ModifyTroopMemberName: IActionHandler() { } override val requiredParams: Array = arrayOf("group_id", "user_id") - - override fun path(): String = "set_group_card" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/ModifyTroopName.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/ModifyTroopName.kt index 01034d1..1fb17c6 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/ModifyTroopName.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/ModifyTroopName.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.qqinterface.servlet.GroupSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("set_group_name") internal object ModifyTroopName: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getString("group_id") @@ -24,6 +26,4 @@ internal object ModifyTroopName: IActionHandler() { } override val requiredParams: Array = arrayOf("group_id", "group_name") - - override fun path(): String = "set_group_name" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/QuickOperation.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/QuickOperation.kt index ea7ea95..abad22b 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/QuickOperation.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/QuickOperation.kt @@ -23,7 +23,9 @@ import moe.fuqiuluo.shamrock.tools.asLong import moe.fuqiuluo.shamrock.tools.asString import moe.fuqiuluo.shamrock.tools.json import moe.fuqiuluo.shamrock.tools.jsonArray +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler(".handle_quick_operation_async") internal object QuickOperation: IActionHandler() { val actionMsgTypes = arrayOf( "record", "voice", "video", "markdown" @@ -105,8 +107,6 @@ internal object QuickOperation: IActionHandler() { return logic("操作成功", session.echo) } - override fun path(): String = ".handle_quick_operation_async" - override val requiredParams: Array = arrayOf("context", "operation", "self_id") suspend fun quicklyReply( diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/RenameGroupFolder.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/RenameGroupFolder.kt new file mode 100644 index 0000000..000edb7 --- /dev/null +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/RenameGroupFolder.kt @@ -0,0 +1,27 @@ +package moe.fuqiuluo.shamrock.remote.action.handlers + +import kotlinx.serialization.json.JsonElement +import moe.fuqiuluo.qqinterface.servlet.FileSvc +import moe.fuqiuluo.shamrock.remote.action.ActionSession +import moe.fuqiuluo.shamrock.remote.action.IActionHandler +import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler + +@OneBotHandler("rename_group_folder") +internal object RenameGroupFolder: IActionHandler() { + override suspend fun internalHandle(session: ActionSession): String { + val groupId = session.getString("group_id") + val folderId = session.getString("folder_id") + val name = session.getString("name") + return invoke(groupId, folderId, name, session.echo) + } + + suspend operator fun invoke(groupId: String, folderId: String, name: String, echo: JsonElement = EmptyJsonString): String { + if (!FileSvc.renameFolder(groupId, folderId, name)) { + return error("rename folder failed", echo = echo) + } + return ok("success", echo = echo) + } + + override val requiredParams: Array = arrayOf("group_id", "folder_id", "name") +} \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/RestartMe.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/RestartMe.kt index f8af9dc..500bcfa 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/RestartMe.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/RestartMe.kt @@ -4,7 +4,9 @@ import kotlinx.serialization.json.JsonElement import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("restart_me") internal object RestartMe: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { return invoke(2000, session.echo) @@ -13,6 +15,4 @@ internal object RestartMe: IActionHandler() { operator fun invoke(duration: Int, echo: JsonElement = EmptyJsonString): String { return ok("不支持", echo) } - - override fun path(): String = "set_restart" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/ScanQRCode.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/ScanQRCode.kt index 7bb4c57..ce0cf85 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/ScanQRCode.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/ScanQRCode.kt @@ -5,8 +5,9 @@ import com.tencent.mobileqq.qroute.QRoute import com.tencent.mobileqq.qrscan.api.IQRCodeApi import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler +import moe.fuqiuluo.symbols.OneBotHandler -// TODO +@OneBotHandler("sanc_qrcode") internal object ScanQRCode: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val qrcode = QRoute.api(IQRCodeApi::class.java) @@ -14,8 +15,4 @@ internal object ScanQRCode: IActionHandler() { qrcode.scanImage(picBytes, 0, picBytes.size) return qrcode.version } - - override fun path(): String { - return "sanc_qrcode" - } } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendForwardMessage.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendForwardMessage.kt index bd567a7..4afcef0 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendForwardMessage.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendForwardMessage.kt @@ -15,7 +15,9 @@ import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.remote.service.data.ForwardMessageResult import moe.fuqiuluo.shamrock.tools.* import moe.fuqiuluo.shamrock.xposed.helper.NTServiceFetcher +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("send_forward_msg") internal object SendForwardMessage : IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val detailType = session.getStringOrNull("detail_type") ?: session.getStringOrNull("message_type") @@ -171,6 +173,4 @@ internal object SendForwardMessage : IActionHandler() { } override val requiredParams: Array = arrayOf("messages") - - override fun path(): String = "send_forward_msg" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupForwardMessage.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupForwardMessage.kt index 46d3ee9..d0b095f 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupForwardMessage.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupForwardMessage.kt @@ -3,7 +3,9 @@ package moe.fuqiuluo.shamrock.remote.action.handlers; import com.tencent.qqnt.kernel.nativeinterface.MsgConstant import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("send_group_forward_msg") internal object SendGroupForwardMessage: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getString("group_id") @@ -16,6 +18,4 @@ internal object SendGroupForwardMessage: IActionHandler() { } override val requiredParams: Array = arrayOf("messages", "group_id") - - override fun path(): String = "send_group_forward_msg" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupMessage.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupMessage.kt index 6b3e407..c9ea0fd 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupMessage.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupMessage.kt @@ -4,7 +4,9 @@ import com.tencent.qqnt.kernel.nativeinterface.MsgConstant import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.jsonArray +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("send_group_message", ["send_group_msg"]) internal object SendGroupMessage: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getString("group_id") @@ -24,9 +26,4 @@ internal object SendGroupMessage: IActionHandler() { } override val requiredParams: Array = arrayOf("message", "group_id") - - override fun path(): String = "send_group_message" - - override val alias: Array - get() = arrayOf("send_group_msg") } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupNotice.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupNotice.kt index 674cad6..5881eb9 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupNotice.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupNotice.kt @@ -9,7 +9,9 @@ import moe.fuqiuluo.shamrock.helper.LogCenter import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("send_group_notice", ["send_group_announcement"]) internal object SendGroupNotice: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getLong("group_id") @@ -33,7 +35,4 @@ internal object SendGroupNotice: IActionHandler() { } override val requiredParams: Array = arrayOf("group_id", "content") - - override val alias: Array = arrayOf("send_group_notice") - override fun path(): String = "_send_group_notice" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupSign.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupSign.kt index b2619e8..d784c8c 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupSign.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupSign.kt @@ -1,15 +1,13 @@ package moe.fuqiuluo.shamrock.remote.action.handlers -import com.tencent.qqnt.kernel.nativeinterface.MsgConstant import kotlinx.serialization.json.JsonElement import moe.fuqiuluo.qqinterface.servlet.GroupSvc -import moe.fuqiuluo.qqinterface.servlet.MsgSvc -import moe.fuqiuluo.shamrock.helper.Level -import moe.fuqiuluo.shamrock.helper.LogCenter import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("send_group_sign") internal object SendGroupSign: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getLong("group_id") @@ -26,5 +24,4 @@ internal object SendGroupSign: IActionHandler() { } override val requiredParams: Array = arrayOf("group_id") - override fun path(): String = "send_group_sign" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendLike.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendLike.kt index e6e48bd..b9f413b 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendLike.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendLike.kt @@ -6,7 +6,9 @@ import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString import moe.fuqiuluo.shamrock.tools.errMsg +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("send_like") internal object SendLike: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val times = session.getInt("times") @@ -24,6 +26,4 @@ internal object SendLike: IActionHandler() { } override val requiredParams: Array = arrayOf("times", "user_id") - - override fun path(): String = "send_like" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendMessage.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendMessage.kt index c197162..5114ce6 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendMessage.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendMessage.kt @@ -19,7 +19,9 @@ import moe.fuqiuluo.shamrock.helper.Level import moe.fuqiuluo.shamrock.helper.LogCenter import moe.fuqiuluo.shamrock.tools.EmptyJsonString import moe.fuqiuluo.shamrock.tools.jsonArray +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("send_msg", ["send_message"]) internal object SendMessage: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val detailType = session.getStringOrNull("detail_type") ?: session.getStringOrNull("message_type") @@ -145,8 +147,4 @@ internal object SendMessage: IActionHandler() { } override val requiredParams: Array = arrayOf("message") - - override fun path(): String = "send_message" - - override val alias: Array = arrayOf("send_msg") } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendPrivateForwardMessage.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendPrivateForwardMessage.kt index e64f28f..7cca6cc 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendPrivateForwardMessage.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendPrivateForwardMessage.kt @@ -3,7 +3,9 @@ package moe.fuqiuluo.shamrock.remote.action.handlers; import com.tencent.qqnt.kernel.nativeinterface.MsgConstant import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("send_private_forward_msg") internal object SendPrivateForwardMessage : IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val userId = session.getString("user_id") @@ -16,6 +18,4 @@ internal object SendPrivateForwardMessage : IActionHandler() { } override val requiredParams: Array = arrayOf("messages", "user_id") - - override fun path(): String = "send_private_forward_msg" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendPrivateMessage.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendPrivateMessage.kt index e735f86..c9cb808 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendPrivateMessage.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendPrivateMessage.kt @@ -4,7 +4,9 @@ import com.tencent.qqnt.kernel.nativeinterface.MsgConstant import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.jsonArray +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("send_private_msg", ["send_private_message"]) internal object SendPrivateMessage: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val userId = session.getString("user_id") @@ -51,9 +53,4 @@ internal object SendPrivateMessage: IActionHandler() { } override val requiredParams: Array = arrayOf("message", "user_id") - - override fun path(): String = "send_private_message" - - override val alias: Array - get() = arrayOf("send_private_msg") } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetEssenceMessage.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetEssenceMessage.kt index 79b6503..c1a30c5 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetEssenceMessage.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetEssenceMessage.kt @@ -7,7 +7,9 @@ import moe.fuqiuluo.qqinterface.servlet.MsgSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("set_essence_msg", ["set_essence_message"]) internal object SetEssenceMessage: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val messageId = session.getInt("message_id") @@ -19,18 +21,14 @@ internal object SetEssenceMessage: IActionHandler() { return logic("Obtain msg failed, please check your msg_id.", echo) }.getOrThrow() val (success, tip) = GroupSvc.setEssenceMessage( - if (msg.chatType == MsgConstant.KCHATTYPEGROUP) msg.peerUin else 0, - msg.msgSeq, - msg.msgRandom + groupId = if (msg.chatType == MsgConstant.KCHATTYPEGROUP) msg.peerUin else 0, + seq = msg.msgSeq, + rand = msg.msgRandom ) return if (success) { ok("成功", echo) } else { logic(tip, echo) } - } - - override val alias: Array = arrayOf("set_essence_message") - override fun path(): String = "set_essence_msg" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetFriendAddRequest.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetFriendAddRequest.kt index c7705c3..6e8b6a2 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetFriendAddRequest.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetFriendAddRequest.kt @@ -6,7 +6,9 @@ import moe.fuqiuluo.qqinterface.servlet.GroupSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("set_friend_add_request") internal object SetFriendAddRequest: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val flag = session.getString("flag") @@ -38,10 +40,7 @@ internal object SetFriendAddRequest: IActionHandler() { err.printStackTrace() error("失败:${err.message}", echo) } - } - override fun path(): String = "set_friend_add_request" - override val requiredParams: Array = arrayOf("flag") } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupAddRequest.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupAddRequest.kt index c30a15b..1553526 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupAddRequest.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupAddRequest.kt @@ -7,7 +7,9 @@ import moe.fuqiuluo.shamrock.helper.LogCenter import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("set_group_add_request") internal object SetGroupAddRequest: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val flag = session.getString("flag") @@ -51,7 +53,5 @@ internal object SetGroupAddRequest: IActionHandler() { } } - override fun path(): String = "set_group_add_request" - override val requiredParams: Array = arrayOf("flag", "sub_type") } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupAdmin.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupAdmin.kt index c7223d3..14e0196 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupAdmin.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupAdmin.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.qqinterface.servlet.GroupSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("set_group_admin") internal object SetGroupAdmin: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getLong("group_id") @@ -21,6 +23,4 @@ internal object SetGroupAdmin: IActionHandler() { GroupSvc.setGroupAdmin(groupId, userId, enable) return ok("成功", echo) } - - override fun path(): String = "set_group_admin" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupUnique.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupUnique.kt index 428b2ea..8668a85 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupUnique.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupUnique.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.qqinterface.servlet.GroupSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("set_group_special_title") internal object SetGroupUnique: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getString("group_id") @@ -23,7 +25,4 @@ internal object SetGroupUnique: IActionHandler() { } override val requiredParams: Array = arrayOf("group_id", "user_id", "special_title") - - - override fun path(): String = "set_group_special_title" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupWholeBan.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupWholeBan.kt index cfbf852..ff18764 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupWholeBan.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupWholeBan.kt @@ -5,7 +5,9 @@ import moe.fuqiuluo.qqinterface.servlet.GroupSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("set_group_whole_ban") internal object SetGroupWholeBan: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getLong("group_id") @@ -19,6 +21,4 @@ internal object SetGroupWholeBan: IActionHandler() { } override val requiredParams: Array = arrayOf() - - override fun path(): String = "set_group_whole_ban" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetModelShow.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetModelShow.kt index 88b7f81..beded26 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetModelShow.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetModelShow.kt @@ -6,7 +6,9 @@ import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.qqinterface.servlet.CardSvc import moe.fuqiuluo.shamrock.tools.EmptyJsonString import moe.fuqiuluo.shamrock.utils.PlatformUtils +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("_set_model_show") internal object SetModelShow : IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val model = session.getString("model") @@ -30,6 +32,4 @@ internal object SetModelShow : IActionHandler() { } override val requiredParams: Array = arrayOf("model") - - override fun path(): String = "_set_model_show" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetProfileCard.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetProfileCard.kt index 15f2fc5..162a1be 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetProfileCard.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetProfileCard.kt @@ -6,8 +6,10 @@ import com.tencent.mobileqq.profilecard.api.IProfileProtocolService import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher +import moe.fuqiuluo.symbols.OneBotHandler import mqq.app.MobileQQ +@OneBotHandler("set_qq_profile") internal object SetProfileCard: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val nickName = session.getString("nickname") @@ -40,6 +42,4 @@ internal object SetProfileCard: IActionHandler() { } override val requiredParams: Array = arrayOf("nickname", "company", "email", "college", "personal_note") - - override fun path(): String = "set_qq_profile" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SwitchAccount.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SwitchAccount.kt index 187e93d..03a77b8 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SwitchAccount.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SwitchAccount.kt @@ -5,8 +5,10 @@ import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher +import moe.fuqiuluo.symbols.OneBotHandler import mqq.app.MobileQQ +@OneBotHandler("switch_account") internal object SwitchAccount: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val userId = session.getString("user_id") @@ -30,6 +32,4 @@ internal object SwitchAccount: IActionHandler() { } override val requiredParams: Array = arrayOf("user_id") - - override fun path(): String = "switch_account" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/TestHandler.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/TestHandler.kt index 7453dae..2cdcbea 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/TestHandler.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/TestHandler.kt @@ -6,7 +6,9 @@ import moe.fuqiuluo.shamrock.remote.action.ActionSession import de.robv.android.xposed.XposedBridge.log import moe.fuqiuluo.shamrock.remote.entries.Status import moe.fuqiuluo.shamrock.remote.entries.resultToString +import moe.fuqiuluo.symbols.OneBotHandler +@OneBotHandler("test") internal object TestHandler: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { kotlin.runCatching { @@ -23,7 +25,7 @@ internal object TestHandler: IActionHandler() { } return "error" } - override fun path(): String = "test" + @Serializable data class Test(val time: Long) } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/UploadGroupFile.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/UploadGroupFile.kt index 0764880..43970cd 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/UploadGroupFile.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/UploadGroupFile.kt @@ -26,10 +26,12 @@ import moe.fuqiuluo.shamrock.remote.service.api.RichMediaUploadHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString import moe.fuqiuluo.shamrock.utils.FileUtils import moe.fuqiuluo.shamrock.utils.MD5 +import moe.fuqiuluo.symbols.OneBotHandler import java.io.File import java.io.FileOutputStream import kotlin.coroutines.resume +@OneBotHandler("upload_group_file") internal object UploadGroupFile : IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getString("group_id") @@ -134,8 +136,6 @@ internal object UploadGroupFile : IActionHandler() { override val requiredParams: Array = arrayOf("group_id", "file", "name") - override fun path(): String = "upload_group_file" - @Serializable data class FileUploadResult( @SerialName("msg_id") val msgHash: Int, diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/UploadPrivateFile.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/UploadPrivateFile.kt index 425b4d3..3939db8 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/UploadPrivateFile.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/UploadPrivateFile.kt @@ -27,10 +27,12 @@ import moe.fuqiuluo.shamrock.remote.service.api.RichMediaUploadHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString import moe.fuqiuluo.shamrock.utils.FileUtils import moe.fuqiuluo.shamrock.utils.MD5 +import moe.fuqiuluo.symbols.OneBotHandler import java.io.File import java.io.FileOutputStream import kotlin.coroutines.resume +@OneBotHandler("upload_private_file") internal object UploadPrivateFile : IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val userId = session.getString("user_id") @@ -134,6 +136,4 @@ internal object UploadPrivateFile : IActionHandler() { } override val requiredParams: Array = arrayOf("user_id", "file", "name") - - override fun path(): String = "upload_private_file" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/AioListener.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/AioListener.kt index 3dd0e89..83bf27d 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/AioListener.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/AioListener.kt @@ -78,7 +78,7 @@ internal object AioListener : IKernelMsgListener { when (record.chatType) { MsgConstant.KCHATTYPEGROUP -> { - LogCenter.log("群消息(group = ${record.peerName}(${record.peerUin}), uin = ${record.senderUin}, id = $msgHash|${record.msgSeq}, msg = $rawMsg)") + LogCenter.log("群消息(group = ${record.peerName}(${record.peerUin}), uin = ${record.senderUin}, id = $msgHash, seq = ${record.msgSeq}, msg = $rawMsg)") ShamrockConfig.getGroupMsgRule()?.let { rule -> if (!rule.black.isNullOrEmpty() && rule.black.contains(record.senderUin)) return if (!rule.white.isNullOrEmpty() && !rule.white.contains(record.senderUin)) return diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/GroupEventListener.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/GroupEventListener.kt index bc51aee..9f9d7c0 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/GroupEventListener.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/GroupEventListener.kt @@ -1,3 +1,5 @@ +@file:OptIn(DelicateCoroutinesApi::class) + package moe.fuqiuluo.shamrock.remote.service.listener import com.tencent.qqnt.kernel.nativeinterface.BulletinFeedsDownloadInfo @@ -15,6 +17,10 @@ import com.tencent.qqnt.kernel.nativeinterface.GroupStatisticInfo import com.tencent.qqnt.kernel.nativeinterface.IKernelGroupListener import com.tencent.qqnt.kernel.nativeinterface.JoinGroupNotifyMsg import com.tencent.qqnt.kernel.nativeinterface.MemberInfo +import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import moe.fuqiuluo.qqinterface.servlet.GroupSvc import moe.fuqiuluo.shamrock.helper.LogCenter import java.util.ArrayList import java.util.HashMap @@ -29,7 +35,7 @@ internal object GroupEventListener: IKernelGroupListener { } override fun onGroupAvatarUrlChange(j2: Long, str: String?) { - //LogCenter.log("onGroupAvatarUrlChange($j2, $str)") + LogCenter.log("onGroupAvatarUrlChange($j2, $str)") } override fun onGroupBulletinChange(j2: Long, groupBulletin: GroupBulletin?) { @@ -49,14 +55,14 @@ internal object GroupEventListener: IKernelGroupListener { } override fun onGroupDetailInfoChange(groupDetailInfo: GroupDetailInfo?) { - //LogCenter.log("onGroupDetailInfoChange($groupDetailInfo)") + LogCenter.log("onGroupDetailInfoChange($groupDetailInfo)") } override fun onGroupListUpdate( groupListUpdateType: GroupListUpdateType?, arrayList: ArrayList? ) { - //LogCenter.log("onGroupListUpdate($groupListUpdateType, $arrayList)") + LogCenter.log("onGroupListUpdate($groupListUpdateType, $arrayList)") } override fun onGroupNotifiesUnreadCountUpdated(z: Boolean, j2: Long, i2: Int) { @@ -72,7 +78,7 @@ internal object GroupEventListener: IKernelGroupListener { arrayList: ArrayList?, arrayList2: ArrayList? ) { - //LogCenter.log("onGroupPortraitChange($j2, $arrayList, $arrayList2)") + LogCenter.log("onGroupPortraitChange($j2, $arrayList, $arrayList2)") } override fun onGroupSingleScreenNotifies( @@ -96,11 +102,19 @@ internal object GroupEventListener: IKernelGroupListener { } override fun onMemberInfoChange( - j2: Long, - dataSource: DataSource?, - hashMap: HashMap? + groupCode: Long, + dataSource: DataSource, + hashMap: HashMap ) { - //LogCenter.log("onMemberInfoChange($j2, $dataSource, $hashMap)") + /*GlobalScope.launch { + hashMap.values.forEach { memberInfo -> + GroupSvc.getTroopMemberInfoByUid(groupCode, memberInfo.uid).onSuccess { + LogCenter.log("onMemberInfoChange($groupCode, $dataSource, $it, $memberInfo)") + }.onFailure { + LogCenter.log("onMemberInfoChange($groupCode, $dataSource, $it, $memberInfo)") + } + } + }*/ } override fun onMemberListChange(groupMemberListChangeInfo: GroupMemberListChangeInfo?) { diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/PrimitiveListener.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/PrimitiveListener.kt index 34c431a..25052b5 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/PrimitiveListener.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/PrimitiveListener.kt @@ -1,4 +1,4 @@ -@file:OptIn(DelicateCoroutinesApi::class) +@file:OptIn(DelicateCoroutinesApi::class, ExperimentalSerializationApi::class) package moe.fuqiuluo.shamrock.remote.service.listener @@ -10,9 +10,11 @@ import kotlinx.coroutines.launch import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.discardExact import kotlinx.io.core.readBytes +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.decodeFromByteArray import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonElement -import moe.fuqiuluo.proto.* +import kotlinx.serialization.protobuf.ProtoBuf import moe.fuqiuluo.qqinterface.servlet.FriendSvc.requestFriendSystemMsgNew import moe.fuqiuluo.qqinterface.servlet.GroupSvc import moe.fuqiuluo.qqinterface.servlet.GroupSvc.requestGroupSystemMsgNew @@ -28,15 +30,17 @@ import moe.fuqiuluo.shamrock.remote.service.data.push.RequestSubType import moe.fuqiuluo.shamrock.tools.asJsonObject import moe.fuqiuluo.shamrock.tools.asString import moe.fuqiuluo.shamrock.tools.readBuf32Long -import moe.fuqiuluo.shamrock.tools.toHexString import moe.fuqiuluo.shamrock.xposed.helper.PacketHandler +import moe.whitechi73.protobuf.message.* +import moe.whitechi73.protobuf.push.* internal object PrimitiveListener { fun registerListener() { PacketHandler.register("trpc.msg.olpush.OlPushService.MsgPush") { _, buffer -> GlobalScope.launch { try { - onMsgPush(ProtoUtils.decodeFromByteArray(buffer.slice(4))) + val push = ProtoBuf.decodeFromByteArray(buffer.slice(4)) + onMsgPush(push) } catch (e: Exception) { LogCenter.log(e.stackTraceToString(), Level.WARN) } @@ -44,40 +48,41 @@ internal object PrimitiveListener { } } - private suspend fun onMsgPush(pb: ProtoMap) { + private suspend fun onMsgPush(push: MessagePush) { if ( - !pb.has(1, 3) - || !pb.has(1, 2) - || !pb.has(1, 2, 6) + push.msgBody == null || + push.msgBody!!.contentHead == null || + push.msgBody!!.richMsg == null || + push.msgBody!!.contentHead!!.msgTime == null ) return - val msgType = pb[1, 2, 1].asInt - var subType = 0 - if (pb.has(1, 2, 3) && pb.has(1, 2, 2)) { - subType = pb[1, 2, 2].asInt - } - val msgTime = pb[1, 2, 6].asLong + val msgBody = push.msgBody!! + val contentHead = msgBody.contentHead!! + val msgType = contentHead.msgType + val subType = contentHead.msgSubType + val msgTime = contentHead.msgTime!! + val richMsg = msgBody.richMsg!! try { when (msgType) { - 33 -> onGroupMemIncreased(msgTime, pb) - 34 -> onGroupMemberDecreased(msgTime, pb) - 44 -> onGroupAdminChange(msgTime, pb) - 84 -> onGroupApply(msgTime, pb) - 87 -> onInviteGroup(msgTime, pb) + 33 -> onGroupMemIncreased(msgTime, richMsg) + 34 -> onGroupMemberDecreased(msgTime, richMsg) + 44 -> onGroupAdminChange(msgTime, richMsg) + 84 -> onGroupApply(msgTime, contentHead, richMsg) + 87 -> onInviteGroup(msgTime, msgBody.msgHead!!, richMsg) 528 -> when (subType) { - 35 -> onFriendApply(msgTime, pb) - 39 -> onCardChange(msgTime, pb) + 35 -> onFriendApply(msgTime, push.clientInfo!!, richMsg) + 39 -> onCardChange(msgTime, richMsg) // invite - 68 -> onGroupApply(msgTime, pb) - 138 -> onC2CRecall(msgTime, pb) - 290 -> onC2cPoke(msgTime, pb) + 68 -> onGroupApply(msgTime, contentHead, richMsg) + 138 -> onC2CRecall(msgTime, richMsg) + 290 -> onC2CPoke(msgTime, richMsg) } 732 -> when (subType) { - 12 -> onGroupBan(msgTime, pb) - 16 -> onGroupTitleChange(msgTime, pb) - 17 -> onGroupRecall(msgTime, pb) - 20 -> onGroupPokeAndGroupSign(msgTime, pb) - 21 -> onEssenceMessage(msgTime, pb) + 12 -> onGroupBan(msgTime, richMsg) + 16 -> onGroupUniqueTitleChange(msgTime, richMsg) + 17 -> onGroupRecall(msgTime, richMsg) + 20 -> onGroupPokeAndGroupSign(msgTime, richMsg) + 21 -> onEssenceMessage(msgTime, push.clientInfo, richMsg) } } } catch (e: Exception) { @@ -85,31 +90,19 @@ internal object PrimitiveListener { } } - private suspend fun onC2cPoke(msgTime: Long, pb: ProtoMap) { - val detail = pb[1, 3, 2] - if (detail !is ProtoMap) { - error("不支持该私聊戳一戳解析: ${(detail as ProtoByteString).toByteArray().toHexString()}") + private suspend fun onC2CPoke(msgTime: Long, richMsg: RichMessage) { + val event = ProtoBuf.decodeFromByteArray(richMsg.rawBuffer!!) + if (event.params == null) return + + val params = event.params!!.associate { + it.key to it.value } - lateinit var target: String - lateinit var operation: String - var suffix: String? = null - var actionImg: String? = null - var action: String? = null - detail[7] - .asList - .value - .forEach { - val value = it[2].asUtf8String - when (it[1].asUtf8String) { - "uin_str1" -> operation = value - "uin_str2" -> target = value - "action_str" -> action = value - "alt_str1" -> action = value - "suffix_str" -> suffix = value - "action_img_url" -> actionImg = value - } - } + val target = params["uin_str2"] ?: return + val operation = params["uin_str1"] ?: return + val suffix = params["suffix_str"] ?: "" + val actionImg = params["action_img_url"] ?: "" + val action = params["alt_str1"] ?: "" LogCenter.log("私聊戳一戳: $operation $action $target $suffix") @@ -120,16 +113,22 @@ internal object PrimitiveListener { } } - private suspend fun onFriendApply(msgTime: Long, pb: ProtoMap) { - val applierUid = pb[1, 3, 2, 1, 2].asUtf8String - val msg = pb[1, 3, 2, 1, 10].asUtf8String - val source = pb[1, 3, 2, 1, 11].asUtf8String + private suspend fun onFriendApply( + msgTime: Long, + clientInfo: MessagePushClientInfo, + richMsg: RichMessage + ) { + val event = ProtoBuf.decodeFromByteArray(richMsg.rawBuffer!!) + val head = event.head!! + val applierUid = head.applierUid + val msg = head.applyMsg ?: "" + val source = head.source ?: "" var applier = ContactHelper.getUinByUidAsync(applierUid).toLong() if (applier == 0L) { - applier = pb[4, 3, 8].asLong + applier = clientInfo.liteHead?.sender?.toLong() ?: 0 } - val src = pb[1, 3, 2, 1, 7].asInt - val subSrc = pb[1, 3, 2, 1, 8].asInt + val src = head.srcId + val subSrc = head.subSrc val flag: String = try { val reqs = requestFriendSystemMsgNew(20, 0, 0) val req = reqs?.first { @@ -149,18 +148,21 @@ internal object PrimitiveListener { } - private suspend fun onCardChange(msgTime: Long, pb: ProtoMap) { + private suspend fun onCardChange(msgTime: Long, richMsg: RichMessage) { + LogCenter.log("群名片事件异常,请尝试提交issue!", Level.WARN) + /*try { + val readPacket = ByteReadPacket(richMsg.rawBuffer!!) + if(readPacket.readBuf32Long() == + readPacket.discardExact(1) + detail = ProtoUtils.decodeFromByteArray(readPacket.readBytes(readPacket.readShort().toInt())) + readPacket.release() + } catch (e: Exception) { + LogCenter.log("onCardChange error: ${e.stackTraceToString()}", Level.WARN) + } + var detail = pb[1, 3, 2] if (detail !is ProtoMap) { - try { - val readPacket = ByteReadPacket(detail.asByteArray) - readPacket.readBuf32Long() - readPacket.discardExact(1) - detail = ProtoUtils.decodeFromByteArray(readPacket.readBytes(readPacket.readShort().toInt())) - readPacket.release() - } catch (e: Exception) { - LogCenter.log("onCardChange error: ${e.stackTraceToString()}", Level.WARN) - } + } val targetId = detail[1, 13, 2].asUtf8String @@ -187,39 +189,34 @@ internal object PrimitiveListener { .transCardChange(msgTime, targetQQ, oldCard, newCard, groupId) ) { LogCenter.log("群名片变动推送失败!", Level.WARN) - } + }*/ } - private suspend fun onGroupTitleChange(msgTime: Long, pb: ProtoMap) { - var detail = pb[1, 3, 2] - if (detail !is ProtoMap) { - try { - val readPacket = ByteReadPacket(detail.asByteArray) - readPacket.readBuf32Long() - readPacket.discardExact(1) - detail = ProtoUtils.decodeFromByteArray(readPacket.readBytes(readPacket.readShort().toInt())) + private suspend fun onGroupUniqueTitleChange(msgTime: Long, richMsg: RichMessage) { + val event = runCatching { + ProtoBuf.decodeFromByteArray(richMsg.rawBuffer!!) + }.getOrElse { + val readPacket = ByteReadPacket(richMsg.rawBuffer!!) + readPacket.readBuf32Long() + readPacket.discardExact(1) + + ProtoBuf.decodeFromByteArray(readPacket.readBytes(readPacket.readShort().toInt()).also { readPacket.release() - } catch (e: Exception) { - LogCenter.log("onGroupTitleChange error: ${e.stackTraceToString()}", Level.WARN) - } - } - var groupId:Long - try { - groupId = detail[4].asULong - }catch (e: ClassCastException){ - groupId = detail[4].asList.value[0].asULong + }) } + val groupId = event.groupCode.toLong() + val detail = event.uniqueTitleChangeDetail!!.first() - detail = if (detail[5] is ProtoList) { - (detail[5] as ProtoList).value[0] - } else { - detail[5] - } + //detail = if (detail[5] is ProtoList) { + // (detail[5] as ProtoList).value[0] + //} else { + // detail[5] + // } - val targetUin = detail[5].asLong + val targetUin = detail.targetUin.toLong() // 恭喜<{\"cmd\":5,\"data\":\"qq\",\"text}\":\"nickname\"}>获得群主授予的<{\"cmd\":1,\"data\":\"https://qun.qq.com/qqweb/m/qun/medal/detail.html?_wv=16777223&bid=2504&gc=gid&isnew=1&medal=302&uin=uin\",\"text\":\"title\",\"url\":\"https://qun.qq.com/qqweb/m/qun/medal/detail.html?_wv=16777223&bid=2504&gc=gid&isnew=1&medal=302&uin=uin\"}>头衔 - val titleChangeInfo = detail[2].asUtf8String + val titleChangeInfo = detail.wording if (titleChangeInfo.indexOf("群主授予") == -1) { return } @@ -236,45 +233,44 @@ internal object PrimitiveListener { } } - private suspend fun onEssenceMessage(msgTime: Long, pb: ProtoMap) { - var detail = pb[1, 3, 2] - if (detail !is ProtoMap) { - try { - val readPacket = ByteReadPacket(detail.asByteArray) - readPacket.readBuf32Long() - readPacket.discardExact(1) - detail = ProtoUtils.decodeFromByteArray(readPacket.readBytes(readPacket.readShort().toInt())) - readPacket.release() - } catch (e: Exception) { - LogCenter.log("onEssenceMessage error: ${e.stackTraceToString()}", Level.WARN) - } - } + private suspend fun onEssenceMessage( + msgTime: Long, + clientInfo: MessagePushClientInfo?, + richMsg: RichMessage + ) { + if (clientInfo == null) return + val event = runCatching { + ProtoBuf.decodeFromByteArray(richMsg.rawBuffer!!) + }.getOrElse { + val readPacket = ByteReadPacket(richMsg.rawBuffer!!) + readPacket.readBuf32Long() + readPacket.discardExact(1) - var groupId:Long - try { - groupId = detail[4].asULong - }catch (e: ClassCastException){ - groupId = detail[4].asList.value[0].asULong + ProtoBuf.decodeFromByteArray(readPacket.readBytes(readPacket.readShort().toInt()).also { + readPacket.release() + }) } - val mesSeq = detail[37].asInt - val senderUin = detail[33, 5].asLong - val operatorUin = detail[33, 6].asLong - var msgId = 0 - MessageHelper.getMsgMappingBySeq(MsgConstant.KCHATTYPEGROUP, mesSeq).also { - if (it != null) { - msgId = it.msgHashId + val groupId = event.groupCode.toLong() + val detail = event.essenceMsgInfo!!.first() + + val megSeq = event.msgSeq.toInt() + val senderUin = detail.sender.toLong() + val operatorUin = detail.operator.toLong() + val msgHashId = MessageHelper.getMsgMappingBySeq(MsgConstant.KCHATTYPEGROUP, groupId.toString(), megSeq).also { + if (it == null) { + LogCenter.log("精华消息变动推送失败!找不到消息映射关系!", Level.WARN) + return } - } - val subType = when (val type = detail[33, 4].asInt) { - 1 -> { - // add essence - LogCenter.log("群设精消息($groupId): $senderUin $msgId $operatorUin") + }!!.msgHashId + + val subType = when (val type = detail.type) { + 1u -> { + LogCenter.log("群设精消息(groupId=$groupId, sender=$senderUin, msgId=$msgHashId, operator=$operatorUin)") NoticeSubType.Add } - 2 -> { - // remove essence - LogCenter.log("群取精消息($groupId): $senderUin $msgId $operatorUin") + 2u -> { + LogCenter.log("群撤精消息(groupId=$groupId, sender=$senderUin, msgId=$msgHashId, operator=$operatorUin)") NoticeSubType.Delete } @@ -282,68 +278,44 @@ internal object PrimitiveListener { } if (!GlobalEventTransmitter.GroupNoticeTransmitter - .transEssenceChange(msgTime, senderUin, operatorUin, msgId, groupId, subType) + .transEssenceChange(msgTime, senderUin, operatorUin, msgHashId, groupId, subType) ) { LogCenter.log("精华消息变动推送失败!", Level.WARN) } } - private suspend fun onGroupPokeAndGroupSign(time: Long, pb: ProtoMap) { - var detail = pb[1, 3, 2] - if (detail !is ProtoMap) { - try { - val readPacket = ByteReadPacket(detail.asByteArray) - readPacket.discardExact(4) - readPacket.discardExact(1) - detail = ProtoUtils.decodeFromByteArray(readPacket.readBytes(readPacket.readShort().toInt())) + private suspend fun onGroupPokeAndGroupSign(time: Long, richMsg: RichMessage) { + val event = runCatching { + ProtoBuf.decodeFromByteArray(richMsg.rawBuffer!!) + }.getOrElse { + val readPacket = ByteReadPacket(richMsg.rawBuffer!!) + readPacket.discardExact(4) + readPacket.discardExact(1) + + ProtoBuf.decodeFromByteArray(readPacket.readBytes(readPacket.readShort().toInt()).also { readPacket.release() - } catch (e: Exception) { - LogCenter.log("onGroupPokeAndGroupSign error: ${e.stackTraceToString()}", Level.WARN) - } + }) } - val groupId = try { - detail[4].asULong - }catch (e: ClassCastException){ - detail[4].asList.value[0].asULong + val groupId = event.groupCode.toLong() + val detail = event.baseTips!!.first() + + val params = detail.params!!.associate { + it.key to it.value } - detail = if (detail[26] is ProtoList) { - (detail[26] as ProtoList).value[0] - } else { - detail[26] - } + val target = params["uin_str2"] ?: params["mqq_uin"] ?: return + val operation = params["uin_str1"] ?: return + val suffix = params["suffix_str"] ?: "" + val actionImg = params["action_img_url"] ?: "" + val action = params["alt_str1"] + ?: params["action_str"] + ?: params["user_sign"] + ?: "" + val rankImg = params["rank_img"] ?: "" - lateinit var target: String - lateinit var operation: String - var action: String? = null - var suffix: String? = null - var actionImg: String? = null - var rankImg: String? = null - detail[7] - .asList - .value - .forEach { - val value = it[2].asUtf8String - when (it[1].asUtf8String) { - "uin_str1" -> operation = value - "uin_str2" -> target = value - // "nick_str1" -> operation_nick = value - // "nick_str2" -> operation_nick = value - "action_str" -> action = value - "alt_str1" -> action = value - "suffix_str" -> suffix = value - "action_img_url" -> actionImg = value - - "mqq_uin" -> target = value - // "mqq_nick" -> operation_nick = value - "user_sign" -> action = value - "rank_img" -> rankImg = value - // "sign_word" -> 我也要打卡 - } - } - when (detail[2].asInt) { - 1061 -> { + when (detail.type) { + 1061u -> { LogCenter.log("群戳一戳($groupId): $operation $action $target $suffix") if (!GlobalEventTransmitter.GroupNoticeTransmitter .transGroupPoke(time, operation.toLong(), target.toLong(), action, suffix, actionImg, groupId) @@ -352,7 +324,7 @@ internal object PrimitiveListener { } } - 1068 -> { + 1068u -> { LogCenter.log("群打卡($groupId): $action $target") if (!GlobalEventTransmitter.GroupNoticeTransmitter .transGroupSign(time, target.toLong(), action, rankImg, groupId) @@ -362,35 +334,41 @@ internal object PrimitiveListener { } else -> { - LogCenter.log("onGroupPokeAndGroupSign unknown type ${detail[2].asInt}", Level.WARN) + LogCenter.log("onGroupPokeAndGroupSign unknown type ${detail.type}", Level.WARN) } } } - private suspend fun onC2CRecall(time: Long, pb: ProtoMap) { - val operationUid = pb[1, 3, 2, 1, 1].asUtf8String - val msgSeq = pb[1, 3, 2, 1, 20].asLong - val tipText = if (pb.has(1, 3, 2, 1, 13)) pb[1, 3, 2, 1, 13, 2].asUtf8String else "" - val mapping = MessageHelper.getMsgMappingBySeq(MsgConstant.KCHATTYPEC2C, msgSeq.toInt()) + private suspend fun onC2CRecall(time: Long, richMsg: RichMessage) { + val event = ProtoBuf.decodeFromByteArray(richMsg.rawBuffer!!) + val head = event.head!! + + val operationUid = head.operator!! + val operator = ContactHelper.getUinByUidAsync(operationUid).toLong() + + val msgSeq = head.msgSeq + val tipText = head.wording?.wording ?: "" + + val mapping = MessageHelper.getMsgMappingBySeq(MsgConstant.KCHATTYPEC2C, operator.toString(), msgSeq.toInt()) if (mapping == null) { LogCenter.log("由于缺失消息映射关系,消息撤回事件无法推送!", Level.WARN) return } - val operation = ContactHelper.getUinByUidAsync(operationUid).toLong() - LogCenter.log("私聊消息撤回: $operation, seq = $msgSeq, hash = ${mapping.msgHashId}, tip = $tipText") + LogCenter.log("私聊消息撤回: $operator, seq = $msgSeq, hash = ${mapping.msgHashId}, tip = $tipText") if (!GlobalEventTransmitter.PrivateNoticeTransmitter - .transPrivateRecall(time, operation, mapping.msgHashId, tipText) + .transPrivateRecall(time, operator, mapping.msgHashId, tipText) ) { LogCenter.log("私聊消息撤回推送失败!", Level.WARN) } } - private suspend fun onGroupMemIncreased(time: Long, pb: ProtoMap) { - val groupCode = pb[1, 3, 2, 1].asULong - val targetUid = pb[1, 3, 2, 3].asUtf8String - val type = pb[1, 3, 2, 4].asInt + private suspend fun onGroupMemIncreased(time: Long, richMsg: RichMessage) { + val event = ProtoBuf.decodeFromByteArray(richMsg.rawBuffer!!) + val groupCode = event.groupCode + val targetUid = event.memberUid + val type = event.type GroupSvc.getGroupMemberList(groupCode.toString(), true).onFailure { LogCenter.log("新成员加入刷新群成员列表失败: $groupCode", Level.WARN) @@ -398,7 +376,7 @@ internal object PrimitiveListener { LogCenter.log("新成员加入刷新群成员列表成功,群成员数量: ${it.size}", Level.INFO) } - val operatorUid = pb[1, 3, 2, 5].asUtf8String + val operatorUid = event.operatorUid val operator = ContactHelper.getUinByUidAsync(operatorUid).toLong() val target = ContactHelper.getUinByUidAsync(targetUid).toLong() LogCenter.log("群成员增加($groupCode): $target, type = $type") @@ -416,15 +394,12 @@ internal object PrimitiveListener { } } - private suspend fun onGroupMemberDecreased(time: Long, pb: ProtoMap) { - val groupCode = pb[1, 3, 2, 1].asULong - val targetUid = pb[1, 3, 2, 3].asUtf8String - val type = pb[1, 3, 2, 4].asInt - val operatorUid = try { - pb[1, 3, 2, 5, 1, 1].asUtf8String - } catch (e: Throwable) { - pb[1, 3, 2, 5].asUtf8String - } + private suspend fun onGroupMemberDecreased(time: Long, richMsg: RichMessage) { + val event = ProtoBuf.decodeFromByteArray(richMsg.rawBuffer!!) + val groupCode = event.groupCode + val targetUid = event.memberUid + val type = event.type + val operatorUid = event.operatorUid GroupSvc.getGroupMemberList(groupCode.toString(), true).onFailure { LogCenter.log("新成员加入刷新群成员列表失败: $groupCode", Level.WARN) @@ -452,17 +427,23 @@ internal object PrimitiveListener { } } - private suspend fun onGroupAdminChange(msgTime: Long, pb: ProtoMap) { - val groupCode = pb[1, 3, 2, 1].asULong - lateinit var targetUid: String + private suspend fun onGroupAdminChange(msgTime: Long, richMsg: RichMessage) { + val event = ProtoBuf.decodeFromByteArray(richMsg.rawBuffer!!) + val groupCode = event.groupCode + if (event.operation == null) return + val operation = event.operation!! + if (operation.setInfo == null && operation.unsetInfo == null) return + val isSetAdmin: Boolean - if (pb.has(1, 3, 2, 4, 1)) { - targetUid = pb[1, 3, 2, 4, 1, 1].asUtf8String - isSetAdmin = pb[1, 3, 2, 4, 1, 2].asInt == 1 + val targetUid: String + if (operation.setInfo == null) { + isSetAdmin = false + targetUid = operation.unsetInfo!!.targetUid!! } else { - targetUid = pb[1, 3, 2, 4, 2, 1].asUtf8String - isSetAdmin = pb[1, 3, 2, 4, 2, 2].asInt == 1 + isSetAdmin = true + targetUid = operation.setInfo!!.targetUid!! } + val target = ContactHelper.getUinByUidAsync(targetUid).toLong() LogCenter.log("群管理员变动($groupCode): $target, isSetAdmin = $isSetAdmin") @@ -473,12 +454,13 @@ internal object PrimitiveListener { } } - private suspend fun onGroupBan(msgTime: Long, pb: ProtoMap) { - val groupCode = pb[1, 3, 2, 1].asULong - val operatorUid = pb[1, 3, 2, 4].asUtf8String - val wholeBan = !pb.has(1, 3, 2, 5, 3, 1) - val targetUid = if (wholeBan) "" else pb[1, 3, 2, 5, 3, 1].asUtf8String - val rawDuration = pb[1, 3, 2, 5, 3, 2].asInt + private suspend fun onGroupBan(msgTime: Long, richMsg: RichMessage) { + val event = ProtoBuf.decodeFromByteArray(richMsg.rawBuffer!!) + val groupCode = event.groupCode.toLong() + val operatorUid = event.operatorUid + val wholeBan = event.target?.target?.targetUid == null + val targetUid = event.target?.target?.targetUid ?: "" + val rawDuration = event.target?.target?.rawDuration?.toInt() ?: 0 val operator = ContactHelper.getUinByUidAsync(operatorUid).toLong() val duration = if (wholeBan) -1 else rawDuration @@ -497,29 +479,24 @@ internal object PrimitiveListener { } } - private suspend fun onGroupRecall(time: Long, pb: ProtoMap) { - var detail = pb[1, 3, 2] - if (detail !is ProtoMap) { - try { - val readPacket = ByteReadPacket(detail.asByteArray) - readPacket.discardExact(4) - readPacket.discardExact(1) - detail = ProtoUtils.decodeFromByteArray(readPacket.readBytes(readPacket.readShort().toInt())) + private suspend fun onGroupRecall(time: Long, richMsg: RichMessage) { + val event = runCatching { + ProtoBuf.decodeFromByteArray(richMsg.rawBuffer!!) + }.getOrElse { + val readPacket = ByteReadPacket(richMsg.rawBuffer!!) + readPacket.discardExact(4) + readPacket.discardExact(1) + ProtoBuf.decodeFromByteArray(readPacket.readBytes(readPacket.readShort().toInt()).also { readPacket.release() - } catch (e: Exception) { - LogCenter.log("onGroupRecall error: ${e.stackTraceToString()}", Level.WARN) - } + }) } - val groupCode:Long = try { - detail[4].asULong - }catch (e: ClassCastException){ - detail[4].asList.value[0].asULong - } - val operatorUid = detail[11, 1].asUtf8String - val targetUid = detail[11, 3, 6].asUtf8String - val msgSeq = detail[11, 3, 1].asLong - val tipText = if (detail.has(11, 9)) detail[11, 9, 2].asUtf8String else "" - val mapping = MessageHelper.getMsgMappingBySeq(MsgConstant.KCHATTYPEGROUP, msgSeq.toInt()) + val groupCode = event.groupCode.toLong() + val detail = event.recallDetails!! + val operatorUid = detail.operatorUid + val targetUid = detail.msgInfo!!.senderUid + val msgSeq = detail.msgInfo!!.msgSeq.toLong() + val tipText = detail.wording?.wording ?: "" + val mapping = MessageHelper.getMsgMappingBySeq(MsgConstant.KCHATTYPEGROUP, groupCode.toString(), msgSeq.toInt()) if (mapping == null) { LogCenter.log("由于缺失消息映射关系(seq = $msgSeq),消息撤回事件无法推送!", Level.WARN) return @@ -536,23 +513,25 @@ internal object PrimitiveListener { } } - private suspend fun onGroupApply(time: Long, pb: ProtoMap) { - when (pb[1, 2, 1].asInt) { + private suspend fun onGroupApply(time: Long, contentHead: MessageContentHead, richMsg: RichMessage) { + when (contentHead.msgType) { 84 -> { - val groupCode = pb[1, 3, 2, 1].asULong - val applierUid = pb[1, 3, 2, 3].asUtf8String - val reason = pb[1, 3, 2, 5].asUtf8String + val event = ProtoBuf.decodeFromByteArray(richMsg.rawBuffer!!) + val groupCode = event.groupCode + val applierUid = event.applierUid + val reason = event.applyMsg ?: "" val applier = ContactHelper.getUinByUidAsync(applierUid).toLong() if (applier == getLongUin()) { return } - LogCenter.log("入群申请($groupCode) $applier: \"$reason\"") + val msgSeq = contentHead.msgSeq + LogCenter.log("入群申请($groupCode) $applier: \"$reason\", seq: $msgSeq") val flag = try { var reqs = requestGroupSystemMsgNew(10, 1) val riskReqs = requestGroupSystemMsgNew(5, 2) reqs = reqs + riskReqs - val req = reqs.firstOrNull() { - it.msg_time.get() == time + val req = reqs.firstOrNull { + it.msg_time.get() == time && it.msg?.group_code?.get() == groupCode } val seq = req?.msg_seq?.get() ?: time "$seq;$groupCode;$applier" @@ -565,15 +544,15 @@ internal object PrimitiveListener { LogCenter.log("入群申请推送失败!", Level.WARN) } } - 528 -> { - val groupCode = pb[1, 3, 2, 2, 3].asULong - val applierUid = pb[1, 3, 2, 2, 5].asUtf8String + val event = ProtoBuf.decodeFromByteArray(richMsg.rawBuffer!!) + val groupCode = event.applyInfo?.groupCode ?: return + val applierUid = event.applyInfo?.applierUid ?: return val applier = ContactHelper.getUinByUidAsync(applierUid).toLong() if (applier == getLongUin()) { return } - if (pb[1, 3, 2, 2, 1].asInt < 3) { + if ((event.applyInfo?.type ?: return) < 3) { // todo return } @@ -599,17 +578,18 @@ internal object PrimitiveListener { } } - private suspend fun onInviteGroup(time: Long, pb: ProtoMap) { - val groupCode = pb[1, 3, 2, 1].asULong - val invitorUid = pb[1, 3, 2, 5].asUtf8String + private suspend fun onInviteGroup(time: Long, msgHead: MessageHead,richMsg: RichMessage) { + val event = ProtoBuf.decodeFromByteArray(richMsg.rawBuffer!!) + val groupCode = event.groupCode + val invitorUid = event.inviterUid val invitor = ContactHelper.getUinByUidAsync(invitorUid).toLong() - val uin = pb[1, 1, 5].asLong - LogCenter.log("邀请入群$groupCode 邀请者: \"$invitor\"") + val uin = msgHead.receiver + LogCenter.log("邀请入群: $groupCode, 邀请者: \"$invitor\"") val flag = try { var reqs = requestGroupSystemMsgNew(10, 1) val riskReqs = requestGroupSystemMsgNew(10, 2) reqs = reqs + riskReqs - val req = reqs.firstOrNull() { + val req = reqs.firstOrNull { it.msg_time.get() == time } val seq = req?.msg_seq?.get() ?: time diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/tools/Xposed.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/tools/Xposed.kt index ceca61c..7758439 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/tools/Xposed.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/tools/Xposed.kt @@ -1,5 +1,14 @@ package moe.fuqiuluo.shamrock.tools +import com.tencent.mobileqq.pb.MessageMicro +import com.tencent.mobileqq.pb.PBBoolField +import com.tencent.mobileqq.pb.PBBytesField +import com.tencent.mobileqq.pb.PBEnumField +import com.tencent.mobileqq.pb.PBInt32Field +import com.tencent.mobileqq.pb.PBInt64Field +import com.tencent.mobileqq.pb.PBStringField +import com.tencent.mobileqq.pb.PBUInt32Field +import com.tencent.mobileqq.pb.PBUInt64Field import de.robv.android.xposed.XC_MethodHook import de.robv.android.xposed.XC_MethodHook.MethodHookParam import de.robv.android.xposed.XposedBridge @@ -157,7 +166,7 @@ internal fun Any.toInnerValuesString(): String { val builder = StringBuilder() val clz = javaClass builder.append(clz.canonicalName) - builder.append("========>\n") + builder.append(" {\n") clz.declaredFields.forEach { if (!Modifier.isStatic(it.modifiers)) { if (!it.isAccessible) { @@ -188,12 +197,39 @@ internal fun Any.toInnerValuesString(): String { } builder.append("]") } + is PBUInt32Field -> { + builder.append(v.get()) + } + is PBUInt64Field -> { + builder.append(v.get()) + } + is PBInt32Field -> { + builder.append(v.get()) + } + is PBInt64Field -> { + builder.append(v.get()) + } + is PBStringField -> { + builder.append(v.get()) + } + is PBBytesField -> { + builder.append(v.get().toByteArray().toHexString()) + } + is PBBoolField -> { + builder.append(v.get().toString()) + } + is PBEnumField -> { + builder.append(v.get().toString()) + } + is MessageMicro<*> -> { + builder.append(v.toInnerValuesString()) + } else -> builder.append(v) } builder.append("\n") } } - builder.append("=======================>\n") + builder.append("}\n") return builder.toString() } diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/XposedEntry.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/XposedEntry.kt index 058faa7..322a827 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/XposedEntry.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/XposedEntry.kt @@ -27,7 +27,7 @@ internal class XposedEntry: IXposedHookLoadPackage { @JvmStatic var sec_static_stage_inited = false @JvmStatic - var sec_static_nativehook_inited = false + var secStaticNativehookInited = false external fun injected(): Boolean diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/actions/AntiDetection.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/actions/AntiDetection.kt index 54c702d..e66ba5d 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/actions/AntiDetection.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/actions/AntiDetection.kt @@ -45,6 +45,13 @@ class AntiDetection: IAction { private fun antiNativeDetection() { try { + val pref = XSharedPreferences("moe.fuqiuluo.shamrock", "shared_config") + if (!pref.file.canRead()) { + LogCenter.log("[Shamrock] unable to load XSharedPreferences", Level.WARN) + return + } else if (!pref.getBoolean("super_anti", false)) { + return + } //System.loadLibrary("clover") NativeLoader.load("clover") val env = XposedEntry.hasEnv() @@ -52,15 +59,8 @@ class AntiDetection: IAction { if (!env || !injected) { LogCenter.log("[Shamrock] Shamrock反检测启动失败(env=$env, injected=$injected)", Level.ERROR) } else { - XposedEntry.sec_static_nativehook_inited = true - val pref = XSharedPreferences("moe.fuqiuluo.shamrock", "shared_config") - if (pref.file.canRead()) { - if (pref.getBoolean("super_anti", false)) { - LogCenter.log("[Shamrock] Shamrock反检测启动成功: ${antiNativeDetections()}", Level.INFO) - } - } else { - LogCenter.log("[Shamrock] unable to load XSharedPreferences", Level.WARN) - } + XposedEntry.secStaticNativehookInited = true + LogCenter.log("[Shamrock] Shamrock反检测启动成功: ${antiNativeDetections()}", Level.INFO) } } catch (e: Throwable) { LogCenter.log("[Shamrock] Shamrock反检测启动失败,请检查LSPosed版本使用大于100: ${e.message}", Level.ERROR) diff --git a/xposed/src/test/java/moe/fuqiuluo/xposed/ExampleUnitTest.kt b/xposed/src/test/java/moe/fuqiuluo/xposed/ExampleUnitTest.kt deleted file mode 100644 index b40486d..0000000 --- a/xposed/src/test/java/moe/fuqiuluo/xposed/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package moe.fuqiuluo.xposed - -import org.junit.Test - -import org.junit.Assert.* - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file