second init
This commit is contained in:
27
app/__init__.py
Normal file
27
app/__init__.py
Normal 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
32
app/__main__.py
Normal 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
76
app/actions.py
Normal 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
81
app/collect.py
Normal 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
36
app/db.py
Normal 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
8
app/utils.py
Normal 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
|
||||
Reference in New Issue
Block a user