Сделай проверку, что если айди игрока 6545459678, то в профиле у него будет еще одна инлайн кнопка, а именно "🔴 Заблокировать пользователя". Если он нажмет на инлайн кнопку, то, бот напишет ему сообщение "🔴 | Напишите айди игрока, которого вы хотите заблокировать. Или напишите cancel для отмены." Дальше, если игрок напишет cancel, то мы отменяем блокировку, а если напишет айди игрока, который зарегестрирован в боте, то, мы пишем "🟢 | Успешная блокировка!". А тому игроку, которого заблокировали, мы напишем: "⚠️🔴| Вы были заблокированы администратором. Теперь вы не имеете доступа к боту." Под данным сообщением будет инлайн кнопка "🍬 | Администратор". Если нажать на кнопку, то откроеться профиль игрока с айди 6545459678. А, что же значит блокировка? Если игрок захочет написать какую либо команду, даже кнопку из меню, или инлайн кнопку, мы отменяем действие выводим ему табличку: "⚠️🔴| Вы были заблокированы администратором. Теперь вы не имеете доступа к боту."

database.py:

import sqlite3
import datetime

def init_database():
    conn = sqlite3.connect('clicker.db')
    cursor = conn.cursor()

    cursor.execute('''
    CREATE TABLE IF NOT EXISTS users (
        user_id INTEGER PRIMARY KEY,
        simple_clicks INTEGER DEFAULT 0,
        super_clicks INTEGER DEFAULT 0,
        balance REAL DEFAULT 0.0,
        last_super_click TEXT
        is_blocked INTEGER DEFAULT 0,
        withdrawal_pending INTEGER DEFAULT 0,
        last_rejection_time TEXT
    )''')

    cursor.execute("PRAGMA table_info(users)")
    columns = [column[1] for column in cursor.fetchall()]

    
    if 'invited_friends' not in columns:
        cursor.execute('ALTER TABLE users ADD COLUMN invited_friends INTEGER DEFAULT 0')

    cursor.execute('''
    CREATE TABLE IF NOT EXISTS referrals (
        referrer_id INTEGER,
        referee_id INTEGER,
        UNIQUE(referrer_id, referee_id)
    )''')

    cursor.execute('''
    CREATE TABLE IF NOT EXISTS statistics (
        rowid INTEGER PRIMARY KEY AUTOINCREMENT,
        total_withdrawn REAL DEFAULT 0.0
    )
    ''')

    cursor.execute('INSERT OR IGNORE INTO statistics (rowid, total_withdrawn) VALUES (1, 0.0)')

    conn.commit()
    conn.close()

def update_total_withdrawn(amount):
    conn = sqlite3.connect('clicker.db')
    cursor = conn.cursor()

    cursor.execute('SELECT total_withdrawn FROM statistics WHERE rowid = 1')
    result = cursor.fetchone()

    if result is not None:
        updated_value = result[0] + amount
        if updated_value < 0:
            raise ValueError("Ошибка: Нельзя выводить больше, чем выплачено.")
        
        cursor.execute('UPDATE statistics SET total_withdrawn = ? WHERE rowid = 1', (updated_value,))
    else:
        raise ValueError("Ошибка: Нет начальной записи в таблице statistics")

    conn.commit()
    conn.close()

def get_total_withdrawn():
    conn = sqlite3.connect('clicker.db')
    cursor = conn.cursor()
    cursor.execute('SELECT total_withdrawn FROM statistics WHERE rowid = 1')
    result = cursor.fetchone()
    total_withdrawn = result[0] if result else 0.0  
    conn.close()
    return total_withdrawn

def can_request_withdrawal(user_id):
    conn = sqlite3.connect('clicker.db')
    cursor = conn.cursor()
    cursor.execute('SELECT last_rejection_time FROM users WHERE user_id = ?', (user_id,))
    result = cursor.fetchone()
    conn.close()

    if result and result[0]:
        last_rejection = datetime.datetime.fromisoformat(result[0])
        return (datetime.datetime.now() - last_rejection).total_seconds() >= 1800 
    return True

def get_bot_statistics():
    conn = sqlite3.connect('clicker.db')
    cursor = conn.cursor()

    cursor.execute('SELECT COUNT(*) FROM users')
    total_users = cursor.fetchone()[0] or 0

    cursor.execute('SELECT SUM(simple_clicks) FROM users')
    total_simple_clicks = cursor.fetchone()[0] or 0

    cursor.execute('SELECT SUM(super_clicks) FROM users')
    total_super_clicks = cursor.fetchone()[0] or 0

    cursor.execute('SELECT total_withdrawn FROM statistics WHERE rowid = 1')
    result = cursor.fetchone()
    total_withdrawn = result[0] if result else 0.0 
    
    conn.close()

    return total_users, total_simple_clicks, total_super_clicks, total_withdrawn
    
def reject_withdrawal(user_id):
    conn = sqlite3.connect('clicker.db')
    cursor = conn.cursor()
    now = datetime.datetime.now().isoformat()
    cursor.execute('UPDATE users SET withdrawal_pending = 0, last_rejection_time = ? WHERE user_id = ?', (now, user_id))
    conn.commit()
    conn.close()

def set_withdrawal_pending(user_id, state):
    conn = sqlite3.connect('clicker.db')
    cursor = conn.cursor()
    cursor.execute('UPDATE users SET withdrawal_pending = ? WHERE user_id = ?', (state, user_id))
    conn.commit()
    conn.close()

def is_withdrawal_pending(user_id):
    conn = sqlite3.connect('clicker.db')
    cursor = conn.cursor()
    cursor.execute('SELECT withdrawal_pending FROM users WHERE user_id = ?', (user_id,))
    result = cursor.fetchone()
    conn.close()
    return result[0] == 1

def block_user(user_id):
    conn = sqlite3.connect('clicker.db')
    cursor = conn.cursor()
    cursor.execute('UPDATE users SET is_blocked = 1 WHERE user_id = ?', (user_id,))
    conn.commit()
    conn.close()

def is_user_blocked(user_id):
    conn = sqlite3.connect('clicker.db')
    cursor = conn.cursor()
    cursor.execute('SELECT is_blocked FROM users WHERE user_id = ?', (user_id,))
    result = cursor.fetchone()
    conn.close()
    
    return result is not None and result[0] == 1

def add_referral(referrer_id, referee_id):
    conn = sqlite3.connect('clicker.db')
    cursor = conn.cursor()

    try:
        cursor.execute('INSERT INTO referrals (referrer_id, referee_id) VALUES (?, ?)', (referrer_id, referee_id))
        cursor.execute('UPDATE users SET invited_friends = invited_friends + 1, balance = balance + 3.0 WHERE user_id = ?', (referrer_id,))
        conn.commit()
    except sqlite3.IntegrityError:
        pass  

    conn.close()

def get_user_data(user_id):
    conn = sqlite3.connect('clicker.db')
    cursor = conn.cursor()

    cursor.execute('SELECT simple_clicks, super_clicks, balance, last_super_click, invited_friends FROM users WHERE user_id = ?', (user_id,))
    result = cursor.fetchone()

    if not result:
        cursor.execute('INSERT INTO users (user_id) VALUES (?)', (user_id,))
        conn.commit()
        return (0, 0, 0.0, None, 0) 
    else:
        return result

def update_click_data(user_id, click_type, value):
    conn = sqlite3.connect('clicker.db')
    cursor = conn.cursor()

    if click_type == 'simple':
        cursor.execute('UPDATE users SET simple_clicks = simple_clicks + 1, balance = balance + ? WHERE user_id = ?', (value, user_id))
    elif click_type == 'super':
        now = datetime.datetime.now().isoformat()
        cursor.execute('UPDATE users SET super_clicks = super_clicks + 1, balance = balance + ?, last_super_click = ? WHERE user_id = ?', (value, now, user_id))

    conn.commit()
    conn.close()

def can_super_click(last_super_click):
    if last_super_click is None:
        return True

    last_click_time = datetime.datetime.fromisoformat(last_super_click)
    now = datetime.datetime.now()

    return (now - last_click_time).days >= 1

main.py:

import telebot
import sqlite3
from tnik import TOKEN
from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton
from telebot.types import Message
from telebot import TeleBot
from message import (
    WELCOME_MESSAGE, EARN_BUTTON_TEXT, PROFILE_BUTTON_TEXT,
    NORMAL_CLICK_BUTTON, SUPER_CLICK_BUTTON,
    REFRESH_STATS_BUTTON, MAX_SUPER_CLICKS_MESSAGE, REFERRAL_BUTTON_TEXT
)
from button_job import create_earn_button
from database import init_database, get_user_data, reject_withdrawal, get_bot_statistics, get_total_withdrawn, update_total_withdrawn, update_click_data, can_super_click, add_referral, set_withdrawal_pending, is_withdrawal_pending, can_request_withdrawal
from referral_button import handle_referral

ADMIN_ID = 6545459678

bot = telebot.TeleBot(TOKEN)

init_database()

@bot.callback_query_handler(func=lambda call: call.data == "add_iris")
def ask_add_iris_amount(call):
    if call.from_user.id == ADMIN_ID:
        bot.send_message(call.message.chat.id, "🍬 | Сколько ирис вы хотите добавить? Отменить - cancel.")
        bot.register_next_step_handler(call.message, process_iris_amount)

def process_iris_amount(message):
    if message.text.lower() == 'cancel':
        bot.send_message(message.chat.id, "❌ Операция отменена.")
        return

    try:
        amount = float(message.text)
        update_total_withdrawn(amount)  
        total_withdrawn = get_total_withdrawn()
        
        bot.send_message(message.chat.id, f"✅ Выплачено всего: {total_withdrawn:.2f} Ирис 🍬 успешно обновлено.")
    except ValueError as e:
        bot.send_message(message.chat.id, f"❌ {str(e)}")
    except Exception as e:
        bot.send_message(message.chat.id, "❌ Пожалуйста, введите корректное число.")
        bot.register_next_step_handler(message, process_iris_amount)

def handle_profile(bot, message: Message):
    user_id = message.from_user.id
    simple_clicks, super_clicks, balance, _, invited_friends = get_user_data(user_id)  

    profile_message = (
        f"*🆔 ID:* `{user_id}`\n"
        f"*💰 Баланс:* {balance:.2f} Ирис 🍬\n\n"
        f"*🟢 Обычных кликов:* {simple_clicks}\n"
        f"*🔴 Супер кликов:* {super_clicks}\n"
        f"*👥 Друзей:* {invited_friends}" 
    )

    bot.send_message(
        message.chat.id,
        profile_message,
        parse_mode='Markdown',
        reply_markup=create_withdraw_button(balance)
    )
    

def create_withdraw_button(balance):
    markup = InlineKeyboardMarkup()
    formatted_balance = f"{balance:.2f}"
    withdraw_button = InlineKeyboardButton(f"📤 Вывести {formatted_balance} Ирис 🍬", callback_data='withdraw')
    markup.add(withdraw_button)
    return markup

@bot.callback_query_handler(func=lambda call: call.data == 'withdraw')
def handle_withdraw_request(call):
    user_id = call.from_user.id
    _, _, balance, _, _ = get_user_data(user_id)

    if balance < 100000:
        bot.answer_callback_query(call.id, "🚫 Минимальная сумма вывода: 100000 Ирис 🍬", show_alert=True)
    elif is_withdrawal_pending(user_id):
        bot.answer_callback_query(call.id, "🔴 | У вас уже есть текущий запрос на вывод.", show_alert=True)
    elif not can_request_withdrawal(user_id):
        bot.answer_callback_query(call.id, "🔴 | Ваш вывод был отклонен. Попробуйте позже.", show_alert=True)
    else:
        set_withdrawal_pending(user_id, 1)
        bot.answer_callback_query(call.id, "🟢 | Ваш запрос на вывод отправлен администратору.", show_alert=True)
        send_withdraw_request_to_admin(bot, user_id)
        
def send_withdraw_request_to_admin(bot, user_id):
    simple_clicks, super_clicks, balance, _, invited_friends = get_user_data(user_id)
    profile_message = (
        f"🟢 | [Пользователь](tg://user?id={user_id}) запросил вывод Ирис.\n\n"
        f"🆔 ID: {user_id}\n"
        f"💰 Баланс: {balance:.2f} Ирис 🍬\n\n"
        f"🟢 Обычных кликов: {simple_clicks}\n"
        f"🔴 Супер кликов: {super_clicks}\n"
        f"👥 Друзей: {invited_friends}"
    )
    markup = InlineKeyboardMarkup()
    approve_button = InlineKeyboardButton("🟢 | Одобрить вывод", callback_data=f'approve_withdraw_{user_id}')
    reject_button = InlineKeyboardButton("🔴 | Отклонить вывод", callback_data=f'reject_withdraw_{user_id}')
    markup.add(approve_button, reject_button)

    bot.send_message(ADMIN_ID, profile_message, parse_mode='Markdown', reply_markup=markup)

@bot.callback_query_handler(func=lambda call: call.data.startswith('reject_withdraw_'))
def callback_reject_withdraw(call):
    user_id = int(call.data.split('_')[2])
    reject_withdrawal(user_id)
    bot.send_message(call.message.chat.id, "🔴 | Вывод отклонен")
    bot.send_message(user_id, "🔴 | Ваш вывод был отклонен. Попробуйте через 30 минут.")

@bot.callback_query_handler(func=lambda call: call.data.startswith('reject_withdraw_'))
def callback_reject_withdraw(call):
    user_id = int(call.data.split('_')[2])
    set_withdrawal_pending(user_id, 0)
    bot.send_message(call.message.chat.id, "🔴 | Вывод отклонен")
    bot.send_message(user_id, "🔴 | Ваш вывод был отклонен. Попробуйте через 30 минут.")

@bot.callback_query_handler(func=lambda call: call.data.startswith('approve_withdraw_'))
def callback_approve_withdraw(call):
    user_id = int(call.data.split('_')[2])
    set_withdrawal_pending(user_id, 0)
    bot.send_message(call.message.chat.id, "🟢 | Сколько списать с баланса пользователя Ирис? Оставьте 0 если ничего.")
    bot.register_next_step_handler(call.message, process_withdraw_approval, user_id)

def process_withdraw_approval(message, user_id):
    try:
        amount = float(message.text)
        if amount > 0:
            conn = sqlite3.connect('clicker.db')
            cursor = conn.cursor()
            cursor.execute('UPDATE users SET balance = balance - ? WHERE user_id = ?', (amount, user_id))
            conn.commit()
            conn.close()

        bot.send_message(message.chat.id, f"🟢 | Вывод [Пользователя](tg://user?id={user_id}) был успешно проведен.", parse_mode='Markdown')
        bot.send_message(user_id, "🟢 | Ваш вывод был успешно проведен.")
    except ValueError:
        bot.send_message(message.chat.id, "🚫 Пожалуйста, введите корректное число.")
        bot.register_next_step_handler(message, process_withdraw_approval, user_id)

@bot.message_handler(content_types=['new_chat_members'])
def handle_new_chat_members(message):
    for member in message.new_chat_members:
        if member.id == bot.get_me().id:
            bot.leave_chat(message.chat.id)
            break

def handle_information(bot: TeleBot, message):
    total_users, total_simple_clicks, total_super_clicks, total_withdrawn = get_bot_statistics()
    
    info_message = (
        "*🌟 Старт бота: 09.11.2024*\n\n"
        f"*👥 Всего пользователей: {total_users}*\n"
        f"*🟢 Обычных кликов: {total_simple_clicks}*\n"
        f"*🔴 Супер кликов: {total_super_clicks}*\n"
        f"*💰 Выплачено всего: {total_withdrawn:.2f} Ирис 🍬*"
    )

    markup = InlineKeyboardMarkup()
    
    if message.from_user.id == ADMIN_ID:
        add_button = InlineKeyboardButton("🍬 | Добавить Ирис", callback_data="add_iris")
        markup.add(add_button)
    
    # Добавление кнопок для всех пользователей
    payouts_button = InlineKeyboardButton("💸 Выплаты", url="https://t.me/dsdsads")
    admin_button = InlineKeyboardButton("👮 Администратор", url="https://t.me/user?id=6545459678")
    developer_button = InlineKeyboardButton("🧑‍💻 Разработчик", callback_data="contact_developer")
    markup.add(payouts_button)
    markup.add(admin_button)
    markup.add(developer_button)

    bot.send_message(
        message.chat.id,
        info_message,
        parse_mode='Markdown',
        reply_markup=markup
    )

@bot.callback_query_handler(func=lambda call: call.data == "contact_developer")
def contact_developer(call):
    text = (
        "*⚠️ Обращаться к разработчику в случае:*\n\n"
        "*1. Если обнаружен баг (ошибка).*\n"
        "*2. У вас есть деловое предложение.*\n"
        "*3. Хотите иметь собственного бота.*\n"
        "*4. Запрещено спрашивать по поводу выплат.*"
    )
    markup = InlineKeyboardMarkup()
    developer_contact_button = InlineKeyboardButton("🧑‍💻 Разработчик", url="https://t.me/user?id=6545459678")
    markup.add(developer_contact_button)

    bot.send_message(
        call.message.chat.id,
        text,
        parse_mode='Markdown',
        reply_markup=markup
    )

def create_inline_buttons():
    markup = InlineKeyboardMarkup()
    normal_click_button = InlineKeyboardButton(NORMAL_CLICK_BUTTON, callback_data='normal_click')
    super_click_button = InlineKeyboardButton(SUPER_CLICK_BUTTON, callback_data='super_click')
    markup.row(normal_click_button, super_click_button)

    refresh_button = InlineKeyboardButton(REFRESH_STATS_BUTTON, callback_data='refresh')
    markup.add(refresh_button)

    return markup

@bot.message_handler(func=lambda m: m.text == "📚 Информация")
def send_information(message):
    handle_information(bot, message)


@bot.message_handler(commands=['start'])
def send_welcome(message):
    referrer_id = None
    if len(message.text.split()) > 1:
        referrer_id = int(message.text.split()[1])
        
        if referrer_id != message.from_user.id:
            add_referral(referrer_id, message.from_user.id)

    bot.send_message(
        message.chat.id,
        f"*{WELCOME_MESSAGE}*",
        parse_mode='Markdown',
        reply_markup=create_earn_button()
    )

@bot.message_handler(func=lambda m: m.text == REFERRAL_BUTTON_TEXT)
def send_referral_message(message):
    handle_referral(bot, message)

@bot.message_handler(func=lambda m: m.text == EARN_BUTTON_TEXT)
def send_earn_message(message):
    user_id = message.from_user.id
    simple_clicks, super_clicks, balance, _, _ = get_user_data(user_id)

    earn_message = (
        f"За каждый простой клик вы получите: 0.005 Ирис 🍬 🟢\n"
        f"За каждый супер клик вы получите: 0.2 Ирис 🍬 🔴\n\n"
        f"*Всего простых кликов: {simple_clicks} 🟢*\n"
        f"*Всего супер кликов: {super_clicks} 🔴*"
    )

    bot.send_message(
        message.chat.id,
        earn_message,
        parse_mode='Markdown',
        reply_markup=create_inline_buttons()
    )


@bot.message_handler(func=lambda m: m.text == PROFILE_BUTTON_TEXT)
def show_profile(message):
    handle_profile(bot, message)

@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
    user_id = call.from_user.id
    simple_clicks, super_clicks, balance, last_super_click, _ = get_user_data(user_id)

    if call.data == 'normal_click':
        update_click_data(user_id, 'simple', 0.005)
        bot.answer_callback_query(call.id, "Добавлено 0.005 Ирис")

    elif call.data == 'super_click':
        if super_clicks >= 5 and not can_super_click(last_super_click):
            bot.answer_callback_query(call.id, MAX_SUPER_CLICKS_MESSAGE, show_alert=True)
        else:
            update_click_data(user_id, 'super', 0.2)
            bot.answer_callback_query(call.id, "Добавлено 0.2 Ирис")

    elif call.data == 'refresh':
        simple_clicks, super_clicks, balance, _, _ = get_user_data(user_id)
        new_earn_message = (
            f"За каждый простой клик вы получите: 0.005 Ирис 🍬 🟢\n"
            f"За каждый супер клик вы получите: 0.2 Ирис 🍬 🔴\n\n"
            f"*Всего простых кликов: {simple_clicks} 🟢*\n"
            f"*Всего супер кликов: {super_clicks} 🔴*"
        )

        try:
            bot.edit_message_text(
                chat_id=call.message.chat.id,
                message_id=call.message.message_id,
                text=new_earn_message,
                parse_mode='Markdown',
                reply_markup=create_inline_buttons()
            )
        except telebot.apihelper.ApiTelegramException as e:
            if "message is not modified" in str(e):
                pass
            else:
                raise

if __name__ == '__main__':
    bot.polling(none_stop=True)