This commit is contained in:
Mary 2024-08-16 18:25:29 +03:00
parent 6e630925a8
commit 12fcb9bfe1
8 changed files with 143 additions and 41 deletions

8
.env
View File

@ -1,10 +1,10 @@
API_TOKEN = "6594413238:AAFahDg955k1GE9a4JE9T9yHyQoJZV5TFEk" API_TOKEN = ""
TO_ADRESS = 'TRFBWmb5NkvKuQpYyPaYzZAX46VCUJtiq1' TO_ADRESS = 'TRFBWmb5NkvKuQpYyPaYzZAX46VCUJtiq1'
ARBITRUM_API_KEY = 'P61RFT45N63PJYT5MDY1CEHG1US1C5KZZ4' ARBITRUM_API_KEY = 'P61RFT45N63PJYT5MDY1CEHG1US1C5KZZ4'
ARBITRUM_ADRESS = '683dc0af0d3797523104b57a7889b97a5871fbbb' ARBITRUM_ADRESS = '683dc0af0d3797523104b57a7889b97a5871fbbb'
ACCOUNT_ID_YK = '438627' ACCOUNT_ID_YK = '438627'
SECRET_KEY_YK = 'test_c4W1yT9yzc8WT-d1YvJKGX59yOfXBMpeNtWegH2uJqo' SECRET_KEY_YK = 'test_c4W1yT9yzc8WT-d1YvJKGX59yOfXBMpeNtWegH2uJqo'
DB_HOST = "localhost" DB_HOST = "db"
DB_USER = "root" DB_USER = ""
DB_PASSWORD = "vy!f..rVJ7t9tmG" DB_PASSWORD = ""
DB_DATABASE = "subscriptions" DB_DATABASE = "subscriptions"

View File

@ -5,22 +5,12 @@
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="9e9f83d0-9771-4593-86bc-13be9ebfba22" name="Changes" comment=""> <list default="true" id="9e9f83d0-9771-4593-86bc-13be9ebfba22" name="Changes" comment="">
<change afterPath="$PROJECT_DIR$/.env" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Dockerfile" beforeDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/inspectionProfiles/profiles_settings.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/README" beforeDir="false" afterPath="$PROJECT_DIR$/README" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/bot.py" beforeDir="false" afterPath="$PROJECT_DIR$/bot.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/modules.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/database_queries.py" beforeDir="false" afterPath="$PROJECT_DIR$/database_queries.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/subscriptions.iml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/docker-compose.yaml" beforeDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/admin.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/bot.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/database_queries.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/main.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/requirements.txt" afterDir="false" />
<change afterPath="$PROJECT_DIR$/states.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/test.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/utils.py" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />

29
README
View File

@ -0,0 +1,29 @@
2. Установите необходимые зависимости:
pip install -r requirements.txt
3. Настройте переменные окружения:
Создайте файл .env и добавьте необходимые переменные, такие как API-ключи и идентификаторы.
## Использование
Запустите приложение:
python main.py
### Команды
- /start - Запускает бота и показывает меню.
- /faq - Показать часто задаваемые вопросы.
- /my_subscription - Показать информацию о подписке.
- /ask_question - Задать вопрос.
## Структура проекта
├── main.py # Основной файл приложения
├── bot.py # Логика бота
├── database.py # Работа с базой данных
├── handlers.py # Обработчики команд и событий
├── requirements.txt # Список зависимостей
└── README.md # Этот файл

1
bot.py
View File

@ -1,4 +1,3 @@
import os import os
from datetime import datetime, timedelta from datetime import datetime, timedelta
import datetime import datetime

View File

@ -94,14 +94,6 @@ def get_user_data(cursor: Any, telegram_id: int) -> tuple:
return cursor.fetchone() return cursor.fetchone()
# def subscription_entry(cursor: Any, telegram_id: int, price_usd: int) -> None:
# """ Запись подписки в столбец subscription_option """
# new = f"{price_usd} мес"
# cursor.execute(
# "UPDATE users SET subscription_option = %s WHERE telegram_id = %s "
# "AND (sub_datetime_end IS NULL OR sub_datetime_end = '0')",
# (new, telegram_id)
# )
def subscription_entry(cursor: Any, telegram_id: int, price_usd: int) -> None: def subscription_entry(cursor: Any, telegram_id: int, price_usd: int) -> None:
""" Запись количества месяцев в subscription_option """ """ Запись количества месяцев в subscription_option """
cursor.execute("UPDATE users SET subscription_option = subscription_option + %s WHERE telegram_id = %s", cursor.execute("UPDATE users SET subscription_option = subscription_option + %s WHERE telegram_id = %s",

View File

@ -1,12 +1,20 @@
version: "3.9" version: "3.9"
services: services:
bot: db:
build: . image: mysql:8.0
container_name: aiogram_bot restart: always
ports: environment:
- "8080:8080" MYSQL_DATABASE: ${DB_DATABASE}
environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
- API_TOKEN=${API_TOKEN}
restart: unless-stopped bot:
build: .
restart: always
depends_on:
- db
ports:
- "5000:5000"
volumes:
db_data:

View File

@ -3,7 +3,8 @@ import os
from aiogram import Bot, Dispatcher from aiogram import Bot, Dispatcher
import asyncio import asyncio
import bot import bot
from utils import get_usd_rub_course, checking_and_deleting_users from utils import get_usd_rub_course, checking_and_deleting_users, check_table_exists_users, check_table_exists_usd_rub, \
check_table_exists_successful_hash
from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.schedulers.asyncio import AsyncIOScheduler
from dotenv import load_dotenv from dotenv import load_dotenv
@ -21,6 +22,10 @@ async def main() -> None:
""" Запуск бота """ """ Запуск бота """
dp.include_router(bot.router) dp.include_router(bot.router)
scheduler = AsyncIOScheduler() scheduler = AsyncIOScheduler()
check_table_exists_users()
check_table_exists_usd_rub()
check_table_exists_successful_hash()
await get_usd_rub_course()
# Планируем выполнение функции в 12:00, 18:00 и 00:00 планировщиком # Планируем выполнение функции в 12:00, 18:00 и 00:00 планировщиком
scheduler.add_job(get_usd_rub_course, 'cron', hour='12,18,0') scheduler.add_job(get_usd_rub_course, 'cron', hour='12,18,0')
# Планируем выполнение функции checking_and_deleting_users ежедневно в 00:12 # Планируем выполнение функции checking_and_deleting_users ежедневно в 00:12

View File

@ -123,3 +123,82 @@ async def checking_and_deleting_users() -> None:
reset_user_data(id_user) reset_user_data(id_user)
except Exception as e: except Exception as e:
print(f"Ошибка: {e}") print(f"Ошибка: {e}")
def check_table_exists_users():
""" Проверяет, существует ли таблица users в базе данных. Если таблицы нет, создает ее """
conn = create_connection()
cursor = conn.cursor()
# Запрос для проверки существования таблицы
cursor.execute(f"""
SELECT 1
FROM information_schema.tables
WHERE table_schema = '{os.getenv('DB_DATABASE')}'
AND table_name = 'users';
""")
exists = cursor.fetchone() is not None
# Если таблица не существует, создаем ее
if not exists:
cursor.execute(f"""
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
telegram_id BIGINT NOT NULL,
telegram_username VARCHAR(255) NOT NULL,
zennolab_id VARCHAR(255) DEFAULT NULL,
sub_datetime_end BIGINT UNSIGNED DEFAULT NULL,
threads_count INT DEFAULT NULL,
telegram_thread_id BIGINT DEFAULT NULL,
question_time INT DEFAULT NULL,
count_streams INT DEFAULT NULL,
subscription_option VARCHAR(255) DEFAULT NULL,
subscription_end_date DATE DEFAULT NULL);""")
conn.commit()
cursor.close()
conn.close()
def check_table_exists_usd_rub():
""" Проверяет, существует ли таблица USD_RUB в базе данных. Если таблицы нет, создает ее """
conn = create_connection()
cursor = conn.cursor()
# Запрос для проверки существования таблицы
cursor.execute(f"""
SELECT 1
FROM information_schema.tables
WHERE table_schema = '{os.getenv('DB_DATABASE')}'
AND table_name = 'USD_RUB';
""")
exists = cursor.fetchone() is not None
# Если таблица не существует, создаем ее
if not exists:
cursor.execute(f"""
CREATE TABLE USD_RUB (
id INT AUTO_INCREMENT PRIMARY KEY,
well FLOAT DEFAULT 0);""")
conn.commit()
cursor.close()
conn.close()
def check_table_exists_successful_hash():
""" Проверяет, существует ли таблица successful_hash в базе данных. Если таблицы нет, создает ее """
conn = create_connection()
cursor = conn.cursor()
# Запрос для проверки существования таблицы
cursor.execute(f"""
SELECT 1
FROM information_schema.tables
WHERE table_schema = '{os.getenv('DB_DATABASE')}'
AND table_name = 'successful_hash';
""")
exists = cursor.fetchone() is not None
# Если таблица не существует, создаем ее
if not exists:
cursor.execute(f"""
CREATE TABLE successful_hash (
id INT AUTO_INCREMENT PRIMARY KEY,
hash_users VARCHAR(255) NOT NULL,
telegram_id BIGINT NOT NULL);""")
conn.commit()
cursor.close()
conn.close()