From 9e85748a82c91837bfb0599b7ac5e10db594f573 Mon Sep 17 00:00:00 2001 From: faridik Date: Sat, 7 Aug 2021 12:49:40 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D1=81=D1=8B=D0=BB=D0=BA=D1=83=20=D0=BE?= =?UTF-8?q?=D1=88=D0=B8=D0=B1=D0=BE=D0=BA=20=D0=B2=20=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpreadsheetsService/app.py | 48 ++++++++++++++++++++------ SpreadsheetsService/manager/manager.py | 17 ++++++++- TelegramBot/bot.py | 25 +++++++++++++- TelegramBot/messages/messages.py | 16 +++++++++ 4 files changed, 93 insertions(+), 13 deletions(-) diff --git a/SpreadsheetsService/app.py b/SpreadsheetsService/app.py index 88c41af..455f67a 100644 --- a/SpreadsheetsService/app.py +++ b/SpreadsheetsService/app.py @@ -5,6 +5,23 @@ import logging import models import time +UNEXPECTED_ERROR_DICT = dict( + error=True, + desc='UnexpectedError' + ) +STUDENT_NOT_FOUND_DICT = dict( + error=True, + desc='StudentNotFound' + ) +STUDENT_ALREADY_AUTHED_DICT = dict( + error = True, + desc='StudentAlreadyAuthed' + ) +ANOTHER_STUDENT_ALREADY_AUTHED_DICT = dict( + error = True, + desc='AnotherStudentAlreadyAuthed' + ) + logging.basicConfig() LOG = logging.getLogger(__name__) LOG.setLevel(logging.DEBUG) @@ -46,12 +63,19 @@ def auth(): token = flask.request.args.get("token") tg_id = flask.request.args.get("tg_id") try: - student = app.db.auth_by_token(token, tg_id) - return flask.jsonify(student) - except StudentNotFound: #Что тут лучше сделать? - return flask.jsonify( - dict(error='StudentNotFound') - ) + student = app.db.auth_by_token(token, tg_id) + return flask.jsonify(dict( + student=student, + error=False + )) + except StudentAlreadyAuthed: + return flask.jsonify(STUDENT_ALREADY_AUTHED_DICT) + except AnotherStudentAlreadyAuthed: + return flask.jsonify(ANOTHER_STUDENT_ALREADY_AUTHED_DICT) + except StudentNotFound: + return flask.jsonify(STUDENT_NOT_FOUND_DICT) + except: + return flask.jsonify(UNEXPECTED_ERROR_DICT) @app.route("/grades") @@ -63,18 +87,20 @@ def grades(): try: student = app.db.get_student_by_tg_id(tg_id) app.db.set_assignments_for_student(student) - except StudentNotFound: #Что тут лучше сделать? return flask.jsonify( - dict(error='StudentNotFound') - ) - - return flask.jsonify( dict( + error=False, score=student.score, grade=student.grade, assignments=student.assignments, ) ) + except StudentNotFound: + return flask.jsonify(STUDENT_NOT_FOUND_DICT) + except: + return flask.jsonify(UNEXPECTED_ERROR_DICT) + + if __name__ == "__main__": diff --git a/SpreadsheetsService/manager/manager.py b/SpreadsheetsService/manager/manager.py index 965c93e..600a465 100644 --- a/SpreadsheetsService/manager/manager.py +++ b/SpreadsheetsService/manager/manager.py @@ -8,8 +8,8 @@ from google.oauth2.credentials import Credentials from models.student import Student from models.group import Group -from models.group import StudentNotFound from models.assignment import Assignment +from models.group import StudentNotFound STUDENT_NUMBERS = 0 STUDENT_NAMES = 1 @@ -24,6 +24,16 @@ ASSIGNMENT_ALLOWS = 6 TOKEN_FILE = pathlib.Path() / ".secrets" / "token.json" CLIENT_SECRET_FILE = pathlib.Path() / ".secrets" / "client_secret.json" +class StudentAlreadyAuthed(Exception): + def __init__(self, message): + self.message = message + super().__init__(self.message) + +class AnotherStudentAlreadyAuthed(Exception): + def __init__(self, message): + self.message = message + super().__init__(self.message) + class Manager: """Позволяет выполнять операции с Google таблицами.""" @@ -155,6 +165,11 @@ class Manager: f = lambda row: token == row[AUTH_TOKEN] try: row = next(filter(f, values)) + if row[TELEGRAM_IDS] == tg_id: + raise StudentAlreadyAuthed('Студент уже зарегистрировался') + elif row[TELEGRAM_IDS]: + raise AnotherStudentAlreadyAuthed( + 'Другой студент зарегистрировался по token') row[TELEGRAM_IDS] = tg_id self.write_values(values, "StudentList") return Student( diff --git a/TelegramBot/bot.py b/TelegramBot/bot.py index 9897abb..0e32e21 100644 --- a/TelegramBot/bot.py +++ b/TelegramBot/bot.py @@ -18,6 +18,7 @@ from messages import Messages TOKEN = Path(".secrets/bot_token.txt").read_text() MESSAGES = Messages() HOST = "http://carolyn-spreadsheets:5000" +CHAT_LOG_ID = -507530583 logging.basicConfig( format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=logging.INFO @@ -28,6 +29,11 @@ LOG.debug("Token is %s", TOKEN) updater = Updater(token=TOKEN, use_context=True) dispatcher = updater.dispatcher + +def log_to_group_chat(update: Update, text: str): + update.message.bot.send_message(chat_id=CHAT_LOG_ID, text=text) + + # ================================================================ BOT COMMANDS @@ -52,11 +58,28 @@ def start(update: Update, context: CallbackContext): params={"token": p, "tg_id": user_id}, ).json() except requests.exceptions.ConnectionError: + log_to_group_chat(update, + text=MESSAGES.auth.failure_log( + {'desc':'ConnectionError'}) + ) update.message.reply_sticker(MESSAGES.stickers.DEAD) return + if data['error']: + log_to_group_chat(update, + text=MESSAGES.auth.failure_log(data) + ) + update.message.reply_text( + text=MESSAGES.auth.failure(data) + ) + update.message.reply_sticker(MESSAGES.stickers.DEAD) + return + + log_to_group_chat(update, + text=MESSAGES.auth.success_log(data['student']) + ) update.message.reply_text( - text=MESSAGES.auth.hello(data), + text=MESSAGES.auth.hello(data['student']), ) diff --git a/TelegramBot/messages/messages.py b/TelegramBot/messages/messages.py index 2ca40ea..0c233d9 100644 --- a/TelegramBot/messages/messages.py +++ b/TelegramBot/messages/messages.py @@ -11,6 +11,22 @@ class Messages: def hello(self, data): return f"Привет, {data['name']} 👋" + def failure(self, data): + if data['desc'] == 'StudentNotFound': + return "⛔ Ссылка больше не работает" + elif data['desc'] == 'StudentAlreadyAuthed': + return "⛔ Регистрация по этой ссылке уже прошла" + elif data['desc'] == 'AnotherStudentAlreadyAuthed': + return "😨 Кто-то другой уже зерегистрировался по этой ссылке" + else: + return "😟 Возникли неполадки" + + def success_log(self, data): + return f"✅ AUTH: {data['name']} " + + def failure_log(self, data): + return f"🟥 AUTH: {data['desc']}" + class Score: def get(self, grade, score, n_of_assignments): summary = (