Compare commits

..

No commits in common. "master" and "v1" have entirely different histories.
master ... v1

10 changed files with 36 additions and 96 deletions

View File

@ -1,12 +1,4 @@
## 2.1.0 ### 1.1.0
- В БД сохраняется UTF-8 строки, вместо `\u`
## 2.0.0
- переход с SQLite3 на PostgreSQL
## 1.1.0
- Добавлен выхлом ошибок `try...catch` в логи - Добавлен выхлом ошибок `try...catch` в логи
- У игроков с премиумом теперь отрезается символ 💎 из имени - У игроков с премиумом теперь отрезается символ 💎 из имени

View File

@ -1,13 +0,0 @@
---
gitea: none
include_toc: true
---
# 📄 История изменений
## 🪧 Легенда
* 🟢 Добавлено
* 🔴 Удалёно
* ♻️ Исправлено

View File

@ -3,7 +3,7 @@ gitea: none
include_toc: true include_toc: true
--- ---
# 🎴 Клиент для ведения статистики клана в AniCard # 🎴 Бот для ведения статистики клана в AniCard
<img src="https://git.a2s.su/AniCard/ClanStat/raw/branch/master/assets/icon.png" alt="Иконка" height="512"> <img src="https://git.a2s.su/AniCard/ClanStat/raw/branch/master/assets/icon.png" alt="Иконка" height="512">
@ -30,14 +30,10 @@ cp env.example .env
- `APP_HASH` — Хэш приложения Telegram. - `APP_HASH` — Хэш приложения Telegram.
- `ACCOUNT` — Имя аккаунта пользователя Telegram (_например `db_o_qp`_). - `ACCOUNT` — Имя аккаунта пользователя Telegram (_например `db_o_qp`_).
- `LOG_PATH` — Путь в файлу логов (_например `/tmp/test.log`_). - `LOG_PATH` — Путь в файлу логов (_например `/tmp/test.log`_).
- `DB_HOST` — Хост базы данных PostgreSQL - `DB_PATH` — Путь к файлу базы данных SQLite3 (_например `./db.sqlite`_).
- `DB_PORT` — Порт сервера базы данных
- `DB_NAME` — Имя базы данных
- `DB_USER` — Имя пользователя
- `DB_PASSWORD` — Пароль пользователя
### 🐦‍🔥 Настройка виртуального окружения и загрузка библиотек ### 🐦‍🔥 Настройка виртуального окружения и загрузка бибилотек
Создание и активация виртуального окружения. Создание и активация виртуального окружения.
@ -84,5 +80,4 @@ Enter confirmation code: 14628
- **Pyrogram** — Telegram клиент - **Pyrogram** — Telegram клиент
- **python-dotenv** — Работа с `.env` файлами - **python-dotenv** — Работа с `.env` файлами
- **loguru** — Логирование - **loguru** — Логирование
- **psycopg2** — Работа с PostgreSQL
- **black** — Форматирование кода - **black** — Форматирование кода

View File

@ -1,6 +1,6 @@
# Информация о программе # Информация о программе
__author__ = 'Alexander Popov' __author__ = 'Alexander Popov'
__version__ = (2, 1, 0) __version__ = (1, 1, 0)
# Импорт модулей стандартной библиотеки # Импорт модулей стандартной библиотеки
from os import getenv from os import getenv
@ -16,16 +16,10 @@ from .db import DataBase
load_dotenv() # Выполняет чтение .env load_dotenv() # Выполняет чтение .env
client = Client(getenv('ACCOUNT'), api_id=getenv('APP_ID'), api_hash=getenv('APP_HASH')) client = Client(getenv('ACCOUNT'), api_id=getenv('APP_ID'), api_hash=getenv('APP_HASH'))
"""🤖 Клиент Telegram""" """Клиент Telegram"""
db = DataBase( db = DataBase(getenv('DB_PATH'))
getenv('DB_HOST'), """База данных"""
int(getenv('DB_PORT')),
getenv('DB_NAME'),
getenv('DB_USER'),
getenv('DB_PASSWORD'),
)
"""🗃️ База данных"""
logger.add(getenv('LOG_PATH'), compression='zip') logger.add(getenv('LOG_PATH'), compression='zip')
"""Логгер""" """Логгер"""
@ -34,4 +28,4 @@ DELAY_TIME = 12 * 60 * 60 # 12 часов
"""Время приостановки выполнения цикла сбора статистики""" """Время приостановки выполнения цикла сбора статистики"""
BOT_NAME = '@anicardplaybot' BOT_NAME = '@anicardplaybot'
"""🏷️ Имя бота""" """Имя бота"""

View File

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

View File

@ -1,35 +1,19 @@
# Импорт модулей стандартной библиотеки # Импорт модулей стандартной библиотеки
import sqlite3
import json import json
# Импорт сторонних модулей
import psycopg2
class DataBase(object): class DataBase(object):
"""Класс для работы с базой данных""" """Класс для работы с базой данных"""
def __init__(self, host: str, port: int, name: str, user: str, password: str): def __init__(self, path):
super(DataBase, self).__init__() super(DataBase, self).__init__()
self.host = host self.path = path
"""Хост PostgreSQL базы данных""" """Путь к файлу базы данных SQLite3"""
self.port = port
"""Порт сервера базы данных"""
self.name = name
"""Имя базы данных"""
self.user = user
"""Имя пользователя"""
self.password = password
"""Пароль пользователя"""
def connect(self) -> bool: def connect(self) -> bool:
"""Выполняет подключение к базе данных""" """Выполняет подключение к базе данных"""
self.conn = psycopg2.connect( self.conn = sqlite3.connect(self.path)
dbname=self.name,
host=self.host,
user=self.user,
password=self.password,
port=self.port,
)
return True return True
def close(self) -> bool: def close(self) -> bool:
@ -50,15 +34,7 @@ class DataBase(object):
table = 'donates' table = 'donates'
cur = self.conn.cursor() cur = self.conn.cursor()
cur.execute( cur.execute('INSERT INTO {table} (\'data\') VALUES (\'{data}\')'.format(table=table, data=json.dumps(data)))
'INSERT INTO {table} ("data") VALUES (\'{data}\')'.format(
table=table,
data=json.dumps(
data,
ensure_ascii=False,
),
)
)
self.commit() self.commit()
cur.close() cur.close()

View File

@ -2,8 +2,4 @@ APP_ID=""
APP_HASH="" APP_HASH=""
ACCOUNT="" ACCOUNT=""
LOG_PATH="/tmp/test.log" LOG_PATH="/tmp/test.log"
DB_HOST="" DB_PATH="./db.sqlite"
DB_PORT=""
DB_NAME=""
DB_USER=""
DB_PASSWORD=""

View File

@ -1,2 +1 @@
black==24.10.0 black==24.10.0
pdoc==15.0.1

View File

@ -1,3 +0,0 @@
#!/bin/sh
pdoc -o docs/ app

View File

@ -1,8 +1,12 @@
BEGIN; BEGIN;
CREATE TABLE "public"."wins" ( CREATE TABLE IF NOT EXISTS 'wins'
"data" JSON NOT NULL, (
"timestamp" Timestamp Without Time Zone DEFAULT CURRENT_TIMESTAMP ); 'id' Integer PRIMARY KEY AUTOINCREMENT,
; 'timestamp' DateTime NOT NULL DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime')),
'data' Text NOT NULL
);
CREATE INDEX IF NOT EXISTS 'index_timestamp' ON 'wins' ('timestamp');
COMMIT; COMMIT;