Compare commits

...

3 Commits

Author SHA1 Message Date
d902e47068 readme 2024-08-16 18:29:17 +03:00
5ef27f4cc8 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	README
2024-08-16 18:26:09 +03:00
12fcb9bfe1 docker 2024-08-16 18:25:29 +03:00
8 changed files with 146 additions and 62 deletions

8
.env
View File

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

66
.idea/workspace.xml generated
View File

@@ -4,24 +4,7 @@
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="9e9f83d0-9771-4593-86bc-13be9ebfba22" name="Changes" comment="">
<change afterPath="$PROJECT_DIR$/.env" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/inspectionProfiles/profiles_settings.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/modules.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/subscriptions.iml" afterDir="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 default="true" id="9e9f83d0-9771-4593-86bc-13be9ebfba22" name="Changes" comment="docker" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
@@ -46,24 +29,24 @@
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;Python.admin.executor&quot;: &quot;Run&quot;,
&quot;Python.bot.executor&quot;: &quot;Run&quot;,
&quot;Python.database_queries.executor&quot;: &quot;Run&quot;,
&quot;Python.main.executor&quot;: &quot;Run&quot;,
&quot;Python.payment_binance_pay.executor&quot;: &quot;Run&quot;,
&quot;Python.payments.executor&quot;: &quot;Run&quot;,
&quot;Python.payments_tron.executor&quot;: &quot;Run&quot;,
&quot;Python.test.executor&quot;: &quot;Run&quot;,
&quot;Python.test3.executor&quot;: &quot;Run&quot;,
&quot;Python.utils.executor&quot;: &quot;Run&quot;,
&quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;git-widget-placeholder&quot;: &quot;main&quot;,
&quot;last_opened_file_path&quot;: &quot;C:/Users/PC/Desktop/subscriptions&quot;
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"Python.admin.executor": "Run",
"Python.bot.executor": "Run",
"Python.database_queries.executor": "Run",
"Python.main.executor": "Debug",
"Python.payment_binance_pay.executor": "Run",
"Python.payments.executor": "Run",
"Python.payments_tron.executor": "Run",
"Python.test.executor": "Run",
"Python.test3.executor": "Run",
"Python.utils.executor": "Run",
"RunOnceActivity.OpenProjectViewOnStart": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"git-widget-placeholder": "main",
"last_opened_file_path": "C:/Users/PC/Desktop/subscriptions"
}
}</component>
}]]></component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="C:\Users\PC\Desktop\subscriptions" />
@@ -114,6 +97,19 @@
<option name="presentableId" value="Default" />
<updated>1722862614099</updated>
</task>
<task id="LOCAL-00001" summary="docker">
<option name="closed" value="true" />
<created>1723821929851</created>
<option name="number" value="00001" />
<option name="presentableId" value="LOCAL-00001" />
<option name="project" value="LOCAL" />
<updated>1723821929851</updated>
</task>
<option name="localTasksCounter" value="2" />
<servers />
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="docker" />
<option name="LAST_COMMIT_MESSAGE" value="docker" />
</component>
</project>

9
README
View File

@@ -1,11 +1,16 @@
Установите необходимые зависимости:
2. Установите необходимые зависимости:
pip install -r requirements.txt
Настройте переменные окружения:
3. Настройте переменные окружения:
Создайте файл .env и добавьте необходимые переменные, такие как API-ключи и идентификаторы.
## Использование
**Соберите и запустите контейнеры:**
docker-compose up --build
Это создаст и запустит все сервисы, указанные в docker-compose.yml.
Запустите приложение:
python main.py

1
bot.py
View File

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

View File

@@ -94,14 +94,6 @@ def get_user_data(cursor: Any, telegram_id: int) -> tuple:
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:
""" Запись количества месяцев в subscription_option """
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:
bot:
build: .
container_name: aiogram_bot
ports:
- "8080:8080"
environment:
- API_TOKEN=${API_TOKEN}
restart: unless-stopped
services:
db:
image: mysql:8.0
restart: always
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
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
import asyncio
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 dotenv import load_dotenv
@@ -21,6 +22,10 @@ async def main() -> None:
""" Запуск бота """
dp.include_router(bot.router)
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 планировщиком
scheduler.add_job(get_usd_rub_course, 'cron', hour='12,18,0')
# Планируем выполнение функции checking_and_deleting_users ежедневно в 00:12

View File

@@ -123,3 +123,82 @@ async def checking_and_deleting_users() -> None:
reset_user_data(id_user)
except Exception as 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()