Compare commits
No commits in common. "master" and "v1" have entirely different histories.
10
CHANGELOG.md
10
CHANGELOG.md
@ -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` в логи
|
||||||
- У игроков с премиумом теперь отрезается символ 💎 из имени
|
- У игроков с премиумом теперь отрезается символ 💎 из имени
|
||||||
|
13
HISTORY.md
13
HISTORY.md
@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
gitea: none
|
|
||||||
include_toc: true
|
|
||||||
---
|
|
||||||
|
|
||||||
# 📄 История изменений
|
|
||||||
|
|
||||||
|
|
||||||
## 🪧 Легенда
|
|
||||||
|
|
||||||
* 🟢 – Добавлено
|
|
||||||
* 🔴 – Удалёно
|
|
||||||
* ♻️ – Исправлено
|
|
11
README.md
11
README.md
@ -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** — Форматирование кода
|
||||||
|
@ -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'
|
||||||
"""🏷️ Имя бота"""
|
"""Имя бота"""
|
||||||
|
@ -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)
|
||||||
|
36
app/db.py
36
app/db.py
@ -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()
|
||||||
|
|
||||||
|
@ -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=""
|
|
||||||
|
@ -1,2 +1 @@
|
|||||||
black==24.10.0
|
black==24.10.0
|
||||||
pdoc==15.0.1
|
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
pdoc -o docs/ app
|
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user