Skip to content

Commit

Permalink
Merge pull request #6 from progeroffline/developing
Browse files Browse the repository at this point in the history
Move to new version
  • Loading branch information
progeroffline authored Jan 24, 2024
2 parents 1f544cc + f6559b1 commit 33269d3
Show file tree
Hide file tree
Showing 39 changed files with 711 additions and 332 deletions.
Empty file modified .gitignore
100644 → 100755
Empty file.
Empty file modified README-ua.md
100644 → 100755
Empty file.
Empty file modified README.md
100644 → 100755
Empty file.
2 changes: 1 addition & 1 deletion requirements.txt
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
aiofiles==23.1.0
aiogram==2.24
aiogram==3.1.1
aiohttp==3.8.5
aiosignal==1.3.1
aiosqlite==0.19.0
Expand Down
44 changes: 32 additions & 12 deletions src/bot/app.py
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,20 +1,40 @@
# -*- coding: utf-8 -*-
import asyncio

from aiogram import Dispatcher, executor
from database import \
create_schema_if_not_exist as database_create_schema_if_not_exist
from loader import dp, tasks_scheduler
from database import create_schema_if_not_exist as database_create_schema_if_not_exist
from handlers import (
admin_router,
balance_router,
channels_join_requests_router,
check_subscription_router,
close_functionality_router,
payment_router,
referral_router,
start_router,
)
from loader import bot, dp, tasks_scheduler
from middlewares import CreateUserMiddleware, UpdateLoggerMiddleware


async def on_startup(dp: Dispatcher):
import filters
import handlers
import middlewares

async def on_startup():
dp.update.outer_middleware(UpdateLoggerMiddleware())
dp.message.outer_middleware(CreateUserMiddleware())

dp.include_routers(
admin_router,
start_router,
payment_router,
close_functionality_router,
channels_join_requests_router,
check_subscription_router,
referral_router,
balance_router,
)

await database_create_schema_if_not_exist()

tasks_scheduler.start()
await dp.start_polling(bot)



if __name__ == "__main__":
executor.start_polling(dp, on_startup=on_startup, skip_updates=True)
asyncio.run(on_startup())
Empty file modified src/bot/data/__init__.py
100644 → 100755
Empty file.
54 changes: 42 additions & 12 deletions src/bot/data/config.py
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-

import os
from pathlib import Path

Expand All @@ -10,21 +8,53 @@

BOT_TOKEN = env.str("BOT_TOKEN")

database_filename = 'database.db'
schema_filename = 'database_schema.sql'
database_filename = "database.db"
schema_filename = "database_schema.sql"
project_filepath = Path(__file__).resolve().parent.parent.parent

sqlite_database_filepath = os.path.join(project_filepath, 'db', database_filename)
sqlite_schema_filepath = os.path.join(project_filepath, 'db', schema_filename)
sqlite_database_filepath = os.path.join(project_filepath, "db", database_filename)
sqlite_schema_filepath = os.path.join(project_filepath, "db", schema_filename)


USDT_TRC20_WALLET_ADDRESS = "TF8aSMqpwtniPN77wS2EZTTcUKaaJhyorb"

USDT_TRC20_WALLET_ADDRESS = 'TF8aSMqpwtniPN77wS2EZTTcUKaaJhyorb'
SUBSCRIBE_AMOUNT_IN_USDT_TRC20 = 5
# Key - count months
# Value - subscribe amount
# You can customise this dict
SUBSCRIBE_AMOUNT_BY_PLANS = {
1: 5,
# 3: 15,
# 6: 30,
# 7: 31,
}
NUMBER_DAYS_FROM_ONE_PAYMENT = 30
SUBSCRIBE_END_NOTIFICATION_DAYS = [7, 3, 1]
REFERAL_REWARD = 5

ADMINS_ID_LIST = []
private_channels = {
'Channel 1': {
'id': -100123456789,
'invite_url': 'https://t.me/+ABCDEFGHIJKL'
},
"Channel 1": {"id": -100123456789, "invite_url": "https://t.me/+ABCDEFGHIJKL"},
"Channel 2": {"id": -100123456789, "invite_url": "https://t.me/+ABCDEFGHIJKL"},
"Channel 3": {"id": -100123456789, "invite_url": "https://t.me/+ABCDEFGHIJKL"},
}

"""
Use HTML to format text
<b>bold</b>, <strong>bold</strong>
<i>italic</i>, <em>italic</em>
<u>underline</u>, <ins>underline</ins>
<s>strikethrough</s>, <strike>strikethrough</strike>, <del>strikethrough</del>
<span class="tg-spoiler">spoiler</span>, <tg-spoiler>spoiler</tg-spoiler>
<b>bold <i>italic bold <s>italic bold strikethrough <span class="tg-spoiler">italic bold strikethrough spoiler</span></s> <u>underline italic bold</u></i> bold</b>
<a href="http://www.example.com/">inline URL</a>
<a href="tg://user?id=123456789">inline mention of a user</a>
<tg-emoji emoji-id="5368324170671202286">👍</tg-emoji>
<code>inline fixed-width code</code>
<pre>pre-formatted fixed-width code block</pre>
<pre><code class="language-python">pre-formatted fixed-width code block written in the Python programming language</code></pre>
<blockquote>Block quotation started\nBlock quotation continued\nThe last line of the block quotation</blockquote>
And user \n to print the next text on a new line
"""
MAILING_TEXT = "Hello"
Empty file modified src/bot/database/__init__.py
100644 → 100755
Empty file.
25 changes: 15 additions & 10 deletions src/bot/database/models.py
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-

import dataclasses
from typing import Optional

Expand All @@ -11,15 +9,19 @@ class User:
first_name: Optional[str]
last_name: Optional[str]
username: Optional[str]
days_sub_end: int

days_sub_end: str
balance: int
referrer_id: int

@staticmethod
def get_fields_for_sql_query():
return '(%s)' % ', '.join([ field.name for field in dataclasses.fields(User) ][1:])
return "(%s)" % ", ".join(
[field.name for field in dataclasses.fields(User)][1:]
)

@staticmethod
def get_table_name():
return 'Users'
return "Users"


@dataclasses.dataclass()
Expand All @@ -28,12 +30,15 @@ class Transaction:
txid: str
owner_telegram_id: int
status: bool
months: int
created_at_timestamp: int

@staticmethod
def get_fields_for_sql_query():
return '(%s)' % ', '.join([ field.name for field in dataclasses.fields(Transaction) ][1:])

return "(%s)" % ", ".join(
[field.name for field in dataclasses.fields(Transaction)][1:]
)

@staticmethod
def get_table_name():
return 'Transactions'
return "Transactions"
87 changes: 50 additions & 37 deletions src/bot/database/transactions.py
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-

from datetime import datetime, timedelta
from typing import List, Optional, Union

Expand All @@ -9,56 +7,71 @@
from .models import Transaction


async def get(database_id: Optional[int] = None,
txid: Optional[str] = None) -> Union[Transaction, None]:
async def get(
database_id: Optional[int] = None, txid: Optional[str] = None
) -> Union[Transaction, None]:
async with aiosqlite.connect(sqlite_database_filepath) as connection:
if database_id is not None:
sql_query = "SELECT * FROM %s WHERE id=%s" % (Transaction.get_table_name(), database_id)
sql_query = "SELECT * FROM %s WHERE id=%s" % (
Transaction.get_table_name(),
database_id,
)
elif txid is not None:
sql_query = "SELECT * FROM %s WHERE txid='%s'" % (Transaction.get_table_name(), txid)
sql_query = "SELECT * FROM %s WHERE txid='%s'" % (
Transaction.get_table_name(),
txid,
)
else:
return None
cursor = await connection.execute(sql_query)

cursor = await connection.execute(sql_query)
row = await cursor.fetchone()
if row is None: return row

if row is None:
return row

return Transaction(*row)


async def create(txid: str, user_telegram_id: int) -> None:
async def create(txid: str, user_telegram_id: int, months: int = 1) -> None:
async with aiosqlite.connect(sqlite_database_filepath) as connection:
await connection.execute("""
await connection.execute(
"""
INSERT INTO %s
%s
VALUES
('%s', %s, %s, %s)
('%s', %s, %s, %s, %s)
;
""" % (
Transaction.get_table_name(),
Transaction.get_fields_for_sql_query(),
txid,
user_telegram_id,
False,
int(datetime.now().timestamp()),
))
"""
% (
Transaction.get_table_name(),
Transaction.get_fields_for_sql_query(),
txid,
user_telegram_id,
False,
months,
int(datetime.now().timestamp()),
)
)
await connection.commit()


async def set_status(status: bool,
database_id: Optional[int] = None,
txid: Optional[str] = None) -> None:
transaction = await get(database_id, txid)
if transaction is None: return None



async def set_status(
status: bool, database_id: Optional[int] = None, txid: Optional[str] = None
) -> None:
transaction = await get(database_id, txid)
if transaction is None:
return None

async with aiosqlite.connect(sqlite_database_filepath) as connection:
sql_query = "UPDATE %s SET status=%s WHERE id=%s" % (
Transaction.get_table_name(), status, transaction.id,
Transaction.get_table_name(),
status,
transaction.id,
)

await connection.execute(sql_query)
await connection.commit()


async def get_new() -> List[Transaction]:
async with aiosqlite.connect(sqlite_database_filepath) as connection:
Expand All @@ -69,10 +82,10 @@ async def get_new() -> List[Transaction]:
""" % (
Transaction.get_table_name(),
False,
int((datetime.now() - timedelta(minutes=20)).timestamp())
int((datetime.now() - timedelta(minutes=20)).timestamp()),
)
cursor = await connection.execute(sql_query)

cursor = await connection.execute(sql_query)
rows = await cursor.fetchall()
return [ Transaction(*row) for row in rows ]

return [Transaction(*row) for row in rows]
Loading

0 comments on commit 33269d3

Please sign in to comment.