Kaynağa Gözat

Small bit of work on crosspost cog

tags/1.0.1
Rocketsoup 4 yıl önce
ebeveyn
işleme
36b69be72a
1 değiştirilmiş dosya ile 13 ekleme ve 4 silme
  1. 13
    4
      cogs/crosspostcog.py

+ 13
- 4
cogs/crosspostcog.py Dosyayı Görüntüle

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

Loading…
İptal
Kaydet