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

Patterns now have priority

master
Rocketsoup 4 лет назад
Родитель
Сommit
7eff917ecd
2 измененных файлов: 35 добавлений и 4 удалений
  1. 25
    2
      rocketbot/cogs/patterncog.py
  2. 10
    2
      rocketbot/pattern.py

+ 25
- 2
rocketbot/cogs/patterncog.py Просмотреть файл

77
 			return
77
 			return
78
 
78
 
79
 		patterns = self.__get_patterns(message.guild)
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
 			if statement.expression.matches(message):
81
 			if statement.expression.matches(message):
82
 				await self.__trigger_actions(message, statement)
82
 				await self.__trigger_actions(message, statement)
83
 				break
83
 				break
231
 			return
231
 			return
232
 		msg = ''
232
 		msg = ''
233
 		for name, statement in sorted(patterns.items()):
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
 		await context.message.reply(msg, mention_author=False)
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 Просмотреть файл

143
 	A full message match statement. If a message matches the given expression,
143
 	A full message match statement. If a message matches the given expression,
144
 	the given actions should be performed.
144
 	the given actions should be performed.
145
 	"""
145
 	"""
146
+
147
+	DEFAULT_PRIORITY = 100
148
+
146
 	def __init__(self,
149
 	def __init__(self,
147
 			name: str,
150
 			name: str,
148
 			actions: list[PatternAction],
151
 			actions: list[PatternAction],
149
 			expression: PatternExpression,
152
 			expression: PatternExpression,
150
-			original: str):
153
+			original: str,
154
+			priority: int = DEFAULT_PRIORITY):
151
 		self.name = name
155
 		self.name = name
152
 		self.actions = list(actions)  # PatternAction[]
156
 		self.actions = list(actions)  # PatternAction[]
153
 		self.expression = expression
157
 		self.expression = expression
154
 		self.original = original
158
 		self.original = original
159
+		self.priority = priority
155
 
160
 
156
 	def check_deprecations(self) -> None:
161
 	def check_deprecations(self) -> None:
157
 		"""
162
 		"""
177
 		"""
182
 		"""
178
 		return {
183
 		return {
179
 			'name': self.name,
184
 			'name': self.name,
185
+			'priority': self.priority,
180
 			'statement': self.original,
186
 			'statement': self.original,
181
 		}
187
 		}
182
 
188
 
185
 		"""
191
 		"""
186
 		Gets a PatternStatement from its JSON representation.
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
 class PatternCompiler:
198
 class PatternCompiler:
191
 	"""
199
 	"""

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