Преглед изворни кода

Logging edits and deletes, both cached and uncached, plus bulk deletes

master
Rocketsoup пре 1 година
родитељ
комит
054c1075f2
3 измењених фајлова са 65 додато и 18 уклоњено
  1. 1
    0
      config.py.sample
  2. 10
    3
      rocketbot/botmessage.py
  3. 54
    15
      rocketbot/cogs/logcog.py

+ 1
- 0
config.py.sample Прегледај датотеку

@@ -10,6 +10,7 @@ CONFIG = {
10 10
 	'failure_emoji': '❌',
11 11
 	'warning_emoji': '⚠️',
12 12
 	'info_emoji': 'ℹ️',
13
+	'log_emoji': '📋',
13 14
 	'ignore_emoji': '👍',
14 15
 	'config_path': 'config/',
15 16
 	'max_members_per_message': 20,

+ 10
- 3
rocketbot/botmessage.py Прегледај датотеку

@@ -118,13 +118,15 @@ class BotMessage:
118 118
 	TYPE_MOD_WARNING: int = 2
119 119
 	TYPE_SUCCESS: int = 3
120 120
 	TYPE_FAILURE: int = 4
121
+	TYPE_LOG: int = 5
121 122
 
122 123
 	def __init__(self,
123 124
 			guild: Guild,
124 125
 			text: str,
125 126
 			type: int = TYPE_DEFAULT, # pylint: disable=redefined-builtin
126 127
 			context: Optional[Any] = None,
127
-			reply_to: Optional[Message] = None):
128
+			reply_to: Optional[Message] = None,
129
+			suppress_embeds: bool = False):
128 130
 		"""
129 131
 		Creates a bot message.
130 132
 		- guild: The Discord guild to send the message to.
@@ -144,6 +146,7 @@ class BotMessage:
144 146
 		self.__posted_emoji: set[str] = set()  # last emoji list posted
145 147
 		self.__message: Optional[Message] = None  # set once the message has been posted
146 148
 		self.__reply_to: Optional[Message] = reply_to
149
+		self.__suppress_embeds = suppress_embeds
147 150
 		self.__reactions: list[BotMessageReaction] = []
148 151
 
149 152
 	def is_sent(self) -> bool:
@@ -269,11 +272,13 @@ class BotMessage:
269 272
 					return
270 273
 				channel: TextChannel = self.guild.get_channel(channel_id)
271 274
 				if channel is None:
275
+					channel = await self.guild.fetch_channel(channel_id)
276
+				if channel is None:
272 277
 					bot_log(self.guild, \
273 278
 						type(self.source_cog) if self.source_cog else None, \
274
-						'\u0007Configured warning channel does not exist!')
279
+						f'\u0007Configured warning channel does not exist for guild {self.guild.name} ({self.guild.id})!')
275 280
 					return
276
-				self.__message = await channel.send(content=content)
281
+				self.__message = await channel.send(content=content, suppress_embeds=self.__suppress_embeds)
277 282
 				self.__posted_text = content
278 283
 		emoji_to_remove = self.__posted_emoji.copy()
279 284
 		for reaction in self.__reactions:
@@ -306,6 +311,8 @@ class BotMessage:
306 311
 			s += CONFIG['success_emoji'] + ' '
307 312
 		elif self.type == self.TYPE_FAILURE:
308 313
 			s += CONFIG['failure_emoji'] + ' '
314
+		elif self.type == self.TYPE_LOG:
315
+			s += CONFIG['log_emoji'] + ' '
309 316
 
310 317
 		s += self.text
311 318
 

+ 54
- 15
rocketbot/cogs/logcog.py Прегледај датотеку

@@ -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
 

Loading…
Откажи
Сачувај