From 15e42fb4545b070821e62190b791376fc2790faf Mon Sep 17 00:00:00 2001 From: everestmcarthur Date: Fri, 8 May 2026 03:02:36 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20mod=20edit/nuke=20resolve=20relayed=20ID?= =?UTF-8?q?s=20back=20to=20original=20=E2=80=94=20any=20copy's=20ID=20work?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit get_relayed() now checks reverse map as fallback, so passing any relayed copy's message ID resolves to the full mapping. mod edit and mod nuke both call get_original() first, so staff can right-click or copy ANY copy of a message and it deletes/edits the entire chain across all servers. --- wormhole/wormhole.py | 53 ++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/wormhole/wormhole.py b/wormhole/wormhole.py index fe68377..20c7223 100644 --- a/wormhole/wormhole.py +++ b/wormhole/wormhole.py @@ -282,7 +282,15 @@ class _MessageMap: self.reverse[network].pop(_mid, None) def get_relayed(self, network: str, original_id: int) -> Dict[int, int]: - return self.forward.get(network, {}).get(original_id, {}) + # Try forward map first (original → relayed copies) + result = self.forward.get(network, {}).get(original_id, {}) + if result: + return result + # If not found, check if it's a relayed ID and resolve to original + orig = self.reverse.get(network, {}).get(original_id) + if orig: + return self.forward.get(network, {}).get(orig, {}) + return {} def get_original(self, network: str, relayed_id: int) -> Optional[int]: return self.reverse.get(network, {}).get(relayed_id) @@ -3129,11 +3137,13 @@ class Wormhole(commands.Cog): @wh_mod.command(name="edit") @commands.guild_only() async def wh_mod_edit(self, ctx, name: str, message_id: int, *, new_content: str): - """Edit a message across the entire network. Provide the original message ID.""" + """Edit a message across the entire network. Works with *any* copy's ID (original or relayed).""" name = name.lower(); d = await self._net(name) if not d: return await ctx.send(embed=err_embed("Not found.")) if not await self._is_staff(d, ctx.author.id) and not await self.bot.is_owner(ctx.author): return - mapping = self.msg_map.get_relayed(name, message_id) + # Resolve: if message_id is a relayed copy, find the original first + original_id = self.msg_map.get_original(name, message_id) or message_id + mapping = self.msg_map.get_relayed(name, original_id) if not mapping: return await ctx.send(embed=err_embed("Message not found in relay map. Only recent messages can be edited.")) mode = d.get("relay_mode", "webhook") @@ -3153,31 +3163,24 @@ class Wormhole(commands.Cog): edited += 1 except: pass - # Also try editing the original message in the source channel - for ch_id in d.get("channels", []): - ch = self.bot.get_channel(ch_id) - if not ch: continue - try: - orig = await ch.fetch_message(message_id) - # Can't edit other users' messages, but note it in the response - break - except: - pass await ctx.send(embed=ok_embed(f"Edited across **{edited}** relayed copies.")) - await self._audit(name, "mod_edit", ctx.author, details=f"msg={message_id}, edited={edited}") + await self._audit(name, "mod_edit", ctx.author, details=f"msg={message_id}, orig={original_id}, edited={edited}") @wh_mod.command(name="nuke", aliases=["network-delete"]) @commands.guild_only() async def wh_mod_nuke(self, ctx, name: str, message_id: int): - """Delete a message from the entire network. Provide the original message ID.""" + """Delete a message from the entire network. Works with *any* copy's ID (original or relayed).""" name = name.lower(); d = await self._net(name) if not d: return await ctx.send(embed=err_embed("Not found.")) if not await self._is_staff(d, ctx.author.id) and not await self.bot.is_owner(ctx.author): return - mapping = self.msg_map.get_relayed(name, message_id) + # Resolve: if message_id is a relayed copy, find the original first + original_id = self.msg_map.get_original(name, message_id) or message_id + mapping = self.msg_map.get_relayed(name, original_id) if not mapping: return await ctx.send(embed=err_embed("Message not found in relay map. Only recent messages can be deleted.")) mode = d.get("relay_mode", "webhook") deleted = 0 + # Delete all relayed copies for ch_id, mid in mapping.items(): ch = self.bot.get_channel(ch_id) if not ch: continue @@ -3192,19 +3195,31 @@ class Wormhole(commands.Cog): deleted += 1 except: pass - # Also try deleting the original message + # Also try deleting the original source message for ch_id in d.get("channels", []): ch = self.bot.get_channel(ch_id) if not ch: continue try: - orig = await ch.fetch_message(message_id) + orig = await ch.fetch_message(original_id) await orig.delete() deleted += 1 break except: pass + # If the provided ID was different from original, also try deleting it directly + if message_id != original_id: + for ch_id in d.get("channels", []): + ch = self.bot.get_channel(ch_id) + if not ch: continue + try: + msg = await ch.fetch_message(message_id) + await msg.delete() + deleted += 1 + break + except: + pass await ctx.send(embed=ok_embed(f"Deleted from **{deleted}** locations across the network.")) - await self._audit(name, "mod_network_delete", ctx.author, details=f"msg={message_id}, deleted={deleted}") + await self._audit(name, "mod_network_delete", ctx.author, details=f"msg={message_id}, orig={original_id}, deleted={deleted}") # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ # PHASE 5 — REPORT SYSTEM