Просмотр исходного кода

POC for logging message edits

master
Rocketsoup 1 год назад
Родитель
Сommit
0c2bc10b06
2 измененных файлов: 111 добавлений и 83 удалений
  1. 28
    18
      bot.py
  2. 83
    65
      rocketbot/cogs/logcog.py

+ 28
- 18
bot.py Просмотреть файл

@@ -5,7 +5,9 @@ for a template).
5 5
 Author: Ian Albert (@rocketsoup)
6 6
 Date: 2021-11-11
7 7
 """
8
+import asyncio
8 9
 import traceback
10
+
9 11
 from discord import Intents
10 12
 from discord.ext import commands
11 13
 
@@ -16,6 +18,7 @@ from rocketbot.cogs.crosspostcog import CrossPostCog
16 18
 from rocketbot.cogs.generalcog import GeneralCog
17 19
 from rocketbot.cogs.joinagecog import JoinAgeCog
18 20
 from rocketbot.cogs.joinraidcog import JoinRaidCog
21
+from rocketbot.cogs.logcog import LogCog
19 22
 from rocketbot.cogs.patterncog import PatternCog
20 23
 from rocketbot.cogs.urlspamcog import URLSpamCog
21 24
 from rocketbot.cogs.usernamecog import UsernamePatternCog
@@ -54,24 +57,31 @@ class Rocketbot(commands.Bot):
54 57
 		# Stack trace everything else
55 58
 		traceback.print_exception(type(exception), exception, exception.__traceback__)
56 59
 
57
-intents = Intents.default()
58
-intents.messages = True  # pylint: disable=assigning-non-slot
59
-intents.members = True  # pylint: disable=assigning-non-slot
60
-intents.presences = True
61
-bot = Rocketbot(command_prefix=CONFIG['command_prefix'], intents=intents)
60
+async def start_bot():
61
+	intents = Intents.default()
62
+	intents.messages = True  # pylint: disable=assigning-non-slot
63
+	intents.message_content = True  # pylint: disable=assigning-non-slot
64
+	intents.members = True  # pylint: disable=assigning-non-slot
65
+	intents.presences = True
66
+	print(f"Intents are {intents}")
67
+	print(f"Command prefix is {CONFIG['command_prefix']}")
68
+	bot = Rocketbot(command_prefix=CONFIG['command_prefix'], intents=intents)
69
+
70
+	# Core
71
+	await bot.add_cog(GeneralCog(bot))
72
+	await bot.add_cog(ConfigCog(bot))
62 73
 
63
-# Core
64
-bot.add_cog(GeneralCog(bot))
65
-bot.add_cog(ConfigCog(bot))
74
+	# Optional
75
+	await bot.add_cog(AutoKickCog(bot))
76
+	await bot.add_cog(CrossPostCog(bot))
77
+	await bot.add_cog(JoinAgeCog(bot))
78
+	await bot.add_cog(JoinRaidCog(bot))
79
+	await bot.add_cog(LogCog(bot))
80
+	await bot.add_cog(PatternCog(bot))
81
+	await bot.add_cog(URLSpamCog(bot))
82
+	await bot.add_cog(UsernamePatternCog(bot))
66 83
 
67
-# Optional
68
-bot.add_cog(AutoKickCog(bot))
69
-bot.add_cog(CrossPostCog(bot))
70
-bot.add_cog(JoinAgeCog(bot))
71
-bot.add_cog(JoinRaidCog(bot))
72
-bot.add_cog(PatternCog(bot))
73
-bot.add_cog(URLSpamCog(bot))
74
-bot.add_cog(UsernamePatternCog(bot))
84
+	await bot.start(CONFIG['client_token'], reconnect=True)
85
+	print('\nBot aborted')
75 86
 
76
-bot.run(CONFIG['client_token'], bot=True, reconnect=True)
77
-print('\nBot aborted')
87
+asyncio.run(start_bot())

+ 83
- 65
rocketbot/cogs/logcog.py Просмотреть файл

@@ -4,7 +4,8 @@ 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, GuildChannel, GuildSticker, Invite, Member, Message, Role, Thread, User
7
+from discord import Emoji, Guild, GuildSticker, Invite, Member, Message, RawMessageUpdateEvent, Role, Thread, User
8
+from discord.abc import GuildChannel
8 9
 from discord.ext import commands
9 10
 from typing import List, Union
10 11
 
@@ -120,12 +121,38 @@ class LogCog(BaseCog, name='Logging'):
120 121
 	# Events - Messages
121 122
 
122 123
 	@commands.Cog.listener()
124
+	async def on_message(self, message: Message):
125
+		print(f"Saw message \"{message.content}\"")
126
+
127
+	@commands.Cog.listener()
123 128
 	async def on_message_edit(self, before: Message, after: Message) -> None:
124
-		pass
129
+		print(f"Message \"{before.content}\" changed to \"{after.content}\"")
130
+
131
+	@commands.Cog.listener()
132
+	async def on_raw_message_edit(self, payload: RawMessageUpdateEvent) -> None:
133
+		if payload.cached_message:
134
+			print("Edited message is cached")
135
+			return  # already handled by on_message_edit
136
+		print(f"Fetching guild {payload.guild_id}")
137
+		guild = await self.bot.fetch_guild(payload.guild_id)
138
+		if not guild:
139
+			print(f"Couldn't fetch edited message guild {payload.guild_id}")
140
+			return
141
+		print(f"Fetching channel {payload.channel_id}")
142
+		channel = await guild.fetch_channel(payload.channel_id)
143
+		if not channel:
144
+			print(f"Couldn't fetch edited message channel {payload.channel_id}")
145
+			return
146
+		print(f"Fetching message {payload.message_id}")
147
+		message = await channel.fetch_message(payload.message_id)
148
+		if not message:
149
+			print(f"Couldn't fetch edited message {payload.message_id}")
150
+			return
151
+		print(f"Message was edited, but I don't have the old version. Current version is \"{message.content}\"")
125 152
 
126 153
 	@commands.Cog.listener()
127 154
 	async def on_message_delete(self, message: Message) -> None:
128
-		pass
155
+		print(f"Message deleted \"{message.content}\"")
129 156
 
130 157
 	@commands.Cog.listener()
131 158
 	async def on_bulk_message_delete(self, messages: List[Message]) -> None:
@@ -160,69 +187,60 @@ class LogCog(BaseCog, name='Logging'):
160 187
 		pass
161 188
 
162 189
 
190
+	# ------------------------------------------------------------------------
163 191
 	def remove_me():
164 192
 		pass
165 193
 
166 194
 
167
-	@commands.Cog.listener()
168
-	async def on_member_join(self, member: Member) -> None:
169
-		'Event handler'
170
-		guild: Guild = member.guild
171
-		if not self.get_guild_setting(guild, self.SETTING_ENABLED):
172
-			return
173
-		min_count = self.get_guild_setting(guild, self.SETTING_JOIN_COUNT)
174
-		seconds = self.get_guild_setting(guild, self.SETTING_JOIN_TIME)
175
-		timespan: timedelta = timedelta(seconds=seconds)
176
-
177
-		last_raid: JoinRaidContext = Storage.get_state_value(guild, self.STATE_KEY_LAST_RAID)
178
-		recent_joins: AgeBoundList = Storage.get_state_value(guild, self.STATE_KEY_RECENT_JOINS)
179
-		if recent_joins is None:
180
-			recent_joins = AgeBoundList(timespan, lambda i, member : member.joined_at)
181
-			Storage.set_state_value(guild, self.STATE_KEY_RECENT_JOINS, recent_joins)
182
-		if last_raid:
183
-			if member.joined_at - last_raid.last_join_time() > timespan:
184
-				# Last raid is over
185
-				Storage.set_state_value(guild, self.STATE_KEY_LAST_RAID, None)
186
-				recent_joins.append(member)
187
-				return
188
-			# Add join to existing raid
189
-			last_raid.join_members.append(member)
190
-			self.record_warning(member)
191
-			if len(last_raid.banned_members) > 0:
192
-				self.log(guild, f'Banning as part of last join raid: {member.name}')
193
-				await member.ban(
194
-					reason='Rocketbot: Part of join raid.',
195
-					delete_message_days=0)
196
-				last_raid.banned_members.add(member)
197
-			elif len(last_raid.kicked_members) > 0:
198
-				self.log(guild, f'Kicking as part of last join raid: {member.name}')
199
-				await member.kick(
200
-					reason='Rocketbot: Part of join raid.')
201
-				last_raid.kicked_members.add(member)
202
-			await self.__update_warning_message(last_raid)
203
-		else:
204
-			# Add join to the general, non-raid recent join list
205
-			recent_joins.append(member)
206
-			if len(recent_joins) >= min_count:
207
-				self.log(guild, '\u0007Join raid detected')
208
-				last_raid = JoinRaidContext(recent_joins)
209
-				Storage.set_state_value(guild, self.STATE_KEY_LAST_RAID, last_raid)
210
-				recent_joins.clear()
211
-				msg = BotMessage(guild,
212
-						text='',
213
-						type=BotMessage.TYPE_MOD_WARNING,
214
-						context=last_raid)
215
-				self.record_warnings(recent_joins)
216
-				last_raid.warning_message_ref = weakref.ref(msg)
217
-				await self.__update_warning_message(last_raid)
218
-				await self.post_message(msg)
219
-
220
-	async def on_setting_updated(self, guild: Guild, setting: CogSetting) -> None:
221
-		if setting is self.SETTING_JOIN_TIME:
222
-			seconds = self.get_guild_setting(guild, self.SETTING_JOIN_TIME)
223
-			timespan: timedelta = timedelta(seconds=seconds)
224
-			recent_joins: AgeBoundList = Storage.get_state_value(guild,
225
-				self.STATE_KEY_RECENT_JOINS)
226
-			if recent_joins:
227
-				recent_joins.max_age = timespan
228
-				recent_joins.purge_old_elements()
195
+	# @commands.Cog.listener()
196
+	# async def on_member_join(self, member: Member) -> None:
197
+	# 	'Event handler'
198
+	# 	guild: Guild = member.guild
199
+	# 	if not self.get_guild_setting(guild, self.SETTING_ENABLED):
200
+	# 		return
201
+	# 	min_count = self.get_guild_setting(guild, self.SETTING_JOIN_COUNT)
202
+	# 	seconds = self.get_guild_setting(guild, self.SETTING_JOIN_TIME)
203
+	# 	timespan: timedelta = timedelta(seconds=seconds)
204
+
205
+	# 	last_raid: JoinRaidContext = Storage.get_state_value(guild, self.STATE_KEY_LAST_RAID)
206
+	# 	recent_joins: AgeBoundList = Storage.get_state_value(guild, self.STATE_KEY_RECENT_JOINS)
207
+	# 	if recent_joins is None:
208
+	# 		recent_joins = AgeBoundList(timespan, lambda i, member : member.joined_at)
209
+	# 		Storage.set_state_value(guild, self.STATE_KEY_RECENT_JOINS, recent_joins)
210
+	# 	if last_raid:
211
+	# 		if member.joined_at - last_raid.last_join_time() > timespan:
212
+	# 			# Last raid is over
213
+	# 			Storage.set_state_value(guild, self.STATE_KEY_LAST_RAID, None)
214
+	# 			recent_joins.append(member)
215
+	# 			return
216
+	# 		# Add join to existing raid
217
+	# 		last_raid.join_members.append(member)
218
+	# 		self.record_warning(member)
219
+	# 		if len(last_raid.banned_members) > 0:
220
+	# 			self.log(guild, f'Banning as part of last join raid: {member.name}')
221
+	# 			await member.ban(
222
+	# 				reason='Rocketbot: Part of join raid.',
223
+	# 				delete_message_days=0)
224
+	# 			last_raid.banned_members.add(member)
225
+	# 		elif len(last_raid.kicked_members) > 0:
226
+	# 			self.log(guild, f'Kicking as part of last join raid: {member.name}')
227
+	# 			await member.kick(
228
+	# 				reason='Rocketbot: Part of join raid.')
229
+	# 			last_raid.kicked_members.add(member)
230
+	# 		await self.__update_warning_message(last_raid)
231
+	# 	else:
232
+	# 		# Add join to the general, non-raid recent join list
233
+	# 		recent_joins.append(member)
234
+	# 		if len(recent_joins) >= min_count:
235
+	# 			self.log(guild, '\u0007Join raid detected')
236
+	# 			last_raid = JoinRaidContext(recent_joins)
237
+	# 			Storage.set_state_value(guild, self.STATE_KEY_LAST_RAID, last_raid)
238
+	# 			recent_joins.clear()
239
+	# 			msg = BotMessage(guild,
240
+	# 					text='',
241
+	# 					type=BotMessage.TYPE_MOD_WARNING,
242
+	# 					context=last_raid)
243
+	# 			self.record_warnings(recent_joins)
244
+	# 			last_raid.warning_message_ref = weakref.ref(msg)
245
+	# 			await self.__update_warning_message(last_raid)
246
+	# 			await self.post_message(msg)

Загрузка…
Отмена
Сохранить