Не корректно работает кнопка "Проверить подписку"
Ниже код, при прохождении регистрации, ввода ZONE ID и USER ID, пользователю предлагается подписаться на каналы, но кнопка проверить подписку не работает от слова совсем, нету никакой реакции
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from functions import *
from aiogram.types import CallbackQuery
from aiogram.utils.deep_linking import decode_payload, get_start_link
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message, ChatMember
from aiogram.dispatcher import FSMContext
from typing import List
from aiogram.utils.exceptions import ChatNotFound
import nav
from nav import Nav
from functions import register_user, is_user_registered
from telegram import Update
from telegram.ext import CallbackContext
nav = Nav()
class RegisterState(StatesGroup):
ID = State()
ZONE_ID = State()
CONFIRMATION = State()
CHECK_ID = State()
WAITING_FOR_NAME = State()
memory_storage = MemoryStorage()
token = '6041670705:AAEueGPQH48YTP5vOycBaBsw7TDwxEPdwNA'
bot = Bot(token=token)
dp = Dispatcher(bot, storage=memory_storage)
state = FSMContext(memory_storage, chat=0, user=0)
def in_db(user_id):
con = sqlite3.connect('data.db')
cur = con.cursor()
cur.execute('SELECT * FROM users WHERE user_id = ?', (user_id,))
data = cur.fetchone()
con.close()
if data is None:
return 0
else:
return 1
def add_to_db(user_id, user_name, zone_id):
con = sqlite3.connect('data.db')
cur = con.cursor()
cur.execute('INSERT INTO users (user_id, user_name, zone_id) VALUES (?, ?, ?)', (user_id, user_name, zone_id))
con.commit()
con.close()
@dp.message_handler(commands=['start'])
async def start_handler(m: types.Message):
if not await is_user_registered(m.from_user.id):
# If user is not registered, show registration buttons
register_btn = InlineKeyboardButton('Зарегистрировать User, Zone ID', callback_data='register')
already_registered_btn = InlineKeyboardButton('Уже зарегистрирован', callback_data='already_registered')
keyboard = InlineKeyboardMarkup(row_width=1)
keyboard.add(register_btn, already_registered_btn)
await m.answer('Приветствую! Вы не зарегистрированы в системе. Нажмите на одну из кнопок ниже, чтобы продолжить.', reply_markup=keyboard)
else:
await m.answer(f'Вы уже зарегистрированы в системе, ваш User ID: {m.from_user.id}')
@dp.callback_query_handler(lambda c: c.data == 'already_registered')
async def already_registered_handler(c: CallbackQuery):
user_id = c.from_user.id
conn = sqlite3.connect('data.db')
cursor = conn.cursor()
cursor.execute('SELECT id FROM users WHERE id = ?', (user_id,))
result = cursor.fetchone()
if result:
cursor.execute('SELECT is_registered FROM users WHERE id = ?', (user_id,))
is_registered = cursor.fetchone()[0]
if is_registered == 1:
await c.answer('Вы уже зарегистрированы')
else:
await c.answer('Ошибка: вы не зарегистрированы')
else:
await c.answer('Ошибка: вы не зарегистрированы')
conn.close()
@dp.callback_query_handler(text='register')
async def register_handler(callback_query: types.CallbackQuery):
await bot.answer_callback_query(callback_query.id)
await bot.send_message(callback_query.from_user.id, 'Введите свой User ID:')
await RegisterState.ID.set()
@dp.message_handler(state=RegisterState.ID)
async def process_user_id(m: types.Message, state: FSMContext):
user_id = m.text
await state.update_data(user_id=user_id)
await bot.send_message(m.chat.id, f'Ваш User ID правильный? {user_id}', reply_markup=InlineKeyboardMarkup(inline_keyboard=[
[InlineKeyboardButton("Правильный", callback_data="user_id_correct"), InlineKeyboardButton("Неправильный", callback_data="user_id_incorrect")]
]))
await state.set_state(RegisterState.WAITING_FOR_NAME)
@dp.callback_query_handler(lambda c: c.data == 'user_id_correct', state=RegisterState.WAITING_FOR_NAME)
async def process_correct_user_id(callback_query: types.CallbackQuery, state: FSMContext):
await bot.answer_callback_query(callback_query.id)
await bot.send_message(callback_query.message.chat.id, 'Отлично! Теперь введите ваш ZONE ID.')
await state.set_state(RegisterState.ZONE_ID)
@dp.callback_query_handler(lambda c: c.data == 'user_id_incorrect', state=RegisterState.WAITING_FOR_NAME)
async def process_incorrect_user_id(callback_query: types.CallbackQuery, state: FSMContext):
await bot.answer_callback_query(callback_query.id)
await bot.send_message(callback_query.message.chat.id, 'Попробуйте отправить ID еще раз')
await state.set_state(RegisterState.ID)
channels = ['PROVEROCHKAGOV', 'govnosobakizhopa']
@dp.message_handler(state=RegisterState.ZONE_ID)
async def process_zone_id(m: types.Message):
zone_id = m.text.strip()
await register_user(m.from_user.id, zone_id)
keyboard = InlineKeyboardMarkup()
keyboard.add(
InlineKeyboardButton('Канал 1', url='https://t.me/PROVEROCHKAGOV'),
InlineKeyboardButton('Канал 2', url='https://t.me/govnosobakizhopa')
)
keyboard.add(
InlineKeyboardButton('Проверить подписку', callback_data='check_subscription')
)
await m.answer(
f'Вы ввели зону с id {zone_id}. Выберите один из каналов, чтобы подписаться:',
reply_markup=keyboard
)
# проверяем, зарегистрирован ли пользователь
if not await is_user_registered(m.from_user.id):
# если пользователь не зарегистрирован, отправляем сообщение о необходимости регистрации
await m.answer('Вы не зарегистрированы в системе, нажмите /start чтобы начать')
return
@dp.callback_query_handler(lambda callback_query: callback_query.data == 'check_subscription')
async def process_check_subscription(callback_query: CallbackQuery):
user_id = callback_query.from_user.id
try:
# Check if user is registered
if not is_user_registered(user_id):
await bot.send_message(chat_id=callback_query.message.chat.id,
text="Вы не зарегистрированы в системе, нажмите /start чтобы начать")
return
# Get channel names and IDs from the zone the user is subscribed to
zone_id = get_user_zone(user_id)
channel_info = get_channel_info_by_zone_id(zone_id)
if not channel_info:
await bot.send_message(chat_id=callback_query.message.chat.id,
text="Ошибка: нет информации о каналах для данной зоны")
return
subscribed_channels = []
for channel in channel_info:
try:
chat_member = await bot.get_chat_member(chat_id=channel["channel_id"], user_id=user_id)
if chat_member.status == "member":
subscribed_channels.append(channel["channel_name"])
except TelegramError as e:
print(e)
if subscribed_channels:
await bot.send_message(chat_id=callback_query.message.chat.id,
text=f"Вы подписаны на следующие каналы: {', '.join(subscribed_channels)}")
else:
await bot.send_message(chat_id=callback_query.message.chat.id,
text="Вы не подписаны ни на один канал из данной зоны")
await bot.answer_callback_query(callback_query.id, text="Подписка проверена")
except Exception as e:
print(e)
await bot.send_message(chat_id=callback_query.message.chat.id,
text="Произошла ошибка при проверке подписки")
async def check_subscription(user_id: int, callback_query: CallbackQuery):
CHANNEL_1_ID = '@PROVEROCHKAGOV'
CHANNEL_2_ID = '@govnosobakizhopa'
if not await is_user_registered(user_id):
await bot.send_message(chat_id=user_id, text="Вы не зарегистрированы в системе, нажмите /start чтобы начать")
return
channel1 = await bot.get_chat_member(chat_id=CHANNEL_1_ID, user_id=user_id)
channel2 = await bot.get_chat_member(chat_id=CHANNEL_2_ID, user_id=user_id)
if channel1.status == 'left' or channel2.status == 'left' or channel1.status == 'kicked' or channel2.status == 'kicked':
await bot.send_message(chat_id=user_id, text="Вы не подписаны на все каналы!")
return
await bot.send_message(chat_id=user_id, text="Вы подписаны на все каналы!")
await bot.answer_callback_query(callback_query.id, text="Вы проверили подписку.")
@dp.message_handler(text='/admin')
async def admin(m: types.Message):
await m.answer('Админка:\n'
'/random - выбрать рандомного участника'
)
@dp.message_handler(text='/random')
async def random(m: types.Message):
user = conn.execute('''SELECT * FROM users ORDER BY RANDOM() LIMIT 1;''')
user = user.fetchall()[0][0]
await m.reply(f'<a href="tg://user?id={user}">Победитель</a>',parse_mode='html')
if __name__ == '__main__':
from aiogram.utils import executor
executor.start_polling(dp)