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:
Mcore/src/main/kotlin/me/rhunk/snapenhance/data/MessageSender.kt | 25+++++++++++++++----------
Dcore/src/main/kotlin/me/rhunk/snapenhance/features/impl/tweaks/GalleryMediaSendOverride.kt | 113-------------------------------------------------------------------------------
Acore/src/main/kotlin/me/rhunk/snapenhance/features/impl/tweaks/SendOverride.kt | 115+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mcore/src/main/kotlin/me/rhunk/snapenhance/manager/impl/FeatureManager.kt | 4++--
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)