-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdatabase.py
More file actions
166 lines (143 loc) · 7.39 KB
/
Copy pathdatabase.py
File metadata and controls
166 lines (143 loc) · 7.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
"""Этот файл содержит функции для взаимодействия с базой данных SQLite.
Используется для хранения заметок и напоминаний пользователей"""
import sqlite3
import os
from datetime import datetime
import time
from dotenv import load_dotenv
import threading
# Загружаем переменные окружения из .env файла
load_dotenv()
# Путь к файлу базы данных
db_path = os.getenv("DATABASE_PATH")
# Создаём объект блокировки для безопасной работы с базой данных из разных потоков
db_lock = threading.Lock()
def init_db():
# Проверяет, что файл базы существует. Таблицы созданы вручную.
if not os.path.exists(db_path):
raise FileNotFoundError(f"База данных {db_path} не найдена.")
print("База данных найдена.")
def add_note(user_id, title, content):
# Добавление новой заметки
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
cursor.execute('INSERT INTO notes (user_id, title, content) VALUES (?, ?, ?)', (user_id, title, content))
note_id = cursor.lastrowid
conn.commit()
conn.close()
return note_id
def get_all_notes(user_id):
# Получение всех заметок пользователя
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
cursor.execute('SELECT id, title, content, created_at FROM notes WHERE user_id = ? ORDER BY created_at DESC', (user_id,)) # DESC - сортировка по столбцу в обратном порядке (от большего к меньшему)
#с помощью этого новые заметки будут первыми
notes = cursor.fetchall() # получает все строки, возвращённые предыдущим SQL-запросом
conn.close()
return notes
def delete_note(user_id, note_id):
# Удаление заметки пользователя
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
cursor.execute('DELETE FROM notes WHERE user_id = ? AND id = ?', (user_id, note_id))
conn.commit()
conn.close()
def get_all_reminders():
# Получение всех напоминаний
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
cursor.execute('SELECT id, user_id, note_id, reminder_time, message, is_sent FROM reminders')
reminders = cursor.fetchall()
conn.close()
return reminders
def mark_reminder_as_sent(reminder_id):
# Помечает напоминание как отправленное
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
cursor.execute('UPDATE reminders SET is_sent = TRUE WHERE id = ?', (reminder_id,))
conn.commit()
conn.close()
def delete_all_user_notes(user_id):
# Удаляет все заметки пользователя
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
cursor.execute('DELETE FROM notes WHERE user_id = ?', (user_id,))
conn.commit()
conn.close()
def add_reminder(user_id, note_id, reminder_time, message):
# Добавляет напоминание в БД
print(f"DEBUG: Добавляем напоминание в БД: user_id={user_id}, note_id={note_id}, time={reminder_time}, message={message}")
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
cursor.execute('''
INSERT INTO reminders (user_id, note_id, reminder_time, message)
VALUES (?, ?, ?, ?)
''', (user_id, note_id, reminder_time, message))
conn.commit()
conn.close()
print("DEBUG: Напоминание добавлено.")
def delete_reminder(reminder_id, user_id):
# Удаляет напоминание из БД (только если оно принадлежит пользователю)
with db_lock:
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
cursor.execute('DELETE FROM reminders WHERE id = ? AND user_id = ?', (reminder_id, user_id))
changes = cursor.rowcount # Сколько строк было удалено
conn.commit()
conn.close()
return changes > 0 # Возвращает True, если удаление прошло успешно
def get_user_reminders(user_id):
# Получение всех напоминаний пользователя
with db_lock:
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
cursor.execute('SELECT id, note_id, reminder_time, message, is_sent FROM reminders WHERE user_id = ?', (user_id,))
reminders = cursor.fetchall()
conn.close()
return reminders
def delete_all_user_reminders(user_id):
# Удаляет все напоминания пользователя
with db_lock:
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
cursor.execute('DELETE FROM reminders WHERE user_id = ?', (user_id,))
changes = cursor.rowcount
conn.commit()
conn.close()
return changes # Возвращает количество удалённых строк
def check_and_send_reminders(bot):
#Проверяет и отправляет напоминания
while True:
try:
reminders_list = get_all_reminders()
current_time = datetime.now()
for reminder in reminders_list:
reminder_id, user_id, note_id, reminder_time_str, message, is_sent = reminder
# Пропускаем уже отправленные напоминания
if is_sent:
continue
# Пытаемся распарсить время в одном из двух форматов
reminder_time = None
for fmt in ('%Y-%m-%d %H:%M:%S', '%d.%m.%Y %H:%M:%S'):
try:
reminder_time = datetime.strptime(reminder_time_str, fmt)
break # Если формат подошёл, выходим из цикла
except ValueError:
continue # Пробуем следующий формат
# Если не удалось распарсить, пропускаем это напоминание
if reminder_time is None:
print(f"Не удалось распарсить время: {reminder_time_str}")
continue
# Если время напоминания настало или уже прошло
if current_time >= reminder_time:
# Отправляем сообщение пользователю
try:
bot.send_message(user_id, f"Напоминание: {message}")
except Exception as e:
print(f"Ошибка отправки напоминания пользователю {user_id}: {e}")
# Помечаем напоминание как отправленное
mark_reminder_as_sent(reminder_id)
except Exception as e:
print(f"Ошибка при проверке напоминаний: {e}")
# Проверяем каждые 60 секунд
time.sleep(60)