✅ Регистрация и верификация жильцов ✅ Рейтинг активности (уровни) ✅ Детект шпионов (Score 0-100) ✅ Анти-мат система (3 предупреждения → бан) ✅ Админ-панель с рассылкой ✅ Учёт квартир (несколько жильцов) ✅ Телефоны экстренных служб и мастеров ✅ Еженедельный экспорт JSON ✅ Прокси (socks5) для обхода РКН Бекап: backups/versions/v1.0_mvp_2026-02-26/ Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
370 lines
10 KiB
Markdown
370 lines
10 KiB
Markdown
# 📅 Расписание отключений — v1.4
|
||
|
||
**Версия:** v1.4
|
||
**Дата:** 26 февраля 2026 г.
|
||
**Статус:** ✅ Реализовано
|
||
|
||
---
|
||
|
||
## 📋 Описание
|
||
|
||
Система управления расписанием плановых отключений (вода, свет, отопление, газ, лифт). Админ создаёт события, бот напоминает за 1 час до начала, жильцы всегда в курсе отключений.
|
||
|
||
---
|
||
|
||
## 🎯 Возможности
|
||
|
||
- ✅ Создание событий с типом, названием, временем
|
||
- ✅ 6 типов отключений (вода, свет, отопление, газ, лифт, общее)
|
||
- ✅ Inline-меню для выбора типа
|
||
- ✅ Пошаговое создание (тип → название → время → описание)
|
||
- ✅ Просмотр расписания командой `/график`
|
||
- ✅ Напоминание за 1 час до начала (авто)
|
||
- ✅ Удаление событий из расписания
|
||
- ✅ Emoji для каждого типа
|
||
|
||
---
|
||
|
||
## 📱 Команды
|
||
|
||
### Для администраторов:
|
||
|
||
| Команда | Описание | Пример |
|
||
|---------|----------|--------|
|
||
| `/schedule_add` | Добавить событие в расписание | `/schedule_add` |
|
||
| `/schedule_del <ID>` | Удалить событие по ID | `/schedule_del 5` |
|
||
|
||
### Для всех:
|
||
|
||
| Команда | Описание | Пример |
|
||
|---------|----------|--------|
|
||
| `/график` | Показать расписание отключений | `/график` |
|
||
| `/schedule` | Альтернатива `/график` | `/schedule` |
|
||
|
||
---
|
||
|
||
## 🎯 Сценарии использования
|
||
|
||
### Сценарий 1: Создание события (пошагово)
|
||
|
||
**1. Админ пишет:**
|
||
```
|
||
/schedule_add
|
||
```
|
||
|
||
**2. Бот показывает меню:**
|
||
```
|
||
📅 Добавление события в расписание
|
||
|
||
Выберите тип отключения:
|
||
|
||
1️⃣ 💧 Вода
|
||
2️⃣ ⚡ Электричество
|
||
3️⃣ 🔥 Отопление
|
||
4️⃣ 🔶 Газ
|
||
5️⃣ 🛗 Лифт
|
||
6️⃣ 📋 Общее
|
||
|
||
Или отправьте номер типа (1-6):
|
||
[кнопки с типами]
|
||
```
|
||
|
||
**3. Админ нажимает** `💧 Вода` **или отправляет** `1`
|
||
|
||
**4. Бот просит название:**
|
||
```
|
||
✅ Тип: 💧 Вода
|
||
|
||
Теперь отправьте название события:
|
||
Например: "Плановое отключение воды"
|
||
```
|
||
|
||
**5. Админ отправляет:**
|
||
```
|
||
Плановое отключение воды
|
||
```
|
||
|
||
**6. Бот просит время начала:**
|
||
```
|
||
✅ Название: Плановое отключение воды
|
||
|
||
Теперь отправьте дату и время НАЧАЛА в формате:
|
||
ДД.ММ.ГГГГ ЧЧ:ММ
|
||
|
||
Например: 27.02.2026 10:00
|
||
```
|
||
|
||
**7. Админ отправляет:**
|
||
```
|
||
27.02.2026 10:00
|
||
```
|
||
|
||
**8. Бот просит время окончания:**
|
||
```
|
||
✅ Начало: 27.02.2026 10:00
|
||
|
||
Теперь отправьте дату и время ОКОНЧАНИЯ:
|
||
ДД.ММ.ГГГГ ЧЧ:ММ
|
||
```
|
||
|
||
**9. Админ отправляет:**
|
||
```
|
||
27.02.2026 14:00
|
||
```
|
||
|
||
**10. Бот просит описание:**
|
||
```
|
||
✅ Окончание: 27.02.2026 14:00
|
||
|
||
Отправьте описание (необязательно) или нажмите "Пропустить":
|
||
[⏭️ Пропустить]
|
||
```
|
||
|
||
**11. Админ отправляет описание или пропускает:**
|
||
```
|
||
Будут отключены стояки с 1 по 10 этаж
|
||
```
|
||
|
||
**12. Бот подтверждает создание:**
|
||
```
|
||
✅ Событие добавлено в расписание!
|
||
|
||
💧 Вода — Плановое отключение воды
|
||
|
||
📅 Начало: 27.02.2026 10:00
|
||
📅 Окончание: 27.02.2026 14:00
|
||
⏱️ Длительность: 4.0 ч.
|
||
🔖 ID: 1
|
||
|
||
Для просмотра: /график
|
||
```
|
||
|
||
---
|
||
|
||
### Сценарий 2: Просмотр расписания
|
||
|
||
**Жилец:**
|
||
```
|
||
/график
|
||
```
|
||
|
||
**Бот:**
|
||
```
|
||
📅 Расписание отключений
|
||
|
||
1. 💧 Плановое отключение воды
|
||
└─ Тип: Вода
|
||
└─ Начало: 27.02.2026 10:00
|
||
└─ Окончание: 27.02.2026 14:00
|
||
└─ Длительность: 4.0 ч.
|
||
└─ Описание: Будут отключены стояки с 1 по 10 этаж
|
||
|
||
2. ⚡ Ремонт трансформатора
|
||
└─ Тип: Электричество
|
||
└─ Начало: 28.02.2026 09:00
|
||
└─ Окончание: 28.02.2026 17:00
|
||
└─ Длительность: 8.0 ч.
|
||
```
|
||
|
||
---
|
||
|
||
### Сценарий 3: Напоминание за 1 час
|
||
|
||
**За 1 час до события (автоматически):**
|
||
|
||
**Бот пишет в чат:**
|
||
```
|
||
⏰ Напоминание: отключение через 1 час!
|
||
|
||
💧 Плановое отключение воды
|
||
|
||
📅 Начало: 27.02.2026 10:00
|
||
📅 Окончание: 27.02.2026 14:00
|
||
⏱️ Длительность: 4.0 ч.
|
||
|
||
Не забудьте сделать запасы!
|
||
```
|
||
|
||
---
|
||
|
||
### Сценарий 4: Удаление события
|
||
|
||
**Админ:**
|
||
```
|
||
/schedule_del 1
|
||
```
|
||
|
||
**Бот:**
|
||
```
|
||
✅ Событие "Плановое отключение воды" удалено из расписания
|
||
```
|
||
|
||
---
|
||
|
||
## 🗄️ База данных
|
||
|
||
### Таблица `schedules`:
|
||
```sql
|
||
CREATE TABLE schedules (
|
||
schedule_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
schedule_type TEXT NOT NULL, -- water, electricity, heating...
|
||
title TEXT NOT NULL,
|
||
description TEXT,
|
||
start_time TIMESTAMP NOT NULL,
|
||
end_time TIMESTAMP NOT NULL,
|
||
created_by BIGINT,
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
reminder_sent BOOLEAN DEFAULT 0, -- Отправлено ли напоминание
|
||
is_active BOOLEAN DEFAULT 1,
|
||
FOREIGN KEY (created_by) REFERENCES users(user_id)
|
||
)
|
||
```
|
||
|
||
### Индексы:
|
||
- `ix_schedules_type` — по типу
|
||
- `ix_schedules_time` — по времени
|
||
- `ix_schedules_active` — по статусу
|
||
|
||
---
|
||
|
||
## 🧪 Тестирование
|
||
|
||
### Чек-лист проверки:
|
||
|
||
#### 1. Создание события
|
||
```bash
|
||
# Админ:
|
||
/schedule_add
|
||
# Выбрать тип, название, время
|
||
```
|
||
- [ ] Меню типов отображается
|
||
- [ ] Пошаговый ввод работает
|
||
- [ ] Событие сохранено в БД
|
||
|
||
#### 2. Просмотр расписания
|
||
```bash
|
||
/график
|
||
```
|
||
- [ ] События отображаются
|
||
- [ ] Emoji правильные
|
||
- [ ] Длительность считается верно
|
||
|
||
#### 3. Напоминание
|
||
```bash
|
||
# Создать событие которое начнётся через 1-1.5 часа
|
||
# Подождать до срабатывания планировщика
|
||
```
|
||
- [ ] Напоминание пришло за 1 час
|
||
- [ ] `reminder_sent` установлен в True
|
||
|
||
#### 4. Удаление
|
||
```bash
|
||
# Админ:
|
||
/schedule_del <ID>
|
||
```
|
||
- [ ] Событие удалено (is_active=False)
|
||
|
||
---
|
||
|
||
## 📁 Изменённые файлы
|
||
|
||
| Файл | Изменения |
|
||
|------|-----------|
|
||
| `database/models.py` | Модель Schedule |
|
||
| `database/migrate_add_schedules.py` | Миграция БД |
|
||
| `handlers/schedule.py` | Хендлеры расписания |
|
||
| `keyboards/inline.py` | Клавиатуры для расписания |
|
||
| `services/scheduler.py` | Напоминания |
|
||
| `handlers/__init__.py` | Импорт schedule_router |
|
||
| `main.py` | Регистрация schedule_router |
|
||
|
||
---
|
||
|
||
## 🚀 Как использовать
|
||
|
||
### Для админа:
|
||
|
||
1. **Добавить событие:**
|
||
```
|
||
/schedule_add
|
||
```
|
||
Далее следуй инструкциям бота.
|
||
|
||
2. **Посмотреть расписание:**
|
||
```
|
||
/график
|
||
```
|
||
|
||
3. **Удалить событие:**
|
||
```
|
||
/schedule_del 1
|
||
```
|
||
|
||
### Для жильца:
|
||
|
||
1. **Посмотреть расписание:**
|
||
```
|
||
/график
|
||
```
|
||
|
||
2. **Получить напоминание:**
|
||
- Автоматически за 1 час до начала
|
||
|
||
---
|
||
|
||
## 💡 Советы
|
||
|
||
### Типы отключений:
|
||
|
||
| Тип | Когда использовать |
|
||
|-----|-------------------|
|
||
| 💧 Вода | Отключение ХВС/ГВС |
|
||
| ⚡ Электричество | Ремонт сетей, трансформатора |
|
||
| 🔥 Отопление | Сезонное отключение, ремонт |
|
||
| 🔶 Газ | Профилактические работы |
|
||
| 🛗 Лифт | Ремонт лифта |
|
||
| 📋 Общее | Другие работы |
|
||
|
||
### Напоминания:
|
||
|
||
- Бот проверяет напоминания **каждый час**
|
||
- Напоминает **за 1 час** до начала
|
||
- Если событие создано меньше чем за 1 час — напоминание не отправляется
|
||
|
||
---
|
||
|
||
## 🔧 Отладка
|
||
|
||
### Посмотреть события в БД:
|
||
```bash
|
||
cd /home/matrixhasyou/domovoy_bot
|
||
source venv/bin/activate
|
||
sqlite3 database/domovoy.db
|
||
|
||
SELECT schedule_id, schedule_type, title, start_time, end_time, reminder_sent
|
||
FROM schedules
|
||
WHERE is_active = 1
|
||
ORDER BY start_time;
|
||
```
|
||
|
||
### Логи:
|
||
```bash
|
||
tail -f logs/bot.log | grep -i "напомин\|schedule"
|
||
```
|
||
|
||
---
|
||
|
||
## ✅ Преимущества
|
||
|
||
| Было | Стало |
|
||
|------|-------|
|
||
| Объявления в чате | **Расписание в боте** |
|
||
| Забывают про отключения | **Напоминание за 1 час** |
|
||
| Нет истории | **Сохранение в БД** |
|
||
| Ручное напоминание | **Авто-напоминания** |
|
||
|
||
---
|
||
|
||
**Расписание отключений готово! 📅**
|
||
|
||
*Следующий шаг: тестирование на тестовой группе и фиксация версии v1.4*
|