generated from exteraGramPlugins/pluginBase
Send forwarded media to the forum topic picked in the share sheet
Publish plugin / publish (push) Successful in 3s
Publish plugin / publish (push) Successful in 3s
The picker only read the selected dialog ids, so media always landed in a forum's General topic. Read ShareAlert's selectedDialogTopics as well and address each target the way ShareAlert.sendInternal() does: reply to the topic's start message in forums, or set monoForumPeer in a channel's direct-messages chat. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
46503f24a0
commit
1f0a9a1a7a
6 files changed
+150
-23
No files matched your search
@@ -463,6 +463,74 @@ def main(argv=None) -> int:
|
||||
f"got {links!r}",
|
||||
)
|
||||
|
||||
picker = ns.get("picker")
|
||||
selected_targets = getattr(picker, "_selected_targets", None)
|
||||
address = getattr(sender, "_address", None)
|
||||
targets = None
|
||||
addressed = None
|
||||
if selected_targets is not None and address is not None:
|
||||
|
||||
class SparseArray:
|
||||
def __init__(self, pairs):
|
||||
self.pairs = pairs
|
||||
|
||||
def size(self):
|
||||
return len(self.pairs)
|
||||
|
||||
def keyAt(self, i):
|
||||
return self.pairs[i][0]
|
||||
|
||||
def valueAt(self, i):
|
||||
return self.pairs[i][1]
|
||||
|
||||
class TopicMessageObject:
|
||||
def __init__(self, account, message, generate_layout, check_media):
|
||||
self.message = message
|
||||
self.isTopicMainMessage = False
|
||||
|
||||
plain, forum, mono = object(), object(), object()
|
||||
topic = types.SimpleNamespace(topicStartMessage="start-msg", from_id="user-peer")
|
||||
mono_topic = types.SimpleNamespace(topicStartMessage="unused", from_id="dm-user")
|
||||
alert = types.SimpleNamespace(
|
||||
selectedDialogs=SparseArray([(11, plain), (-22, forum), (-33, mono)]),
|
||||
selectedDialogTopics={forum: topic, mono: mono_topic},
|
||||
)
|
||||
messenger = sys.modules["org.telegram.messenger"]
|
||||
saved = messenger.MessageObject
|
||||
messenger.MessageObject = TopicMessageObject
|
||||
messenger.DialogObject = types.SimpleNamespace(getPeerDialogId=lambda peer: 4242)
|
||||
messenger.MessagesController = types.SimpleNamespace(
|
||||
getInstance=lambda account: types.SimpleNamespace(isMonoForum=lambda d: d == -33)
|
||||
)
|
||||
try:
|
||||
targets = selected_targets(alert, 0)
|
||||
finally:
|
||||
messenger.MessageObject = saved
|
||||
params = [
|
||||
address(types.SimpleNamespace(replyToMsg=None, replyToTopMsg=None, monoForumPeer=0), t)
|
||||
for t in targets
|
||||
]
|
||||
addressed = [
|
||||
(
|
||||
t.peer,
|
||||
getattr(p.replyToTopMsg, "message", None),
|
||||
p.replyToMsg is p.replyToTopMsg,
|
||||
getattr(p.replyToTopMsg, "isTopicMainMessage", None),
|
||||
p.monoForumPeer,
|
||||
)
|
||||
for t, p in zip(targets, params)
|
||||
]
|
||||
check(
|
||||
"selected forum topic is replied to; mono-forum topic sets monoForumPeer; plain chat untouched",
|
||||
addressed
|
||||
== [
|
||||
(11, None, True, None, 0),
|
||||
(-22, "start-msg", True, True, 0),
|
||||
(-33, None, True, None, 4242),
|
||||
],
|
||||
f"got {addressed!r}",
|
||||
)
|
||||
|
||||
media_at = getattr(ivmedia, "media_at", None)
|
||||
no_media = getattr(ivmedia, "NoMedia", None)
|
||||
raised = False
|
||||
|
||||
Reference in new issue
Block a user