second init

This commit is contained in:
2024-11-27 02:58:28 +03:00
commit 10aa70702c
19 changed files with 875 additions and 0 deletions

27
app/__init__.py Normal file
View File

@@ -0,0 +1,27 @@
# Информация о программе
__author__ = 'Alexander Popov'
__version__ = (0, 0, 1)
# Импорт модулей стандартной библиотеки
from os import getenv
# Импорт сторонних модулей
from loguru import logger
from dotenv import load_dotenv
from pyrogram import Client
# Импорт модулей приложения
from .db import DataBase
load_dotenv() # Выполняет чтение .env
# Приложение
app = Client(getenv('ACCOUNT'), api_id=getenv('APP_ID'), api_hash=getenv('APP_HASH'))
# База данных
db = DataBase(getenv('DB_PATH'))
# Логгер
logger.add(getenv('LOG_PATH'), compression='zip')
BOT_NAME = '@anicardplaybot'

32
app/__main__.py Normal file
View File

@@ -0,0 +1,32 @@
# Импорт модулей стандартной библиотеки
import time
# Импорт модулей приложения
from . import app, db, logger
from .actions import get_top_wins, get_top_donates
async def main():
await app.start()
logger.info('Клиент Telegram запущен')
# Основной цикл программы
while True:
await get_top_wins() # Получает топ клана по победам
await get_top_donates() # Получает топ клана по пожертвованиям
time.sleep(12 * 60 * 60) # 12 часов
await app.stop()
logger.info('Клиент Telegram остановлен')
if __name__ == '__main__':
logger.info('Выполняется запуск приложения')
logger.info('Выполняется подключение к базе данных')
db.connect()
app.run(main())
db.close()
logger.info('Приложение завершило работу')

76
app/actions.py Normal file
View File

@@ -0,0 +1,76 @@
# Импорт модулей стандартной библиотеки
import time
# Импорт модулей приложения
from . import app, logger, BOT_NAME
from .collect import parse_wins_top, parse_donates_top
async def get_top_wins() -> None:
logger.info('Выполняется получения списка побед клана')
await app.send_message(BOT_NAME, '🛡 Мой клан')
time.sleep(1)
message_id = 0
async for message in app.get_chat_history(BOT_NAME, limit=1):
message_id = message.id
await app.request_callback_answer(
chat_id=BOT_NAME,
message_id=message_id,
callback_data='my_clan:tops:91:0:0:0:0:1',
)
time.sleep(1)
async for message in app.get_chat_history(BOT_NAME, limit=1):
message_id = message.id
await app.request_callback_answer(
chat_id=BOT_NAME,
message_id=message_id,
callback_data='my_clan:top-wins:91:0:0:0:0:1',
)
time.sleep(1)
async for message in app.get_chat_history(BOT_NAME, limit=1):
parse_wins_top(message)
await app.read_chat_history(BOT_NAME)
logger.info('Получение списка побед клана завершено')
async def get_top_donates() -> None:
logger.info('Выполняется получения списка пожертвований клана')
await app.send_message(BOT_NAME, '🛡 Мой клан')
time.sleep(1)
message_id = 0
async for message in app.get_chat_history(BOT_NAME, limit=1):
message_id = message.id
await app.request_callback_answer(
chat_id=BOT_NAME,
message_id=message_id,
callback_data='my_clan:tops:91:0:0:0:0:1',
)
time.sleep(1)
async for message in app.get_chat_history(BOT_NAME, limit=1):
message_id = message.id
await app.request_callback_answer(
chat_id=BOT_NAME,
message_id=message_id,
callback_data='my_clan:top-donates:91:0:0:0:0:1',
)
time.sleep(1)
async for message in app.get_chat_history(BOT_NAME, limit=1):
parse_donates_top(message)
await app.read_chat_history(BOT_NAME)
logger.info('Получение списка пожертвований клана завершено')

81
app/collect.py Normal file
View File

@@ -0,0 +1,81 @@
# Импорт модулей стандартной библиотеки
import re
# Импорт сторонних модулей
from pyrogram.types import Message
# Импорт модулей приложения
from . import db
def parse_wins_top(message: Message) -> None:
if message.text.startswith('🏆 Топ по победам'):
gamers = message.text.split('\n')
gamers.pop(0)
gamers.pop(0)
WINS = list()
for idx, gamer in enumerate(gamers):
gamer = re.sub(r'^\d+. ', '', gamer) # удаляет нумерацию
gamer, battle_count = gamer.split(' - ') # разделяет ник и количество побед в клановых сражениях
# оставляет ники игроков, Python не может в эмодзи в RegExp, по этому пришлось делать через str.replace()
# gamer = re.sub(r'\s[⚡⚜]$', '', gamer)
gamer = gamer.replace('', '')
gamer = gamer.replace('', '')
battle_count = battle_count.replace('', '') # удаляем эмодзи мечей
battle_count = int(re.sub(r'[^\x00-\x7F]', '', battle_count)) # преобразовывает строку в число
WINS.append(
{
'telegram_id': message.entities[idx].url.strip('http://t.me/'),
'username': gamer,
'count': battle_count,
}
)
# print('{0} - {1} (@{2})'.format(gamer, battle_count, message.entities[idx].url.strip('http://t.me/')))
db.add_data(WINS, True)
else:
pass
def parse_donates_top(message: Message) -> None:
if message.text.startswith('🏆 Топ по пожертвованиям'):
players = message.text.split('\n')
# Удаляет из массива строку с заголовком и последующую пустую строку
players.pop(0)
players.pop(0)
DONATES = list()
for idx, player in enumerate(players):
player = re.sub(r'^\d+. ', '', player) # удаляет нумерацию
player, donates_count = player.split(' - ') # разделяет ник и количество пожертвований в клановую сокровищницу
# Оставляет только ники игроков.
# Python не может парсить эмодзи в RegExp, по этому пришлось делать через str.replace()
# player = re.sub(r'\s[⚡⚜]$', '', player)
player = player.replace('', '')
player = player.replace('', '')
donates_count = donates_count.replace(' 💠', '') # удаляем эмодзи пожертвований
donates_count = int(re.sub(r'[^\x00-\x7F]', '', donates_count)) # преобразовывает строку в число
DONATES.append(
{
'telegram_id': message.entities[idx].url.strip('http://t.me/'),
'username': player,
'count': donates_count,
}
)
# print('{0} - {1} (@{2})'.format(player, donates_count, message.entities[idx].url.strip('http://t.me/')))
db.add_data(DONATES, False)
else:
pass

36
app/db.py Normal file
View File

@@ -0,0 +1,36 @@
# Импорт модулей стандартной библиотеки
import sqlite3
import json
class DataBase(object):
"""..."""
def __init__(self, path):
super(DataBase, self).__init__()
self.path = path
def connect(self) -> bool:
self.conn = sqlite3.connect(self.path)
return True
def close(self) -> bool:
self.conn.close()
return True
def commit(self) -> None:
self.conn.commit()
return True
def add_data(self, data, wins: bool) -> bool: # wins изменит на Enum
if wins:
table = 'wins'
else:
table = 'donates'
cur = self.conn.cursor()
cur.execute('INSERT INTO {table} (\'data\') VALUES (\'{data}\')'.format(table=table, data=json.dumps(data)))
self.commit()
cur.close()
return True

8
app/utils.py Normal file
View File

@@ -0,0 +1,8 @@
from . import app
async def get_telegram_id(username: str) -> int:
"""Возвращает Telegram ID по имени пользователя"""
telegram_user = await app.get_users(username)
return telegram_user.id