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