|
|
@@ -4,9 +4,10 @@ Cog for detecting large numbers of guild joins in a short period of time.
|
|
4
|
4
|
import weakref
|
|
5
|
5
|
from collections.abc import Sequence
|
|
6
|
6
|
from datetime import datetime, timedelta
|
|
7
|
|
-from discord import Emoji, Guild, GuildSticker, Invite, Member, Message, RawMessageUpdateEvent, Role, Thread, User
|
|
|
7
|
+from discord import Emoji, Guild, GuildSticker, Invite, Member, Message, RawBulkMessageDeleteEvent, RawMessageDeleteEvent, RawMessageUpdateEvent, Role, Thread, User
|
|
8
|
8
|
from discord.abc import GuildChannel
|
|
9
|
9
|
from discord.ext import commands
|
|
|
10
|
+from discord.utils import escape_markdown
|
|
10
|
11
|
from typing import List, Union
|
|
11
|
12
|
|
|
12
|
13
|
from config import CONFIG
|
|
|
@@ -122,41 +123,79 @@ class LogCog(BaseCog, name='Logging'):
|
|
122
|
123
|
|
|
123
|
124
|
@commands.Cog.listener()
|
|
124
|
125
|
async def on_message(self, message: Message):
|
|
125
|
|
- print(f"Saw message \"{message.content}\"")
|
|
|
126
|
+ # print(f"Saw message {message.id} \"{message.content}\"")
|
|
126
|
127
|
|
|
127
|
128
|
@commands.Cog.listener()
|
|
128
|
129
|
async def on_message_edit(self, before: Message, after: Message) -> None:
|
|
129
|
|
- print(f"Message \"{before.content}\" changed to \"{after.content}\"")
|
|
|
130
|
+ text = f'Message {after.jump_url} edited by **{after.author.name}** ({after.author.display_name} {after.author.id}).\n\n' + \
|
|
|
131
|
+ f'Original markdown:\n> {escape_markdown(before.content)}\n\n' + \
|
|
|
132
|
+ f'Updated markdown:\n> {escape_markdown(after.content)}'
|
|
|
133
|
+ bot_message = BotMessage(after.guild, text, BotMessage.TYPE_LOG, suppress_embeds=True)
|
|
|
134
|
+ await bot_message.update()
|
|
130
|
135
|
|
|
131
|
136
|
@commands.Cog.listener()
|
|
132
|
137
|
async def on_raw_message_edit(self, payload: RawMessageUpdateEvent) -> None:
|
|
133
|
138
|
if payload.cached_message:
|
|
134
|
|
- print("Edited message is cached")
|
|
135
|
139
|
return # already handled by on_message_edit
|
|
136
|
|
- print(f"Fetching guild {payload.guild_id}")
|
|
137
|
140
|
guild = await self.bot.fetch_guild(payload.guild_id)
|
|
138
|
141
|
if not guild:
|
|
139
|
|
- print(f"Couldn't fetch edited message guild {payload.guild_id}")
|
|
140
|
142
|
return
|
|
141
|
|
- print(f"Fetching channel {payload.channel_id}")
|
|
142
|
143
|
channel = await guild.fetch_channel(payload.channel_id)
|
|
143
|
144
|
if not channel:
|
|
144
|
|
- print(f"Couldn't fetch edited message channel {payload.channel_id}")
|
|
145
|
145
|
return
|
|
146
|
|
- print(f"Fetching message {payload.message_id}")
|
|
147
|
146
|
message = await channel.fetch_message(payload.message_id)
|
|
148
|
147
|
if not message:
|
|
149
|
|
- print(f"Couldn't fetch edited message {payload.message_id}")
|
|
150
|
148
|
return
|
|
151
|
|
- print(f"Message was edited, but I don't have the old version. Current version is \"{message.content}\"")
|
|
|
149
|
+ text = f'Message {message.jump_url} edited by **{message.author.name}** ({message.author.display_name} {message.author.id}).\n\n' + \
|
|
|
150
|
+ 'Original markdown unavailable in cache.\n\n' + \
|
|
|
151
|
+ f'Updated markdown:\n> {escape_markdown(message.content)}'
|
|
|
152
|
+ bot_message = BotMessage(guild, text, BotMessage.TYPE_LOG, suppress_embeds=True)
|
|
|
153
|
+ await bot_message.update()
|
|
152
|
154
|
|
|
153
|
155
|
@commands.Cog.listener()
|
|
154
|
|
- async def on_message_delete(self, message: Message) -> None:
|
|
155
|
|
- print(f"Message deleted \"{message.content}\"")
|
|
|
156
|
+ async def on_raw_message_delete(self, payload: RawMessageDeleteEvent) -> None:
|
|
|
157
|
+ print('Raw message deleted')
|
|
|
158
|
+ if payload.cached_message:
|
|
|
159
|
+ message = payload.cached_message
|
|
|
160
|
+ text = f'Message by **{message.author.name}** ({message.author.display_name} {message.author.id}) deleted from {message.channel.mention}\n\n' + \
|
|
|
161
|
+ f'Markdown:\n> {escape_markdown(message.content)}'
|
|
|
162
|
+ bot_message = BotMessage(message.guild, text, BotMessage.TYPE_LOG, suppress_embeds=True)
|
|
|
163
|
+ await bot_message.update()
|
|
|
164
|
+ else:
|
|
|
165
|
+ print(f'Looking up guild {payload.guild_id}')
|
|
|
166
|
+ guild = await self.bot.fetch_guild(payload.guild_id)
|
|
|
167
|
+ if not guild:
|
|
|
168
|
+ return
|
|
|
169
|
+ print(f'Looking up channel {payload.channel_id}')
|
|
|
170
|
+ channel = await guild.fetch_channel(payload.channel_id)
|
|
|
171
|
+ if not channel:
|
|
|
172
|
+ return
|
|
|
173
|
+ text = f'Message {payload.message_id} deleted in ' + channel.mention + ' but content and author not available in cache.'
|
|
|
174
|
+ bot_message = BotMessage(guild, text, BotMessage.TYPE_LOG, suppress_embeds=True)
|
|
|
175
|
+ await bot_message.update()
|
|
156
|
176
|
|
|
157
|
177
|
@commands.Cog.listener()
|
|
158
|
|
- async def on_bulk_message_delete(self, messages: List[Message]) -> None:
|
|
159
|
|
- pass
|
|
|
178
|
+ async def on_raw_bulk_message_delete(self, payload: RawBulkMessageDeleteEvent) -> None:
|
|
|
179
|
+ guild = await self.bot.fetch_guild(payload.guild_id)
|
|
|
180
|
+ if not guild:
|
|
|
181
|
+ return
|
|
|
182
|
+ channel = await guild.fetch_channel(payload.channel_id)
|
|
|
183
|
+ count = len(payload.message_ids)
|
|
|
184
|
+ cached_count = len(payload.cached_messages)
|
|
|
185
|
+ uncached_count = count - cached_count
|
|
|
186
|
+ text = f'Bulk deletion of {count} message(s) from {channel.mention}.'
|
|
|
187
|
+ if uncached_count == count:
|
|
|
188
|
+ text += f' No cached content available for any of them.'
|
|
|
189
|
+ elif uncached_count > 0:
|
|
|
190
|
+ text += f' No cached content available for {uncached_count} of them.'
|
|
|
191
|
+ bot_message = BotMessage(guild, text, BotMessage.TYPE_LOG)
|
|
|
192
|
+ await bot_message.update()
|
|
|
193
|
+
|
|
|
194
|
+ for message in payload.cached_messages:
|
|
|
195
|
+ text = f'Message by **{message.author.name}** ({message.author.display_name} {message.author.id}) bulk deleted from {message.channel.mention}\n\n' + \
|
|
|
196
|
+ f'Markdown:\n> {escape_markdown(message.content)}'
|
|
|
197
|
+ bot_message = BotMessage(guild, text, BotMessage.TYPE_LOG)
|
|
|
198
|
+ await bot_message.update()
|
|
160
|
199
|
|
|
161
|
200
|
# Events - Roles
|
|
162
|
201
|
|