Kaynağa Gözat

Patterns now have priority

master
Rocketsoup 4 yıl önce
ebeveyn
işleme
7eff917ecd
2 değiştirilmiş dosya ile 35 ekleme ve 4 silme
  1. 25
    2
      rocketbot/cogs/patterncog.py
  2. 10
    2
      rocketbot/pattern.py

+ 25
- 2
rocketbot/cogs/patterncog.py Dosyayı Görüntüle

@@ -77,7 +77,7 @@ class PatternCog(BaseCog, name='Pattern Matching'):
77 77
 			return
78 78
 
79 79
 		patterns = self.__get_patterns(message.guild)
80
-		for statement in patterns.values():
80
+		for statement in sorted(patterns.values(), key=lambda s : s.priority, reverse=True):
81 81
 			if statement.expression.matches(message):
82 82
 				await self.__trigger_actions(message, statement)
83 83
 				break
@@ -231,5 +231,28 @@ class PatternCog(BaseCog, name='Pattern Matching'):
231 231
 			return
232 232
 		msg = ''
233 233
 		for name, statement in sorted(patterns.items()):
234
-			msg += f'Pattern `{name}`:\n```\n{statement.original}\n```\n'
234
+			msg += f'Pattern `{name}` (priority={statement.priority}):\n```\n{statement.original}\n```\n'
235 235
 		await context.message.reply(msg, mention_author=False)
236
+
237
+	@pattern.command(
238
+		brief='Sets a pattern\'s priority level',
239
+		description='Sets the priority for a pattern. Messages are checked ' +
240
+			'against patterns with the highest priority first. Patterns with ' +
241
+			'the same priority may be checked in arbitrary order. Default ' +
242
+			'priority is 100.',
243
+	)
244
+	async def setpriority(self, context: commands.Context, name: str, priority: int) -> None:
245
+		'Command handler'
246
+		patterns = self.__get_patterns(context.guild)
247
+		statement = patterns.get(name)
248
+		if statement is None:
249
+			await context.message.reply(
250
+				f'{CONFIG["failure_emoji"]} No such pattern `{name}`',
251
+				mention_author=False)
252
+			return
253
+		statement.priority = priority
254
+		self.__save_patterns(context.guild, patterns)
255
+		await context.message.reply(
256
+			f'{CONFIG["success_emoji"]} Priority for pattern `{name}` ' + \
257
+			f'updated to `{priority}`.',
258
+			mention_author=False)

+ 10
- 2
rocketbot/pattern.py Dosyayı Görüntüle

@@ -143,15 +143,20 @@ class PatternStatement:
143 143
 	A full message match statement. If a message matches the given expression,
144 144
 	the given actions should be performed.
145 145
 	"""
146
+
147
+	DEFAULT_PRIORITY = 100
148
+
146 149
 	def __init__(self,
147 150
 			name: str,
148 151
 			actions: list[PatternAction],
149 152
 			expression: PatternExpression,
150
-			original: str):
153
+			original: str,
154
+			priority: int = DEFAULT_PRIORITY):
151 155
 		self.name = name
152 156
 		self.actions = list(actions)  # PatternAction[]
153 157
 		self.expression = expression
154 158
 		self.original = original
159
+		self.priority = priority
155 160
 
156 161
 	def check_deprecations(self) -> None:
157 162
 		"""
@@ -177,6 +182,7 @@ class PatternStatement:
177 182
 		"""
178 183
 		return {
179 184
 			'name': self.name,
185
+			'priority': self.priority,
180 186
 			'statement': self.original,
181 187
 		}
182 188
 
@@ -185,7 +191,9 @@ class PatternStatement:
185 191
 		"""
186 192
 		Gets a PatternStatement from its JSON representation.
187 193
 		"""
188
-		return PatternCompiler.parse_statement(json['name'], json['statement'])
194
+		ps = PatternCompiler.parse_statement(json['name'], json['statement'])
195
+		ps.priority = json.get('priority', cls.DEFAULT_PRIORITY)
196
+		return ps
189 197
 
190 198
 class PatternCompiler:
191 199
 	"""

Loading…
İptal
Kaydet