Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG] delete does not delete message for recipient #3041

Closed
FloatingMilkshake opened this issue Jun 1, 2021 · 13 comments
Closed

[BUG] delete does not delete message for recipient #3041

FloatingMilkshake opened this issue Jun 1, 2021 · 13 comments
Labels
bug This is a confirmed bug staged Staged for next version

Comments

@FloatingMilkshake
Copy link

Describe the bug
When a moderator deletes a message sent using ?delete, it disappears from the thread channel but is not deleted from the recipient's DMs with the bot.

Bot Info
Bot version (check with @modmail about): 3.9.4
Host method (Heroku, self-host, etc): Heroku

To Reproduce
Steps to reproduce the behavior:

  1. Who can reproduce (ex. anyone, owners)? Anyone
  2. Where can it be reproduced (ex. in thread channels, recipient DM's)? Issue is present in recipient DMs, however to reproduce you must use a command in a thread channel
  3. Done what to cause the error? Delete a mod-sent message, observe as it is deleted from the thread channel but not from the recipient's DMs
  4. Any recently made changes to your bot? No changes, the bot is copied exactly from this repository
  5. Errored

Error Logs
https://hastebin.cc/sihuwejobo

Screenshots
zJ5JPYrDkS
Note that this screenshot is from a different server than the attached logs and as such, user/server/bot names and IDs may not match. Issue is the same and is equally reproducible in both servers. Bot is up-to-date in both (version 3.9.4), hosted with Heroku in both.

@FloatingMilkshake FloatingMilkshake added the maybe: bug An unconfirmed bug label Jun 1, 2021
@Jerrie-Aries
Copy link
Contributor

Please double check, make sure your bot has View Audit Log permission on your guild.

@lorenzo132
Copy link
Member

lorenzo132 commented Jun 1, 2021

This same issue is for me on a 767k membered guild, has all needed perms including View Audit Log. So this should not be the problem @Jerrie-Aries
I most likely think this has something to do with any form of caching fault

@FloatingMilkshake
Copy link
Author

I can confirm that my bot also has the View Audit Log permission.

@StephenDaDev
Copy link
Member

Unable to reproduce on the latest version, (the bot we use in the support server), VPS hosted.

@StephenDaDev
Copy link
Member

Any logs when it happens?

@Jerrie-Aries
Copy link
Contributor

This same issue is for me on a 767k membered guild, has all needed perms including View Audit Log. So this should not be the problem @Jerrie-Aries
I most likely think this has something to do with any form of caching fault

Sorry, my bad Renzo. I was just telling what the error log says, because it seemed like it came from here in bot.py:

File "/app/bot.py", line 1455, in on_message_delete
    entry = await audit_logs.find(lambda a: a.target == self.user)

And apparently I was wrong, the bot can execute it even without the View Audit Log permission.

I was not able to reproduce this either.

@Erisa
Copy link

Erisa commented Jun 19, 2021

From my investigation of this issue, I found it can be resolved in my case by essentially reverting beb73d8

In thread.py's delete_message function after that commit it has, among other things, this:

        if not isinstance(message, discord.Message):
            tasks += [message1.delete()]
        elif message2 is not None:
            tasks += [message2.delete()]
        elif message1.embeds[0].author.name.startswith("Persistent Note"):
            tasks += [self.bot.api.delete_note(message1.id)]
        if tasks:
            await asyncio.gather(*tasks)

As best I can tell, this means that if it deletes the first message (the if not isinstance(message, discord.Message):) then it will not move on to checking whether message2 exists and the recipient message is not touched despite it returning success.

Changing that elif message2 is not None: back to if resolves this particular issue by making it actually check and delete both message1 and message2.

The only reason I did not make a PR is because I do not know if this change has any adverse side effect (Possibly re-introducing #2910 ?) and I don't have the means to test it fully.
While I am familiar with development, I have little experience with Python or this bots codebase so I'm hesitant about making potentially breaking changes for other use-cases.

Author of the referenced commit would be @fourjr but I also noticed that it was from an idea by @Jerrie-Aries.

Erisa added a commit to Microsoft-community/modmail that referenced this issue Jun 19, 2021
@lorenzo132
Copy link
Member

lorenzo132 commented Jun 19, 2021

This seems to work, a

From my investigation of this issue, I found it can be resolved in my case by essentially reverting beb73d8

In thread.py's delete_message function after that commit it has, among other things, this:

        if not isinstance(message, discord.Message):
            tasks += [message1.delete()]
        elif message2 is not None:
            tasks += [message2.delete()]
        elif message1.embeds[0].author.name.startswith("Persistent Note"):
            tasks += [self.bot.api.delete_note(message1.id)]
        if tasks:
            await asyncio.gather(*tasks)

As best I can tell, this means that if it deletes the first message (the if not isinstance(message, discord.Message):) then it will not move on to checking whether message2 exists and the recipient message is not touched despite it returning success.

Changing that elif message2 is not None: back to if resolves this particular issue by making it actually check and delete both message1 and message2.

The only reason I did not make a PR is because I do not know if this change has any adverse side effect (Possibly re-introducing #2910 ?) and I don't have the means to test it fully.
While I am familiar with development, I have little experience with Python or this bots codebase so I'm hesitant about making potentially breaking changes for other use-cases.

Author of the referenced commit would be @fourjr but I also noticed that it was from an idea by @Jerrie-Aries.

i'v tried this and can confirm it solves the issue, althought it would give

2021-06-19 15:57:58 __main__[1504] - ERROR: Ignoring exception in on_ready. 2021-06-19 15:57:58 __main__[1505] - ERROR: Unexpected exception: Traceback (most recent call last): File "/root/.local/share/virtualenvs/modmail15-jQmjnF-G/lib/python3.8/site-packages/discord/client.py", line 343, in _run_event await coro(*args, **kwargs) File "bot.py", line 588, in on_ready await thread.close( File "/root/modmails/modmail15/core/thread.py", line 366, in close "closer_id": closer.id, AttributeError: 'NoneType' object has no attribute 'id'

on startup now, atleast in my case.
It also will not return the image deleting error issue.

@Erisa
Copy link

Erisa commented Jun 19, 2021

I don't get that error in my case, no errors are reported neither at startup nor when issuing !delete.
Thank you for checking and confirming it solves the issue for you though!

@Jerrie-Aries
Copy link
Contributor

Looks like the ?delete command is quite complicated than I thought. As I mentioned in the comment here, the delete_message method in thread.py is called twice if we use ?delete command to delete a thread message, first from the ?delete command itself and the second from the on_message_delete event. And I've explained there a little why that should be changed to elif.

Now as I looked through this issue again, there is no reason for this code in on_message_delete in bot.py:
https://github.com/kyb3r/modmail/blob/5fab5b7977fbc6bfbbabee0a19721490b764f7aa/bot.py#L1451-L1458
to be there. It returns the wrong value most of the time anyways.
The audit log entry couldn't be found if the bot deletes its own message (in this case, thread message or note as we use the ?delete command). Or it could return the wrong value if there was any bot messages deleted from users in any channel before the ?delete command is executed. And if it returns None, the bot would return early without executing the second call which I thought it's supposed to execute.

@lorenzo132
Copy link
Member

This seems to work, a

From my investigation of this issue, I found it can be resolved in my case by essentially reverting beb73d8
In thread.py's delete_message function after that commit it has, among other things, this:

        if not isinstance(message, discord.Message):
            tasks += [message1.delete()]
        elif message2 is not None:
            tasks += [message2.delete()]
        elif message1.embeds[0].author.name.startswith("Persistent Note"):
            tasks += [self.bot.api.delete_note(message1.id)]
        if tasks:
            await asyncio.gather(*tasks)

As best I can tell, this means that if it deletes the first message (the if not isinstance(message, discord.Message):) then it will not move on to checking whether message2 exists and the recipient message is not touched despite it returning success.
Changing that elif message2 is not None: back to if resolves this particular issue by making it actually check and delete both message1 and message2.
The only reason I did not make a PR is because I do not know if this change has any adverse side effect (Possibly re-introducing #2910 ?) and I don't have the means to test it fully.
While I am familiar with development, I have little experience with Python or this bots codebase so I'm hesitant about making potentially breaking changes for other use-cases.
Author of the referenced commit would be @fourjr but I also noticed that it was from an idea by @Jerrie-Aries.

i'v tried this and can confirm it solves the issue, althought it would give

2021-06-19 15:57:58 __main__[1504] - ERROR: Ignoring exception in on_ready. 2021-06-19 15:57:58 __main__[1505] - ERROR: Unexpected exception: Traceback (most recent call last): File "/root/.local/share/virtualenvs/modmail15-jQmjnF-G/lib/python3.8/site-packages/discord/client.py", line 343, in _run_event await coro(*args, **kwargs) File "bot.py", line 588, in on_ready await thread.close( File "/root/modmails/modmail15/core/thread.py", line 366, in close "closer_id": closer.id, AttributeError: 'NoneType' object has no attribute 'id'

on startup now, atleast in my case.
It also will not return the image deleting error issue.

the error i had was caused by a plugin, so the revert works. havent had any issues past days

@Erisa
Copy link

Erisa commented Jun 27, 2021

@lorenzo132

the error i had was caused by a plugin, so the revert works. havent had any issues past days

It's a great hotfix for now, however I have noticed one time where deleting a message said that it failed when it in fact succeeded. Still, I keep it because wonky delete is better than no working delete.

A good longterm solution going forward would be what @Jerrie-Aries mentioned and appears to have committed to some dev fork. (Jerrie-Aries@25aa1d4)

@fourjr
Copy link
Collaborator

fourjr commented Aug 7, 2021

Resolved in v3.10.0-dev5

@fourjr fourjr added staged Staged for next version bug This is a confirmed bug and removed maybe: bug An unconfirmed bug labels Aug 7, 2021
@fourjr fourjr closed this as completed in 20b31f8 Sep 4, 2021
Erisa added a commit to Microsoft-community/modmail that referenced this issue Oct 5, 2021
Agent-Fennec pushed a commit to Agent-Fennec/modmail that referenced this issue Mar 12, 2022
* Sending files in threads (non-images) now work. resolves modmail-dev#2926

* Deleting messages no longer shows a false error, resolves modmail-dev#2910

* Linting

* Fix `?perms get` command showing IDs instead of user or role mentions.

* Support discord.py v1.6 & LOTTIE stickers

* Release v3.8

* Linting & Changelog

* Fix bug when sending multiple images at once.

* Fix error when reacting on confirm thread creation message.

* Update changelog

* Autotriggers no longer sends attachments back. resolves modmail-dev#2932

* Fix `logs` command without argument in thread channel when the recipient is not cached.

* Fix error raised when recipient is not cached and reacts to reactions in DM channel.

* Fixed bug with update notifiations

* Retry with diff name if channel cant be created resolves modmail-dev#2934

* Retrieve user from Discord API if user has left the server, modmail-dev#2935 modmail-dev#2936

* IDs in `<member>` commands work now.

* update version in discord version error string

* Hotfix: Corrupted data no longer saved to thread cache

* Bump version

* 3.8.4 - Another fix attempt

* Improved cache saving methods

* Ability to disable mention on thread creation.

* Update thread move message in case `mention` was set to disable/None.

* Formatting...

* Apply suggestions from code review

Co-authored-by: Jia Rong Yee <28086837+fourjr@users.noreply.github.com>

* Fix typo in 'config_help.json' (modmail-dev#2957)

* Update README.md (modmail-dev#2955)

fix a sentence which said to join the old deleted plugin server

* Add msglink command to get DM message URLs.

* Add DM channel ID to genesis message footer.

* Amend typo and black formatting.

* Improve messages

* Changelog update

* Non-master/development branch deployments no longer cause erros to be raised.

* Update changelog

* Fix bug where autotriggers are in dm context, resolve modmail-dev#2961

* Use the ID attribute of DM Channel.

Originally used the channel instance by mistake, causing the `__str__` to be used instead of the intended ID.

* Confirm thread creation when user opens a thread using react to contact.

* Block new thread from react to contact when Modmail DM is disabled (new or all).

* Bot will not attempt to find for linked message when the recipient reacts to reactions on confirm thread creation message.

* Fix previous commit.

* Fix a few bad refs and typos

* Add local plugins

* Add local plugin dir

* Add local plugins

* Updated version, deps, and plugins code

* Forgot to finish sentence

* new plugin

A little plugin I was working on

* Potentially breaking: improved plugin events

* Fix bug where cancelled still attempts to start thread

* Changelog & Ghost errors are no longer raised when threads are created using non-organic methods.

* Add reaciton menu plugin

* better run command, 3.9.1

* add music plugin

added music plugin on taki's request

* Update registry.json

try to fix install issue

* Update bot.py

add hosting methods: screen and systemd

* Update models.py

add hosting methods: screen and systemd

* Force update dev? Weird history

* Add docker hostingmethod

* Update config_help.json

Change disabled to enabled, as it is enabled on a new bot creation

* Bump versions

* Update readme

* did i not commit this

* Update `mention` command.

* Add Coolguy (Prime Servers) to SPONSORS

* Small correction

* Add Coolguy (Prime Servers) to SPONSORS

* Update to HTTPS

* Update to HTTPS

* v3.9.3 add use_user_id_channel_name

* black

* Possibly fix emoji problem

* Cleaner code :D

* Bump python runtime version

Security update

* Update sponsors

* Add docker-compose configuration for self hosting

Adds a docker-compose configuration file for running both the bot and logviewer with a shared mongo database in a single container stack.

Exposes port 8000 and ensure the mongo database can not be accessed remotely.

* Change Max Channel per Category to 49, fix fallback save logic

* There is now a proper message when trying to contact a bot.

* Changelog - v3.9.4

* Fix typo

* add fourjr claim

* Add volume for persistent data storage to Mongo

* Update pyproject.toml

* Update README.md

* Update sponsors

* Fix typo in config help.

* Update 'bot.py' and 'clients.py':
- Fix return types, type hints, and unresolved references.

* Update database after resetting/purging all plugins.

* `plugin reset`, remove unloaded plugins from `self.loaded_plugins`

* turn mentions into set

* Hopefully resolves modmail-dev#3022.

* Improve contact and react to contact:
- Checks if user is blocked when `?contact` command or react to contact is used.

* Remove publish plugin

* Initial 3.9.5-dev1

* Update registry.json

removal of profanity filter, trying to download will result in a infinite download loop and will stop any plugin from loading/break the usage of removing/adding new plugins

* Group conversation ALPHA modmail-dev#143

* Remove debug

* Push ver

* Fix closes for group conversations

* Bump version

* Update registry.json

* Changelog

* Add solution to CERTIFICATE_VERIFY_FAILED

* New issue forms

* formatting

* Update SPONSORS.json

* fix issue template

* Update requirements system and removed poetry

* Sort pipfile

* Remove flake8 from req, use new rec line-width of 110, black format

* Remove flake8 from req, use new rec line-width of 110, black format

* Add dnspython (pymongo[srv]) as req

* Updates channel.move, bot.close, emoji changes

* Keep more log files

* Bump version

* Black format

* Updated sponsors

* Improved dockerfile

* Add restart and environment for bot

* Update sponsors

* Update modmail.py

fix typo { modmail-dev#3067 } { https://usagi.xn--6frz82g/6DEshJ }

* Formatting and final updates to deps

* formatting

* Fix SSL Error

* Changelog

* bump v

* Fix failing Docker build

* Fix UnicodeEncodeError on Windows. (modmail-dev#3043)

* Fix UnionEncodeError on Windows when logging unicode emojis or special characters.

* Formatting...

* Plugins: add Python Discord's

- **Case insensitive snippets**: Allow snippets to be ran even if with the wrong case. For example, `?Dm-RePort` will be recognized as `?dm-report`.
- **Close message:** Add a `?closemessage` command that will close the thread after 15 minutes with a default message.
- **MDLink**: Generate a ready to paste link to the thread logs.
- **Reply cooldown**: Forbid you from sending the same message twice in ten seconds.
- **Tagging**: Add a `?tag` command capable of adding a `$message|` header to the channel name.

* Let snippets be invoked case-insensitively.

* Update changelogs

* Update changelog

* Improved way to do case insensitive snippets

* Update changelog and merge issues

* Formatting

* Fix contact with category and silent, modmail-dev#3076

* Resolve close_on_leave_reason not properly working

* Invalid arguments are now properly catched and a proper error message is sent (BadUnionArg)

* Removeuser (resolve modmail-dev#3065), silent adding/removing (modmail-dev#3054)

* Formatting

* add multiple users to a thread (resolve modmail-dev#3066), new group config options

* Formatting

* Fix formatter, allow add by roles (resolve modmail-dev#3053)

* Remove tagging and case insensitive plugins

* Changelog

* Use highest hoisted role as default tag, resolves modmail-dev#3014

* Reload thread cache only when it's the first on_ready trigger. Resolves modmail-dev#3037

* Resolve linked messages issues, improve group functionality (bugfixes), resolves modmail-dev#3041

* Persistent notes are now properly deleted,resolve  modmail-dev#3013

* Fix changelog formatting

* Fix changelog formatting

* Fix changelog formatting

* New thread related config, resolves modmail-dev#3072

* Resolve issues with deleting messages

* use_timestamp_channel_name config

* formatting

* add documentation and fix timestamp related bugs

* Initial commit

* Bug fixes and debug removal

* Remove debug

* Remove additional debug

* Update bot.py

* Edit error message

* move format_channel_name to Bot, resolve modmail-dev#2982

* Formatting

* bump ver

* Bug fixes

* Redo alias conversion

* Remove redundant category checks

* ?contact accepts multiple users, or role modmail-dev#3082

* Changelog and fix bot perm level

* Remove extra loop.close

* Push version to 3.10

* Quick bugfix on config help and debug hastebin

* Fix bug where snippet add did not check command name

* v3.10.1 - fix edit cmd

* Fix contact

* bump ver

* oops

* Add phish checker plugin

* Added sponsor

* Update SPONSORS.json

* Update bandit baseline:

* 3.10.3 contact fix

Co-authored-by: Jia Rong Yee <28086837+fourjr@users.noreply.github.com>
Co-authored-by: Jerrie-Aries <70805800+Jerrie-Aries@users.noreply.github.com>
Co-authored-by: Ayam Dobhal <dobhalayam@gmail.com>
Co-authored-by: lorenzo132 <50767078+lorenzo132@users.noreply.github.com>
Co-authored-by: scragly <29337040+scragly@users.noreply.github.com>
Co-authored-by: Taku <45324516+Taaku18@users.noreply.github.com>
Co-authored-by: ❥sora <60399731+6days9weeks@users.noreply.github.com>
Co-authored-by: Ralph <blackbirdralph@aol.com>
Co-authored-by: codeinteger6 <44692189+codeinteger6@users.noreply.github.com>
Co-authored-by: redstonedesigner <redstonedesigner1@gmail.com>
Co-authored-by: Stephen <48072084+StephenDaDev@users.noreply.github.com>
Co-authored-by: Cyrus Yip <cyruscmyip1@gmail.com>
Co-authored-by: Cyrus <54488650+RealCyGuy@users.noreply.github.com>
Co-authored-by: Matt Nikkel <matt.nikkel@hey.com>
Co-authored-by: Matteo Bertucci <matteobertucci2004@gmail.com>
Co-authored-by: Qwerty-133 <74311372+Qwerty-133@users.noreply.github.com>
Co-authored-by: popeeyy <29686338+popeeyy@users.noreply.github.com>
Co-authored-by: kato <78689486+TheDiscordHistorian@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug This is a confirmed bug staged Staged for next version
Projects
None yet
Development

Successfully merging a pull request may close this issue.

6 participants