Добавил пересылку ошибок в бота

This commit is contained in:
faridik 2021-08-07 12:49:40 +03:00
parent d538cea809
commit 9e85748a82
4 changed files with 93 additions and 13 deletions

View File

@ -5,6 +5,23 @@ import logging
import models import models
import time 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() logging.basicConfig()
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
LOG.setLevel(logging.DEBUG) LOG.setLevel(logging.DEBUG)
@ -46,12 +63,19 @@ def auth():
token = flask.request.args.get("token") token = flask.request.args.get("token")
tg_id = flask.request.args.get("tg_id") tg_id = flask.request.args.get("tg_id")
try: try:
student = app.db.auth_by_token(token, tg_id) student = app.db.auth_by_token(token, tg_id)
return flask.jsonify(student) return flask.jsonify(dict(
except StudentNotFound: #Что тут лучше сделать? student=student,
return flask.jsonify( error=False
dict(error='StudentNotFound') ))
) 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") @app.route("/grades")
@ -63,18 +87,20 @@ def grades():
try: try:
student = app.db.get_student_by_tg_id(tg_id) student = app.db.get_student_by_tg_id(tg_id)
app.db.set_assignments_for_student(student) app.db.set_assignments_for_student(student)
except StudentNotFound: #Что тут лучше сделать?
return flask.jsonify( return flask.jsonify(
dict(error='StudentNotFound')
)
return flask.jsonify(
dict( dict(
error=False,
score=student.score, score=student.score,
grade=student.grade, grade=student.grade,
assignments=student.assignments, assignments=student.assignments,
) )
) )
except StudentNotFound:
return flask.jsonify(STUDENT_NOT_FOUND_DICT)
except:
return flask.jsonify(UNEXPECTED_ERROR_DICT)
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -8,8 +8,8 @@ from google.oauth2.credentials import Credentials
from models.student import Student from models.student import Student
from models.group import Group from models.group import Group
from models.group import StudentNotFound
from models.assignment import Assignment from models.assignment import Assignment
from models.group import StudentNotFound
STUDENT_NUMBERS = 0 STUDENT_NUMBERS = 0
STUDENT_NAMES = 1 STUDENT_NAMES = 1
@ -24,6 +24,16 @@ ASSIGNMENT_ALLOWS = 6
TOKEN_FILE = pathlib.Path() / ".secrets" / "token.json" TOKEN_FILE = pathlib.Path() / ".secrets" / "token.json"
CLIENT_SECRET_FILE = pathlib.Path() / ".secrets" / "client_secret.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: class Manager:
"""Позволяет выполнять операции с Google таблицами.""" """Позволяет выполнять операции с Google таблицами."""
@ -155,6 +165,11 @@ class Manager:
f = lambda row: token == row[AUTH_TOKEN] f = lambda row: token == row[AUTH_TOKEN]
try: try:
row = next(filter(f, values)) 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 row[TELEGRAM_IDS] = tg_id
self.write_values(values, "StudentList") self.write_values(values, "StudentList")
return Student( return Student(

View File

@ -18,6 +18,7 @@ from messages import Messages
TOKEN = Path(".secrets/bot_token.txt").read_text() TOKEN = Path(".secrets/bot_token.txt").read_text()
MESSAGES = Messages() MESSAGES = Messages()
HOST = "http://carolyn-spreadsheets:5000" HOST = "http://carolyn-spreadsheets:5000"
CHAT_LOG_ID = -507530583
logging.basicConfig( logging.basicConfig(
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=logging.INFO 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) updater = Updater(token=TOKEN, use_context=True)
dispatcher = updater.dispatcher 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 # ================================================================ BOT COMMANDS
@ -52,11 +58,28 @@ def start(update: Update, context: CallbackContext):
params={"token": p, "tg_id": user_id}, params={"token": p, "tg_id": user_id},
).json() ).json()
except requests.exceptions.ConnectionError: except requests.exceptions.ConnectionError:
log_to_group_chat(update,
text=MESSAGES.auth.failure_log(
{'desc':'ConnectionError'})
)
update.message.reply_sticker(MESSAGES.stickers.DEAD) update.message.reply_sticker(MESSAGES.stickers.DEAD)
return 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( update.message.reply_text(
text=MESSAGES.auth.hello(data), text=MESSAGES.auth.hello(data['student']),
) )

View File

@ -11,6 +11,22 @@ class Messages:
def hello(self, data): def hello(self, data):
return f"Привет, {data['name']} 👋" 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: class Score:
def get(self, grade, score, n_of_assignments): def get(self, grade, score, n_of_assignments):
summary = ( summary = (