platform integration

This commit is contained in:
Administrator
2023-11-11 12:58:51 +03:00
parent 4afcf30564
commit 6cf63c6684
4 changed files with 113 additions and 41 deletions

View File

@@ -94,12 +94,12 @@ class Answer:
if len(lessons) == 0:
self.send_message(
"Сегодня у тебя нет пар, отдыхай",
reply_markup=main_keyboard()
reply_markup=main_keyboard(self.user['chat_id'])
)
else:
self.send_message(
"Твои пары сегодня:\n" + ruz.schedule_builder(lessons),
reply_markup=main_keyboard(),
reply_markup=main_keyboard(self.user['chat_id']),
parse_mode='Markdown',
)
self.set_state("ready")
@@ -150,7 +150,7 @@ class Answer:
text = "Я не понимаю такой команды, используй кнопки."
self.send_message(
text,
reply_markup=main_keyboard(),
reply_markup=main_keyboard(self.user['chat_id']),
parse_mode='Markdown'
)
@@ -171,7 +171,7 @@ class Answer:
self.set_state("ready")
self.send_message(
self.message_text,
reply_markup=main_keyboard()
reply_markup=main_keyboard(self.user['chat_id'])
)
else:
self.send_message("Используй кнопки!", reply_markup=notify_type())
@@ -192,7 +192,7 @@ class Answer:
return
mongo.users_collection.update_one({"chat_id": self.user['chat_id']}, {"$set": {"first_lesson_notify": time_notify}})
self.set_state("ready")
self.send_message("Запомнил!", reply_markup=main_keyboard())
self.send_message("Запомнил!", reply_markup=main_keyboard(self.user['chat_id']))
def handle_state_wait_for_daily_notify_type(self):
if self.message_text == "Текущий день":
@@ -216,7 +216,7 @@ class Answer:
elif self.message_text == "Не уведомлять":
self.send_message(
"Принято! Я не буду уведомлять тебя.",
reply_markup=main_keyboard()
reply_markup=main_keyboard(self.user['chat_id'])
)
mongo.users_collection.update_one(
{"chat_id": self.user['chat_id']},
@@ -225,7 +225,7 @@ class Answer:
elif self.message_text == "Назад":
self.send_message(
"Возвращаюсь!",
reply_markup=main_keyboard()
reply_markup=main_keyboard(self.user['chat_id'])
)
mongo.users_collection.update_one(
{"chat_id": self.user['chat_id']},
@@ -259,7 +259,7 @@ class Answer:
text = f"Принято! Буду уведомлять тебя за {self.message_text}."
else:
text = f"Принято! Я не буду уведомлять тебя."
self.send_message(text, reply_markup=main_keyboard())
self.send_message(text, reply_markup=main_keyboard(self.user['chat_id']))
self.set_state("ready")
def _validate_time(self, line: str) -> bool:
@@ -281,7 +281,7 @@ class Answer:
if self.message_text == "Не уведомлять":
self.send_message(
"Принято! Я не буду присылать тебе ежедневные уведомления.",
reply_markup=main_keyboard()
reply_markup=main_keyboard(self.user['chat_id'])
)
mongo.users_collection.update_one(
{"chat_id": self.user['chat_id']},
@@ -298,7 +298,7 @@ class Answer:
next_time = get_next_daily_notify_time(self.user)
self.send_message(
f"Принято! Буду уведомлять тебя каждый день в {self.message_text}.",
reply_markup=main_keyboard()
reply_markup=main_keyboard(self.user['chat_id'])
)
mongo.users_collection.update_one(
{"chat_id": self.user['chat_id']},
@@ -314,7 +314,7 @@ class Answer:
mongo.users_collection.delete_one({"email": self.user['email']})
self.send_message("Настройки сброшены, ждем твоего возвращения", reply_markup=again_keyboard())
elif self.message_text == "Нет":
self.send_message("Возращаюсь к прежнему режиму", reply_markup=main_keyboard())
self.send_message("Возращаюсь к прежнему режиму", reply_markup=main_keyboard(self.user['chat_id']))
self.set_state("ready")
else:
self.send_message("Я не понимаю, используй кнопки", reply_markup=yes_no_keyboard())

View File

@@ -1,15 +1,15 @@
import telebot
import settings
from helpers.platform import platform
def main_keyboard():
def main_keyboard(telegram_id):
kb = telebot.types.ReplyKeyboardMarkup(True, False)
kb.row("Пары сегодня", "Пары завтра")
kb.row("Расписание на неделю")
kb.row("Напоминания о парах")
kb.row("Ежедневные уведомления")
if settings.DEBUG:
if platform.experiment_enabled_for_user('alice', telegram_id):
kb.row("Подключение Алисы")
kb.row("Сброс настроек")
return kb

97
helpers/platform.py Normal file
View File

@@ -0,0 +1,97 @@
import os
from cachetools import TTLCache
from requests import get
class Platform:
def __init__(self):
self.staff_cache = TTLCache(1000, 60)
self.exp_cache = TTLCache(1000, 60)
self.configs = TTLCache(1000, 60)
self.stage = os.getenv("STAGE", "local")
self.token = os.getenv("PLATFORM_SECURITY_TOKEN")
self.project = "РУЗ Бот"
def get_config(self, config_name):
config = self.configs.get(config_name)
if config is None:
config = get(
'https://platform.sprinthub.ru/configs/get',
headers={'X-Security-Token': self.token},
params={
'project': self.project,
'stage': self.stage,
'name': config_name
}
)
if config.status_code != 200:
return {}
config = config.json()
self.configs[config_name] = config
return config
def get_experiment(self, experiment_name):
exp = self.exp_cache.get(experiment_name)
if exp is None:
exp = get(
'https://platform.sprinthub.ru/experiments/get',
headers={'X-Security-Token': self.token},
params={
'project': self.project,
'stage': self.stage,
'name': experiment_name
}
)
if exp.status_code != 200:
return {
'enabled': False,
'condition': False
}
experiment_name = exp.json()
self.exp_cache[experiment_name] = exp
return exp
def get_staff(self, telegram_id):
is_staff = self.staff_cache.get(telegram_id)
if is_staff is None:
exp = get(
'https://platform.sprinthub.ru/is_staff',
headers={'X-Security-Token': self.token},
params={
'telegram_id': telegram_id,
}
)
if exp.status_code != 200:
return False
data = exp.json()
is_staff = data['is_staff']
self.staff_cache[telegram_id] = is_staff
return is_staff
def experiment_enabled_for_user(self, experiment_name, telegram_id):
exp_data = self.get_experiment(experiment_name)
if not exp_data['enabled']:
return False
class User:
def __init__(self, platform, telegram_id):
self.platform = platform
self.telegram_id = telegram_id
@property
def is_staff(self):
return self.platform.get_staff(self.telegram_id)
@property
def is_superuser(self):
return False
user = User(self, telegram_id)
try:
return bool(eval(exp_data['condition']))
except:
return False
platform = Platform()