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

Small bit of work on crosspost cog

tags/1.0.1
Rocketsoup 4 лет назад
Родитель
Сommit
36b69be72a
1 измененных файлов: 13 добавлений и 4 удалений
  1. 13
    4
      cogs/crosspostcog.py

+ 13
- 4
cogs/crosspostcog.py Просмотреть файл

1
+from rscollections import BoundList
1
 from discord import Guild, Message
2
 from discord import Guild, Message
2
 from cogs.basecog import BaseCog
3
 from cogs.basecog import BaseCog
3
 
4
 
5
 	class SpamContext:
6
 	class SpamContext:
6
 		def __init__(self, member):
7
 		def __init__(self, member):
7
 			self.member = member
8
 			self.member = member
9
+			self.age = timedate.now()
8
 			self.is_warned = False
10
 			self.is_warned = False
9
 
11
 
10
 	STATE_KEY_RECENT_MESSAGES = "crosspost_recent_messages"
12
 	STATE_KEY_RECENT_MESSAGES = "crosspost_recent_messages"
13
 	def __init__(self, bot):
15
 	def __init__(self, bot):
14
 		super().__init__(bot)
16
 		super().__init__(bot)
15
 		self.max_recent_messages = 20
17
 		self.max_recent_messages = 20
18
+		self.max_spam_contexts = 12
16
 		self.messages_per_user = 3
19
 		self.messages_per_user = 3
17
 		self.min_message_length = 10
20
 		self.min_message_length = 10
18
 
21
 
19
 	def __record_message(self, message: Message) -> None:
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
 		recent_messages.append(message)
25
 		recent_messages.append(message)
22
-		while len(recent_messages) > self.max_recent_messages:
23
-			recent_messages.pop(0)
24
 		Storage.set_state_value(message.guild, self.STATE_KEY_RECENT_MESSAGES, recent_messages)
26
 		Storage.set_state_value(message.guild, self.STATE_KEY_RECENT_MESSAGES, recent_messages)
25
 
27
 
26
 	def __check_for_spam(self, guild: Guild) -> None:
28
 	def __check_for_spam(self, guild: Guild) -> None:
40
 				spamming_members.add(message.author)
42
 				spamming_members.add(message.author)
41
 		for member in spamming_members:
43
 		for member in spamming_members:
42
 			context = self.__spam_context_for_user(member, True)
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
 	def __spam_context_for_user(self,
52
 	def __spam_context_for_user(self,
45
 			member: Member,
53
 			member: Member,
46
 			create_if_missing: bool = False) -> SpamContext:
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
 		context = spam_lookup.get(member.id)
57
 		context = spam_lookup.get(member.id)
49
 		if context:
58
 		if context:
50
 			return context
59
 			return context

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