|
|
@@ -138,7 +138,7 @@ class CrossPostCog(BaseCog, name='Crosspost Detection'):
|
|
138
|
138
|
async def __record_message(self, message: Message) -> None:
|
|
139
|
139
|
if message.channel.permissions_for(message.author).ban_members:
|
|
140
|
140
|
# User exempt from spam detection
|
|
141
|
|
- self.__trace("User exempt from crosspost checks")
|
|
|
141
|
+ self.__trace(f"User {message.author.name} exempt from crosspost checks")
|
|
142
|
142
|
return
|
|
143
|
143
|
def compute_message_hash(m: Message) -> int:
|
|
144
|
144
|
to_hash = m.content
|
|
|
@@ -149,13 +149,13 @@ class CrossPostCog(BaseCog, name='Crosspost Detection'):
|
|
149
|
149
|
for attachment in m.attachments:
|
|
150
|
150
|
to_hash += f'\n[[ATT: ct={attachment.content_type} s={attachment.size} w={attachment.width} h={attachment.height}]]'
|
|
151
|
151
|
h = hash(to_hash)
|
|
152
|
|
- self.__trace(f"Message hash for {m.id} is {h}")
|
|
|
152
|
+ self.__trace(f"Hash for message #{m.id} by {m.author.name} is {h}\n\thash content: \"{to_hash}\"")
|
|
153
|
153
|
return h
|
|
154
|
154
|
|
|
155
|
155
|
min_length = self.get_guild_setting(message.guild, self.SETTING_MIN_LENGTH)
|
|
156
|
156
|
if len(message.attachments) == 0 and len(message.content) < min_length:
|
|
157
|
157
|
# Message too short to count towards spam total
|
|
158
|
|
- self.__trace(f"Message len {len(message.content)} < {min_length}")
|
|
|
158
|
+ self.__trace(f"Message len {len(message.content)} < {min_length} configured min")
|
|
159
|
159
|
return
|
|
160
|
160
|
|
|
161
|
161
|
# Get config
|
|
|
@@ -170,14 +170,14 @@ class CrossPostCog(BaseCog, name='Crosspost Detection'):
|
|
170
|
170
|
Storage.set_state_value(message.guild, self.STATE_KEY_RECENT_MESSAGES, recent_messages)
|
|
171
|
171
|
recent_messages.max_age = max_age
|
|
172
|
172
|
recent_messages.append(message)
|
|
173
|
|
- self.__trace(f"Recent messages now length {len(recent_messages)}")
|
|
|
173
|
+ self.__trace(f"Recent messages now length {len(recent_messages)} (max age {max_age.total_seconds}s)")
|
|
174
|
174
|
|
|
175
|
175
|
# Get all recent messages by user
|
|
176
|
176
|
member_messages = [m for m in recent_messages if m.author.id == message.author.id]
|
|
177
|
177
|
message_count = len(member_messages)
|
|
178
|
|
- self.__trace(f"Found {message_count} messages for {message.author.name}")
|
|
|
178
|
+ self.__trace(f"Found {message_count} recent messages by {message.author.name}")
|
|
179
|
179
|
if message_count < warn_count and message_count < dupe_warn_count:
|
|
180
|
|
- self.__trace(f"Bailing because message count {message_count} < warn count {warn_count} and < dupe warn count {dupe_warn_count}")
|
|
|
180
|
+ self.__trace(f"Bailing because total message count {message_count} < configured warn count {warn_count} and < dupe warn count {dupe_warn_count}")
|
|
181
|
181
|
return
|
|
182
|
182
|
|
|
183
|
183
|
# Look for identical(ish) messages and unique channels
|
|
|
@@ -194,13 +194,15 @@ class CrossPostCog(BaseCog, name='Crosspost Detection'):
|
|
194
|
194
|
unique_channels.add(m.channel)
|
|
195
|
195
|
max_duplicate_count = max(max_duplicate_count, len(dupe_message_channels))
|
|
196
|
196
|
channel_count = len(unique_channels)
|
|
197
|
|
- self.__trace(f"Found {len(hash_to_channels)} unique messages, {channel_count} unique channels, {max_duplicate_count} duplicated messages")
|
|
|
197
|
+ self.__trace(f"Found {len(hash_to_channels)} unique messages, {channel_count} unique channels, configured {max_duplicate_count} duplicated messages")
|
|
198
|
198
|
if channel_count < warn_count and max_duplicate_count < dupe_warn_count:
|
|
199
|
|
- self.__trace(f"Bailing because channels {channel_count} < warn count {warn_count} and max dupes {max_duplicate_count} < dupe warn count {dupe_warn_count}")
|
|
|
199
|
+ self.__trace(f"Bailing because unique channels {channel_count} < configured warn count {warn_count} "
|
|
|
200
|
+ f"and max dupes {max_duplicate_count} < configured dupe warn count {dupe_warn_count}")
|
|
200
|
201
|
return
|
|
201
|
202
|
|
|
202
|
203
|
# This person is a problem
|
|
203
|
204
|
|
|
|
205
|
+ self.__trace(f"Spam detected by {message.author.name}")
|
|
204
|
206
|
spam_lookup: AgeBoundDict[str, SpamContext, datetime, timedelta] = Storage.get_state_value(message.guild, self.STATE_KEY_SPAM_CONTEXT)
|
|
205
|
207
|
if spam_lookup is None:
|
|
206
|
208
|
spam_lookup = AgeBoundDict(
|
|
|
@@ -356,7 +358,7 @@ class CrossPostCog(BaseCog, name='Crosspost Detection'):
|
|
356
|
358
|
f'({duplicate_count} identical). Banned by {by_who}.')
|
|
357
|
359
|
|
|
358
|
360
|
def __trace(self, message):
|
|
359
|
|
- # print(message)
|
|
|
361
|
+ # print(f"CrossPostCog: {message}")
|
|
360
|
362
|
pass
|
|
361
|
363
|
|
|
362
|
364
|
@Cog.listener()
|