|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+from rscollections import BoundList
|
|
1
|
2
|
from discord import Guild, Message
|
|
2
|
3
|
from cogs.basecog import BaseCog
|
|
3
|
4
|
|
|
|
@@ -5,6 +6,7 @@ class CrossPostCog(BaseCog):
|
|
5
|
6
|
class SpamContext:
|
|
6
|
7
|
def __init__(self, member):
|
|
7
|
8
|
self.member = member
|
|
|
9
|
+ self.age = timedate.now()
|
|
8
|
10
|
self.is_warned = False
|
|
9
|
11
|
|
|
10
|
12
|
STATE_KEY_RECENT_MESSAGES = "crosspost_recent_messages"
|
|
|
@@ -13,14 +15,14 @@ class CrossPostCog(BaseCog):
|
|
13
|
15
|
def __init__(self, bot):
|
|
14
|
16
|
super().__init__(bot)
|
|
15
|
17
|
self.max_recent_messages = 20
|
|
|
18
|
+ self.max_spam_contexts = 12
|
|
16
|
19
|
self.messages_per_user = 3
|
|
17
|
20
|
self.min_message_length = 10
|
|
18
|
21
|
|
|
19
|
22
|
def __record_message(self, message: Message) -> None:
|
|
20
|
|
- recent_messages = Storage.get_state_value(message.guild, self.STATE_KEY_RECENT_MESSAGES) or []
|
|
|
23
|
+ recent_messages = Storage.get_state_value(message.guild, self.STATE_KEY_RECENT_MESSAGES) \
|
|
|
24
|
+ or BoundList(self.max_recent_messages, lambda index, message : message.created_at)
|
|
21
|
25
|
recent_messages.append(message)
|
|
22
|
|
- while len(recent_messages) > self.max_recent_messages:
|
|
23
|
|
- recent_messages.pop(0)
|
|
24
|
26
|
Storage.set_state_value(message.guild, self.STATE_KEY_RECENT_MESSAGES, recent_messages)
|
|
25
|
27
|
|
|
26
|
28
|
def __check_for_spam(self, guild: Guild) -> None:
|
|
|
@@ -40,11 +42,18 @@ class CrossPostCog(BaseCog):
|
|
40
|
42
|
spamming_members.add(message.author)
|
|
41
|
43
|
for member in spamming_members:
|
|
42
|
44
|
context = self.__spam_context_for_user(member, True)
|
|
|
45
|
+ if not context.is_warned:
|
|
|
46
|
+ self.__on_new_spam(context)
|
|
|
47
|
+
|
|
|
48
|
+ def __on_new_spam(self, context: SpamContext):
|
|
|
49
|
+ context.is_warned = True
|
|
|
50
|
+ # TODO
|
|
43
|
51
|
|
|
44
|
52
|
def __spam_context_for_user(self,
|
|
45
|
53
|
member: Member,
|
|
46
|
54
|
create_if_missing: bool = False) -> SpamContext:
|
|
47
|
|
- spam_lookup = Storage.get_state_value(member.guild, self.STATE_KEY_SPAM_CONTEXT) or {}
|
|
|
55
|
+ spam_lookup = Storage.get_state_value(member.guild, self.STATE_KEY_SPAM_CONTEXT) \
|
|
|
56
|
+ or BoundDict(self.max_spam_contexts, lambda key, context : context.age)
|
|
48
|
57
|
context = spam_lookup.get(member.id)
|
|
49
|
58
|
if context:
|
|
50
|
59
|
return context
|