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

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
 Author: Ian Albert (@rocketsoup)
5
 Author: Ian Albert (@rocketsoup)
6
 Date: 2021-11-11
6
 Date: 2021-11-11
7
 """
7
 """
8
+import asyncio
8
 import traceback
9
 import traceback
10
+
9
 from discord import Intents
11
 from discord import Intents
10
 from discord.ext import commands
12
 from discord.ext import commands
11
 
13
 
16
 from rocketbot.cogs.generalcog import GeneralCog
18
 from rocketbot.cogs.generalcog import GeneralCog
17
 from rocketbot.cogs.joinagecog import JoinAgeCog
19
 from rocketbot.cogs.joinagecog import JoinAgeCog
18
 from rocketbot.cogs.joinraidcog import JoinRaidCog
20
 from rocketbot.cogs.joinraidcog import JoinRaidCog
21
+from rocketbot.cogs.logcog import LogCog
19
 from rocketbot.cogs.patterncog import PatternCog
22
 from rocketbot.cogs.patterncog import PatternCog
20
 from rocketbot.cogs.urlspamcog import URLSpamCog
23
 from rocketbot.cogs.urlspamcog import URLSpamCog
21
 from rocketbot.cogs.usernamecog import UsernamePatternCog
24
 from rocketbot.cogs.usernamecog import UsernamePatternCog
54
 		# Stack trace everything else
57
 		# Stack trace everything else
55
 		traceback.print_exception(type(exception), exception, exception.__traceback__)
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
 import weakref
4
 import weakref
5
 from collections.abc import Sequence
5
 from collections.abc import Sequence
6
 from datetime import datetime, timedelta
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
 from discord.ext import commands
9
 from discord.ext import commands
9
 from typing import List, Union
10
 from typing import List, Union
10
 
11
 
120
 	# Events - Messages
121
 	# Events - Messages
121
 
122
 
122
 	@commands.Cog.listener()
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
 	async def on_message_edit(self, before: Message, after: Message) -> None:
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
 	@commands.Cog.listener()
153
 	@commands.Cog.listener()
127
 	async def on_message_delete(self, message: Message) -> None:
154
 	async def on_message_delete(self, message: Message) -> None:
128
-		pass
155
+		print(f"Message deleted \"{message.content}\"")
129
 
156
 
130
 	@commands.Cog.listener()
157
 	@commands.Cog.listener()
131
 	async def on_bulk_message_delete(self, messages: List[Message]) -> None:
158
 	async def on_bulk_message_delete(self, messages: List[Message]) -> None:
160
 		pass
187
 		pass
161
 
188
 
162
 
189
 
190
+	# ------------------------------------------------------------------------
163
 	def remove_me():
191
 	def remove_me():
164
 		pass
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)

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