104 lines
4.0 KiB
Python
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() |