#Logging user own message deletion but also if mod delete other user message

1 messages · Page 1 of 1 (latest)

cyan cairn
#

Hi, so i used on_message_delete to log deleted messages. but this shows only the author of that message. Thats fine, but i need to log also if a admin deletes a message from someone else. now i found:

async def on_message_delete(message):
    async for entry in message.guild.audit_logs(limit=1,action=discord.AuditLogAction.message_delete):
        deleter = entry.user
    print(f"{deleter.name} deleted message by {message.author.name}")```

But when a user delete it own message, it says "(last user that made a audit log entry) deleted message by (name author message here). So that isn't right. Is there a better way i can log when a user delete its own message and if a admin delete a message from someone else?

I didn't saw a atribute for it in it in the function `on_message_delete` (or message to be more accurate, but you get it)
digital egretBOT
#

disnake.on_raw_message_delete(payload)```
Called when a message is deleted. Unlike [`on_message_delete()`](https://docs.disnake.dev/en/latest/api.html#disnake.on_message_delete "disnake.on_message_delete"), this is called regardless of the message being in the internal message cache or not.

If the message is found in the message cache, it can be accessed via [`RawMessageDeleteEvent.cached_message`](https://docs.disnake.dev/en/latest/api.html#disnake.RawMessageDeleteEvent.cached_message "disnake.RawMessageDeleteEvent.cached_message")

This requires [`Intents.messages`](https://docs.disnake.dev/en/latest/api.html#disnake.Intents.messages "disnake.Intents.messages") to be enabled.
heady thunder
#

This would be better since the one you're using only fires if a cached message is deleted.

cyan cairn
#

Ah sure

#

Do ya a way to solve the above? Struggling with it

heady thunder
#

Probably, but not off the top of my head. Never really messed with audit log so I'll need a minute to look at some docs.

cyan cairn
#

Ah sure!

heady thunder
#

Members deleting their own messages aren't logged, IIRC. So getting that info from the audit log isn't possible, at least most of the time.

cyan cairn
heady thunder
#

And how do you manage that?

#

I guess if a message is being deleted and no log entry is created, then it's likely the author deleted their own message.

cyan cairn
# heady thunder And how do you manage that?
        @bot.event
        async def on_message_delete(payload):
            print(payload)
            await message_deleted(payload, message=payload.content, channel=payload.channel)```

Response when user kelvin delete user of himself:
Kelvin deleted a message from Kelvin

So thats good
Response if admin named idk OneTwoThree deleted message from kelvin:

Kelvin deleted a message from Kelvin

So that doesnt work, thats why i need that audit log entry
#

Now online i found:

async def on_message_delete(message):
    async for entry in message.guild.audit_logs(limit=1,action=disnake.AuditLogAction.message_delete):
        deleter = entry.user
    print(f"{deleter.name} deleted message by {message.author.name}")```
heady thunder
#

that makes sense.

cyan cairn
heady thunder
#

Yes.

cyan cairn
#

Maybe on audit create then or something

#

Lemme search

heady thunder
#

Every time a message is deleted, that event will fire (assuming it's a cached message)

So, you're getting the last message_delete event from audit logs.

cyan cairn
#

I found: on_audit_log_entry_create

#

Now i need to check if the event is a message delete i guess

#

I'm getting a response:

<Message id=1090264256882151466 channel=<TextChannel id=979395372214538304 name='general' position=1 nsfw=False news=False category_id=979395372214538303 default_auto_archive_duration=4320 flags=<ChannelFlags value=0>> type=<MessageType.default: 0> author=<Member id=980852610925985852 name='</Kelvin-alt>' discriminator='8754' bot=False nick=None guild=<Guild id=979395371992240198 name='AllDayDev' shard_id=0 chunked=True member_count=8>> flags=<MessageFlags value=0>>
<AuditLogEntry id=1090264290973462628 action=AuditLogAction.message_delete user=<Member id=632677231113666601 name='KelvinCodes' discriminator='2636' bot=False nick=None guild=<Guild id=979395371992240198 name='AllDayDev' shard_id=0 chunked=True member_count=8>>>```

Now i can use the atribute action to check if the entry == `message_delete`
#

I guess

#

I think youre gonna hit me if i show this:

@bot.event
  async def on_audit_log_entry_create(audit_entry):
        if "AuditLogAction.message_delete" in str(audit_entry):
             print("Jeeej i works")```

*runs*
#

But it works kek

#

Hmm, on_audit_log_entry_create() inside a cog doesnt trigger

heady thunder
#

show code

cyan cairn
#

Oh mb, w8

heady thunder
#

You should be use @commands.Cog.listener() to create listeners in cogs.

#

not @bot.event

cyan cairn
#

Ah

heady thunder
#

Personally, I almost never use @bot.event

Even outside a cog, @bot.listen()

cyan cairn
heady thunder
#

@bot.event overrides the built in event functions. @bot.listen() just registers a new event listener for those events without overriding the library implementation of the function.

#

It's mostly habit at this point, but the best example is..

@bot.commands()
async def test(ctx: commands.Context):
    await ctx.send('Success!')

# this will render your command unfunctional because ctx commands
# are based around messages and message content
@bot.event
async def on_message(message: disnake.Message):
    ...

    # need to add this to be able to still process commands
    await bot.process_commands(message)


# or this just registers this function as an added listener to execute
# when an on_message event fires and the built-in can still do it's thing
@bot.listen()
async def on_message(message: disnake.Message):
  ...
cyan cairn
#

Ah right!

#

        @commands.Cog.listener()
        async def on_audit_log_entry_create(audit_entry):
            print("Debug 1")            
            if "AuditLogAction.message_delete" in str(audit_entry):
                async for entry in audit_entry.guild.audit_logs(limit=1,action=disnake.AuditLogAction.message_delete):
                    deleter = entry.user
                print(f"{deleter.name} deleted message by {audit_entry.name}")    ```

Weird, still doesn't get triggered
heady thunder
#

But inside cogs, it always needs to be a listener @commands.Cog.listener()

#

requires Intents.moderation to be enabled and view_audit_log permissions

cyan cairn
#

He has that

#

Also have in the main file:

intents = disnake.Intents.all()
bot = commands.Bot(intents=intents)```
#

The event works in the main.py file, so don't think intents is the issue tbh

heady thunder
#

What is the cog look like?

cyan cairn
heady thunder
#

indention, my man.

cyan cairn
#

Need to change all the @bot.event still, will do that in a minute

heady thunder
#

all your functions are inside the def __init__

cyan cairn
#

Oh boi, oeps

heady thunder
#
class log_to_server(commands.Cog):
    def __init__(self, bot: commands.Bot):
        self.bot = bot
 
 
        @commands.Cog.listener()
        async def on_audit_log_entry_create(audit_entry):
            print("Debug 1")            
            if "AuditLogAction.message_delete" in str(audit_entry):
                async for entry in audit_entry.guild.audit_logs(limit=1,action=disnake.AuditLogAction.message_delete):
                    deleter = entry.user
                print(f"{deleter.name} deleted message by {audit_entry.name}")    

should be

class log_to_server(commands.Cog):
    def __init__(self, bot: commands.Bot):
        self.bot = bot
 
 
    @commands.Cog.listener()
    async def on_audit_log_entry_create(audit_entry):
        print("Debug 1")            
        if "AuditLogAction.message_delete" in str(audit_entry):
            async for entry in audit_entry.guild.audit_logs(limit=1,action=disnake.AuditLogAction.message_delete):
                deleter = entry.user
         print(f"{deleter.name} deleted message by {audit_entry.name}")   
cyan cairn
#

Let me backtab haha

#

Need to change functions also, not reqonizer of course now

cyan cairn
#

🙂

heady thunder
#

await log_to_server.member_guild_embed(self, member, type="joinde de keet!") what?

#

you mean..

await self.member_guild_embed(member, type='joinde de keet!")

#

You should also probably not use wildcard inmports from ... import *, generally not a good idea.
And also use asyncio db drivers

Database.cursor.execute("SELECT content FROM configuration_text WHERE service='welcome_text' LIMIT 1")
res = Database.cursor.fetchone()[0]
cyan cairn
cyan cairn
#

Bbbbbut this code is a lil bit better right?

#

😶

heady thunder
cyan cairn
#

Oh uuh

#

Gonna change that!

#

Almost done

heady thunder
cyan cairn
#

I did everything inside __init__ haha pain

heady thunder
#

I remember that.

#

The indentation looked correct in the new version.

cyan cairn
cyan cairn
cyan cairn