From 07e12227ae5e79451c9025cfef848ed012eb107c Mon Sep 17 00:00:00 2001 From: leeroymk Date: Tue, 16 May 2023 16:41:47 +0300 Subject: [PATCH 01/10] try to finish at time --- 1_if1.py | 35 +++++++++++++++++++++++++++-------- 2_if2.py | 44 ++++++++++++++++++++++++++++++++++---------- 3_for.py | 37 ++++++++++++++++++++++++++++--------- 4_while1.py | 30 ++++++++++++++++++++++-------- 5_while2.py | 28 ++++++++++++++++++++-------- 6_exception1.py | 35 +++++++++++++++++++++++++++-------- 7_exception2.py | 21 ++++++++++++++------- 7 files changed, 172 insertions(+), 58 deletions(-) diff --git a/1_if1.py b/1_if1.py index be736084..9f8e1039 100644 --- a/1_if1.py +++ b/1_if1.py @@ -4,22 +4,41 @@ Условный оператор: Возраст -* Попросить пользователя ввести возраст при помощи input и положить +* Попросить пользователя ввести возраст при помощи input и положить результат в переменную -* Написать функцию, которая по возрасту определит, чем должен заниматься пользователь: +* Написать функцию, которая по возрасту определит, чем должен заниматься пользователь: учиться в детском саду, школе, ВУЗе или работать -* Вызвать функцию, передав ей возраст пользователя и положить результат +* Вызвать функцию, передав ей возраст пользователя и положить результат работы функции в переменную * Вывести содержимое переменной на экран """ + def main(): - """ - Эта функция вызывается автоматически при запуске скрипта в консоли - В ней надо заменить pass на ваш код - """ - pass + try: + age: str = input('Please, enter your age: ').strip() + age_processed: int = int(age) + except ValueError: + return print('Please, enter a number. Next time...') + else: + have_to_do(age_processed) + + +def have_to_do(age): + if age > 0: + print(f'So, your age is {age}.') + if age in range(1, 7): + print("Why aren't you in kindergarten?") + elif age in range(7, 18): + print("Why aren't you in school?") + elif age in range(18, 24): + print("Why aren't you in college?") + else: + print("Why aren't you at work?") + else: + print('Enter the correct age. Next time...') + if __name__ == "__main__": main() diff --git a/2_if2.py b/2_if2.py index 0f1644f3..8d8afa86 100644 --- a/2_if2.py +++ b/2_if2.py @@ -5,22 +5,46 @@ Условный оператор: Сравнение строк * Написать функцию, которая принимает на вход две строки -* Проверить, является ли то, что передано функции, строками. +* Проверить, является ли то, что передано функции, строками. Если нет - вернуть 0 * Если строки одинаковые, вернуть 1 * Если строки разные и первая длиннее, вернуть 2 * Если строки разные и вторая строка 'learn', возвращает 3 -* Вызвать функцию несколько раз, передавая ей разные праметры +* Вызвать функцию несколько раз, передавая ей разные параметры и выводя на экран результаты """ -def main(): - """ - Эта функция вызывается автоматически при запуске скрипта в консоли - В ней надо заменить pass на ваш код - """ - pass - + +def main(a=input('Please, enter first value: '), + b=input('Please, enter second value: ')): + + types: str = f'a={a}(type={type(a).__name__}), b={b}(type={type(b).__name__}))' + + if not isinstance(a, str) or not isinstance(b, str): + print('0', types, sep=', ') + else: + if a == b: + print('1', types, sep=', ') + else: + if len(a) > len(b): + print('2', types, sep=', ') + elif b == 'learn': + print('3', types, sep=', ') + else: + print('No such condition', types, sep=', ') + + if __name__ == "__main__": - main() + tests: list = [ + ['123', '123'], # str: equal length + ['1234', '123'], # str: length a > length b + ['123', '1234'], # str: length a < length b + ['123', 'learn'], # str: b == 'learn' + [123, 321], # int: 2 integers + ['123', 123], # int: 1 integer + [1.2, 55.5], # float: 2 floats + ] + + main() # manual input + [main(i[0], i[1]) for i in tests] # tests diff --git a/3_for.py b/3_for.py index 5ca9f504..8f5823f0 100644 --- a/3_for.py +++ b/3_for.py @@ -6,7 +6,7 @@ * Дан список словарей с данными по колличеству проданных телефонов [ - {'product': 'iPhone 12', 'items_sold': [363, 500, 224, 358, 480, 476, 470, 216, 270, 388, 312, 186]}, + {'product': 'iPhone 12', 'items_sold': [363, 500, 224, 358, 480, 476, 470, 216, 270, 388, 312, 186]}, {'product': 'Xiaomi Mi11', 'items_sold': [317, 267, 290, 431, 211, 354, 276, 526, 141, 453, 510, 316]}, {'product': 'Samsung Galaxy 21', 'items_sold': [343, 390, 238, 437, 214, 494, 441, 518, 212, 288, 272, 247]}, ] @@ -16,12 +16,31 @@ * Посчитать и вывести среднее количество продаж всех товаров """ -def main(): - """ - Эта функция вызывается автоматически при запуске скрипта в консоли - В ней надо заменить pass на ваш код - """ - pass - +phones_db: list[dict] = [ + {'product': 'iPhone 12', 'items_sold': [363, 500, 224, 358, 480, 476, 470, 216, 270, 388, 312, 186]}, + {'product': 'Xiaomi Mi11', 'items_sold': [317, 267, 290, 431, 211, 354, 276, 526, 141, 453, 510, 316]}, + {'product': 'Samsung Galaxy 21', 'items_sold': [343, 390, 238, 437, 214, 494, 441, 518, 212, 288, 272, 247]}, + ] + + +def main(phones_db: list[dict]) -> str: + + sales_pcs: int = 0 + total_avg_sales: int = 0 + + for phone in phones_db: + + total_sales_by_brand: int = sum(phone['items_sold']) + avg_sales: int = total_sales_by_brand // len(phone['items_sold']) + sales_pcs += total_sales_by_brand + total_avg_sales += len(phone['items_sold']) + + print(f"{phone['product']} sold: {total_sales_by_brand} pcs.") + print(f"{phone['product']} average month sales: {avg_sales} pcs.") + + print(f'Total sales: {sales_pcs} pcs.') + print(f'Total average sales: {sales_pcs // total_avg_sales} pcs.') + + if __name__ == "__main__": - main() + main(phones_db) diff --git a/4_while1.py b/4_while1.py index b5791517..622d6c8e 100644 --- a/4_while1.py +++ b/4_while1.py @@ -4,18 +4,32 @@ Цикл while: hello_user -* Напишите функцию hello_user(), которая с помощью функции input() спрашивает +* Напишите функцию hello_user(), которая с помощью функции input() спрашивает пользователя “Как дела?”, пока он не ответит “Хорошо” - + """ def hello_user(): - """ - Замените pass на ваш код - """ - pass - -if __name__ == "__main__": + print('Привет! Введите сообщение: ') + + while True: + + inp: str = input().strip().lower() + + if inp == 'пока': + get_answer() + break + elif inp != 'хорошо': + print('Как дела?') + else: + print('Рад за Вас! (но не от всей души, конечно)') + + +def get_answer(): + print('Пока!') + + +if __name__ == '__main__': hello_user() diff --git a/5_while2.py b/5_while2.py index 49012dfd..7bee2f32 100644 --- a/5_while2.py +++ b/5_while2.py @@ -12,16 +12,28 @@ Пользователь: Что делаешь? Программа: Программирую - + """ -questions_and_answers = {} +questions_and_answers: dict = { + 'как дела?': 'Хорошо!', + 'что делаешь?': 'Программирую', + 'как погода?': 'Теплеет', + 'что почитать?': 'Документацию по Python', +} + + +def ask_user(answers_dict: dict) -> str: + + while True: + + inp: str = input('Привет! Введите ваш вопрос: ').strip().lower() + + if inp in questions_and_answers.keys(): + print(questions_and_answers.get(inp)) + else: + print('Не понял вопроса...') + -def ask_user(answers_dict): - """ - Замените pass на ваш код - """ - pass - if __name__ == "__main__": ask_user(questions_and_answers) diff --git a/6_exception1.py b/6_exception1.py index 3ea9d054..959dbf5a 100644 --- a/6_exception1.py +++ b/6_exception1.py @@ -4,17 +4,36 @@ Исключения: KeyboardInterrupt -* Перепишите функцию hello_user() из задания while1, чтобы она - перехватывала KeyboardInterrupt, писала пользователю "Пока!" +* Перепишите функцию hello_user() из задания while1, чтобы она + перехватывала KeyboardInterrupt, писала пользователю "Пока!" и завершала работу при помощи оператора break - + """ + def hello_user(): - """ - Замените pass на ваш код - """ - pass - + + print('Привет! Введите сообщение: ') + + while True: + try: + inp: str = input().strip().lower() + if inp == 'пока': + get_answer() + break + elif inp != 'хорошо': + print('Как дела?') + else: + print('Рад за Вас! (но не от всей души, конечно)\n\nВведите сообщение: ') + continue + except KeyboardInterrupt: + print('\nПока!') + break + + +def get_answer(): + print('Пока!') + + if __name__ == "__main__": hello_user() diff --git a/7_exception2.py b/7_exception2.py index d4bd8a39..e3d01a7f 100644 --- a/7_exception2.py +++ b/7_exception2.py @@ -10,15 +10,22 @@ * Первые два нужно приводить к вещественному числу при помощи float(), а третий - к целому при помощи int() и перехватывать исключения ValueError и TypeError, если приведение типов не сработало. - + """ -def discounted(price, discount, max_discount=20) - """ - Замените pass на ваш код - """ - pass - + +def discounted(price, discount, max_discount=20): + price = abs(price) + discount = abs(discount) + max_discount = abs(max_discount) + if max_discount >= 100: + raise ValueError('Слишком большая максимальная скидка') + if discount >= max_discount: + return price + else: + return price - (price * discount / 100) + + if __name__ == "__main__": print(discounted(100, 2)) print(discounted(100, "3")) From 53571345365dd6697dd5a696b41e6d08c4a4e9f8 Mon Sep 17 00:00:00 2001 From: leeroymk Date: Tue, 16 May 2023 17:01:59 +0300 Subject: [PATCH 02/10] new changes --- 1_if1.py | 17 ----------------- 2_if2.py | 18 ------------------ 3_for.py | 18 ------------------ 4_while1.py | 12 ------------ 5_while2.py | 17 ----------------- 6_exception1.py | 13 ------------- 6 files changed, 95 deletions(-) diff --git a/1_if1.py b/1_if1.py index 9f8e1039..4369cac5 100644 --- a/1_if1.py +++ b/1_if1.py @@ -1,20 +1,3 @@ -""" - -Домашнее задание №1 - -Условный оператор: Возраст - -* Попросить пользователя ввести возраст при помощи input и положить - результат в переменную -* Написать функцию, которая по возрасту определит, чем должен заниматься пользователь: - учиться в детском саду, школе, ВУЗе или работать -* Вызвать функцию, передав ей возраст пользователя и положить результат - работы функции в переменную -* Вывести содержимое переменной на экран - -""" - - def main(): try: age: str = input('Please, enter your age: ').strip() diff --git a/2_if2.py b/2_if2.py index 8d8afa86..55343c4c 100644 --- a/2_if2.py +++ b/2_if2.py @@ -1,21 +1,3 @@ -""" - -Домашнее задание №1 - -Условный оператор: Сравнение строк - -* Написать функцию, которая принимает на вход две строки -* Проверить, является ли то, что передано функции, строками. - Если нет - вернуть 0 -* Если строки одинаковые, вернуть 1 -* Если строки разные и первая длиннее, вернуть 2 -* Если строки разные и вторая строка 'learn', возвращает 3 -* Вызвать функцию несколько раз, передавая ей разные параметры - и выводя на экран результаты - -""" - - def main(a=input('Please, enter first value: '), b=input('Please, enter second value: ')): diff --git a/3_for.py b/3_for.py index 8f5823f0..80b7936e 100644 --- a/3_for.py +++ b/3_for.py @@ -1,21 +1,3 @@ -""" - -Домашнее задание №1 - -Цикл for: Продажи товаров - -* Дан список словарей с данными по колличеству проданных телефонов - [ - {'product': 'iPhone 12', 'items_sold': [363, 500, 224, 358, 480, 476, 470, 216, 270, 388, 312, 186]}, - {'product': 'Xiaomi Mi11', 'items_sold': [317, 267, 290, 431, 211, 354, 276, 526, 141, 453, 510, 316]}, - {'product': 'Samsung Galaxy 21', 'items_sold': [343, 390, 238, 437, 214, 494, 441, 518, 212, 288, 272, 247]}, - ] -* Посчитать и вывести суммарное количество продаж для каждого товара -* Посчитать и вывести среднее количество продаж для каждого товара -* Посчитать и вывести суммарное количество продаж всех товаров -* Посчитать и вывести среднее количество продаж всех товаров -""" - phones_db: list[dict] = [ {'product': 'iPhone 12', 'items_sold': [363, 500, 224, 358, 480, 476, 470, 216, 270, 388, 312, 186]}, {'product': 'Xiaomi Mi11', 'items_sold': [317, 267, 290, 431, 211, 354, 276, 526, 141, 453, 510, 316]}, diff --git a/4_while1.py b/4_while1.py index 622d6c8e..c46d97af 100644 --- a/4_while1.py +++ b/4_while1.py @@ -1,15 +1,3 @@ -""" - -Домашнее задание №1 - -Цикл while: hello_user - -* Напишите функцию hello_user(), которая с помощью функции input() спрашивает - пользователя “Как дела?”, пока он не ответит “Хорошо” - -""" - - def hello_user(): print('Привет! Введите сообщение: ') diff --git a/5_while2.py b/5_while2.py index 7bee2f32..1ed9c963 100644 --- a/5_while2.py +++ b/5_while2.py @@ -1,20 +1,3 @@ -""" - -Домашнее задание №1 - -Цикл while: ask_user со словарём - -* Создайте словарь типа "вопрос": "ответ", например: - {"Как дела": "Хорошо!", "Что делаешь?": "Программирую"} и так далее -* Напишите функцию ask_user() которая с помощью функции input() - просит пользователя ввести вопрос, а затем, если вопрос есть - в словаре, программа давала ему соотвествующий ответ. Например: - - Пользователь: Что делаешь? - Программа: Программирую - -""" - questions_and_answers: dict = { 'как дела?': 'Хорошо!', 'что делаешь?': 'Программирую', diff --git a/6_exception1.py b/6_exception1.py index 959dbf5a..f17f3741 100644 --- a/6_exception1.py +++ b/6_exception1.py @@ -1,16 +1,3 @@ -""" - -Домашнее задание №1 - -Исключения: KeyboardInterrupt - -* Перепишите функцию hello_user() из задания while1, чтобы она - перехватывала KeyboardInterrupt, писала пользователю "Пока!" - и завершала работу при помощи оператора break - -""" - - def hello_user(): print('Привет! Введите сообщение: ') From 35ebc24e4b75709cbb5c09b16e440e9e10bc9c20 Mon Sep 17 00:00:00 2001 From: leeroymk Date: Tue, 16 May 2023 18:48:10 +0300 Subject: [PATCH 03/10] new changes --- 7_exception2.py | 37 +++++++++++++------------------------ 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/7_exception2.py b/7_exception2.py index e3d01a7f..eef69720 100644 --- a/7_exception2.py +++ b/7_exception2.py @@ -1,29 +1,18 @@ -""" - -Домашнее задание №1 - -Исключения: приведение типов - -* Перепишите функцию discounted(price, discount, max_discount=20) - из урока про функции так, чтобы она перехватывала исключения, - когда переданы некорректные аргументы. -* Первые два нужно приводить к вещественному числу при помощи float(), - а третий - к целому при помощи int() и перехватывать исключения - ValueError и TypeError, если приведение типов не сработало. - -""" - - def discounted(price, discount, max_discount=20): - price = abs(price) - discount = abs(discount) - max_discount = abs(max_discount) - if max_discount >= 100: - raise ValueError('Слишком большая максимальная скидка') - if discount >= max_discount: - return price + + try: + price = abs(float(price)) + discount = abs(float(discount)) + max_discount = abs(int(max_discount)) + except ValueError or TypeError: + return 'Неверное значение!' else: - return price - (price * discount / 100) + if max_discount >= 100: + raise ValueError('Слишком большая максимальная скидка') + if discount >= max_discount: + return price + else: + return price - (price * discount / 100) if __name__ == "__main__": From 46b657441d4235b2bb4ec961d6cd633c5403d92c Mon Sep 17 00:00:00 2001 From: leeroymk Date: Wed, 17 May 2023 09:29:51 +0300 Subject: [PATCH 04/10] finished homework --- .gitignore | 125 ++--------------------------------------------- 8_ephem_bot.py | 73 ++++++++++++++++++--------- requirements.txt | Bin 0 -> 626 bytes 3 files changed, 54 insertions(+), 144 deletions(-) create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore index af6d5026..9970644c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,123 +1,6 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -pip-wheel-metadata/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -.hypothesis/ -.pytest_cache/ - -# Translations -*.mo -*.pot - -# Django stuff: +settings.py *.log -local_settings.py -db.sqlite3 - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -.python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# celery beat schedule file -celerybeat-schedule - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ +.vscode +.idea venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ +__pycache__/ \ No newline at end of file diff --git a/8_ephem_bot.py b/8_ephem_bot.py index 1cf9ea19..4f34fbca 100644 --- a/8_ephem_bot.py +++ b/8_ephem_bot.py @@ -1,33 +1,23 @@ -""" -Домашнее задание №1 - -Использование библиотек: ephem - -* Установите модуль ephem -* Добавьте в бота команду /planet, которая будет принимать на вход - название планеты на английском, например /planet Mars -* В функции-обработчике команды из update.message.text получите - название планеты (подсказка: используйте .split()) -* При помощи условного оператора if и ephem.constellation научите - бота отвечать, в каком созвездии сегодня находится планета. - -""" import logging +import ephem +import settings from telegram.ext import Updater, CommandHandler, MessageHandler, Filters +from datetime import datetime + logging.basicConfig(format='%(name)s - %(levelname)s - %(message)s', level=logging.INFO, filename='bot.log') -PROXY = { - 'proxy_url': 'socks5://t1.learn.python.ru:1080', - 'urllib3_proxy_kwargs': { - 'username': 'learn', - 'password': 'python' - } -} +# PROXY = { +# 'proxy_url': settings.PROXY_URL', +# 'urllib3_proxy_kwargs': { +# 'username': settings.PROXY_USERNAME, +# 'password': settings.PROXY_PASSWORD +# } +# } def greet_user(update, context): @@ -39,19 +29,56 @@ def greet_user(update, context): def talk_to_me(update, context): user_text = update.message.text print(user_text) - update.message.reply_text(text) + update.message.reply_text(user_text) + + +def constel(update, context): + + planet_key: str = update.message.text.lower().split()[-1] + + planets: dict = { + 'mercury': ephem.Mercury, + 'venus': ephem.Venus, + 'moon': ephem.Moon, + 'mars': ephem.Mars, + 'jupiter': ephem.Jupiter, + 'saturn': ephem.Saturn, + 'uranus': ephem.Uranus, + 'neptune': ephem.Neptune, + 'pluto': ephem.Pluto, + 'меркурий': ephem.Mercury, + 'венера': ephem.Venus, + 'луна': ephem.Moon, + 'марс': ephem.Mars, + 'юпитер': ephem.Jupiter, + 'сатурн': ephem.Saturn, + 'уран': ephem.Uranus, + 'нептун': ephem.Neptune, + 'плутон': ephem.Pluto, + } + + print('Вызван /planet') + position = planets[planet_key](datetime.today().strftime('%Y/%m/%d')) + const = ephem.constellation(position)[1] + update.message.reply_text(f'{planet_key.title()} is in {const} today.') def main(): - mybot = Updater("КЛЮЧ, КОТОРЫЙ НАМ ВЫДАЛ BotFather", request_kwargs=PROXY, use_context=True) + mybot = Updater( + settings.API_KEY, + # request_kwargs=PROXY, + use_context=True) dp = mybot.dispatcher dp.add_handler(CommandHandler("start", greet_user)) + dp.add_handler(CommandHandler("planet", constel)) dp.add_handler(MessageHandler(Filters.text, talk_to_me)) + logging.info('Бот запущен') mybot.start_polling() mybot.idle() if __name__ == "__main__": + print('Бот запущен!') main() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..f9aae6ee377d28f9897840a682eec439cade5aaf GIT binary patch literal 626 zcmZWnQBH$E6r67pk7C2pYQOyO22FYb1hho#lCmbs;nkV<7C{Z!lrZz=&CK@ev%(o4 z=n!$wXNwK)cuHL33J*Boh#DufXz+%fzn5RUt?_D9nU$y$$s3KeGo@Lrw&}!OPdwUI zqTtcaTb{jXoe=m4E%+@!8bwAD5(aLHbkVLj`+uDGAGBO4bWCxk*E#9VbPvpbq-Kqm z>^qnnZC48e@x%@yXK(n{S`W|kP~nwd9*HE=43J64hEvg;g zGjd}`{iO-@upu|nWy+n5 Date: Thu, 18 May 2023 15:07:49 +0300 Subject: [PATCH 05/10] added sun option --- 8_ephem_bot.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/8_ephem_bot.py b/8_ephem_bot.py index 4f34fbca..8c3cc149 100644 --- a/8_ephem_bot.py +++ b/8_ephem_bot.py @@ -40,6 +40,7 @@ def constel(update, context): 'mercury': ephem.Mercury, 'venus': ephem.Venus, 'moon': ephem.Moon, + 'sun': ephem.Sun, 'mars': ephem.Mars, 'jupiter': ephem.Jupiter, 'saturn': ephem.Saturn, @@ -49,6 +50,7 @@ def constel(update, context): 'меркурий': ephem.Mercury, 'венера': ephem.Venus, 'луна': ephem.Moon, + 'солнце': ephem.Sun, 'марс': ephem.Mars, 'юпитер': ephem.Jupiter, 'сатурн': ephem.Saturn, From cc0395e18842aeb5a75fadc3b498a204cadd571c Mon Sep 17 00:00:00 2001 From: leeroymk Date: Tue, 23 May 2023 21:57:45 +0300 Subject: [PATCH 06/10] add typehintings --- 7_exception2.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/7_exception2.py b/7_exception2.py index eef69720..20f249bc 100644 --- a/7_exception2.py +++ b/7_exception2.py @@ -1,9 +1,9 @@ -def discounted(price, discount, max_discount=20): +def discounted(price: int | str, discount: int | str, max_discount: int | str =20) -> float: try: - price = abs(float(price)) - discount = abs(float(discount)) - max_discount = abs(int(max_discount)) + price: float = abs(float(price)) + discount: float = abs(float(discount)) + max_discount: int = abs(int(max_discount)) except ValueError or TypeError: return 'Неверное значение!' else: From 19b2402d6c745d65b2171c08e713acf3ca8dfe88 Mon Sep 17 00:00:00 2001 From: leeroymk Date: Fri, 26 May 2023 12:05:03 +0300 Subject: [PATCH 07/10] fixed 3, bot with nfm done --- 8_ephem_bot.py | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/8_ephem_bot.py b/8_ephem_bot.py index 8c3cc149..60c596fd 100644 --- a/8_ephem_bot.py +++ b/8_ephem_bot.py @@ -1,4 +1,5 @@ import logging +import string import ephem import settings @@ -21,15 +22,11 @@ def greet_user(update, context): - text = 'Вызван /start' - print(text) - update.message.reply_text(text) + update.message.reply_text('Вызван /start') def talk_to_me(update, context): - user_text = update.message.text - print(user_text) - update.message.reply_text(user_text) + update.message.reply_text(update.message.text) def constel(update, context): @@ -59,12 +56,34 @@ def constel(update, context): 'плутон': ephem.Pluto, } - print('Вызван /planet') position = planets[planet_key](datetime.today().strftime('%Y/%m/%d')) const = ephem.constellation(position)[1] update.message.reply_text(f'{planet_key.title()} is in {const} today.') +def word_counter(update, context): + + res: str = '' + + for i in update.message.text: + if i in string.punctuation: + res += ' ' + else: + res += i + + message_length: int = len(res.split()) - 1 + + if message_length < 1: + update.message.reply_text("Недостаточно слов для подсчета, введите текст: ") + else: + if message_length in range(11, 21) or str(message_length)[-1] in '056789': + update.message.reply_text(f"{message_length} слов") + elif str(message_length)[-1] == '1': + update.message.reply_text(f"{message_length} слово") + else: + update.message.reply_text(f"{message_length} слова") + + def main(): mybot = Updater( settings.API_KEY, @@ -74,6 +93,7 @@ def main(): dp = mybot.dispatcher dp.add_handler(CommandHandler("start", greet_user)) dp.add_handler(CommandHandler("planet", constel)) + dp.add_handler(CommandHandler("wordcount", word_counter)) dp.add_handler(MessageHandler(Filters.text, talk_to_me)) logging.info('Бот запущен') From d7ae925b08b876a54353a3689dd7c3b8bf35d6c3 Mon Sep 17 00:00:00 2001 From: leeroymk Date: Fri, 26 May 2023 12:08:59 +0300 Subject: [PATCH 08/10] nfm and wordcounter added --- 3_for.py | 5 +++-- 8_ephem_bot.py | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/3_for.py b/3_for.py index 80b7936e..fb4a81b4 100644 --- a/3_for.py +++ b/3_for.py @@ -20,8 +20,9 @@ def main(phones_db: list[dict]) -> str: print(f"{phone['product']} sold: {total_sales_by_brand} pcs.") print(f"{phone['product']} average month sales: {avg_sales} pcs.") - print(f'Total sales: {sales_pcs} pcs.') - print(f'Total average sales: {sales_pcs // total_avg_sales} pcs.') + res1: str = f'Total sales: {sales_pcs} pcs.' + res2: str = f'Total average sales: {sales_pcs // total_avg_sales} pcs.' + return print(res1, res2, sep='\n') if __name__ == "__main__": diff --git a/8_ephem_bot.py b/8_ephem_bot.py index 60c596fd..8778ea31 100644 --- a/8_ephem_bot.py +++ b/8_ephem_bot.py @@ -2,9 +2,10 @@ import string import ephem import settings +import random from telegram.ext import Updater, CommandHandler, MessageHandler, Filters -from datetime import datetime +from datetime import datetime, date logging.basicConfig(format='%(name)s - %(levelname)s - %(message)s', @@ -84,6 +85,49 @@ def word_counter(update, context): update.message.reply_text(f"{message_length} слова") +def next_full_moon(update, context): + user_text: str = ' '.join(update.message.text.strip().split()[1:]) + if user_text == '': + nfm = ephem.next_full_moon(datetime.today()) + update.message.reply_text(f"Ближайшее полнолуние {nfm}") + else: + try: + date_moon: datetime.date = date.fromisoformat(user_text) + nfm: ephem.Date = ephem.next_full_moon(date_moon) + update.message.reply_text(f"Ближайшее полнолуние от даты {date_moon} - {nfm}") + except ValueError as ve: + print(ve) + update.message.reply_text(f"Введите дату в формате ГГГГ-ММ-ДД") + + +def city_game(update, context): + user_text: str = ' '.join(update.message.text.lower().strip().split()[1:]) + game_lst: list = [ + 'абаза', 'абакан', 'абдулино', 'абинск', 'агидель', 'агрыз', 'адыгейск', 'азнакаево', 'азов', 'ак-довурак', 'аксай', 'алагир', 'алапаевск', 'алатырь', 'алдан', 'алейск', 'александров', 'александровск', 'александровск-сахалинский', 'алексеевка', 'алексин', 'алзамай', 'алупка', 'алушта', 'альметьевск', 'амурск', 'анадырь', 'анапа', 'ангарск', 'андреаполь', 'анжеро-судженск', 'анива', 'апатиты', 'апрелевка', 'апшеронск', 'арамиль', 'аргун', 'ардатов', 'ардон', 'арзамас', 'аркадак', 'армавир', 'армянск', 'арсеньев', 'арск', 'артём', 'артёмовск', 'артёмовский', 'архангельск', 'асбест', 'асино', 'астрахань', 'аткарск', 'ахтубинск', 'ачинск', 'аша', 'бабаево', 'бабушкин', 'бавлы', 'багратионовск', 'байкальск', 'баймак', 'бакал', 'баксан', 'балабаново', 'балаково', 'балахна', 'балашиха', 'балашов', 'балей', 'балтийск', 'барабинск', 'барнаул', 'барыш', 'батайск', 'бахчисарай', 'бежецк', 'белая калитва', 'белая холуница', 'белгород', 'белебей', 'белинский', 'белово', 'белогорск', 'белозерск', 'белокуриха', 'беломорск', 'белорецк', 'белореченск', 'белоусово', 'белоярский', 'белый', 'белёв', 'бердск', 'березники', 'берёзовский', 'беслан', 'бийск', 'бикин', 'билибино', 'биробиджан', 'бирск', 'бирюсинск', 'бирюч', 'благовещенск', 'благодарный', 'бобров', 'богданович', 'богородицк', 'богородск', 'боготол', 'богучар', 'бодайбо', 'бокситогорск', 'болгар', 'бологое', 'болотное', 'болохово', 'болхов', 'большой камень', 'бор', 'борзя', 'борисоглебск', 'боровичи', 'боровск', 'бородино', 'братск', 'бронницы', 'брянск', 'бугульма', 'бугуруслан', 'будённовск', 'бузулук', 'буинск', 'буй', 'буйнакск', 'бутурлиновка', 'валдай', 'валуйки', 'велиж', 'великие луки', 'великий новгород', 'великий устюг', 'вельск', 'венёв', 'верещагино', 'верея', 'верхнеуральск', 'верхний тагил', 'верхний уфалей', 'верхняя пышма', 'верхняя салда', 'верхняя тура', 'верхотурье', 'верхоянск', 'весьегонск', 'ветлуга', 'видное', 'вилюйск', 'вилючинск', 'вихоревка', 'вичуга', 'владивосток', 'владикавказ', 'владимир', 'волгоград', 'волгодонск', 'волгореченск', 'волжск', 'волжский', 'вологда', 'володарск', 'волоколамск', 'волосово', 'волхов', 'волчанск', 'вольск', 'воркута', 'воронеж', 'ворсма', 'воскресенск', 'воткинск', 'всеволожск', 'вуктыл', 'выборг', 'выкса', 'высоковск', 'высоцк', 'вытегра', 'вышний волочёк', 'вяземский', 'вязники', 'вязьма', 'вятские поляны', 'гаврилов посад', 'гаврилов-ям', 'гагарин', 'гаджиево', 'гай', + 'галич', 'гатчина', 'гвардейск', 'гдов', 'геленджик', 'георгиевск', 'глазов', 'голицыно', 'горбатов', 'горно-алтайск', 'горнозаводск', 'горняк', 'городец', 'городище', 'городовиковск', 'гороховец', 'горячий ключ', 'грайворон', 'гремячинск', 'грозный', 'грязи', 'грязовец', 'губаха', 'губкин', 'губкинский', 'гудермес', 'гуково', 'гулькевичи', 'гурьевск', 'гусев', 'гусиноозёрск', 'гусь-хрустальный', 'давлеканово', 'дагестанские огни', 'далматово', 'дальнегорск', 'дальнереченск', 'данилов', 'данков', 'дегтярск', 'дедовск', 'демидов', 'дербент', 'десногорск', 'джанкой', 'дзержинск', 'дзержинский', 'дивногорск', 'дигора', 'димитровград', 'дмитриев', 'дмитров', 'дмитровск', 'дно', 'добрянка', 'долгопрудный', 'долинск', 'домодедово', 'донецк', 'донской', 'дорогобуж', 'дрезна', 'дубна', 'дубовка', 'дудинка', 'духовщина', 'дюртюли', 'дятьково', 'евпатория', 'егорьевск', 'ейск', 'екатеринбург', 'елабуга', 'елец', 'елизово', 'ельня', 'еманжелинск', 'емва', 'енисейск', 'ермолино', 'ершов', 'ессентуки', 'ефремов', 'железноводск', 'железногорск', 'железногорск-илимский', 'жердевка', 'жигулёвск', 'жиздра', 'жирновск', 'жуков', 'жуковка', 'жуковский', 'завитинск', 'заводоуковск', 'заволжск', 'заволжье', 'задонск', 'заинск', 'закаменск', 'заозёрный', 'заозёрск', + 'западная двина', 'заполярный', 'зарайск', 'заречный', 'заринск', 'звенигово', 'звенигород', 'зверево', 'зеленогорск', 'зеленоградск', 'зеленодольск', 'зеленокумск', 'зерноград', 'зея', 'зима', 'златоуст', 'злынка', 'змеиногорск', 'знаменск', 'зубцов', 'зуевка', 'ивангород', 'иваново', 'ивантеевка', 'ивдель', 'игарка', 'ижевск', 'избербаш', 'изобильный', 'иланский', 'инза', 'инкерман', 'иннополис', 'инсар', 'инта', 'ипатово', 'ирбит', 'иркутск', 'исилькуль', 'искитим', 'истра', 'ишим', 'ишимбай', 'йошкар-ола', 'кадников', 'казань', 'калач', 'калач-на-дону', 'калачинск', 'калининград', 'калининск', 'калтан', 'калуга', 'калязин', 'камбарка', 'каменка', 'каменногорск', 'каменск-уральский', 'каменск-шахтинский', 'камень-на-оби', 'камешково', 'камызяк', 'камышин', 'камышлов', 'канаш', 'кандалакша', + 'канск', 'карабаново', 'карабаш', 'карабулак', 'карасук', 'карачаевск', 'карачев', 'каргат', 'каргополь', 'карпинск', 'карталы', 'касимов', 'касли', 'каспийск', 'катав-ивановск', 'катайск', 'качканар', 'кашин', 'кашира', 'кедровый', 'кемерово', 'кемь', 'керчь', 'кизел', 'кизилюрт', 'кизляр', 'кимовск', 'кимры', 'кингисепп', 'кинель', 'кинешма', 'киреевск', 'киренск', 'киржач', 'кириллов', 'кириши', 'киров', 'кировград', 'кирово-чепецк', 'кировск', 'кирс', + 'кирсанов', 'киселёвск', 'кисловодск', 'клин', 'клинцы', 'княгинино', 'ковдор', 'ковров', 'ковылкино', 'когалым', 'кодинск', 'козельск', 'козловка', 'козьмодемьянск', 'кола', 'кологрив', 'коломна', 'колпашево', 'кольчугино', 'коммунар', 'комсомольск', 'комсомольск-на-амуре', 'конаково', 'кондопога', 'кондрово', 'константиновск', 'копейск', 'кораблино', 'кореновск', 'коркино', 'королёв', 'короча', 'корсаков', 'коряжма', 'костерёво', 'костомукша', 'кострома', 'котельники', 'котельниково', 'котельнич', 'котлас', 'котово', 'котовск', 'кохма', 'красавино', 'красноармейск', + 'красновишерск', 'красногорск', 'краснодар', 'краснозаводск', 'краснознаменск', 'краснокаменск', 'краснокамск', 'красноперекопск', 'краснослободск', 'краснотурьинск', 'красноуральск', 'красноуфимск', 'красноярск', 'красный кут', 'красный сулин', 'красный холм', 'кремёнки', 'кропоткин', 'крымск', 'кстово', 'кубинка', 'кувандык', 'кувшиново', 'кудымкар', 'кузнецк', 'куйбышев', 'кулебаки', 'кумертау', 'кунгур', 'купино', 'курган', 'курганинск', 'курильск', 'курлово', 'куровское', 'курск', 'куртамыш', 'курчатов', 'куса', 'кушва', 'кызыл', 'кыштым', 'кяхта', 'лабинск', 'лабытнанги', 'лагань', 'ладушкин', 'лаишево', 'лакинск', 'лангепас', 'лахденпохья', 'лебедянь', 'лениногорск', 'ленинск', 'ленинск-кузнецкий', 'ленск', 'лермонтов', 'лесной', 'лесозаводск', 'лесосибирск', 'ливны', 'ликино-дулёво', 'липецк', 'липки', 'лиски', 'лихославль', 'лобня', 'лодейное поле', 'лосино-петровский', 'луга', 'луза', 'лукоянов', + 'луховицы', 'лысково', 'лысьва', 'лыткарино', 'льгов', 'любань', 'люберцы', 'любим', 'людиново', 'лянтор', 'магадан', 'магас', 'магнитогорск', 'майкоп', 'майский', 'макаров', 'макарьев', 'макушино', 'малая вишера', 'малгобек', 'малмыж', 'малоархангельск', 'малоярославец', 'мамадыш', 'мамоново', 'мантурово', 'мариинск', 'мариинский посад', 'маркс', 'махачкала', 'мглин', 'мегион', 'медвежьегорск', 'медногорск', 'медынь', 'межгорье', 'междуреченск', 'мезень', 'меленки', 'мелеуз', 'менделеевск', 'мензелинск', 'мещовск', 'миасс', 'микунь', 'миллерово', 'минеральные воды', 'минусинск', 'миньяр', 'мирный', 'михайлов', 'михайловка', 'михайловск', 'мичуринск', 'могоча', 'можайск', 'можга', + 'моздок', 'мончегорск', 'морозовск', 'моршанск', 'мосальск', 'муравленко', 'мураши', 'мурманск', 'муром', 'мценск', 'мыски', 'мытищи', 'мышкин', 'набережные челны', 'навашино', 'наволоки', 'надым', 'назарово', 'назрань', 'называевск', 'нальчик', 'нариманов', 'наро-фоминск', 'нарткала', 'нарьян-мар', 'находка', 'невель', 'невельск', 'невинномысск', 'невьянск', 'нелидово', 'неман', 'нерехта', 'нерчинск', 'нерюнгри', 'нестеров', 'нефтегорск', 'нефтекамск', 'нефтекумск', 'нефтеюганск', 'нея', 'нижневартовск', 'нижнекамск', 'нижнеудинск', 'нижние серги', 'нижний ломов', 'нижний новгород', 'нижний тагил', 'нижняя салда', 'нижняя тура', 'николаевск', 'николаевск-на-амуре', 'никольск', 'никольское', 'новая ладога', 'новая ляля', 'новоалександровск', 'новоалтайск', 'новоаннинский', 'нововоронеж', 'новодвинск', 'новозыбков', 'новокубанск', 'новокузнецк', 'новокуйбышевск', 'новомичуринск', 'новомосковск', 'новопавловск', 'новоржев', 'новороссийск', 'новосибирск', 'новосиль', 'новосокольники', 'новотроицк', 'новоузенск', 'новоульяновск', 'новоуральск', 'новохопёрск', 'новочебоксарск', 'новочеркасск', 'новошахтинск', 'новый оскол', 'новый уренгой', 'ногинск', 'нолинск', 'норильск', 'ноябрьск', 'нурлат', 'нытва', 'нюрба', 'нягань', 'нязепетровск', 'няндома', + 'облучье', 'обнинск', 'обоянь', 'обь', 'одинцово', 'озёрск', 'озёры', 'октябрьск', 'октябрьский', 'окуловка', 'оленегорск', 'олонец', 'олёкминск', 'омск', 'омутнинск', 'онега', 'опочка', 'оренбург', 'орехово-зуево', 'орлов', 'орск', 'орёл', 'оса', 'осинники', 'осташков', 'остров', 'островной', 'острогожск', 'отрадное', 'отрадный', 'оха', 'оханск', 'очёр', 'павлово', 'павловск', 'павловский посад', 'палласовка', 'партизанск', 'певек', 'пенза', 'первомайск', 'первоуральск', 'перевоз', 'пересвет', 'переславль-залесский', 'пермь', 'пестово', 'петров вал', 'петровск', 'петровск-забайкальский', 'петрозаводск', 'петропавловск-камчатский', 'петухово', 'петушки', 'печора', 'печоры', 'пикалёво', 'пионерский', 'питкяранта', 'плавск', 'пласт', 'плёс', 'поворино', 'подольск', 'подпорожье', 'покачи', 'покров', 'покровск', 'полевской', 'полесск', 'полысаево', 'полярные зори', 'полярный', 'поронайск', 'порхов', 'похвистнево', 'почеп', 'починок', 'пошехонье', 'правдинск', 'приволжск', 'приморск', 'приморско-ахтарск', 'приозерск', 'прокопьевск', 'пролетарск', 'протвино', 'прохладный', 'псков', 'пугачёв', 'пудож', 'пустошка', 'пучеж', 'пушкино', 'пущино', 'пыталово', 'пыть-ях', 'пятигорск', 'радужный', 'райчихинск', 'раменское', 'рассказово', 'ревда', 'реж', 'реутов', 'ржев', 'родники', 'рославль', 'россошь', 'ростов', 'ростов-на-дону', 'рошаль', 'ртищево', 'рубцовск', 'рудня', 'руза', 'рузаевка', 'рыбинск', 'рыбное', 'рыльск', 'ряжск', 'рязань', 'саки', 'салават', 'салаир', 'салехард', 'сальск', 'самара', 'санкт-петербург', 'саранск', 'сарапул', 'саратов', 'саров', 'сасово', 'сатка', 'сафоново', 'саяногорск', 'саянск', 'светлогорск', 'светлоград', 'светлый', 'светогорск', 'свирск', 'свободный', 'себеж', 'севастополь', 'северо-курильск', 'северобайкальск', 'северодвинск', 'североморск', 'североуральск', 'северск', 'севск', 'сегежа', 'сельцо', 'семикаракорск', 'семилуки', 'семёнов', 'сенгилей', 'серафимович', 'сергач', 'сергиев посад', 'сердобск', 'серов', 'серпухов', 'сертолово', 'сибай', 'сим', 'симферополь', 'сковородино', 'скопин', 'славгород', 'славск', 'славянск-на-кубани', 'сланцы', 'слободской', 'слюдянка', 'смоленск', 'снежинск', 'снежногорск', 'собинка', 'советск', 'советская гавань', 'советский', 'сокол', 'солигалич', 'соликамск', 'солнечногорск', 'соль-илецк', 'сольвычегодск', 'сольцы', 'сорочинск', 'сорск', 'сортавала', 'сосенский', 'сосновка', 'сосновоборск', 'сосновый бор', 'сосногорск', 'сочи', 'спас-деменск', 'спас-клепики', 'спасск', 'спасск-дальний', 'спасск-рязанский', 'среднеколымск', 'среднеуральск', 'сретенск', 'ставрополь', 'старая купавна', 'старая русса', 'старица', 'стародуб', 'старый крым', 'старый оскол', 'стерлитамак', 'стрежевой', 'строитель', 'струнино', 'ступино', 'суворов', 'судак', 'суджа', 'судогда', 'суздаль', 'суоярви', 'сураж', 'сургут', 'суровикино', 'сурск', 'сусуман', 'сухиничи', 'сухой лог', 'сызрань', 'сыктывкар', 'сысерть', 'сычёвка', 'сясьстрой', 'тавда', 'таганрог', 'тайга', 'тайшет', 'талдом', 'тамбов', 'тара', 'тарко-сале', 'таруса', 'татарск', 'таштагол', 'тверь', 'теберда', 'тейково', 'темников', 'темрюк', 'терек', 'тетюши', 'тимашёвск', 'тихвин', 'тихорецк', 'тобольск', 'тогучин', 'тольятти', 'томари', 'томмот', 'томск', 'топки', + 'торжок', 'торопец', 'тосно', 'тотьма', 'троицк', 'трубчевск', 'трёхгорный', 'туапсе', 'туймазы', 'тула', 'тулун', + 'туран', 'туринск', 'тутаев', 'тында', 'тырныауз', 'тюкалинск', 'тюмень', 'уварово', 'углегорск', 'углич', 'удачный', 'удомля', 'ужур', 'узловая', 'улан-удэ', 'ульяновск', 'унеча', 'урай', 'урень', 'уржум', 'урус-мартан', 'урюпинск', 'усинск', 'усмань', 'усолье', 'усолье-сибирское', 'уссурийск', 'усть-джегута', 'усть-илимск', 'усть-катав', 'усть-кут', 'усть-лабинск', 'устюжна', 'уфа', 'ухта', 'учалы', 'уяр', 'фатеж', 'феодосия', 'фокино', 'фролово', 'фрязино', 'фурманов', 'хабаровск', 'хадыженск', 'ханты-мансийск', 'харабали', 'харовск', 'хасавюрт', 'хвалынск', 'хилок', 'химки', 'холм', 'холмск', 'хотьково', 'цивильск', 'цимлянск', 'циолковский', 'чадан', 'чайковский', 'чапаевск', + 'чаплыгин', 'чебаркуль', 'чебоксары', 'чегем', 'чекалин', 'челябинск', 'чердынь', 'черемхово', 'черепаново', 'череповец', 'черкесск', 'черноголовка', 'черногорск', 'чернушка', 'черняховск', 'чехов', 'чистополь', 'чита', 'чкаловск', 'чудово', 'чулым', 'чусовой', 'чухлома', 'чёрмоз', 'шагонар', 'шадринск', 'шали', 'шарыпово', 'шарья', 'шатура', + 'шахты', 'шахтёрск', 'шахунья', 'шацк', 'шебекино', 'шелехов', 'шенкурск', 'шилка', 'шимановск', 'шиханы', 'шлиссельбург', 'шумерля', 'шумиха', 'шуя', 'щигры', 'щучье', 'щёкино', 'щёлкино', 'щёлково', 'электрогорск', 'электросталь', 'электроугли', 'элиста', 'энгельс', 'эртиль', 'югорск', 'южа', 'южно-сахалинск', 'южно-сухокумск', 'южноуральск', 'юрга', 'юрьев-польский', 'юрьевец', 'юрюзань', 'юхнов', 'ядрин', 'якутск', 'ялта', 'ялуторовск', 'янаул', 'яранск', 'яровое', 'ярославль', 'ярцево', 'ясногорск', 'ясный', 'яхрома'] + + if user_text not in game_lst: + update.message.reply_text(f'Нет такого города в нашем списке!') + else: + next_turn_letter: str = user_text[-1] + game_lst.remove(user_text) + answer: list = [i for i in game_lst if i.startswith(next_turn_letter)] + chosen_city: str = random.choice(answer) + update.message.reply_text(f'{next_turn_letter}, {chosen_city.title()}, ваш ход') + game_lst.remove(chosen_city) + + def main(): mybot = Updater( settings.API_KEY, @@ -94,6 +138,8 @@ def main(): dp.add_handler(CommandHandler("start", greet_user)) dp.add_handler(CommandHandler("planet", constel)) dp.add_handler(CommandHandler("wordcount", word_counter)) + dp.add_handler(CommandHandler("nfm", next_full_moon)) + dp.add_handler(CommandHandler("cities", city_game)) dp.add_handler(MessageHandler(Filters.text, talk_to_me)) logging.info('Бот запущен') From 885b10ff6eb11da4a2d46fca7dee8be4a03022ea Mon Sep 17 00:00:00 2001 From: leeroymk Date: Sat, 27 May 2023 14:32:30 +0300 Subject: [PATCH 09/10] added calc, minor fixes --- 8_ephem_bot.py | 101 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 80 insertions(+), 21 deletions(-) diff --git a/8_ephem_bot.py b/8_ephem_bot.py index 8778ea31..4a52f3db 100644 --- a/8_ephem_bot.py +++ b/8_ephem_bot.py @@ -94,40 +94,98 @@ def next_full_moon(update, context): try: date_moon: datetime.date = date.fromisoformat(user_text) nfm: ephem.Date = ephem.next_full_moon(date_moon) - update.message.reply_text(f"Ближайшее полнолуние от даты {date_moon} - {nfm}") + answer: str = f"Ближайшее полнолуние от даты {date_moon} - {nfm}" + except ValueError as ve: print(ve) - update.message.reply_text(f"Введите дату в формате ГГГГ-ММ-ДД") + answer: str = f"Введите дату в формате ГГГГ-ММ-ДД" + return update.message.reply_text(answer) def city_game(update, context): - user_text: str = ' '.join(update.message.text.lower().strip().split()[1:]) + user_text: str = update.message.text[8:].strip().lower() game_lst: list = [ - 'абаза', 'абакан', 'абдулино', 'абинск', 'агидель', 'агрыз', 'адыгейск', 'азнакаево', 'азов', 'ак-довурак', 'аксай', 'алагир', 'алапаевск', 'алатырь', 'алдан', 'алейск', 'александров', 'александровск', 'александровск-сахалинский', 'алексеевка', 'алексин', 'алзамай', 'алупка', 'алушта', 'альметьевск', 'амурск', 'анадырь', 'анапа', 'ангарск', 'андреаполь', 'анжеро-судженск', 'анива', 'апатиты', 'апрелевка', 'апшеронск', 'арамиль', 'аргун', 'ардатов', 'ардон', 'арзамас', 'аркадак', 'армавир', 'армянск', 'арсеньев', 'арск', 'артём', 'артёмовск', 'артёмовский', 'архангельск', 'асбест', 'асино', 'астрахань', 'аткарск', 'ахтубинск', 'ачинск', 'аша', 'бабаево', 'бабушкин', 'бавлы', 'багратионовск', 'байкальск', 'баймак', 'бакал', 'баксан', 'балабаново', 'балаково', 'балахна', 'балашиха', 'балашов', 'балей', 'балтийск', 'барабинск', 'барнаул', 'барыш', 'батайск', 'бахчисарай', 'бежецк', 'белая калитва', 'белая холуница', 'белгород', 'белебей', 'белинский', 'белово', 'белогорск', 'белозерск', 'белокуриха', 'беломорск', 'белорецк', 'белореченск', 'белоусово', 'белоярский', 'белый', 'белёв', 'бердск', 'березники', 'берёзовский', 'беслан', 'бийск', 'бикин', 'билибино', 'биробиджан', 'бирск', 'бирюсинск', 'бирюч', 'благовещенск', 'благодарный', 'бобров', 'богданович', 'богородицк', 'богородск', 'боготол', 'богучар', 'бодайбо', 'бокситогорск', 'болгар', 'бологое', 'болотное', 'болохово', 'болхов', 'большой камень', 'бор', 'борзя', 'борисоглебск', 'боровичи', 'боровск', 'бородино', 'братск', 'бронницы', 'брянск', 'бугульма', 'бугуруслан', 'будённовск', 'бузулук', 'буинск', 'буй', 'буйнакск', 'бутурлиновка', 'валдай', 'валуйки', 'велиж', 'великие луки', 'великий новгород', 'великий устюг', 'вельск', 'венёв', 'верещагино', 'верея', 'верхнеуральск', 'верхний тагил', 'верхний уфалей', 'верхняя пышма', 'верхняя салда', 'верхняя тура', 'верхотурье', 'верхоянск', 'весьегонск', 'ветлуга', 'видное', 'вилюйск', 'вилючинск', 'вихоревка', 'вичуга', 'владивосток', 'владикавказ', 'владимир', 'волгоград', 'волгодонск', 'волгореченск', 'волжск', 'волжский', 'вологда', 'володарск', 'волоколамск', 'волосово', 'волхов', 'волчанск', 'вольск', 'воркута', 'воронеж', 'ворсма', 'воскресенск', 'воткинск', 'всеволожск', 'вуктыл', 'выборг', 'выкса', 'высоковск', 'высоцк', 'вытегра', 'вышний волочёк', 'вяземский', 'вязники', 'вязьма', 'вятские поляны', 'гаврилов посад', 'гаврилов-ям', 'гагарин', 'гаджиево', 'гай', - 'галич', 'гатчина', 'гвардейск', 'гдов', 'геленджик', 'георгиевск', 'глазов', 'голицыно', 'горбатов', 'горно-алтайск', 'горнозаводск', 'горняк', 'городец', 'городище', 'городовиковск', 'гороховец', 'горячий ключ', 'грайворон', 'гремячинск', 'грозный', 'грязи', 'грязовец', 'губаха', 'губкин', 'губкинский', 'гудермес', 'гуково', 'гулькевичи', 'гурьевск', 'гусев', 'гусиноозёрск', 'гусь-хрустальный', 'давлеканово', 'дагестанские огни', 'далматово', 'дальнегорск', 'дальнереченск', 'данилов', 'данков', 'дегтярск', 'дедовск', 'демидов', 'дербент', 'десногорск', 'джанкой', 'дзержинск', 'дзержинский', 'дивногорск', 'дигора', 'димитровград', 'дмитриев', 'дмитров', 'дмитровск', 'дно', 'добрянка', 'долгопрудный', 'долинск', 'домодедово', 'донецк', 'донской', 'дорогобуж', 'дрезна', 'дубна', 'дубовка', 'дудинка', 'духовщина', 'дюртюли', 'дятьково', 'евпатория', 'егорьевск', 'ейск', 'екатеринбург', 'елабуга', 'елец', 'елизово', 'ельня', 'еманжелинск', 'емва', 'енисейск', 'ермолино', 'ершов', 'ессентуки', 'ефремов', 'железноводск', 'железногорск', 'железногорск-илимский', 'жердевка', 'жигулёвск', 'жиздра', 'жирновск', 'жуков', 'жуковка', 'жуковский', 'завитинск', 'заводоуковск', 'заволжск', 'заволжье', 'задонск', 'заинск', 'закаменск', 'заозёрный', 'заозёрск', - 'западная двина', 'заполярный', 'зарайск', 'заречный', 'заринск', 'звенигово', 'звенигород', 'зверево', 'зеленогорск', 'зеленоградск', 'зеленодольск', 'зеленокумск', 'зерноград', 'зея', 'зима', 'златоуст', 'злынка', 'змеиногорск', 'знаменск', 'зубцов', 'зуевка', 'ивангород', 'иваново', 'ивантеевка', 'ивдель', 'игарка', 'ижевск', 'избербаш', 'изобильный', 'иланский', 'инза', 'инкерман', 'иннополис', 'инсар', 'инта', 'ипатово', 'ирбит', 'иркутск', 'исилькуль', 'искитим', 'истра', 'ишим', 'ишимбай', 'йошкар-ола', 'кадников', 'казань', 'калач', 'калач-на-дону', 'калачинск', 'калининград', 'калининск', 'калтан', 'калуга', 'калязин', 'камбарка', 'каменка', 'каменногорск', 'каменск-уральский', 'каменск-шахтинский', 'камень-на-оби', 'камешково', 'камызяк', 'камышин', 'камышлов', 'канаш', 'кандалакша', - 'канск', 'карабаново', 'карабаш', 'карабулак', 'карасук', 'карачаевск', 'карачев', 'каргат', 'каргополь', 'карпинск', 'карталы', 'касимов', 'касли', 'каспийск', 'катав-ивановск', 'катайск', 'качканар', 'кашин', 'кашира', 'кедровый', 'кемерово', 'кемь', 'керчь', 'кизел', 'кизилюрт', 'кизляр', 'кимовск', 'кимры', 'кингисепп', 'кинель', 'кинешма', 'киреевск', 'киренск', 'киржач', 'кириллов', 'кириши', 'киров', 'кировград', 'кирово-чепецк', 'кировск', 'кирс', - 'кирсанов', 'киселёвск', 'кисловодск', 'клин', 'клинцы', 'княгинино', 'ковдор', 'ковров', 'ковылкино', 'когалым', 'кодинск', 'козельск', 'козловка', 'козьмодемьянск', 'кола', 'кологрив', 'коломна', 'колпашево', 'кольчугино', 'коммунар', 'комсомольск', 'комсомольск-на-амуре', 'конаково', 'кондопога', 'кондрово', 'константиновск', 'копейск', 'кораблино', 'кореновск', 'коркино', 'королёв', 'короча', 'корсаков', 'коряжма', 'костерёво', 'костомукша', 'кострома', 'котельники', 'котельниково', 'котельнич', 'котлас', 'котово', 'котовск', 'кохма', 'красавино', 'красноармейск', - 'красновишерск', 'красногорск', 'краснодар', 'краснозаводск', 'краснознаменск', 'краснокаменск', 'краснокамск', 'красноперекопск', 'краснослободск', 'краснотурьинск', 'красноуральск', 'красноуфимск', 'красноярск', 'красный кут', 'красный сулин', 'красный холм', 'кремёнки', 'кропоткин', 'крымск', 'кстово', 'кубинка', 'кувандык', 'кувшиново', 'кудымкар', 'кузнецк', 'куйбышев', 'кулебаки', 'кумертау', 'кунгур', 'купино', 'курган', 'курганинск', 'курильск', 'курлово', 'куровское', 'курск', 'куртамыш', 'курчатов', 'куса', 'кушва', 'кызыл', 'кыштым', 'кяхта', 'лабинск', 'лабытнанги', 'лагань', 'ладушкин', 'лаишево', 'лакинск', 'лангепас', 'лахденпохья', 'лебедянь', 'лениногорск', 'ленинск', 'ленинск-кузнецкий', 'ленск', 'лермонтов', 'лесной', 'лесозаводск', 'лесосибирск', 'ливны', 'ликино-дулёво', 'липецк', 'липки', 'лиски', 'лихославль', 'лобня', 'лодейное поле', 'лосино-петровский', 'луга', 'луза', 'лукоянов', - 'луховицы', 'лысково', 'лысьва', 'лыткарино', 'льгов', 'любань', 'люберцы', 'любим', 'людиново', 'лянтор', 'магадан', 'магас', 'магнитогорск', 'майкоп', 'майский', 'макаров', 'макарьев', 'макушино', 'малая вишера', 'малгобек', 'малмыж', 'малоархангельск', 'малоярославец', 'мамадыш', 'мамоново', 'мантурово', 'мариинск', 'мариинский посад', 'маркс', 'махачкала', 'мглин', 'мегион', 'медвежьегорск', 'медногорск', 'медынь', 'межгорье', 'междуреченск', 'мезень', 'меленки', 'мелеуз', 'менделеевск', 'мензелинск', 'мещовск', 'миасс', 'микунь', 'миллерово', 'минеральные воды', 'минусинск', 'миньяр', 'мирный', 'михайлов', 'михайловка', 'михайловск', 'мичуринск', 'могоча', 'можайск', 'можга', - 'моздок', 'мончегорск', 'морозовск', 'моршанск', 'мосальск', 'муравленко', 'мураши', 'мурманск', 'муром', 'мценск', 'мыски', 'мытищи', 'мышкин', 'набережные челны', 'навашино', 'наволоки', 'надым', 'назарово', 'назрань', 'называевск', 'нальчик', 'нариманов', 'наро-фоминск', 'нарткала', 'нарьян-мар', 'находка', 'невель', 'невельск', 'невинномысск', 'невьянск', 'нелидово', 'неман', 'нерехта', 'нерчинск', 'нерюнгри', 'нестеров', 'нефтегорск', 'нефтекамск', 'нефтекумск', 'нефтеюганск', 'нея', 'нижневартовск', 'нижнекамск', 'нижнеудинск', 'нижние серги', 'нижний ломов', 'нижний новгород', 'нижний тагил', 'нижняя салда', 'нижняя тура', 'николаевск', 'николаевск-на-амуре', 'никольск', 'никольское', 'новая ладога', 'новая ляля', 'новоалександровск', 'новоалтайск', 'новоаннинский', 'нововоронеж', 'новодвинск', 'новозыбков', 'новокубанск', 'новокузнецк', 'новокуйбышевск', 'новомичуринск', 'новомосковск', 'новопавловск', 'новоржев', 'новороссийск', 'новосибирск', 'новосиль', 'новосокольники', 'новотроицк', 'новоузенск', 'новоульяновск', 'новоуральск', 'новохопёрск', 'новочебоксарск', 'новочеркасск', 'новошахтинск', 'новый оскол', 'новый уренгой', 'ногинск', 'нолинск', 'норильск', 'ноябрьск', 'нурлат', 'нытва', 'нюрба', 'нягань', 'нязепетровск', 'няндома', - 'облучье', 'обнинск', 'обоянь', 'обь', 'одинцово', 'озёрск', 'озёры', 'октябрьск', 'октябрьский', 'окуловка', 'оленегорск', 'олонец', 'олёкминск', 'омск', 'омутнинск', 'онега', 'опочка', 'оренбург', 'орехово-зуево', 'орлов', 'орск', 'орёл', 'оса', 'осинники', 'осташков', 'остров', 'островной', 'острогожск', 'отрадное', 'отрадный', 'оха', 'оханск', 'очёр', 'павлово', 'павловск', 'павловский посад', 'палласовка', 'партизанск', 'певек', 'пенза', 'первомайск', 'первоуральск', 'перевоз', 'пересвет', 'переславль-залесский', 'пермь', 'пестово', 'петров вал', 'петровск', 'петровск-забайкальский', 'петрозаводск', 'петропавловск-камчатский', 'петухово', 'петушки', 'печора', 'печоры', 'пикалёво', 'пионерский', 'питкяранта', 'плавск', 'пласт', 'плёс', 'поворино', 'подольск', 'подпорожье', 'покачи', 'покров', 'покровск', 'полевской', 'полесск', 'полысаево', 'полярные зори', 'полярный', 'поронайск', 'порхов', 'похвистнево', 'почеп', 'починок', 'пошехонье', 'правдинск', 'приволжск', 'приморск', 'приморско-ахтарск', 'приозерск', 'прокопьевск', 'пролетарск', 'протвино', 'прохладный', 'псков', 'пугачёв', 'пудож', 'пустошка', 'пучеж', 'пушкино', 'пущино', 'пыталово', 'пыть-ях', 'пятигорск', 'радужный', 'райчихинск', 'раменское', 'рассказово', 'ревда', 'реж', 'реутов', 'ржев', 'родники', 'рославль', 'россошь', 'ростов', 'ростов-на-дону', 'рошаль', 'ртищево', 'рубцовск', 'рудня', 'руза', 'рузаевка', 'рыбинск', 'рыбное', 'рыльск', 'ряжск', 'рязань', 'саки', 'салават', 'салаир', 'салехард', 'сальск', 'самара', 'санкт-петербург', 'саранск', 'сарапул', 'саратов', 'саров', 'сасово', 'сатка', 'сафоново', 'саяногорск', 'саянск', 'светлогорск', 'светлоград', 'светлый', 'светогорск', 'свирск', 'свободный', 'себеж', 'севастополь', 'северо-курильск', 'северобайкальск', 'северодвинск', 'североморск', 'североуральск', 'северск', 'севск', 'сегежа', 'сельцо', 'семикаракорск', 'семилуки', 'семёнов', 'сенгилей', 'серафимович', 'сергач', 'сергиев посад', 'сердобск', 'серов', 'серпухов', 'сертолово', 'сибай', 'сим', 'симферополь', 'сковородино', 'скопин', 'славгород', 'славск', 'славянск-на-кубани', 'сланцы', 'слободской', 'слюдянка', 'смоленск', 'снежинск', 'снежногорск', 'собинка', 'советск', 'советская гавань', 'советский', 'сокол', 'солигалич', 'соликамск', 'солнечногорск', 'соль-илецк', 'сольвычегодск', 'сольцы', 'сорочинск', 'сорск', 'сортавала', 'сосенский', 'сосновка', 'сосновоборск', 'сосновый бор', 'сосногорск', 'сочи', 'спас-деменск', 'спас-клепики', 'спасск', 'спасск-дальний', 'спасск-рязанский', 'среднеколымск', 'среднеуральск', 'сретенск', 'ставрополь', 'старая купавна', 'старая русса', 'старица', 'стародуб', 'старый крым', 'старый оскол', 'стерлитамак', 'стрежевой', 'строитель', 'струнино', 'ступино', 'суворов', 'судак', 'суджа', 'судогда', 'суздаль', 'суоярви', 'сураж', 'сургут', 'суровикино', 'сурск', 'сусуман', 'сухиничи', 'сухой лог', 'сызрань', 'сыктывкар', 'сысерть', 'сычёвка', 'сясьстрой', 'тавда', 'таганрог', 'тайга', 'тайшет', 'талдом', 'тамбов', 'тара', 'тарко-сале', 'таруса', 'татарск', 'таштагол', 'тверь', 'теберда', 'тейково', 'темников', 'темрюк', 'терек', 'тетюши', 'тимашёвск', 'тихвин', 'тихорецк', 'тобольск', 'тогучин', 'тольятти', 'томари', 'томмот', 'томск', 'топки', - 'торжок', 'торопец', 'тосно', 'тотьма', 'троицк', 'трубчевск', 'трёхгорный', 'туапсе', 'туймазы', 'тула', 'тулун', - 'туран', 'туринск', 'тутаев', 'тында', 'тырныауз', 'тюкалинск', 'тюмень', 'уварово', 'углегорск', 'углич', 'удачный', 'удомля', 'ужур', 'узловая', 'улан-удэ', 'ульяновск', 'унеча', 'урай', 'урень', 'уржум', 'урус-мартан', 'урюпинск', 'усинск', 'усмань', 'усолье', 'усолье-сибирское', 'уссурийск', 'усть-джегута', 'усть-илимск', 'усть-катав', 'усть-кут', 'усть-лабинск', 'устюжна', 'уфа', 'ухта', 'учалы', 'уяр', 'фатеж', 'феодосия', 'фокино', 'фролово', 'фрязино', 'фурманов', 'хабаровск', 'хадыженск', 'ханты-мансийск', 'харабали', 'харовск', 'хасавюрт', 'хвалынск', 'хилок', 'химки', 'холм', 'холмск', 'хотьково', 'цивильск', 'цимлянск', 'циолковский', 'чадан', 'чайковский', 'чапаевск', - 'чаплыгин', 'чебаркуль', 'чебоксары', 'чегем', 'чекалин', 'челябинск', 'чердынь', 'черемхово', 'черепаново', 'череповец', 'черкесск', 'черноголовка', 'черногорск', 'чернушка', 'черняховск', 'чехов', 'чистополь', 'чита', 'чкаловск', 'чудово', 'чулым', 'чусовой', 'чухлома', 'чёрмоз', 'шагонар', 'шадринск', 'шали', 'шарыпово', 'шарья', 'шатура', - 'шахты', 'шахтёрск', 'шахунья', 'шацк', 'шебекино', 'шелехов', 'шенкурск', 'шилка', 'шимановск', 'шиханы', 'шлиссельбург', 'шумерля', 'шумиха', 'шуя', 'щигры', 'щучье', 'щёкино', 'щёлкино', 'щёлково', 'электрогорск', 'электросталь', 'электроугли', 'элиста', 'энгельс', 'эртиль', 'югорск', 'южа', 'южно-сахалинск', 'южно-сухокумск', 'южноуральск', 'юрга', 'юрьев-польский', 'юрьевец', 'юрюзань', 'юхнов', 'ядрин', 'якутск', 'ялта', 'ялуторовск', 'янаул', 'яранск', 'яровое', 'ярославль', 'ярцево', 'ясногорск', 'ясный', 'яхрома'] - + 'абаза', 'абакан', 'абдулино', 'абинск', 'агидель', 'агрыз', 'адыгейск', 'азнакаево', 'азов', 'ак-довурак', 'аксай', 'алагир', 'алапаевск', 'алатырь', 'алдан', 'алейск', 'александров', 'александровск', 'александровск-сахалинский', 'алексеевка', 'алексин', 'алзамай', 'алупка', 'алушта', 'альметьевск', 'амурск', 'анадырь', 'анапа', 'ангарск', 'андреаполь', 'анжеро-судженск', 'анива', 'апатиты', 'апрелевка', 'апшеронск', 'арамиль', 'аргун', 'ардатов', 'ардон', 'арзамас', 'аркадак', 'армавир', 'армянск', 'арсеньев', 'арск', 'артём', 'артёмовск', 'артёмовский', 'архангельск', 'асбест', 'асино', 'астрахань', 'аткарск', 'ахтубинск', 'ачинск', 'аша', + 'бабаево', 'бабушкин', 'бавлы', 'багратионовск', 'байкальск', 'баймак', 'бакал', 'баксан', 'балабаново', 'балаково', 'балахна', 'балашиха', 'балашов', 'балей', 'балтийск', 'барабинск', 'барнаул', 'барыш', 'батайск', 'бахчисарай', 'бежецк', 'белая калитва', 'белая холуница', 'белгород', 'белебей', 'белинский', 'белово', 'белогорск', 'белозерск', 'белокуриха', 'беломорск', 'белорецк', 'белореченск', 'белоусово', 'белоярский', 'белый', 'белёв', 'бердск', 'березники', 'берёзовский', 'беслан', 'бийск', 'бикин', 'билибино', 'биробиджан', 'бирск', 'бирюсинск', 'бирюч', 'благовещенск', 'благодарный', 'бобров', 'богданович', 'богородицк', 'богородск', 'боготол', 'богучар', 'бодайбо', 'бокситогорск', 'болгар', 'бологое', 'болотное', 'болохово', 'болхов', 'большой камень', 'бор', 'борзя', 'борисоглебск', 'боровичи', 'боровск', 'бородино', 'братск', 'бронницы', 'брянск', 'бугульма', 'бугуруслан', 'будённовск', 'бузулук', 'буинск', 'буй', 'буйнакск', 'бутурлиновка', + 'валдай', 'валуйки', 'велиж', 'великие луки', 'великий новгород', 'великий устюг', 'вельск', 'венёв', 'верещагино', 'верея', 'верхнеуральск', 'верхний тагил', 'верхний уфалей', 'верхняя пышма', 'верхняя салда', 'верхняя тура', 'верхотурье', 'верхоянск', 'весьегонск', 'ветлуга', 'видное', 'вилюйск', 'вилючинск', 'вихоревка', 'вичуга', 'владивосток', 'владикавказ', 'владимир', 'волгоград', 'волгодонск', 'волгореченск', 'волжск', 'волжский', 'вологда', 'володарск', 'волоколамск', 'волосово', 'волхов', 'волчанск', 'вольск', 'воркута', 'воронеж', 'ворсма', 'воскресенск', 'воткинск', 'всеволожск', 'вуктыл', 'выборг', 'выкса', 'высоковск', 'высоцк', 'вытегра', 'вышний волочёк', 'вяземский', 'вязники', 'вязьма', 'вятские поляны', + 'гаврилов посад', 'гаврилов-ям', 'гагарин', 'гаджиево', 'гай', 'галич', 'гатчина', 'гвардейск', 'гдов', 'геленджик', 'георгиевск', 'глазов', 'голицыно', 'горбатов', 'горно-алтайск', 'горнозаводск', 'горняк', 'городец', 'городище', 'городовиковск', 'гороховец', 'горячий ключ', 'грайворон', 'гремячинск', 'грозный', 'грязи', 'грязовец', 'губаха', 'губкин', 'губкинский', 'гудермес', 'гуково', 'гулькевичи', 'гурьевск', 'гусев', 'гусиноозёрск', 'гусь-хрустальный', + 'давлеканово', 'дагестанские огни', 'далматово', 'дальнегорск', 'дальнереченск', 'данилов', 'данков', 'дегтярск', 'дедовск', 'демидов', 'дербент', 'десногорск', 'джанкой', 'дзержинск', 'дзержинский', 'дивногорск', 'дигора', 'димитровград', 'дмитриев', 'дмитров', 'дмитровск', 'дно', 'добрянка', 'долгопрудный', 'долинск', 'домодедово', 'донецк', 'донской', 'дорогобуж', 'дрезна', 'дубна', 'дубовка', 'дудинка', 'духовщина', 'дюртюли', 'дятьково', + 'евпатория', 'егорьевск', 'ейск', 'екатеринбург', 'елабуга', 'елец', 'елизово', 'ельня', 'еманжелинск', 'емва', 'енисейск', 'ермолино', 'ершов', 'ессентуки', 'ефремов', + 'железноводск', 'железногорск', 'железногорск-илимский', 'жердевка', 'жигулёвск', 'жиздра', 'жирновск', 'жуков', 'жуковка', 'жуковский', + 'завитинск', 'заводоуковск', 'заволжск', 'заволжье', 'задонск', 'заинск', 'закаменск', 'заозёрный', 'заозёрск', 'западная двина', 'заполярный', 'зарайск', 'заречный', 'заринск', 'звенигово', 'звенигород', 'зверево', 'зеленогорск', 'зеленоградск', 'зеленодольск', 'зеленокумск', 'зерноград', 'зея', 'зима', 'златоуст', 'злынка', 'змеиногорск', 'знаменск', 'зубцов', 'зуевка', + 'ивангород', 'иваново', 'ивантеевка', 'ивдель', 'игарка', 'ижевск', 'избербаш', 'изобильный', 'иланский', 'инза', 'инкерман', 'иннополис', 'инсар', 'инта', 'ипатово', 'ирбит', 'иркутск', 'исилькуль', 'искитим', 'истра', 'ишим', 'ишимбай', + 'йошкар-ола', + 'кадников', 'казань', 'калач', 'калач-на-дону', 'калачинск', 'калининград', 'калининск', 'калтан', 'калуга', 'калязин', 'камбарка', 'каменка', 'каменногорск', 'каменск-уральский', 'каменск-шахтинский', 'камень-на-оби', 'камешково', 'камызяк', 'камышин', 'камышлов', 'канаш', 'кандалакша', 'канск', 'карабаново', 'карабаш', 'карабулак', 'карасук', 'карачаевск', 'карачев', 'каргат', 'каргополь', 'карпинск', 'карталы', 'касимов', 'касли', 'каспийск', 'катав-ивановск', 'катайск', 'качканар', 'кашин', 'кашира', 'кедровый', 'кемерово', 'кемь', 'керчь', 'кизел', 'кизилюрт', 'кизляр', 'кимовск', 'кимры', 'кингисепп', 'кинель', 'кинешма', 'киреевск', 'киренск', 'киржач', 'кириллов', 'кириши', 'киров', 'кировград', 'кирово-чепецк', 'кировск', 'кирс', 'кирсанов', 'киселёвск', 'кисловодск', 'клин', 'клинцы', 'княгинино', 'ковдор', 'ковров', 'ковылкино', 'когалым', 'кодинск', 'козельск', 'козловка', 'козьмодемьянск', 'кола', 'кологрив', 'коломна', 'колпашево', 'кольчугино', 'коммунар', 'комсомольск', 'комсомольск-на-амуре', 'конаково', 'кондопога', 'кондрово', 'константиновск', 'копейск', 'кораблино', 'кореновск', 'коркино', 'королёв', 'короча', 'корсаков', 'коряжма', 'костерёво', 'костомукша', 'кострома', 'котельники', 'котельниково', 'котельнич', 'котлас', 'котово', 'котовск', 'кохма', 'красавино', 'красноармейск', 'красновишерск', 'красногорск', 'краснодар', 'краснозаводск', 'краснознаменск', 'краснокаменск', 'краснокамск', 'красноперекопск', 'краснослободск', 'краснотурьинск', 'красноуральск', 'красноуфимск', 'красноярск', 'красный кут', 'красный сулин', 'красный холм', 'кремёнки', 'кропоткин', 'крымск', 'кстово', 'кубинка', 'кувандык', 'кувшиново', 'кудымкар', 'кузнецк', 'куйбышев', 'кулебаки', 'кумертау', 'кунгур', 'купино', 'курган', 'курганинск', 'курильск', 'курлово', 'куровское', 'курск', 'куртамыш', 'курчатов', 'куса', 'кушва', 'кызыл', 'кыштым', 'кяхта', + 'лабинск', 'лабытнанги', 'лагань', 'ладушкин', 'лаишево', 'лакинск', 'лангепас', 'лахденпохья', 'лебедянь', 'лениногорск', 'ленинск', 'ленинск-кузнецкий', 'ленск', 'лермонтов', 'лесной', 'лесозаводск', 'лесосибирск', 'ливны', 'ликино-дулёво', 'липецк', 'липки', 'лиски', 'лихославль', 'лобня', 'лодейное поле', 'лосино-петровский', 'луга', 'луза', 'лукоянов', + 'магадан', 'магас', 'магнитогорск', 'майкоп', 'майский', 'макаров', 'макарьев', 'макушино', 'малая вишера', 'малгобек', 'малмыж', 'малоархангельск', 'малоярославец', 'мамадыш', 'мамоново', 'мантурово', 'мариинск', 'мариинский посад', 'маркс', 'махачкала', 'мглин', 'мегион', 'медвежьегорск', 'медногорск', 'медынь', 'межгорье', 'междуреченск', 'мезень', 'меленки', 'мелеуз', 'менделеевск', 'мензелинск', 'мещовск', 'миасс', 'микунь', 'миллерово', 'минеральные воды', 'минусинск', 'миньяр', 'мирный', 'михайлов', 'михайловка', 'михайловск', 'мичуринск', 'могоча', 'можайск', 'можга', 'моздок', 'мончегорск', 'морозовск', 'моршанск', 'мосальск', 'москва', 'муравленко', 'мураши', 'мурманск', 'муром', 'мценск', 'мыски', 'мытищи', 'мышкин', + 'набережные челны', 'навашино', 'наволоки', 'надым', 'назарово', 'назрань', 'называевск', 'нальчик', 'нариманов', 'наро-фоминск', 'нарткала', 'нарьян-мар', 'находка', 'невель', 'невельск', 'невинномысск', 'невьянск', 'нелидово', 'неман', 'нерехта', 'нерчинск', 'нерюнгри', 'нестеров', 'нефтегорск', 'нефтекамск', 'нефтекумск', 'нефтеюганск', 'нея', 'нижневартовск', 'нижнекамск', 'нижнеудинск', 'нижние серги', 'нижний ломов', 'нижний новгород', 'нижний тагил', 'нижняя салда', 'нижняя тура', 'николаевск', 'николаевск-на-амуре', 'никольск', 'никольское', 'новая ладога', 'новая ляля', 'новоалександровск', 'новоалтайск', 'новоаннинский', 'нововоронеж', 'новодвинск', 'новозыбков', 'новокубанск', 'новокузнецк', 'новокуйбышевск', 'новомичуринск', 'новомосковск', 'новопавловск', 'новоржев', 'новороссийск', 'новосибирск', 'новосиль', 'новосокольники', 'новотроицк', 'новоузенск', 'новоульяновск', 'новоуральск', 'новохопёрск', 'новочебоксарск', 'новочеркасск', 'новошахтинск', 'новый оскол', 'новый уренгой', 'ногинск', 'нолинск', 'норильск', 'ноябрьск', 'нурлат', 'нытва', 'нюрба', 'нягань', 'нязепетровск', 'няндома', + 'облучье', 'обнинск', 'обоянь', 'обь', 'одинцово', 'озёрск', 'озёры', 'октябрьск', 'октябрьский', 'окуловка', 'оленегорск', 'олонец', 'олёкминск', 'омск', 'омутнинск', 'онега', 'опочка', 'оренбург', 'орехово-зуево', 'орлов', 'орск', 'орёл', 'оса', 'осинники', 'осташков', 'остров', 'островной', 'острогожск', 'отрадное', 'отрадный', 'оха', 'оханск', 'очёр', + 'павлово', 'павловск', 'павловский посад', 'палласовка', 'партизанск', 'певек', 'пенза', 'первомайск', 'первоуральск', 'перевоз', 'пересвет', 'переславль-залесский', 'пермь', 'пестово', 'петров вал', 'петровск', 'петровск-забайкальский', 'петрозаводск', 'петропавловск-камчатский', 'петухово', 'петушки', 'печора', 'печоры', 'пикалёво', 'пионерский', 'питкяранта', 'плавск', 'пласт', 'плёс', 'поворино', 'подольск', 'подпорожье', 'покачи', 'покров', 'покровск', 'полевской', 'полесск', 'полысаево', 'полярные зори', 'полярный', 'поронайск', 'порхов', 'похвистнево', 'почеп', 'починок', 'пошехонье', 'правдинск', 'приволжск', 'приморск', 'приморско-ахтарск', 'приозерск', 'прокопьевск', 'пролетарск', 'протвино', 'прохладный', 'псков', 'пугачёв', 'пудож', 'пустошка', 'пучеж', 'пушкино', 'пущино', 'пыталово', 'пыть-ях', 'пятигорск', + 'радужный', 'райчихинск', 'раменское', 'рассказово', 'ревда', 'реж', 'реутов', 'ржев', 'родники', 'рославль', 'россошь', 'ростов', 'ростов-на-дону', 'рошаль', 'ртищево', 'рубцовск', 'рудня', 'руза', 'рузаевка', 'рыбинск', 'рыбное', 'рыльск', 'ряжск', 'рязань', + 'саки', 'салават', 'салаир', 'салехард', 'сальск', 'самара', 'санкт-петербург', 'саранск', 'сарапул', 'саратов', 'саров', 'сасово', 'сатка', 'сафоново', 'саяногорск', 'саянск', 'светлогорск', 'светлоград', 'светлый', 'светогорск', 'свирск', 'свободный', 'себеж', 'севастополь', 'северо-курильск', 'северобайкальск', 'северодвинск', 'североморск', 'североуральск', 'северск', 'севск', 'сегежа', 'сельцо', 'семикаракорск', 'семилуки', 'семёнов', 'сенгилей', 'серафимович', 'сергач', 'сергиев посад', 'сердобск', 'серов', 'серпухов', 'сертолово', 'сибай', 'сим', 'симферополь', 'сковородино', 'скопин', 'славгород', 'славск', 'славянск-на-кубани', 'сланцы', 'слободской', 'слюдянка', 'смоленск', 'снежинск', 'снежногорск', 'собинка', 'советск', 'советская гавань', 'советский', 'сокол', 'солигалич', 'соликамск', 'солнечногорск', 'соль-илецк', 'сольвычегодск', 'сольцы', 'сорочинск', 'сорск', 'сортавала', 'сосенский', 'сосновка', 'сосновоборск', 'сосновый бор', 'сосногорск', 'сочи', 'спас-деменск', 'спас-клепики', 'спасск', 'спасск-дальний', 'спасск-рязанский', 'среднеколымск', 'среднеуральск', 'сретенск', 'ставрополь', 'старая купавна', 'старая русса', 'старица', 'стародуб', 'старый крым', 'старый оскол', 'стерлитамак', 'стрежевой', 'строитель', 'струнино', 'ступино', 'суворов', 'судак', 'суджа', 'судогда', 'суздаль', 'суоярви', 'сураж', 'сургут', 'суровикино', 'сурск', 'сусуман', 'сухиничи', 'сухой лог', 'сызрань', 'сыктывкар', 'сысерть', 'сычёвка', 'сясьстрой', + 'тавда', 'таганрог', 'тайга', 'тайшет', 'талдом', 'тамбов', 'тара', 'тарко-сале', 'таруса', 'татарск', 'таштагол', 'тверь', 'теберда', 'тейково', 'темников', 'темрюк', 'терек', 'тетюши', 'тимашёвск', 'тихвин', 'тихорецк', 'тобольск', 'тогучин', 'тольятти', 'томари', 'томмот', 'томск', 'топки', 'торжок', 'торопец', 'тосно', 'тотьма', 'троицк', 'трубчевск', 'трёхгорный', 'туапсе', 'туймазы', 'тула', 'тулун', 'туран', 'туринск', 'тутаев', 'тында', 'тырныауз', 'тюкалинск', 'тюмень', + 'уварово', 'углегорск', 'углич', 'удачный', 'удомля', 'ужур', 'узловая', 'улан-удэ', 'ульяновск', 'унеча', 'урай', 'урень', 'уржум', 'урус-мартан', 'урюпинск', 'усинск', 'усмань', 'усолье', 'усолье-сибирское', 'уссурийск', 'усть-джегута', 'усть-илимск', 'усть-катав', 'усть-кут', 'усть-лабинск', 'устюжна', 'уфа', 'ухта', 'учалы', 'уяр', + 'фатеж', 'феодосия', 'фокино', 'фролово', 'фрязино', 'фурманов', + 'хабаровск', 'хадыженск', 'ханты-мансийск', 'харабали', 'харовск', 'хасавюрт', 'хвалынск', 'хилок', 'химки', 'холм', 'холмск', 'хотьково', + 'цивильск', 'цимлянск', 'циолковский', + 'чадан', 'чайковский', 'чапаевск', 'чаплыгин', 'чебаркуль', 'чебоксары', 'чегем', 'чекалин', 'челябинск', 'чердынь', 'черемхово', 'черепаново', 'череповец', 'черкесск', 'черноголовка', 'черногорск', 'чернушка', 'черняховск', 'чехов', 'чистополь', 'чита', 'чкаловск', 'чудово', 'чулым', 'чусовой', 'чухлома', 'чёрмоз', + 'шагонар', 'шадринск', 'шали', 'шарыпово', 'шарья', 'шатура', 'шахты', 'шахтёрск', 'шахунья', 'шацк', 'шебекино', 'шелехов', 'шенкурск', 'шилка', 'шимановск', 'шиханы', 'шлиссельбург', 'шумерля', 'шумиха', 'шуя', + 'щигры', 'щучье', 'щёкино', 'щёлкино', 'щёлково', + 'электрогорск', 'электросталь', 'электроугли', 'элиста', 'энгельс', 'эртиль', + 'югорск', 'южа', 'южно-сахалинск', 'южно-сухокумск', 'южноуральск', 'юрга', 'юрьев-польский', 'юрьевец', 'юрюзань', 'юхнов', + 'ядрин', 'якутск', 'ялта', 'ялуторовск', 'янаул', 'яранск', 'яровое', 'ярославль', 'ярцево', 'ясногорск', 'ясный', 'яхрома' + + ] if user_text not in game_lst: - update.message.reply_text(f'Нет такого города в нашем списке!') + update.message.reply_text('Нет такого города в нашем списке!') else: next_turn_letter: str = user_text[-1] + answer: list = [i for i in game_lst if i.startswith(next_turn_letter) and i != user_text] + if not answer: + next_turn_letter: str = user_text[-2] + answer: list = [i for i in game_lst if i.startswith(next_turn_letter) and i != user_text] + chosen_city: str = random.choice(answer).title() game_lst.remove(user_text) - answer: list = [i for i in game_lst if i.startswith(next_turn_letter)] - chosen_city: str = random.choice(answer) - update.message.reply_text(f'{next_turn_letter}, {chosen_city.title()}, ваш ход') + update.message.reply_text(f'{next_turn_letter}, {chosen_city}, Ваш ход') game_lst.remove(chosen_city) +def calc(update, context): + user_text: str = update.message.text[6:].strip() + var1, var2 = '', '' + + for i in range(len(user_text)): + if not user_text[i].isdigit(): + break + else: + var1 += user_text[i] + + for i in range(len(user_text)-1, -1, -1): + if not user_text[i].isdigit(): + break + else: + var2 += user_text[i] + + res: list = list(map(int, [var1, (var2)[::-1]])) + oper: str = ''.join(set(user_text) - set(var1+var2)) + + if len(res) != 2: + return 'Работаю пока только с двумя элементами' + else: + try: + oper_dct: dict = { + '+': sum(res), + '-': res[0] - res[1], + '/': res[0] / res[1], + '*': res[0] * res[1] + } + + answer: str = oper_dct.get(oper, 'Данная операция не поддерживается') + except ZeroDivisionError: + answer: str = 'Делить на ноль НЕЛЬЗЯ!' + return update.message.reply_text(answer) + + def main(): mybot = Updater( settings.API_KEY, @@ -140,6 +198,7 @@ def main(): dp.add_handler(CommandHandler("wordcount", word_counter)) dp.add_handler(CommandHandler("nfm", next_full_moon)) dp.add_handler(CommandHandler("cities", city_game)) + dp.add_handler(CommandHandler("calc", calc)) dp.add_handler(MessageHandler(Filters.text, talk_to_me)) logging.info('Бот запущен') From 244a148f11cc8ad459e294965f7fbb1b187bfabc Mon Sep 17 00:00:00 2001 From: leeroymk Date: Thu, 15 Jun 2023 08:42:42 +0300 Subject: [PATCH 10/10] added calc function with 3+ elements, minor fixes --- 8_ephem_bot.py | 135 +++++++++++++++++++++++-------------------------- 1 file changed, 64 insertions(+), 71 deletions(-) diff --git a/8_ephem_bot.py b/8_ephem_bot.py index 4a52f3db..284e9798 100644 --- a/8_ephem_bot.py +++ b/8_ephem_bot.py @@ -1,5 +1,7 @@ import logging -import string +import operator +import re +import pymorphy2 import ephem import settings import random @@ -9,7 +11,7 @@ logging.basicConfig(format='%(name)s - %(levelname)s - %(message)s', - level=logging.INFO, + level=logging.DEBUG, filename='bot.log') @@ -23,17 +25,15 @@ def greet_user(update, context): - update.message.reply_text('Вызван /start') + return update.message.reply_text('Вызван /start') def talk_to_me(update, context): - update.message.reply_text(update.message.text) + return update.message.reply_text(update.message.text) def constel(update, context): - - planet_key: str = update.message.text.lower().split()[-1] - + planet_key: str = ''.join(context.args).lower() planets: dict = { 'mercury': ephem.Mercury, 'venus': ephem.Venus, @@ -56,54 +56,37 @@ def constel(update, context): 'нептун': ephem.Neptune, 'плутон': ephem.Pluto, } - position = planets[planet_key](datetime.today().strftime('%Y/%m/%d')) const = ephem.constellation(position)[1] - update.message.reply_text(f'{planet_key.title()} is in {const} today.') + return update.message.reply_text(f'{planet_key.title()} is in {const} today.') def word_counter(update, context): - - res: str = '' - - for i in update.message.text: - if i in string.punctuation: - res += ' ' - else: - res += i - - message_length: int = len(res.split()) - 1 - - if message_length < 1: - update.message.reply_text("Недостаточно слов для подсчета, введите текст: ") - else: - if message_length in range(11, 21) or str(message_length)[-1] in '056789': - update.message.reply_text(f"{message_length} слов") - elif str(message_length)[-1] == '1': - update.message.reply_text(f"{message_length} слово") - else: - update.message.reply_text(f"{message_length} слова") + length = len(' '.join(context.args).split()) + morph = pymorphy2.MorphAnalyzer() + words = morph.parse('слово')[0] + string = words.make_agree_with_number(length).word + answer = f'{length} {string}' + return update.message.reply_text(answer) def next_full_moon(update, context): - user_text: str = ' '.join(update.message.text.strip().split()[1:]) + user_text: str = ''.join(context.args) if user_text == '': - nfm = ephem.next_full_moon(datetime.today()) - update.message.reply_text(f"Ближайшее полнолуние {nfm}") + nfm: ephem.Date = ephem.next_full_moon(datetime.today()) + return update.message.reply_text(f"Ближайшее полнолуние {nfm}") else: try: date_moon: datetime.date = date.fromisoformat(user_text) nfm: ephem.Date = ephem.next_full_moon(date_moon) answer: str = f"Ближайшее полнолуние от даты {date_moon} - {nfm}" - - except ValueError as ve: - print(ve) - answer: str = f"Введите дату в формате ГГГГ-ММ-ДД" + except ValueError: + answer: str = "Введите дату в формате ГГГГ-ММ-ДД" return update.message.reply_text(answer) def city_game(update, context): - user_text: str = update.message.text[8:].strip().lower() + user_text: str = ''.join(context.args).lower() game_lst: list = [ 'абаза', 'абакан', 'абдулино', 'абинск', 'агидель', 'агрыз', 'адыгейск', 'азнакаево', 'азов', 'ак-довурак', 'аксай', 'алагир', 'алапаевск', 'алатырь', 'алдан', 'алейск', 'александров', 'александровск', 'александровск-сахалинский', 'алексеевка', 'алексин', 'алзамай', 'алупка', 'алушта', 'альметьевск', 'амурск', 'анадырь', 'анапа', 'ангарск', 'андреаполь', 'анжеро-судженск', 'анива', 'апатиты', 'апрелевка', 'апшеронск', 'арамиль', 'аргун', 'ардатов', 'ардон', 'арзамас', 'аркадак', 'армавир', 'армянск', 'арсеньев', 'арск', 'артём', 'артёмовск', 'артёмовский', 'архангельск', 'асбест', 'асино', 'астрахань', 'аткарск', 'ахтубинск', 'ачинск', 'аша', 'бабаево', 'бабушкин', 'бавлы', 'багратионовск', 'байкальск', 'баймак', 'бакал', 'баксан', 'балабаново', 'балаково', 'балахна', 'балашиха', 'балашов', 'балей', 'балтийск', 'барабинск', 'барнаул', 'барыш', 'батайск', 'бахчисарай', 'бежецк', 'белая калитва', 'белая холуница', 'белгород', 'белебей', 'белинский', 'белово', 'белогорск', 'белозерск', 'белокуриха', 'беломорск', 'белорецк', 'белореченск', 'белоусово', 'белоярский', 'белый', 'белёв', 'бердск', 'березники', 'берёзовский', 'беслан', 'бийск', 'бикин', 'билибино', 'биробиджан', 'бирск', 'бирюсинск', 'бирюч', 'благовещенск', 'благодарный', 'бобров', 'богданович', 'богородицк', 'богородск', 'боготол', 'богучар', 'бодайбо', 'бокситогорск', 'болгар', 'бологое', 'болотное', 'болохово', 'болхов', 'большой камень', 'бор', 'борзя', 'борисоглебск', 'боровичи', 'боровск', 'бородино', 'братск', 'бронницы', 'брянск', 'бугульма', 'бугуруслан', 'будённовск', 'бузулук', 'буинск', 'буй', 'буйнакск', 'бутурлиновка', @@ -137,7 +120,7 @@ def city_game(update, context): ] if user_text not in game_lst: - update.message.reply_text('Нет такого города в нашем списке!') + return update.message.reply_text('Нет такого города в нашем списке!') else: next_turn_letter: str = user_text[-1] answer: list = [i for i in game_lst if i.startswith(next_turn_letter) and i != user_text] @@ -151,39 +134,49 @@ def city_game(update, context): def calc(update, context): - user_text: str = update.message.text[6:].strip() - var1, var2 = '', '' - - for i in range(len(user_text)): - if not user_text[i].isdigit(): - break - else: - var1 += user_text[i] - - for i in range(len(user_text)-1, -1, -1): - if not user_text[i].isdigit(): - break - else: - var2 += user_text[i] - - res: list = list(map(int, [var1, (var2)[::-1]])) - oper: str = ''.join(set(user_text) - set(var1+var2)) - - if len(res) != 2: - return 'Работаю пока только с двумя элементами' - else: - try: - oper_dct: dict = { - '+': sum(res), - '-': res[0] - res[1], - '/': res[0] / res[1], - '*': res[0] * res[1] - } - - answer: str = oper_dct.get(oper, 'Данная операция не поддерживается') - except ZeroDivisionError: - answer: str = 'Делить на ноль НЕЛЬЗЯ!' - return update.message.reply_text(answer) + # Словарь для операторов + operators = { + '+': operator.add, + '-': operator.sub, + '*': operator.mul, + '/': operator.truediv, + } + input_string = ''.join(context.args) + # Удаляем пробелы из выражения + expression = re.sub(r'\s', '', input_string) + # Проверяем на вхождение неверных операторов + errors = ('//', '**', '/*', '*/') + for error in errors: + if error in expression: + return update.message.reply_text('Ошибка в выражении') + # Делим выражение на слагаемые + summands = re.findall(r'-?\d+(?:\.\d+)?(?:[/\*]-?\d+(?:\.\d+)?)*', expression) + result = 0 + try: + # Вычисляем значение каждого слагаемого + for summand in summands: + # Разбиваем слагаемое на токены + tokens = re.findall(r'-?\d+(?:\.\d+)?|\S', summand) + # Переменная для подсчета промежуточных результатов + last_result = None + # Обработчик первого множителя + is_calc = False + # Считаем произведение каждого найденного токена + for token in tokens: + try: + multiplier = float(token) + except ValueError: + oper = token + continue + if is_calc: + last_result = operators[oper](float(last_result), multiplier) + else: + last_result = multiplier + is_calc = True + result += last_result + except ZeroDivisionError: + return update.message.reply_text('На ноль делить НЕЛЬЗЯ!') + return update.message.reply_text(result) def main():