Проблему решил, но пришлось почти заново начинать проект. Спасибо вот этому гайду - по нему переделывал обращения к БД и редактирование в ней.
Я реализовал два метода удаления. По команде и по определённым словам. Вот какой код поучился, может кому полезно будет:
import telebot
from telebot import types
import sqlite3
from subscribers_db import SubscribersDB
db = sqlite3.connect('subscribers.db', check_same_thread=False)
cursor = db.cursor()
cursor.execute("""CREATE TABLE IF NOT EXISTS subscribers(chatid TEXT)""") # создаем таблицу users с полем chatid
db.commit()
bot = telebot.TeleBot('токен)
def handle_stop_command(message):
chatid = message.chat.id
# Удаление пользователя из базы данных
db = sqlite3.connect('subscribers.db')
cursor = db.cursor()
cursor.execute("DELETE FROM subscribers WHERE chatid=?", (chatid,))
db.commit()
db.close()
# Отправка сообщения о том, что пользователь отписан
bot.send_message(chatid, "Ви відписалися від бота. Щоб підписатися знову, скористайтесь командою /start.")
# Обработчик команды /start
## ...тут всякая стартовая фигня
cursor.execute(f"SELECT chatid FROM subscribers WHERE chatid = '{message.chat.id}'") # проверяем, есть ли такая запись в таблице
if cursor.fetchone() is None: # если такой записи нет, то:
cursor.execute(f"INSERT INTO subscribers VALUES(?)", (message.chat.id,)) # вставляем айди пользователя в таблицу subscribers
bot.send_message(chatid, "Оберіть, що Вас цікавить")
db.commit() # сохраняем таблицу
else:
bot.send_message(chatid, "Ви вже підписані на бота. Оберіть, що Вас цікавить")
# Обработчик для кнопки types.InlineKeyboardButton(" Відписатися", callback_data="stop")
@bot.callback_query_handler(func=lambda call: call.data == "stop")
def handle_stop_callback(call):
chatid = call.message.chat.id
# Удаление пользователя из базы данных
db = sqlite3.connect('subscribers.db')
cursor = db.cursor()
cursor.execute("DELETE FROM subscribers WHERE chatid=?", (chatid,))
db.commit()
db.close()
# Отправка сообщения о том, что пользователь отписан
bot.send_message(chatid, "Ви відписалися від бота. Щоб підписатися знову, скористайтесь командою /start.")
# Обработчик для удаления подписчика по словам
@bot.message_handler(func=lambda message: message.text.lower() in ["стоп", "пнх", "stop", "Стоп", "Stop"])
def check_subscriber_status(message):
cursor.execute("SELECT chatid FROM subscribers WHERE chatid = ?", (message.chat.id,))
user_exists = cursor.fetchone()
if user_exists:
cursor.execute("DELETE FROM subscribers WHERE chatid = ?", (message.chat.id,))
db.commit()
bot.send_message(message.chat.id, "Ви відписалися від бота. Щоб підписатися знову, скористайтесь командою /start.")
else:
bot.send_message(message.chat.id, "Ви не підписані на бота. Щоб підписатися, скористайтесь командою /start.")
Спасибо всем за внимание. Это мой первый такой пост - раньше только гуглил и стеснялся обращаться за помощью. Теперь я понял, что сюда нужно более простые вопросы писать - а то что я хотел - это на фрилансе надо решать - ибо код надо глубоко и вдумчиво смотреть и беглые взгляды тут не помогут. Ну разве что гуру высочайшего уровня сможет так) Всем добра и мира!
def is_subscriber(self, chat_id):
self.cursor.execute("SELECT chat_id FROM subscribers WHERE chat_id = ?", (chat_id,))
subscriber = self.cursor.fetchone()
return subscriber is not None
но теперь выдаёт ошибку когда отправляю /start:
line 35, in is_subscriber
self.cursor.execute("SELECT chat_id FROM subscribers WHERE chat_id = ?", (chat_id,))
sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in that same thread. The object was created in thread id 5360 and this is thread id 5268.
Эта ошибка указывает на проблему с использованием объекта SQLite в разных потоках. Вот сижу дальше чешу репу)
Я реализовал два метода удаления. По команде и по определённым словам. Вот какой код поучился, может кому полезно будет:
Спасибо всем за внимание. Это мой первый такой пост - раньше только гуглил и стеснялся обращаться за помощью. Теперь я понял, что сюда нужно более простые вопросы писать - а то что я хотел - это на фрилансе надо решать - ибо код надо глубоко и вдумчиво смотреть и беглые взгляды тут не помогут. Ну разве что гуру высочайшего уровня сможет так) Всем добра и мира!