144 lines
6.7 KiB
Python
144 lines
6.7 KiB
Python
import sqlite3
|
||
import configparser
|
||
import os
|
||
import sys
|
||
import random
|
||
|
||
config_path = os.path.join(sys.path[0], 'settings.ini')
|
||
config = configparser.ConfigParser()
|
||
config.read(config_path)
|
||
LOGS = config.getboolean('Settings', 'logs')
|
||
IMPORTANT_LOGS = config.get('Telegram', 'important_logs')
|
||
|
||
|
||
class BotDB:
|
||
|
||
def __init__(self, db_file):
|
||
self.conn = sqlite3.connect(db_file, check_same_thread=False)
|
||
self.cursor = self.conn.cursor()
|
||
|
||
def get_message_from_db(self, type: str, username):
|
||
"""Функция для запроса к базе данных и получения сообщений для бота. В аргументы передаются:
|
||
type - тип получаемой обратной связи, строковое значение, сохраненное в БД
|
||
username - имя пользователя
|
||
"""
|
||
# Подключаемся к базе
|
||
try:
|
||
cursor = self.conn.cursor()
|
||
cursor.execute(f"SELECT * FROM messages WHERE type=?", (type,))
|
||
# Забираем данные из таблицы, преобразуем в строку, заменяем поле username на имя пользователя,
|
||
# и вместо амберсанда подставляем перенос строки
|
||
if type == 'connect_with_admin' or type == 'del_message' or type == 'suggest_news' or type == 'start_message':
|
||
response_from_database = str(cursor.fetchone()[1]).replace('username', username).replace('&', '\n')
|
||
else:
|
||
response_from_database = str(cursor.fetchone()[1]).replace('&', '\n')
|
||
return response_from_database
|
||
except sqlite3.Error as error:
|
||
print(error)
|
||
|
||
def get_error_message_from_db(self, id: int):
|
||
"""Функция для запроса к базе данных и получения сообщений ошибки. В аргументы передаются:
|
||
id - идентификатор ошибки
|
||
"""
|
||
# Подключаемся к базе
|
||
try:
|
||
cursor = self.conn.cursor()
|
||
cursor.execute(f"SELECT * FROM error_messages WHERE id=?", (id,))
|
||
response_from_database = str(cursor.fetchone()[1])
|
||
return response_from_database
|
||
except sqlite3.Error as error:
|
||
print(error)
|
||
|
||
def add_new_user_in_db(self, user_id, first_name, full_name, username, is_bot, language_code, date_added, date_changed):
|
||
"""Добавляем юзера в базу"""
|
||
try:
|
||
self.cursor.execute("INSERT INTO 'our_users' ('user_id', 'first_name', 'full_name', 'username', 'is_bot', "
|
||
"'language_code', 'date_added', 'date_changed') VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
|
||
(user_id, first_name, full_name,
|
||
username,is_bot,language_code,date_added,date_changed))
|
||
return self.conn.commit()
|
||
except sqlite3.Error as error:
|
||
print(error)
|
||
|
||
|
||
def user_exists(self, user_id):
|
||
"""Проверяем, есть ли юзер в базе"""
|
||
try:
|
||
result = self.cursor.execute("SELECT `id` FROM `our_users` WHERE `user_id` = ?", (user_id,))
|
||
return bool(len(result.fetchall()))
|
||
except sqlite3.Error as error:
|
||
print(error)
|
||
|
||
|
||
def get_user_id(self, user_id):
|
||
"""Достаем id юзера в базе по его user_id"""
|
||
try:
|
||
result = self.cursor.execute("SELECT `id` FROM `our_users` WHERE `user_id` = ?", (user_id,))
|
||
return result.fetchone()[0]
|
||
except sqlite3.Error as error:
|
||
print(error)
|
||
|
||
|
||
def get_user_first_name(self, user_id):
|
||
try:
|
||
result = self.cursor.execute("SELECT `first_name` FROM `our_users` WHERE `user_id` = ?", (user_id,))
|
||
return result.fetchone()[0]
|
||
except sqlite3.Error as error:
|
||
print(error)
|
||
|
||
|
||
def change_name(self, user_id):
|
||
#TODO: реализовать функцию изменения имени пользователя по которому к нему обращается бот. ОБновляем поля first_name, date_changed
|
||
#result = self.cursor.execute("UPDATE 'our_users' SET (?) WHERE user_id = (?)", (new_user_name), )
|
||
pass
|
||
|
||
def add_audio_record(self, file_name, author_id, date_added, listen_count, file_id):
|
||
"""Добавляет информацию о войсе юзера в БД"""
|
||
try:
|
||
result = self.cursor.execute("INSERT INTO `audio_message_reference` (file_name, author_id, date_added, listen_count, file_id) VALUES (?, ?, ?, ?, ?)", (file_name, author_id, date_added, listen_count, file_id))
|
||
return self.conn.commit()
|
||
except sqlite3.Error as error:
|
||
print(error)
|
||
|
||
def get_last_user_audio_record(self, user_id):
|
||
"""Получает данные о количестве записей пользователя"""
|
||
try:
|
||
result = self.cursor.execute("SELECT `file_id` FROM `audio_message_reference` WHERE `author_id` = ?", (user_id,))
|
||
return bool(len(result.fetchall()))
|
||
except sqlite3.Error as error:
|
||
print(error)
|
||
|
||
def get_id_for_audio_record(self, user_id):
|
||
"""Получает ID аудио сообщения пользователя"""
|
||
try:
|
||
result = self.cursor.execute("SELECT `file_id` FROM `audio_message_reference` WHERE `author_id` = ? ORDER BY date_added DESC LIMIT 1",
|
||
(user_id,))
|
||
return result.fetchone()[0]
|
||
except sqlite3.Error as error:
|
||
print(error)
|
||
|
||
def get_path_for_audio_record(self, user_id):
|
||
"""Получает данные о названии файла"""
|
||
try:
|
||
result = self.cursor.execute("SELECT `file_name` FROM `audio_message_reference` WHERE `author_id` = ? ORDER BY date_added DESC LIMIT 1", (user_id,))
|
||
return result.fetchone()[0]
|
||
except sqlite3.Error as error:
|
||
print(error)
|
||
|
||
def get_random_audio(self, user_id):
|
||
"""Получает данные о войсе юзера из БД"""
|
||
try:
|
||
file_name = self.cursor.execute(
|
||
"SELECT `file_name` FROM `audio_message_reference` WHERE `author_id` <> ?", (user_id,))
|
||
file_name_massive = file_name.fetchall()
|
||
number_element = random.randint(0, len(file_name_massive)-1)
|
||
audio_for_user = file_name_massive[number_element]
|
||
return audio_for_user
|
||
except sqlite3.Error as error:
|
||
print(error)
|
||
|
||
def close(self):
|
||
"""Закрываем соединение с БД"""
|
||
self.conn.close()
|
||
|