commit a3edd40cfbb188ee21ddf2233092aab2ce304aee
parent d0e6c5571703820c31a430f883e019b97aceedcd
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date: Fri, 1 Sep 2023 16:37:08 +0200
fix(send_override): media extras (mentions, places, ...)
Diffstat:
4 files changed, 132 insertions(+), 125 deletions(-)
diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/data/MessageSender.kt b/core/src/main/kotlin/me/rhunk/snapenhance/data/MessageSender.kt
@@ -12,20 +12,25 @@ class MessageSender(
private val context: ModContext,
) {
companion object {
- val redSnapProto: () -> ByteArray = {
+ val redSnapProto: (ByteArray?) -> ByteArray = { extras ->
ProtoWriter().apply {
- from(11, 5) {
- from(1) {
+ from(11) {
+ from(5) {
from(1) {
- addVarInt(2, 0)
- addVarInt(12, 0)
- addVarInt(15, 0)
+ from(1) {
+ addVarInt(2, 0)
+ addVarInt(12, 0)
+ addVarInt(15, 0)
+ }
+ addVarInt(6, 0)
+ }
+ from(2) {
+ addVarInt(5, 1) // audio by default
+ addBuffer(6, byteArrayOf())
}
- addVarInt(6, 0)
}
- from(2) {
- addVarInt(5, 1) // audio by default
- addBuffer(6, byteArrayOf())
+ extras?.let {
+ addBuffer(13, it)
}
}
}.toByteArray()
diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/tweaks/GalleryMediaSendOverride.kt b/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/tweaks/GalleryMediaSendOverride.kt
@@ -1,112 +0,0 @@
-package me.rhunk.snapenhance.features.impl.tweaks
-
-import me.rhunk.snapenhance.Constants
-import me.rhunk.snapenhance.core.eventbus.events.impl.SendMessageWithContentEvent
-import me.rhunk.snapenhance.core.eventbus.events.impl.UnaryCallEvent
-import me.rhunk.snapenhance.data.ContentType
-import me.rhunk.snapenhance.data.MessageSender
-import me.rhunk.snapenhance.features.Feature
-import me.rhunk.snapenhance.features.FeatureLoadParams
-import me.rhunk.snapenhance.ui.ViewAppearanceHelper
-import me.rhunk.snapenhance.util.protobuf.ProtoEditor
-import me.rhunk.snapenhance.util.protobuf.ProtoReader
-
-class GalleryMediaSendOverride : Feature("Gallery Media Send Override", loadParams = FeatureLoadParams.INIT_SYNC) {
- private var isLastSnapSavable = false
-
- override fun init() {
- val fixGalleryMediaSendOverride = context.config.experimental.nativeHooks.let {
- it.globalState == true && it.fixGalleryMediaOverride.get()
- }
- val typeNames = mutableListOf(
- "ORIGINAL",
- "SNAP",
- "NOTE"
- ).also {
- if (fixGalleryMediaSendOverride) {
- it.add("SAVABLE_SNAP")
- }
- }.associateWith {
- it
- }
-
- context.event.subscribe(UnaryCallEvent::class, { fixGalleryMediaSendOverride }) { event ->
- if (event.uri != "/messagingcoreservice.MessagingCoreService/CreateContentMessage") return@subscribe
- if (!isLastSnapSavable) return@subscribe
- ProtoReader(event.buffer).also {
- // only affect snaps
- if (!it.containsPath(*Constants.ARROYO_MEDIA_CONTAINER_PROTO_PATH, 11)) return@subscribe
- }
- isLastSnapSavable = false
-
- event.buffer = ProtoEditor(event.buffer).apply {
- //remove the max view time
- edit(*Constants.ARROYO_MEDIA_CONTAINER_PROTO_PATH, 11, 5, 2) {
- remove(8)
- addBuffer(6, byteArrayOf())
- }
- //make snaps savable in chat
- edit(4) {
- val savableState = firstOrNull(7)?.value ?: return@edit
- if (savableState == 2L) {
- remove(7)
- addVarInt(7, 3)
- }
- }
- }.toByteArray()
- }
-
- context.event.subscribe(SendMessageWithContentEvent::class, {
- context.config.messaging.galleryMediaSendOverride.get()
- }) { event ->
- val localMessageContent = event.messageContent
- if (localMessageContent.contentType != ContentType.EXTERNAL_MEDIA) return@subscribe
-
- //prevent story replies
- val messageProtoReader = ProtoReader(localMessageContent.content)
- if (messageProtoReader.contains(7)) return@subscribe
-
- event.canceled = true
-
- context.runOnUiThread {
- ViewAppearanceHelper.newAlertDialogBuilder(context.mainActivity!!)
- .setItems(typeNames.values.toTypedArray()) { dialog, which ->
- dialog.dismiss()
- val overrideType = typeNames.keys.toTypedArray()[which]
-
- if (overrideType != "ORIGINAL" && messageProtoReader.followPath(3)?.getCount(3) != 1) {
- context.runOnUiThread {
- ViewAppearanceHelper.newAlertDialogBuilder(context.mainActivity!!)
- .setMessage(context.translation["gallery_media_send_override.multiple_media_toast"])
- .setPositiveButton(context.translation["button.ok"], null)
- .show()
- }
- return@setItems
- }
-
- when (overrideType) {
- "SNAP", "SAVABLE_SNAP" -> {
- localMessageContent.contentType = ContentType.SNAP
- localMessageContent.content = MessageSender.redSnapProto()
- if (overrideType == "SAVABLE_SNAP") {
- isLastSnapSavable = true
- }
- }
-
- "NOTE" -> {
- localMessageContent.contentType = ContentType.NOTE
- val mediaDuration =
- messageProtoReader.getVarInt(3, 3, 5, 1, 1, 15) ?: 0
- localMessageContent.content =
- MessageSender.audioNoteProto(mediaDuration)
- }
- }
-
- event.adapter.invokeOriginal()
- }
- .setNegativeButton(context.translation["button.cancel"], null)
- .show()
- }
- }
- }
-}-
\ No newline at end of file
diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/tweaks/SendOverride.kt b/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/tweaks/SendOverride.kt
@@ -0,0 +1,114 @@
+package me.rhunk.snapenhance.features.impl.tweaks
+
+import me.rhunk.snapenhance.Constants
+import me.rhunk.snapenhance.core.eventbus.events.impl.SendMessageWithContentEvent
+import me.rhunk.snapenhance.core.eventbus.events.impl.UnaryCallEvent
+import me.rhunk.snapenhance.data.ContentType
+import me.rhunk.snapenhance.data.MessageSender
+import me.rhunk.snapenhance.features.Feature
+import me.rhunk.snapenhance.features.FeatureLoadParams
+import me.rhunk.snapenhance.ui.ViewAppearanceHelper
+import me.rhunk.snapenhance.util.protobuf.ProtoEditor
+import me.rhunk.snapenhance.util.protobuf.ProtoReader
+
+class SendOverride : Feature("Send Override", loadParams = FeatureLoadParams.INIT_SYNC) {
+ private var isLastSnapSavable = false
+
+ override fun init() {
+ val fixGalleryMediaSendOverride = context.config.experimental.nativeHooks.let {
+ it.globalState == true && it.fixGalleryMediaOverride.get()
+ }
+ val typeNames = mutableListOf(
+ "ORIGINAL",
+ "SNAP",
+ "NOTE"
+ ).also {
+ if (fixGalleryMediaSendOverride) {
+ it.add("SAVABLE_SNAP")
+ }
+ }.associateWith {
+ it
+ }
+
+ context.event.subscribe(UnaryCallEvent::class, { fixGalleryMediaSendOverride }) { event ->
+ if (event.uri != "/messagingcoreservice.MessagingCoreService/CreateContentMessage") return@subscribe
+ if (!isLastSnapSavable) return@subscribe
+ ProtoReader(event.buffer).also {
+ // only affect snaps
+ if (!it.containsPath(*Constants.ARROYO_MEDIA_CONTAINER_PROTO_PATH, 11)) return@subscribe
+ }
+
+ event.buffer = ProtoEditor(event.buffer).apply {
+ //remove the max view time
+ edit(*Constants.ARROYO_MEDIA_CONTAINER_PROTO_PATH, 11, 5, 2) {
+ remove(8)
+ addBuffer(6, byteArrayOf())
+ }
+ //make snaps savable in chat
+ edit(4) {
+ val savableState = firstOrNull(7)?.value ?: return@edit
+ if (savableState == 2L) {
+ remove(7)
+ addVarInt(7, 3)
+ }
+ }
+ }.toByteArray()
+ }
+
+ context.event.subscribe(SendMessageWithContentEvent::class, {
+ context.config.messaging.galleryMediaSendOverride.get()
+ }) { event ->
+ isLastSnapSavable = false
+ val localMessageContent = event.messageContent
+ if (localMessageContent.contentType != ContentType.EXTERNAL_MEDIA) return@subscribe
+
+ //prevent story replies
+ val messageProtoReader = ProtoReader(localMessageContent.content)
+ if (messageProtoReader.contains(7)) return@subscribe
+
+ event.canceled = true
+
+ context.runOnUiThread {
+ ViewAppearanceHelper.newAlertDialogBuilder(context.mainActivity!!)
+ .setItems(typeNames.values.toTypedArray()) { dialog, which ->
+ dialog.dismiss()
+ val overrideType = typeNames.keys.toTypedArray()[which]
+
+ if (overrideType != "ORIGINAL" && messageProtoReader.followPath(3)?.getCount(3) != 1) {
+ context.runOnUiThread {
+ ViewAppearanceHelper.newAlertDialogBuilder(context.mainActivity!!)
+ .setMessage(context.translation["gallery_media_send_override.multiple_media_toast"])
+ .setPositiveButton(context.translation["button.ok"], null)
+ .show()
+ }
+ return@setItems
+ }
+
+ when (overrideType) {
+ "SNAP", "SAVABLE_SNAP" -> {
+ val extras = messageProtoReader.followPath(3, 3, 13)?.getBuffer()
+
+ localMessageContent.contentType = ContentType.SNAP
+ localMessageContent.content = MessageSender.redSnapProto(extras)
+ if (overrideType == "SAVABLE_SNAP") {
+ isLastSnapSavable = true
+ }
+ }
+
+ "NOTE" -> {
+ localMessageContent.contentType = ContentType.NOTE
+ val mediaDuration =
+ messageProtoReader.getVarInt(3, 3, 5, 1, 1, 15) ?: 0
+ localMessageContent.content =
+ MessageSender.audioNoteProto(mediaDuration)
+ }
+ }
+
+ event.adapter.invokeOriginal()
+ }
+ .setNegativeButton(context.translation["button.cancel"], null)
+ .show()
+ }
+ }
+ }
+}+
\ No newline at end of file
diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/manager/impl/FeatureManager.kt b/core/src/main/kotlin/me/rhunk/snapenhance/manager/impl/FeatureManager.kt
@@ -27,7 +27,7 @@ import me.rhunk.snapenhance.features.impl.tweaks.AutoSave
import me.rhunk.snapenhance.features.impl.tweaks.CameraTweaks
import me.rhunk.snapenhance.features.impl.tweaks.DisableReplayInFF
import me.rhunk.snapenhance.features.impl.tweaks.DisableVideoLengthRestriction
-import me.rhunk.snapenhance.features.impl.tweaks.GalleryMediaSendOverride
+import me.rhunk.snapenhance.features.impl.tweaks.SendOverride
import me.rhunk.snapenhance.features.impl.tweaks.GooglePlayServicesDialogs
import me.rhunk.snapenhance.features.impl.tweaks.LocationSpoofer
import me.rhunk.snapenhance.features.impl.tweaks.MediaQualityLevelOverride
@@ -77,7 +77,7 @@ class FeatureManager(private val context: ModContext) : Manager {
register(AutoSave::class)
register(UITweaks::class)
register(ConfigurationOverride::class)
- register(GalleryMediaSendOverride::class)
+ register(SendOverride::class)
register(UnlimitedSnapViewTime::class)
register(DisableVideoLengthRestriction::class)
register(MediaQualityLevelOverride::class)