if "привет" in message :
say_message("Здравствуйте, хозяин!")
@vcl.on('привет')
def hello(text):
return "Здравствуйте, хозяин!"
stat_checks = {
#проверяемая стата
'messages_sent': [
#функция или лямбда для проверки ачивки, id ачивки
( (lambda v: v > 100), 'achievement_100_messages'),
],
'voicechat_time': [
#...
],
}
def stat_bump(user_id, stat_id, delta):
#выполняем запрос UPDATE/INSERT для статы stat_id
query(...)
#узнаем текущее значение статы stat_id
stat_value = ...
#узнаем ачивки пользователя
achievements = ...
for predicate, achiev in stat_checks.get(stat_id, []):
if predicate(stat_value) and (achiev not in achievements):
#набрал стату на ачивку, но ачивки такой ещё нет!
give_achievement(achiev, user_id)
class Filter:
def __init__(self):
self.year_to = None
self.year_from = None
self.genres = set()
#ну и так далее
def check(self, obj) -> bool:
#делаем цепочку условий отсева вида "условие_актуально and условие_не_выполняется"
#ну или как там у тебя к году фильма обратиться?
if self.year_to is not None and obj['year'] > self.year_to:
return False
if self.year_from is not None and obj['year'] < self.year_from:
return False
#obj['genres'] должен быть коллекцицей жанров, а не строкой вида жанр1|жанр2
if self.genres and self.genres.isdisjoint(obj['genres']):
return False
#и так далее, столько условий, сколько надо
#а если дошли до конца, то фильм подошел
return True
flt = Filter()
flt.genres = set(['Drama', 'Romance']) #или вытаскиваешь жанры из аргументов командной строки
flt.year_from = 2010
#бум, список подходящих под критерии фильмов
filtered = list(filter(flt.check, movies))
#если нужно N лучших, то сортируешь по рейтингу
filtered.sort(key = lambda m: ... )
filtered = filtered[0:N]
from dataclasses import dataclass
@dataclass
class Movie:
#__slots__ позволяет сэкономить память, если набор атрибутов объекта известен заранее и неизменен.
#полезно для маленьких объектов, которые будут существовать в большом количестве
__slots__ = ('id', 'name', 'year', 'genres', 'rating')
id: str #int?
name: str
year: int
genres: set
rating: float
#конструктор датакласс сгенерирует сам
Ещё добавлю: возможно, стоит либо изменить проверку на вхождение подстроки, либо добавить поддержку регулярных выражений.
Потому что команда "напиши привет" будет выполнена либо как "напиши" либо как "привет", в зависимости от того в каком порядке объявлены функции.