From 898c8a75382a32858419a8926be8a27554472891 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Fri, 1 Jul 2022 12:13:58 +0300 Subject: [PATCH 001/113] created template for tele-bot project --- .env.template | 2 + .gitignore | 131 +++++++++++++++++++++++ config_data/__init__.py | 0 config_data/config.py | 15 +++ database/__init__.py | 0 database/model.py | 1 + handlers/__init__.py | 3 + handlers/default_heandlers/__init__.py | 2 + handlers/default_heandlers/help.py | 9 ++ handlers/default_heandlers/lucky_list.py | 7 ++ handlers/default_heandlers/start.py | 8 ++ keyboards/__init__.py | 2 + keyboards/inline/__init__.py | 1 + keyboards/reply/__init__.py | 0 loader.py | 7 ++ main.py | 8 ++ requirements.txt | 2 + states/README.md | 5 + states/__init__.py | 0 utils/__init__.py | 1 + utils/misc/__init__.py | 1 + utils/set_bot_commands.py | 8 ++ 22 files changed, 213 insertions(+) create mode 100644 .env.template create mode 100644 .gitignore create mode 100644 config_data/__init__.py create mode 100644 config_data/config.py create mode 100644 database/__init__.py create mode 100644 database/model.py create mode 100644 handlers/__init__.py create mode 100644 handlers/default_heandlers/__init__.py create mode 100644 handlers/default_heandlers/help.py create mode 100644 handlers/default_heandlers/lucky_list.py create mode 100644 handlers/default_heandlers/start.py create mode 100644 keyboards/__init__.py create mode 100644 keyboards/inline/__init__.py create mode 100644 keyboards/reply/__init__.py create mode 100644 loader.py create mode 100644 main.py create mode 100644 requirements.txt create mode 100644 states/README.md create mode 100644 states/__init__.py create mode 100644 utils/__init__.py create mode 100644 utils/misc/__init__.py create mode 100644 utils/set_bot_commands.py diff --git a/.env.template b/.env.template new file mode 100644 index 0000000..d03979c --- /dev/null +++ b/.env.template @@ -0,0 +1,2 @@ +BOT_TOKEN = "Ваш токен для бота, полученный от @BotFather" +RAPID_API_KEY = "Ваш ключ полученный от API по адресу rapidapi.com/apidojo/api/hotels4/" \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..913d692 --- /dev/null +++ b/.gitignore @@ -0,0 +1,131 @@ +# 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 +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# 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 + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.venv +*/.env +env/ +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/ +.idea/* +.env \ No newline at end of file diff --git a/config_data/__init__.py b/config_data/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/config_data/config.py b/config_data/config.py new file mode 100644 index 0000000..d158118 --- /dev/null +++ b/config_data/config.py @@ -0,0 +1,15 @@ +import os +from dotenv import load_dotenv, find_dotenv + +if not find_dotenv(): + exit('Переменные окружения не загружены т.к отсутствует файл .env') +else: + load_dotenv() + +BOT_TOKEN = os.getenv('BOT_TOKEN') +RAPID_API_KEY = os.getenv('RAPID_API_KEY') +DEFAULT_COMMANDS = ( + ('start', "Запустить бота"), + ('help', "Вывести справку"), + ('списокЮбилейный', "Запросить юбилейный список") +) diff --git a/database/__init__.py b/database/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/database/model.py b/database/model.py new file mode 100644 index 0000000..ed02821 --- /dev/null +++ b/database/model.py @@ -0,0 +1 @@ +# Здесь прописываем модель для базы данных пользователей diff --git a/handlers/__init__.py b/handlers/__init__.py new file mode 100644 index 0000000..6ef81f3 --- /dev/null +++ b/handlers/__init__.py @@ -0,0 +1,3 @@ +from . import default_heandlers + + diff --git a/handlers/default_heandlers/__init__.py b/handlers/default_heandlers/__init__.py new file mode 100644 index 0000000..91e8acb --- /dev/null +++ b/handlers/default_heandlers/__init__.py @@ -0,0 +1,2 @@ +from . import start +from . import help diff --git a/handlers/default_heandlers/help.py b/handlers/default_heandlers/help.py new file mode 100644 index 0000000..deaf9b7 --- /dev/null +++ b/handlers/default_heandlers/help.py @@ -0,0 +1,9 @@ +from telebot.types import Message +from config_data.config import DEFAULT_COMMANDS +from loader import bot + + +@bot.message_handler(commands=['help']) +def bot_help(message: Message): + text = [f'/{command} - {desk}' for command, desk in DEFAULT_COMMANDS] + bot.reply_to(message, '\n'.join(text)) diff --git a/handlers/default_heandlers/lucky_list.py b/handlers/default_heandlers/lucky_list.py new file mode 100644 index 0000000..0f11804 --- /dev/null +++ b/handlers/default_heandlers/lucky_list.py @@ -0,0 +1,7 @@ +from telebot.types import Message +from loader import bot + + +@bot.message_handler(commands=['списокЮбилейный']) +def bot_lucky_list(message: Message): + pass diff --git a/handlers/default_heandlers/start.py b/handlers/default_heandlers/start.py new file mode 100644 index 0000000..6878331 --- /dev/null +++ b/handlers/default_heandlers/start.py @@ -0,0 +1,8 @@ +from telebot.types import Message +from loader import bot + + +@bot.message_handler(commands=['start']) +def bot_start(message: Message): + bot.reply_to(message, f"Привет, {message.from_user.full_name}!") + diff --git a/keyboards/__init__.py b/keyboards/__init__.py new file mode 100644 index 0000000..8abaca9 --- /dev/null +++ b/keyboards/__init__.py @@ -0,0 +1,2 @@ +from . import default +from . import inline diff --git a/keyboards/inline/__init__.py b/keyboards/inline/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/keyboards/inline/__init__.py @@ -0,0 +1 @@ + diff --git a/keyboards/reply/__init__.py b/keyboards/reply/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/loader.py b/loader.py new file mode 100644 index 0000000..9825b10 --- /dev/null +++ b/loader.py @@ -0,0 +1,7 @@ +from telebot import TeleBot +from telebot.storage import StateMemoryStorage +from config_data import config + +storage = StateMemoryStorage() +bot = TeleBot(token=config.BOT_TOKEN, state_storage=storage) + diff --git a/main.py b/main.py new file mode 100644 index 0000000..7cd48ce --- /dev/null +++ b/main.py @@ -0,0 +1,8 @@ +from loader import bot +import handlers +from utils.set_bot_commands import set_default_commands + +if __name__ == '__main__': + set_default_commands(bot) + bot.infinity_polling() + # ТЗ: Используйте LongPolling вариант работы с серверами телеграм diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..bcb249f --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +pyTelegramBotAPI==4.4.0 +python-dotenv==0.19.2 \ No newline at end of file diff --git a/states/README.md b/states/README.md new file mode 100644 index 0000000..c99fc8d --- /dev/null +++ b/states/README.md @@ -0,0 +1,5 @@ +# Состояния пользователя внутри сценария +Чтобы не писать собственные классы для хранения полученной информации, +куда проще использовать реализацию состояний пользователя внутри сценария. +> Пример можно найти в репозитории [ссылка](https://github.com/eternnoir/pyTelegramBotAPI/blob/master/examples/custom_states.py) + diff --git a/states/__init__.py b/states/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/utils/__init__.py b/utils/__init__.py new file mode 100644 index 0000000..ab665e1 --- /dev/null +++ b/utils/__init__.py @@ -0,0 +1 @@ +from . import misc diff --git a/utils/misc/__init__.py b/utils/misc/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/utils/misc/__init__.py @@ -0,0 +1 @@ + diff --git a/utils/set_bot_commands.py b/utils/set_bot_commands.py new file mode 100644 index 0000000..6494889 --- /dev/null +++ b/utils/set_bot_commands.py @@ -0,0 +1,8 @@ +from telebot.types import BotCommand +from config_data.config import DEFAULT_COMMANDS + + +def set_default_commands(bot): + bot.set_my_commands( + [BotCommand(*i) for i in DEFAULT_COMMANDS] + ) From 169ae9fbd5c9b42128fe4c687dbb8c30b494692d Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Sat, 2 Jul 2022 10:36:55 +0300 Subject: [PATCH 002/113] deleted rapid-api-key --- .env.template | 3 +-- config_data/config.py | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.env.template b/.env.template index d03979c..4d1c1fd 100644 --- a/.env.template +++ b/.env.template @@ -1,2 +1 @@ -BOT_TOKEN = "Ваш токен для бота, полученный от @BotFather" -RAPID_API_KEY = "Ваш ключ полученный от API по адресу rapidapi.com/apidojo/api/hotels4/" \ No newline at end of file +BOT_TOKEN = "Ваш токен для бота, полученный от @BotFather" \ No newline at end of file diff --git a/config_data/config.py b/config_data/config.py index d158118..228a5ee 100644 --- a/config_data/config.py +++ b/config_data/config.py @@ -7,7 +7,6 @@ load_dotenv() BOT_TOKEN = os.getenv('BOT_TOKEN') -RAPID_API_KEY = os.getenv('RAPID_API_KEY') DEFAULT_COMMANDS = ( ('start', "Запустить бота"), ('help', "Вывести справку"), From 3e886d3eeef5267a06a66d569e1b4700a673b8d3 Mon Sep 17 00:00:00 2001 From: Vladimir Kireev Date: Sat, 2 Jul 2022 23:30:17 +0300 Subject: [PATCH 003/113] test_confic created and fill --- __init__.py | 0 handlers/Test_config.py | 11 +++++++++++ 2 files changed, 11 insertions(+) create mode 100644 __init__.py create mode 100644 handlers/Test_config.py diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/handlers/Test_config.py b/handlers/Test_config.py new file mode 100644 index 0000000..1f6f65a --- /dev/null +++ b/handlers/Test_config.py @@ -0,0 +1,11 @@ +from loader import bot +@bot.message_handler(content_types=['text']) + +def get_text_messages(message): + if message.text == 'Привет': + bot.send_message(message.from_user.id, 'Привет, чем я могу тебе помочь?') + elif message.text == '/help': + bot.send_message(message.from_user.id, 'Напиши привет') + else: + bot.send_message(message.from_user.id, 'Я не понимаю. Напиши /help.') + From c547e93000c975e1310eff77de6ed2af6b2d175d Mon Sep 17 00:00:00 2001 From: Nikolay Kriuchkov Date: Mon, 4 Jul 2022 09:18:32 +1200 Subject: [PATCH 004/113] test --- database/model.py | 1 + 1 file changed, 1 insertion(+) diff --git a/database/model.py b/database/model.py index ed02821..cd8db9a 100644 --- a/database/model.py +++ b/database/model.py @@ -1 +1,2 @@ # Здесь прописываем модель для базы данных пользователей +123 \ No newline at end of file From da6acee2da040b98c11c2d8ff0ee393053a81a28 Mon Sep 17 00:00:00 2001 From: Nikolay Kriuchkov Date: Mon, 4 Jul 2022 11:43:01 +1200 Subject: [PATCH 005/113] test --- database/model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/model.py b/database/model.py index cd8db9a..b7bd49f 100644 --- a/database/model.py +++ b/database/model.py @@ -1,2 +1,2 @@ # Здесь прописываем модель для базы данных пользователей -123 \ No newline at end of file +1 \ No newline at end of file From ccd93579aab6baf88e5de506cd5525ba72800735 Mon Sep 17 00:00:00 2001 From: Nikolay Kriuchkov Date: Mon, 4 Jul 2022 11:45:24 +1200 Subject: [PATCH 006/113] test --- database/model.py | 1 - 1 file changed, 1 deletion(-) diff --git a/database/model.py b/database/model.py index b7bd49f..ed02821 100644 --- a/database/model.py +++ b/database/model.py @@ -1,2 +1 @@ # Здесь прописываем модель для базы данных пользователей -1 \ No newline at end of file From fdb17bfae4fec2ed840cc9e54f7c7e48bd141ac3 Mon Sep 17 00:00:00 2001 From: Nikolay Kriuchkov Date: Mon, 4 Jul 2022 11:46:02 +1200 Subject: [PATCH 007/113] test --- database/model.py | 1 + 1 file changed, 1 insertion(+) diff --git a/database/model.py b/database/model.py index ed02821..e7b256e 100644 --- a/database/model.py +++ b/database/model.py @@ -1 +1,2 @@ # Здесь прописываем модель для базы данных пользователей +test \ No newline at end of file From dab03790ee44a1c194a918e839644bc74815fcf2 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Mon, 4 Jul 2022 21:10:22 +0300 Subject: [PATCH 008/113] added import to make file visible --- handlers/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/handlers/__init__.py b/handlers/__init__.py index 6ef81f3..436b69e 100644 --- a/handlers/__init__.py +++ b/handlers/__init__.py @@ -1,3 +1,3 @@ from . import default_heandlers - +from . import Test_config From 6df0588c81a9f1ecde66e0cf5fa0e37bec1bfc88 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Mon, 4 Jul 2022 21:10:38 +0300 Subject: [PATCH 009/113] renamed russian command to english to fix error --- config_data/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config_data/config.py b/config_data/config.py index 228a5ee..8dd4f85 100644 --- a/config_data/config.py +++ b/config_data/config.py @@ -10,5 +10,5 @@ DEFAULT_COMMANDS = ( ('start', "Запустить бота"), ('help', "Вывести справку"), - ('списокЮбилейный', "Запросить юбилейный список") + ('luckylist', "Запросить юбилейный список") ) From 8cc547b017ec1a8fffac08c39d2e2606b724eec5 Mon Sep 17 00:00:00 2001 From: Vladimir Kireev Date: Tue, 5 Jul 2022 13:44:18 +0300 Subject: [PATCH 010/113] aded functin check new_member and send helo --- handlers/Test_config.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/handlers/Test_config.py b/handlers/Test_config.py index 1f6f65a..169713b 100644 --- a/handlers/Test_config.py +++ b/handlers/Test_config.py @@ -6,6 +6,15 @@ def get_text_messages(message): bot.send_message(message.from_user.id, 'Привет, чем я могу тебе помочь?') elif message.text == '/help': bot.send_message(message.from_user.id, 'Напиши привет') - else: - bot.send_message(message.from_user.id, 'Я не понимаю. Напиши /help.') + # else: + # bot.send_message(message.from_user.id, 'Я не понимаю. Напиши /help.') + +@bot.message_handler(content_types=['new_chat_members']) + +def handler_new_member(message): + # user_name = message.new_chat_member.first_name + user_name = message.from_user.first_name + + bot.send_message(message.chat.id, 'Добро пожаловать, {0}'.format(user_name)) + From 8e2934d7ada4bf0621de0a38bf7882aa1def617d Mon Sep 17 00:00:00 2001 From: NickX Date: Wed, 6 Jul 2022 20:13:48 +1200 Subject: [PATCH 011/113] add nvn.db --- database/nvn.db | Bin 0 -> 12288 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 database/nvn.db diff --git a/database/nvn.db b/database/nvn.db new file mode 100644 index 0000000000000000000000000000000000000000..17dcc557f4840a3190e2904a6ba756a183abe23c GIT binary patch literal 12288 zcmeI#F;9a)6bJA-+UR8J#`-oPMHjz-S3Mgdg-Wj`Oa$>7i4;?yadFX4?m_I(E{-P6 z|0Q?iz1%y(kLfKQgQC^6dau`6OV{k2an5dt7-QV5fmyrg^5HHq&o2KfIJ=5I&&(-n zG-RVEvmqb=0SG_<0uX=z1Rwwb2tWV=|0FQCPVDiRCvEmz>Sj}#fjDjSW~;0GFdf{+ zQYcAEOae&+26Tsblvouwb$R5$SGdP50#wCnC7uR6LCTh zG9j^4ksq3dnGBUjRgu4SFQA2r{c!40*PZTF^4F~0uM|!CQB=C7NfZTAgmfqG#WGOj ztg^DvuG`J#X6Q#i00Izz00bZa0SG_<0uX=z1R!w40+|1g_~+u&AOHafKmY;|fB*y_ M009U<00O@PKfqO3mjD0& literal 0 HcmV?d00001 From 9adb9f1589cdb3dc061532e969bd90951c58cf7d Mon Sep 17 00:00:00 2001 From: NickX Date: Wed, 6 Jul 2022 20:57:25 +1200 Subject: [PATCH 012/113] home test connect --- database/model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/model.py b/database/model.py index b7bd49f..b8962a5 100644 --- a/database/model.py +++ b/database/model.py @@ -1,2 +1,2 @@ # Здесь прописываем модель для базы данных пользователей -1 \ No newline at end of file +12 \ No newline at end of file From 207a9d784fe0a381b1bf229674a15a946a40b0af Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 6 Jul 2022 12:53:14 +0300 Subject: [PATCH 013/113] cosmetic changes --- handlers/Test_config.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/handlers/Test_config.py b/handlers/Test_config.py index 169713b..1c8684f 100644 --- a/handlers/Test_config.py +++ b/handlers/Test_config.py @@ -1,6 +1,7 @@ from loader import bot -@bot.message_handler(content_types=['text']) + +@bot.message_handler(content_types=['text']) def get_text_messages(message): if message.text == 'Привет': bot.send_message(message.from_user.id, 'Привет, чем я могу тебе помочь?') @@ -9,12 +10,9 @@ def get_text_messages(message): # else: # bot.send_message(message.from_user.id, 'Я не понимаю. Напиши /help.') -@bot.message_handler(content_types=['new_chat_members']) +@bot.message_handler(content_types=['new_chat_members']) def handler_new_member(message): - # user_name = message.new_chat_member.first_name user_name = message.from_user.first_name bot.send_message(message.chat.id, 'Добро пожаловать, {0}'.format(user_name)) - - From 2ec01d0e6c8c61667ba0fed0fcdf2482f325bada Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 6 Jul 2022 14:14:26 +0300 Subject: [PATCH 014/113] database added --- database/model.py | 1 - database/nvn.db | Bin 0 -> 12288 bytes 2 files changed, 1 deletion(-) create mode 100644 database/nvn.db diff --git a/database/model.py b/database/model.py index b7bd49f..ed02821 100644 --- a/database/model.py +++ b/database/model.py @@ -1,2 +1 @@ # Здесь прописываем модель для базы данных пользователей -1 \ No newline at end of file diff --git a/database/nvn.db b/database/nvn.db new file mode 100644 index 0000000000000000000000000000000000000000..17dcc557f4840a3190e2904a6ba756a183abe23c GIT binary patch literal 12288 zcmeI#F;9a)6bJA-+UR8J#`-oPMHjz-S3Mgdg-Wj`Oa$>7i4;?yadFX4?m_I(E{-P6 z|0Q?iz1%y(kLfKQgQC^6dau`6OV{k2an5dt7-QV5fmyrg^5HHq&o2KfIJ=5I&&(-n zG-RVEvmqb=0SG_<0uX=z1Rwwb2tWV=|0FQCPVDiRCvEmz>Sj}#fjDjSW~;0GFdf{+ zQYcAEOae&+26Tsblvouwb$R5$SGdP50#wCnC7uR6LCTh zG9j^4ksq3dnGBUjRgu4SFQA2r{c!40*PZTF^4F~0uM|!CQB=C7NfZTAgmfqG#WGOj ztg^DvuG`J#X6Q#i00Izz00bZa0SG_<0uX=z1R!w40+|1g_~+u&AOHafKmY;|fB*y_ M009U<00O@PKfqO3mjD0& literal 0 HcmV?d00001 From e8a358ec96fa31cf651aa34d96182e1b802c16cb Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 6 Jul 2022 22:07:31 +0300 Subject: [PATCH 015/113] added Dockerfile --- Dockerfile | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ee35c3a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,4 @@ +FROM python:3.9-alpine3.16 +COPY . /app +RUN pip install -r /app/requirements.txt +CMD [ "python", "/app/main.py" ] From 86b7858e0b354ff7ea44b816ccd3ad14114de2c4 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 6 Jul 2022 22:08:24 +0300 Subject: [PATCH 016/113] added instructions for insert\select to db --- database/model.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/database/model.py b/database/model.py index ed02821..b83f479 100644 --- a/database/model.py +++ b/database/model.py @@ -1 +1,19 @@ # Здесь прописываем модель для базы данных пользователей +import sqlite3 + + + +with sqlite3.connect(('nvn.db')) as conn: + cursor = conn.cursor() + nickname = input('nickname: ') + user_name = input('user_name: ') + chat_name = input('chat_name: ') + cursor.execute(""" + INSERT INTO 'users' (nickname, user_name, chat_name) VALUES (?, ?, ?); + """, (nickname, user_name, chat_name)) + + + + cursor.execute("SELECT * FROM 'users'") + result = cursor.fetchall() + print(result) \ No newline at end of file From 345e86890da1460d7e197b3ae3a084cc7916f064 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Thu, 7 Jul 2022 09:54:58 +0300 Subject: [PATCH 017/113] put sql commands into functions --- database/commands.py | 17 +++++++++++++++++ database/model.py | 19 ------------------- 2 files changed, 17 insertions(+), 19 deletions(-) create mode 100644 database/commands.py delete mode 100644 database/model.py diff --git a/database/commands.py b/database/commands.py new file mode 100644 index 0000000..c6955eb --- /dev/null +++ b/database/commands.py @@ -0,0 +1,17 @@ +import sqlite3 + + +def insert(nickname: str, user_name: str, chat_name: str) -> None: + with sqlite3.connect(('nvn.db')) as conn: + cursor = conn.cursor() + cursor.execute(""" + INSERT INTO 'users' (nickname, user_name, chat_name) VALUES (?, ?, ?); + """, (nickname, user_name, chat_name)) + + +def select(): + with sqlite3.connect(('nvn.db')) as conn: + cursor = conn.cursor() + cursor.execute("SELECT * FROM 'users'") + result = cursor.fetchall() + return result diff --git a/database/model.py b/database/model.py deleted file mode 100644 index b83f479..0000000 --- a/database/model.py +++ /dev/null @@ -1,19 +0,0 @@ -# Здесь прописываем модель для базы данных пользователей -import sqlite3 - - - -with sqlite3.connect(('nvn.db')) as conn: - cursor = conn.cursor() - nickname = input('nickname: ') - user_name = input('user_name: ') - chat_name = input('chat_name: ') - cursor.execute(""" - INSERT INTO 'users' (nickname, user_name, chat_name) VALUES (?, ?, ?); - """, (nickname, user_name, chat_name)) - - - - cursor.execute("SELECT * FROM 'users'") - result = cursor.fetchall() - print(result) \ No newline at end of file From 1d5f4b15a37c87f56f601d4ab252abed09707593 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Thu, 7 Jul 2022 10:06:28 +0300 Subject: [PATCH 018/113] lucky_list moved from default_handlers --- handlers/__init__.py | 1 + handlers/default_heandlers/lucky_list.py | 7 ------- handlers/lucky_list.py | 13 +++++++++++++ 3 files changed, 14 insertions(+), 7 deletions(-) delete mode 100644 handlers/default_heandlers/lucky_list.py create mode 100644 handlers/lucky_list.py diff --git a/handlers/__init__.py b/handlers/__init__.py index 436b69e..1f75ce9 100644 --- a/handlers/__init__.py +++ b/handlers/__init__.py @@ -1,3 +1,4 @@ from . import default_heandlers from . import Test_config +from . import lucky_list diff --git a/handlers/default_heandlers/lucky_list.py b/handlers/default_heandlers/lucky_list.py deleted file mode 100644 index 0f11804..0000000 --- a/handlers/default_heandlers/lucky_list.py +++ /dev/null @@ -1,7 +0,0 @@ -from telebot.types import Message -from loader import bot - - -@bot.message_handler(commands=['списокЮбилейный']) -def bot_lucky_list(message: Message): - pass diff --git a/handlers/lucky_list.py b/handlers/lucky_list.py new file mode 100644 index 0000000..4a2a6e2 --- /dev/null +++ b/handlers/lucky_list.py @@ -0,0 +1,13 @@ +from telebot.types import Message +from loader import bot + + +@bot.message_handler(commands=['luckylist']) +def bot_lucky_list(message: Message): + # здесь прописываем выгрузку инфо из базы данных и ее вывод. + # По ТЗ вывод формата: + # {НазваниеГруппы} {ИмяУчастника} ({НикУчастника}), + # {порядковыйНомерВступления} {ВремяВступления} + # “Java разработчик” Василий(ника нет), + # 500 26.06.22 10: 56 + pass From 15439f0d2e070a9fc7fc5e0f9626d6e0c2148a0c Mon Sep 17 00:00:00 2001 From: Nikolay Kriuchkov Date: Fri, 8 Jul 2022 13:20:14 +1200 Subject: [PATCH 019/113] test --- database/commands.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/database/commands.py b/database/commands.py index c6955eb..df4b3d2 100644 --- a/database/commands.py +++ b/database/commands.py @@ -1,8 +1,12 @@ import sqlite3 +import os + +ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) +DB = os.path.join(ROOT_DIR, 'nvn.db') def insert(nickname: str, user_name: str, chat_name: str) -> None: - with sqlite3.connect(('nvn.db')) as conn: + with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(""" INSERT INTO 'users' (nickname, user_name, chat_name) VALUES (?, ?, ?); @@ -10,7 +14,7 @@ def insert(nickname: str, user_name: str, chat_name: str) -> None: def select(): - with sqlite3.connect(('nvn.db')) as conn: + with sqlite3.connect(( DB )) as conn: cursor = conn.cursor() cursor.execute("SELECT * FROM 'users'") result = cursor.fetchall() From ca213e9d2a79eb43668d7186acc1cd022ff1721c Mon Sep 17 00:00:00 2001 From: Nikolay Kriuchkov Date: Fri, 8 Jul 2022 13:22:49 +1200 Subject: [PATCH 020/113] database/command repair --- database/commands.py | 1 - 1 file changed, 1 deletion(-) diff --git a/database/commands.py b/database/commands.py index df4b3d2..1d06573 100644 --- a/database/commands.py +++ b/database/commands.py @@ -4,7 +4,6 @@ ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) DB = os.path.join(ROOT_DIR, 'nvn.db') - def insert(nickname: str, user_name: str, chat_name: str) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() From 0250329c7b4099b8b8f197ee9829bc04b0be428f Mon Sep 17 00:00:00 2001 From: Nikolay Kriuchkov Date: Fri, 8 Jul 2022 17:57:57 +1200 Subject: [PATCH 021/113] testing lucky_list.py lite_insert() in commands.py update nvn.db --- database/commands.py | 12 +++++++++--- database/nvn.db | Bin 12288 -> 16384 bytes handlers/lucky_list.py | 9 +++++++++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/database/commands.py b/database/commands.py index 1d06573..ff1813e 100644 --- a/database/commands.py +++ b/database/commands.py @@ -4,17 +4,23 @@ ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) DB = os.path.join(ROOT_DIR, 'nvn.db') -def insert(nickname: str, user_name: str, chat_name: str) -> None: +def insert(nickname: str, user_name: str, chat_name: str, user_number: int, dtime:str) -> None: + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(""" + INSERT INTO 'users' (nickname, user_name, chat_name, user_number, dtime_connetion) VALUES (?, ?, ?, ?,?); + """, (nickname, user_name, chat_name, user_number, dtime)) + +def insert_lite(nickname: str, user_name: str, chat_name: str) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(""" INSERT INTO 'users' (nickname, user_name, chat_name) VALUES (?, ?, ?); """, (nickname, user_name, chat_name)) - def select(): with sqlite3.connect(( DB )) as conn: cursor = conn.cursor() cursor.execute("SELECT * FROM 'users'") result = cursor.fetchall() - return result + return result \ No newline at end of file diff --git a/database/nvn.db b/database/nvn.db index 17dcc557f4840a3190e2904a6ba756a183abe23c..10cc775cded352a938f882a7d3afea16b92e3cce 100644 GIT binary patch literal 16384 zcmeI&O>fgM7zc1WO}ln<$}T8E+JxIvrv;?FaM}Sn7N&~6Y+Z&l4vVrj(*kR{H7N)L z2gavBd;?BM2nivL&rpsW`4HT(lh(A;I=BGR^tal^aUVNAt(!&5WL9ytY_h0{6}%=ZRV{Pfth0@J zsZy-(u>0l?D{fo0Qk8e8m{rSQzSnr{J1v)OS@lwNovoSoirZz2<$I^SPrc8*_l#FQ zem%(>(YW?dtic)wPB_{kj&1wh)}GrL9Nl2e&}+GNqwV`{=(T;e#(%3-s+b1z0{f}w z^Vro|t!x&n^6-Uy=P+>R=ClX&gTAstPs}Lg;P{YVUj<>e>9y_9Z5`PcHLD{mWBL{* z8H=e5UXvWv?TXls^ASG%hF>Xn$;2jMRi2tWV=5P$##AOHafKmY;|fB*z8lR$>yZoP51~H0=8MpqQxnTYOC(@>)t^fc4 delta 102 zcmZo@U~EX3AT7wqz`(!^#4x}(QO6i4sOMk93lw7FXJOzE<7e5dC@_U@G7EnYOQSj? i`{XG8d3+jai8;lonwlVG3<8@46`t@ Date: Fri, 8 Jul 2022 09:34:04 +0300 Subject: [PATCH 022/113] test database by vladimir --- .DS_Store | Bin 0 -> 6148 bytes database/commands.py | 5 ++--- database/nvn.db | Bin 12288 -> 12288 bytes handlers/Test_config.py | 33 +++++++++++++++++++++++++++++++-- nvn.db | 0 users.db | Bin 0 -> 8192 bytes 6 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 .DS_Store create mode 100644 nvn.db create mode 100644 users.db diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..57e109f18f170b8e5d52383287cbe521e0d2653a GIT binary patch literal 6148 zcmeH~!Ab)$5Qb-Jkp(Y33SROGJ$o>g^$Gd{S}S_!vW3>85PUXY!T0f>nJCs>@K!|r zf#gpnne6Tdn@L1O7tiat$V@~U6jQavh?#qIXi_Inq3UZq$ZqpEU*7lKc4VQy=(2Y| zm7VP64rTEElfih`x9w`vuMpR~U%gzsUcO!bT%+sPzs}h{edlESX(T`bBtQZra1;W_ z*=EgIC~FcR0TTEkVEaQtG0jy=sBayp{0acIW3n6CewKwMb3k*|5(*DYBNQ5;TCW%y z;qa$AFIO$05iaUa#ya)MpO+V{CuvPST{MTXCIJ#SBybYlndSc*{7R#j{KF9TNPqZuqV+eglQFvgR$F`lcIP+P_P9uDO} Mz=5zLfg=$301W^u*8l(j literal 0 HcmV?d00001 diff --git a/database/commands.py b/database/commands.py index c6955eb..3ba7928 100644 --- a/database/commands.py +++ b/database/commands.py @@ -4,9 +4,8 @@ def insert(nickname: str, user_name: str, chat_name: str) -> None: with sqlite3.connect(('nvn.db')) as conn: cursor = conn.cursor() - cursor.execute(""" - INSERT INTO 'users' (nickname, user_name, chat_name) VALUES (?, ?, ?); - """, (nickname, user_name, chat_name)) + cursor.execute(""" INSERT INTO 'users' (nickname, user_name, chat_name) + VALUES (nickname, user_name, chat_name) """) def select(): diff --git a/database/nvn.db b/database/nvn.db index 17dcc557f4840a3190e2904a6ba756a183abe23c..6fcea716eb3c7b0e7b059cb6c9ff7214aabbbf42 100644 GIT binary patch delta 18 ZcmZojXh_&7$|5j9bhD7abN)pN0suUD1>FDu delta 40 vcmZojXh;wZ4)n<^NmWS8FUn0UQ7~o@U|?iq*uWyNSwZ0e|3nA&MG67{{RInV diff --git a/handlers/Test_config.py b/handlers/Test_config.py index 1c8684f..e8e2579 100644 --- a/handlers/Test_config.py +++ b/handlers/Test_config.py @@ -1,4 +1,9 @@ +import sqlite3 + from loader import bot +from database.commands import insert +from database.commands import select + @bot.message_handler(content_types=['text']) @@ -13,6 +18,30 @@ def get_text_messages(message): @bot.message_handler(content_types=['new_chat_members']) def handler_new_member(message): - user_name = message.from_user.first_name + # user_name = message.from_user.first_name + # user_id = message.chat.id + # insert(nickname=message.from_user.username, user_name=message.from_user.first_name, chat_name=message.chat.title) + # result = select() + # print(result) + #выше черовик + connect = sqlite3.connect('users.db') + cursor = connect.cursor() + cursor.execute("""CREATE TABLE IF NOT EXISTS login_id( + id INTEGER + )""") + connect.commit() + + people_id = message.chat.id + cursor.execute(f'SELECT id FROM login_id WHERE id = {people_id}') + data = cursor.fetchone() + if data is None: + + users_list = [message.chat.id] + cursor.execute('INSERT INTO login_id VALUES (?);', users_list) + connect.commit() + + + + # bot.send_message(message.chat.id, 'Добро пожаловать, {0}'.format(user_name)) + - bot.send_message(message.chat.id, 'Добро пожаловать, {0}'.format(user_name)) diff --git a/nvn.db b/nvn.db new file mode 100644 index 0000000..e69de29 diff --git a/users.db b/users.db new file mode 100644 index 0000000000000000000000000000000000000000..3dd89a6e9fa3649686fc311814dca64bacb4bd47 GIT binary patch literal 8192 zcmeI#F$%&k6b9gzSfvOhPC6Ab>f++&WR)Ol5v&DAskBP5T9Dqsn|J{);yIih90X0p z&bkW!Paf~Rkm=hppSf`s$#r_z1)1znjTobzltg6e;<}13Js8EJd%k~*N$thh(yy2} zlRgLpAOHafKmY;|fB*y_009U<00O@WOjxC1+iaT!t0YR&O}t;mVbS@(Q;x5s@AO?I zi`!;ZeiDarH1*X`dGD)M{x>(omBd5b#Z3 Date: Fri, 8 Jul 2022 11:54:30 +0300 Subject: [PATCH 023/113] new nvn.db, test_cnfig update --- database/nvn.db | Bin 12288 -> 16384 bytes handlers/Test_config.py | 54 +++++++++++++++++++++------------------- nvn.db | 0 3 files changed, 28 insertions(+), 26 deletions(-) delete mode 100644 nvn.db diff --git a/database/nvn.db b/database/nvn.db index 17dcc557f4840a3190e2904a6ba756a183abe23c..10cc775cded352a938f882a7d3afea16b92e3cce 100644 GIT binary patch literal 16384 zcmeI&O>fgM7zc1WO}ln<$}T8E+JxIvrv;?FaM}Sn7N&~6Y+Z&l4vVrj(*kR{H7N)L z2gavBd;?BM2nivL&rpsW`4HT(lh(A;I=BGR^tal^aUVNAt(!&5WL9ytY_h0{6}%=ZRV{Pfth0@J zsZy-(u>0l?D{fo0Qk8e8m{rSQzSnr{J1v)OS@lwNovoSoirZz2<$I^SPrc8*_l#FQ zem%(>(YW?dtic)wPB_{kj&1wh)}GrL9Nl2e&}+GNqwV`{=(T;e#(%3-s+b1z0{f}w z^Vro|t!x&n^6-Uy=P+>R=ClX&gTAstPs}Lg;P{YVUj<>e>9y_9Z5`PcHLD{mWBL{* z8H=e5UXvWv?TXls^ASG%hF>Xn$;2jMRi2tWV=5P$##AOHafKmY;|fB*z8lR$>yZoP51~H0=8MpqQxnTYOC(@>)t^fc4 delta 102 zcmZo@U~EX3AT7wqz`(!^#4x}(QO6i4sOMk93lw7FXJOzE<7e5dC@_U@G7EnYOQSj? i`{XG8d3+jai8;lonwlVG3<8@46`t@ Date: Fri, 8 Jul 2022 12:40:49 +0300 Subject: [PATCH 024/113] removed spaces --- .env.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.template b/.env.template index 4d1c1fd..154bf4d 100644 --- a/.env.template +++ b/.env.template @@ -1 +1 @@ -BOT_TOKEN = "Ваш токен для бота, полученный от @BotFather" \ No newline at end of file +BOT_TOKEN="Ваш токен для бота, полученный от @BotFather" \ No newline at end of file From ccc894fed8111ae833a8c29c665b8b718d66090d Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Fri, 8 Jul 2022 12:41:21 +0300 Subject: [PATCH 025/113] added Dockerfile and instructions to build and run containers --- Dockerfile | 7 +++++ README.md | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) diff --git a/Dockerfile b/Dockerfile index ee35c3a..ac7d706 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,11 @@ +# создаем образ FROM python:3.9-alpine3.16 + +#копируем все файлы в директорию /app докер-контейнера COPY . /app + +# устанавливаем все необходимые зависимости для работы приложения RUN pip install -r /app/requirements.txt + +# запускаем приложение CMD [ "python", "/app/main.py" ] diff --git a/README.md b/README.md index 1164b0e..7d8f1c9 100644 --- a/README.md +++ b/README.md @@ -1 +1,93 @@ # tg-bot-users 🤖 + +Телеграм-бот отслеживает юбилейных пользователей группы. По умолчанию, юбилейными считаются участники, кратные 500. Эти настройки можно изменить при конфигурации бота. +При вступлении в комьюнити-группу нового, юбилейного участника бот присылает в группу модераторов уведомление с именем, ником, id пользователя, юбилейным номером и датой и временем вступления. +Помимо юбилейных, бот сохраняет двух последующих участников, так как юбилейным может вступить не пользователь, а бот или модератор. + +## Особенности + +tbc + +## Requirements + +* Python 3.9+ +* [pyTelegramBotAPI](https://github.com/python-telegram-bot/python-telegram-bot) – Python Telegram Bot API +* dotenv tbc + +Если вы планируете запускать приложение локально, то можете установить все зависимости, выполнив следующую команду: `pip install -r requirements.txt`. + +## Запуск приложения + +### Подготовка к запуску +1. Если у вас еще нет telegram-бота, создайте его с помощью @BotFather и сохраните token от бота. +2. Добавьте вашего бота во все telegram-чаты, где вы хотите, чтобы он отслеживал юбилейных участников. + +Приложение можно запустить локально либо через контейнер docker. + +### Запустить приложение локально + +1. Создать файл .env и наполнить его согласно инструкции из файла /.env.template. +2. Скачать приложение tg-bot-users в нужную директорию. +3. Сохранить файл .env в директорию приложения tg-bot-users. +4. В терминале перейти в директорию tg-bot-users. +5. Установить зависимости, выполнив в терминале следующую команду: `pip install -r requirements.txt`. +6. Запустить файл main.py + +Теперь бот запущен локально и готов к работе! + +### Запустить приложение через контейнер docker: + +#### Вариант 1: через файл .env + +1. Создать файл .env и наполнить его согласно инструкции из файла /.env.template. +2. Скачать приложение tg-bot-users в нужную директорию. +3. Сохранить файл .env в директории приложения tg-bot-users. +4. Установить и запустить docker (например, Docker Desktop). +5. В терминале перейти в директорию tg-bot-users. +6. Создать контейнер docker, введя в терминале команду: + + docker build -t telegram-bot:latest . + +где `telegram-bot` - пример названия контейнера. Можно дать другое название контейнеру. + +7. Запустить контейнер, введя в терминале команду: + + docker run --name telegram-bot --volume c:\Users\tg-bot-users\database:/app/database -d telegram-bot:latest + +где `c:\Users\tg-bot-users\database` - пример абсолютного пути до директории database внутри директории tg-bot-users. +При работе на операционной системе Windows в пути стоит писать обратный слэш, как в примере. При работе с другими операционными системами в пути стоит писать прямой слэш `/`. +Эта команда позволит не терять данные из базы данных при перезапуске приложения и контейнера. + +Теперь бот запущен и готов к работе! + +#### Вариант 2: через передачу параметров при запуске docker контейнера + +1. Скачать приложение tg-bot-users в нужную директорию. +2. Сохранить файл .env в директории приложения tg-bot-users. +3. Установить и запустить docker (например, Docker Desktop). +4. В терминале перейти в директорию tg-bot-users. +5. Создать контейнер docker, введя в терминале команду: + + docker build -t telegram-bot:latest . + +где `telegram-bot` - пример названия контейнера. Можно дать другое название контейнеру. + +6. Запустить контейнер, введя в терминале команду: + + docker run --name telegram-bot --volume c:\Users\Наташик\PycharmProjects\tg-bot-users\database:/app/database -e BOT_TOKEN=type_your_token telegram-bot:latest + +где `type_your_token` - token от вашего бота, а `c:\Users\tg-bot-users\database` - пример абсолютного пути до директории database внутри директории tg-bot-users. +При работе на операционной системе Windows в пути стоит писать обратный слэш как в примере. При работе с другими операционными системами в пути стоит писать прямой слэш `/`. +Эта команда позволит не терять данные из базы данных при перезапуске приложения и контейнера. + +Теперь бот запущен и готов к работе! + +## Команды бота + +* `/start` - запуск бота, выполняется автоматически при подключении к боту. +* `/help` - список команд и их описание +* `/luckylist` - по запросу названия группы присылать список всех зафиксированных пользователей за время работы + + + + From d8eb50ed9c5daa504b5fc038e7e6f07e65167c14 Mon Sep 17 00:00:00 2001 From: Vladimir Kireev Date: Fri, 8 Jul 2022 14:06:44 +0300 Subject: [PATCH 026/113] added count members check --- handlers/Test_config.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/handlers/Test_config.py b/handlers/Test_config.py index 6abdb84..465007c 100644 --- a/handlers/Test_config.py +++ b/handlers/Test_config.py @@ -16,14 +16,19 @@ def get_text_messages(message): # bot.send_message(message.from_user.id, 'Я не понимаю. Напиши /help.') + @bot.message_handler(content_types=['new_chat_members']) def handler_new_member(message): user_name = message.from_user.first_name - user_id = message.chat.id - insert_lite(nickname=message.from_user.username, user_name=message.from_user.first_name, chat_name=message.chat.title) - result = select() - print(result) - bot.send_message(message.chat.id, 'Добро пожаловать, {0}'.format(user_name)) + # user_id = message.chat.id я забыл зачем это было нужно + count = bot.get_chat_members_count(message.chat.id) + if count == 6: + bot.send_message(message.chat.id, 'Нас включая бота, {0}'.format(count)) + # + # insert_lite(nickname=message.from_user.username, user_name=message.from_user.first_name, chat_name=message.chat.title) + # result = select() + # print(result) + # bot.send_message(message.chat.id, 'Добро пожаловать, {0}'.format(user_name)) # connect = sqlite3.connect('users.db') From bddec5b933cfbe681e0694d9a98cd16444f7a505 Mon Sep 17 00:00:00 2001 From: Vladimir Kireev Date: Fri, 8 Jul 2022 18:34:48 +0300 Subject: [PATCH 027/113] check count members, check new member is bot --- users.db => database/.DS_Store | Bin 8192 -> 6148 bytes database/nvn.db | Bin 16384 -> 16384 bytes handlers/Test_config.py | 28 ++++++++++++++++++++++++---- 3 files changed, 24 insertions(+), 4 deletions(-) rename users.db => database/.DS_Store (65%) diff --git a/users.db b/database/.DS_Store similarity index 65% rename from users.db rename to database/.DS_Store index 3dd89a6e9fa3649686fc311814dca64bacb4bd47..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 100644 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0E@R(VFr9s30Y|JiBb&IaEMs;_Vp2|OPJVi3UVLT>jAn8U za&-)GRS0o(@^MvwiE3~uKtX1Tf~Q}ItGjCuSV$9O1q=Tx2L3<%Kls1!zd~3vSB!&& XiS@tOg=OtlOw3HYOiVz`$ixc(2L3Ym diff --git a/database/nvn.db b/database/nvn.db index 10cc775cded352a938f882a7d3afea16b92e3cce..e0d4eac7d2d2518d8c473e5fdac63b5d89ef1228 100644 GIT binary patch delta 195 zcmZo@U~Fh$oFL68I8nx#RgghXCtzdBTz*0RhYYOzI~n-D@n7dZ%YT@E=Vn0#6aL9= z@**q@3=El*2OghLNJUJR<`~NosM436Lwv3nWB%d4XaK9IPA+ygPF|ixh6TuIl$X*~WaeN{6qjdY;3!EgE-{JE%S_G&vp|GGazbCEGHO8OlAH{jAbCT$a>Ihkl8pR3UZCBK{9hUPzXI)i&Ob4Lg@u!mS$y+PeRcr= DWtl6- diff --git a/handlers/Test_config.py b/handlers/Test_config.py index 465007c..d636156 100644 --- a/handlers/Test_config.py +++ b/handlers/Test_config.py @@ -19,12 +19,32 @@ def get_text_messages(message): @bot.message_handler(content_types=['new_chat_members']) def handler_new_member(message): + nickname = message.from_user.username user_name = message.from_user.first_name - # user_id = message.chat.id я забыл зачем это было нужно + chat_id = message.chat.id count = bot.get_chat_members_count(message.chat.id) - if count == 6: - bot.send_message(message.chat.id, 'Нас включая бота, {0}'.format(count)) - # + userId = message.from_user.id + chat_name = message.chat.title + + + if not message.from_user.is_bot: # тут будут еще проверки count % 500 == 0 и проверка есть ли id нового + #пользователя в списке. Нужно создать функцию проверки в базе. + # Если она вернет None, тогда проверка пройдена + bot.send_message(message.chat.id, 'Тестируем {0} {1} {2} {3} {4} {5} '. + format(nickname, user_name, chat_id, count, userId, chat_name)) + insert_lite(nickname, user_name, chat_name) + + + + + + + + + + + + # Дальше идет кусок кода кода я сам пытался создать базу, когда Колина не работала # insert_lite(nickname=message.from_user.username, user_name=message.from_user.first_name, chat_name=message.chat.title) # result = select() # print(result) From 7850729c06152670f65bd972aef9f4a099c0ffa9 Mon Sep 17 00:00:00 2001 From: Vladimir Kireev Date: Fri, 8 Jul 2022 18:38:57 +0300 Subject: [PATCH 028/113] remove hello function from test_config --- handlers/Test_config.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/handlers/Test_config.py b/handlers/Test_config.py index d636156..4dd9b71 100644 --- a/handlers/Test_config.py +++ b/handlers/Test_config.py @@ -5,18 +5,6 @@ from database.commands import select - -@bot.message_handler(content_types=['text']) -def get_text_messages(message): - if message.text == 'Привет': - bot.send_message(message.from_user.id, 'Привет, чем я могу тебе помочь?') - elif message.text == '/help': - bot.send_message(message.from_user.id, 'Напиши привет') - # else: - # bot.send_message(message.from_user.id, 'Я не понимаю. Напиши /help.') - - - @bot.message_handler(content_types=['new_chat_members']) def handler_new_member(message): nickname = message.from_user.username From 4f7e2345e260fd261d494af6d3f1284ff26fe358 Mon Sep 17 00:00:00 2001 From: Vladimir Kireev Date: Fri, 8 Jul 2022 18:57:27 +0300 Subject: [PATCH 029/113] cosmetic changes --- handlers/Test_config.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/handlers/Test_config.py b/handlers/Test_config.py index 4dd9b71..0436f63 100644 --- a/handlers/Test_config.py +++ b/handlers/Test_config.py @@ -1,8 +1,5 @@ -import sqlite3 - from loader import bot from database.commands import insert_lite -from database.commands import select @bot.message_handler(content_types=['new_chat_members']) @@ -18,7 +15,8 @@ def handler_new_member(message): if not message.from_user.is_bot: # тут будут еще проверки count % 500 == 0 и проверка есть ли id нового #пользователя в списке. Нужно создать функцию проверки в базе. # Если она вернет None, тогда проверка пройдена - bot.send_message(message.chat.id, 'Тестируем {0} {1} {2} {3} {4} {5} '. + + bot.send_message(message.chat.id, 'Тестируем {0} {1} {2} {3} {4} {5} '. #это для проверки реакции бота на добавление format(nickname, user_name, chat_id, count, userId, chat_name)) insert_lite(nickname, user_name, chat_name) @@ -32,7 +30,10 @@ def handler_new_member(message): - # Дальше идет кусок кода кода я сам пытался создать базу, когда Колина не работала + # Дальше идет кусок кода когда я сам пытался создать базу, + # когда Колина не работала я его пока оставлю, он мне помогает думать о том как работает база + + # insert_lite(nickname=message.from_user.username, user_name=message.from_user.first_name, chat_name=message.chat.title) # result = select() # print(result) From 3ced8ec8fcdf4b9ce4116923e7b494ad9c9997a3 Mon Sep 17 00:00:00 2001 From: Vladimir Kireev Date: Fri, 8 Jul 2022 19:19:34 +0300 Subject: [PATCH 030/113] added dtime, change insert_lite and insert in Test_config.py --- database/nvn.db | Bin 16384 -> 16384 bytes handlers/Test_config.py | 10 ++++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/database/nvn.db b/database/nvn.db index e0d4eac7d2d2518d8c473e5fdac63b5d89ef1228..06373cd1f7f8e9ca77f52513932476e6128058d8 100644 GIT binary patch delta 137 zcmV;40CxX?fB}Gj0gxL35|JE31rh)*S4y#DpbroR4}<^@_7B$&%@4y5xetW15g;-T zlSUstH8TbX03#tO1Oy0nY++<;X>vI^GBQ?dVPt7-X>uS-(529@(7MpD(Sp#v(7jAw r9&}>JR-u!*A4>)S5A^^K^|KKm=MRxk1PciP0~Y~xb7gXK2BI(!$A~UP delta 132 zcmZo@U~Fh$oFL68I8nx#RgghXCtzdB0)9SL{+$f`-}tZdpXEQyzjL#of(id*H+ef# zMh4E3)Z!B3_`J;IY%nV;u`H2=fq}tDQCyypfdeFF0^~~a0tpdbUZ5Dm Date: Sat, 9 Jul 2022 11:42:30 +0300 Subject: [PATCH 031/113] created template for setting-up admin settings --- handlers/admin.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 handlers/admin.py diff --git a/handlers/admin.py b/handlers/admin.py new file mode 100644 index 0000000..48e00a8 --- /dev/null +++ b/handlers/admin.py @@ -0,0 +1,14 @@ +from telebot.types import Message +from loader import bot + + +@bot.message_handler(commands=['adminshow']) +def bot_admin_show(message: Message): + # Здесь бот выводит текущие настройки админки + pass + + +@bot.message_handler(commands=['adminsetup']) +def bot_admin_setup(message: Message): + # Здесь можно настроить админку + pass From c88ab1cf0ad07488934cb3bbc962c521b2f15ae5 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Sat, 9 Jul 2022 11:42:45 +0300 Subject: [PATCH 032/113] deleted select_lite as it is not needed --- database/commands.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/database/commands.py b/database/commands.py index f5ce35c..b5f13ad 100644 --- a/database/commands.py +++ b/database/commands.py @@ -4,6 +4,7 @@ ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) DB = os.path.join(ROOT_DIR, 'nvn.db') + def insert(nickname: str, user_name: str, chat_name: str, user_number: int, dtime:str) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() @@ -11,15 +12,10 @@ def insert(nickname: str, user_name: str, chat_name: str, user_number: int, dtim INSERT INTO 'users' (nickname, user_name, chat_name, user_number, dtime_connetion) VALUES (?, ?, ?, ?,?); """, (nickname, user_name, chat_name, user_number, dtime)) -def insert_lite(nickname: str, user_name: str, chat_name: str) -> None: - with sqlite3.connect((DB)) as conn: - cursor = conn.cursor() - cursor.execute(""" INSERT INTO 'users' (nickname, user_name, chat_name) - VALUES (nickname, user_name, chat_name) """) def select(): with sqlite3.connect(( DB )) as conn: cursor = conn.cursor() cursor.execute("SELECT * FROM 'users'") result = cursor.fetchall() - return result \ No newline at end of file + return result From b806c965087c05581a91c9c76c6e8effc9d92b18 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Sat, 9 Jul 2022 11:42:54 +0300 Subject: [PATCH 033/113] no changes --- config_data/config.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/config_data/config.py b/config_data/config.py index 8dd4f85..f352c6f 100644 --- a/config_data/config.py +++ b/config_data/config.py @@ -7,8 +7,11 @@ load_dotenv() BOT_TOKEN = os.getenv('BOT_TOKEN') + DEFAULT_COMMANDS = ( ('start', "Запустить бота"), ('help', "Вывести справку"), - ('luckylist', "Запросить юбилейный список") + ('luckylist', "Запросить юбилейный список"), + ('adminshow', "Вывести текущие настройки админки"), + ('adminsetup', "Установить настройки админки") ) From 5288db7acc6a9afc75165932448d8b30d625ab31 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Sat, 9 Jul 2022 11:43:25 +0300 Subject: [PATCH 034/113] added emoji in requirements.txt --- requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index bcb249f..ae1b308 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ pyTelegramBotAPI==4.4.0 -python-dotenv==0.19.2 \ No newline at end of file +python-dotenv==0.19.2 +emoji~=1.7.0 \ No newline at end of file From 0d6d789bf0e1f0e95830cc79bd59f81940e0df24 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Sat, 9 Jul 2022 11:43:34 +0300 Subject: [PATCH 035/113] deleted obsolete file --- database/model.py | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 database/model.py diff --git a/database/model.py b/database/model.py deleted file mode 100644 index b7bd49f..0000000 --- a/database/model.py +++ /dev/null @@ -1,2 +0,0 @@ -# Здесь прописываем модель для базы данных пользователей -1 \ No newline at end of file From ce0ed8aa0fb1ed8c12c81691291ced84df8da8cd Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Sat, 9 Jul 2022 11:43:55 +0300 Subject: [PATCH 036/113] no changes --- handlers/lucky_list.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/handlers/lucky_list.py b/handlers/lucky_list.py index 8706061..c97ac41 100644 --- a/handlers/lucky_list.py +++ b/handlers/lucky_list.py @@ -3,6 +3,7 @@ import database.commands as usersbase import emoji + winners = usersbase.select() colomns =['Название группы', 'Имя участника', 'Ник участника', 'Порядковый номер вступления', 'Время вступления'] # print(emoji.emojize('Python is :thumbs_up:')) @@ -11,6 +12,7 @@ print(emoji.emojize(f':party popper:{winner[3]} :person raising hand:{winner[2]} ({winner[1]}),' f' \n : input numbers:{winner[4]} :one o’clock:{winner[5]}')) + @bot.message_handler(commands=['luckylist']) def bot_lucky_list(message: Message): # здесь прописываем выгрузку инфо из базы данных и ее вывод. From 2b52844fc46f69adfe73182160a619dffff29914 Mon Sep 17 00:00:00 2001 From: NickX Date: Sun, 10 Jul 2022 23:54:59 +1200 Subject: [PATCH 037/113] nvn v2.db + new func in commands + lucky_list.py mod --- database/commands.py | 31 ++++++++++++++++++++++++++++--- database/nvn v2.db | Bin 0 -> 20480 bytes database/nvn.db | Bin 16384 -> 20480 bytes handlers/lucky_list.py | 13 +++++-------- 4 files changed, 33 insertions(+), 11 deletions(-) create mode 100644 database/nvn v2.db diff --git a/database/commands.py b/database/commands.py index b5f13ad..3e4b61f 100644 --- a/database/commands.py +++ b/database/commands.py @@ -1,17 +1,24 @@ import sqlite3 import os +import datetime ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) -DB = os.path.join(ROOT_DIR, 'nvn.db') +DB = os.path.join(ROOT_DIR, 'nvn v2.db') +MODERATOR_ID = '1230' - -def insert(nickname: str, user_name: str, chat_name: str, user_number: int, dtime:str) -> None: +def insert(nickname: str, user_name: str, chat_name: str, user_number: int, dtime:datetime) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(""" INSERT INTO 'users' (nickname, user_name, chat_name, user_number, dtime_connetion) VALUES (?, ?, ?, ?,?); """, (nickname, user_name, chat_name, user_number, dtime)) +def insert2(nickname: str, user_name: str, chat_id: str, user_number: int, dtime:datetime) -> None: + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(""" + INSERT INTO 'users' (nickname, user_name, chat_id, user_number, dtime_connetion) VALUES (?, ?, ?, ?,?); + """, (nickname, user_name, chat_id, user_number, dtime)) def select(): with sqlite3.connect(( DB )) as conn: @@ -19,3 +26,21 @@ def select(): cursor.execute("SELECT * FROM 'users'") result = cursor.fetchall() return result + +def select2(): + with sqlite3.connect(( DB )) as conn: + cursor = conn.cursor() + cursor.execute(f"""SELECT group_name, user_name, nickname, user_number, dtime_connetion + FROM 'users' JOIN 'user_groups' + ON moderator_id = {MODERATOR_ID} AND chat_id = group_id;""") + result = cursor.fetchall() + return result +# insert2('katy11', 'katy_p',123,1236,datetime.datetime.now()) +# # {НазваниеГруппы} {ИмяУчастника} ({НикУчастника}), +# # {порядковыйНомерВступления} {ВремяВступления} +# # “Java разработчик” Василий(ника нет), +# # 500 26.06.22 10: 56 +# vibo = select2() +# for i in vibo: +# print(i) +# print(datetime.datetime.now()) \ No newline at end of file diff --git a/database/nvn v2.db b/database/nvn v2.db new file mode 100644 index 0000000000000000000000000000000000000000..cb244ccd5ec970a84d43f7965d76084decdf2ede GIT binary patch literal 20480 zcmeI3OKjXk7{_O9Z{iefr$VZ>={9tlN+nUZmLFs9+La0mU8xm0T9y4~bZ2Dj=1W2tuC-yx5 zp6~n3IFcuy7havI2R=R9?lda_wa^}fF?x|wgwP3oCbmw@Q-_}lKerE2H|RKlw7IvE zyE8~mPRm3gL2^1dJxB!YKmZ5;0U!VbfB+Bx0zd!=Jc$Iz5?)B9Quv)0f=adFuXX)S zH@rwM&lmEg0xjiVnkmq*icZvPbgEb?oGQ%IGxJlkT>Q2WUrqc2aejW8o-QoY{9ny1Efh-`+N!TyXjPg%T`0{@6;IKVg;(;6GbK8{`PJr)%`Y}TqdfEZw^ztA-WwWT z*&3TyC_5@1^5k-PY&h&O_WzqZo(UP2`&`?uS!-7P&NkN!tp)X_UtVdqT7FP(x9CYe z3#F;qLWb76KG^ssxe!CxJ_!CI}}E(d;dwfuM0 zi5)Zk812L^N}~ZYJlC77;^M3*i)9kIxTB)yq3H9Ve_K8KofF;qT-!ByMjA>TJ&Kq6 z%rAHSi)(&s#g7c_73D{G(QBL#_%mEN89l4%)ZxSU3h6C}p|PQ`;qpj&STtRZMhxA0 zz0+P>4WEs2lvQ?&)YpejgdO@Oh8E{aw757klc7;l-!kZHYqo2CrxLU~ebUJ!w`iCg zK;&m~n|w;%BX5#9a^RVTI6qI~UnH;@2mk>f00e*l5C8%|00{i+1mxSJqf#E>3zcBq zFvPXIs(fearg==y9y4@mTAsx`!_rJgcWr9}A^H6n62mid8ndme=?KY6EQxMtj;`yD zEhKsjiS98=GaT16g+%&ou*A%H%+YkyF?3;=bSH+y_6%1uTwBjEA^9MN#PXP{nWo8f zLr7{dB)VsEiEHUbPDqTw62tXOU9${kxjL8N-(yI!9?NN2W;$8nKK?p}gn2gOhB>Yw z+{YirkeHsG(+rDigfG}1EYZ0ywq{v6b3?<-7?P~V7mS%@Ia4f4^v56xx61NtS96%| zhQ!b}@g%0^*pB50U(iP}Bzz#IG3HuK_=3*HlJI$Pa;{;CsYKQwiQzHkS+=I@j2Zfd zF|48(68^l{8gmUJXKp+{q@u%z6h)OTH7d0W^^VIQqa~iLH|rgGdZzqbP`$PEvD`={ zRFq1|NR>M6YCEX5tJQVqhZ}NZR8i5`UKx!@XFGnawr)EjeeLRX`CeM)nu9`9ZFgP0 zySD0gc&=OclA!zhBo(E_4e@!tx#QSOBEo9Nmdd;kN3wc~paZ*vFlq5HV$UJf_DTl>- zqG%ksMkGZ_OX&XUdT_4YGL^f#v4YdmMpQPGyW13a{QoWT3AsiBGEMeu*Fp*efB+Bx z0zd!=00AHX1b_e#00KbZ=_HUFR&f~fpB{ev*E{?>fxe*st#|2(Ar(iV|3d>}|M&6T xfhhJr@j&qZe!eFV1^+7#MgJe*8v;@Ezx;^s|53gb5QYCs55@muRefyy|DUn~-+TZ7 literal 0 HcmV?d00001 diff --git a/database/nvn.db b/database/nvn.db index 06373cd1f7f8e9ca77f52513932476e6128058d8..dbb23a0264c9cb6c7d99f55f881cab241d6c45f4 100644 GIT binary patch delta 552 zcmYk2!Al!K6vp2qv+K_2_@Y?$ki$;M#nj-TS_yh6Dx(M*VG{(AqA><7Y9mPmDTQvT zXHnLRH~)wH1s=S#Ab2SBQYhY(UhCP}brc64^L^iZydO*ukl=!xr2AX|u*@X%oj%Qv zym4W8@vG=fLqZe)sVIm7Zg(=N`)-a)q~y9TIs6c=;YehI$R1hRE{B&reDxp)`)JR5I@;Obi#Iw}G GF@Q&}0CUv< delta 483 zcmZozz}V2hI6+!ah=GBD1&SGgH19+mV__i%y>KsH-arN>o;U`67M?hsxXp?JZ@5_+ z3pm&(C-GQLzQL0)`6{oSl9Ru`kE^4ff{Ux0W2jGvf<{_mPI0QHCVv>?W^rq4#wORv zHheOZ9r@Pt`-S>)0mT_^ii?XgHgiwT;4uaoqc&NBR{>;{1iDdd9Be@MFfdGJ;ZL7j z%%cHQY#rq3=dPoWSsY)UnU`9mfT52aqK}vVAp;wK3j_Z*{_Ff_`498&jO!7LD=kercN!Ya!GQX|U9z{vsQ#5VuGn*0tp(y)M%F&!4)ydGIDT2oDUK+gsCYpET}BW$j<`+KbUuF diff --git a/handlers/lucky_list.py b/handlers/lucky_list.py index c97ac41..5b77b1e 100644 --- a/handlers/lucky_list.py +++ b/handlers/lucky_list.py @@ -4,17 +4,14 @@ import emoji -winners = usersbase.select() -colomns =['Название группы', 'Имя участника', 'Ник участника', 'Порядковый номер вступления', 'Время вступления'] -# print(emoji.emojize('Python is :thumbs_up:')) - -for winner in winners: - print(emoji.emojize(f':party popper:{winner[3]} :person raising hand:{winner[2]} ({winner[1]}),' - f' \n : input numbers:{winner[4]} :one o’clock:{winner[5]}')) - +winners = usersbase.select2() @bot.message_handler(commands=['luckylist']) def bot_lucky_list(message: Message): + for winner in winners: + bot.send_message(chat_id=message.chat.id, text=emoji.emojize(f'\U0001F389 {winner[0]} \U0001F464{winner[1]} ({winner[2]}),' + f' \n \U0001F522{winner[3]} \U0001F550 {winner[4]}')) + # здесь прописываем выгрузку инфо из базы данных и ее вывод. # По ТЗ вывод формата: # {НазваниеГруппы} {ИмяУчастника} ({НикУчастника}), From 4247fca6fcb9b467f5522a074d08a286565194e4 Mon Sep 17 00:00:00 2001 From: Nikolay Kriuchkov Date: Mon, 11 Jul 2022 17:55:21 +1200 Subject: [PATCH 038/113] testing lucky_list.py update nvn.db --- database/commands.py | 30 ++++++++++++++++++++---------- database/nvn v2.db | Bin 20480 -> 20480 bytes handlers/lucky_list.py | 24 ++++++++++++------------ 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/database/commands.py b/database/commands.py index 3e4b61f..3ce1761 100644 --- a/database/commands.py +++ b/database/commands.py @@ -2,11 +2,12 @@ import os import datetime + ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) DB = os.path.join(ROOT_DIR, 'nvn v2.db') -MODERATOR_ID = '1230' - -def insert(nickname: str, user_name: str, chat_name: str, user_number: int, dtime:datetime) -> None: +MODERATOR_ID = '' +print(MODERATOR_ID, 'before') +def insert(nickname: str, user_name: str, chat_name: str, user_number: int, dtime=datetime.datetime.now().isoformat()) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(""" @@ -27,20 +28,29 @@ def select(): result = cursor.fetchall() return result -def select2(): +def select_lucky(): with sqlite3.connect(( DB )) as conn: cursor = conn.cursor() + print(MODERATOR_ID, 'select1') cursor.execute(f"""SELECT group_name, user_name, nickname, user_number, dtime_connetion FROM 'users' JOIN 'user_groups' - ON moderator_id = {MODERATOR_ID} AND chat_id = group_id;""") - result = cursor.fetchall() - return result + ON chat_id = group_id + WHERE moderator_id = {MODERATOR_ID};""") + print(MODERATOR_ID, 'select2') + result = cursor.fetchall() + print(result) + return result + +# print(select_lucky()) +print(MODERATOR_ID, 'after') +# print(select_lucky()) # insert2('katy11', 'katy_p',123,1236,datetime.datetime.now()) # # {НазваниеГруппы} {ИмяУчастника} ({НикУчастника}), # # {порядковыйНомерВступления} {ВремяВступления} # # “Java разработчик” Василий(ника нет), # # 500 26.06.22 10: 56 -# vibo = select2() +# vibo = select_date() # for i in vibo: -# print(i) -# print(datetime.datetime.now()) \ No newline at end of file +# dt = datetime.datetime.strptime(i[0], '%Y-%m-%d %H:%M:%S.%f') +# print(dt.strftime('%d.%m.%y %H:%M')) + diff --git a/database/nvn v2.db b/database/nvn v2.db index cb244ccd5ec970a84d43f7965d76084decdf2ede..a6f9da1f6c9aec18fbe2a8311392b1e60bc66d2b 100644 GIT binary patch delta 533 zcmZozz}T>Wae_3X^F$eEM(2$QOZf%)syX?d@}J>b$3KOynm>qNX0n2S%wz)ruFW?a5Ohx%g`6WsDNlBGv*LN5h7#ZmrnCluEC>R-9nHX4^nCh8W8X8&{ zG3S^v1GUJ5v?S#hTN)IX7NiydS;elq`EhGwcxB4K!5}Tm?8wQOmzkVxW?>1U)beu@ zi-oSWNELH-me$UP_=s#2y9moe8IZbE zD9BScRH<7Rlm)31BMV}JfuTb;rv3-u7g+AO=XZKecZa9s@RW=UvU*bfNLJ52|H3y| z2K{kL5&(}>9A0`DXRXNW$O(PH6lV9}-0lLmW&|wrr zNe~4=>fN5R!Fw)X{vCtYv_I^1yQ%9b-8>qxJA)M&Q)PlEZd&n|z230s;*CED_j6Q$ zp%#*zC=5MUDoJ6KW(E|K`C=mpw>!JV)rE-NXyC_hZ@!HmOsZk=1IG)%|M(ZL@nWo5 z-?2-ox=BE=q!%ahlgd7Is#H2#e!>>1ATyj(owC7>zwg(Vk7wAEy;Ig+K1Rx^LE(Nc WO}3)2&aX;@6N6^Y-sV?7*R@AC&}lmW diff --git a/handlers/lucky_list.py b/handlers/lucky_list.py index 5b77b1e..cec28cf 100644 --- a/handlers/lucky_list.py +++ b/handlers/lucky_list.py @@ -2,20 +2,20 @@ from loader import bot import database.commands as usersbase import emoji +import datetime +# usersbase.MODERATOR_ID = 1 - -winners = usersbase.select2() - +winners = usersbase.select_lucky() @bot.message_handler(commands=['luckylist']) def bot_lucky_list(message: Message): + usersbase.MODERATOR_ID = message.chat.id + # winners = usersbase.select_lucky() + print(winners) for winner in winners: - bot.send_message(chat_id=message.chat.id, text=emoji.emojize(f'\U0001F389 {winner[0]} \U0001F464{winner[1]} ({winner[2]}),' - f' \n \U0001F522{winner[3]} \U0001F550 {winner[4]}')) + dtime = datetime.datetime.strptime(winner[4], '%Y-%m-%d %H:%M:%S.%f').strftime('%d.%m.%y %H:%M') + + bot.send_message(chat_id=message.chat.id, text=emoji.emojize(f'\U0001F389 "{winner[0]}" \U0001F464 {winner[1]} (@{winner[2]}),' + f'\n\U0001F522 {winner[3]} \U0001F550 {dtime}')) + print(usersbase.MODERATOR_ID, 'luck') + - # здесь прописываем выгрузку инфо из базы данных и ее вывод. - # По ТЗ вывод формата: - # {НазваниеГруппы} {ИмяУчастника} ({НикУчастника}), - # {порядковыйНомерВступления} {ВремяВступления} - # “Java разработчик” Василий(ника нет), - # 500 26.06.22 10: 56 - pass From b8262ad283bde8248792f9f4238b822ae5f01d4b Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Mon, 11 Jul 2022 12:02:03 +0300 Subject: [PATCH 039/113] added abs func to fix issue --- database/commands.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/database/commands.py b/database/commands.py index 3ce1761..8d4312a 100644 --- a/database/commands.py +++ b/database/commands.py @@ -34,8 +34,7 @@ def select_lucky(): print(MODERATOR_ID, 'select1') cursor.execute(f"""SELECT group_name, user_name, nickname, user_number, dtime_connetion FROM 'users' JOIN 'user_groups' - ON chat_id = group_id - WHERE moderator_id = {MODERATOR_ID};""") + ON chat_id = group_id AND moderator_id = abs({MODERATOR_ID});""") print(MODERATOR_ID, 'select2') result = cursor.fetchall() print(result) From ddc489a89efff2e38f8c70546a2368549aa70378 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Mon, 11 Jul 2022 12:02:25 +0300 Subject: [PATCH 040/113] removed emoji, moved winners call --- handlers/lucky_list.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/handlers/lucky_list.py b/handlers/lucky_list.py index cec28cf..2635654 100644 --- a/handlers/lucky_list.py +++ b/handlers/lucky_list.py @@ -1,21 +1,20 @@ from telebot.types import Message from loader import bot import database.commands as usersbase -import emoji import datetime # usersbase.MODERATOR_ID = 1 -winners = usersbase.select_lucky() +# winners = usersbase.select_lucky() @bot.message_handler(commands=['luckylist']) def bot_lucky_list(message: Message): usersbase.MODERATOR_ID = message.chat.id - # winners = usersbase.select_lucky() + winners = usersbase.select_lucky() print(winners) for winner in winners: dtime = datetime.datetime.strptime(winner[4], '%Y-%m-%d %H:%M:%S.%f').strftime('%d.%m.%y %H:%M') - bot.send_message(chat_id=message.chat.id, text=emoji.emojize(f'\U0001F389 "{winner[0]}" \U0001F464 {winner[1]} (@{winner[2]}),' - f'\n\U0001F522 {winner[3]} \U0001F550 {dtime}')) + bot.send_message(chat_id=message.chat.id, text=f'\U0001F389 "{winner[0]}" \U0001F464 {winner[1]} ' + f'(@{winner[2]})\n\U0001F522 {winner[3]} \U0001F550 {dtime}') print(usersbase.MODERATOR_ID, 'luck') From 042aaa9ff3853976c9a135d605afe8af50c58c15 Mon Sep 17 00:00:00 2001 From: Vladimir Kireev Date: Mon, 11 Jul 2022 15:01:56 +0300 Subject: [PATCH 041/113] delete insert_lite, rename test_config.py to register_new_user.py, added winner_check in commands.py --- database/commands.py | 18 ++++++------ database/nvn.db | Bin 16384 -> 20480 bytes handlers/__init__.py | 2 +- handlers/lucky_list.py | 7 +++-- .../{Test_config.py => register_new_user.py} | 27 ++++++++++++++---- 5 files changed, 36 insertions(+), 18 deletions(-) rename handlers/{Test_config.py => register_new_user.py} (56%) diff --git a/database/commands.py b/database/commands.py index f5ce35c..71c668d 100644 --- a/database/commands.py +++ b/database/commands.py @@ -4,22 +4,24 @@ ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) DB = os.path.join(ROOT_DIR, 'nvn.db') -def insert(nickname: str, user_name: str, chat_name: str, user_number: int, dtime:str) -> None: +def insert(nickname: str, user_name: str, user_number: int, dtime:str, chat_id: int, is_winer: int) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(""" - INSERT INTO 'users' (nickname, user_name, chat_name, user_number, dtime_connetion) VALUES (?, ?, ?, ?,?); - """, (nickname, user_name, chat_name, user_number, dtime)) + INSERT INTO 'users' (nickname, user_name, user_number, dtime_connetion, chat_id, is_winer) VALUES (?, ?, ?, ?, ?,?); + """, (nickname, user_name, user_number, dtime, chat_id, is_winer)) -def insert_lite(nickname: str, user_name: str, chat_name: str) -> None: - with sqlite3.connect((DB)) as conn: - cursor = conn.cursor() - cursor.execute(""" INSERT INTO 'users' (nickname, user_name, chat_name) - VALUES (nickname, user_name, chat_name) """) def select(): with sqlite3.connect(( DB )) as conn: cursor = conn.cursor() cursor.execute("SELECT * FROM 'users'") result = cursor.fetchall() + return result + +def winner_check(id): + with sqlite3.connect(( DB )) as conn: + cursor = conn.cursor() + cursor.execute(f"SELECT is_winer FROM users WHERE is_winer={id}") + result = cursor.fetchall() return result \ No newline at end of file diff --git a/database/nvn.db b/database/nvn.db index 06373cd1f7f8e9ca77f52513932476e6128058d8..da96145a0be37bd8e76a42a2eeb5e6b356e43591 100644 GIT binary patch literal 20480 zcmeI3OKclO7{_NHb~Y{RsVapfxNe42NQvq$`|{emJ%FL6%F8W@69^Z}j<>B_KT>;B z6y?&EO1+_;cpSNK;Dm&bDiA8%%Ht3a0;C=|aB3wE95^8!GwZ}zml9iuf?9o>?C$uR z??3Z>znQh<)y%>RvsK?Cr<$#L$tNb-hd2&BLkL1>hMtkFlcRT=o+3TB4`%Ck%pmo} zX*rfef;=r?5&QDAJl#(O^*{g!00AHX1b_e#00KY&2t0@c@DjJ6C<^!L(|)O3^VZs4 zs~ueU=jLsM?wmiehF}F}^dnQlvQRVPqZaEZw zvF)8-^BOB&C(!Ok;T~CZD<>HKBvnp!p4GT==n!`qcc()%5e+IX4abLA)um34L0YF< z&9&9w*(i33Voy&YA2Ja*ga(G>PZUUgadtLII#r=*5UQ&;D_*PQH(Md;q>Kw_PmDYn zyNx$v@8h>(7x7DYEOtJ2I!5*`?Ed#4ej`E5KmZ5;0U!VbfB+Bx0zlwjCm?(_I?87e zcdq2G>pHs@SH*7(%`lE==_9&E4AV6&S2tC|)|`~NfspX}0219bGOCp_(}v9?D+5V1 zU9~k$vr|l>4It56%T#sSF$^Z*f9o$XGOlH-nqli23ylAK07=T#9aVQyTE=3MHwKWH zuH~qPVOW~ZB$WXqnrl#rV`_SaN%Z~_-Ej>~HFe8$G%DeKA3&0Jt&Ezs3_H!z=e`&~ zV!0`c24*`tOP_ml0EywIGOBJ;4aw2%jNZMgY-esU5n1glxjJ;o-qQ6CQ!*3la!ln zM{BRGdM#RN?=I7kgyIP~J1n!;3UIaO>ZKDoQ9Z!s0#E@+y_}l+Esabt+HO40xWU?|AH##csP0m1(dX{sqy0IDh~U z00KY&2mk>f00e*l5C8%|00;nqhl#*2Cn#L7=q4fKFOi6EAp8UV8Q;KPf00e-*{Uk6Rk+>(6F%C%)wnHLSWQz@g61xPu4tmiRT_}m;f`mUs`{Uxq>bifX+0Z9{{bUaRgbpeZ;TH4I(e0;}_X;Af$XfXF@AHYM#L=A+qQpn< zx#XX1hA7`$dRwSHM&Ax7ihv|Ova{*I{_eU^dz`)#NQ?+*m>0vV{$IXwO}KSHpsF#Z r5_fshZp{%YwH_vPLkpY+9-F|&WHWqUfuW;1y;)> delta 629 zcmZozz}V2hI6+!ah=GBD1&SGgH19+mV__i%y>KsH-arN>o;U`67M?hsxXpqJZ@5_+ z3pm&(C-GQLzQJQZ`53P#OL9hH$>g)VZc0x6{ywgbehMzGZjPZoAqpC4i8;lonwtD! zjGM)+tr?qKC;RfrOb+4`XJnb2#TN|Gxq;7t-!Igc3#g3YrntB`V>9>U3?5^k@oEw} z3Z=!VMe%uwxv2`lAwiyg?m7xE>m<;vW8+{0I-Y@HG7Enw`znx0O}a3XqH&poYIbIE ze0gSGYLNnl+3XOrdHEkQu<^Gr@PFgK&VQEwF#k^e7GSU#@yi)2ipw)HaF(PNml((A zWhQ5r$biB$6D-UzIniFS9>{f56c;sS<6ux$)MR1dD9cGq$<8dYv@|jb12QvnGm8|w zFD$*V;li#98!k3o*mq&CPrO`7(uuHz9IPA+ygZ_BUjCWpWl2VU9sqQ1n~wkh diff --git a/handlers/__init__.py b/handlers/__init__.py index 1f75ce9..f673067 100644 --- a/handlers/__init__.py +++ b/handlers/__init__.py @@ -1,4 +1,4 @@ from . import default_heandlers -from . import Test_config +from . import register_new_user from . import lucky_list diff --git a/handlers/lucky_list.py b/handlers/lucky_list.py index 8706061..26523c1 100644 --- a/handlers/lucky_list.py +++ b/handlers/lucky_list.py @@ -7,12 +7,13 @@ colomns =['Название группы', 'Имя участника', 'Ник участника', 'Порядковый номер вступления', 'Время вступления'] # print(emoji.emojize('Python is :thumbs_up:')) -for winner in winners: - print(emoji.emojize(f':party popper:{winner[3]} :person raising hand:{winner[2]} ({winner[1]}),' - f' \n : input numbers:{winner[4]} :one o’clock:{winner[5]}')) + @bot.message_handler(commands=['luckylist']) def bot_lucky_list(message: Message): + for winner in winners: + print(emoji.emojize(f':party popper:{winner[3]} :person raising hand:{winner[2]} ({winner[1]}),' + f' \n : input numbers:{winner[4]} :one o’clock:{winner[5]}')) # здесь прописываем выгрузку инфо из базы данных и ее вывод. # По ТЗ вывод формата: # {НазваниеГруппы} {ИмяУчастника} ({НикУчастника}), diff --git a/handlers/Test_config.py b/handlers/register_new_user.py similarity index 56% rename from handlers/Test_config.py rename to handlers/register_new_user.py index 06d1d43..f636fa8 100644 --- a/handlers/Test_config.py +++ b/handlers/register_new_user.py @@ -1,5 +1,8 @@ from loader import bot from database.commands import insert +import datetime +from database.commands import winner_check + @bot.message_handler(content_types=['new_chat_members']) @@ -10,17 +13,29 @@ def handler_new_member(message): count = bot.get_chat_members_count(message.chat.id) user_number = message.from_user.id chat_name = message.chat.title - dtime_connetion = message.date + # dtime_connetion = message.date + dtime_connetion = datetime.datetime.now() + + # + # if not winner_check(user_number): + # bot.send_message(message.chat.id, f'Нет в is_winner {winner_check(user_number)}') + # else: + # bot.send_message(message.chat.id, f'Уже побеждал {winner_check(user_number)}') - if not message.from_user.is_bot: # тут будут еще проверки count % 500 == 0 и проверка есть ли id нового - #пользователя в списке. Нужно создать функцию проверки в базе. + if not message.from_user.is_bot and not winner_check(user_number): # тут будут еще проверки count % 500 == 0 и проверка есть ли id нового + # пользователя в списке. Нужно создать функцию проверки в базе. # Если она вернет None, тогда проверка пройдена - bot.send_message(message.chat.id, 'Тестируем {0} {1} {2} {3} {4} {5} '. #это для проверки реакции бота на добавление - format(nickname, user_name, chat_id, count, user_number, chat_name)) - insert(nickname, user_name, chat_name, user_number, dtime_connetion) + bot.send_message(message.chat.id, 'Не бот и отсутствует в списке победителей') + insert( + nickname=message.from_user.username, user_name=message.from_user.first_name, + user_number=message.from_user.id, dtime=datetime.datetime.now(), + chat_id=message.chat.id, is_winer=message.from_user.id + ) + else: + bot.send_message(message.chat.id, f'Есть в списке победителей{winner_check(user_number)}') From 0db44a1478c7533b089d47638d329c01f0a83cdd Mon Sep 17 00:00:00 2001 From: Vladimir Kireev Date: Mon, 11 Jul 2022 16:06:46 +0300 Subject: [PATCH 042/113] cosmetic changes --- handlers/register_new_user.py | 62 ++--------------------------------- 1 file changed, 2 insertions(+), 60 deletions(-) diff --git a/handlers/register_new_user.py b/handlers/register_new_user.py index f636fa8..98e92c9 100644 --- a/handlers/register_new_user.py +++ b/handlers/register_new_user.py @@ -7,26 +7,10 @@ @bot.message_handler(content_types=['new_chat_members']) def handler_new_member(message): - nickname = message.from_user.username - user_name = message.from_user.first_name - chat_id = message.chat.id count = bot.get_chat_members_count(message.chat.id) user_number = message.from_user.id - chat_name = message.chat.title - # dtime_connetion = message.date - dtime_connetion = datetime.datetime.now() - # - # if not winner_check(user_number): - # bot.send_message(message.chat.id, f'Нет в is_winner {winner_check(user_number)}') - # else: - # bot.send_message(message.chat.id, f'Уже побеждал {winner_check(user_number)}') - - - - if not message.from_user.is_bot and not winner_check(user_number): # тут будут еще проверки count % 500 == 0 и проверка есть ли id нового - # пользователя в списке. Нужно создать функцию проверки в базе. - # Если она вернет None, тогда проверка пройдена + if not message.from_user.is_bot and not winner_check(user_number): # тут будет еще проверка count % 500 == 0 bot.send_message(message.chat.id, 'Не бот и отсутствует в списке победителей') insert( @@ -35,46 +19,4 @@ def handler_new_member(message): chat_id=message.chat.id, is_winer=message.from_user.id ) else: - bot.send_message(message.chat.id, f'Есть в списке победителей{winner_check(user_number)}') - - - - - - - - - - - - # Дальше идет кусок кода когда я сам пытался создать базу, - # когда Колина не работала я его пока оставлю, он мне помогает думать о том как работает база - - - # insert_lite(nickname=message.from_user.username, user_name=message.from_user.first_name, chat_name=message.chat.title) - # result = select() - # print(result) - # bot.send_message(message.chat.id, 'Добро пожаловать, {0}'.format(user_name)) - - - # connect = sqlite3.connect('users.db') - # cursor = connect.cursor() - # cursor.execute("""CREATE TABLE IF NOT EXISTS login_id( - # id INTEGER - # )""") - # connect.commit() - # - # people_id = message.chat.id - # cursor.execute(f'SELECT id FROM login_id WHERE id = {people_id}') - # data = cursor.fetchone() - # if data is None: - # - # users_list = [message.chat.id] - # cursor.execute('INSERT INTO login_id VALUES (?);', users_list) - # connect.commit() - - - - - - + bot.send_message(message.chat.id, f'Есть в списке победителей{winner_check(user_number)}') \ No newline at end of file From a1ed759ed3cec5aaddabe3e28ece93660e85639c Mon Sep 17 00:00:00 2001 From: Vladimir Kireev Date: Mon, 11 Jul 2022 17:33:33 +0300 Subject: [PATCH 043/113] buttons added ver1 --- database/nvn.db | Bin 20480 -> 20480 bytes handlers/register_new_user.py | 39 ++++++++++++++++++++++++++++------ 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/database/nvn.db b/database/nvn.db index da96145a0be37bd8e76a42a2eeb5e6b356e43591..52af3cd24100d31a76fa0af6daffe1e7cb21c7ad 100644 GIT binary patch delta 136 zcmZozz}T>Wae_3X&qNt#Rv!jEoq&xgi}=N2Rry}>U*Ox!Ka;P4KZ0MLuaGaDFLttm zfXrkA0hY}+0#A6|`9m1ol@(bWSy;<}OdDP>6UZ_GVm)47UZ8}Lfsv7}fw``sp@N}_ bm8m&UMg)ijczHQwIT(OyfM9dF+)P6N%ViuZ delta 136 zcmZozz}T>Wae_3X_e2?IR&NHqaIcLii}=M9RQX==U*Ox!Ka;P4KZ0MLuaGaDPhqlx zfXrkA0hY}+0#A6|U1d2KloeSVSy;<*5>v7>i!3dT48wrT%-qZ(1#h2txe_A-BO_e{ mb6rD21w#`nQ*$dLV?85tOEUv=knDf43(MNAHmA$YGz0+rHYOwh diff --git a/handlers/register_new_user.py b/handlers/register_new_user.py index 98e92c9..ac8ea61 100644 --- a/handlers/register_new_user.py +++ b/handlers/register_new_user.py @@ -2,6 +2,16 @@ from database.commands import insert import datetime from database.commands import winner_check +from telebot import types + +# def redirekt_winner_info(user_name, user_id): +# markup = types.InlineKeyboardMarkup() +# congratulations = types.InlineKeyboardButton(text='Поздравляем', callback_data='yes') +# shame = types.InlineKeyboardButton(text='Не повезло', callback_data='no') +# markup_inline.add(congratulations, shame) +# bot.send_message(message.chat.id, f'Желаете поздравить пользователя {user_name}?', +# reply_markup=markup_inline +# ) @@ -9,14 +19,29 @@ def handler_new_member(message): count = bot.get_chat_members_count(message.chat.id) user_number = message.from_user.id + markup = types.InlineKeyboardMarkup(row_width=1) + congratulations = types.InlineKeyboardButton(text='Поздравляем', callback_data='grac') + shame = types.InlineKeyboardButton(text='Не поздравляем', callback_data='decline') + markup.add(congratulations, shame) + if not message.from_user.is_bot and not winner_check(user_number): # тут будет еще проверка count % 500 == 0 - bot.send_message(message.chat.id, 'Не бот и отсутствует в списке победителей') - insert( - nickname=message.from_user.username, user_name=message.from_user.first_name, - user_number=message.from_user.id, dtime=datetime.datetime.now(), - chat_id=message.chat.id, is_winer=message.from_user.id - ) + bot.send_message(message.chat.id, 'Не бот и отсутствует в списке победителей. Что с ним делать?', + reply_markup=markup) + else: - bot.send_message(message.chat.id, f'Есть в списке победителей{winner_check(user_number)}') \ No newline at end of file + bot.send_message(message.chat.id, f'Есть в списке победителей{winner_check(user_number)}') + +@bot.callback_query_handler(func=lambda call: True) +def callback(call): + if call.message: + if call.data == 'grac': + bot.send_message(call.message.chat.id, 'Поздравили и добавили в базу') + insert( + nickname=call.from_user.username, user_name=call.from_user.first_name, + user_number=call.from_user.id, dtime=datetime.datetime.now(), + chat_id=call.chat.id, is_winer=call.from_user.id + ) + else: + bot.send_message(call.message.chat.id, 'Ничего не делали, так как не победитель') From d70cb4cbd3a02257165059c83819f04e0716dfd3 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Mon, 11 Jul 2022 21:24:59 +0300 Subject: [PATCH 044/113] added keyboards for admin commands --- keyboards/inline/admin_keyboard.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 keyboards/inline/admin_keyboard.py diff --git a/keyboards/inline/admin_keyboard.py b/keyboards/inline/admin_keyboard.py new file mode 100644 index 0000000..4c7ee2d --- /dev/null +++ b/keyboards/inline/admin_keyboard.py @@ -0,0 +1,13 @@ +from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton + + +def yes_no_keyboard() -> InlineKeyboardMarkup: + """ + Функция, которая генерирует инлайн-клавиатуру "да-нет" для меню админки. + :return InlineKeyboardMarkup: + """ + + keyboard = InlineKeyboardMarkup() + keyboard.add(InlineKeyboardButton(text="да", callback_data="yes_admin"), + InlineKeyboardButton(text="нет", callback_data="no_admin")) + return keyboard From c0bac78f66729b38c41985887f3f08849897e457 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Mon, 11 Jul 2022 21:25:17 +0300 Subject: [PATCH 045/113] merged Natasha & Kolya changes --- database/commands.py | 48 ++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/database/commands.py b/database/commands.py index 8d4312a..26210e7 100644 --- a/database/commands.py +++ b/database/commands.py @@ -5,8 +5,8 @@ ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) DB = os.path.join(ROOT_DIR, 'nvn v2.db') -MODERATOR_ID = '' -print(MODERATOR_ID, 'before') + + def insert(nickname: str, user_name: str, chat_name: str, user_number: int, dtime=datetime.datetime.now().isoformat()) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() @@ -14,6 +14,7 @@ def insert(nickname: str, user_name: str, chat_name: str, user_number: int, dtim INSERT INTO 'users' (nickname, user_name, chat_name, user_number, dtime_connetion) VALUES (?, ?, ?, ?,?); """, (nickname, user_name, chat_name, user_number, dtime)) + def insert2(nickname: str, user_name: str, chat_id: str, user_number: int, dtime:datetime) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() @@ -21,6 +22,7 @@ def insert2(nickname: str, user_name: str, chat_id: str, user_number: int, dtime INSERT INTO 'users' (nickname, user_name, chat_id, user_number, dtime_connetion) VALUES (?, ?, ?, ?,?); """, (nickname, user_name, chat_id, user_number, dtime)) + def select(): with sqlite3.connect(( DB )) as conn: cursor = conn.cursor() @@ -28,28 +30,26 @@ def select(): result = cursor.fetchall() return result -def select_lucky(): + +def winner_check(id): with sqlite3.connect(( DB )) as conn: cursor = conn.cursor() - print(MODERATOR_ID, 'select1') - cursor.execute(f"""SELECT group_name, user_name, nickname, user_number, dtime_connetion - FROM 'users' JOIN 'user_groups' - ON chat_id = group_id AND moderator_id = abs({MODERATOR_ID});""") - print(MODERATOR_ID, 'select2') - result = cursor.fetchall() - print(result) - return result - -# print(select_lucky()) -print(MODERATOR_ID, 'after') -# print(select_lucky()) -# insert2('katy11', 'katy_p',123,1236,datetime.datetime.now()) -# # {НазваниеГруппы} {ИмяУчастника} ({НикУчастника}), -# # {порядковыйНомерВступления} {ВремяВступления} -# # “Java разработчик” Василий(ника нет), -# # 500 26.06.22 10: 56 -# vibo = select_date() -# for i in vibo: -# dt = datetime.datetime.strptime(i[0], '%Y-%m-%d %H:%M:%S.%f') -# print(dt.strftime('%d.%m.%y %H:%M')) + cursor.execute(f"SELECT is_winer FROM users WHERE is_winer={id}") + result = cursor.fetchall() + return result + +def insert_to_groups(group_id: int, moderator_id: int) -> None: + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(""" + INSERT INTO 'user_groups' (group_id, moderator_id) VALUES (?, ?); + """, (group_id, moderator_id)) + + +def select_from_groups(): + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute("SELECT * FROM 'user_groups'") + result = cursor.fetchall() + return result From 42e2578261ee55e2e884ae5243ba3123f3538d22 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Mon, 11 Jul 2022 21:25:32 +0300 Subject: [PATCH 046/113] added keyboard imports --- keyboards/__init__.py | 2 +- keyboards/inline/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/__init__.py b/keyboards/__init__.py index 8abaca9..3c54f1c 100644 --- a/keyboards/__init__.py +++ b/keyboards/__init__.py @@ -1,2 +1,2 @@ -from . import default + from . import inline diff --git a/keyboards/inline/__init__.py b/keyboards/inline/__init__.py index 8b13789..4df2002 100644 --- a/keyboards/inline/__init__.py +++ b/keyboards/inline/__init__.py @@ -1 +1 @@ - +from . import admin_keyboard From e115f5074a28210cde6e4ab6e6c86a25667d1989 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Mon, 11 Jul 2022 21:25:46 +0300 Subject: [PATCH 047/113] added admin import --- handlers/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/handlers/__init__.py b/handlers/__init__.py index 1f75ce9..74db929 100644 --- a/handlers/__init__.py +++ b/handlers/__init__.py @@ -1,4 +1,5 @@ from . import default_heandlers from . import Test_config from . import lucky_list +from . import admin From 049f709d626fbcecacea81b9292e79d0248905d4 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Mon, 11 Jul 2022 21:26:04 +0300 Subject: [PATCH 048/113] updated admin commands --- handlers/admin.py | 63 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 58 insertions(+), 5 deletions(-) diff --git a/handlers/admin.py b/handlers/admin.py index 48e00a8..cd8ad70 100644 --- a/handlers/admin.py +++ b/handlers/admin.py @@ -1,14 +1,67 @@ -from telebot.types import Message +from telebot.types import Message, CallbackQuery from loader import bot +import database.commands as usersbase +from keyboards.inline import admin_keyboard @bot.message_handler(commands=['adminshow']) def bot_admin_show(message: Message): - # Здесь бот выводит текущие настройки админки - pass + admin_info = usersbase.select_from_groups() + bot.send_message(chat_id=message.chat.id, text="Текущие настройки админки в формате\n" + "id Группа модераторов - id Группа пользователей") + for i_info in admin_info: + bot.send_message(chat_id=message.chat.id, text=f'{i_info[0]} ("{i_info[1]}") - {i_info[2]}') @bot.message_handler(commands=['adminsetup']) def bot_admin_setup(message: Message): - # Здесь можно настроить админку - pass + msg = bot.send_message(chat_id=message.chat.id, + text="Добро пожаловать в меню админки. Добавьте группы пользователей (ГП), из которых " + "будут приходить уведомления в выбранную группу модераторов (ГМ). Формат ввода:\n" + "{id_ГМ} {id_ГП_1} {id_ГП_2} {id_ГП_3}") + bot.register_next_step_handler(message=msg, callback=process_admin_input) + + +def process_admin_input(message: Message): + groups = message.text.split(" ") + + for i_group in groups: + if not i_group.isdigit(): + msg = bot.send_message(chat_id=message.chat.id, + text="Ошибка: id_группы - это натуральное число. Попробуйте еще раз. Формат ввода:\n" + "{id_ГМ} {id_ГП_1} {id_ГП_2} {id_ГП_3}") + bot.register_next_step_handler(message=msg, callback=process_admin_input) + return + + for i in range(len(groups) - 1): + usersbase.insert_to_groups(group_id=int(groups[0]), moderator_id=int(groups[i + 1])) + + bot.send_message(chat_id=message.chat.id, + text="Сделано! Хотите добавить еще группы?", + reply_markup=admin_keyboard.yes_no_keyboard()) + + +@bot.callback_query_handler(func=lambda call: call.data == "yes_admin") +def callback_query(call: CallbackQuery) -> None: + """ + Колбек, обрабатывайщий необходимость ввести еще группы в меню админки. Перенаправляет на обработчик + process_admin_input. + :param CallbackQuery call: yes_admin + :return: None + """ + bot.edit_message_text(chat_id=call.message.chat.id, + message_id=call.message.message_id, + text="Формат ввода:\n {id_ГМ} {id_ГП_1} {id_ГП_2} {id_ГП_3}") + process_admin_input(call.message) + + +@bot.callback_query_handler(func=lambda call: call.data == "no_admin") +def callback_query(call: CallbackQuery) -> None: + """ + Колбек, обрабатывайщий окончание ввода групп в меню админки. + :param CallbackQuery call: no_admin + :return: None + """ + bot.edit_message_text(chat_id=call.message.chat.id, + message_id=call.message.message_id, + text="Сделано! Чтобы посмотреть все текущие настройки админки введите команду /adminshow") From 7c838fc046ba4eb0527b74913465a89c82bd6954 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Mon, 11 Jul 2022 21:29:02 +0300 Subject: [PATCH 049/113] merged Natasha & Kolya inputs --- database/commands.py | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/database/commands.py b/database/commands.py index 71c668d..26210e7 100644 --- a/database/commands.py +++ b/database/commands.py @@ -1,15 +1,26 @@ import sqlite3 import os +import datetime + ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) -DB = os.path.join(ROOT_DIR, 'nvn.db') +DB = os.path.join(ROOT_DIR, 'nvn v2.db') + + +def insert(nickname: str, user_name: str, chat_name: str, user_number: int, dtime=datetime.datetime.now().isoformat()) -> None: + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(""" + INSERT INTO 'users' (nickname, user_name, chat_name, user_number, dtime_connetion) VALUES (?, ?, ?, ?,?); + """, (nickname, user_name, chat_name, user_number, dtime)) + -def insert(nickname: str, user_name: str, user_number: int, dtime:str, chat_id: int, is_winer: int) -> None: +def insert2(nickname: str, user_name: str, chat_id: str, user_number: int, dtime:datetime) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(""" - INSERT INTO 'users' (nickname, user_name, user_number, dtime_connetion, chat_id, is_winer) VALUES (?, ?, ?, ?, ?,?); - """, (nickname, user_name, user_number, dtime, chat_id, is_winer)) + INSERT INTO 'users' (nickname, user_name, chat_id, user_number, dtime_connetion) VALUES (?, ?, ?, ?,?); + """, (nickname, user_name, chat_id, user_number, dtime)) def select(): @@ -19,9 +30,26 @@ def select(): result = cursor.fetchall() return result + def winner_check(id): with sqlite3.connect(( DB )) as conn: cursor = conn.cursor() cursor.execute(f"SELECT is_winer FROM users WHERE is_winer={id}") result = cursor.fetchall() - return result \ No newline at end of file + return result + + +def insert_to_groups(group_id: int, moderator_id: int) -> None: + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(""" + INSERT INTO 'user_groups' (group_id, moderator_id) VALUES (?, ?); + """, (group_id, moderator_id)) + + +def select_from_groups(): + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute("SELECT * FROM 'user_groups'") + result = cursor.fetchall() + return result From 56f9e004f309d0e3958fef2c134910cb8cf3c49c Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Mon, 11 Jul 2022 21:30:53 +0300 Subject: [PATCH 050/113] merged Natasha & Kolya inputs --- handlers/lucky_list.py | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/handlers/lucky_list.py b/handlers/lucky_list.py index 0a4a60c..f9d9d1c 100644 --- a/handlers/lucky_list.py +++ b/handlers/lucky_list.py @@ -1,25 +1,17 @@ from telebot.types import Message from loader import bot import database.commands as usersbase -import emoji - - -winners = usersbase.select() -colomns =['Название группы', 'Имя участника', 'Ник участника', 'Порядковый номер вступления', 'Время вступления'] -# print(emoji.emojize('Python is :thumbs_up:')) - - +import datetime @bot.message_handler(commands=['luckylist']) def bot_lucky_list(message: Message): + usersbase.MODERATOR_ID = message.chat.id + winners = usersbase.select_lucky() + print(winners) for winner in winners: - print(emoji.emojize(f':party popper:{winner[3]} :person raising hand:{winner[2]} ({winner[1]}),' - f' \n : input numbers:{winner[4]} :one o’clock:{winner[5]}')) - # здесь прописываем выгрузку инфо из базы данных и ее вывод. - # По ТЗ вывод формата: - # {НазваниеГруппы} {ИмяУчастника} ({НикУчастника}), - # {порядковыйНомерВступления} {ВремяВступления} - # “Java разработчик” Василий(ника нет), - # 500 26.06.22 10: 56 - pass + dtime = datetime.datetime.strptime(winner[4], '%Y-%m-%d %H:%M:%S.%f').strftime('%d.%m.%y %H:%M') + + bot.send_message(chat_id=message.chat.id, text=f'\U0001F389 "{winner[0]}" \U0001F464 {winner[1]} ' + f'(@{winner[2]})\n\U0001F522 {winner[3]} \U0001F550 {dtime}') + print(usersbase.MODERATOR_ID, 'luck') From f4878469e67623aac38cc3bfb7a75b3dfe4eab5e Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Mon, 11 Jul 2022 21:32:43 +0300 Subject: [PATCH 051/113] merged Natasha & Kolya inputs --- handlers/lucky_list.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/handlers/lucky_list.py b/handlers/lucky_list.py index f9d9d1c..eb16509 100644 --- a/handlers/lucky_list.py +++ b/handlers/lucky_list.py @@ -2,8 +2,9 @@ from loader import bot import database.commands as usersbase import datetime +# usersbase.MODERATOR_ID = 1 - +# winners = usersbase.select_lucky() @bot.message_handler(commands=['luckylist']) def bot_lucky_list(message: Message): usersbase.MODERATOR_ID = message.chat.id @@ -15,3 +16,4 @@ def bot_lucky_list(message: Message): bot.send_message(chat_id=message.chat.id, text=f'\U0001F389 "{winner[0]}" \U0001F464 {winner[1]} ' f'(@{winner[2]})\n\U0001F522 {winner[3]} \U0001F550 {dtime}') print(usersbase.MODERATOR_ID, 'luck') + From 2eab8c253fdbeaae5b6f1810fdcf0e48b5af0074 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Mon, 11 Jul 2022 21:33:31 +0300 Subject: [PATCH 052/113] deleted old db --- database/nvn.db | Bin 20480 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 database/nvn.db diff --git a/database/nvn.db b/database/nvn.db deleted file mode 100644 index 52af3cd24100d31a76fa0af6daffe1e7cb21c7ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 zcmeI3OKclO7{_NHPBty;i7KKcxNfG2kP_8h_T{yAiv)(6Dyid^#EA$}W!dqzb?ZlJ zZ;GN^+ER%d>WRmZD<>p`RDn?8Rvw3d5Fquyfm17S;J^uim{}+8x|G;L6x8Zldv?b& z-+$)&emi4nS2K$*<*L3%PB&Zil21%DiZ~8EM+ibFM^j`warA1_B+|5Vu(Ezf4ylQg zax{Sic}~D0_T@QwuAd0%fdCKy0zd!=00AHX1b_e#co+%bWo}VX6z;WW{ZhH+t+%~a zJ2>$#EMzl!Ypr3C(=?^%cCrjRlUE zw)>_9Vo$+eBDq|Q4+j?U|K8onM8L2Z3T>xkyZ?U^~r4=INZaVsJB zi*4`1y4P6sI*xXK3ipYkTRF|}C#Z6!Ggo8E)D(9GcZb7Jd?={6JQ5pbRhK(G24S6P zHP_dIxl!z7#h#u*He@<52;CTxKT#n0rCcsSI#r=z5UQ&;D_*PQH(Md;jEoCtPxRDN z(c5?{`T>3?dI`UbC!!akXQHR}F7Ez$82^#LXCMFsfB+Bx0zd!=00AKIuM-eHA0Ov4 zh&x~MH*}qyi)-SyhGrOtwbWrW->ANiA(L$y)UUD@AJ_r)gA{rMQHs4Lzj&-CS%Z7ficE zL_&%pXC%4REI0jfvs~WjHb^Im?pky_CRNMP^|TR4G=WMcn55inJ6d~v&1=zIdv}?R zBovFwnGu=2Rf00e*l5C8%|00=xv1V%VP;etgsaT$MwM0^9`AMr2v2L1*wKT3f@ zEIf00bT+fys!(9aJVbBt_T`iDZ#2HVAU;6zo2T#6@N^ z#-S0B6`EZe^IYj-Nt_fU{2AI86F1j3{Iku5KJ(kB^Y~|UK#2&qn1zmRKfSV75P3!3 zE}*qTN@TAX6xEoG@fas^F?pv68nP(!A|I2{oldKr6&17`|AcSi_wXCo$8&h}L9&6i zfdCKy0zd!=00AHX1b_e#00KY&2>ky9(!&xL?2?ELhgbaf?%wI$l(7ALK0PFHbf<(U z@k94r@}Dan@XI%s-xX?4(6wT;afCrPn5ZIrub=fl45Uf=u^=Mcdw From c05c301d39a7934d0c79ddc98bb43e14afb425c6 Mon Sep 17 00:00:00 2001 From: loskutovanl <108513445+loskutovanl@users.noreply.github.com> Date: Mon, 11 Jul 2022 21:34:09 +0300 Subject: [PATCH 053/113] Delete nvn.db --- database/nvn.db | Bin 20480 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 database/nvn.db diff --git a/database/nvn.db b/database/nvn.db deleted file mode 100644 index dbb23a0264c9cb6c7d99f55f881cab241d6c45f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 zcmeI(PiWIn90%~1HjPQ4J`p5`iF?~FE2|#%2R3%lx@Dtm?Pk{vc8XmaHFRyaHr0y< zS3P_3;?aW_PrC>r%$pz{q&o;+1o1ZTs%PKJzjb2{6@)pyVQGH(<)!WKlb1qXvZWjI zwqvnd^+vVmun}^OND{fm7$HRGbIhM3eA&Zina{x_1;H^(om^SCpE%n?B8hQA<-~Ym zoK}u$k4+GO00bZa0SG_<0uX?}e=9&&q$OR~rH5CY;@Y~^YFdq^`x2ST8|i|<3hC?f z26Izv&@Qt~u3*d>dA69(Wckhy#Lkamf3b5qzslx}RhC{ZEM#*0)3QdckYY8vRH+rK z7F#OhGr3tdZOo*X=L@XAv(tIidEMD&Jb1a=?oYX2%Is>JVx>DpC&+BwOq_8m>pg*A zPLviD(5kLkjlea<%8p&N%u>BpvmCo#W7GU76f#*O#q6ee&#vvaP0|&zr%z5w?UGw! zb90?vDK?!}*{++8RoyU;OUnli@Gtfqj5FpP^c0W6W0PCXignQ|JZ?X+?|-00SfSYI zaD9Hu?&3r<_pQ8-jwcr*iasV-#-FD|qXJ_8L$bSR-;g8s?+%NEq`-Q{DDjKp_5?U#4H^NBW*V36fYs00Izz00bZa x0SG_<0uX=z1R(J51V$Cr9|ic6K>#hL`hx&5P4+`g)}lc+szrj32dX~+@Dq;BtN;K2 From 0345a0bdbeeb2038ee215c5ee68e13a677db455c Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Mon, 11 Jul 2022 21:41:03 +0300 Subject: [PATCH 054/113] tried to fix conflicts --- database/commands.py | 8 ++++++-- handlers/lucky_list.py | 1 - handlers/register_new_user.py | 10 +++++----- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/database/commands.py b/database/commands.py index 26210e7..e7a67bf 100644 --- a/database/commands.py +++ b/database/commands.py @@ -15,7 +15,11 @@ def insert(nickname: str, user_name: str, chat_name: str, user_number: int, dtim """, (nickname, user_name, chat_name, user_number, dtime)) -def insert2(nickname: str, user_name: str, chat_id: str, user_number: int, dtime:datetime) -> None: +def insert2(nickname: str, + user_name: str, + chat_id: int, + user_number: int, + dtime: datetime = datetime.datetime.now().isoformat()) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(""" @@ -23,7 +27,7 @@ def insert2(nickname: str, user_name: str, chat_id: str, user_number: int, dtime """, (nickname, user_name, chat_id, user_number, dtime)) -def select(): +def select_lucky(): with sqlite3.connect(( DB )) as conn: cursor = conn.cursor() cursor.execute("SELECT * FROM 'users'") diff --git a/handlers/lucky_list.py b/handlers/lucky_list.py index f9d9d1c..6585f24 100644 --- a/handlers/lucky_list.py +++ b/handlers/lucky_list.py @@ -14,4 +14,3 @@ def bot_lucky_list(message: Message): bot.send_message(chat_id=message.chat.id, text=f'\U0001F389 "{winner[0]}" \U0001F464 {winner[1]} ' f'(@{winner[2]})\n\U0001F522 {winner[3]} \U0001F550 {dtime}') - print(usersbase.MODERATOR_ID, 'luck') diff --git a/handlers/register_new_user.py b/handlers/register_new_user.py index ac8ea61..afffe0e 100644 --- a/handlers/register_new_user.py +++ b/handlers/register_new_user.py @@ -1,5 +1,5 @@ from loader import bot -from database.commands import insert +from database.commands import insert, insert2 import datetime from database.commands import winner_check from telebot import types @@ -38,10 +38,10 @@ def callback(call): if call.message: if call.data == 'grac': bot.send_message(call.message.chat.id, 'Поздравили и добавили в базу') - insert( - nickname=call.from_user.username, user_name=call.from_user.first_name, - user_number=call.from_user.id, dtime=datetime.datetime.now(), - chat_id=call.chat.id, is_winer=call.from_user.id + insert2( + nickname=call.message.from_user.username, user_name=call.message.from_user.first_name, + user_number=call.message.from_user.id, dtime=datetime.datetime.now(), + chat_id=call.chat.id, is_winer=call.message.from_user.id ) else: bot.send_message(call.message.chat.id, 'Ничего не делали, так как не победитель') From 375a4b188b47365c937af7cb233d6f79eb544b0d Mon Sep 17 00:00:00 2001 From: NickX Date: Tue, 12 Jul 2022 23:26:14 +1200 Subject: [PATCH 055/113] database.db add to main --- database/database.db | Bin 0 -> 32768 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 database/database.db diff --git a/database/database.db b/database/database.db new file mode 100644 index 0000000000000000000000000000000000000000..9b0a311069373a08ac6478fb613bb3b1cbc2d1a2 GIT binary patch literal 32768 zcmeI5&u<$=6vtaZ<%`iiDE(#oC?O z+4;`C`OKS@*Lk};_WV$;>M3VRLZEY;{1H8J zgkGZ6%w*oHT+G84*h;mQ&6UzsuP~i%RUCYFG&zt;Dye~IhLXw#+FnUfa#>|?B-IbO zVs7d}F;noAk?~=+U8{KI^nC@Z^|RGn!Ann-ibb!QD;1YzP;eG>wZf!VUT%8oT&9{{ zRpu(`mvhC{-LUPeSaqpSo}kyFhYrz&5PY3}Z~}pyOJKg&4%G?xLwvSes!dnYWiOv$ zpx12*Yx=ovr_#HuYT!>EPmU_5MhAxnMkkaL$q8j(Jauw#1lkx*f*UA>Qr0VHs-<#M z{eH!7wW&lIIhlg-9vXtdB3GD`&L3~(jT`u1+e5Uj6U;lCO=8=th6m$8e-16kW+)ns z(o3&Z7lcGTd)Bv-d3MELackiDMM`hoQ8y#CGF`?}qk|*Im1D{02F8a{O3&gai`N%F zT6|xD%!gku^z=8)q$9ve z%~+kjQ(Ta_)kM=!r7PaWnpd1^oL*Ko`88nbfPvkcc1UE^R@r( zv8#P(<*3c$?+?|oORn?bpk4QdE-*C|nIZD$@|*ID^1;Z@k@q4q9b@f$R!+&7K>|ns z2_OL^fCP{L5^t5nGS9Sfc8b7S5if*`u>1swyw^he7 z<_O{6YD1#AdLm|8MqIaN(oRc(t&)HWolYZ@`lc66OdxO1CBhsDZ#+pf*92d* zVy2^M34QMAphTWLD1e9)XY!fsgTp?FhP7I|FRGTN+T0NgP0uqTvdB1^j zX|hzEEKN?%+TUJpC9(vG?BC;y!e`1}HalzCEPd(q%PnL}aUPDqo^#wQvU?Z4^H)@rUkHv+I9BzDeZYeu355LrGX* zg~m!9<9uc&BlPg%E-KJ{!rb(1^<1f__5Jnf@NQn-1N`l|1Zm@9JM{l(P@)j}&m#ZD-~+|}n*oVJ z?7!bapzYv)TaYLO|AQ(l3R{T&Pw;TG?)uUAErtJEoJ1k~AL95$k=sK2Kb1s?|7YR< z;+Et8@%n#TPZ=~02_OL^fCP{L5;Hxm@sP4-{j-Mx z1{!6UAOR$R1dsp{Kmter2_OL^fCP{L5fkbjZ?l)r Date: Tue, 12 Jul 2022 23:52:12 +1200 Subject: [PATCH 056/113] database.db add to main --- database/database.db | Bin 32768 -> 32768 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/database/database.db b/database/database.db index 9b0a311069373a08ac6478fb613bb3b1cbc2d1a2..e597e8861e583778c83743f5eb1b27a6578d0632 100644 GIT binary patch delta 240 zcmZo@U}|V!njkG0!oa}50mSS;%mTzY6LpNGLm2e@Yj}CX8JKz2F!QtUtl|9#grB%J zaev$FC}6?0coP>R7f||_xV1H7Gwb9;-k8Z!JXXBP8HpwFd5O8H3Vxx!lLL5MnDSC5 zFXh?FIBRk=?=-F^0V{TKadF1x`pN8ke|QvJT-_W)eL@s83^X@0^OxAOaX2zCaRPZK*(!4Gk3YsO~A$%(u%lO?z(O Date: Tue, 12 Jul 2022 15:55:36 +0300 Subject: [PATCH 057/113] delete nvn database, added database 'database' --- database/commands.py | 2 +- database/nvn v2.db | Bin 20480 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 database/nvn v2.db diff --git a/database/commands.py b/database/commands.py index e7a67bf..2b35935 100644 --- a/database/commands.py +++ b/database/commands.py @@ -4,7 +4,7 @@ ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) -DB = os.path.join(ROOT_DIR, 'nvn v2.db') +DB = os.path.join(ROOT_DIR, 'database.db') def insert(nickname: str, user_name: str, chat_name: str, user_number: int, dtime=datetime.datetime.now().isoformat()) -> None: diff --git a/database/nvn v2.db b/database/nvn v2.db deleted file mode 100644 index a6f9da1f6c9aec18fbe2a8311392b1e60bc66d2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 zcmeI3O>7%Q6vtUJ}(^c4t5A-3ozeO_elpOX5Td7t4;f)UEAJ z?M)#v2U;p|Lp>ni&B&}Cg&ew}IpDyI*r*kLh@$3tk#o0Wa*!Xng#>U4RA5vcU=wciOI;Erx}^2W5&ZqwnKKkK)UjD8lB2Dt~oshHK?YPze3n zYT;qkv91yCp`F}8X}iNDFKrK2ZgEari)qphv8!S`LSb`ne4Cb?!3ndD&~{9nmWJYo z598$y_X|z`!kS-S@!O7WU&;@NV!Lrt;7@YpRQp*?#19?9m&x{Y7#bgn8ZM0_hDFn* zc8^h5FE@g<)#%wMw2MktPaQUNGBW5G7@9kkr@6)1*(7Z@bxebfwpvj38^thabV#R0 zxktlet&y>x$nCM~qE)4SbDE=aW&p-eO00AHX1b_e#00KbZUnd}cv3IYO zLHK+zTsI7HEUYTuFrBd@dg_RwQ)YUm zp*gy)JGPMM14wkwGBv|-850ue_x=)=_AE!!nPcd}G3mDjL4Sh^b#L$?Q$Fe9d-cwEk?QX?n@VJRq;)}8NebUr4AXYtu+YnE#mX(m@~nM)1` zNhxT$dUI{nZ}3tx`w8hSLw9YYqQtnI8NuR{f|GW|DX12kPkj4kZ(Yk6R#CrLx;+%c zo*7cnp@Rzd@nW@DK3{3L{7G8k#Y(NxpeJVwPldhvl&ky>rlO+pJ=|UCOv5ji*KJ3f zU%GPjA-X$U$0Q!60E*A??>mldiPJi|y53vY67T<*{EGNLY(M}A00AHX1b_e#00KY& z2mk>f00e-*<3wNt%W)hf-Rv7BpCN@@L*yFygWA=j<7J$&rdJE`Z@Ul?Tkxul~?UnqE=BXvUV#E zax5XCyX|}ImJ}(WY+W&N$1MuvM{yjv%UpFpsO0+=KcKsNB^C4Bf23mRp5*^l0;?)t{eT{{ H`l0m~a_!t# From 28289c7dc6406e2c83fc811b951a5ff40336b2b1 Mon Sep 17 00:00:00 2001 From: Vladimir Kireev Date: Tue, 12 Jul 2022 16:03:03 +0300 Subject: [PATCH 058/113] change winer to winner, change in commands.py --- database/commands.py | 9 +++++---- database/database.db | Bin 32768 -> 32768 bytes handlers/register_new_user.py | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/database/commands.py b/database/commands.py index 2b35935..a00f809 100644 --- a/database/commands.py +++ b/database/commands.py @@ -18,13 +18,14 @@ def insert(nickname: str, user_name: str, chat_name: str, user_number: int, dtim def insert2(nickname: str, user_name: str, chat_id: int, - user_number: int, + user_id: int, + is_winner: int, dtime: datetime = datetime.datetime.now().isoformat()) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(""" - INSERT INTO 'users' (nickname, user_name, chat_id, user_number, dtime_connetion) VALUES (?, ?, ?, ?,?); - """, (nickname, user_name, chat_id, user_number, dtime)) + INSERT INTO 'users' (nickname, user_name, chat_id, user_id, dtime_connetion, is_winner) VALUES (?, ?, ?, ?,?,?); + """, (nickname, user_name, chat_id, user_id, dtime, is_winner)) def select_lucky(): @@ -38,7 +39,7 @@ def select_lucky(): def winner_check(id): with sqlite3.connect(( DB )) as conn: cursor = conn.cursor() - cursor.execute(f"SELECT is_winer FROM users WHERE is_winer={id}") + cursor.execute(f"SELECT is_winner FROM users WHERE is_winner={id}") result = cursor.fetchall() return result diff --git a/database/database.db b/database/database.db index 9b0a311069373a08ac6478fb613bb3b1cbc2d1a2..da2c437a8ef319035353703db541d5d04086bbb6 100644 GIT binary patch delta 134 zcmZo@U}|V!njp;>GEv5vHH1Mg+-qaX0)7z=K2rw%JWR+JL~$uSyjE|n`4WMtp`T3<8( E0G|#VAOHXW diff --git a/handlers/register_new_user.py b/handlers/register_new_user.py index afffe0e..e9185c8 100644 --- a/handlers/register_new_user.py +++ b/handlers/register_new_user.py @@ -40,8 +40,8 @@ def callback(call): bot.send_message(call.message.chat.id, 'Поздравили и добавили в базу') insert2( nickname=call.message.from_user.username, user_name=call.message.from_user.first_name, - user_number=call.message.from_user.id, dtime=datetime.datetime.now(), - chat_id=call.chat.id, is_winer=call.message.from_user.id + user_id=call.message.from_user.id, dtime=datetime.datetime.now(), + chat_id=call.message.chat.id, is_winner=1 ) else: bot.send_message(call.message.chat.id, 'Ничего не делали, так как не победитель') From 189c07deb1e48b86346e63e84758ab09fcd3f018 Mon Sep 17 00:00:00 2001 From: Vladimir Kireev Date: Tue, 12 Jul 2022 17:09:31 +0300 Subject: [PATCH 059/113] button delete after solution about congratulation --- handlers/register_new_user.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/handlers/register_new_user.py b/handlers/register_new_user.py index e9185c8..cb0850e 100644 --- a/handlers/register_new_user.py +++ b/handlers/register_new_user.py @@ -37,11 +37,15 @@ def handler_new_member(message): def callback(call): if call.message: if call.data == 'grac': + bot.delete_message(chat_id=call.message.chat.id, message_id=call.message.message_id) bot.send_message(call.message.chat.id, 'Поздравили и добавили в базу') - insert2( - nickname=call.message.from_user.username, user_name=call.message.from_user.first_name, - user_id=call.message.from_user.id, dtime=datetime.datetime.now(), - chat_id=call.message.chat.id, is_winner=1 - ) + + # Функция инсерт будет работать потом раскоментим + # insert2( + # nickname=call.message.from_user.username, user_name=call.message.from_user.first_name, + # user_id=call.message.from_user.id, dtime=datetime.datetime.now(), + # chat_id=call.message.chat.id, is_winner=1 + # ) else: + bot.delete_message(chat_id=call.message.chat.id, message_id=call.message.message_id) bot.send_message(call.message.chat.id, 'Ничего не делали, так как не победитель') From 2c9ca5cc94f7893495ddef0c381908be35559ca5 Mon Sep 17 00:00:00 2001 From: loskutovanl <108513445+loskutovanl@users.noreply.github.com> Date: Tue, 12 Jul 2022 17:44:46 +0300 Subject: [PATCH 060/113] Delete nvn v2.db --- database/nvn v2.db | Bin 20480 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 database/nvn v2.db diff --git a/database/nvn v2.db b/database/nvn v2.db deleted file mode 100644 index a6f9da1f6c9aec18fbe2a8311392b1e60bc66d2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 zcmeI3O>7%Q6vtUJ}(^c4t5A-3ozeO_elpOX5Td7t4;f)UEAJ z?M)#v2U;p|Lp>ni&B&}Cg&ew}IpDyI*r*kLh@$3tk#o0Wa*!Xng#>U4RA5vcU=wciOI;Erx}^2W5&ZqwnKKkK)UjD8lB2Dt~oshHK?YPze3n zYT;qkv91yCp`F}8X}iNDFKrK2ZgEari)qphv8!S`LSb`ne4Cb?!3ndD&~{9nmWJYo z598$y_X|z`!kS-S@!O7WU&;@NV!Lrt;7@YpRQp*?#19?9m&x{Y7#bgn8ZM0_hDFn* zc8^h5FE@g<)#%wMw2MktPaQUNGBW5G7@9kkr@6)1*(7Z@bxebfwpvj38^thabV#R0 zxktlet&y>x$nCM~qE)4SbDE=aW&p-eO00AHX1b_e#00KbZUnd}cv3IYO zLHK+zTsI7HEUYTuFrBd@dg_RwQ)YUm zp*gy)JGPMM14wkwGBv|-850ue_x=)=_AE!!nPcd}G3mDjL4Sh^b#L$?Q$Fe9d-cwEk?QX?n@VJRq;)}8NebUr4AXYtu+YnE#mX(m@~nM)1` zNhxT$dUI{nZ}3tx`w8hSLw9YYqQtnI8NuR{f|GW|DX12kPkj4kZ(Yk6R#CrLx;+%c zo*7cnp@Rzd@nW@DK3{3L{7G8k#Y(NxpeJVwPldhvl&ky>rlO+pJ=|UCOv5ji*KJ3f zU%GPjA-X$U$0Q!60E*A??>mldiPJi|y53vY67T<*{EGNLY(M}A00AHX1b_e#00KY& z2mk>f00e-*<3wNt%W)hf-Rv7BpCN@@L*yFygWA=j<7J$&rdJE`Z@Ul?Tkxul~?UnqE=BXvUV#E zax5XCyX|}ImJ}(WY+W&N$1MuvM{yjv%UpFpsO0+=KcKsNB^C4Bf23mRp5*^l0;?)t{eT{{ H`l0m~a_!t# From 04648e80d2a32fc3275afc1fba0d4418807905fc Mon Sep 17 00:00:00 2001 From: loskutovanl <108513445+loskutovanl@users.noreply.github.com> Date: Tue, 12 Jul 2022 17:47:39 +0300 Subject: [PATCH 061/113] Delete database.db --- database/database.db | Bin 32768 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 database/database.db diff --git a/database/database.db b/database/database.db deleted file mode 100644 index e597e8861e583778c83743f5eb1b27a6578d0632..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeI5+i%-c9LLYGoy2k5cmqw*G`4x=rO`U$dt&c_6&9vyy^Jm$l$R)Jye(TUT`q;H zNT?eUuj2&}e*iqNNeBsPVnX5xG+`})QZ^%vP9%oO zRv|lkx{%7d(!}&Q-LID2Qu4NnX8TMfn|G75#X`ZYWQ&D{j8vQ;x@tb{mKt5po=jDe zO=Y&6d^uZa9wz&qiZ&M_;takR-n$o*57U2n{`)#Px{hnUyYIi}R4bo51yUy>M3#oE z03~oX;CX(cRIJXGlO;EoqM+M$xiy})9h8O|syhDoq4<<^WNLJLWNJn_9G{U!rW2E+ z6QqyvI0*wOU(C3rRHayIX+JD^y|&ay6O##Yy~oDL#X|4Wi?np;ZeFA|CunrGnnd@T zhWn#_I)=_}aRT9R7@vF1vy4V_*;_GdfO%EYP%St&qO&?gjwYr?Ck{ym>x< zOS>ap#4c6uJYt*vbPCkg>+d<*2+6h>_FG;wpaEiPAT*D}FT^*+7sWlHUqT;*=KGFz z^Qw6XYajpwfB+Bx0zd!=00AKIh!bG1Y~Rj|AbdJiSx{BFPR?=HG)2?)DbanZB5As# z8;+{Wnx)vLzK9U}Ru>Z0(PFY;>QT+2lG&~#iYi-*qF5%CC|yVt$IxZfvNerLn142w zXfemIWJR-7g&M|u*@eV(R9jYUQ;8W=@^%*z-7#!g(=- zM714Fk#*J3ZG}kizgn`}nIaB!*)e#4yWNsr&eyE+m>`#$;6|8tMyn zHG7gN@C#jriYv@Rr3hXjlkHDVeKOZ4AH5@MC^n6_*gitQ0YUvDhY0|Fwgcrr$U z>kksuF-R<$vSF)gOj~@~FQ6y)a74uL^SM;!bhc!ZAU#Glv-xaEIy{!#RcRe$YxQhS z_X#K*X1xwd#dNWfE~e89)_0dWiA+vFJGXhF;PH~1$t;)_Enj;5dvkA3?_2O*vRGvak5{w!V>uZR~P@po=;9|!;eAOHk_01yBIKmZ5;0U!VbfWW;c zAYMaH;I>p2j#LInC9!T0ds!PaUq8&(n+5yWaJ~9*f!%wXn$G_@@hTF36K{ws;#Kk3 zy>}BV00KY&2mk>f00e*l5C8%|00;m9An;%i81(UYPk1**ypP_SWG3l9#m z=i(2jFU+txQnj_8O{wss9K30&b-K`!|*Q zZ}HqxrwrL(lVnq6+exnE!ic z+tmD@@ZtI1=l>qop6>sz#}P|P`dk0>M*)5HIw*hu5C8%|00;m9AOHk_01yBIKmZ5; zfro^EK>eWk|5wCY;-BL8OpM&5Juq-BzHt^AsJgb1CC3*A!OH1-B0mjd=Jb5(0|1**hfB*mh From 214e4403360865b243b1f4d7f11ddff8ec585670 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Tue, 12 Jul 2022 17:52:52 +0300 Subject: [PATCH 062/113] tried to fix conflicts --- database/database.db | Bin 32768 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 database/database.db diff --git a/database/database.db b/database/database.db deleted file mode 100644 index da2c437a8ef319035353703db541d5d04086bbb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeI5&u<$=6vt)5Hi zDMS&6q)5G%3-A||1FeLRkSY)oCs09^f>eP}4is^rg$qa^5Gv)(+HsteI8KpJ(!N;h znVp^Q%$v`=S$Une-V-nN=RH?BRVq(pJ;fkf2&LqZq7XvTu!*pRU=v_FQ%fQ7|L9_- zNt!0HlP`93oFshvRbCd_uXfyn*RRqCZNE2B;UOe|1dsp{Kmter2_OL^P$$qnO#X-- zI6yB_FFRInE9VRF0k+~zJ6Q%bt`x&D;0indEqlzdL<8%*~= zu9zP`SIkbh%HZ$-+n=hq<;(*GOZ9VJe!|U+mx@K#%a@9aGAK9=x~YjVx4hW&_?fJi zSyJXJnOF10rNglAt5|iZTOOs?qWkvIxe$Dues}_b%}Zdm%MMiu_)~nkT$-A!WXf(K z%RsN#6_$;2#X+TOQB}jAI+7Yvjt}(>^bUHk!otmkbZagZ>(tlg&^x z8l@Ls_vVB|HGA5(l6iK;f8&DHT0+|oLn(ORoSV`5owUVWNdK7o${&whH+oCAh8@R8Pk%MnlPEX{cI)Nwl>kTGG+g zn4y_QQUwY9y9G(yF%z-4soQZjeEMYz64S9vFw9PBZ20t@79_f3C1RQZ8a5W{t}Rhv zELO}gR5R%trnex8JK!*S+)U`qEy?|VlN=N!^31jX=_P^i;K(3+?N;$JV{+z<&tBBBmxbKutvhGFA~i$!56KVnbfp|K65ZAk*D_x zAmYReg>3FzzMKRn9f53qB41XH_Gfl`^`2poE!Xn}BOsAzl=mAbm%!e!(%9Iv{mu1e zB1@3SuI;`ke5&l`a?_U0(pTQN+(fnz=b^7X)xO3`m84pknsm#MtE4`bR~M4ICMS`d zzL8Ws3tuAImdTQ7a(Q}n*-V^(Y8UH{hS@hTb|T4=QXyM;;_FLIgzWmClW!CGC;7H~ zL%#MnpSE%ANB{{S0VIF~kN^@u0!RP}AOR$R1U3W#`4)MKt_WojpfCi5U|=WpBQ;pO zepIYg3%BvnYO%OY;`cqEX4n6Me3Qt($#>)h`KCOwAx4TuAOR$R1dsp{Kmter2_OL^ zfCP{L64(R;Is+oz8{I>R7+|pxR)+mE-p{c&|E`9>E`inAPDxl`g+{%OaW;D)D|GVW z7Anx4!p!8fccxU-y8rrgU@I?h(Ez`|YG~xnv!kzlCVxlTq8wj&91$A; From 12fe77541e3c8c4f5ee494c6ca77ae959f6baa58 Mon Sep 17 00:00:00 2001 From: loskutovanl <108513445+loskutovanl@users.noreply.github.com> Date: Tue, 12 Jul 2022 17:54:48 +0300 Subject: [PATCH 063/113] Add files via upload --- database/database.db | Bin 0 -> 32768 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 database/database.db diff --git a/database/database.db b/database/database.db new file mode 100644 index 0000000000000000000000000000000000000000..da2c437a8ef319035353703db541d5d04086bbb6 GIT binary patch literal 32768 zcmeI5&u<$=6vt)5Hi zDMS&6q)5G%3-A||1FeLRkSY)oCs09^f>eP}4is^rg$qa^5Gv)(+HsteI8KpJ(!N;h znVp^Q%$v`=S$Une-V-nN=RH?BRVq(pJ;fkf2&LqZq7XvTu!*pRU=v_FQ%fQ7|L9_- zNt!0HlP`93oFshvRbCd_uXfyn*RRqCZNE2B;UOe|1dsp{Kmter2_OL^P$$qnO#X-- zI6yB_FFRInE9VRF0k+~zJ6Q%bt`x&D;0indEqlzdL<8%*~= zu9zP`SIkbh%HZ$-+n=hq<;(*GOZ9VJe!|U+mx@K#%a@9aGAK9=x~YjVx4hW&_?fJi zSyJXJnOF10rNglAt5|iZTOOs?qWkvIxe$Dues}_b%}Zdm%MMiu_)~nkT$-A!WXf(K z%RsN#6_$;2#X+TOQB}jAI+7Yvjt}(>^bUHk!otmkbZagZ>(tlg&^x z8l@Ls_vVB|HGA5(l6iK;f8&DHT0+|oLn(ORoSV`5owUVWNdK7o${&whH+oCAh8@R8Pk%MnlPEX{cI)Nwl>kTGG+g zn4y_QQUwY9y9G(yF%z-4soQZjeEMYz64S9vFw9PBZ20t@79_f3C1RQZ8a5W{t}Rhv zELO}gR5R%trnex8JK!*S+)U`qEy?|VlN=N!^31jX=_P^i;K(3+?N;$JV{+z<&tBBBmxbKutvhGFA~i$!56KVnbfp|K65ZAk*D_x zAmYReg>3FzzMKRn9f53qB41XH_Gfl`^`2poE!Xn}BOsAzl=mAbm%!e!(%9Iv{mu1e zB1@3SuI;`ke5&l`a?_U0(pTQN+(fnz=b^7X)xO3`m84pknsm#MtE4`bR~M4ICMS`d zzL8Ws3tuAImdTQ7a(Q}n*-V^(Y8UH{hS@hTb|T4=QXyM;;_FLIgzWmClW!CGC;7H~ zL%#MnpSE%ANB{{S0VIF~kN^@u0!RP}AOR$R1U3W#`4)MKt_WojpfCi5U|=WpBQ;pO zepIYg3%BvnYO%OY;`cqEX4n6Me3Qt($#>)h`KCOwAx4TuAOR$R1dsp{Kmter2_OL^ zfCP{L64(R;Is+oz8{I>R7+|pxR)+mE-p{c&|E`9>E`inAPDxl`g+{%OaW;D)D|GVW z7Anx4!p!8fccxU-y8rrgU@I?h(Ez`|YG~xnv!kzlCVxlTq8wj&91$A; literal 0 HcmV?d00001 From 0d8ff32e31b65ee7c5dfdc2c66f54ebaf5f465e9 Mon Sep 17 00:00:00 2001 From: Nikolay Kriuchkov Date: Wed, 13 Jul 2022 16:10:38 +1200 Subject: [PATCH 064/113] luckulist ready --- database/commands.py | 13 +++++++++---- database/database.db | Bin 32768 -> 32768 bytes handlers/lucky_list.py | 14 +++++++++----- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/database/commands.py b/database/commands.py index a00f809..982600a 100644 --- a/database/commands.py +++ b/database/commands.py @@ -28,12 +28,17 @@ def insert2(nickname: str, """, (nickname, user_name, chat_id, user_id, dtime, is_winner)) -def select_lucky(): +def select_lucky(moderator_id): with sqlite3.connect(( DB )) as conn: cursor = conn.cursor() - cursor.execute("SELECT * FROM 'users'") - result = cursor.fetchall() - return result + # print(moderator_id, 's') + cursor.execute(f"""SELECT chat_name, user_name, nickname, congr_number, dtime_connetion, is_winner + FROM 'users' JOIN 'groups_relation' + ON chat_id = group_id AND moderator_id = abs({moderator_id});""") + # print(moderator_id, 'select2') + result = cursor.fetchall() + # prin(r) + return result def winner_check(id): diff --git a/database/database.db b/database/database.db index da2c437a8ef319035353703db541d5d04086bbb6..d65c79993fb88fc57c8b21f3ccb05cd9b71e4025 100644 GIT binary patch delta 560 zcmZo@U}|V!njp;>KT*b+HJ(Awzh+~~Tz+xhO$;2o*-X6Iyr1}Y@t5(N@IB*O!WTPP zK|p4*fdI#58v%V@E*Aza25DJlWk;sT7v)8`FYLdt<6_f=eHZo`PM#nq#n1Sqnvc(v z!CqCEmBEpTX|jWyfi~+s#z;O#CZIlXkUmC^to*z@GgA`~Rmm`+63q;D#;?^33=A5R zE#*|WT{*ZIfM&@;%o6hk+O_p!|6|zl1w1WII|N=Dh&-mWPAb36=b_E$VnT$sPP)?)m^oa4m8#ULvR@;(!1T2X3BN~Nh8h>mKRfKUz&LLH#;+b+yNv*p3cIg;{= zEe(oG3sQ@KtYX*Q{0KjQ9mB%-h2hmEh5!7*ti1d$8Cdx@G4LPY|HOZr|1AHe&4LOp z{FB4%W2AXlSr}NE7+%WM|BPUa delta 388 zcmXZWKS%;`6bJBk=UL~^^L}1dhn<>Mi%94FRqqJSs42)>!U|fXTB2D37q?dBx3mb+ z(9#qxjZL*A1Z_Dq8x1Z_4))X9zVE~L@m{mZHk)iqVGi1fo!|kehkK7_9V`O?FWP`# zaT_1ujQAryh;`8>>1cvzQNFts%}2;Dr=H%xOPd^P0FRI zp3hWsT*FpPQ?s1HRE<9^x|*&UMXO|(RAEAOk@I*2#7S+C&tz<2viyF3?V9rl;&GPW z1|~#W$_jb%G4kdRtY$ECOY=!tkWy=fXhe Date: Wed, 13 Jul 2022 09:35:34 +0300 Subject: [PATCH 065/113] added admin ids --- .env.template | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.env.template b/.env.template index 154bf4d..1ea3fcb 100644 --- a/.env.template +++ b/.env.template @@ -1 +1,2 @@ -BOT_TOKEN="Ваш токен для бота, полученный от @BotFather" \ No newline at end of file +BOT_TOKEN="Ваш токен для бота, полученный от @BotFather" +ADMIN_IDS='["user_id первого админа", "user_id второго админа", "user_id третьего админа"]' \ No newline at end of file From c1c15cefe79cd89329c6e8d643bacf51521937e9 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 13 Jul 2022 09:36:11 +0300 Subject: [PATCH 066/113] deleted emoji requirements --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index ae1b308..7372215 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,2 @@ pyTelegramBotAPI==4.4.0 python-dotenv==0.19.2 -emoji~=1.7.0 \ No newline at end of file From 59136c5f7267bc8e965e851a5beca0d4e04ec883 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 13 Jul 2022 09:37:04 +0300 Subject: [PATCH 067/113] added admin_ids --- config_data/config.py | 1 + 1 file changed, 1 insertion(+) diff --git a/config_data/config.py b/config_data/config.py index f352c6f..554d19b 100644 --- a/config_data/config.py +++ b/config_data/config.py @@ -7,6 +7,7 @@ load_dotenv() BOT_TOKEN = os.getenv('BOT_TOKEN') +ADMIN_IDS = os.getenv('ADMIN_IDS') DEFAULT_COMMANDS = ( ('start', "Запустить бота"), From dbf018f88a1cee955eb0dd5fdb3829267337f10d Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 13 Jul 2022 10:10:38 +0300 Subject: [PATCH 068/113] corrected callback --- handlers/register_new_user.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/handlers/register_new_user.py b/handlers/register_new_user.py index cb0850e..f983044 100644 --- a/handlers/register_new_user.py +++ b/handlers/register_new_user.py @@ -33,7 +33,7 @@ def handler_new_member(message): else: bot.send_message(message.chat.id, f'Есть в списке победителей{winner_check(user_number)}') -@bot.callback_query_handler(func=lambda call: True) +@bot.callback_query_handler(func=lambda call: call.data == "grac" or call.data == "decline") def callback(call): if call.message: if call.data == 'grac': From 6ee9235cd8bf1e7c5100bd0b6e9d35862cd16675 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 13 Jul 2022 10:10:49 +0300 Subject: [PATCH 069/113] added commands for admin --- database/commands.py | 43 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/database/commands.py b/database/commands.py index 982600a..281e4a1 100644 --- a/database/commands.py +++ b/database/commands.py @@ -1,6 +1,7 @@ import sqlite3 import os import datetime +from typing import List ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) @@ -49,17 +50,43 @@ def winner_check(id): return result -def insert_to_groups(group_id: int, moderator_id: int) -> None: +def insert_to_groups(moderator_id: int, group_id: int) -> None: + """ + Функция, которая записывает id группы модераторов и групп пользователей в таблицу groups_relation (по связи многие + ко многим; одной записи соответствует одна пара). + :param moderator_id: id группы модераторов + :param group_id: id группы пользователей + :return: None + """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - cursor.execute(""" - INSERT INTO 'user_groups' (group_id, moderator_id) VALUES (?, ?); - """, (group_id, moderator_id)) + cursor.execute( + """INSERT INTO 'groups_relation' (moderator_id, group_id) + VALUES (?, ?);""", + (moderator_id, group_id) + ) -def select_from_groups(): +def select_from_groups() -> List[tuple]: + """ + Генератор, который из таблицы groups_relation возвращает данные о записях id групп модераторов и пользователей, + сгруппированные по id групп модераторов. + :return List[tuple]: id групп модераторов и пользователей + """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - cursor.execute("SELECT * FROM 'user_groups'") - result = cursor.fetchall() - return result + cursor.execute("SELECT DISTINCT moderator_id " + "FROM 'groups_relation'") + moderator_id_list = cursor.fetchall() + for moderator_id in moderator_id_list: + cursor.execute(f"SELECT moderator_id, group_id " + f"FROM 'groups_relation'" + f"WHERE moderator_id={moderator_id[0]}") + result = cursor.fetchall() + yield result + + +# def truncate_groups() -> None: +# with sqlite3.connect((DB)) as conn: +# cursor = conn.cursor() +# cursor.execute("TRUNCATE 'groups_relation'") From 07dcae8c609985534295d40e71705d2c07b08bec Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 13 Jul 2022 10:11:05 +0300 Subject: [PATCH 070/113] amendments for admin keyabord --- keyboards/inline/admin_keyboard.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/inline/admin_keyboard.py b/keyboards/inline/admin_keyboard.py index 4c7ee2d..70df00a 100644 --- a/keyboards/inline/admin_keyboard.py +++ b/keyboards/inline/admin_keyboard.py @@ -8,6 +8,6 @@ def yes_no_keyboard() -> InlineKeyboardMarkup: """ keyboard = InlineKeyboardMarkup() - keyboard.add(InlineKeyboardButton(text="да", callback_data="yes_admin"), - InlineKeyboardButton(text="нет", callback_data="no_admin")) + keyboard.add(InlineKeyboardButton(text="да", callback_data="yes_admin_add"), + InlineKeyboardButton(text="нет", callback_data="no_admin_add")) return keyboard From 7ab3494788ad119973c1f34c108a29b133298d0c Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 13 Jul 2022 10:11:14 +0300 Subject: [PATCH 071/113] amendments for admin commands --- handlers/admin.py | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/handlers/admin.py b/handlers/admin.py index cd8ad70..6a53928 100644 --- a/handlers/admin.py +++ b/handlers/admin.py @@ -2,27 +2,34 @@ from loader import bot import database.commands as usersbase from keyboards.inline import admin_keyboard +from config_data.config import ADMIN_IDS @bot.message_handler(commands=['adminshow']) -def bot_admin_show(message: Message): +def bot_admin_show(message: Message) -> None: admin_info = usersbase.select_from_groups() bot.send_message(chat_id=message.chat.id, text="Текущие настройки админки в формате\n" "id Группа модераторов - id Группа пользователей") for i_info in admin_info: - bot.send_message(chat_id=message.chat.id, text=f'{i_info[0]} ("{i_info[1]}") - {i_info[2]}') + bot_text = f"{i_info[0][0]}: " + for j_info in i_info: + bot_text = f"{bot_text}{j_info[1]} " + bot.send_message(chat_id=message.chat.id, text=bot_text) @bot.message_handler(commands=['adminsetup']) def bot_admin_setup(message: Message): - msg = bot.send_message(chat_id=message.chat.id, - text="Добро пожаловать в меню админки. Добавьте группы пользователей (ГП), из которых " - "будут приходить уведомления в выбранную группу модераторов (ГМ). Формат ввода:\n" - "{id_ГМ} {id_ГП_1} {id_ГП_2} {id_ГП_3}") - bot.register_next_step_handler(message=msg, callback=process_admin_input) + if str(message.from_user.id) in ADMIN_IDS: + # bot.send_message(message.chat.id, text="Я очистил все данные таблицы ") + # usersbase.truncate_groups() + msg = bot.send_message(chat_id=message.chat.id, + text="Добро пожаловать в меню админки. Добавьте группы пользователей (ГП), из которых " + "будут приходить уведомления в выбранную группу модераторов (ГМ). Формат ввода:\n" + "{id_ГМ} {id_ГП_1} {id_ГП_2} {id_ГП_3}") + bot.register_next_step_handler(message=msg, callback=process_admin_input) -def process_admin_input(message: Message): +def process_admin_input(message: Message) -> None: groups = message.text.split(" ") for i_group in groups: @@ -34,32 +41,32 @@ def process_admin_input(message: Message): return for i in range(len(groups) - 1): - usersbase.insert_to_groups(group_id=int(groups[0]), moderator_id=int(groups[i + 1])) + usersbase.insert_to_groups(moderator_id=int(groups[0]), group_id=int(groups[i + 1])) bot.send_message(chat_id=message.chat.id, text="Сделано! Хотите добавить еще группы?", reply_markup=admin_keyboard.yes_no_keyboard()) -@bot.callback_query_handler(func=lambda call: call.data == "yes_admin") +@bot.callback_query_handler(func=lambda call: call.data == "yes_admin_add") def callback_query(call: CallbackQuery) -> None: """ Колбек, обрабатывайщий необходимость ввести еще группы в меню админки. Перенаправляет на обработчик process_admin_input. - :param CallbackQuery call: yes_admin + :param CallbackQuery call: yes_admin_add :return: None """ - bot.edit_message_text(chat_id=call.message.chat.id, + msg = bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Формат ввода:\n {id_ГМ} {id_ГП_1} {id_ГП_2} {id_ГП_3}") - process_admin_input(call.message) + bot.register_next_step_handler(msg, process_admin_input) -@bot.callback_query_handler(func=lambda call: call.data == "no_admin") +@bot.callback_query_handler(func=lambda call: call.data == "no_admin_add") def callback_query(call: CallbackQuery) -> None: """ Колбек, обрабатывайщий окончание ввода групп в меню админки. - :param CallbackQuery call: no_admin + :param CallbackQuery call: no_admin_add :return: None """ bot.edit_message_text(chat_id=call.message.chat.id, From 64c11b934de5a780b26186e5879f350bc30e6031 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 13 Jul 2022 12:51:52 +0300 Subject: [PATCH 072/113] amendments for admin commands --- database/commands.py | 27 +++++++-- handlers/admin.py | 93 +++++++++++++++++++++++------- keyboards/inline/admin_keyboard.py | 14 ++++- 3 files changed, 109 insertions(+), 25 deletions(-) diff --git a/database/commands.py b/database/commands.py index 281e4a1..918a468 100644 --- a/database/commands.py +++ b/database/commands.py @@ -86,7 +86,26 @@ def select_from_groups() -> List[tuple]: yield result -# def truncate_groups() -> None: -# with sqlite3.connect((DB)) as conn: -# cursor = conn.cursor() -# cursor.execute("TRUNCATE 'groups_relation'") +def delete_from_groups() -> None: + """ + Функция, которая полностью очищает таблицу groups_relation. + :return: None + """ + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute("DELETE FROM 'groups_relation'") + + +def get_moderator_id() -> List[int]: + """ + Функция, которая возвращает список id групп модераторов из таблицы groups_relation. + :return List[int]: список id групп модераторов + """ + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute("SELECT moderator_id FROM 'groups_relation'") + moderator_id_list = cursor.fetchall() + result = [] + for moderator_id in moderator_id_list: + result.append(moderator_id[0]) + return result diff --git a/handlers/admin.py b/handlers/admin.py index 6a53928..e96d4b3 100644 --- a/handlers/admin.py +++ b/handlers/admin.py @@ -7,36 +7,60 @@ @bot.message_handler(commands=['adminshow']) def bot_admin_show(message: Message) -> None: - admin_info = usersbase.select_from_groups() - bot.send_message(chat_id=message.chat.id, text="Текущие настройки админки в формате\n" - "id Группа модераторов - id Группа пользователей") - for i_info in admin_info: - bot_text = f"{i_info[0][0]}: " - for j_info in i_info: - bot_text = f"{bot_text}{j_info[1]} " - bot.send_message(chat_id=message.chat.id, text=bot_text) + """ + Функция, которая выводит текущие настройки админки с группировкой по id группы модератора. Команда доступна только + в чатах модераторов, которые настроены командой /adminsetup. + :param Message message: /adminshow + :return: None + """ + moderator_ids = usersbase.get_moderator_id() + + if abs(message.chat.id) in moderator_ids: + admin_info = usersbase.select_from_groups() + bot.send_message(chat_id=message.chat.id, text="Текущие настройки админки в формате\n" + "id Группа модераторов - id Группа пользователей") + for i_info in admin_info: + bot_text = f"{i_info[0][0]}: " + for j_info in i_info: + bot_text = f"{bot_text}{j_info[1]} " + bot.send_message(chat_id=message.chat.id, text=bot_text) @bot.message_handler(commands=['adminsetup']) -def bot_admin_setup(message: Message): +def bot_admin_setup(message: Message) -> None: + """ + Функция, которая запрашивает подтверждение смены текущих настроек админки. Доступна только пользователям с правами + администрирования. + :param Message message: /adminsetup + :return: None + """ + moderator_ids = usersbase.get_moderator_id() + if str(message.from_user.id) in ADMIN_IDS: - # bot.send_message(message.chat.id, text="Я очистил все данные таблицы ") - # usersbase.truncate_groups() - msg = bot.send_message(chat_id=message.chat.id, - text="Добро пожаловать в меню админки. Добавьте группы пользователей (ГП), из которых " - "будут приходить уведомления в выбранную группу модераторов (ГМ). Формат ввода:\n" - "{id_ГМ} {id_ГП_1} {id_ГП_2} {id_ГП_3}") - bot.register_next_step_handler(message=msg, callback=process_admin_input) + bot.send_message(chat_id=message.chat.id, + text="Пожалуйста, подтвердите, что вы действительно хотите поменять настройки админки. " + "Это приведет к полному удалению текущих настроек и отменить это действие будет " + "невозможно!", + reply_markup=admin_keyboard.yes_no_proceed_keyboard()) + elif abs(message.chat.id) in moderator_ids: + bot.send_message(chat_id=message.chat.id, + text=f"Ошибка доступа: эта команда доступна только пользователям с правами " + f"администрирования. Доступ есть у пользователей с такими user_id:\n{ADMIN_IDS}") def process_admin_input(message: Message) -> None: + """ + Функция, которая сохраняет введенные администратором id групп модераторов и пользователей. + :param Message message: id групп модератора и его пользователей через пробелы + :return: None + """ groups = message.text.split(" ") for i_group in groups: if not i_group.isdigit(): msg = bot.send_message(chat_id=message.chat.id, text="Ошибка: id_группы - это натуральное число. Попробуйте еще раз. Формат ввода:\n" - "{id_ГМ} {id_ГП_1} {id_ГП_2} {id_ГП_3}") + "id_ГМ id_ГП_1 id_ГП_2 id_ГП_3") bot.register_next_step_handler(message=msg, callback=process_admin_input) return @@ -45,7 +69,36 @@ def process_admin_input(message: Message) -> None: bot.send_message(chat_id=message.chat.id, text="Сделано! Хотите добавить еще группы?", - reply_markup=admin_keyboard.yes_no_keyboard()) + reply_markup=admin_keyboard.yes_no_add_keyboard()) + + +@bot.callback_query_handler(func=lambda call: call.data == "yes_admin_proceed") +def callback_query(call: CallbackQuery) -> None: + """ + Колбек, обрабатывайщий подтверждение, что администратор действитель хочет поменять настройки админки. Сбрасывает + текущие настройки и перенаправляет на обработчик process_admin_input. + :param CallbackQuery call: yes_admin_proceed + :return: None + """ + usersbase.delete_from_groups() + msg = bot.edit_message_text(chat_id=call.message.chat.id, + message_id=call.message.message_id, + text="Добро пожаловать в меню админки. Добавьте группы пользователей (ГП), из которых " + "будут приходить уведомления в выбранную группу модераторов (ГМ). Формат ввода:\n" + "id_ГМ id_ГП_1 id_ГП_2 id_ГП_3") + bot.register_next_step_handler(msg, process_admin_input) + + +@bot.callback_query_handler(func=lambda call: call.data == "no_admin_proceed") +def callback_query(call: CallbackQuery) -> None: + """ + Колбек, обрабатывайщий отказ администратора поменять настройки админки. + :param CallbackQuery call: no_admin_proceed + :return: None + """ + bot.edit_message_text(chat_id=call.message.chat.id, + message_id=call.message.message_id, + text="Вы отказались менять настройки админки.") @bot.callback_query_handler(func=lambda call: call.data == "yes_admin_add") @@ -57,8 +110,8 @@ def callback_query(call: CallbackQuery) -> None: :return: None """ msg = bot.edit_message_text(chat_id=call.message.chat.id, - message_id=call.message.message_id, - text="Формат ввода:\n {id_ГМ} {id_ГП_1} {id_ГП_2} {id_ГП_3}") + message_id=call.message.message_id, + text="Формат ввода:\n id_ГМ id_ГП_1 id_ГП_2 id_ГП_3") bot.register_next_step_handler(msg, process_admin_input) diff --git a/keyboards/inline/admin_keyboard.py b/keyboards/inline/admin_keyboard.py index 70df00a..62da4bc 100644 --- a/keyboards/inline/admin_keyboard.py +++ b/keyboards/inline/admin_keyboard.py @@ -1,7 +1,7 @@ from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton -def yes_no_keyboard() -> InlineKeyboardMarkup: +def yes_no_add_keyboard() -> InlineKeyboardMarkup: """ Функция, которая генерирует инлайн-клавиатуру "да-нет" для меню админки. :return InlineKeyboardMarkup: @@ -11,3 +11,15 @@ def yes_no_keyboard() -> InlineKeyboardMarkup: keyboard.add(InlineKeyboardButton(text="да", callback_data="yes_admin_add"), InlineKeyboardButton(text="нет", callback_data="no_admin_add")) return keyboard + + +def yes_no_proceed_keyboard() -> InlineKeyboardMarkup: + """ + Функция, которая запрашивает подтверждение, что администратор действитель хочет поменять настройки админки. + :return InlineKeyboardMarkup: + """ + + keyboard = InlineKeyboardMarkup() + keyboard.add(InlineKeyboardButton(text="да", callback_data="yes_admin_proceed"), + InlineKeyboardButton(text="нет", callback_data="no_admin_proceed")) + return keyboard From 61b7f83799e05b8cac02d6032f4776338565cfbb Mon Sep 17 00:00:00 2001 From: NickX Date: Wed, 13 Jul 2022 23:23:44 +1200 Subject: [PATCH 073/113] database.db add table temp_storage --- database/database.db | Bin 32768 -> 32768 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/database/database.db b/database/database.db index d65c79993fb88fc57c8b21f3ccb05cd9b71e4025..17b2058f1dee8221285ddd2b4ec3a7938cc63174 100644 GIT binary patch delta 242 zcmZo@U}|V!njkHhz`(%30mSS;%nZbt6LpNG6BzXTYj}CX8CZB2nE6?F*6{x2Vc`A5 zwTb)NW=8=FuFadc{209&H7(i2RaF_AL`xEra#BlDa|_~&OY(~n(^1&0&Oxq@A+8D` zj!r(V3dpJyG@!~S@v2)TXC#)yXQn84`h~c;jC;n>iAG G$O8a5`W);4 From 41ef0b2820cca4d665f6f20c361c1937216e8b32 Mon Sep 17 00:00:00 2001 From: Vladimir Kireev Date: Wed, 13 Jul 2022 15:16:06 +0300 Subject: [PATCH 074/113] winner_check update --- database/commands.py | 2 +- database/database.db | Bin 32768 -> 32768 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/database/commands.py b/database/commands.py index 918a468..7967ac6 100644 --- a/database/commands.py +++ b/database/commands.py @@ -45,7 +45,7 @@ def select_lucky(moderator_id): def winner_check(id): with sqlite3.connect(( DB )) as conn: cursor = conn.cursor() - cursor.execute(f"SELECT is_winner FROM users WHERE is_winner={id}") + cursor.execute(f"SELECT * FROM users WHERE user_id={id} AND is_winner=1") result = cursor.fetchall() return result diff --git a/database/database.db b/database/database.db index d65c79993fb88fc57c8b21f3ccb05cd9b71e4025..e30486550e7ea27b6b90ab1b6cebb8682a2d0518 100644 GIT binary patch delta 81 zcmZo@U}|V!njp=XI8nx#HIYG2CtzdBW`4%_$qE88lMMtoHrojN;bqjCY$>NE@65r) kpeoEF>&V2!;TPr?Uy@o}5}%Y`0%ZHd%av@dlWR%@0C`;&b^rhX delta 63 zcmZo@U}|V!njp;>KT*b+HJ(Awzh+~~W`4%l$qE88lMMtoHrojN;bqjAY$>P4$;F^5 T%qr{1#5CDKPHc0XTvH+dF7*(2 From 5e7fdbcdfb630714a5441d201f04903c4239668c Mon Sep 17 00:00:00 2001 From: NickX Date: Thu, 14 Jul 2022 00:37:57 +1200 Subject: [PATCH 075/113] add emodji to requirments --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 7372215..03cac72 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ pyTelegramBotAPI==4.4.0 python-dotenv==0.19.2 +emoji==1.7.0 \ No newline at end of file From c10adab078bf8a02c89825a9f6cc154ebe0ab553 Mon Sep 17 00:00:00 2001 From: Vladimir Kireev Date: Wed, 13 Jul 2022 16:35:58 +0300 Subject: [PATCH 076/113] select_id_from_user and temp_save was added to commands.py --- database/commands.py | 19 +++++++++++++++++++ database/database.db | Bin 32768 -> 32768 bytes handlers/register_new_user.py | 25 +++++++++++++++---------- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/database/commands.py b/database/commands.py index 7967ac6..601d8d0 100644 --- a/database/commands.py +++ b/database/commands.py @@ -109,3 +109,22 @@ def get_moderator_id() -> List[int]: for moderator_id in moderator_id_list: result.append(moderator_id[0]) return result + +def select_id_from_users(user_id) -> None: + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(f"SELECT id FROM 'users' WHERE user_id={user_id}") + record_id = cursor.fetchall() + return record_id[0][0] + + + +def temp_save( + chat_id: int, + record_id: int, + message_id: int) -> None: + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(""" + INSERT INTO 'temp_storage' (chat_id, record_id, bot_message_id) VALUES (?, ?, ?); + """, (chat_id, record_id, message_id)) \ No newline at end of file diff --git a/database/database.db b/database/database.db index 17b2058f1dee8221285ddd2b4ec3a7938cc63174..4ec6d94a31f5a949a54f7efbe4cc2e9573047371 100644 GIT binary patch delta 295 zcmZo@U}|V!njp=XF;T{uHG@Gf+-qaXJbsy-3>>`KoV?k*pZIt2m+_nMJ>y%#`;_-A z2u@ZIklAb{@P@~gcPoRdvLXwEBLgdtX~hd>0$Bz?tiuZgKnYGG10y3{19M$NV+BJq zD+6OI69YX%BQpy_qyJ(TmbF_=&X)DE;o~!903x6!0}d_*piWs02+ixr#Dp-y2xJ5w z2M-4qR2F2(Y1-XDlsFEh^^T{90d9fQ^y=0|WmDppIw!0(^|D46KYy5ZAGBK3EiB F005(QN4@|6 delta 187 zcmV;s07UI{?g8y*ocH##&pE;lqXHa9kV0005YlkgiBlWQGH2tOqg1pq+; z0+T=<9g~e77nAWFM*%3aIUdUa3<3|}01xXA;19_Ut+Nq8oez_(FCrXsWpZ-|0000N p2xoF{b#QZE2@3-k0d;d_a&ri?>n|A)0ss)R5kTJ$k&qjrP%yU)Hf;a^ diff --git a/handlers/register_new_user.py b/handlers/register_new_user.py index f983044..e797fa8 100644 --- a/handlers/register_new_user.py +++ b/handlers/register_new_user.py @@ -1,7 +1,7 @@ from loader import bot from database.commands import insert, insert2 import datetime -from database.commands import winner_check +from database.commands import winner_check, select_id_from_users, temp_save from telebot import types # def redirekt_winner_info(user_name, user_id): @@ -18,16 +18,27 @@ @bot.message_handler(content_types=['new_chat_members']) def handler_new_member(message): count = bot.get_chat_members_count(message.chat.id) - user_number = message.from_user.id + user_number=message.from_user.id markup = types.InlineKeyboardMarkup(row_width=1) congratulations = types.InlineKeyboardButton(text='Поздравляем', callback_data='grac') shame = types.InlineKeyboardButton(text='Не поздравляем', callback_data='decline') markup.add(congratulations, shame) - if not message.from_user.is_bot and not winner_check(user_number): # тут будет еще проверка count % 500 == 0 + # record_id = select_id_from_users(message.from_user.id) + + temp_save(chat_id=message.chat.id, + record_id=select_id_from_users(user_id=message.from_user.id), + message_id=message.id) + + # insert2( + # nickname=message.from_user.username, user_name=message.from_user.first_name, + # user_id=message.from_user.id, dtime=datetime.datetime.now(), + # chat_id=message.chat.id, is_winner=1) + + - bot.send_message(message.chat.id, 'Не бот и отсутствует в списке победителей. Что с ним делать?', + bot.send_message(message.chat.id, f'Не бот и отсутствует в списке победителей. Что с ним делать?', reply_markup=markup) else: @@ -40,12 +51,6 @@ def callback(call): bot.delete_message(chat_id=call.message.chat.id, message_id=call.message.message_id) bot.send_message(call.message.chat.id, 'Поздравили и добавили в базу') - # Функция инсерт будет работать потом раскоментим - # insert2( - # nickname=call.message.from_user.username, user_name=call.message.from_user.first_name, - # user_id=call.message.from_user.id, dtime=datetime.datetime.now(), - # chat_id=call.message.chat.id, is_winner=1 - # ) else: bot.delete_message(chat_id=call.message.chat.id, message_id=call.message.message_id) bot.send_message(call.message.chat.id, 'Ничего не делали, так как не победитель') From d750b7388a0069101753f24a484d2643a5a95078 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Thu, 14 Jul 2022 12:14:25 +0300 Subject: [PATCH 077/113] minor changes --- README.md | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 7d8f1c9..7edcf2f 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,14 @@ # tg-bot-users 🤖 -Телеграм-бот отслеживает юбилейных пользователей группы. По умолчанию, юбилейными считаются участники, кратные 500. Эти настройки можно изменить при конфигурации бота. +Телеграм-бот отслеживает юбилейных пользователей групп. По умолчанию, юбилейными считаются участники, кратные 500. Эти настройки можно изменить при конфигурации бота. При вступлении в комьюнити-группу нового, юбилейного участника бот присылает в группу модераторов уведомление с именем, ником, id пользователя, юбилейным номером и датой и временем вступления. Помимо юбилейных, бот сохраняет двух последующих участников, так как юбилейным может вступить не пользователь, а бот или модератор. ## Особенности -tbc +* Команды боту доступны только в чатах модераторов. +* Настройки администрирования доступны только пользователям с правам администраторов. +* Чтобы поздравить юбилейного пользователя, нужно просто нажать кнопку Поздравить. ## Requirements @@ -63,20 +65,20 @@ tbc #### Вариант 2: через передачу параметров при запуске docker контейнера 1. Скачать приложение tg-bot-users в нужную директорию. -2. Сохранить файл .env в директории приложения tg-bot-users. -3. Установить и запустить docker (например, Docker Desktop). -4. В терминале перейти в директорию tg-bot-users. -5. Создать контейнер docker, введя в терминале команду: +2. Установить и запустить docker (например, Docker Desktop). +3. В терминале перейти в директорию tg-bot-users. +4. Создать контейнер docker, введя в терминале команду: docker build -t telegram-bot:latest . где `telegram-bot` - пример названия контейнера. Можно дать другое название контейнеру. +5. Запустить контейнер, введя в терминале команду: -6. Запустить контейнер, введя в терминале команду: - - docker run --name telegram-bot --volume c:\Users\Наташик\PycharmProjects\tg-bot-users\database:/app/database -e BOT_TOKEN=type_your_token telegram-bot:latest + docker run --name telegram-bot --volume c:\Users\Наташик\PycharmProjects\tg-bot-users\database:/app/database -e BOT_TOKEN=type_your_token -e ADMIN_IDS='["user_id_of_first_admin", "user_id_of_second_admin"]' telegram-bot:latest -где `type_your_token` - token от вашего бота, а `c:\Users\tg-bot-users\database` - пример абсолютного пути до директории database внутри директории tg-bot-users. +где `type_your_token` - token от вашего бота; +`user_id_of_first_admin` и `user_id_of_second_admin` - user_id тех пользователей, которым вы хотите дать права администрирования (их не обязательно должно быть двое, может быть один, может быть больше); +`c:\Users\tg-bot-users\database` - пример абсолютного пути до директории database внутри директории tg-bot-users. При работе на операционной системе Windows в пути стоит писать обратный слэш как в примере. При работе с другими операционными системами в пути стоит писать прямой слэш `/`. Эта команда позволит не терять данные из базы данных при перезапуске приложения и контейнера. @@ -89,5 +91,8 @@ tbc * `/luckylist` - по запросу названия группы присылать список всех зафиксированных пользователей за время работы +tbc по каждой команде + dotenv + + From af1277c6450cd3d60dcf42e4d236f00a7d0beecb Mon Sep 17 00:00:00 2001 From: Vladimir Kireev Date: Thu, 14 Jul 2022 13:00:43 +0300 Subject: [PATCH 078/113] upd select_id_from_users, temp_save --- database/commands.py | 17 +++++++++++++---- database/database.db | Bin 32768 -> 32768 bytes handlers/register_new_user.py | 26 ++++++++++++++++---------- 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/database/commands.py b/database/commands.py index 601d8d0..fe72284 100644 --- a/database/commands.py +++ b/database/commands.py @@ -115,16 +115,25 @@ def select_id_from_users(user_id) -> None: cursor = conn.cursor() cursor.execute(f"SELECT id FROM 'users' WHERE user_id={user_id}") record_id = cursor.fetchall() - return record_id[0][0] + return record_id[-1][0] def temp_save( chat_id: int, record_id: int, - message_id: int) -> None: + ) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(""" - INSERT INTO 'temp_storage' (chat_id, record_id, bot_message_id) VALUES (?, ?, ?); - """, (chat_id, record_id, message_id)) \ No newline at end of file + INSERT INTO 'temp_storage' (chat_id, record_id) VALUES (?, ?); + """, (chat_id, record_id)) + + + +def temp_save_bot_message( + bot_message_id: int + ) -> None: + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute("""INSERT INTO 'temp_storage' (bot_message_id) VALUES (?);""", (bot_message_id)) \ No newline at end of file diff --git a/database/database.db b/database/database.db index 4ec6d94a31f5a949a54f7efbe4cc2e9573047371..b28891a0072cb1401bf5738d28a2c4340749d0fb 100644 GIT binary patch delta 456 zcmZo@U}|V!njp}NES<&0Ty=Co%w1(_I1xm78RgMC zzQ#w`2tS8w=n38WTUk@qyz$73;vU395nzU{5zC>}JQf7$!)?c79OOZ2GsDt=S_CX# zZn|PJ;%LM%!8Uw3?~2Y0N28P)Kz!Nh3NXsW(Sg{$kU!ZV4x^yy#Lyk!B7VkVQW`ac z#ffCEkQM^GWay{l74S2S_~IZ_pmYZ2W{5sUECzfwXoOlepI7yGHAzRr&wJ zPah!6B$}-g-GacqxbD>w+hV9G;8*;Jo4D>JGZ)yc&nDFp9_UHQ#q8d}W}&!$xV4*= hm7Wo?RLC9{6z_F57U>glTfl7|dBD|`ey_b8fp0Z9d6xhH diff --git a/handlers/register_new_user.py b/handlers/register_new_user.py index e797fa8..2d85666 100644 --- a/handlers/register_new_user.py +++ b/handlers/register_new_user.py @@ -1,7 +1,7 @@ from loader import bot from database.commands import insert, insert2 import datetime -from database.commands import winner_check, select_id_from_users, temp_save +from database.commands import winner_check, select_id_from_users, temp_save, temp_save_bot_message from telebot import types # def redirekt_winner_info(user_name, user_id): @@ -25,20 +25,20 @@ def handler_new_member(message): markup.add(congratulations, shame) if not message.from_user.is_bot and not winner_check(user_number): # тут будет еще проверка count % 500 == 0 - # record_id = select_id_from_users(message.from_user.id) + record_id = select_id_from_users(message.from_user.id) + + insert2( + nickname=message.from_user.username, user_name=message.from_user.first_name, + user_id=message.from_user.id, dtime=datetime.datetime.now(), + chat_id=message.chat.id, is_winner=0) temp_save(chat_id=message.chat.id, record_id=select_id_from_users(user_id=message.from_user.id), - message_id=message.id) - - # insert2( - # nickname=message.from_user.username, user_name=message.from_user.first_name, - # user_id=message.from_user.id, dtime=datetime.datetime.now(), - # chat_id=message.chat.id, is_winner=1) + ) - bot.send_message(message.chat.id, f'Не бот и отсутствует в списке победителей. Что с ним делать?', + bot.send_message(message.chat.id, f'Не бот и отсутствует в списке победителей. Что с ним делать?{record_id}', reply_markup=markup) else: @@ -48,8 +48,14 @@ def handler_new_member(message): def callback(call): if call.message: if call.data == 'grac': + message_id = call.message.message_id + + # temp_save_bot_message(bot_message_id=call.message.message_id) + + + bot.delete_message(chat_id=call.message.chat.id, message_id=call.message.message_id) - bot.send_message(call.message.chat.id, 'Поздравили и добавили в базу') + bot.send_message(call.message.chat.id, f'Поздравили и добавили в базу. Тест по message id {message_id}') else: bot.delete_message(chat_id=call.message.chat.id, message_id=call.message.message_id) From b9ec973000cc18e8653e61ce7da82b156a7300cd Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Thu, 14 Jul 2022 13:09:53 +0300 Subject: [PATCH 079/113] minor changes --- README.md | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 7edcf2f..6ea1a9e 100644 --- a/README.md +++ b/README.md @@ -14,15 +14,16 @@ * Python 3.9+ * [pyTelegramBotAPI](https://github.com/python-telegram-bot/python-telegram-bot) – Python Telegram Bot API -* dotenv tbc +* [dotenv](https://pypi.org/project/python-dotenv/) - виртуальное окружение dotenv Если вы планируете запускать приложение локально, то можете установить все зависимости, выполнив следующую команду: `pip install -r requirements.txt`. ## Запуск приложения ### Подготовка к запуску -1. Если у вас еще нет telegram-бота, создайте его с помощью @BotFather и сохраните token от бота. +1. Если у вас еще нет telegram-бота, создайте его с помощью @BotFather бота и сохраните token от вашего бота. 2. Добавьте вашего бота во все telegram-чаты, где вы хотите, чтобы он отслеживал юбилейных участников. +3. Определите пользователей, которые будут обладать правами администратора, и узнайте их user_id с помощью @username_to_id_bot бота. Приложение можно запустить локально либо через контейнер docker. @@ -74,7 +75,7 @@ где `telegram-bot` - пример названия контейнера. Можно дать другое название контейнеру. 5. Запустить контейнер, введя в терминале команду: - docker run --name telegram-bot --volume c:\Users\Наташик\PycharmProjects\tg-bot-users\database:/app/database -e BOT_TOKEN=type_your_token -e ADMIN_IDS='["user_id_of_first_admin", "user_id_of_second_admin"]' telegram-bot:latest + docker run --name telegram-bot --volume c:\Users\tg-bot-users\database:/app/database -e BOT_TOKEN=type_your_token -e ADMIN_IDS='["user_id_of_first_admin", "user_id_of_second_admin"]' telegram-bot:latest где `type_your_token` - token от вашего бота; `user_id_of_first_admin` и `user_id_of_second_admin` - user_id тех пользователей, которым вы хотите дать права администрирования (их не обязательно должно быть двое, может быть один, может быть больше); @@ -84,14 +85,33 @@ Теперь бот запущен и готов к работе! +### Настройка админки + +По умолчанию команды боту работают только в чатах модераторов. Поэтому сразу после запуска бота администратор должен вызвать команду `/adminsetup` и настроить группы модераторов, в которые будут приходить уведомления из указанных групп пользователей. Для этой операции нужно узнать chat_id групп с помощью @username_to_id_bot бота, перенаправив ему любое сообщение из чата, chat_id которого вам нужно узнать. +Сразу после этой настройки все остальные команды будут доступны всем пользователям в группах модераторов. + ## Команды бота -* `/start` - запуск бота, выполняется автоматически при подключении к боту. +По умолчанию все команды боту работают только в чатах модераторов (за исключением `/adminsetup`). + +* `/start` - запуск бота, выполняется автоматически при подключении к боту * `/help` - список команд и их описание +* `/adminsetup` - установка настроек админки (доступно только администраторам) +* `/adminshow` - просмотр настроек админки * `/luckylist` - по запросу названия группы присылать список всех зафиксированных пользователей за время работы +* `/unceleb` - запрос последних непоздравленных участников + +## Команда /adminsetup + +Доступ к этой команде есть только у пользователей, user_id которых был перечислен в файле .env в переменной ADMIN_IDS при запуске бота. +1. Вам нужно узнать chat_id групп модераторов и групп пользователей, которые вы хотите добавить в настройки. Это можно сделать с помощью @username_to_id_bot бота, перенаправив ему любое сообщение из чата, chat_id которого вам нужно узнать. +2. При запуске команды бот запрашивает подтверждение того, что вы хотите изменить настройки админки. Если вы нажмете "да", все текущие настройки сбросятся и их будет нельзя восстановить. Если перед этой командой вы хотите узнать текущие настройки, введите команду `/adminshow`. +3. Если вы нажали "да", то бот запросит данные по id группам модераторов (id_ГМ) и id группам пользователей (id_ГП) в формате: id_ГМ id_ГП_1 id_ГП_2 id_ГП_3 +4. Для одной группы модераторов укажите ее id_ГМ и через пробелы укажите все id_ГП тех чатов, которые подведомственны этой группе модераторов. Обязательно вводите реальные chat_id, чтобы бот работал корректно и без ошибок. +5. Бот спросит, хотите ли вы добавить еще данные по группам модераторов и пользователей в админку. Если да, то проделайте п.4 столько раз, сколько вам требуется. +6. После завершения настроек админки все остальные команды станут доступны всем пользователям в указанных группах модераторов. -tbc по каждой команде + dotenv From 502eeb45a69c427b4a3e96c1ea3a337c4c3a2e90 Mon Sep 17 00:00:00 2001 From: Vladimir Kireev Date: Thu, 14 Jul 2022 13:46:13 +0300 Subject: [PATCH 080/113] temp_save is working --- database/commands.py | 13 +++---------- database/database.db | Bin 32768 -> 32768 bytes handlers/register_new_user.py | 27 ++++++--------------------- 3 files changed, 9 insertions(+), 31 deletions(-) diff --git a/database/commands.py b/database/commands.py index fe72284..11c7b3e 100644 --- a/database/commands.py +++ b/database/commands.py @@ -122,18 +122,11 @@ def select_id_from_users(user_id) -> None: def temp_save( chat_id: int, record_id: int, + bot_message_id: int ) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(""" - INSERT INTO 'temp_storage' (chat_id, record_id) VALUES (?, ?); - """, (chat_id, record_id)) - + INSERT INTO 'temp_storage' (chat_id, record_id, bot_message_id) VALUES (?, ?, ?); + """, (chat_id, record_id, bot_message_id)) - -def temp_save_bot_message( - bot_message_id: int - ) -> None: - with sqlite3.connect((DB)) as conn: - cursor = conn.cursor() - cursor.execute("""INSERT INTO 'temp_storage' (bot_message_id) VALUES (?);""", (bot_message_id)) \ No newline at end of file diff --git a/database/database.db b/database/database.db index b28891a0072cb1401bf5738d28a2c4340749d0fb..e55d4ece69e1b62f04d7d72898f9898f23dd0ade 100644 GIT binary patch delta 158 zcmZo@U}|V!njpp zvp8dEacWVq;O5u*k^%y3{3{svKkz@|zrufve+U1H&4LP3_yzdbSQ%IunIHxTa(&*s I!{5UI046mqp8x;= delta 155 zcmZo@U}|V!njpk1?#UCS Date: Thu, 14 Jul 2022 16:25:42 +0300 Subject: [PATCH 081/113] buttons_remover is working --- database/commands.py | 11 +++++++++++ database/database.db | Bin 32768 -> 32768 bytes handlers/register_new_user.py | 8 ++++---- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/database/commands.py b/database/commands.py index 11c7b3e..af42b34 100644 --- a/database/commands.py +++ b/database/commands.py @@ -130,3 +130,14 @@ def temp_save( INSERT INTO 'temp_storage' (chat_id, record_id, bot_message_id) VALUES (?, ?, ?); """, (chat_id, record_id, bot_message_id)) + + +def buttons_remover(): + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(f"SELECT bot_message_id FROM 'temp_storage'") + result = cursor.fetchall() + delete_list = [] + for i in result: + delete_list.extend(i) + return delete_list \ No newline at end of file diff --git a/database/database.db b/database/database.db index e55d4ece69e1b62f04d7d72898f9898f23dd0ade..4df4431325b88960992f8c1f38c72603ad393125 100644 GIT binary patch delta 394 zcmZo@U}|V!njp Date: Thu, 14 Jul 2022 16:43:56 +0300 Subject: [PATCH 082/113] buttons_remover is working v2 --- database/commands.py | 6 ++++-- database/database.db | Bin 32768 -> 32768 bytes handlers/register_new_user.py | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/database/commands.py b/database/commands.py index af42b34..764885c 100644 --- a/database/commands.py +++ b/database/commands.py @@ -132,10 +132,12 @@ def temp_save( -def buttons_remover(): +def buttons_remover( + chat_id: int, + ) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - cursor.execute(f"SELECT bot_message_id FROM 'temp_storage'") + cursor.execute(f"SELECT bot_message_id FROM 'temp_storage' WHERE chat_id={chat_id}") result = cursor.fetchall() delete_list = [] for i in result: diff --git a/database/database.db b/database/database.db index 4df4431325b88960992f8c1f38c72603ad393125..c879fe8266f7acc7b7a1a55f64ae866ee2370bf4 100644 GIT binary patch delta 201 zcmZo@U}|V!njp>CI8nx#v2kO<5`Jb;&c~D41vGg$A9Dx8;Ks(~oJ`IVlN+TCMNEvW zOilF6j7=?!%>IjASk`XkEDn;`94*x%%EQCS%`DDXTAW%`EV22uzL Date: Thu, 14 Jul 2022 21:42:17 +0300 Subject: [PATCH 083/113] Aded storage cleaner --- database/commands.py | 13 ++++++++++++- database/database.db | Bin 32768 -> 32768 bytes handlers/register_new_user.py | 5 ++++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/database/commands.py b/database/commands.py index 764885c..40218a6 100644 --- a/database/commands.py +++ b/database/commands.py @@ -142,4 +142,15 @@ def buttons_remover( delete_list = [] for i in result: delete_list.extend(i) - return delete_list \ No newline at end of file + return delete_list + + +def storage_cleaner( + chat_id: int, + ) -> None: + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(f'''DELETE FROM 'temp_storage' WHERE chat_id={chat_id};''') + + + diff --git a/database/database.db b/database/database.db index c879fe8266f7acc7b7a1a55f64ae866ee2370bf4..8936125858fac4194019d390eac7d0281a843a4c 100644 GIT binary patch delta 550 zcmZvWKTpCy7{>34SfJ1=f}s5Epp)k8U3=}(&2+-Sxawp~`~nbX%H-mpAt7;bFowa6 z@C9Ua(of)SOpFP{L>E1vR0i`-&-;6x_j!F^@_p&D2)kD$4|e;no^*9zY`srP(({^J;Z|3^h3WVTFdJjTXp1SI@6B*@N)fQqUCI8nx#v2kO<5`Jb;&c~D41+=-igJE!E<8n?WXNk#;(uSMGq)v+R z@NjZ7i!+uMrxq1UY<{gTCLqthgMo)Xf`R`7{|o*H{5SY7@UP&X!Qa7O!Jok&!GB=0 zpn?T|Js&qK11lrbf3XY8+O5R7*Yj~9@x{1T@^K>ZMY)&paUk(Uxaae+Bk_f~XY#Qj z@ddd)GcYi4urf0I=i@;Vm*76m#>&dT%gCT9z{Ub*@Ut<4X+Ab4FwM)yh@^py^TDD3 F0|4L$MHK)5 diff --git a/handlers/register_new_user.py b/handlers/register_new_user.py index 48cc541..b47968c 100644 --- a/handlers/register_new_user.py +++ b/handlers/register_new_user.py @@ -1,7 +1,7 @@ from loader import bot from database.commands import insert, insert2 import datetime -from database.commands import winner_check, select_id_from_users, temp_save, buttons_remover +from database.commands import winner_check, select_id_from_users, temp_save, buttons_remover, storage_cleaner from telebot import types @@ -17,6 +17,7 @@ def handler_new_member(message): if not message.from_user.is_bot and not winner_check(user_number): # тут будет еще проверка count % 500 == 0 # record_id = select_id_from_users(message.from_user.id) + insert2( nickname=message.from_user.username, user_name=message.from_user.first_name, user_id=message.from_user.id, dtime=datetime.datetime.now(), @@ -31,6 +32,8 @@ def handler_new_member(message): bot_message_id=message.id ) + storage_cleaner(chat_id=message.chat.id) + else: bot.send_message(message.chat.id, f'Есть в списке победителей{winner_check(user_number)}') From 8377a0be9830ca2f1e0a2e4ebd2d69e4f549bbab Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Fri, 15 Jul 2022 10:03:08 +0300 Subject: [PATCH 084/113] finalized readme --- README.md | 89 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 72 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 6ea1a9e..6f85052 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,16 @@ # tg-bot-users 🤖 Телеграм-бот отслеживает юбилейных пользователей групп. По умолчанию, юбилейными считаются участники, кратные 500. Эти настройки можно изменить при конфигурации бота. -При вступлении в комьюнити-группу нового, юбилейного участника бот присылает в группу модераторов уведомление с именем, ником, id пользователя, юбилейным номером и датой и временем вступления. +При вступлении в комьюнити-группу нового, юбилейного участника бот присылает в группу модераторов уведомление с именем, ником, id пользователя, юбилейным номером и датой и временем вступления, а также кнопкой "Поздравить" для автоматического поздравления юбилейного участника. Помимо юбилейных, бот сохраняет двух последующих участников, так как юбилейным может вступить не пользователь, а бот или модератор. ## Особенности +* Бот проверяет, является ли новый юбилейный пользователь ботом, и если да, то не сохраняет информацию о нем и не считает его юбилейным. +* Бот проверяет, был ли уже новый юбилейный пользователь победителем, и если да, то не сохраняет информацию о нем и не считает его юбилейным. +* Настройки администрирования доступны только пользователям с правами администраторов. * Команды боту доступны только в чатах модераторов. -* Настройки администрирования доступны только пользователям с правам администраторов. -* Чтобы поздравить юбилейного пользователя, нужно просто нажать кнопку Поздравить. +* Поздравление юбилейных пользователей автоматизировано. ## Requirements @@ -20,14 +22,14 @@ ## Запуск приложения -### Подготовка к запуску +### 1. Подготовка к запуску 1. Если у вас еще нет telegram-бота, создайте его с помощью @BotFather бота и сохраните token от вашего бота. 2. Добавьте вашего бота во все telegram-чаты, где вы хотите, чтобы он отслеживал юбилейных участников. 3. Определите пользователей, которые будут обладать правами администратора, и узнайте их user_id с помощью @username_to_id_bot бота. Приложение можно запустить локально либо через контейнер docker. -### Запустить приложение локально +### 2а. Запустить приложение локально 1. Создать файл .env и наполнить его согласно инструкции из файла /.env.template. 2. Скачать приложение tg-bot-users в нужную директорию. @@ -36,9 +38,9 @@ 5. Установить зависимости, выполнив в терминале следующую команду: `pip install -r requirements.txt`. 6. Запустить файл main.py -Теперь бот запущен локально и готов к работе! +Бот запущен! Переходите к настройкам админки. -### Запустить приложение через контейнер docker: +### 2б. Запустить приложение через контейнер docker: #### Вариант 1: через файл .env @@ -61,7 +63,7 @@ При работе на операционной системе Windows в пути стоит писать обратный слэш, как в примере. При работе с другими операционными системами в пути стоит писать прямой слэш `/`. Эта команда позволит не терять данные из базы данных при перезапуске приложения и контейнера. -Теперь бот запущен и готов к работе! +Бот запущен! Переходите к настройкам админки. #### Вариант 2: через передачу параметров при запуске docker контейнера @@ -83,36 +85,89 @@ При работе на операционной системе Windows в пути стоит писать обратный слэш как в примере. При работе с другими операционными системами в пути стоит писать прямой слэш `/`. Эта команда позволит не терять данные из базы данных при перезапуске приложения и контейнера. -Теперь бот запущен и готов к работе! +Бот запущен! Переходите к настройкам админки. -### Настройка админки +### 3. Настройка админки -По умолчанию команды боту работают только в чатах модераторов. Поэтому сразу после запуска бота администратор должен вызвать команду `/adminsetup` и настроить группы модераторов, в которые будут приходить уведомления из указанных групп пользователей. Для этой операции нужно узнать chat_id групп с помощью @username_to_id_bot бота, перенаправив ему любое сообщение из чата, chat_id которого вам нужно узнать. +По умолчанию команды боту работают только в чатах модераторов. Поэтому сразу после запуска бота администратор должен вызвать команду `/adminsetup` и настроить группы модераторов, в которые будут приходить уведомления из указанных групп пользователей. Для этой операции нужно узнать chat_id групп с помощью @username_to_id_bot бота, отправив ему invite-ссылку на вступление в чат, chat_id которого вам нужно узнать. Сразу после этой настройки все остальные команды будут доступны всем пользователям в группах модераторов. ## Команды бота По умолчанию все команды боту работают только в чатах модераторов (за исключением `/adminsetup`). -* `/start` - запуск бота, выполняется автоматически при подключении к боту +* `/start` - запуск бота * `/help` - список команд и их описание * `/adminsetup` - установка настроек админки (доступно только администраторам) * `/adminshow` - просмотр настроек админки * `/luckylist` - по запросу названия группы присылать список всех зафиксированных пользователей за время работы * `/unceleb` - запрос последних непоздравленных участников -## Команда /adminsetup +### Команда /adminsetup -Доступ к этой команде есть только у пользователей, user_id которых был перечислен в файле .env в переменной ADMIN_IDS при запуске бота. +Доступ к команде есть только у пользователей, user_id которых был перечислен в файле .env в переменной ADMIN_IDS при запуске бота. -1. Вам нужно узнать chat_id групп модераторов и групп пользователей, которые вы хотите добавить в настройки. Это можно сделать с помощью @username_to_id_bot бота, перенаправив ему любое сообщение из чата, chat_id которого вам нужно узнать. +1. Вам нужно узнать chat_id групп модераторов и групп пользователей, которые вы хотите добавить в настройки. Это можно сделать с помощью @username_to_id_bot бота, отправив ему invite-ссылку на вступление в чат, chat_id которого вам нужно узнать. 2. При запуске команды бот запрашивает подтверждение того, что вы хотите изменить настройки админки. Если вы нажмете "да", все текущие настройки сбросятся и их будет нельзя восстановить. Если перед этой командой вы хотите узнать текущие настройки, введите команду `/adminshow`. 3. Если вы нажали "да", то бот запросит данные по id группам модераторов (id_ГМ) и id группам пользователей (id_ГП) в формате: id_ГМ id_ГП_1 id_ГП_2 id_ГП_3 -4. Для одной группы модераторов укажите ее id_ГМ и через пробелы укажите все id_ГП тех чатов, которые подведомственны этой группе модераторов. Обязательно вводите реальные chat_id, чтобы бот работал корректно и без ошибок. +4. Для одной группы модераторов укажите ее id_ГМ и через пробелы укажите все id_ГП тех чатов, которые подведомственны этой группе модераторов. Обязательно вводите реальные и корректные chat_id, чтобы бот работал корректно и без ошибок. Помните, что chat_id - это натуральное число. 5. Бот спросит, хотите ли вы добавить еще данные по группам модераторов и пользователей в админку. Если да, то проделайте п.4 столько раз, сколько вам требуется. 6. После завершения настроек админки все остальные команды станут доступны всем пользователям в указанных группах модераторов. - +### Команда /adminshow + +Команда выводит список всех настроенных id Групп Модераторов, куда приходят уведомления из указанных id Групп Пользователей, с группировкой по id Группам Модераторов. + +### Команда /luckylist + +Команда выводит список всех зафиксированных юбилейный пользователей за время работы из всех групп пользователей, которые подведомственны той группе модераторов, из которой была введена команда. +Все участники, которые уже были поздравлены, отмечены символами короны. +Обратите внимание, что если юбилейным пользователем вступил бот или участник, который уже был победителем, он не будет зафиксирован как юбилейный пользователь и не будет выводится этой командой. + +### Команда /unceleb + +Команда выводит список последних непоздравленных пользователей из всех групп пользователей, которые подведомственны той группе модераторов, из которой была введена команда. Если последних непоздравленных пользователей нет, то ничего не выведется. +Эту команду уместно использовать после ошибочного нажатия кнопок "Не поздравлять" для пользователя, которого требовалось поздравить. + +## Для разработчиков + +Структура приложения: +* `config_data/`: + * `config.py` - загрузка переменных окружения и команд боту +* `handlers/`: + * `admin.py` - хендлер для обработки команд `/adminshow` и `/adminsetup` + * `lucky_list.py` - хендлер для обработки команды `/luckylist` + * `register_new_user.py` - логика по обработке новых юбилейных пользователей с автоматизацией поздравления + * `unceleb.py` - хендлер для обработки команды `/unceleb` + * `default_handlers/` - хендлеры для обработки команд `/start` и `/help` +* `keyboards/inline` - inline-клавиатуры для соответствующих команд боту +* `utils/set_bot_commands.py` - установка команд бота +* `.env.template` - шаблон оформления файла .env +* `database/`: + * `commands.py` - все функции для обращения к SQLite-базе данных + * `database.py` - SQLite база данных: + * таблица 'users' (хранение информации о всех зафиксированных юбилейный пользователях): + * id (INTEGER) - первичный ключ + * nickname (STRING) - ник пользователя в telegram + * user_name (STRING) - имя пользователя в telegram + * user_id (INTEGER) - уникальный id пользователя в telegram + * dtime_connetion (DATETIME) - дата и время вступления пользователя в группу пользователей + * congr_number (INTEGER) - юбилейный порядковый номер вступления пользователя в группу пользователей + * chat_id (INTEGER) - уникальный id группы пользователей + * is_winer (INTEGER) - является ли пользователь победителем (был поздравлен): 1 да, 0 нет + * таблица 'groups_relation' (хранение настроек админки): + * relation_id (INTEGER) - первичный ключ + * moderator_id (INTEGER) - уникальный id группы модераторов + * group_id (INTEGER) - уникальный id группы пользователей + * таблица 'temp_storage' (хранение информации о последних непоздравленных пользователях): + * storage_id (INTEGER) - первичный ключ + * chat_id (INTEGER) - уникальный id группы пользователей, в которую вступил юбилейный пользователь + * record_id (INTEGER) - id записи о данном юбилейном пользователе из таблицы 'users' + * bot_message_id (INTEGER) - уникальный id сообщения бота о юбилейном пользователе с кнопкой "Поздравить" + * связь таблиц 'users' и 'groups_relation': + * 'users'.chat_id = 'groups_relation' + * связь таблиц 'users' и 'temp_storage': + * 'users'.id = 'temp_storage'.record_id From db49eb809fe646131185d3e373c4f1f377b9313f Mon Sep 17 00:00:00 2001 From: Vladimir Kireev Date: Fri, 15 Jul 2022 12:09:51 +0300 Subject: [PATCH 085/113] upd register_new_user.py in provide to temp_save; is_winner_record developing --- database/commands.py | 17 +++++++++++++++++ database/database.db | Bin 32768 -> 32768 bytes handlers/register_new_user.py | 18 ++++++++++-------- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/database/commands.py b/database/commands.py index 40218a6..ebb1cfb 100644 --- a/database/commands.py +++ b/database/commands.py @@ -153,4 +153,21 @@ def storage_cleaner( cursor.execute(f'''DELETE FROM 'temp_storage' WHERE chat_id={chat_id};''') +def is_winner_record( + bot_message_id: int, + ) -> None: + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + # cursor.execute(f'''INSERT INTO users (is_winner) VALUES (?) + # SELECT users.is_winner FROM users Join temp_storage ON users.id=temp_storage.record_id + # WHERE temp_storage.bot_message_id={bot_message_id};''') + a = cursor.execute(f'''SELECT users.is_winner FROM users Join temp_storage ON users.id=temp_storage.record_id + WHERE temp_storage.bot_message_id={bot_message_id};''') + for i in a: + + print(i, end='') + + + + diff --git a/database/database.db b/database/database.db index 8936125858fac4194019d390eac7d0281a843a4c..9037b3224bb5f2ad7674c1466fd23726c724f5f0 100644 GIT binary patch literal 32768 zcmeI5U2GKB6~||GXFt3i&j0}y0*1lHU}H1P_ZNh+;4N~oNlHvpSBh3^yub$A3%hGl zmxl;K6{(e?w2Bm^suU@T(gzv|ArhgWGdhYDb z`r62bp{Nh(S!rhH+?o0N-rqg<+?n;JuvjffM@!|2d{xq!Wem$QdnAcrm>F1- zuq0q%VJX7G!4iB(+TA`gjQqqm+S;CAIG%}$9RKsSfAdV+7pY6F|G3+!xE~210VIF~ zkN^@u0!RP}5CZ&R=AY@EJK1O1YJPOQP&qXY7qFG;)L5~Us}?3s=9Ws1?>m&u3}>a` z%-+GQw8**LDM>1hNdpIm`(SIbc;v)nexe{9JUm3~sY;=oyCY%l__1nnqL4dMnw%_D zi>1lnG)OoG=S@wF7RrJ2k>mMlZtl!tCHHi3a&9-+{#oSkRF62qzLD_P<9PylfyvD)=YpM5cW@S^zf`U#N@Im`9=K4)_es7gl_DK{bQtP;a1bhsd7U`v z+5Jm-<0AeyANC>#5hqaIKL-Rig5Tpk}jG;nag)Svx&=J4RK)KPn*HqmODy^e zNF%&7&FDNZ^{Q#^>?RrQgEM>Tk@{!pvm1MSk3Bo}-+SyFmZcn(u7AI(0+;NgTmhuw zR^0_+kX2T^O){JmZwsFZ7lbE;b!{KCJ=5m#xA=?v34TlKpId+0I?}o_^_$cWQrQ&K za<%1ji<vNLfb@p57~A;y0l|9*T=>~`#}*r`|__ZRL}?n!P<^taLHqXSVc z@^0jN5tIF#y}%x2H!*)?UaB)%WW8@!is{_MF&QS7JUyNtJ5emVuBLtqHj5L*vUFfD zx1p*jnzmiBx2vY4YM!Ebx+d$EWt--gt81@6=k41WUPSeDOLkR9HSC6n7g9v^OwH32 z+13@)RvRL2Xb}T+RM|Bx#j+YAPIwW;(+pX2Oha=TB6esI-SG@vR#a1Ww1$WkUc~ZL zUDj1wQ-k7|;YD;J;##(11YnKuBEZCw4a2exw^1BDw20z(iXtoEfOfz{3ol}OIxsOz z-3n?)4KHGNx(Q%aT@8w(+>eN2$)>G2ir!$dBfJQ-L7jkgG@~IRhZIpf)A2M-RxMX) zGT9zp1i)&tqglEY)J|V`5!2HR8Cs6+1|q%TMO4qwWYe-#TWK)a7G4BA)|H{@Sa#5M zdP0jBwrAS1Wf*!h6m*9dF+IbU9mi3dpUCOp*ng{x$8sIfDY8uWJOafH3*FB z!i!j*3DMPbG&`u=heL~KI=QHTFmEYAkFz$si0WykY?HPZFj*5$M71C)dZr;;I+Q1f zY3a}+nn8-AnU-q>-PY>xBGB|)*>DZT4m!|P_ag$Ad{D(o5a%;1LFAqt9*C%ZfOZXN zctHg}6gnTO>1nELK}PhTFe}1~=pI}R=sNTiK~9#36wyftfXggb)2(JsmW31n7Xd8L zecEvG8FZgwcoCz1=?SqYh-gB15prn)U=_g9=*Zhbix{S-I?!?)HRx{!d0(V66Nymw zIa&}F>-Rae%eA*^7i*Vl7qw=LRQxcjc!mkCt3r3o-inS7CLg5Qo)c6hruJ^_%17sFzo@;VE}o(2U(XE2A83AJDJGqc`mD+&_>E|k^dr_EuG|}+ z+35IQF2%I3sw*5V7ske>O^bYg=llzE8cP(3osC}ak3uds)-^^;6<4WDoh+1LtCGDc z&VgB~re>K>Gm#Xt&Mym_d_{=k7rTZoT8X+F%_OKV-zeiGLD56yI3nejJmL01`j~NB{{S0VIF~kN^@u0!RP} zAc6lC0da;|&n|eBg@eQdBtjlK*kydQi>05=QCnK0Y1V&$WA{U;Xz#+aV{PJ1CMI5D z#P`H6#OvY*u!$cefCP{L5^knu$?59x(xlpR`@Ny%@E|=O z_VX^^?Ku#vKR z`F+9$%HGC*O=zd=9)72=p0c}nOISzQTX{uzn6kIGO zS{`E}Y=pVd-ugMY|94?9zWBEIw5a0ve;oh6U}6O_k`u@O&!22U^>F>27uDl*qUnG}#r35XvgfCP{L z50(fc*bIBA#Z%tFXck5fz4&vH#ArMT3GpW;8be}46QhDZc+r_+st0%S=Dly`dw=t`R6?Z^ zDqH3}0047Qxky(!y5Ric=nZz*H17agUDnJA^9#Gn&ayClOK;L)(>9(Pt}$e2`U8DN z?;+pG5;;RUv~}&8c3f+~Pw-_tfIaH+;_Qry`hxCi%l^u-=JSei1Q1}^QYem~<~~gH zG*cP@Rf&MuA%lQWn;b$2o9-pMU4dVvGel@Nv%=K9M2FFPS@>&*Zr$PNE$MZE@M>g3l(8^gmUS5u94Vjep zP~!&lZ`^mJh8=yA^eVRMq_^fnTA+V`Qs$MC%EFVZRn@kp?&u(*9%T7mS0_|PmUc>Uq zTxxv07>No!af$1(tF#oTrO=M1;n25%@h03PK^1i2Yf}>4~H{c(t;L#tfkqBEn$z%4J zZL=3_gS}xZmA26e>+(nl%4;f?WH^{`3LaIGAn!>LnpZ9h&8w4y<|QDHBw?QBH{k-! AKmY&$ diff --git a/handlers/register_new_user.py b/handlers/register_new_user.py index b47968c..e400f34 100644 --- a/handlers/register_new_user.py +++ b/handlers/register_new_user.py @@ -1,7 +1,8 @@ from loader import bot from database.commands import insert, insert2 import datetime -from database.commands import winner_check, select_id_from_users, temp_save, buttons_remover, storage_cleaner +from database.commands import winner_check, select_id_from_users,\ + temp_save, buttons_remover, storage_cleaner, is_winner_record from telebot import types @@ -14,25 +15,26 @@ def handler_new_member(message): shame = types.InlineKeyboardButton(text='Не поздравляем', callback_data='decline') markup.add(congratulations, shame) + if not message.from_user.is_bot and not winner_check(user_number): # тут будет еще проверка count % 500 == 0 # record_id = select_id_from_users(message.from_user.id) - insert2( nickname=message.from_user.username, user_name=message.from_user.first_name, user_id=message.from_user.id, dtime=datetime.datetime.now(), - chat_id=message.chat.id, is_winner=0) + chat_id=message.chat.id, is_winner=1) - bot.send_message(message.chat.id, f'Не бот и отсутствует в списке победителей. Что с ним делать?{select_id_from_users(message.from_user.id)}', + bot_message = bot.send_message(message.chat.id, f'Не бот и отсутствует в списке победителей. ' + f'Что с ним делать?', reply_markup=markup) temp_save(chat_id=message.chat.id, record_id=select_id_from_users(user_id=message.from_user.id), - bot_message_id=message.id + bot_message_id=bot_message.id ) - storage_cleaner(chat_id=message.chat.id) + # storage_cleaner(chat_id=message.chat.id) else: bot.send_message(message.chat.id, f'Есть в списке победителей{winner_check(user_number)}') @@ -41,10 +43,10 @@ def handler_new_member(message): def callback(call): if call.message: if call.data == 'grac': + is_winner_record(bot_message_id=call.message.message_id) bot.delete_message(chat_id=call.message.chat.id, message_id=call.message.message_id) - bot.send_message(call.message.chat.id, f'Поздравили и добавили в базу. Тест по message id ' - f'{buttons_remover(chat_id=call.message.chat.id)}') + bot.send_message(call.message.chat.id, f'Поздравили и добавили в базу.') else: bot.delete_message(chat_id=call.message.chat.id, message_id=call.message.message_id) From dc60d04cd41305f0f57128260896d2f009c5fa77 Mon Sep 17 00:00:00 2001 From: Vladimir Kireev Date: Fri, 15 Jul 2022 15:00:24 +0300 Subject: [PATCH 086/113] is_winner_record working --- database/commands.py | 24 ++++++++++++++++++------ database/database.db | Bin 32768 -> 32768 bytes handlers/register_new_user.py | 9 ++++++--- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/database/commands.py b/database/commands.py index ebb1cfb..f41534b 100644 --- a/database/commands.py +++ b/database/commands.py @@ -153,19 +153,31 @@ def storage_cleaner( cursor.execute(f'''DELETE FROM 'temp_storage' WHERE chat_id={chat_id};''') -def is_winner_record( +def is_winner_id_select( bot_message_id: int, ) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() # cursor.execute(f'''INSERT INTO users (is_winner) VALUES (?) - # SELECT users.is_winner FROM users Join temp_storage ON users.id=temp_storage.record_id - # WHERE temp_storage.bot_message_id={bot_message_id};''') - a = cursor.execute(f'''SELECT users.is_winner FROM users Join temp_storage ON users.id=temp_storage.record_id + # SELECT users.is_winner FROM users Join temp_storage ON users.id=temp_storage.record_id + # WHERE temp_storage.bot_message_id={bot_message_id};''', (is_winner,)) + result = cursor.execute(f'''SELECT users.id FROM users Join temp_storage ON users.id=temp_storage.record_id WHERE temp_storage.bot_message_id={bot_message_id};''') - for i in a: + id = [] + for i in result: + id.append(i) + + print(id[0][0]) + return id[0][0] + - print(i, end='') +def is_winner_record(winner_id: int, + winner_result: int, + ) -> None: + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(f'''UPDATE users set is_winner = '1' + WHERE id={winner_id}''') diff --git a/database/database.db b/database/database.db index 9037b3224bb5f2ad7674c1466fd23726c724f5f0..dec87ca4ec8533ec4099311cd1a00ead80a33cdc 100644 GIT binary patch delta 930 zcmYk3J!lj`6vuBbd$;%X-o_9j5<`L>X(W@Ko!Q;l@iZTM`A*I&6h%d%Xc4S5@dHHe z1VIH0!&wS8esp3y8?}j&B8^}nVkd%?+No{yPIqLw`OS~_=KtQ*>&bdOd8gOdTHP5L zTWgE=`;CET1E1_dl+AZ+H!dunIlo+OejDD=*+HP#utvioax7vun(!08zVz@gaOHn3i(VU$XwjO6d0caLt!DqO*FjSs*%9MiZ0Cva5b1vrKy8qdQK z+^_K*9KwAX&q5VT8qYv&0rzSb(=dxt<0+WJP~%A`qtJK)N*HKd27$iD5peW09tQ`x z#$&r+2$^;<3WMlsJOb%vxw3BL`ZBu{_DlPcO&i#G%SaDU;f2-V3c>fzlv7)V!MSHFwew%hz#Us8ZshRn4gkS7EA0RP diff --git a/handlers/register_new_user.py b/handlers/register_new_user.py index e400f34..972730b 100644 --- a/handlers/register_new_user.py +++ b/handlers/register_new_user.py @@ -2,7 +2,7 @@ from database.commands import insert, insert2 import datetime from database.commands import winner_check, select_id_from_users,\ - temp_save, buttons_remover, storage_cleaner, is_winner_record + temp_save, buttons_remover, storage_cleaner, is_winner_id_select, is_winner_record from telebot import types @@ -22,7 +22,7 @@ def handler_new_member(message): insert2( nickname=message.from_user.username, user_name=message.from_user.first_name, user_id=message.from_user.id, dtime=datetime.datetime.now(), - chat_id=message.chat.id, is_winner=1) + chat_id=message.chat.id, is_winner=0) bot_message = bot.send_message(message.chat.id, f'Не бот и отсутствует в списке победителей. ' @@ -43,7 +43,10 @@ def handler_new_member(message): def callback(call): if call.message: if call.data == 'grac': - is_winner_record(bot_message_id=call.message.message_id) + winner = is_winner_id_select(bot_message_id=call.message.message_id) + print(winner) + is_winner_record(winner_id=winner, winner_result=1) + bot.delete_message(chat_id=call.message.chat.id, message_id=call.message.message_id) bot.send_message(call.message.chat.id, f'Поздравили и добавили в базу.') From 4de16a7ddde45f649ba58a77ce6ec01cbf9a9cd2 Mon Sep 17 00:00:00 2001 From: Vladimir Kireev Date: Fri, 15 Jul 2022 15:29:03 +0300 Subject: [PATCH 087/113] add delete button cicle --- database/commands.py | 6 +----- database/database.db | Bin 32768 -> 32768 bytes handlers/register_new_user.py | 9 ++++++--- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/database/commands.py b/database/commands.py index f41534b..4238063 100644 --- a/database/commands.py +++ b/database/commands.py @@ -158,21 +158,17 @@ def is_winner_id_select( ) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - # cursor.execute(f'''INSERT INTO users (is_winner) VALUES (?) - # SELECT users.is_winner FROM users Join temp_storage ON users.id=temp_storage.record_id - # WHERE temp_storage.bot_message_id={bot_message_id};''', (is_winner,)) result = cursor.execute(f'''SELECT users.id FROM users Join temp_storage ON users.id=temp_storage.record_id WHERE temp_storage.bot_message_id={bot_message_id};''') id = [] for i in result: + print(i) id.append(i) - print(id[0][0]) return id[0][0] def is_winner_record(winner_id: int, - winner_result: int, ) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() diff --git a/database/database.db b/database/database.db index dec87ca4ec8533ec4099311cd1a00ead80a33cdc..21fa7bbc3940024331b276c80bfb42c06d85a171 100644 GIT binary patch delta 1734 zcmcK4-)kII6bJA-lTDM&-n+Z`K}-!vSBhy(&Fr0DJG0Z6WZl--cH3@kt4T^_E3r@h zh}JbfYMBi!^r1l#2I&v5?vo+~iLSmBrKuFD52fjYMWofd_+*p?1EL6e=FaZ<0|dDY z?B{#VxjQo#rc{zkC3*4DsMJdcX@;u_u7;)UDOu|Mv`~(@4BXywo5ZfirekXK*XXtA z@n|=@!(8Ujb@~x~iS|Ukk9d&-kx0vJ`S1U{Zpd@8DOIIw(n;wt@_<}~KPIH&#?Qzh zLR!vxufCP>e++r^#bl>yIjXH_nr*1|Kb@-|o_7cd|LK>!zG55ng+B*y@0DV!kJkbI zbhzI;(J|otUhDug|14m?El?IX6X2M@*8w^Onx_4>rh5Xp01E<30Y(Mx2apB2XZ)E> zUkR+c0y6@IprQ+~R=?8tn|E(E>8;QBx8L}&z~xqfNr4{&YyoiZ%US=yLO%ff2MfI? z(ofn%nise*ClCQ7y}NV%P7U7(ywff)FED;uU{K(yfc%HRz78g5CcJ7_|5h`hnvP~U zTvgKC;%PH@>6!5svb85fGNdu={neG&9Q36e!&YpI>uELU%Z_GjtD~1Uh>cLd*Id8rvCua}&9Z}Qax?^(1N}HypS7wi&mp@DV6r;Itq~Q^% zc(^s{U) zcmzGlM!_8Y4BG`xpm(!Da2&mh*)9YGgDf)$k*esY83(VSGi(67iXLHo;1%>R+XP-l z57CFtOT5m`nL&^_QX`bi2$L>AHR z4w{9agh4+Y22Y`%pgX|@^mdv8=h53J91$5o_tD3}96iC_2Pe?u4Bi-t*Bx@k*rm$G T!S;Aqh8&KMG*{w<>Xv^2NVW-p delta 938 zcmYk*Jxr5v5XbSSl_G?@-~TZZ5mc!1w3L^=AP=QHEfi?Af>s(+5{-$eNm)&lIypQY znl#45NNhslqC?}ZPu(55xH;6(xO8)I=!OAX2e{!b`FwA_a@k!jyWfmKJJK|5pgU)~ z@?z6p| z^E*7M7eZ`ks-xPfrJAat>Z+zHs-%i4uhPm?h8k9V=%9@jnrNVo8Y(EEh&<9TVPF`2 z+~GF2xXBH!bB!xp;v(lc%_bYpIqz4pk@9FBm;3m__m5R8$1kuUyvpB!oBF&LS?tE#879oZ$?Xg>P~iG2t7Wz>;v9V~7f;*uh0j7ncw2y%BBE80xut~4r7ha$z@CnaT5yq))D?*Pkc^a%RJ-{{L5M^;yI7plD z3eQmn6T-8U!np7ZC2>V~n&P;8;+?7$peQb#gsL?~5sV4@$%j#4AC2Rput7RTgePgp T>1?0Z2milZ@53Cu@Mq#51|0Xp diff --git a/handlers/register_new_user.py b/handlers/register_new_user.py index 972730b..f733e29 100644 --- a/handlers/register_new_user.py +++ b/handlers/register_new_user.py @@ -34,7 +34,6 @@ def handler_new_member(message): bot_message_id=bot_message.id ) - # storage_cleaner(chat_id=message.chat.id) else: bot.send_message(message.chat.id, f'Есть в списке победителей{winner_check(user_number)}') @@ -45,10 +44,14 @@ def callback(call): if call.data == 'grac': winner = is_winner_id_select(bot_message_id=call.message.message_id) print(winner) - is_winner_record(winner_id=winner, winner_result=1) + is_winner_record(winner_id=winner) + remove_list = buttons_remover(chat_id=call.message.chat.id) + for message in remove_list: + bot.delete_message(chat_id=call.message.chat.id, message_id=message) + + storage_cleaner(chat_id=call.message.chat.id) - bot.delete_message(chat_id=call.message.chat.id, message_id=call.message.message_id) bot.send_message(call.message.chat.id, f'Поздравили и добавили в базу.') else: From 3e64e4665a9ac55e92c87f4ffae48c47f0989845 Mon Sep 17 00:00:00 2001 From: Vladimir Kireev Date: Fri, 15 Jul 2022 15:32:48 +0300 Subject: [PATCH 088/113] delete print from is_winner_id_select action --- database/commands.py | 1 - handlers/register_new_user.py | 1 - 2 files changed, 2 deletions(-) diff --git a/database/commands.py b/database/commands.py index 4238063..1c5f6e9 100644 --- a/database/commands.py +++ b/database/commands.py @@ -162,7 +162,6 @@ def is_winner_id_select( WHERE temp_storage.bot_message_id={bot_message_id};''') id = [] for i in result: - print(i) id.append(i) return id[0][0] diff --git a/handlers/register_new_user.py b/handlers/register_new_user.py index f733e29..897f5fc 100644 --- a/handlers/register_new_user.py +++ b/handlers/register_new_user.py @@ -43,7 +43,6 @@ def callback(call): if call.message: if call.data == 'grac': winner = is_winner_id_select(bot_message_id=call.message.message_id) - print(winner) is_winner_record(winner_id=winner) remove_list = buttons_remover(chat_id=call.message.chat.id) From d24b1985721ff5d6bc2e0d48634af443d16e3e30 Mon Sep 17 00:00:00 2001 From: Vladimir Kireev Date: Fri, 15 Jul 2022 18:30:02 +0300 Subject: [PATCH 089/113] bot message upd --- database/commands.py | 9 +++++++-- database/database.db | Bin 32768 -> 32768 bytes handlers/register_new_user.py | 20 +++++++++++++++----- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/database/commands.py b/database/commands.py index 1c5f6e9..e0fa243 100644 --- a/database/commands.py +++ b/database/commands.py @@ -20,13 +20,18 @@ def insert2(nickname: str, user_name: str, chat_id: int, user_id: int, + chat_name: str, + congr_number: int, is_winner: int, dtime: datetime = datetime.datetime.now().isoformat()) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(""" - INSERT INTO 'users' (nickname, user_name, chat_id, user_id, dtime_connetion, is_winner) VALUES (?, ?, ?, ?,?,?); - """, (nickname, user_name, chat_id, user_id, dtime, is_winner)) + INSERT INTO 'users' (nickname, user_name, chat_name, + congr_number, chat_id, user_id, + dtime_connetion, is_winner) + VALUES (?, ?, ?, ?,?,?,?,?); + """, (nickname, user_name, chat_name, congr_number, chat_id, user_id, dtime, is_winner)) def select_lucky(moderator_id): diff --git a/database/database.db b/database/database.db index 21fa7bbc3940024331b276c80bfb42c06d85a171..0b6442a9117a2f5e15565317cf0ab1ba1197bbff 100644 GIT binary patch delta 671 zcmZo@U}|V!njp=nH&Mo!QEy|y5`HZfzAX&=Yxtx1Irz44{lWuJOg0d(+?+0u$i>3I zz|b~%eT0UPse+-Yl@S92E1R++i>4zZE9YcKAxYy4OD}A=ujh*m9RrKz%7R3h z8eyWwPzK}E$?|e`KqAQ538BUD_RS=lito{ItEv&jnur0end%gDgW&{)sF*vQDp z0_v}TIG}D>aJXl^3CWdAvW`kt>%m6ljc3kThD97^M+?R zPZEzT_YLmJ+U>d8bZ`LM@&8_q(8Y{T7=0t9Lzid zVupd4oH9UWD46L7Vupa3lR?a2F!KhG=@T@$G1iC4IS?$8Ei1CQKDLo*lfr#|9v@C_ zW^u;S;?$zzsLikSB?UMb`M)smf8jr}naANMzj74sTm}XP1y)8Th+`soX94*FaDD{u KjLl#Cc? Date: Fri, 15 Jul 2022 18:56:59 +0300 Subject: [PATCH 090/113] finalized readme --- README.md | 122 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 101 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 7d8f1c9..6f85052 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,35 @@ # tg-bot-users 🤖 -Телеграм-бот отслеживает юбилейных пользователей группы. По умолчанию, юбилейными считаются участники, кратные 500. Эти настройки можно изменить при конфигурации бота. -При вступлении в комьюнити-группу нового, юбилейного участника бот присылает в группу модераторов уведомление с именем, ником, id пользователя, юбилейным номером и датой и временем вступления. +Телеграм-бот отслеживает юбилейных пользователей групп. По умолчанию, юбилейными считаются участники, кратные 500. Эти настройки можно изменить при конфигурации бота. +При вступлении в комьюнити-группу нового, юбилейного участника бот присылает в группу модераторов уведомление с именем, ником, id пользователя, юбилейным номером и датой и временем вступления, а также кнопкой "Поздравить" для автоматического поздравления юбилейного участника. Помимо юбилейных, бот сохраняет двух последующих участников, так как юбилейным может вступить не пользователь, а бот или модератор. ## Особенности -tbc +* Бот проверяет, является ли новый юбилейный пользователь ботом, и если да, то не сохраняет информацию о нем и не считает его юбилейным. +* Бот проверяет, был ли уже новый юбилейный пользователь победителем, и если да, то не сохраняет информацию о нем и не считает его юбилейным. +* Настройки администрирования доступны только пользователям с правами администраторов. +* Команды боту доступны только в чатах модераторов. +* Поздравление юбилейных пользователей автоматизировано. ## Requirements * Python 3.9+ * [pyTelegramBotAPI](https://github.com/python-telegram-bot/python-telegram-bot) – Python Telegram Bot API -* dotenv tbc +* [dotenv](https://pypi.org/project/python-dotenv/) - виртуальное окружение dotenv Если вы планируете запускать приложение локально, то можете установить все зависимости, выполнив следующую команду: `pip install -r requirements.txt`. ## Запуск приложения -### Подготовка к запуску -1. Если у вас еще нет telegram-бота, создайте его с помощью @BotFather и сохраните token от бота. +### 1. Подготовка к запуску +1. Если у вас еще нет telegram-бота, создайте его с помощью @BotFather бота и сохраните token от вашего бота. 2. Добавьте вашего бота во все telegram-чаты, где вы хотите, чтобы он отслеживал юбилейных участников. +3. Определите пользователей, которые будут обладать правами администратора, и узнайте их user_id с помощью @username_to_id_bot бота. Приложение можно запустить локально либо через контейнер docker. -### Запустить приложение локально +### 2а. Запустить приложение локально 1. Создать файл .env и наполнить его согласно инструкции из файла /.env.template. 2. Скачать приложение tg-bot-users в нужную директорию. @@ -33,9 +38,9 @@ tbc 5. Установить зависимости, выполнив в терминале следующую команду: `pip install -r requirements.txt`. 6. Запустить файл main.py -Теперь бот запущен локально и готов к работе! +Бот запущен! Переходите к настройкам админки. -### Запустить приложение через контейнер docker: +### 2б. Запустить приложение через контейнер docker: #### Вариант 1: через файл .env @@ -58,36 +63,111 @@ tbc При работе на операционной системе Windows в пути стоит писать обратный слэш, как в примере. При работе с другими операционными системами в пути стоит писать прямой слэш `/`. Эта команда позволит не терять данные из базы данных при перезапуске приложения и контейнера. -Теперь бот запущен и готов к работе! +Бот запущен! Переходите к настройкам админки. #### Вариант 2: через передачу параметров при запуске docker контейнера 1. Скачать приложение tg-bot-users в нужную директорию. -2. Сохранить файл .env в директории приложения tg-bot-users. -3. Установить и запустить docker (например, Docker Desktop). -4. В терминале перейти в директорию tg-bot-users. -5. Создать контейнер docker, введя в терминале команду: +2. Установить и запустить docker (например, Docker Desktop). +3. В терминале перейти в директорию tg-bot-users. +4. Создать контейнер docker, введя в терминале команду: docker build -t telegram-bot:latest . где `telegram-bot` - пример названия контейнера. Можно дать другое название контейнеру. +5. Запустить контейнер, введя в терминале команду: -6. Запустить контейнер, введя в терминале команду: - - docker run --name telegram-bot --volume c:\Users\Наташик\PycharmProjects\tg-bot-users\database:/app/database -e BOT_TOKEN=type_your_token telegram-bot:latest + docker run --name telegram-bot --volume c:\Users\tg-bot-users\database:/app/database -e BOT_TOKEN=type_your_token -e ADMIN_IDS='["user_id_of_first_admin", "user_id_of_second_admin"]' telegram-bot:latest -где `type_your_token` - token от вашего бота, а `c:\Users\tg-bot-users\database` - пример абсолютного пути до директории database внутри директории tg-bot-users. +где `type_your_token` - token от вашего бота; +`user_id_of_first_admin` и `user_id_of_second_admin` - user_id тех пользователей, которым вы хотите дать права администрирования (их не обязательно должно быть двое, может быть один, может быть больше); +`c:\Users\tg-bot-users\database` - пример абсолютного пути до директории database внутри директории tg-bot-users. При работе на операционной системе Windows в пути стоит писать обратный слэш как в примере. При работе с другими операционными системами в пути стоит писать прямой слэш `/`. Эта команда позволит не терять данные из базы данных при перезапуске приложения и контейнера. -Теперь бот запущен и готов к работе! +Бот запущен! Переходите к настройкам админки. + +### 3. Настройка админки + +По умолчанию команды боту работают только в чатах модераторов. Поэтому сразу после запуска бота администратор должен вызвать команду `/adminsetup` и настроить группы модераторов, в которые будут приходить уведомления из указанных групп пользователей. Для этой операции нужно узнать chat_id групп с помощью @username_to_id_bot бота, отправив ему invite-ссылку на вступление в чат, chat_id которого вам нужно узнать. +Сразу после этой настройки все остальные команды будут доступны всем пользователям в группах модераторов. ## Команды бота -* `/start` - запуск бота, выполняется автоматически при подключении к боту. +По умолчанию все команды боту работают только в чатах модераторов (за исключением `/adminsetup`). + +* `/start` - запуск бота * `/help` - список команд и их описание +* `/adminsetup` - установка настроек админки (доступно только администраторам) +* `/adminshow` - просмотр настроек админки * `/luckylist` - по запросу названия группы присылать список всех зафиксированных пользователей за время работы - +* `/unceleb` - запрос последних непоздравленных участников + +### Команда /adminsetup + +Доступ к команде есть только у пользователей, user_id которых был перечислен в файле .env в переменной ADMIN_IDS при запуске бота. + +1. Вам нужно узнать chat_id групп модераторов и групп пользователей, которые вы хотите добавить в настройки. Это можно сделать с помощью @username_to_id_bot бота, отправив ему invite-ссылку на вступление в чат, chat_id которого вам нужно узнать. +2. При запуске команды бот запрашивает подтверждение того, что вы хотите изменить настройки админки. Если вы нажмете "да", все текущие настройки сбросятся и их будет нельзя восстановить. Если перед этой командой вы хотите узнать текущие настройки, введите команду `/adminshow`. +3. Если вы нажали "да", то бот запросит данные по id группам модераторов (id_ГМ) и id группам пользователей (id_ГП) в формате: id_ГМ id_ГП_1 id_ГП_2 id_ГП_3 +4. Для одной группы модераторов укажите ее id_ГМ и через пробелы укажите все id_ГП тех чатов, которые подведомственны этой группе модераторов. Обязательно вводите реальные и корректные chat_id, чтобы бот работал корректно и без ошибок. Помните, что chat_id - это натуральное число. +5. Бот спросит, хотите ли вы добавить еще данные по группам модераторов и пользователей в админку. Если да, то проделайте п.4 столько раз, сколько вам требуется. +6. После завершения настроек админки все остальные команды станут доступны всем пользователям в указанных группах модераторов. + +### Команда /adminshow + +Команда выводит список всех настроенных id Групп Модераторов, куда приходят уведомления из указанных id Групп Пользователей, с группировкой по id Группам Модераторов. + +### Команда /luckylist + +Команда выводит список всех зафиксированных юбилейный пользователей за время работы из всех групп пользователей, которые подведомственны той группе модераторов, из которой была введена команда. +Все участники, которые уже были поздравлены, отмечены символами короны. +Обратите внимание, что если юбилейным пользователем вступил бот или участник, который уже был победителем, он не будет зафиксирован как юбилейный пользователь и не будет выводится этой командой. + +### Команда /unceleb + +Команда выводит список последних непоздравленных пользователей из всех групп пользователей, которые подведомственны той группе модераторов, из которой была введена команда. Если последних непоздравленных пользователей нет, то ничего не выведется. +Эту команду уместно использовать после ошибочного нажатия кнопок "Не поздравлять" для пользователя, которого требовалось поздравить. + +## Для разработчиков + +Структура приложения: +* `config_data/`: + * `config.py` - загрузка переменных окружения и команд боту +* `handlers/`: + * `admin.py` - хендлер для обработки команд `/adminshow` и `/adminsetup` + * `lucky_list.py` - хендлер для обработки команды `/luckylist` + * `register_new_user.py` - логика по обработке новых юбилейных пользователей с автоматизацией поздравления + * `unceleb.py` - хендлер для обработки команды `/unceleb` + * `default_handlers/` - хендлеры для обработки команд `/start` и `/help` +* `keyboards/inline` - inline-клавиатуры для соответствующих команд боту +* `utils/set_bot_commands.py` - установка команд бота +* `.env.template` - шаблон оформления файла .env +* `database/`: + * `commands.py` - все функции для обращения к SQLite-базе данных + * `database.py` - SQLite база данных: + * таблица 'users' (хранение информации о всех зафиксированных юбилейный пользователях): + * id (INTEGER) - первичный ключ + * nickname (STRING) - ник пользователя в telegram + * user_name (STRING) - имя пользователя в telegram + * user_id (INTEGER) - уникальный id пользователя в telegram + * dtime_connetion (DATETIME) - дата и время вступления пользователя в группу пользователей + * congr_number (INTEGER) - юбилейный порядковый номер вступления пользователя в группу пользователей + * chat_id (INTEGER) - уникальный id группы пользователей + * is_winer (INTEGER) - является ли пользователь победителем (был поздравлен): 1 да, 0 нет + * таблица 'groups_relation' (хранение настроек админки): + * relation_id (INTEGER) - первичный ключ + * moderator_id (INTEGER) - уникальный id группы модераторов + * group_id (INTEGER) - уникальный id группы пользователей + * таблица 'temp_storage' (хранение информации о последних непоздравленных пользователях): + * storage_id (INTEGER) - первичный ключ + * chat_id (INTEGER) - уникальный id группы пользователей, в которую вступил юбилейный пользователь + * record_id (INTEGER) - id записи о данном юбилейном пользователе из таблицы 'users' + * bot_message_id (INTEGER) - уникальный id сообщения бота о юбилейном пользователе с кнопкой "Поздравить" + * связь таблиц 'users' и 'groups_relation': + * 'users'.chat_id = 'groups_relation' + * связь таблиц 'users' и 'temp_storage': + * 'users'.id = 'temp_storage'.record_id From b0b96763b04599573a0785082f53f0593d06cfee Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Tue, 19 Jul 2022 09:52:01 +0300 Subject: [PATCH 091/113] fixed commands to be available only for moderator groups --- handlers/default_heandlers/help.py | 14 ++++++++++++-- handlers/default_heandlers/start.py | 16 +++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/handlers/default_heandlers/help.py b/handlers/default_heandlers/help.py index deaf9b7..fcb303f 100644 --- a/handlers/default_heandlers/help.py +++ b/handlers/default_heandlers/help.py @@ -1,9 +1,19 @@ from telebot.types import Message from config_data.config import DEFAULT_COMMANDS from loader import bot +from database.commands import get_moderator_id @bot.message_handler(commands=['help']) def bot_help(message: Message): - text = [f'/{command} - {desk}' for command, desk in DEFAULT_COMMANDS] - bot.reply_to(message, '\n'.join(text)) + """ + Хендлер, который выводит все доступные боту команды при команде /help. + :param Message message: /help + :return: None + """ + moderator_ids = get_moderator_id() + + if message.chat.id in moderator_ids: + text = [f'/{command} - {desk}' for command, desk in DEFAULT_COMMANDS] + bot.send_message(chat_id=message.chat.id, + text='\n'.join(text)) diff --git a/handlers/default_heandlers/start.py b/handlers/default_heandlers/start.py index 6878331..4741dba 100644 --- a/handlers/default_heandlers/start.py +++ b/handlers/default_heandlers/start.py @@ -1,8 +1,22 @@ from telebot.types import Message from loader import bot +from config_data.config import ADMIN_IDS +from database.commands import get_moderator_id @bot.message_handler(commands=['start']) def bot_start(message: Message): - bot.reply_to(message, f"Привет, {message.from_user.full_name}!") + """ + Хендлер, который приветствует пользователя и подсказывает, что делать при команде /start. + :param Message message: /start + :return: None + """ + moderator_ids = get_moderator_id() + if (message.chat.id in moderator_ids) or (str(message.from_user.id) in ADMIN_IDS): + bot.send_message(chat_id=message.chat.id, + text=f"Привет, {message.from_user.full_name}!\n" + f"Чтобы узнать, что я могу, введи команду /help\n\n" + f"При первом запуске администратору следует выставить настройки админки по " + f"команде /adminsetup в личном чате со мной (доступ есть у пользователей с " + f"такими user_id:\n{ADMIN_IDS})") From 3962c188a6d2a06322a43d73dc92b9573a761cee Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Tue, 19 Jul 2022 09:52:18 +0300 Subject: [PATCH 092/113] fixed description of adminsetup command --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6f85052..f4a445d 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,7 @@ 1. Вам нужно узнать chat_id групп модераторов и групп пользователей, которые вы хотите добавить в настройки. Это можно сделать с помощью @username_to_id_bot бота, отправив ему invite-ссылку на вступление в чат, chat_id которого вам нужно узнать. 2. При запуске команды бот запрашивает подтверждение того, что вы хотите изменить настройки админки. Если вы нажмете "да", все текущие настройки сбросятся и их будет нельзя восстановить. Если перед этой командой вы хотите узнать текущие настройки, введите команду `/adminshow`. 3. Если вы нажали "да", то бот запросит данные по id группам модераторов (id_ГМ) и id группам пользователей (id_ГП) в формате: id_ГМ id_ГП_1 id_ГП_2 id_ГП_3 -4. Для одной группы модераторов укажите ее id_ГМ и через пробелы укажите все id_ГП тех чатов, которые подведомственны этой группе модераторов. Обязательно вводите реальные и корректные chat_id, чтобы бот работал корректно и без ошибок. Помните, что chat_id - это натуральное число. +4. Для одной группы модераторов укажите ее id_ГМ и через пробелы укажите все id_ГП тех чатов, которые подведомственны этой группе модераторов. Обязательно вводите реальные и корректные chat_id, чтобы бот работал корректно и без ошибок. Помните, что chat_id - это отрицательное число. 5. Бот спросит, хотите ли вы добавить еще данные по группам модераторов и пользователей в админку. Если да, то проделайте п.4 столько раз, сколько вам требуется. 6. После завершения настроек админки все остальные команды станут доступны всем пользователям в указанных группах модераторов. From 26bca1ea0143a9e171168a35a7d3c3a1555a089e Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Tue, 19 Jul 2022 09:52:35 +0300 Subject: [PATCH 093/113] fixed admin commands to work with negative chat ids --- handlers/admin.py | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/handlers/admin.py b/handlers/admin.py index e96d4b3..9765dd0 100644 --- a/handlers/admin.py +++ b/handlers/admin.py @@ -1,6 +1,6 @@ from telebot.types import Message, CallbackQuery from loader import bot -import database.commands as usersbase +from database.commands import get_moderator_id, select_from_groups, insert_to_groups, delete_from_groups from keyboards.inline import admin_keyboard from config_data.config import ADMIN_IDS @@ -13,17 +13,22 @@ def bot_admin_show(message: Message) -> None: :param Message message: /adminshow :return: None """ - moderator_ids = usersbase.get_moderator_id() + moderator_ids = get_moderator_id() - if abs(message.chat.id) in moderator_ids: - admin_info = usersbase.select_from_groups() - bot.send_message(chat_id=message.chat.id, text="Текущие настройки админки в формате\n" - "id Группа модераторов - id Группа пользователей") - for i_info in admin_info: - bot_text = f"{i_info[0][0]}: " - for j_info in i_info: - bot_text = f"{bot_text}{j_info[1]} " - bot.send_message(chat_id=message.chat.id, text=bot_text) + if (message.chat.id in moderator_ids) or (str(message.from_user.id) in ADMIN_IDS): + admin_info = select_from_groups() + + if admin_info: + bot.send_message(chat_id=message.chat.id, text="Текущие настройки админки в формате\n" + "id Группа модераторов: id Группа пользователей") + for i_info in admin_info: + bot_text = f"{i_info[0][0]}: " + for j_info in i_info: + bot_text = f"{bot_text}{j_info[1]} " + bot.send_message(chat_id=message.chat.id, text=bot_text) + else: + bot.send_message(chat_id=message.chat.id, + text="Настройки еще не выставлены.") @bot.message_handler(commands=['adminsetup']) @@ -34,7 +39,7 @@ def bot_admin_setup(message: Message) -> None: :param Message message: /adminsetup :return: None """ - moderator_ids = usersbase.get_moderator_id() + moderator_ids = get_moderator_id() if str(message.from_user.id) in ADMIN_IDS: bot.send_message(chat_id=message.chat.id, @@ -42,7 +47,7 @@ def bot_admin_setup(message: Message) -> None: "Это приведет к полному удалению текущих настроек и отменить это действие будет " "невозможно!", reply_markup=admin_keyboard.yes_no_proceed_keyboard()) - elif abs(message.chat.id) in moderator_ids: + elif message.chat.id in moderator_ids: bot.send_message(chat_id=message.chat.id, text=f"Ошибка доступа: эта команда доступна только пользователям с правами " f"администрирования. Доступ есть у пользователей с такими user_id:\n{ADMIN_IDS}") @@ -57,15 +62,15 @@ def process_admin_input(message: Message) -> None: groups = message.text.split(" ") for i_group in groups: - if not i_group.isdigit(): + if not (i_group.startswith("-") and i_group[1:].isdigit()): msg = bot.send_message(chat_id=message.chat.id, - text="Ошибка: id_группы - это натуральное число. Попробуйте еще раз. Формат ввода:\n" - "id_ГМ id_ГП_1 id_ГП_2 id_ГП_3") + text="Ошибка: id_группы - это отрицательное число. Попробуйте еще раз. Формат" + " ввода:\n id_ГМ id_ГП_1 id_ГП_2 id_ГП_3") bot.register_next_step_handler(message=msg, callback=process_admin_input) return for i in range(len(groups) - 1): - usersbase.insert_to_groups(moderator_id=int(groups[0]), group_id=int(groups[i + 1])) + insert_to_groups(moderator_id=int(groups[0]), group_id=int(groups[i + 1])) bot.send_message(chat_id=message.chat.id, text="Сделано! Хотите добавить еще группы?", @@ -80,7 +85,7 @@ def callback_query(call: CallbackQuery) -> None: :param CallbackQuery call: yes_admin_proceed :return: None """ - usersbase.delete_from_groups() + delete_from_groups() msg = bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Добро пожаловать в меню админки. Добавьте группы пользователей (ГП), из которых " From 9a2dd2f5ea7f2d2b4eb00596cf4131fa1ca846da Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 20 Jul 2022 09:17:52 +0300 Subject: [PATCH 094/113] Vova inputs merged --- database/commands.py | 41 ++++++++++++++++++--- handlers/register_new_user.py | 69 ++++++++++++++++++++++------------- 2 files changed, 79 insertions(+), 31 deletions(-) diff --git a/database/commands.py b/database/commands.py index e0fa243..afce775 100644 --- a/database/commands.py +++ b/database/commands.py @@ -115,6 +115,7 @@ def get_moderator_id() -> List[int]: result.append(moderator_id[0]) return result + def select_id_from_users(user_id) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() @@ -123,18 +124,17 @@ def select_id_from_users(user_id) -> None: return record_id[-1][0] - def temp_save( chat_id: int, record_id: int, - bot_message_id: int + bot_message_id: int, + users_chat: int ) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(""" - INSERT INTO 'temp_storage' (chat_id, record_id, bot_message_id) VALUES (?, ?, ?); - """, (chat_id, record_id, bot_message_id)) - + INSERT INTO 'temp_storage' (chat_id, record_id, bot_message_id, button_chat_id) VALUES (?, ?, ?, ?); + """, (users_chat, record_id, bot_message_id, chat_id,)) def buttons_remover( @@ -158,6 +158,14 @@ def storage_cleaner( cursor.execute(f'''DELETE FROM 'temp_storage' WHERE chat_id={chat_id};''') +def storage_cleaner_lite( + message_id: int, + ) -> None: + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(f'''DELETE FROM 'temp_storage' WHERE bot_message_id={message_id};''') + + def is_winner_id_select( bot_message_id: int, ) -> None: @@ -180,6 +188,29 @@ def is_winner_record(winner_id: int, WHERE id={winner_id}''') +def other_lucky_check( + count_users: int, + chat_id: int, + ) -> None: + lucky_number = count_users - count_users % 500 + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + result = cursor.execute(f'''SELECT * FROM users WHERE chat_id={chat_id} AND + (congr_number BETWEEN {lucky_number} AND {lucky_number + 2}) AND is_winner=1;''') + check_list = [] + for i in result: + check_list.append(i) +def data_finder( + bot_message_id: int, + ) -> None: + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + result = cursor.execute(f'''SELECT users.user_name, users.congr_number, users.chat_id FROM users Join temp_storage ON users.id=temp_storage.record_id + WHERE temp_storage.bot_message_id={bot_message_id};''') + data = [] + for i in result: + data.append(i) + return data diff --git a/handlers/register_new_user.py b/handlers/register_new_user.py index 6f734e7..ce67b04 100644 --- a/handlers/register_new_user.py +++ b/handlers/register_new_user.py @@ -2,7 +2,9 @@ from database.commands import insert, insert2 import datetime from database.commands import winner_check, select_id_from_users,\ - temp_save, buttons_remover, storage_cleaner, is_winner_id_select, is_winner_record + temp_save, buttons_remover, storage_cleaner, storage_cleaner_lite, is_winner_id_select, \ + is_winner_record, other_lucky_check, data_finder + from telebot import types @@ -13,9 +15,8 @@ def handler_new_member(message): chat_name = message.chat.title nickname = message.from_user.username user_name = message.from_user.first_name - dtime = datetime.datetime.now() - - + dtime = datetime.datetime.now().replace(microsecond=0, tzinfo=None) + moder_id = 258281993 #Я не знаю как лучше модерский айди написать и как он будет передаваться, по этому пока так markup = types.InlineKeyboardMarkup(row_width=1) @@ -24,45 +25,61 @@ def handler_new_member(message): markup.add(congratulations, shame) - if not message.from_user.is_bot and not winner_check(user_number): # тут будет еще проверка count % 500 == 0 - - + if not message.from_user.is_bot and not winner_check(user_number): # and count % 500 == 0 or count % 500 == 1 or count % 500 == 2: + # в 28 строке спящий кусок кода, который нужно включить когда запустим бота insert2( nickname=message.from_user.username, user_name=message.from_user.first_name, - congr_number = count, chat_name=message.chat.title, - user_id=message.from_user.id, dtime=datetime.datetime.now(), + congr_number=count, chat_name=message.chat.title, + user_id=message.from_user.id, dtime=dtime, chat_id=message.chat.id, is_winner=0) - bot_message = bot.send_message(message.chat.id, - f'В {chat_name} вступил юбилейный пользователь {nickname} {user_name}\n' - f'Порядковый номер вступления: {count}, время вступления: {dtime}', - reply_markup=markup) + if not other_lucky_check(count_users=502, chat_id=message.chat.id): #здесь count_users поменяем на count, когда будут реальные условия. + # Пока для тестов вписано вручную + + + bot_message = bot.send_message(moder_id, + f'В {chat_name} вступил юбилейный пользователь {nickname} {user_name}\n' + f'Порядковый номер вступления: {count}, время вступления: {dtime}', + reply_markup=markup) - temp_save(chat_id=message.chat.id, - record_id=select_id_from_users(user_id=message.from_user.id), - bot_message_id=bot_message.id - ) + temp_save(chat_id=moder_id, + record_id=select_id_from_users(user_id=message.from_user.id), + bot_message_id=bot_message.id, users_chat=message.chat.id) - # else: - # bot.send_message(message.chat.id, f'Есть в списке победителей{winner_check(user_number)}') + else: + bot.send_message(message.chat.id, f'Что-то пошло не так') #В активной версии нужно убрать, пока оставлено для проверки + @bot.callback_query_handler(func=lambda call: call.data == "grac" or call.data == "decline") def callback(call): if call.message: + winner = is_winner_id_select(bot_message_id=call.message.message_id) + name = data_finder(bot_message_id=call.message.message_id)[0][0] + congr_number = data_finder(bot_message_id=call.message.message_id)[0][1] + users_chat = data_finder(bot_message_id=call.message.message_id)[0][2] + moders_chat = call.message.chat.id + + if call.data == 'grac': - winner = is_winner_id_select(bot_message_id=call.message.message_id) is_winner_record(winner_id=winner) + remove_list = buttons_remover(chat_id=users_chat) - remove_list = buttons_remover(chat_id=call.message.chat.id) for message in remove_list: - bot.delete_message(chat_id=call.message.chat.id, message_id=message) + bot.delete_message(chat_id=moders_chat, message_id=message) - storage_cleaner(chat_id=call.message.chat.id) + storage_cleaner(chat_id=users_chat) + + bot.send_message(users_chat, f'Поздравляю, {name}, ' + f'как же удачно попали в нужное время. Вы ' + f'участник {congr_number} коммьюнити. Вас ждут плюшки и печенюшки.') + + bot.send_message(moders_chat, f'Участник {name} поздравлен.') - bot.send_message(call.message.chat.id, f'Поздравили и добавили в базу.') else: - bot.delete_message(chat_id=call.message.chat.id, message_id=call.message.message_id) - bot.send_message(call.message.chat.id, 'Ничего не делали, так как не победитель') + bot.delete_message(chat_id=moders_chat, message_id=call.message.message_id) + storage_cleaner_lite(message_id=call.message.message_id) + + bot.send_message(moders_chat, f'Участника {name} поздравлять не стали, потому что вы нажали кнопку "не поздравлять"') From 718c32f8926c3c056809336151f0037b2cb58862 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 20 Jul 2022 09:28:37 +0300 Subject: [PATCH 095/113] added temp unceleb table --- database/database.db | Bin 32768 -> 32768 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/database/database.db b/database/database.db index 0b6442a9117a2f5e15565317cf0ab1ba1197bbff..fcace5a8234918a50ea6961840a9393004cccc9e 100644 GIT binary patch delta 1643 zcmaKtUu@e%9LLZ9(&TLCV!RPXDD~7uBx{?+P8!;DQb|jY5KzPx75cEINoz({yXg|Q zYsEy83W?VaBOxIkrwxq>#=1c@39$#@sY9vww<(BCAWhwPK~*<|5E^GU%_256r?Wr5 zyWj8oyZfC_DVND|nOyVFosbv$2~Xd1}o zjkK;7i}#~ouoB$g;`RH9g`GwwtEq;nPp4<5##K$tHnU^!Kr)d^N~y%ai%H3v5w_f< zK;8dc{web)w||M??hr)Z(qB9z`}p&~!-hzHl3z!c&@76&Z@N#q5Al1s8uvc;3dgbE zut(Vtd+@=wBuMMfoA5xe%S*K;z}$O3rBlm5$4{b)l=`plWqunKHAPu$m1Hx zN;aR(&dUn9N0&{Zb%z|46geKn(cPhFuPpZ{)GbOIV*yP>rII8;?+lyJOW0)z7Qvs^_ccB1%|My24L)$&vr(Chk!B0E<<8c2#T@ zrLJ;Noo;B9wiVf+^p_w6ZS9P;ap$a-nV8HKdV7a4Mm6?FQuPLxZT~L-!C%2I`N_5p|mBF#>avg5Xs-C zf(;Qxl4J3(9PgGxJrOw)3p2kGBX09pda#6VR=^ek%(fy)Cj{89)vCcmldUdPFRoTr z7q(COOpEm`khqkDb24Mhn;oN92$%Wy=vy8heFem>&hnFn4n(v&4r~E|ofaGE+FELY83q_9zsSe_BAwM%+OczuwW90Hv4jx?r4zvu= zWwefNqu zNy3s7x^U!*#Wh;!#C+Lim(YRvLY?b)cgdpY*ZFUF&%!?N5tl-D|w(U=g8O(Dw zyTmcfn(YI{H0CjjHU5Y=ij98OKqLqEpRkEuzlxn?@(Uq+|q&Z?$LZPSCcSte*f6OP(HW4Fg%BimqEe~xNi4QU%nVpZ@;Z~EH`oGz-aD{f#Hdd0hh1Br)QeQ9`5mm<;%H)NtjNb zy8`ja3LI#5lMPFkatG&?Wh)CfI#ww5?#NdkPrj=96R9aUJt#=)`qs@-*XFj4?B*V6 zV{4C;-O_zsTPOV2j#dyiREN zRcMkeRi*$`39DiP0%SE-e-w$2i8qO<`lFeD%<%Wq$Uo2d@43k5A|`i=dz8DCTZDdx zzB$pOpXJD3ok2?$#ZVT-Q+oz``*#i$T~|{-1BU}c14U_Ld+v%cP0_R!ioHTLB~|kj z&C@kmw=CNQo~e17BHOxR+G;@JQj-|Kqsp#n zDV7zGIP@fnrx~*5n1<#ABsMjP?s$eSE2^nGT0mmalUSar%erc7YFHeTo1xSukk|?fcXtJ%Us_PPx0xgN-DW>c?ieeE>(pOQD=$`391C|ZV zQ1!sb;LFFiXh|GTv!TtXx)B%|kQ}BZf!a}I%>n}nx&R=#nU(}<$CedEHw;q6srj@d z&;{tSW7(=gYA5*;C5fhastVnr>ncQ(3uX@! z9-DNJ(dTJNY)^+V*f4dAwBqOiS`x$4O=vr+u9D(JSJRUymTcOZqmaQX@;6!%XoET) z$Q{l22KvqIcqTi+^fnL#-HJIjU6FKRjBvCBfWDFCE zLu@R136LzwMj}-=6(bga@M)af;f z{&64ti2S_^nx8EV4bdgp&AIZVAGh49dYp1|I8)2j6nr0{=o-wygO=NM3vf1;dxO+8 z{l`pbTL+p0mi@%?{P zd=ZI%5>JXRijSY=UYsQ{1(*U%0j2;`fGNNfUo3K@feCn(A$^a z^}&r?PaOw{LvMS}FaFv-K34f?WzU_@M+f<66?zr&osLBwc>P^If|Ea*{}cDMVe}6E z{XZhUiNw?5o8k%a1b_N}^*1Zw*hx$QrT|lbDZmt93NQtj0!#s>08`)sD-eZyCb$K{ zPQu;7SKtol6v5XE_W(Xg@FrnD;1a=I0xWBf94GiXVHej5hSUn8soED_u)tOh)X;B|rn z7!m9X1}xJ*Metfd0eq6+tgr%biQqNDGQh_PzFGiBa&Da9PxG$2wute06tEz%tQU4ae`OyZGaCG+`>csphE;N=Y7EY z3BHQI8t@3g&HO6B+X!yrEx=s_U&%xLpfv<9lX+w2zLn{e}*6Dck;{X-l%)9uBYyj z%r7!u&a`Gw`kC~ew3>P^^=Rt0)RN@u$p@0%Nip&B#1|54;vdGJitmcI#QqTbZftAp z(&#Uv_eI;_YYRI6e~3Cr=c9Tye@y284?auG|9?`P2=FYc@yGP_vR}>YgH5R5_&3!b z)7R)pYWy*Mm7b)=AJbRPg=C69roWP&q}m^|5`aUdBvEjH1x=Gx3%u0>cSwH)JqZY_ z$&O~}R^UJAx6qTAo(}GihNinA$#QxU@Eg=*69D->z%sybJ`}czo&@|%ZS36%K9E6iuB0Z>UF`8{=!#>7Q9PDWlV}hx0)kGc;C>sD zEIlU@Fg9JcLtke9lk_Cu@v6!i#Cp)eoGhUy0WW?ij$zuw>=)CMfP0?-Uck2Fgu!bT zQIp^(4Pf@BZfIc`9f^j-DErDnHw&)Omg$6Ez}baBGE4vLG6l90a3og2yF0Mg>=pDB znhr%VRVN5Ik!_@>fXX!?P>UW`?&Z{KKtKZ%yt6gMQiFW>3+PEK91O%T9W4w?;(vmg zL<0w8RR*_vO9?xH%jikK*VP0sW@vk%CYREYs222!o@vOI4&@2^v<7Mt4Wg_-(=#nM zjDh3Nrze4?=Yn6i0dYx!K5gE)kU+>MsA47T=d+gp$*c_?6oIHf&_TNfG`z6&UQC@2 z6#@!?A2MV_4+}Gwo<#RxHlXV;QiM6Vh>}G2Af5<>S#mWUf~*9x&Y>g$69HLZ__QJT zR5*N!^du110EeD}z9{U`>gh@F)C7c8K$f650yT+Y;=oU~>p;Av3Q0R(Cb>W!`|YU< z$+jk$LFecH-=4Uj`H5#x+5aEHHxvsHBeD<2`LKR{Y<3|VPDcmV#xkgJ9z+lThFgpI z{{FqDh2L+w=gh1jkG{IkRsa0*b~81zuiYIWB%H4EB!BedXTSv7CnQ zvdWJLyyAd>INpD}oWfq10!#s>08@Y|z!YE#Fa?+bOaZ0jsxghaM;{HT?A{qa2{PS@q_LtZbK+7IX0j2;`03pANd|f_$xMdPe z7IySF+hz-XCn1?W^6O-h+RYaH4tkQB%@+K2YLeQ`7W|F$BsH5Y_!}rm&bHZt-$qYT zv)O`wEj>xiW()p$dXk#W7W`}INy=LsRByK6!%{bhUOf9{K{_m5nY!76zmA@yoRjL! z7JQ$Yq;|6fe=R*p&1MU1U!K~15`4BVPt86F{`u_76Yi71*5xS%{w2P8p9Hop&t&WJ frtE!&Hzr`~@+R*G2TLYD_UrPp=Q5yA+4$%`C`kg; From 27ce4999886047328ca1b05a4353c7bda64d4cc3 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 20 Jul 2022 09:28:51 +0300 Subject: [PATCH 096/113] added /unceleb command --- config_data/config.py | 6 ++-- handlers/__init__.py | 2 +- handlers/last_uncongratulate.py | 59 +++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 handlers/last_uncongratulate.py diff --git a/config_data/config.py b/config_data/config.py index 554d19b..9cb2b01 100644 --- a/config_data/config.py +++ b/config_data/config.py @@ -12,7 +12,9 @@ DEFAULT_COMMANDS = ( ('start', "Запустить бота"), ('help', "Вывести справку"), - ('luckylist', "Запросить юбилейный список"), + ('adminsetup', "Установить настройки админки"), ('adminshow', "Вывести текущие настройки админки"), - ('adminsetup', "Установить настройки админки") + ('luckylist', "Запросить юбилейный список"), + ('unceleb', "Вывести последних не поздравленных"), + ) diff --git a/handlers/__init__.py b/handlers/__init__.py index 3f47561..63a7946 100644 --- a/handlers/__init__.py +++ b/handlers/__init__.py @@ -2,4 +2,4 @@ from . import register_new_user from . import lucky_list from . import admin - +from . import last_uncongratulate diff --git a/handlers/last_uncongratulate.py b/handlers/last_uncongratulate.py new file mode 100644 index 0000000..a7cc6ac --- /dev/null +++ b/handlers/last_uncongratulate.py @@ -0,0 +1,59 @@ +from telebot.types import Message +from loader import bot +import database.commands as usersbase +import datetime +from telebot import types + + +@bot.message_handler(commands=['unceleb']) +def bot_uncongratulate(message: Message): + usersbase.temp_cleaner() + markup = types.InlineKeyboardMarkup(row_width=1) + congr = types.InlineKeyboardButton(text='Поздравить', callback_data='congr') + uncongr = types.InlineKeyboardButton(text='Отклонить', callback_data='uncongr') + markup.add(congr, uncongr) + uncelebs = usersbase.select_last_uncongratulate(message.chat.id) + gr_id = usersbase.select_group_id(message.chat.id) + temp_id = 0 + uncelebs_list = [] + for id, gr in enumerate(gr_id): + temp_id += gr_id[id][1] + # print(uncelebs[temp_id - 1], uncelebs[temp_id - 2], uncelebs[temp_id - 3]) + + uncelebs_list.append(uncelebs[temp_id - 1]) + if uncelebs[temp_id - 2][1]//500 == uncelebs[temp_id - 1][1]//500: + uncelebs_list.append(uncelebs[temp_id - 2]) + if uncelebs[temp_id - 3][1] // 500 == uncelebs[temp_id - 1][1]//500: + uncelebs_list.append(uncelebs[temp_id - 3]) + + for unceleb in uncelebs_list: + dtime = datetime.datetime.strptime(unceleb[5], '%Y-%m-%d %H:%M:%S.%f').strftime('%d.%m.%y %H:%M') + bot_message = bot.send_message(chat_id=message.chat.id, + text=f'\U0001F389 "{unceleb[4]}" \U0001F464 {unceleb[3]}' + f'(@{unceleb[2]})\n\U0001F522 {unceleb[1]} \U0001F550 {dtime}', + reply_markup=markup) + # print(unceleb[6]) + usersbase.temp_save_unceleb(chat_id=unceleb[0], + record_id=unceleb[6], + bot_message_id=bot_message.id) + + +@bot.callback_query_handler(func=lambda call: call.data == "congr" or call.data == "uncongr") +def callback(call): + if call.message: + if call.data == 'congr': + winner_chat_id = usersbase.get_chat_id_unceleb(bot_message_id=call.message.message_id) + + winner = usersbase.is_winner_id_select_unceleb(bot_message_id=call.message.message_id) + # print(winner) + usersbase.is_winner_record(winner_id=winner) + remove_list = usersbase.buttons_remover_unceleb(chat_id=winner_chat_id) + for message in remove_list: + bot.delete_message(chat_id=call.message.chat.id, message_id=message) + usersbase.storage_cleaner_unceleb(chat_id=call.message.chat.id) + celeb_name = call.message.text.split() + bot.send_message(call.message.chat.id, f'Поздравили {celeb_name[0]} {celeb_name[3]}!!!') + else: + bot.delete_message(chat_id=call.message.chat.id, message_id=call.message.message_id) + usersbase.record_cleaner_unceleb(bot_message_id=call.message.message_id) + #bot.send_message(call.message.chat.id, 'Ничего не делали, так как не победитель') From 14d9c4aa13f1a755d9b54135fd84268005f35ef0 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 20 Jul 2022 09:29:14 +0300 Subject: [PATCH 097/113] added commands for /unceleb and /lukylist --- database/commands.py | 115 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 110 insertions(+), 5 deletions(-) diff --git a/database/commands.py b/database/commands.py index afce775..14aa9e0 100644 --- a/database/commands.py +++ b/database/commands.py @@ -34,19 +34,124 @@ def insert2(nickname: str, """, (nickname, user_name, chat_name, congr_number, chat_id, user_id, dtime, is_winner)) -def select_lucky(moderator_id): +"блок функций для вывода всех кто в юбилейном списке" + + +def select_lucky(moderator_id: int): + with sqlite3.connect(( DB )) as conn: cursor = conn.cursor() - # print(moderator_id, 's') - cursor.execute(f"""SELECT chat_name, user_name, nickname, congr_number, dtime_connetion, is_winner + cursor.execute(f"""SELECT chat_name, user_name, nickname, congr_number, dtime_connetion, is_winner, chat_id FROM 'users' JOIN 'groups_relation' ON chat_id = group_id AND moderator_id = abs({moderator_id});""") - # print(moderator_id, 'select2') result = cursor.fetchall() - # prin(r) return result +def select_lucky_id(idd: int): + + with sqlite3.connect(( DB )) as conn: + cursor = conn.cursor() + cursor.execute(f"""SELECT * + FROM 'users' + WHERE chat_id = {idd};""") + result = cursor.fetchall() + return result + + +"Блок функций для поздравления последних непоздравленных начало" + + +def select_last_uncongratulate(moderator_id: int): + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(f"""SELECT chat_id, congr_number, nickname, user_name, chat_name, dtime_connetion, id, is_winner + FROM 'users' JOIN 'groups_relation' + ON chat_id = group_id AND moderator_id = abs({moderator_id}) AND is_winner = 0 + ORDER BY chat_id, congr_number;""") + result = cursor.fetchall() + return result + + +def select_group_id(moderator_id: int): + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(f"""SELECT chat_id, COUNT(*) + FROM 'users' JOIN 'groups_relation' + ON chat_id = group_id AND moderator_id = abs({moderator_id}) AND is_winner = 0 + GROUP BY chat_id;""") + result = cursor.fetchall() + return result + + +def temp_save_unceleb( + chat_id: int, + record_id: int, + bot_message_id: int + ) -> None: + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(""" + INSERT INTO 'temp_unceleb' (chat_id, record_id, bot_message_id) VALUES (?, ?, ?); + """, (chat_id, record_id, bot_message_id)) + + +def temp_cleaner(): + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(f'''DELETE FROM 'temp_unceleb';''') + + +def get_chat_id_unceleb(bot_message_id): + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(f"SELECT chat_id FROM 'temp_unceleb' WHERE bot_message_id={bot_message_id}") + result = cursor.fetchall() + return result[0][0] + + +def is_winner_id_select_unceleb( + bot_message_id: int, + ) -> None: + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + result = cursor.execute(f'''SELECT id FROM users Join temp_unceleb ON id=record_id + WHERE bot_message_id={bot_message_id};''') + id = [] + for i in result: + id.append(i) + + return id[0][0] + + +def buttons_remover_unceleb( + chat_id: int, + ) -> None: + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(f"SELECT bot_message_id FROM 'temp_unceleb' WHERE chat_id={chat_id}") + result = cursor.fetchall() + delete_list = [] + for i in result: + delete_list.extend(i) + return delete_list + + +def storage_cleaner_unceleb( + chat_id: int, + ) -> None: + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(f'''DELETE FROM 'temp_unceleb' WHERE chat_id={chat_id};''') + + +def record_cleaner_unceleb(bot_message_id: int) -> None: + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(f'''DELETE FROM 'temp_unceleb' WHERE bot_message_id={bot_message_id};''') +"Конец блока функций unceleb" + + def winner_check(id): with sqlite3.connect(( DB )) as conn: cursor = conn.cursor() From 12e362ef5f2823b0d9baf4212bee9ddc853cef92 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 20 Jul 2022 10:02:43 +0300 Subject: [PATCH 098/113] changes to improce code readability --- config_data/config.py | 1 + database/commands.py | 301 ++++++++++++++------------ handlers/register_new_user.py | 40 ++-- keyboards/inline/__init__.py | 1 + keyboards/inline/new_user_keyboard.py | 14 ++ 5 files changed, 193 insertions(+), 164 deletions(-) create mode 100644 keyboards/inline/new_user_keyboard.py diff --git a/config_data/config.py b/config_data/config.py index 9cb2b01..0779462 100644 --- a/config_data/config.py +++ b/config_data/config.py @@ -8,6 +8,7 @@ BOT_TOKEN = os.getenv('BOT_TOKEN') ADMIN_IDS = os.getenv('ADMIN_IDS') +HAPPY_NUMBER = 4 DEFAULT_COMMANDS = ( ('start', "Запустить бота"), diff --git a/database/commands.py b/database/commands.py index 14aa9e0..8a4e644 100644 --- a/database/commands.py +++ b/database/commands.py @@ -1,29 +1,31 @@ import sqlite3 import os -import datetime from typing import List +import datetime ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) DB = os.path.join(ROOT_DIR, 'database.db') -def insert(nickname: str, user_name: str, chat_name: str, user_number: int, dtime=datetime.datetime.now().isoformat()) -> None: - with sqlite3.connect((DB)) as conn: - cursor = conn.cursor() - cursor.execute(""" - INSERT INTO 'users' (nickname, user_name, chat_name, user_number, dtime_connetion) VALUES (?, ?, ?, ?,?); - """, (nickname, user_name, chat_name, user_number, dtime)) +""""Блок функций для регистрации и обработки нового юбилейного пользователя""" -def insert2(nickname: str, - user_name: str, - chat_id: int, - user_id: int, - chat_name: str, - congr_number: int, - is_winner: int, - dtime: datetime = datetime.datetime.now().isoformat()) -> None: +def insert_to_users(nickname: str, user_name: str, chat_id: int, user_id: int, chat_name: str, + congr_number: int, is_winner: int, dtime_connection) -> None: + """ + Функция, которая записывает nickname, user_name, chat_id, user_id, chat_name, congr_number, is_winner, dtime в + таблицу users при вступлении нового юбилейного пользователя. + :param str nickname: ник пользователя в telegram + :param str user_name: имя пользователя в telegram + :param int chat_id: уникальный id группы, куда вступил новый пользователь + :param int user_id: уникальный id пользователя + :param str chat_name: имя чата, куда вступил новый пользователь + :param int congr_number: юбилейный номер вступления пользователя + :param int is_winner: является ли пользователь победителем (1 да, 0 нет) + :param dtime_connection: дата и время вступления пользователя + :return: None + """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(""" @@ -31,92 +33,90 @@ def insert2(nickname: str, congr_number, chat_id, user_id, dtime_connetion, is_winner) VALUES (?, ?, ?, ?,?,?,?,?); - """, (nickname, user_name, chat_name, congr_number, chat_id, user_id, dtime, is_winner)) + """, (nickname, user_name, chat_name, congr_number, chat_id, user_id, dtime_connection, is_winner)) -"блок функций для вывода всех кто в юбилейном списке" - - -def select_lucky(moderator_id: int): - - with sqlite3.connect(( DB )) as conn: - cursor = conn.cursor() - cursor.execute(f"""SELECT chat_name, user_name, nickname, congr_number, dtime_connetion, is_winner, chat_id - FROM 'users' JOIN 'groups_relation' - ON chat_id = group_id AND moderator_id = abs({moderator_id});""") - result = cursor.fetchall() - return result - - -def select_lucky_id(idd: int): - +def winner_check(user_id: int) -> list: + """" + Функция которая проверяет, является ли пользователь из таблицы users c конкретным значением user_id победителем. + :param int user_id: уникальный id пользователя + :return list: информация о пользователе-победителе в виде списка + """ with sqlite3.connect(( DB )) as conn: cursor = conn.cursor() - cursor.execute(f"""SELECT * - FROM 'users' - WHERE chat_id = {idd};""") - result = cursor.fetchall() - return result - - -"Блок функций для поздравления последних непоздравленных начало" + cursor.execute(f"SELECT * FROM users WHERE user_id={user_id} AND is_winner=1") + result = cursor.fetchall() + return result -def select_last_uncongratulate(moderator_id: int): +def other_lucky_check(count_users: int, chat_id: int) -> None: + lucky_number = count_users - count_users % 500 with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - cursor.execute(f"""SELECT chat_id, congr_number, nickname, user_name, chat_name, dtime_connetion, id, is_winner - FROM 'users' JOIN 'groups_relation' - ON chat_id = group_id AND moderator_id = abs({moderator_id}) AND is_winner = 0 - ORDER BY chat_id, congr_number;""") - result = cursor.fetchall() - return result + result = cursor.execute(f'''SELECT * FROM users WHERE chat_id={chat_id} AND + (congr_number BETWEEN {lucky_number} AND {lucky_number + 2}) AND is_winner=1;''') + check_list = [] + for i in result: + check_list.append(i) -def select_group_id(moderator_id: int): +def select_id_from_users(user_id) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - cursor.execute(f"""SELECT chat_id, COUNT(*) - FROM 'users' JOIN 'groups_relation' - ON chat_id = group_id AND moderator_id = abs({moderator_id}) AND is_winner = 0 - GROUP BY chat_id;""") - result = cursor.fetchall() - return result + cursor.execute(f"SELECT id FROM 'users' WHERE user_id={user_id}") + record_id = cursor.fetchall() + return record_id[-1][0] -def temp_save_unceleb( +def temp_save( chat_id: int, record_id: int, - bot_message_id: int + bot_message_id: int, + users_chat: int ) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(""" - INSERT INTO 'temp_unceleb' (chat_id, record_id, bot_message_id) VALUES (?, ?, ?); - """, (chat_id, record_id, bot_message_id)) + INSERT INTO 'temp_storage' (chat_id, record_id, bot_message_id, button_chat_id) VALUES (?, ?, ?, ?); + """, (users_chat, record_id, bot_message_id, chat_id,)) -def temp_cleaner(): +def buttons_remover( + chat_id: int, + ) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - cursor.execute(f'''DELETE FROM 'temp_unceleb';''') + cursor.execute(f"SELECT bot_message_id FROM 'temp_storage' WHERE chat_id={chat_id}") + result = cursor.fetchall() + delete_list = [] + for i in result: + delete_list.extend(i) + return delete_list -def get_chat_id_unceleb(bot_message_id): +def storage_cleaner( + chat_id: int, + ) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - cursor.execute(f"SELECT chat_id FROM 'temp_unceleb' WHERE bot_message_id={bot_message_id}") - result = cursor.fetchall() - return result[0][0] + cursor.execute(f'''DELETE FROM 'temp_storage' WHERE chat_id={chat_id};''') -def is_winner_id_select_unceleb( +def storage_cleaner_lite( + message_id: int, + ) -> None: + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(f'''DELETE FROM 'temp_storage' WHERE bot_message_id={message_id};''') + + +def is_winner_id_select( bot_message_id: int, ) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - result = cursor.execute(f'''SELECT id FROM users Join temp_unceleb ON id=record_id - WHERE bot_message_id={bot_message_id};''') + result = cursor.execute(f'''SELECT users.id FROM users Join temp_storage ON users.id=temp_storage.record_id + WHERE temp_storage.bot_message_id={bot_message_id};''') id = [] for i in result: id.append(i) @@ -124,40 +124,32 @@ def is_winner_id_select_unceleb( return id[0][0] -def buttons_remover_unceleb( - chat_id: int, +def is_winner_record(winner_id: int, ) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - cursor.execute(f"SELECT bot_message_id FROM 'temp_unceleb' WHERE chat_id={chat_id}") - result = cursor.fetchall() - delete_list = [] - for i in result: - delete_list.extend(i) - return delete_list + cursor.execute(f'''UPDATE users set is_winner = '1' + WHERE id={winner_id}''') -def storage_cleaner_unceleb( - chat_id: int, - ) -> None: + +def data_finder( + bot_message_id: int, + ) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - cursor.execute(f'''DELETE FROM 'temp_unceleb' WHERE chat_id={chat_id};''') + result = cursor.execute(f'''SELECT users.user_name, users.congr_number, users.chat_id FROM users Join temp_storage ON users.id=temp_storage.record_id + WHERE temp_storage.bot_message_id={bot_message_id};''') + data = [] + for i in result: + data.append(i) + return data -def record_cleaner_unceleb(bot_message_id: int) -> None: - with sqlite3.connect((DB)) as conn: - cursor = conn.cursor() - cursor.execute(f'''DELETE FROM 'temp_unceleb' WHERE bot_message_id={bot_message_id};''') -"Конец блока функций unceleb" -def winner_check(id): - with sqlite3.connect(( DB )) as conn: - cursor = conn.cursor() - cursor.execute(f"SELECT * FROM users WHERE user_id={id} AND is_winner=1") - result = cursor.fetchall() - return result + +""""Блок функций для настроек и просмотра админки""" def insert_to_groups(moderator_id: int, group_id: int) -> None: @@ -221,63 +213,92 @@ def get_moderator_id() -> List[int]: return result -def select_id_from_users(user_id) -> None: + + + +"блок функций для вывода всех кто в юбилейном списке" + + +def select_lucky(moderator_id: int): + + with sqlite3.connect(( DB )) as conn: + cursor = conn.cursor() + cursor.execute(f"""SELECT chat_name, user_name, nickname, congr_number, dtime_connetion, is_winner, chat_id + FROM 'users' JOIN 'groups_relation' + ON chat_id = group_id AND moderator_id = abs({moderator_id});""") + result = cursor.fetchall() + return result + + +def select_lucky_id(idd: int): + + with sqlite3.connect(( DB )) as conn: + cursor = conn.cursor() + cursor.execute(f"""SELECT * + FROM 'users' + WHERE chat_id = {idd};""") + result = cursor.fetchall() + return result + + +"Блок функций для поздравления последних непоздравленных начало" + + +def select_last_uncongratulate(moderator_id: int): with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - cursor.execute(f"SELECT id FROM 'users' WHERE user_id={user_id}") - record_id = cursor.fetchall() - return record_id[-1][0] + cursor.execute(f"""SELECT chat_id, congr_number, nickname, user_name, chat_name, dtime_connetion, id, is_winner + FROM 'users' JOIN 'groups_relation' + ON chat_id = group_id AND moderator_id = abs({moderator_id}) AND is_winner = 0 + ORDER BY chat_id, congr_number;""") + result = cursor.fetchall() + return result -def temp_save( - chat_id: int, - record_id: int, - bot_message_id: int, - users_chat: int - ) -> None: +def select_group_id(moderator_id: int): with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - cursor.execute(""" - INSERT INTO 'temp_storage' (chat_id, record_id, bot_message_id, button_chat_id) VALUES (?, ?, ?, ?); - """, (users_chat, record_id, bot_message_id, chat_id,)) + cursor.execute(f"""SELECT chat_id, COUNT(*) + FROM 'users' JOIN 'groups_relation' + ON chat_id = group_id AND moderator_id = abs({moderator_id}) AND is_winner = 0 + GROUP BY chat_id;""") + result = cursor.fetchall() + return result -def buttons_remover( - chat_id: int, - ) -> None: +def temp_save_unceleb( + chat_id: int, + record_id: int, + bot_message_id: int + ) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - cursor.execute(f"SELECT bot_message_id FROM 'temp_storage' WHERE chat_id={chat_id}") - result = cursor.fetchall() - delete_list = [] - for i in result: - delete_list.extend(i) - return delete_list + cursor.execute(""" + INSERT INTO 'temp_unceleb' (chat_id, record_id, bot_message_id) VALUES (?, ?, ?); + """, (chat_id, record_id, bot_message_id)) -def storage_cleaner( - chat_id: int, - ) -> None: +def temp_cleaner(): with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - cursor.execute(f'''DELETE FROM 'temp_storage' WHERE chat_id={chat_id};''') + cursor.execute(f'''DELETE FROM 'temp_unceleb';''') -def storage_cleaner_lite( - message_id: int, - ) -> None: +def get_chat_id_unceleb(bot_message_id): with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - cursor.execute(f'''DELETE FROM 'temp_storage' WHERE bot_message_id={message_id};''') + cursor.execute(f"SELECT chat_id FROM 'temp_unceleb' WHERE bot_message_id={bot_message_id}") + result = cursor.fetchall() + return result[0][0] -def is_winner_id_select( +def is_winner_id_select_unceleb( bot_message_id: int, ) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - result = cursor.execute(f'''SELECT users.id FROM users Join temp_storage ON users.id=temp_storage.record_id - WHERE temp_storage.bot_message_id={bot_message_id};''') + result = cursor.execute(f'''SELECT id FROM users Join temp_unceleb ON id=record_id + WHERE bot_message_id={bot_message_id};''') id = [] for i in result: id.append(i) @@ -285,37 +306,29 @@ def is_winner_id_select( return id[0][0] -def is_winner_record(winner_id: int, +def buttons_remover_unceleb( + chat_id: int, ) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - cursor.execute(f'''UPDATE users set is_winner = '1' - WHERE id={winner_id}''') + cursor.execute(f"SELECT bot_message_id FROM 'temp_unceleb' WHERE chat_id={chat_id}") + result = cursor.fetchall() + delete_list = [] + for i in result: + delete_list.extend(i) + return delete_list -def other_lucky_check( - count_users: int, +def storage_cleaner_unceleb( chat_id: int, ) -> None: - lucky_number = count_users - count_users % 500 with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - result = cursor.execute(f'''SELECT * FROM users WHERE chat_id={chat_id} AND - (congr_number BETWEEN {lucky_number} AND {lucky_number + 2}) AND is_winner=1;''') - check_list = [] - for i in result: - check_list.append(i) + cursor.execute(f'''DELETE FROM 'temp_unceleb' WHERE chat_id={chat_id};''') -def data_finder( - bot_message_id: int, - ) -> None: +def record_cleaner_unceleb(bot_message_id: int) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - result = cursor.execute(f'''SELECT users.user_name, users.congr_number, users.chat_id FROM users Join temp_storage ON users.id=temp_storage.record_id - WHERE temp_storage.bot_message_id={bot_message_id};''') - data = [] - for i in result: - data.append(i) - - return data + cursor.execute(f'''DELETE FROM 'temp_unceleb' WHERE bot_message_id={bot_message_id};''') +"Конец блока функций unceleb" diff --git a/handlers/register_new_user.py b/handlers/register_new_user.py index ce67b04..636063a 100644 --- a/handlers/register_new_user.py +++ b/handlers/register_new_user.py @@ -1,37 +1,37 @@ from loader import bot -from database.commands import insert, insert2 +from database.commands import insert_to_users import datetime from database.commands import winner_check, select_id_from_users,\ temp_save, buttons_remover, storage_cleaner, storage_cleaner_lite, is_winner_id_select, \ is_winner_record, other_lucky_check, data_finder - -from telebot import types +from telebot.types import Message, CallbackQuery +from keyboards.inline import new_user_keyboard +from config_data.config import HAPPY_NUMBER @bot.message_handler(content_types=['new_chat_members']) -def handler_new_member(message): +def handler_new_member(message: Message) -> None: + """" + Хендлер, который обрабатывает вступление в группу пользователей нового пользователя. + :param Message message: сообщение о вступлении в группу нового пользователя + :return: None + """ count = bot.get_chat_members_count(message.chat.id) - user_number=message.from_user.id + user_id = message.from_user.id chat_name = message.chat.title nickname = message.from_user.username user_name = message.from_user.first_name dtime = datetime.datetime.now().replace(microsecond=0, tzinfo=None) moder_id = 258281993 #Я не знаю как лучше модерский айди написать и как он будет передаваться, по этому пока так + # проверка на то, что новый пользователь не является ботом, еще не был победителем, + # а также имеет юбилейный номер вступления + if (not message.from_user.is_bot) and (not winner_check(user_id=user_id)) and \ + (count % HAPPY_NUMBER == 0 or count % HAPPY_NUMBER == 1 or count % HAPPY_NUMBER == 2): - markup = types.InlineKeyboardMarkup(row_width=1) - congratulations = types.InlineKeyboardButton(text='Поздравляем', callback_data='grac') - shame = types.InlineKeyboardButton(text='Не поздравляем', callback_data='decline') - markup.add(congratulations, shame) - - - if not message.from_user.is_bot and not winner_check(user_number): # and count % 500 == 0 or count % 500 == 1 or count % 500 == 2: - # в 28 строке спящий кусок кода, который нужно включить когда запустим бота - insert2( - nickname=message.from_user.username, user_name=message.from_user.first_name, - congr_number=count, chat_name=message.chat.title, - user_id=message.from_user.id, dtime=dtime, - chat_id=message.chat.id, is_winner=0) + # если все условия выполнены, записываем пользователя в базу + insert_to_users(nickname=nickname, user_name=user_name, congr_number=count, chat_name=chat_name, + user_id=user_id, dtime_connection=dtime, chat_id=message.chat.id, is_winner=0) if not other_lucky_check(count_users=502, chat_id=message.chat.id): #здесь count_users поменяем на count, когда будут реальные условия. @@ -41,7 +41,7 @@ def handler_new_member(message): bot_message = bot.send_message(moder_id, f'В {chat_name} вступил юбилейный пользователь {nickname} {user_name}\n' f'Порядковый номер вступления: {count}, время вступления: {dtime}', - reply_markup=markup) + reply_markup=new_user_keyboard.congratulate_keyboard()) temp_save(chat_id=moder_id, record_id=select_id_from_users(user_id=message.from_user.id), @@ -53,7 +53,7 @@ def handler_new_member(message): @bot.callback_query_handler(func=lambda call: call.data == "grac" or call.data == "decline") -def callback(call): +def callback(call: CallbackQuery): if call.message: winner = is_winner_id_select(bot_message_id=call.message.message_id) name = data_finder(bot_message_id=call.message.message_id)[0][0] diff --git a/keyboards/inline/__init__.py b/keyboards/inline/__init__.py index 4df2002..a2c087e 100644 --- a/keyboards/inline/__init__.py +++ b/keyboards/inline/__init__.py @@ -1 +1,2 @@ from . import admin_keyboard +from . import new_user_keyboard diff --git a/keyboards/inline/new_user_keyboard.py b/keyboards/inline/new_user_keyboard.py new file mode 100644 index 0000000..1dff4a5 --- /dev/null +++ b/keyboards/inline/new_user_keyboard.py @@ -0,0 +1,14 @@ +from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton + + +def congratulate_keyboard() -> InlineKeyboardMarkup: + """ + Функция, которая генерирует инлайн-клавиатуру "Поздравить/Отклонить" для поздравления юбилейного пользователя. + :return InlineKeyboardMarkup: + """ + + keyboard = InlineKeyboardMarkup(row_width=1) + congratulations = InlineKeyboardButton(text='Поздравляем', callback_data='grac') + shame = InlineKeyboardButton(text='Не поздравляем', callback_data='decline') + keyboard.add(congratulations, shame) + return keyboard From 9b0ada8acdb4ce659478ca53ecacecc3f6e0747b Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 20 Jul 2022 12:56:07 +0300 Subject: [PATCH 099/113] put keyboards to deticated locations --- keyboards/inline/new_user_keyboard.py | 4 ++-- keyboards/inline/unceleb_keyboard.py | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 keyboards/inline/unceleb_keyboard.py diff --git a/keyboards/inline/new_user_keyboard.py b/keyboards/inline/new_user_keyboard.py index 1dff4a5..e39f15f 100644 --- a/keyboards/inline/new_user_keyboard.py +++ b/keyboards/inline/new_user_keyboard.py @@ -8,7 +8,7 @@ def congratulate_keyboard() -> InlineKeyboardMarkup: """ keyboard = InlineKeyboardMarkup(row_width=1) - congratulations = InlineKeyboardButton(text='Поздравляем', callback_data='grac') - shame = InlineKeyboardButton(text='Не поздравляем', callback_data='decline') + congratulations = InlineKeyboardButton(text='Поздравить', callback_data='grac') + shame = InlineKeyboardButton(text='Отклонить', callback_data='decline') keyboard.add(congratulations, shame) return keyboard diff --git a/keyboards/inline/unceleb_keyboard.py b/keyboards/inline/unceleb_keyboard.py new file mode 100644 index 0000000..81137a1 --- /dev/null +++ b/keyboards/inline/unceleb_keyboard.py @@ -0,0 +1,15 @@ +from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton + + +def congratulate_keyboard() -> InlineKeyboardMarkup: + """ + Функция, которая генерирует инлайн-клавиатуру "Поздравить/Отклонить" для поздравления пользователей из + команды /unceleb. + :return InlineKeyboardMarkup: + """ + + keyboard = InlineKeyboardMarkup(row_width=1) + congr = InlineKeyboardButton(text='Поздравить', callback_data='congr') + uncongr = InlineKeyboardButton(text='Отклонить', callback_data='uncongr') + keyboard.add(congr, uncongr) + return keyboard From a9ae2d20b58342ffeac2eee28ef37c29f10bde1d Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 20 Jul 2022 12:56:21 +0300 Subject: [PATCH 100/113] added HAPPY_NUMBER --- config_data/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config_data/config.py b/config_data/config.py index 0779462..5aa66ca 100644 --- a/config_data/config.py +++ b/config_data/config.py @@ -8,7 +8,7 @@ BOT_TOKEN = os.getenv('BOT_TOKEN') ADMIN_IDS = os.getenv('ADMIN_IDS') -HAPPY_NUMBER = 4 +HAPPY_NUMBER = 5 DEFAULT_COMMANDS = ( ('start', "Запустить бота"), From 08675236d77e92707c5570a189148636dce3410b Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 20 Jul 2022 12:56:29 +0300 Subject: [PATCH 101/113] keyboards added --- keyboards/inline/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/keyboards/inline/__init__.py b/keyboards/inline/__init__.py index a2c087e..2cdb5ee 100644 --- a/keyboards/inline/__init__.py +++ b/keyboards/inline/__init__.py @@ -1,2 +1,3 @@ from . import admin_keyboard from . import new_user_keyboard +from . import unceleb_keyboard From 17146e9739a99499d6f7f9b5b5cb3b03c4439780 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 20 Jul 2022 12:56:37 +0300 Subject: [PATCH 102/113] minor changes --- handlers/admin.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/handlers/admin.py b/handlers/admin.py index 9765dd0..58a4580 100644 --- a/handlers/admin.py +++ b/handlers/admin.py @@ -1,6 +1,6 @@ from telebot.types import Message, CallbackQuery from loader import bot -from database.commands import get_moderator_id, select_from_groups, insert_to_groups, delete_from_groups +from database.commands import get_all_moderator_id, select_from_groups, insert_to_groups, delete_from_groups from keyboards.inline import admin_keyboard from config_data.config import ADMIN_IDS @@ -13,7 +13,7 @@ def bot_admin_show(message: Message) -> None: :param Message message: /adminshow :return: None """ - moderator_ids = get_moderator_id() + moderator_ids = get_all_moderator_id() if (message.chat.id in moderator_ids) or (str(message.from_user.id) in ADMIN_IDS): admin_info = select_from_groups() @@ -39,7 +39,7 @@ def bot_admin_setup(message: Message) -> None: :param Message message: /adminsetup :return: None """ - moderator_ids = get_moderator_id() + moderator_ids = get_all_moderator_id() if str(message.from_user.id) in ADMIN_IDS: bot.send_message(chat_id=message.chat.id, From 4b4c6e38b6a0c400eab2eaa7b4fed73fc65272d1 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 20 Jul 2022 12:56:47 +0300 Subject: [PATCH 103/113] documentation added to commands --- database/commands.py | 208 ++++++++++++++++++++++++++++--------------- 1 file changed, 138 insertions(+), 70 deletions(-) diff --git a/database/commands.py b/database/commands.py index 8a4e644..d3567a9 100644 --- a/database/commands.py +++ b/database/commands.py @@ -1,7 +1,7 @@ import sqlite3 import os from typing import List -import datetime +from config_data.config import HAPPY_NUMBER ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) @@ -11,6 +11,37 @@ """"Блок функций для регистрации и обработки нового юбилейного пользователя""" +def get_all_group_id() -> List[int]: + """ + Функция, которая возвращает список всех id групп пользователей из таблицы groups_relation. + :return List[int]: список id групп пользователей + """ + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(f"SELECT DISTINCT group_id FROM 'groups_relation'") + group_id_list = cursor.fetchall() + result = [] + for group_id in group_id_list: + result.append(group_id[0]) + return result + + +def get_moderator_id(group_id: int) -> List[int]: + """ + Функция, которая возвращает список id групп модераторов из таблицы groups_relation по id группы пользователя. + :param int group_id: уникальный id группы пользователя + :return List[int]: список id групп модераторов + """ + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(f"SELECT DISTINCT moderator_id FROM 'groups_relation' WHERE group_id={group_id}") + moderator_id_list = cursor.fetchall() + result = [] + for moderator_id in moderator_id_list: + result.append(moderator_id[0]) + return result + + def insert_to_users(nickname: str, user_name: str, chat_id: int, user_id: int, chat_name: str, congr_number: int, is_winner: int, dtime_connection) -> None: """ @@ -49,18 +80,32 @@ def winner_check(user_id: int) -> list: return result -def other_lucky_check(count_users: int, chat_id: int) -> None: - lucky_number = count_users - count_users % 500 +def other_lucky_check(count_users: int, chat_id: int) -> list: + """" + Функция которая проверяет, есть ли в таблице users для данного chat_id группы и данного юбилейного номера, + победители. + :param int count_users: юбилейный номер пользователя + :param int chat_id: уникальный id группы + :return list: информация о победителях + """ + lucky_number = count_users - count_users % HAPPY_NUMBER with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - result = cursor.execute(f'''SELECT * FROM users WHERE chat_id={chat_id} AND + cursor.execute(f'''SELECT * FROM users WHERE chat_id={chat_id} AND (congr_number BETWEEN {lucky_number} AND {lucky_number + 2}) AND is_winner=1;''') - check_list = [] - for i in result: - check_list.append(i) + winners_list = cursor.fetchall() + result = [] + for winner in winners_list: + result.append(winner) + return result -def select_id_from_users(user_id) -> None: +def select_id_from_users(user_id: int) -> int: + """" + Функция которая по id пользователя возвращает id последней записи о нем из таблицы 'users'. + :param int user_id: уникальный id пользователя + :return int: id записи о пользователе + """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(f"SELECT id FROM 'users' WHERE user_id={user_id}") @@ -68,85 +113,102 @@ def select_id_from_users(user_id) -> None: return record_id[-1][0] -def temp_save( - chat_id: int, - record_id: int, - bot_message_id: int, - users_chat: int - ) -> None: +def temp_save(chat_id: int, record_id: int, bot_message_id: int) -> None: + """" + Функция которая в таблицу 'temp_storage' записывает chat_id, record_id, bot_message_id. + :param int chat_id: уникальный id группы + :param int record_id: уникальный id записи о пользователе в таблицу users + :param int bot_message_id: уникальный id сообщения бота + :return: None + """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(""" - INSERT INTO 'temp_storage' (chat_id, record_id, bot_message_id, button_chat_id) VALUES (?, ?, ?, ?); - """, (users_chat, record_id, bot_message_id, chat_id,)) + INSERT INTO 'temp_storage' (chat_id, record_id, bot_message_id) VALUES (?, ?, ?); + """, (chat_id, record_id, bot_message_id)) -def buttons_remover( - chat_id: int, - ) -> None: +def is_winner_id_select(bot_message_id: int) -> int: + """" + Функция которая по bot_message_id сообщенияб бота возвращает id записи о пользователе из таблицы 'temp_storage'. + :param int bot_message_id: уникальный id сообщения бота + :return int: id записи о пользователе + """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - cursor.execute(f"SELECT bot_message_id FROM 'temp_storage' WHERE chat_id={chat_id}") - result = cursor.fetchall() - delete_list = [] - for i in result: - delete_list.extend(i) - return delete_list + ids = cursor.execute(f'''SELECT users.id FROM users Join temp_storage ON users.id=temp_storage.record_id + WHERE temp_storage.bot_message_id={bot_message_id};''') + result = [] + for id in ids: + result.append(id) + return result[0][0] -def storage_cleaner( - chat_id: int, - ) -> None: +def data_finder(bot_message_id: int) -> list: + """" + Функция которая по bot_message_id сообщения бота возвращает user_name, congr_number, chat_id из таблицы 'users'. + :param int bot_message_id: уникальный id сообщения бота + :return list: информация о победите + """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - cursor.execute(f'''DELETE FROM 'temp_storage' WHERE chat_id={chat_id};''') + result = cursor.execute(f'''SELECT users.user_name, users.congr_number, users.chat_id FROM users + Join temp_storage ON users.id=temp_storage.record_id + WHERE temp_storage.bot_message_id={bot_message_id};''') + data = [] + for i in result: + data.append(i) + return data -def storage_cleaner_lite( - message_id: int, - ) -> None: +def is_winner_record(winner_id: int) -> None: + """" + Функция которая по winner_id id записи о пользователе в таблице 'users' обновляет поле is_winner с 0 на 1. + :param int winner_id: уникальный id записи о пользователе в таблице 'users' + :return: None + """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - cursor.execute(f'''DELETE FROM 'temp_storage' WHERE bot_message_id={message_id};''') + cursor.execute(f'''UPDATE users set is_winner = '1' + WHERE id={winner_id}''') -def is_winner_id_select( - bot_message_id: int, - ) -> None: +def buttons_remover(chat_id: int) -> List[int]: + """" + Функция которая по chat_id группы пользователей из таблицы 'temp_storage' возвращает все bot_message_id. + :param int chat_id: уникальный id группы пользователей + :return List[int]: список id bot_message_id + """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - result = cursor.execute(f'''SELECT users.id FROM users Join temp_storage ON users.id=temp_storage.record_id - WHERE temp_storage.bot_message_id={bot_message_id};''') - id = [] + cursor.execute(f"SELECT bot_message_id FROM 'temp_storage' WHERE chat_id={chat_id}") + result = cursor.fetchall() + delete_list = [] for i in result: - id.append(i) - - return id[0][0] + delete_list.append(i) + return delete_list -def is_winner_record(winner_id: int, - ) -> None: +def storage_cleaner(chat_id: int) -> None: + """" + Функция которая по chat_id группы пользователей из таблицы 'temp_storage' удаляет все записи. + :param int chat_id: уникальный id записи о пользователе в таблице 'users' + :return: None + """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - cursor.execute(f'''UPDATE users set is_winner = '1' - WHERE id={winner_id}''') - + cursor.execute(f'''DELETE FROM 'temp_storage' WHERE chat_id={chat_id};''') -def data_finder( - bot_message_id: int, - ) -> None: +def storage_cleaner_lite(bot_message_id: int) -> None: + """" + Функция которая по bot_message_id сообщения бота из таблицы 'temp_storage' удаляет запись. + :param int bot_message_id: уникальный id сообщения бота + :return: None + """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - result = cursor.execute(f'''SELECT users.user_name, users.congr_number, users.chat_id FROM users Join temp_storage ON users.id=temp_storage.record_id - WHERE temp_storage.bot_message_id={bot_message_id};''') - data = [] - for i in result: - data.append(i) - - return data - - + cursor.execute(f'''DELETE FROM 'temp_storage' WHERE bot_message_id={bot_message_id};''') """"Блок функций для настроек и просмотра админки""" @@ -198,14 +260,14 @@ def delete_from_groups() -> None: cursor.execute("DELETE FROM 'groups_relation'") -def get_moderator_id() -> List[int]: +def get_all_moderator_id() -> List[int]: """ - Функция, которая возвращает список id групп модераторов из таблицы groups_relation. + Функция, которая возвращает список всех id групп модераторов из таблицы groups_relation. :return List[int]: список id групп модераторов """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - cursor.execute("SELECT moderator_id FROM 'groups_relation'") + cursor.execute("SELECT DISTINCT moderator_id FROM 'groups_relation'") moderator_id_list = cursor.fetchall() result = [] for moderator_id in moderator_id_list: @@ -213,9 +275,6 @@ def get_moderator_id() -> List[int]: return result - - - "блок функций для вывода всех кто в юбилейном списке" @@ -241,15 +300,21 @@ def select_lucky_id(idd: int): return result -"Блок функций для поздравления последних непоздравленных начало" +"Блок функций для поздравления последних непоздравленных пользователей" -def select_last_uncongratulate(moderator_id: int): +def select_last_uncongratulate(moderator_id: int) -> list: + """ + Функция, которая по id группы модераторов возвращает chat_id, congr_number, nickname, user_name, chat_name, + dtime_connetion, id, is_winner. + :param int moderator_id: id группы модераторов + :return list: список информации о последних неподзравленных пользователях + """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(f"""SELECT chat_id, congr_number, nickname, user_name, chat_name, dtime_connetion, id, is_winner FROM 'users' JOIN 'groups_relation' - ON chat_id = group_id AND moderator_id = abs({moderator_id}) AND is_winner = 0 + ON chat_id = group_id AND moderator_id = {moderator_id} AND is_winner = 0 ORDER BY chat_id, congr_number;""") result = cursor.fetchall() return result @@ -278,7 +343,11 @@ def temp_save_unceleb( """, (chat_id, record_id, bot_message_id)) -def temp_cleaner(): +def temp_cleaner() -> None: + """ + Функция, которая очищает таблицу 'temp_unceleb'. + :return: None + """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(f'''DELETE FROM 'temp_unceleb';''') @@ -331,4 +400,3 @@ def record_cleaner_unceleb(bot_message_id: int) -> None: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(f'''DELETE FROM 'temp_unceleb' WHERE bot_message_id={bot_message_id};''') -"Конец блока функций unceleb" From 7f714786d08e88262e46a5e11a973b39cc355d47 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 20 Jul 2022 12:56:59 +0300 Subject: [PATCH 104/113] logic completed and checked --- handlers/register_new_user.py | 109 ++++++++++++++++++---------------- 1 file changed, 57 insertions(+), 52 deletions(-) diff --git a/handlers/register_new_user.py b/handlers/register_new_user.py index 636063a..657db2b 100644 --- a/handlers/register_new_user.py +++ b/handlers/register_new_user.py @@ -3,7 +3,7 @@ import datetime from database.commands import winner_check, select_id_from_users,\ temp_save, buttons_remover, storage_cleaner, storage_cleaner_lite, is_winner_id_select, \ - is_winner_record, other_lucky_check, data_finder + is_winner_record, other_lucky_check, data_finder, get_moderator_id, get_all_group_id from telebot.types import Message, CallbackQuery from keyboards.inline import new_user_keyboard from config_data.config import HAPPY_NUMBER @@ -16,70 +16,75 @@ def handler_new_member(message: Message) -> None: :param Message message: сообщение о вступлении в группу нового пользователя :return: None """ - count = bot.get_chat_members_count(message.chat.id) - user_id = message.from_user.id - chat_name = message.chat.title - nickname = message.from_user.username - user_name = message.from_user.first_name - dtime = datetime.datetime.now().replace(microsecond=0, tzinfo=None) - moder_id = 258281993 #Я не знаю как лучше модерский айди написать и как он будет передаваться, по этому пока так + group_ids = get_all_group_id() - # проверка на то, что новый пользователь не является ботом, еще не был победителем, - # а также имеет юбилейный номер вступления - if (not message.from_user.is_bot) and (not winner_check(user_id=user_id)) and \ - (count % HAPPY_NUMBER == 0 or count % HAPPY_NUMBER == 1 or count % HAPPY_NUMBER == 2): + if message.chat.id in group_ids: + count = bot.get_chat_members_count(message.chat.id) + user_id = message.from_user.id + chat_name = message.chat.title + nickname = message.from_user.username + user_name = message.from_user.first_name + dtime = datetime.datetime.now().replace(microsecond=0, tzinfo=None) - # если все условия выполнены, записываем пользователя в базу - insert_to_users(nickname=nickname, user_name=user_name, congr_number=count, chat_name=chat_name, - user_id=user_id, dtime_connection=dtime, chat_id=message.chat.id, is_winner=0) + # проверка на то, что новый пользователь не является ботом, еще не был победителем, + # а также имеет юбилейный номер вступления + if (not message.from_user.is_bot) and (not winner_check(user_id=user_id)) and \ + (count % HAPPY_NUMBER == 0 or count % HAPPY_NUMBER == 1 or count % HAPPY_NUMBER == 2): + # если все условия выполнены, записываем пользователя в базу в таблицу users + insert_to_users(nickname=nickname, user_name=user_name, congr_number=count, chat_name=chat_name, + user_id=user_id, dtime_connection=dtime, chat_id=message.chat.id, is_winner=0) - if not other_lucky_check(count_users=502, chat_id=message.chat.id): #здесь count_users поменяем на count, когда будут реальные условия. - # Пока для тестов вписано вручную + # проверка, что для юбилейного номера нового пользователя в этом чате еще никого не поздравили + if not other_lucky_check(count_users=count, chat_id=message.chat.id): + # если условие выполнено, предлагаем модераторам поздравить пользователя и + # сохраняем данные в таблицу temp_storage + moderator_ids = get_moderator_id(group_id=message.chat.id) - bot_message = bot.send_message(moder_id, - f'В {chat_name} вступил юбилейный пользователь {nickname} {user_name}\n' - f'Порядковый номер вступления: {count}, время вступления: {dtime}', - reply_markup=new_user_keyboard.congratulate_keyboard()) + for moderator_id in moderator_ids: + bot_message = bot.send_message(chat_id=moderator_id, + text=f'В {chat_name} вступил юбилейный пользователь {nickname} ' + f'{user_name}\nПорядковый номер вступления: {count}, время ' + f'вступления: {dtime}', + reply_markup=new_user_keyboard.congratulate_keyboard()) - temp_save(chat_id=moder_id, - record_id=select_id_from_users(user_id=message.from_user.id), - bot_message_id=bot_message.id, users_chat=message.chat.id) - - - else: - bot.send_message(message.chat.id, f'Что-то пошло не так') #В активной версии нужно убрать, пока оставлено для проверки + temp_save(chat_id=moderator_id, + record_id=select_id_from_users(user_id=message.from_user.id), + bot_message_id=bot_message.id) @bot.callback_query_handler(func=lambda call: call.data == "grac" or call.data == "decline") -def callback(call: CallbackQuery): - if call.message: - winner = is_winner_id_select(bot_message_id=call.message.message_id) - name = data_finder(bot_message_id=call.message.message_id)[0][0] - congr_number = data_finder(bot_message_id=call.message.message_id)[0][1] - users_chat = data_finder(bot_message_id=call.message.message_id)[0][2] - moders_chat = call.message.chat.id - - - if call.data == 'grac': - is_winner_record(winner_id=winner) - remove_list = buttons_remover(chat_id=users_chat) - - for message in remove_list: - bot.delete_message(chat_id=moders_chat, message_id=message) +def callback(call: CallbackQuery) -> None: + """ + Колбек, обрабатывайщий нажатие кнопки Поздравить или Отклонить в группе модераторов. + :param CallbackQuery call: grac or decline + :return: None + """ + winner_id = is_winner_id_select(bot_message_id=call.message.message_id) + name = data_finder(bot_message_id=call.message.message_id)[0] + congr_number = data_finder(bot_message_id=call.message.message_id)[1] + users_chat = data_finder(bot_message_id=call.message.message_id)[2] + moders_chat = call.message.chat.id - storage_cleaner(chat_id=users_chat) + if call.data == 'grac': + is_winner_record(winner_id=winner_id) + remove_list = buttons_remover(chat_id=users_chat) - bot.send_message(users_chat, f'Поздравляю, {name}, ' - f'как же удачно попали в нужное время. Вы ' - f'участник {congr_number} коммьюнити. Вас ждут плюшки и печенюшки.') + for message in remove_list: + bot.delete_message(chat_id=moders_chat, message_id=message) - bot.send_message(moders_chat, f'Участник {name} поздравлен.') + storage_cleaner(chat_id=users_chat) + bot.send_message(chat_id=users_chat, + text=f'\U0001F389 Поздравляю, {name}, как же удачно попали в нужное время!\n' + f'Вы участник {congr_number - congr_number % HAPPY_NUMBER} ' + f'коммьюнити.\nВас ждут плюшки и печенюшки! \U0001F389') - else: - bot.delete_message(chat_id=moders_chat, message_id=call.message.message_id) - storage_cleaner_lite(message_id=call.message.message_id) + bot.send_message(chat_id=moders_chat, + text=f'Участник {name} поздравлен! \U0001F389') - bot.send_message(moders_chat, f'Участника {name} поздравлять не стали, потому что вы нажали кнопку "не поздравлять"') + else: + bot.delete_message(chat_id=moders_chat, message_id=call.message.message_id) + storage_cleaner_lite(bot_message_id=call.message.message_id) + bot.send_message(moders_chat, f'Участника {name} не поздравили.') From dc06c4c7531e22ede46ac7a8f3e7863ad78e5bd5 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 20 Jul 2022 12:57:08 +0300 Subject: [PATCH 105/113] WIP --- handlers/last_uncongratulate.py | 85 ++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 39 deletions(-) diff --git a/handlers/last_uncongratulate.py b/handlers/last_uncongratulate.py index a7cc6ac..477f4cd 100644 --- a/handlers/last_uncongratulate.py +++ b/handlers/last_uncongratulate.py @@ -1,59 +1,66 @@ -from telebot.types import Message +from telebot.types import Message, CallbackQuery from loader import bot -import database.commands as usersbase +from database.commands import temp_cleaner, select_last_uncongratulate, get_all_moderator_id, select_group_id, \ + temp_save_unceleb, get_chat_id_unceleb, is_winner_id_select_unceleb, is_winner_record, buttons_remover_unceleb, \ + storage_cleaner_unceleb, record_cleaner_unceleb import datetime -from telebot import types +from keyboards.inline import unceleb_keyboard @bot.message_handler(commands=['unceleb']) -def bot_uncongratulate(message: Message): - usersbase.temp_cleaner() - markup = types.InlineKeyboardMarkup(row_width=1) - congr = types.InlineKeyboardButton(text='Поздравить', callback_data='congr') - uncongr = types.InlineKeyboardButton(text='Отклонить', callback_data='uncongr') - markup.add(congr, uncongr) - uncelebs = usersbase.select_last_uncongratulate(message.chat.id) - gr_id = usersbase.select_group_id(message.chat.id) - temp_id = 0 - uncelebs_list = [] - for id, gr in enumerate(gr_id): - temp_id += gr_id[id][1] - # print(uncelebs[temp_id - 1], uncelebs[temp_id - 2], uncelebs[temp_id - 3]) - - uncelebs_list.append(uncelebs[temp_id - 1]) - if uncelebs[temp_id - 2][1]//500 == uncelebs[temp_id - 1][1]//500: - uncelebs_list.append(uncelebs[temp_id - 2]) - if uncelebs[temp_id - 3][1] // 500 == uncelebs[temp_id - 1][1]//500: - uncelebs_list.append(uncelebs[temp_id - 3]) - - for unceleb in uncelebs_list: - dtime = datetime.datetime.strptime(unceleb[5], '%Y-%m-%d %H:%M:%S.%f').strftime('%d.%m.%y %H:%M') - bot_message = bot.send_message(chat_id=message.chat.id, - text=f'\U0001F389 "{unceleb[4]}" \U0001F464 {unceleb[3]}' - f'(@{unceleb[2]})\n\U0001F522 {unceleb[1]} \U0001F550 {dtime}', - reply_markup=markup) - # print(unceleb[6]) - usersbase.temp_save_unceleb(chat_id=unceleb[0], - record_id=unceleb[6], - bot_message_id=bot_message.id) +def bot_uncongratulate(message: Message) -> None: + """" + Хендлер, который обрабатывает команду /unceleb по выводу последних непоздравленных пользователей. + :param Message message: /unceleb + :return: None + """ + moderator_ids = get_all_moderator_id() + + if message.chat.id in moderator_ids: + temp_cleaner() + + uncelebs = select_last_uncongratulate(moderator_id=message.chat.id) + gr_id = select_group_id(message.chat.id) + temp_id = 0 + uncelebs_list = [] + for id, gr in enumerate(gr_id): + temp_id += gr_id[id][1] + # print(uncelebs[temp_id - 1], uncelebs[temp_id - 2], uncelebs[temp_id - 3]) + + uncelebs_list.append(uncelebs[temp_id - 1]) + if uncelebs[temp_id - 2][1]//500 == uncelebs[temp_id - 1][1]//500: + uncelebs_list.append(uncelebs[temp_id - 2]) + if uncelebs[temp_id - 3][1] // 500 == uncelebs[temp_id - 1][1]//500: + uncelebs_list.append(uncelebs[temp_id - 3]) + + for unceleb in uncelebs_list: + dtime = datetime.datetime.strptime(unceleb[5], '%Y-%m-%d %H:%M:%S.%f').strftime('%d.%m.%y %H:%M') + bot_message = bot.send_message(chat_id=message.chat.id, + text=f'\U0001F389 "{unceleb[4]}" \U0001F464 {unceleb[3]}' + f'(@{unceleb[2]})\n\U0001F522 {unceleb[1]} \U0001F550 {dtime}', + reply_markup=unceleb_keyboard.congratulate_keyboard()) + # print(unceleb[6]) + temp_save_unceleb(chat_id=unceleb[0], + record_id=unceleb[6], + bot_message_id=bot_message.id) @bot.callback_query_handler(func=lambda call: call.data == "congr" or call.data == "uncongr") def callback(call): if call.message: if call.data == 'congr': - winner_chat_id = usersbase.get_chat_id_unceleb(bot_message_id=call.message.message_id) + winner_chat_id = get_chat_id_unceleb(bot_message_id=call.message.message_id) - winner = usersbase.is_winner_id_select_unceleb(bot_message_id=call.message.message_id) + winner = is_winner_id_select_unceleb(bot_message_id=call.message.message_id) # print(winner) - usersbase.is_winner_record(winner_id=winner) - remove_list = usersbase.buttons_remover_unceleb(chat_id=winner_chat_id) + is_winner_record(winner_id=winner) + remove_list = buttons_remover_unceleb(chat_id=winner_chat_id) for message in remove_list: bot.delete_message(chat_id=call.message.chat.id, message_id=message) - usersbase.storage_cleaner_unceleb(chat_id=call.message.chat.id) + storage_cleaner_unceleb(chat_id=call.message.chat.id) celeb_name = call.message.text.split() bot.send_message(call.message.chat.id, f'Поздравили {celeb_name[0]} {celeb_name[3]}!!!') else: bot.delete_message(chat_id=call.message.chat.id, message_id=call.message.message_id) - usersbase.record_cleaner_unceleb(bot_message_id=call.message.message_id) + record_cleaner_unceleb(bot_message_id=call.message.message_id) #bot.send_message(call.message.chat.id, 'Ничего не делали, так как не победитель') From 2e001cdd097678c04c49ac46103deca2aec2e1f9 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 20 Jul 2022 15:19:56 +0300 Subject: [PATCH 106/113] adde documentation and fixed some conflicts --- database/commands.py | 143 +++++++++++++++++++++++--------- handlers/last_uncongratulate.py | 103 +++++++++++++++-------- handlers/register_new_user.py | 10 ++- 3 files changed, 183 insertions(+), 73 deletions(-) diff --git a/database/commands.py b/database/commands.py index d3567a9..a40e5aa 100644 --- a/database/commands.py +++ b/database/commands.py @@ -110,7 +110,9 @@ def select_id_from_users(user_id: int) -> int: cursor = conn.cursor() cursor.execute(f"SELECT id FROM 'users' WHERE user_id={user_id}") record_id = cursor.fetchall() - return record_id[-1][0] + if record_id: + return record_id[-1][0] + return 0 def temp_save(chat_id: int, record_id: int, bot_message_id: int) -> None: @@ -284,7 +286,7 @@ def select_lucky(moderator_id: int): cursor = conn.cursor() cursor.execute(f"""SELECT chat_name, user_name, nickname, congr_number, dtime_connetion, is_winner, chat_id FROM 'users' JOIN 'groups_relation' - ON chat_id = group_id AND moderator_id = abs({moderator_id});""") + ON chat_id = group_id AND moderator_id ={moderator_id};""") result = cursor.fetchall() return result @@ -303,39 +305,87 @@ def select_lucky_id(idd: int): "Блок функций для поздравления последних непоздравленных пользователей" -def select_last_uncongratulate(moderator_id: int) -> list: +def get_group_id(moderator_id: int) -> List[int]: """ - Функция, которая по id группы модераторов возвращает chat_id, congr_number, nickname, user_name, chat_name, - dtime_connetion, id, is_winner. - :param int moderator_id: id группы модераторов - :return list: список информации о последних неподзравленных пользователях + Функция, которая возвращает список id групп пользователей из таблицы groups_relation по id группы модератора. + :param int moderator_id: уникальный id группы модератора + :return List[int]: список id групп пользователей """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - cursor.execute(f"""SELECT chat_id, congr_number, nickname, user_name, chat_name, dtime_connetion, id, is_winner - FROM 'users' JOIN 'groups_relation' - ON chat_id = group_id AND moderator_id = {moderator_id} AND is_winner = 0 - ORDER BY chat_id, congr_number;""") - result = cursor.fetchall() - return result + cursor.execute(f"SELECT DISTINCT group_id FROM 'groups_relation' WHERE moderator_id={moderator_id}") + group_id_list = cursor.fetchall() + result = [] + for group_id in group_id_list: + result.append(group_id[0]) + return result -def select_group_id(moderator_id: int): +def select_last_congr_number_from_users(chat_id: int) -> int: + """" + Функция которая по chat_id группы пользователя возвращает congr_number последней записи из таблицы 'users'. + :param int chat_id: уникальный id пользователя + :return int: congr_number последней записи + """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - cursor.execute(f"""SELECT chat_id, COUNT(*) - FROM 'users' JOIN 'groups_relation' - ON chat_id = group_id AND moderator_id = abs({moderator_id}) AND is_winner = 0 - GROUP BY chat_id;""") - result = cursor.fetchall() - return result + cursor.execute(f"SELECT congr_number FROM 'users' WHERE user_id={chat_id}") + record_id = cursor.fetchall() + if record_id: + return record_id[-1][0] + return 0 -def temp_save_unceleb( - chat_id: int, - record_id: int, - bot_message_id: int - ) -> None: +def is_uncongr(congr_number: int, chat_id: int) -> bool: + """" + Функция которая проверяет, есть ли в таблице users для данного chat_id группы и данного юбилейного номера, + непоздравленные пользователи. + :param int congr_number: юбилейный номер пользователя + :param int chat_id: уникальный id группы + :return bool: True если последние пользователи не поздравлены, False если последние пользователи поздравлены + """ + lucky_number = congr_number - congr_number % HAPPY_NUMBER + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(f'''SELECT is_winner + FROM 'users' WHERE chat_id={chat_id} AND + (congr_number BETWEEN {lucky_number} AND {lucky_number + 2})''') + winners_list = cursor.fetchall() + for winner in winners_list: + if winner[0] == 1: + return False + return True + + +def select_last_uncongratulate(congr_number: int, chat_id: int) -> list: + """" + Функция которая проверяет, есть ли в таблице users для данного chat_id группы и данного юбилейного номера, + непоздравленные пользователи. + :param int congr_number: юбилейный номер пользователя + :param int chat_id: уникальный id группы + :return list: информация о победителях + """ + lucky_number = congr_number - congr_number % HAPPY_NUMBER + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute(f'''SELECT chat_id, congr_number, nickname, user_name, chat_name, dtime_connetion, id + FROM 'users' WHERE chat_id={chat_id} AND + (congr_number BETWEEN {lucky_number} AND {lucky_number + 2})''') + winners_list = cursor.fetchall() + result = [] + for winner in winners_list: + result.append(winner) + return result + + +def temp_save_unceleb(chat_id: int, record_id: int, bot_message_id: int) -> None: + """ + Функция, которая записывает chat_id, record_id, bot_message_id в таблицу 'temp_unceleb'. + :param int chat_id: id группы пользователей + :param int record_id: id записи о пользователе + :param int bot_message_id: id сообщения бота + :return: None + """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(""" @@ -353,7 +403,12 @@ def temp_cleaner() -> None: cursor.execute(f'''DELETE FROM 'temp_unceleb';''') -def get_chat_id_unceleb(bot_message_id): +def get_chat_id_unceleb(bot_message_id) -> int: + """ + Функция, которая по bot_message_id сообщения бота возвращает id группы пользователя. + :param int bot_message_id: id сообщения бота + :return int: id группы пользователя + """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(f"SELECT chat_id FROM 'temp_unceleb' WHERE bot_message_id={bot_message_id}") @@ -361,9 +416,12 @@ def get_chat_id_unceleb(bot_message_id): return result[0][0] -def is_winner_id_select_unceleb( - bot_message_id: int, - ) -> None: +def is_winner_id_select_unceleb(bot_message_id: int) -> int: + """ + Функция, которая по bot_message_id сообщения бота возвращает id записи о пользователе. + :param int bot_message_id: id сообщения бота + :return int: id записи о пользователе + """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() result = cursor.execute(f'''SELECT id FROM users Join temp_unceleb ON id=record_id @@ -371,32 +429,43 @@ def is_winner_id_select_unceleb( id = [] for i in result: id.append(i) - return id[0][0] -def buttons_remover_unceleb( - chat_id: int, - ) -> None: +def buttons_remover_unceleb(chat_id: int) -> List[int]: + """ + Функция, которая по chat_id группы пользователя возвращает список bot_message_id сообщений бота из + таблицы 'temp_unceleb'. + :param int chat_id: id группы пользователя + :return List[int]: список bot_message_id сообщений бота + """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(f"SELECT bot_message_id FROM 'temp_unceleb' WHERE chat_id={chat_id}") result = cursor.fetchall() delete_list = [] for i in result: - delete_list.extend(i) + delete_list.append(i) return delete_list -def storage_cleaner_unceleb( - chat_id: int, - ) -> None: +def storage_cleaner_unceleb(chat_id: int) -> None: + """ + Функция, которая по chat_id группы пользователя очищает таблицу 'temp_unceleb'. + :param int chat_id: id группы пользователя + :return: None + """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(f'''DELETE FROM 'temp_unceleb' WHERE chat_id={chat_id};''') def record_cleaner_unceleb(bot_message_id: int) -> None: + """ + Функция, которая по bot_message_id сообщения бота очищает запись в таблице 'temp_unceleb'. + :param int bot_message_id: id сообщения бота + :return: None + """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(f'''DELETE FROM 'temp_unceleb' WHERE bot_message_id={bot_message_id};''') diff --git a/handlers/last_uncongratulate.py b/handlers/last_uncongratulate.py index 477f4cd..d593504 100644 --- a/handlers/last_uncongratulate.py +++ b/handlers/last_uncongratulate.py @@ -2,9 +2,11 @@ from loader import bot from database.commands import temp_cleaner, select_last_uncongratulate, get_all_moderator_id, select_group_id, \ temp_save_unceleb, get_chat_id_unceleb, is_winner_id_select_unceleb, is_winner_record, buttons_remover_unceleb, \ - storage_cleaner_unceleb, record_cleaner_unceleb + storage_cleaner_unceleb, record_cleaner_unceleb, data_finder, get_group_id, select_last_congr_number_from_users,\ + is_uncongr import datetime from keyboards.inline import unceleb_keyboard +from config_data.config import HAPPY_NUMBER @bot.message_handler(commands=['unceleb']) @@ -17,50 +19,83 @@ def bot_uncongratulate(message: Message) -> None: moderator_ids = get_all_moderator_id() if message.chat.id in moderator_ids: + # чистим таблицу temp_unceleb temp_cleaner() - uncelebs = select_last_uncongratulate(moderator_id=message.chat.id) - gr_id = select_group_id(message.chat.id) - temp_id = 0 + # получаем id всех групп пользователей для этой группы модераторов + group_id_list = get_group_id(moderator_id=message.chat.id) + + # получаем список всех последних непоздравленных пользователей uncelebs_list = [] - for id, gr in enumerate(gr_id): - temp_id += gr_id[id][1] - # print(uncelebs[temp_id - 1], uncelebs[temp_id - 2], uncelebs[temp_id - 3]) - uncelebs_list.append(uncelebs[temp_id - 1]) - if uncelebs[temp_id - 2][1]//500 == uncelebs[temp_id - 1][1]//500: - uncelebs_list.append(uncelebs[temp_id - 2]) - if uncelebs[temp_id - 3][1] // 500 == uncelebs[temp_id - 1][1]//500: - uncelebs_list.append(uncelebs[temp_id - 3]) + # для каждой группы пользователей находим номер последнего зарегистрированного пользователя + for group_id in group_id_list: + last_congr_number = select_last_congr_number_from_users(chat_id=group_id) + + # если в группе зарегистрированы пользователи, проверяем есть ли победитель для последнего юбилейного номера + if last_congr_number: + if is_uncongr(congr_number=last_congr_number, chat_id=group_id): + # если победителя нет, то мы добавляем всех последних непоздравленных пользователей для этой + # группы в общий список последних непоздравленных пользователей + last_uncong_users = select_last_uncongratulate(congr_number=last_congr_number, chat_id=group_id) + for user in last_uncong_users: + uncelebs_list.append(user) + + # выводим информацию о последних непоздравленных пользователях, предлагаем их поздравить и + # сохраняем данные в таблицу temp_unceleb for unceleb in uncelebs_list: dtime = datetime.datetime.strptime(unceleb[5], '%Y-%m-%d %H:%M:%S.%f').strftime('%d.%m.%y %H:%M') + bot_message = bot.send_message(chat_id=message.chat.id, - text=f'\U0001F389 "{unceleb[4]}" \U0001F464 {unceleb[3]}' - f'(@{unceleb[2]})\n\U0001F522 {unceleb[1]} \U0001F550 {dtime}', - reply_markup=unceleb_keyboard.congratulate_keyboard()) - # print(unceleb[6]) + text=f'\U0001F389 "{unceleb[4]}" \U0001F464 {unceleb[3]} ' + f'(@{unceleb[2]})\n\U0001F522 {unceleb[1]} \U0001F550 {dtime}', + reply_markup=unceleb_keyboard.congratulate_keyboard()) + temp_save_unceleb(chat_id=unceleb[0], record_id=unceleb[6], bot_message_id=bot_message.id) @bot.callback_query_handler(func=lambda call: call.data == "congr" or call.data == "uncongr") -def callback(call): - if call.message: - if call.data == 'congr': - winner_chat_id = get_chat_id_unceleb(bot_message_id=call.message.message_id) - - winner = is_winner_id_select_unceleb(bot_message_id=call.message.message_id) - # print(winner) - is_winner_record(winner_id=winner) - remove_list = buttons_remover_unceleb(chat_id=winner_chat_id) - for message in remove_list: - bot.delete_message(chat_id=call.message.chat.id, message_id=message) - storage_cleaner_unceleb(chat_id=call.message.chat.id) - celeb_name = call.message.text.split() - bot.send_message(call.message.chat.id, f'Поздравили {celeb_name[0]} {celeb_name[3]}!!!') - else: - bot.delete_message(chat_id=call.message.chat.id, message_id=call.message.message_id) - record_cleaner_unceleb(bot_message_id=call.message.message_id) - #bot.send_message(call.message.chat.id, 'Ничего не делали, так как не победитель') +def callback(call: CallbackQuery) -> None: + """ + Колбек, обрабатывайщий нажатие кнопки Поздравить или Отклонить в команде /unceleb. + :param CallbackQuery call: congr or uncongr + :return: None + """ + name = data_finder(bot_message_id=call.message.message_id)[0] + congr_number = data_finder(bot_message_id=call.message.message_id)[1] + users_chat = data_finder(bot_message_id=call.message.message_id)[2] + moders_chat = call.message.chat.id + + if call.data == 'congr': + winner_chat_id = get_chat_id_unceleb(bot_message_id=call.message.message_id) + winner_id = is_winner_id_select_unceleb(bot_message_id=call.message.message_id) + + # записываем, что пользователь выиграл + is_winner_record(winner_id=winner_id) + + # удаляем все остальные сообщения бота и чистим информацию о сообщениях в базе данных таблицы temp_storage + remove_list = buttons_remover_unceleb(chat_id=winner_chat_id) + for message in remove_list: + bot.delete_message(chat_id=call.message.chat.id, message_id=message) + storage_cleaner_unceleb(chat_id=call.message.chat.id) + + # поздравляем победителя в группе пользователей + bot.send_message(chat_id=users_chat, + text=f'\U0001F389 Поздравляю, {name}, как же удачно попали в нужное время!\n' + f'Вы участник {congr_number - congr_number % HAPPY_NUMBER} ' + f'коммьюнити.\nВас ждут плюшки и печенюшки! \U0001F389') + + # уведомляем группу модераторов о поздравлении победителя + bot.send_message(chat_id=moders_chat, + text=f'Участник {name} поздравлен! \U0001F389') + + else: + # удаляем сообщение бота и чистим информацию о сообщении в базе данных таблицы temp_unceleb + bot.delete_message(chat_id=call.message.chat.id, message_id=call.message.message_id) + record_cleaner_unceleb(bot_message_id=call.message.message_id) + + # уведомляем группу модераторов о том, что участника не поздравили + bot.send_message(moders_chat, f'Участника {name} не поздравили.') diff --git a/handlers/register_new_user.py b/handlers/register_new_user.py index 657db2b..adbfc1c 100644 --- a/handlers/register_new_user.py +++ b/handlers/register_new_user.py @@ -68,23 +68,29 @@ def callback(call: CallbackQuery) -> None: moders_chat = call.message.chat.id if call.data == 'grac': + # записываем, что пользователь выиграл is_winner_record(winner_id=winner_id) - remove_list = buttons_remover(chat_id=users_chat) + # удаляем все остальные сообщения бота и чистим информацию о сообщениях в базе данных таблицы temp_storage + remove_list = buttons_remover(chat_id=users_chat) for message in remove_list: bot.delete_message(chat_id=moders_chat, message_id=message) - storage_cleaner(chat_id=users_chat) + # поздравляем победителя в группе пользователей bot.send_message(chat_id=users_chat, text=f'\U0001F389 Поздравляю, {name}, как же удачно попали в нужное время!\n' f'Вы участник {congr_number - congr_number % HAPPY_NUMBER} ' f'коммьюнити.\nВас ждут плюшки и печенюшки! \U0001F389') + # уведомляем группу модераторов о поздравлении победителя bot.send_message(chat_id=moders_chat, text=f'Участник {name} поздравлен! \U0001F389') else: + # удаляем сообщение бота и чистим информацию о сообщении в базе данных таблицы temp_storage bot.delete_message(chat_id=moders_chat, message_id=call.message.message_id) storage_cleaner_lite(bot_message_id=call.message.message_id) + + # уведомляем группу модераторов о том, что участника не поздравили bot.send_message(moders_chat, f'Участника {name} не поздравили.') From 744c36ddad76a31fd0719f193de6587668454948 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 20 Jul 2022 15:28:22 +0300 Subject: [PATCH 107/113] adde documentation and fixed some conflicts --- database/commands.py | 27 +++++++++---------------- handlers/last_uncongratulate.py | 2 +- handlers/lucky_list.py | 36 ++++++++++++++++++++------------- 3 files changed, 32 insertions(+), 33 deletions(-) diff --git a/database/commands.py b/database/commands.py index a40e5aa..7c3d5aa 100644 --- a/database/commands.py +++ b/database/commands.py @@ -277,12 +277,17 @@ def get_all_moderator_id() -> List[int]: return result -"блок функций для вывода всех кто в юбилейном списке" +"блок функций для вывода всех кто в юбилейном списке и для поздравления последних непоздравленных пользователей" -def select_lucky(moderator_id: int): - - with sqlite3.connect(( DB )) as conn: +def select_lucky(moderator_id: int) -> list: + """ + Функция, которая возвращает chat_name, user_name, nickname, congr_number, dtime_connetion, is_winner, chat_id + из таблицы users по id группы модератора. + :param int moderator_id: уникальный id группы модератора + :return list: список информации обо всех зафиксированных пользователях + """ + with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(f"""SELECT chat_name, user_name, nickname, congr_number, dtime_connetion, is_winner, chat_id FROM 'users' JOIN 'groups_relation' @@ -291,20 +296,6 @@ def select_lucky(moderator_id: int): return result -def select_lucky_id(idd: int): - - with sqlite3.connect(( DB )) as conn: - cursor = conn.cursor() - cursor.execute(f"""SELECT * - FROM 'users' - WHERE chat_id = {idd};""") - result = cursor.fetchall() - return result - - -"Блок функций для поздравления последних непоздравленных пользователей" - - def get_group_id(moderator_id: int) -> List[int]: """ Функция, которая возвращает список id групп пользователей из таблицы groups_relation по id группы модератора. diff --git a/handlers/last_uncongratulate.py b/handlers/last_uncongratulate.py index d593504..3298852 100644 --- a/handlers/last_uncongratulate.py +++ b/handlers/last_uncongratulate.py @@ -1,6 +1,6 @@ from telebot.types import Message, CallbackQuery from loader import bot -from database.commands import temp_cleaner, select_last_uncongratulate, get_all_moderator_id, select_group_id, \ +from database.commands import temp_cleaner, select_last_uncongratulate, get_all_moderator_id, \ temp_save_unceleb, get_chat_id_unceleb, is_winner_id_select_unceleb, is_winner_record, buttons_remover_unceleb, \ storage_cleaner_unceleb, record_cleaner_unceleb, data_finder, get_group_id, select_last_congr_number_from_users,\ is_uncongr diff --git a/handlers/lucky_list.py b/handlers/lucky_list.py index 01a2d13..c9f17a1 100644 --- a/handlers/lucky_list.py +++ b/handlers/lucky_list.py @@ -1,20 +1,28 @@ from telebot.types import Message from loader import bot -import database.commands as usersbase +from database.commands import get_all_moderator_id, select_lucky import datetime @bot.message_handler(commands=['luckylist']) -def bot_lucky_list(message: Message): - # usersbase.MODERATOR_ID = message.chat.id - winners = usersbase.select_lucky(message.chat.id) - # print(message.chat.id) - # print(winners) - for winner in winners: - dtime = datetime.datetime.strptime(winner[4], '%Y-%m-%d %H:%M:%S.%f').strftime('%d.%m.%y %H:%M') - if winner[5] == 1: - bot.send_message(chat_id=message.chat.id, text=f'\U0001F451\U0001F451\U0001F451 ★★★ "{winner[0]}" \U0001F464 {winner[1]}' - f'(@{winner[2]})\n\U0001F522 {winner[3]} \U0001F550 {dtime}') - else: - bot.send_message(chat_id=message.chat.id, text=f'\U0001F389 "{winner[0]}" \U0001F464 {winner[1]} ' - f'(@{winner[2]})\n\U0001F522 {winner[3]} \U0001F550 {dtime}') +def bot_lucky_list(message: Message) -> None: + """" + Хендлер, который обрабатывает команду /luckylist по выводу всех зарегитрированных юбилейных пользователей. + :param Message message: /luckylist + :return: None + """ + moderator_ids = get_all_moderator_id() + + if message.chat.id in moderator_ids: + winners = select_lucky(moderator_id=message.chat.id) + + for winner in winners: + dtime = datetime.datetime.strptime(winner[4], '%Y-%m-%d %H:%M:%S.%f').strftime('%d.%m.%y %H:%M') + if winner[5] == 1: + bot.send_message(chat_id=message.chat.id, + text=f'\U0001F451\U0001F451\U0001F451 "{winner[0]}" \U0001F464 {winner[1]} ' + f'(@{winner[2]})\n\U0001F522 {winner[3]} \U0001F550 {dtime}') + else: + bot.send_message(chat_id=message.chat.id, + text=f'\U0001F389 "{winner[0]}" \U0001F464 {winner[1]} ' + f'(@{winner[2]})\n\U0001F522 {winner[3]} \U0001F550 {dtime}') From d019da44b955e5a8af70352d713e918e0d0ded03 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 20 Jul 2022 15:31:50 +0300 Subject: [PATCH 108/113] adde documentation --- README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f4a445d..848b41a 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ 1. Если у вас еще нет telegram-бота, создайте его с помощью @BotFather бота и сохраните token от вашего бота. 2. Добавьте вашего бота во все telegram-чаты, где вы хотите, чтобы он отслеживал юбилейных участников. 3. Определите пользователей, которые будут обладать правами администратора, и узнайте их user_id с помощью @username_to_id_bot бота. +4. По умолчанию, юбилейным номером считается число 500. Вы можете изменить эти настройки в файле `config_data/config.py` поменяв значение `HAPPY_NUMBER`. Приложение можно запустить локально либо через контейнер docker. @@ -164,10 +165,15 @@ * chat_id (INTEGER) - уникальный id группы пользователей, в которую вступил юбилейный пользователь * record_id (INTEGER) - id записи о данном юбилейном пользователе из таблицы 'users' * bot_message_id (INTEGER) - уникальный id сообщения бота о юбилейном пользователе с кнопкой "Поздравить" + * таблица 'temp_unceleb' (хранение информации о последних непоздравленных пользователях): + * unceleb_id (INTEGER) - первичный ключ + * chat_id (INTEGER) - уникальный id группы пользователей, в которую вступил юбилейный пользователь + * record_id (INTEGER) - id записи о данном юбилейном пользователе из таблицы 'users' + * bot_message_id (INTEGER) - уникальный id сообщения бота о юбилейном пользователе с кнопкой "Поздравить" * связь таблиц 'users' и 'groups_relation': - * 'users'.chat_id = 'groups_relation' - * связь таблиц 'users' и 'temp_storage': - * 'users'.id = 'temp_storage'.record_id + * 'users'.chat_id = 'groups_relation'.group_id + * связь таблиц 'users' и 'temp_storage'/'temp_unceleb': + * 'users'.id = 'temp_storage'.record_id/'temp_unceleb'.record_id From 656e985ce56c7cac11ff492f7002df3894cfb995 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 20 Jul 2022 18:03:40 +0300 Subject: [PATCH 109/113] added message in case of empty lists --- handlers/last_uncongratulate.py | 24 ++++++++++++++---------- handlers/lucky_list.py | 24 ++++++++++++++---------- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/handlers/last_uncongratulate.py b/handlers/last_uncongratulate.py index 3298852..4bfb251 100644 --- a/handlers/last_uncongratulate.py +++ b/handlers/last_uncongratulate.py @@ -44,17 +44,21 @@ def bot_uncongratulate(message: Message) -> None: # выводим информацию о последних непоздравленных пользователях, предлагаем их поздравить и # сохраняем данные в таблицу temp_unceleb - for unceleb in uncelebs_list: - dtime = datetime.datetime.strptime(unceleb[5], '%Y-%m-%d %H:%M:%S.%f').strftime('%d.%m.%y %H:%M') + if uncelebs_list: + for unceleb in uncelebs_list: + dtime = datetime.datetime.strptime(unceleb[5], '%Y-%m-%d %H:%M:%S.%f').strftime('%d.%m.%y %H:%M') - bot_message = bot.send_message(chat_id=message.chat.id, - text=f'\U0001F389 "{unceleb[4]}" \U0001F464 {unceleb[3]} ' - f'(@{unceleb[2]})\n\U0001F522 {unceleb[1]} \U0001F550 {dtime}', - reply_markup=unceleb_keyboard.congratulate_keyboard()) + bot_message = bot.send_message(chat_id=message.chat.id, + text=f'\U0001F389 "{unceleb[4]}" \U0001F464 {unceleb[3]} ' + f'(@{unceleb[2]})\n\U0001F522 {unceleb[1]} \U0001F550 {dtime}', + reply_markup=unceleb_keyboard.congratulate_keyboard()) - temp_save_unceleb(chat_id=unceleb[0], - record_id=unceleb[6], - bot_message_id=bot_message.id) + temp_save_unceleb(chat_id=unceleb[0], + record_id=unceleb[6], + bot_message_id=bot_message.id) + + else: + bot.send_message(chat_id=message.chat.id, text=f'В списке последних неподзравленных никого нет!') @bot.callback_query_handler(func=lambda call: call.data == "congr" or call.data == "uncongr") @@ -98,4 +102,4 @@ def callback(call: CallbackQuery) -> None: record_cleaner_unceleb(bot_message_id=call.message.message_id) # уведомляем группу модераторов о том, что участника не поздравили - bot.send_message(moders_chat, f'Участника {name} не поздравили.') + bot.send_message(chat_id=moders_chat, text=f'Участника {name} не поздравили.') diff --git a/handlers/lucky_list.py b/handlers/lucky_list.py index c9f17a1..8b9183e 100644 --- a/handlers/lucky_list.py +++ b/handlers/lucky_list.py @@ -16,13 +16,17 @@ def bot_lucky_list(message: Message) -> None: if message.chat.id in moderator_ids: winners = select_lucky(moderator_id=message.chat.id) - for winner in winners: - dtime = datetime.datetime.strptime(winner[4], '%Y-%m-%d %H:%M:%S.%f').strftime('%d.%m.%y %H:%M') - if winner[5] == 1: - bot.send_message(chat_id=message.chat.id, - text=f'\U0001F451\U0001F451\U0001F451 "{winner[0]}" \U0001F464 {winner[1]} ' - f'(@{winner[2]})\n\U0001F522 {winner[3]} \U0001F550 {dtime}') - else: - bot.send_message(chat_id=message.chat.id, - text=f'\U0001F389 "{winner[0]}" \U0001F464 {winner[1]} ' - f'(@{winner[2]})\n\U0001F522 {winner[3]} \U0001F550 {dtime}') + if winners: + for winner in winners: + dtime = datetime.datetime.strptime(winner[4], '%Y-%m-%d %H:%M:%S.%f').strftime('%d.%m.%y %H:%M') + if winner[5] == 1: + bot.send_message(chat_id=message.chat.id, + text=f'\U0001F451\U0001F451\U0001F451 "{winner[0]}" \U0001F464 {winner[1]} ' + f'(@{winner[2]})\n\U0001F522 {winner[3]} \U0001F550 {dtime}') + else: + bot.send_message(chat_id=message.chat.id, + text=f'\U0001F389 "{winner[0]}" \U0001F464 {winner[1]} ' + f'(@{winner[2]})\n\U0001F522 {winner[3]} \U0001F550 {dtime}') + + else: + bot.send_message(chat_id=message.chat.id, text=f'В списке юбилейных пользователей никого нет!') From b0d358069680741ca2125affe5a204579fe292ce Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 20 Jul 2022 18:10:15 +0300 Subject: [PATCH 110/113] fixed get_all_moderator_id --- handlers/default_heandlers/help.py | 4 ++-- handlers/default_heandlers/start.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/handlers/default_heandlers/help.py b/handlers/default_heandlers/help.py index fcb303f..e71383b 100644 --- a/handlers/default_heandlers/help.py +++ b/handlers/default_heandlers/help.py @@ -1,7 +1,7 @@ from telebot.types import Message from config_data.config import DEFAULT_COMMANDS from loader import bot -from database.commands import get_moderator_id +from database.commands import get_all_moderator_id @bot.message_handler(commands=['help']) @@ -11,7 +11,7 @@ def bot_help(message: Message): :param Message message: /help :return: None """ - moderator_ids = get_moderator_id() + moderator_ids = get_all_moderator_id() if message.chat.id in moderator_ids: text = [f'/{command} - {desk}' for command, desk in DEFAULT_COMMANDS] diff --git a/handlers/default_heandlers/start.py b/handlers/default_heandlers/start.py index 4741dba..5fbec05 100644 --- a/handlers/default_heandlers/start.py +++ b/handlers/default_heandlers/start.py @@ -1,7 +1,7 @@ from telebot.types import Message from loader import bot from config_data.config import ADMIN_IDS -from database.commands import get_moderator_id +from database.commands import get_all_moderator_id @bot.message_handler(commands=['start']) @@ -11,7 +11,7 @@ def bot_start(message: Message): :param Message message: /start :return: None """ - moderator_ids = get_moderator_id() + moderator_ids = get_all_moderator_id() if (message.chat.id in moderator_ids) or (str(message.from_user.id) in ADMIN_IDS): bot.send_message(chat_id=message.chat.id, From 23de8f6bde09f1f3009e266a7b7295249c75c945 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 20 Jul 2022 19:50:27 +0300 Subject: [PATCH 111/113] fixed get_all_moderator_id --- database/commands.py | 12 +++++++----- handlers/last_uncongratulate.py | 7 ++++--- handlers/register_new_user.py | 9 +++++---- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/database/commands.py b/database/commands.py index 7c3d5aa..f10ad7f 100644 --- a/database/commands.py +++ b/database/commands.py @@ -184,11 +184,13 @@ def buttons_remover(chat_id: int) -> List[int]: with sqlite3.connect((DB)) as conn: cursor = conn.cursor() cursor.execute(f"SELECT bot_message_id FROM 'temp_storage' WHERE chat_id={chat_id}") - result = cursor.fetchall() - delete_list = [] - for i in result: - delete_list.append(i) - return delete_list + message_id_list = cursor.fetchall() + result = [] + print(message_id_list) + for message_id in message_id_list: + print(message_id, message_id[0]) + result.append(message_id[0]) + return result def storage_cleaner(chat_id: int) -> None: diff --git a/handlers/last_uncongratulate.py b/handlers/last_uncongratulate.py index 4bfb251..8e1a77f 100644 --- a/handlers/last_uncongratulate.py +++ b/handlers/last_uncongratulate.py @@ -68,9 +68,10 @@ def callback(call: CallbackQuery) -> None: :param CallbackQuery call: congr or uncongr :return: None """ - name = data_finder(bot_message_id=call.message.message_id)[0] - congr_number = data_finder(bot_message_id=call.message.message_id)[1] - users_chat = data_finder(bot_message_id=call.message.message_id)[2] + user_data = data_finder(bot_message_id=call.message.message_id)[0] + name = user_data[0] + congr_number = user_data[1] + users_chat = user_data[2] moders_chat = call.message.chat.id if call.data == 'congr': diff --git a/handlers/register_new_user.py b/handlers/register_new_user.py index adbfc1c..bdce1b2 100644 --- a/handlers/register_new_user.py +++ b/handlers/register_new_user.py @@ -24,7 +24,7 @@ def handler_new_member(message: Message) -> None: chat_name = message.chat.title nickname = message.from_user.username user_name = message.from_user.first_name - dtime = datetime.datetime.now().replace(microsecond=0, tzinfo=None) + dtime = datetime.datetime.now() # проверка на то, что новый пользователь не является ботом, еще не был победителем, # а также имеет юбилейный номер вступления @@ -62,9 +62,10 @@ def callback(call: CallbackQuery) -> None: :return: None """ winner_id = is_winner_id_select(bot_message_id=call.message.message_id) - name = data_finder(bot_message_id=call.message.message_id)[0] - congr_number = data_finder(bot_message_id=call.message.message_id)[1] - users_chat = data_finder(bot_message_id=call.message.message_id)[2] + user_data = data_finder(bot_message_id=call.message.message_id)[0] + name = user_data[0] + congr_number = user_data[1] + users_chat = user_data[2] moders_chat = call.message.chat.id if call.data == 'grac': From ea41499ae498d056bec67819ce205efc48980047 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Wed, 20 Jul 2022 20:26:34 +0300 Subject: [PATCH 112/113] fixed multiple issues --- database/commands.py | 31 +++++++++++++++++++++++++++---- database/database.db | Bin 32768 -> 32768 bytes handlers/last_uncongratulate.py | 8 ++++---- handlers/register_new_user.py | 2 +- main.py | 5 +++++ 5 files changed, 37 insertions(+), 9 deletions(-) diff --git a/database/commands.py b/database/commands.py index f10ad7f..40e36c1 100644 --- a/database/commands.py +++ b/database/commands.py @@ -8,6 +8,14 @@ DB = os.path.join(ROOT_DIR, 'database.db') +def cleaner(): + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + cursor.execute('''DELETE from users''') + cursor.execute('''DELETE from temp_storage''') + cursor.execute('''DELETE from temp_unceleb''') + + """"Блок функций для регистрации и обработки нового юбилейного пользователя""" @@ -150,7 +158,7 @@ def data_finder(bot_message_id: int) -> list: """" Функция которая по bot_message_id сообщения бота возвращает user_name, congr_number, chat_id из таблицы 'users'. :param int bot_message_id: уникальный id сообщения бота - :return list: информация о победите + :return list: информация о победителе """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() @@ -186,9 +194,7 @@ def buttons_remover(chat_id: int) -> List[int]: cursor.execute(f"SELECT bot_message_id FROM 'temp_storage' WHERE chat_id={chat_id}") message_id_list = cursor.fetchall() result = [] - print(message_id_list) for message_id in message_id_list: - print(message_id, message_id[0]) result.append(message_id[0]) return result @@ -322,13 +328,30 @@ def select_last_congr_number_from_users(chat_id: int) -> int: """ with sqlite3.connect((DB)) as conn: cursor = conn.cursor() - cursor.execute(f"SELECT congr_number FROM 'users' WHERE user_id={chat_id}") + cursor.execute(f"SELECT congr_number FROM 'users' WHERE chat_id={chat_id}") record_id = cursor.fetchall() if record_id: return record_id[-1][0] return 0 +def data_finder_unceleb(bot_message_id: int) -> list: + """" + Функция которая по bot_message_id сообщения бота возвращает user_name, congr_number, chat_id из таблицы 'users'. + :param int bot_message_id: уникальный id сообщения бота + :return list: информация о победителе + """ + with sqlite3.connect((DB)) as conn: + cursor = conn.cursor() + result = cursor.execute(f'''SELECT users.user_name, users.congr_number, users.chat_id FROM users + Join temp_unceleb ON users.id=temp_unceleb.record_id + WHERE temp_unceleb.bot_message_id={bot_message_id};''') + data = [] + for i in result: + data.append(i) + return data + + def is_uncongr(congr_number: int, chat_id: int) -> bool: """" Функция которая проверяет, есть ли в таблице users для данного chat_id группы и данного юбилейного номера, diff --git a/database/database.db b/database/database.db index fcace5a8234918a50ea6961840a9393004cccc9e..37d590ef81e388d0fd7e11716b50dc0a773aeb6c 100644 GIT binary patch delta 571 zcmZo@U}|V!njp=1a-xhg>q!PZ|JscybNRU$fIxtOfqx@^;$$8H85XW*T=O>T2o!PE zy9seIs7kY_8#A(S=HwS=mzLz0CFbQA`X!bm=42+ORA+TvSaf0Q#m0+G3Ktu-jf@P8 zjC2jmb&U)Z3@xn;jIB(~S?|SJ%ex7}&EX)y96^{thE@hfV1qX6NgJ`$`}s;h%yVR9 zA;mn9aYhDK24+^KCVFNDW(Fn@Q~i8p;pP$HPel}u0u3}W1|mIkOH%_&6RW<-gd4W$jkiFZy%|umkz5 z5dMF$qn3B`KxTrY^dtYH%{&g*_%(ohIR+L+CXjwnhBhFVAH)S2F3YeVuKv?zu7DT( Od^{?w2-%a15)=Rocc~lz delta 377 zcmZo@U}|V!njp>CFj2;twShs;zh+~~Tz+oeO$-9udQ808yq_lX2*|K-2XhB+))6S; znmA#?W<6;mmdSGR!qQ)ubDUVX7-U76l^vOwIMa$!Q&K8T%|P^IS7{9|#xKmbU6{ET z#O1*XIFj;Yw*!Xua@E_p+#Q%!_(PjaIP5fRg46KX{FZClUj#V=-Fz~Q4K{)JeEDVfH zOw74#EG!J1Ow2iK%wYO94--%aR1w1~UZ5TZ0R{&CXZ+7L^Eh1N*U04(UJVqJVqjtf q>gEz&59IKIIXS$->p<$kZuqj9E8qn`pYRnfX;z3VoABjD2?_uh&|vid diff --git a/handlers/last_uncongratulate.py b/handlers/last_uncongratulate.py index 8e1a77f..ec412df 100644 --- a/handlers/last_uncongratulate.py +++ b/handlers/last_uncongratulate.py @@ -2,8 +2,8 @@ from loader import bot from database.commands import temp_cleaner, select_last_uncongratulate, get_all_moderator_id, \ temp_save_unceleb, get_chat_id_unceleb, is_winner_id_select_unceleb, is_winner_record, buttons_remover_unceleb, \ - storage_cleaner_unceleb, record_cleaner_unceleb, data_finder, get_group_id, select_last_congr_number_from_users,\ - is_uncongr + storage_cleaner_unceleb, record_cleaner_unceleb, data_finder_unceleb, get_group_id, \ + select_last_congr_number_from_users, is_uncongr import datetime from keyboards.inline import unceleb_keyboard from config_data.config import HAPPY_NUMBER @@ -58,7 +58,7 @@ def bot_uncongratulate(message: Message) -> None: bot_message_id=bot_message.id) else: - bot.send_message(chat_id=message.chat.id, text=f'В списке последних неподзравленных никого нет!') + bot.send_message(chat_id=message.chat.id, text=f'В списке последних непоздравленных никого нет!') @bot.callback_query_handler(func=lambda call: call.data == "congr" or call.data == "uncongr") @@ -68,7 +68,7 @@ def callback(call: CallbackQuery) -> None: :param CallbackQuery call: congr or uncongr :return: None """ - user_data = data_finder(bot_message_id=call.message.message_id)[0] + user_data = data_finder_unceleb(bot_message_id=call.message.message_id)[0] name = user_data[0] congr_number = user_data[1] users_chat = user_data[2] diff --git a/handlers/register_new_user.py b/handlers/register_new_user.py index bdce1b2..77dabed 100644 --- a/handlers/register_new_user.py +++ b/handlers/register_new_user.py @@ -49,7 +49,7 @@ def handler_new_member(message: Message) -> None: f'вступления: {dtime}', reply_markup=new_user_keyboard.congratulate_keyboard()) - temp_save(chat_id=moderator_id, + temp_save(chat_id=message.chat.id, record_id=select_id_from_users(user_id=message.from_user.id), bot_message_id=bot_message.id) diff --git a/main.py b/main.py index 7cd48ce..8c47967 100644 --- a/main.py +++ b/main.py @@ -2,7 +2,12 @@ import handlers from utils.set_bot_commands import set_default_commands +from database.commands import cleaner + if __name__ == '__main__': + + cleaner() + set_default_commands(bot) bot.infinity_polling() # ТЗ: Используйте LongPolling вариант работы с серверами телеграм From bb788bed0c94cfbdf8e38d41a96e52e4a70a7ad1 Mon Sep 17 00:00:00 2001 From: Natalia Loskutova Date: Thu, 21 Jul 2022 12:23:49 +0300 Subject: [PATCH 113/113] fixed multiple issues and prepaired everything for finall pull request --- config_data/config.py | 2 +- database/commands.py | 8 -------- database/database.db | Bin 32768 -> 32768 bytes handlers/admin.py | 2 +- handlers/default_heandlers/help.py | 3 ++- handlers/default_heandlers/start.py | 3 ++- handlers/last_uncongratulate.py | 3 ++- handlers/lucky_list.py | 1 + handlers/register_new_user.py | 3 ++- main.py | 5 ----- 10 files changed, 11 insertions(+), 19 deletions(-) diff --git a/config_data/config.py b/config_data/config.py index 5aa66ca..6220f0a 100644 --- a/config_data/config.py +++ b/config_data/config.py @@ -8,7 +8,7 @@ BOT_TOKEN = os.getenv('BOT_TOKEN') ADMIN_IDS = os.getenv('ADMIN_IDS') -HAPPY_NUMBER = 5 +HAPPY_NUMBER = 500 DEFAULT_COMMANDS = ( ('start', "Запустить бота"), diff --git a/database/commands.py b/database/commands.py index 40e36c1..fc6a14e 100644 --- a/database/commands.py +++ b/database/commands.py @@ -8,14 +8,6 @@ DB = os.path.join(ROOT_DIR, 'database.db') -def cleaner(): - with sqlite3.connect((DB)) as conn: - cursor = conn.cursor() - cursor.execute('''DELETE from users''') - cursor.execute('''DELETE from temp_storage''') - cursor.execute('''DELETE from temp_unceleb''') - - """"Блок функций для регистрации и обработки нового юбилейного пользователя""" diff --git a/database/database.db b/database/database.db index 37d590ef81e388d0fd7e11716b50dc0a773aeb6c..18814730c7843714c8482b22de4d263b2ee79571 100644 GIT binary patch delta 112 zcmZo@U}|V!njp=1WulBTlzs<7#dj_T3VSH=ouQAm>3$cUVb7JzDZ#ZKjY%bd-Zi0BrDHwYf*p!0G?hVn*aa+ delta 97 zcmZo@U}|V!njp=1a-xhg None: """ Функция, которая выводит текущие настройки админки с группировкой по id группы модератора. Команда доступна только - в чатах модераторов, которые настроены командой /adminsetup. + в чатах модераторов, которые настроены командой /adminsetup и пользователям с правами администратора. :param Message message: /adminshow :return: None """ diff --git a/handlers/default_heandlers/help.py b/handlers/default_heandlers/help.py index e71383b..8b2cdd0 100644 --- a/handlers/default_heandlers/help.py +++ b/handlers/default_heandlers/help.py @@ -7,7 +7,8 @@ @bot.message_handler(commands=['help']) def bot_help(message: Message): """ - Хендлер, который выводит все доступные боту команды при команде /help. + Хендлер, который выводит все доступные боту команды при команде /help. Команда доступна только в чатах модераторов, + которые настроены командой /adminsetup. :param Message message: /help :return: None """ diff --git a/handlers/default_heandlers/start.py b/handlers/default_heandlers/start.py index 5fbec05..3a7d9a2 100644 --- a/handlers/default_heandlers/start.py +++ b/handlers/default_heandlers/start.py @@ -7,7 +7,8 @@ @bot.message_handler(commands=['start']) def bot_start(message: Message): """ - Хендлер, который приветствует пользователя и подсказывает, что делать при команде /start. + Хендлер, который приветствует пользователя и подсказывает, что делать при команде /start. Команда доступна только + в чатах модераторов, которые настроены командой /adminsetup и пользователям с правами администратора. :param Message message: /start :return: None """ diff --git a/handlers/last_uncongratulate.py b/handlers/last_uncongratulate.py index ec412df..e598f34 100644 --- a/handlers/last_uncongratulate.py +++ b/handlers/last_uncongratulate.py @@ -12,7 +12,8 @@ @bot.message_handler(commands=['unceleb']) def bot_uncongratulate(message: Message) -> None: """" - Хендлер, который обрабатывает команду /unceleb по выводу последних непоздравленных пользователей. + Хендлер, который обрабатывает команду /unceleb по выводу последних непоздравленных пользователей. Команда доступна + только в чатах модераторов, которые настроены командой /adminsetup. :param Message message: /unceleb :return: None """ diff --git a/handlers/lucky_list.py b/handlers/lucky_list.py index 8b9183e..69f25b6 100644 --- a/handlers/lucky_list.py +++ b/handlers/lucky_list.py @@ -8,6 +8,7 @@ def bot_lucky_list(message: Message) -> None: """" Хендлер, который обрабатывает команду /luckylist по выводу всех зарегитрированных юбилейных пользователей. + Команда доступна только в чатах модераторов, которые настроены командой /adminsetup. :param Message message: /luckylist :return: None """ diff --git a/handlers/register_new_user.py b/handlers/register_new_user.py index 77dabed..5f9af90 100644 --- a/handlers/register_new_user.py +++ b/handlers/register_new_user.py @@ -43,10 +43,11 @@ def handler_new_member(message: Message) -> None: moderator_ids = get_moderator_id(group_id=message.chat.id) for moderator_id in moderator_ids: + dtime_formatted = dtime.strftime('%d.%m.%y %H:%M') bot_message = bot.send_message(chat_id=moderator_id, text=f'В {chat_name} вступил юбилейный пользователь {nickname} ' f'{user_name}\nПорядковый номер вступления: {count}, время ' - f'вступления: {dtime}', + f'вступления: {dtime_formatted}', reply_markup=new_user_keyboard.congratulate_keyboard()) temp_save(chat_id=message.chat.id, diff --git a/main.py b/main.py index 8c47967..dfcda83 100644 --- a/main.py +++ b/main.py @@ -2,12 +2,7 @@ import handlers from utils.set_bot_commands import set_default_commands -from database.commands import cleaner if __name__ == '__main__': - - cleaner() - set_default_commands(bot) bot.infinity_polling() - # ТЗ: Используйте LongPolling вариант работы с серверами телеграм