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

@ -1,40 +1,15 @@
import logging
import os import os
import telebot import telebot
from cachetools import TTLCache
from requests import get
from telebot.types import Message from telebot.types import Message
import settings import settings
from helpers.mongo import mongo from helpers.mongo import mongo
from helpers.platform import platform
bot = telebot.TeleBot(os.getenv("TELEGRAM_TOKEN")) bot = telebot.TeleBot(os.getenv("TELEGRAM_TOKEN"))
STAFF_CACHE = TTLCache(100, 60)
def is_staff(telegram_id):
logging.info("is staff check")
staff_data = STAFF_CACHE.get(telegram_id)
if staff_data is None:
staff_data = get(
'https://platform.sprinthub.ru/is_staff',
headers={'X-Security-Token': settings.PLATFORM_SECURITY_TOKEN},
params={
'telegram_id': telegram_id
}
)
if staff_data.status_code != 200:
logging.info('return status ' + str(staff_data.status_code))
return False
staff_data = staff_data.json()['is_staff']
logging.info('got info ' + str(staff_data))
STAFF_CACHE[telegram_id] = staff_data
return staff_data
@bot.message_handler(commands=['start']) @bot.message_handler(commands=['start'])
def on_start(message: Message): def on_start(message: Message):
mongo.users_collection.delete_many({"chat_id": message.chat.id}) mongo.users_collection.delete_many({"chat_id": message.chat.id})
@ -43,7 +18,7 @@ def on_start(message: Message):
@bot.message_handler() @bot.message_handler()
def do_action(message: Message): def do_action(message: Message):
if settings.STAGE == 'development' and not is_staff(message.chat.id): if settings.STAGE == 'development' and not platform.get_staff(message.chat.id):
return return
from helpers.answer import Answer from helpers.answer import Answer
Answer(message).process() Answer(message).process()

View File

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

View File

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