Files
simple_sql_tg_bot/app/share.py

104 lines
4.0 KiB
Python

import asyncio
from aiogram import F, Router, Bot
from aiogram.filters import CommandStart, Command, CommandObject
from aiogram.types import ContentType
from aiogram.types import Message, CallbackQuery
from aiogram.types import ReplyKeyboardRemove, InputMediaPhoto
from aiogram.enums import ParseMode
from aiogram.fsm.state import State, StatesGroup
from aiogram.fsm.context import FSMContext
import app.share_kb as share_kb
import sqlite3
from random import randint
from config import ADMIN_ID, TOKEN
share_router = Router()
class Share(StatesGroup):
share_begin = State()
share_msg = State()
async def send_media(bot: Bot, chat_id: int, message: Message):
"""Функция для точной пересылки сообщения без изменений"""
if message.photo:
await bot.send_photo(
chat_id=chat_id,
photo=message.photo[-1].file_id,
caption=message.caption
)
elif message.video:
await bot.send_video(
chat_id=chat_id,
video=message.video.file_id,
caption=message.caption
)
elif message.document:
await bot.send_document(
chat_id=chat_id,
document=message.document.file_id,
caption=message.caption
)
elif message.text:
await bot.send_message(
chat_id=chat_id,
text=message.text
)
@share_router.message(Command('share'))
async def start_share(message: Message, state: FSMContext):
if message.from_user.id == ADMIN_ID:
await message.answer("🤔вы уверены что хотите начать рассылку?", reply_markup=share_kb.share_starting)
else:
await message.answer("⛔вы не являетесь администратором")
@share_router.callback_query(F.data == 'share_cancel')
async def share_cancel_cmd(callback: CallbackQuery, state: FSMContext):
await callback.answer(show_alert=False)
await callback.message.edit_text('❌рассылка не была начата',
reply_markup=None)
await state.clear()
@share_router.callback_query(F.data == 'share_starting')
async def share_start_cmd(callback: CallbackQuery, state: FSMContext):
await callback.answer(show_alert=False)
await callback.message.edit_text(
'✉️отправьте сообщение для рассылки\n\nучтите что можно ' \
'приложить только один медиафайл',
reply_markup=None)
await state.set_state(Share.share_begin)
@share_router.message(Share.share_begin)
async def share_begin_cmd(message: Message, state: FSMContext, bot: Bot):
await state.update_data(share_msg=message)
await message.answer("🤔вы уверены что хотите разослать сообщение?",
reply_markup=share_kb.share_send)
await state.set_state(Share.share_msg)
@share_router.callback_query(F.data == 'share_starting_send')
async def share_send_cmd(callback: CallbackQuery, state: FSMContext, bot: Bot):
await callback.answer(show_alert=False)
data = await state.get_data()
share_msg = data.get('share_msg')
if not share_msg:
await callback.message.edit_text('❌Ошибка: сообщение для рассылки не найдено')
await state.clear()
return
base = sqlite3.connect('users.db')
cur = base.cursor()
cur.execute("SELECT id FROM users")
users_id = cur.fetchall()
await callback.message.edit_text('🔄Рассылаю сообщение...', reply_markup=None)
await asyncio.sleep(0.1) # Небольшая задержка перед началом рассылки
for user_id, in users_id:
if user_id != ADMIN_ID:
await send_media(bot, user_id, share_msg)
base.close()
await callback.message.edit_text('🎉Сообщение успешно разослано', reply_markup=None)
await state.clear()