ub4tg/dispatcher.py

157 lines
6 KiB
Python
Raw Normal View History

# -*- coding: utf-8 -*-
2024-08-09 08:40:04 +03:00
########################################################################
2024-08-09 08:07:05 +03:00
# "диспетчер" це звичайний бот (не юб)
# Використовувати "диспетчер" є сенс, якщо:
#
# > у вас є база MySQL на http://localhost/
# > у вас кілька акків підключено до 1 бд
#
# спільне використання однієї бд sqlite кількома ботами створює проблему db is locked
2024-08-09 08:50:49 +03:00
# тому у випадку з кількома юзерами у кожного своя sqlite база {id}.sqlite
2024-08-09 08:10:17 +03:00
# а от MySQL в свою чергу може бути спільна для всіх ботів і юзерботів.
2024-08-09 08:50:49 +03:00
# тобто якщо база спільна то достатньо одного "диспетчера" для всіх.
# Але якщо юзаєте лише sqlite то і "диспетчер" вам нафіг нетреба.
2024-08-09 08:40:04 +03:00
#
# якщо говорити про пк/ноут можу порадить XAMPP (юзаю для всього)*
# якщо юб запускається з телефона то хз чи є сенс ще і MySQL.
#*XAMPP дає можливість встановить Apache, MySQL, ітд.
# юзаю для локального сайта ну і базу ще і для ботів.
# у кого свій сервер там вже якось самі розбирайтесь.
########################################################################
from datetime import datetime, timedelta
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
from config import TOKEN
import os
import re
import random
import time
import pymysql
import pymysql.cursors
import sqlite3
2024-08-09 08:07:05 +03:00
db_pymysql = True#set True
db_sqlite3 = False#set False
if db_pymysql:
ldb=pymysql.connect(
host='localhost',
user='root',
2024-08-09 08:07:05 +03:00
password='напишіть_сюдааш_пароль_від_локальної_бд',
db='db',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
dbc = ldb.cursor()
dbc.execute('''CREATE TABLE IF NOT EXISTS `tg_iris_zarazy` (
`when_int` int(11) unsigned NOT NULL DEFAULT '0',
`who_id` bigint(20) unsigned NOT NULL DEFAULT '0',
`user_id` bigint(20) unsigned NOT NULL DEFAULT '0',
`u_link` varchar(500) NOT NULL DEFAULT '',
`bio_str` varchar(11) NOT NULL DEFAULT '1',
`bio_int` int(11) unsigned NOT NULL DEFAULT '1',
`expr_int` int(11) unsigned NOT NULL DEFAULT '0',
`expr_str` varchar(11) NOT NULL DEFAULT '0',
UNIQUE KEY `UNIQUE` (`who_id`,`user_id`)
);''');
#зберігалка: https://github.com/S1S13AF7/ub4tg
ldb.commit()
bot = Bot(token=TOKEN, parse_mode=types.ParseMode.HTML) #see: https://mastergroosha.github.io/aiogram-2-guide/messages/
dp = Dispatcher(bot)
print('Bot started')
@dp.message_handler(commands=['start'])
async def process_start_command(message: types.Message):
#print(message)
snd_msg = "🖖"
await message.answer(snd_msg)
@dp.message_handler(commands=['mz','мж','мз'])
async def cmd_myzh (message: types.Message):
msg="🤷"
user_id = int(message.from_user.id)
user_fn = message.from_user.first_name or ''
lng_code = message.from_user.language_code or ''
when_int = int(datetime.timestamp(message.date))
if db_pymysql:
try:
#зберігалка: https://github.com/S1S13AF7/ub4tg (адреса може змінитись)
dbc.execute("SELECT user_id,bio_str,expr_str FROM `tg_iris_zarazy` WHERE who_id = %d ORDER BY when_int DESC LIMIT 10;" % int(user_id));
bz_info = dbc.fetchmany(10)#получить
all_sicknes=[]#інфа
count=len(bz_info)
who=f"🦠 {user_fn}:"
for row in bz_info:
print(row)
id_user=row["user_id"]
bio_str=row["bio_str"]
u_link =f'tg://openmessage?user_id={id_user}' #fix для любителів мінять його
expr_str=re.sub(r'.20', r'.',row["expr_str"]) #.2024->.24
a_href = f'<a href="{u_link}"><code>@{id_user}</code></a>'
all_sicknes.append(f"{bio_str} {a_href}#{expr_str}\n")
if len(all_sicknes)!=0:
all_sicknes=f'{who}\n{"".join(all_sicknes)}'
else:
all_sicknes='🤷 інфа нема.'
msg=all_sicknes
except Exception as Err:
msg = Err
print(f"localhost SELECT:{Err}")
await message.answer(msg, parse_mode=types.ParseMode.HTML)
@dp.message_handler(commands=['ends'])
async def cmd_ends (message: types.Message):
msg="🤷"
user_id = int(message.from_user.id)
user_fn = message.from_user.first_name or ''
lng_code = message.from_user.language_code or ''
when_int = int(datetime.timestamp(message.date))
if db_pymysql:
try:
#зберігалка: https://github.com/S1S13AF7/ub4tg (адреса може змінитись)
dbc.execute(f"SELECT user_id,bio_str,expr_str FROM `tg_iris_zarazy` WHERE who_id = {user_id} AND expr_int < {when_int} ORDER BY `bio_int` DESC, `when_int` DESC LIMIT 10;")
bz_info = dbc.fetchmany(10)#получить
all_sicknes=[]#інфа
count=len(bz_info)
who=f"🦠 {user_fn}:"
for row in bz_info:
print(row)
id_user=row["user_id"]
bio_str=row["bio_str"]
u_link =f'tg://openmessage?user_id={id_user}' #fix для любителів мінять його
expr_str=re.sub(r'.20', r'.',row["expr_str"]) #.2024->.24
a_href = f'<a href="{u_link}"><code>@{id_user}</code></a>'
all_sicknes.append(f"{bio_str} {a_href}#{expr_str}\n")
if len(all_sicknes)!=0:
all_sicknes=f'{who}\n{"".join(all_sicknes)}'
else:
all_sicknes='🤷 інфа нема.'
msg=all_sicknes
except Exception as Err:
msg = Err
print(f"localhost SELECT:{Err}")
await message.answer(msg, parse_mode=types.ParseMode.HTML)
@dp.message_handler(commands=['help'])
async def process_help_command(message: types.Message):
#await message.answer(emoji="🤷")
await message.answer('''
🦠 /mz
''')
@dp.message_handler(commands=['ping'])
async def process_ping_command(message: types.Message):
await message.reply("PONG!")
if __name__ == '__main__':
executor.start_polling(dp)