def show_word(pk_of_user_in_db: int) -> str: ''' Foo is using on level "default". Foo returns definition of randomly selected word and assign status "doing" to row. ''' if len( config_file.db_select("SELECT * \ FROM dynamic_vocab WHERE user_id={}".format( pk_of_user_in_db))) > 0: highest = len( config_file.db_select("SELECT * \ FROM dynamic_vocab \ WHERE user_id={}".format( pk_of_user_in_db))) config_file.db_update("WITH test AS (\ SELECT id_in_dynamic, ROW_NUMBER() OVER() \ FROM dynamic_vocab WHERE user_id={})\ UPDATE dynamic_vocab \ SET status_of_word_in_dynamic='doing' \ WHERE id_in_dynamic IN (SELECT id_in_dynamic \ FROM test \ WHERE row_number=(SELECT floor(random() \ * 0 + {})::int))".format( pk_of_user_in_db, highest)) return (config_file.db_select( "SELECT definition_in_dynamic FROM dynamic_vocab \ WHERE status_of_word_in_dynamic='doing'") [0][0]) return ( 'Словарь закончился!\n\nДобавь новые слова или пройдись еще раз по словарю. ' )
def checking_word(message_word: str, pk_of_user_in_db: int) -> Tuple[bool, str]: '''Foo checks accuracy of written (to bot) word''' if message_word.rstrip()[::-1].rstrip()[::-1].lower() == \ config_file.db_select("SELECT word_in_dynamic \ FROM dynamic_vocab \ WHERE status_of_word_in_dynamic='doing'" ) \ [0][0].lower(): config_file.db_update("DELETE FROM dynamic_vocab \ WHERE status_of_word_in_dynamic='doing'") return (True, None) word = config_file.db_select("SELECT word_in_dynamic \ FROM dynamic_vocab \ WHERE status_of_word_in_dynamic='doing'" ) \ [0][0] config_file.db_update("DELETE FROM dynamic_vocab \ WHERE status_of_word_in_dynamic='doing'") return (False, word)
def checking_chat_id(chat_id): ''' Foo checks is there chat_id in table users or not, i.e. user is authorized or not in Telegram Bot. ''' try: if True == (config_file.db_select('SELECT TRUE HAVING {} IN (SELECT telegram_id\ FROM users)'.format(chat_id))[0][0]): return True except: return False
def show_all_words_for_modif(pk_of_user_in_db: int, chat_id: int): ''' Foo is using on level "modificate word". Foo returns whole list of words in table whole_vocab. Returning is with a frequency of 25 words. ''' config_file.db_update("DELETE FROM dynamic_vocab \ WHERE user_id={}".format(pk_of_user_in_db)) config_file.db_update("INSERT INTO dynamic_vocab \ (user_id, word_in_dynamic, definition_in_dynamic, id_in_dynamic) \ SELECT user_id, word_in_whole, definition_of_word, id_in_whole \ FROM whole_vocab WHERE user_id={}".format( pk_of_user_in_db)) list_all_words = config_file.db_select("SELECT word_in_dynamic \ FROM dynamic_vocab \ WHERE user_id={}".format( pk_of_user_in_db)) list_all_words = [i[0] for i in list_all_words] if len(list_all_words) < 1: telegram_api_request.ButtonCreate(message_text= 'Словарь пустой.\nСначала следует добавить слова.', chat_id=chat_id, texts_of_button= ['Добавить новое слово', 'Проверять слова!', 'Внести изменения в словарь', 'Удалить слова']). \ return_button() else: i = 1 while len(list_all_words) != 0: s = '' for b in list_all_words[0:25]: s = s + str(i) + '. ' + str(b) + '\n' i += 1 list_all_words = list_all_words[25:] telegram_api_request.ButtonCreate(message_text=s, chat_id=chat_id, texts_of_button=['']). \ return_button() telegram_api_request.ButtonCreate(message_text= 'Это список слов.\nНапиши номер слова, которое хочешь изменить. ' + \ 'Если хочешь изменить само слово, не только его дефиницию, ' + \ 'то напиши сразу слово. Например так:\n1. Example word', chat_id=chat_id, texts_of_button=['Добавить новое слово', 'Проверять слова!', 'Внести изменения в словарь', 'Удалить слова']). \ return_button()
def modificate_definition(definition: str, pk_of_user_in_db: int) -> str: '''Foo modificate definition in row of table whole_vocab ''' try: number_in_whole = config_file.db_select( "WITH test as (SELECT id_in_dynamic \ FROM dynamic_vocab \ WHERE status_of_word_in_dynamic='modif' \ AND user_id={}) \ SELECT id_in_whole FROM whole_vocab \ WHERE id_in_whole IN (SELECT id_in_dynamic\ FROM test);".format( pk_of_user_in_db))[0][0] config_file.db_update("UPDATE whole_vocab SET definition_of_word='{}' \ WHERE id_in_whole={}".format( definition, number_in_whole)) return ('Done!') except: return ('Что-то пошло не так :(')
def show_all_words_for_deleting(pk_of_user_in_db, chat_id): ''' Foo is using on level "deleting". Foo returns whole list of words in table whole_vocab. Returning is with a frequency of 25 words. ''' config_file.db_update("DELETE FROM dynamic_vocab \ WHERE user_id={}".format(pk_of_user_in_db)) config_file.db_update("INSERT INTO dynamic_vocab \ (user_id, word_in_dynamic, id_in_dynamic) \ SELECT user_id, word_in_whole, id_in_whole \ FROM whole_vocab WHERE user_id={}".format( pk_of_user_in_db)) list_all_words = config_file.db_select("SELECT word_in_dynamic \ FROM dynamic_vocab \ WHERE user_id={}".format( pk_of_user_in_db)) list_all_words = [i[0] for i in list_all_words] if len(list_all_words) < 1: telegram_api_request.ButtonCreate(message_text= 'Словарь пустой.\nСначала следует добавить слова.', chat_id=chat_id, texts_of_button=['Добавить новое слово', 'Проверять слова!', 'Внести изменения в словарь']). \ return_button() else: i = 1 while len(list_all_words) != 0: s = '' for b in list_all_words[0:25]: s = s + str(i) + '. ' + str(b) + '\n' i += 1 list_all_words = list_all_words[25:] telegram_api_request.ButtonCreate(message_text=s, chat_id=chat_id, texts_of_button=['']). \ return_button() telegram_api_request.ButtonCreate(message_text='Это список слов.\n\nНапиши номер ' + \ 'слова, которое хочешь удалить.\n\nЕсли их несколько, то напиши через запятую ' + \ 'в таком формате: 1,2,3', chat_id=chat_id, texts_of_button= ['Добавить новое слово', 'Проверять слова!', 'Внести изменения в словарь']). \ return_button()
def requests_list(message, chat_id, r_json): ''' Foo takes message and chat_id from Teleram server and make an answer to user. There are 4 main levels, every level means a certain step in work of Telegram Bot. This foo is more like a distributor of functions, that realy have a weight, do action. Also first lines of foo check authorization of user in Telegram Bot. ''' try: if checking_chat_id(chat_id) == False and "@" in message: try: print(chat_id, message) print("UPDATE users SET telegram_id='{}', user_level='start password' \ WHERE email='{}'". format(chat_id, str(message))) config_file.db_update("UPDATE users SET telegram_id='{}', user_level='start password' \ WHERE email='{}'". format(chat_id, str(message))) telegram_api_request.ButtonCreate(message_text='Теперь напиши пароль', chat_id=chat_id, texts_of_button=['']).return_button() except: telegram_api_request.ButtonCreate(message_text='Что-то пошло не так. напиши почту, ' + \ 'которую ты зарегистрировал на сайте. Именно почту.\n' + \ 'Если не зарегистрирован на сайте, то следуте зарегистрироваться сначала. ' + \ 'Ссылка на сайт: https://telegrampyvocab.herokuapp.com/registration', chat_id=chat_id, texts_of_button=['']).\ return_button() elif checking_chat_id(chat_id) == False and "@" not in message: telegram_api_request.ButtonCreate(message_text='Напиши почту, на которую зарегистрирован аккаунт на сайте. ' + \ 'Пожалуйста, не ошибись при записи :) ', chat_id=chat_id, texts_of_button=['']).\ return_button() else: pk_of_user_in_db = config_file.db_select("SELECT id from users where telegram_id={}".format(chat_id))[0][0] message_list = ['Добавить новое слово', 'Удалить слова', 'Внести изменения в словарь', 'Проверять слова!' ] if message in message_list: if message=='Добавить новое слово': variables.Variables(message,chat_id,pk_of_user_in_db).add_word() elif message=='Удалить слова': variables.Variables(message, chat_id, pk_of_user_in_db).delete_word() elif message=='Внести изменения в словарь': variables.Variables(message, chat_id,pk_of_user_in_db).modif_dict() elif message=='Проверять слова!': variables.Variables(message, chat_id, pk_of_user_in_db).check_word() else: level = config_file.db_select("SELECT user_level FROM users \ WHERE telegram_id = {}".format(chat_id))[0][0] if level == 'start password': try: tg_password = hash.hashing(str(message)) if tg_password == config_file.db_select("SELECT user_password FROM users \ WHERE telegram_id = {}".format(chat_id))[0][0]: modificate_level(pk_of_user_in_db, 'default') telegram_api_request.ButtonCreate(message_text='Ты авторизован! Теперь добавь первое слово. ' + \ 'Нажми кнопку.', chat_id=chat_id, texts_of_button=['Добавить новое слово']).\ return_button() else: modificate_level(pk_of_user_in_db, 'default') telegram_api_request.ButtonCreate(message_text='Пароль не тот :(\nПопробуй еще раз, пожалуйста. ' + \ 'Напиши почту сначала. ', chat_id=chat_id, texts_of_button=['']).\ return_button() except: telegram_api_request.ButtonCreate(message_text='Что-то пошло не так. Посмотри внимательно свой пароль. ' + \ 'Напиши снова почту', chat_id=chat_id, texts_of_button=['']).\ return_button() elif level == 'adding word': config_file.db_update("INSERT INTO whole_vocab (word_in_whole, user_id, status_of_word_in_whole) \ VALUES('{}', {}, 'doing')". format(message.rstrip()[::-1].rstrip()[::-1], pk_of_user_in_db)) modificate_level(pk_of_user_in_db, 'adding_definition') telegram_api_request.ButtonCreate(message_text='Напиши дефиницию или перевод данного слова.', chat_id=chat_id, texts_of_button=['Добавить новое слово', 'Удалить слова', 'Внести изменения в словарь']).\ return_button() elif level == 'adding_definition': config_file.db_update("UPDATE whole_vocab SET definition_of_word = '{}', status_of_word_in_whole = 'not done' \ WHERE user_id = {} AND status_of_word_in_whole='doing' ". format(message.rstrip()[::-1].rstrip()[::-1], pk_of_user_in_db)) modificate_level(pk_of_user_in_db, 'default') telegram_api_request.ButtonCreate(message_text='Новое слово добавлено.', chat_id=chat_id, texts_of_button=['Добавить новое слово', 'Проверять слова!', 'Внести изменения в словарь', 'Удалить слова'], )\ .return_button() elif level == 'default': bul, word = operations.checking_word(message, pk_of_user_in_db) if bul == True: telegram_api_request.ButtonCreate(message_text='Правильно. ' + '\n\n' + operations.show_word(pk_of_user_in_db), chat_id=chat_id, texts_of_button=['Добавить новое слово', 'Внести изменения в словарь', 'Удалить слова', 'Проверять слова!']).\ return_button() else: telegram_api_request.ButtonCreate(message_text='Неправильно.\nПравильно так: ' + word + '\n\n' + \ operations.show_word(pk_of_user_in_db), chat_id=chat_id, texts_of_button=['Добавить новое слово', 'Внести изменения в словарь', 'Удалить слова', 'Проверять слова!']).\ return_button() elif level == 'deleting': if len(config_file.db_select("SELECT * FROM whole_vocab WHERE user_id={}".format(pk_of_user_in_db))) > 0: delete_message = operations.delete_word(numbers=message,pk_of_user_in_db=pk_of_user_in_db) if delete_message == 'Пожалуйста, не используйте буквы, предпочтительно использовать такой формат: \n\n 1, 2, 3': telegram_api_request.ButtonCreate(message_text='Пожалуйста, не используйте буквы, ' + \ 'предпочтительно использовать такой формат: \n\n 1, 2, 3', chat_id=chat_id, texts_of_button=['Добавить новое слово', 'Проверять слова!', 'Внести изменения в словарь']).\ return_button() else: telegram_api_request.ButtonCreate(message_text='Удалено!', chat_id=chat_id, texts_of_button=['Добавить новое слово', 'Проверять слова!', 'Внести изменения в словарь', 'Удалить слова']).\ return_button() else: telegram_api_request.ButtonCreate(message_text='Словарь в данный момент пустой.\n\nНеловко это сообщать, ' + \ 'но сначала следует добавить слова прежде, чем удалять их :) ', chat_id=chat_id, texts_of_button=['Добавить новое слово', 'Проверять слова!', 'Внести изменения в словарь', 'Удалить слова']).\ return_button() elif level == 'modificate word': definition = operations.modificate_word(message, pk_of_user_in_db) if definition == 'Что-то пошло не так. Попробуй, пожалуйста, набрать только номер, без других символов. \ Возможно, в этом дело' \ or definition == 'Что-то пошло не так. Попробуй еще разок именно в формате таком: \n 1. Слово. ': telegram_api_request.ButtonCreate(message_text=definition, chat_id=chat_id, texts_of_button=['']).return_button() else: modificate_level(pk_of_user_in_db, 'modificate definition') telegram_api_request.ButtonCreate(message_text=definition, chat_id=chat_id, texts_of_button=['Добавить новое слово','Удалить слова','Проверять слова!', 'Внести изменения в словарь']).\ return_button() elif level == 'modificate definition': result_of_operation = operations.modificate_definition(message, pk_of_user_in_db) telegram_api_request.ButtonCreate(message_text=result_of_operation, chat_id=chat_id, texts_of_button=['Добавить новое слово','Удалить слова', 'Проверять слова!', 'Внести изменения в словарь']).\ return_button() except Exception as ex: config_file.db_select("SELECT user_level FROM users WHERE telegram_id={}".format(chat_id)) telegram_api_request.ButtonCreate(message_text='Что-то пошло не так. Затруднительно сказать на каком именно этапе произошла ошибка. ' + \ '\n\nПередай информаци Диме, сообщив ошибку., ошибка такая{}'. format(str(ex)), chat_id=chat_id, texts_of_button=['']).\ return_button()
def modificate_word(message: str, pk_of_user_in_db: int) -> str: '''Foo modificate word and status of word''' if (re.search('[a-z]', message)) == None: # if there is no letters in message message = re.sub('[\s]', '', message) # remove spaces message = int(re.sub('[.,]', '', message)) # remove dots and commas try: config_file.db_update( "WITH test AS (SELECT id_in_dynamic, ROW_NUMBER() OVER () \ FROM dynamic_vocab WHERE user_id={}) \ UPDATE dynamic_vocab SET status_of_word_in_dynamic='modif' \ WHERE id_in_dynamic \ IN (SELECT id_in_dynamic FROM test WHERE row_number={} AND user_id={})" .format(pk_of_user_in_db, message, pk_of_user_in_db)) definition_of_word = 'Дефиниция у слова следующая: {}. \nНапиши теперь верную дефиницию.'. \ format(config_file.db_select("SELECT definition_in_dynamic \ FROM dynamic_vocab \ WHERE status_of_word_in_dynamic='modif'" ) \ [0][0]) return (definition_of_word) except: return ( 'Что-то пошло не так. Попробуй, пожалуйста, набрать только номер, без других символов. Возможно, в этом дело' ) else: try: number_and_word = message.rsplit('.', 1) # [0] is number, [1] is word number_and_word[0] = int(re.sub('[\s]', '', number_and_word[0])) config_file.db_update( "WITH test AS (SELECT id_in_dynamic, ROW_NUMBER() OVER ()\ FROM dynamic_vocab \ WHERE user_id={}) \ UPDATE whole_vocab SET word_in_whole='{}' \ WHERE id_in_whole \ IN (SELECT id_in_dynamic \ FROM test WHERE row_number={} \ AND user_id={})".format( pk_of_user_in_db, str(number_and_word[1]), number_and_word[0], pk_of_user_in_db)) config_file.db_update( "WITH test AS (SELECT id_in_dynamic, ROW_NUMBER() OVER () \ FROM dynamic_vocab WHERE user_id={}) \ UPDATE dynamic_vocab SET status_of_word_in_dynamic='modif' \ WHERE id_in_dynamic IN (SELECT id_in_dynamic FROM test \ WHERE row_number={} AND user_id={})".format( pk_of_user_in_db, number_and_word[0], pk_of_user_in_db)) definition_of_word = config_file.db_select( "SELECT definition_in_dynamic \ FROM dynamic_vocab \ WHERE status_of_word_in_dynamic='modif'" ) returning_message=str('Слово изменено. Дефиниция у него такая: ' + str( config_file.db_select("SELECT definition_in_dynamic FROM dynamic_vocab \ WHERE status_of_word_in_dynamic='modif'" )[0][0]) + \ '\nНапиши теперь верную дефиницию для слова. \ Если менять ее не надо, то можешь просто скопировать \ написанную выше, либо вызвать другую команду. ' ) return (returning_message) except: return ( 'Что-то пошло не так. Попробуй еще разок именно в формате таком: \n 1. \ Слово. ' )