pre-deploy commit
This commit is contained in:
@@ -1,76 +1,49 @@
|
||||
# Исправление проблем с уведомлениями в боте
|
||||
# Структура скриптов в директории `/scripts`
|
||||
|
||||
Этот набор скриптов предназначен для исправления проблем с обработкой уведомлений в боте.
|
||||
Эта директория содержит вспомогательные скрипты для работы с Telegram Tinder Bot.
|
||||
|
||||
## Описание проблемы
|
||||
## Основные скрипты
|
||||
|
||||
После внедрения системы уведомлений и связанных с ней изменений в базе данных, возникла проблема с обработкой callback запросов. Бот перестал реагировать на все callback запросы, кроме тех, что связаны с уведомлениями.
|
||||
- `startup.sh` - Скрипт запуска бота в Docker-контейнере
|
||||
- `migrate-sync.js` - Синхронизация миграций базы данных
|
||||
- `createNotificationTables.js` - Создание таблиц для системы уведомлений
|
||||
- `add-hobbies-column.js` - Добавление колонки интересов в профиль
|
||||
- `create_profile_fix.js` - Исправление профилей пользователей
|
||||
- `createProfileViewsTable.js` - Создание таблицы для учета просмотров профилей
|
||||
- `update_bot_with_notifications.js` - Обновление бота с поддержкой уведомлений
|
||||
|
||||
Проблема вызвана следующими факторами:
|
||||
1. Отсутствие или неверная структура таблиц в базе данных для хранения уведомлений
|
||||
2. Отсутствие необходимых полей `state` и `state_data` в таблице `users`
|
||||
3. Отсутствие правильной регистрации обработчиков уведомлений в файле `bot.ts`
|
||||
## Директории
|
||||
|
||||
## Решение
|
||||
- `/legacy` - Устаревшие и тестовые скрипты, сохраненные для истории
|
||||
|
||||
Для решения проблемы были созданы следующие скрипты:
|
||||
## Использование скриптов
|
||||
|
||||
### 1. `fix_notification_callbacks.js`
|
||||
Проверяет и создает необходимые таблицы и столбцы в базе данных:
|
||||
- Таблицы `notifications`, `scheduled_notifications`, `notification_templates`
|
||||
- Столбцы `notification_settings`, `state`, `state_data` в таблице `users`
|
||||
Скрипты JavaScript можно запускать с помощью Node.js:
|
||||
|
||||
### 2. `update_bot_with_notifications.js`
|
||||
Обновляет файл `bot.ts`:
|
||||
- Добавляет импорт класса `NotificationHandlers`
|
||||
- Добавляет объявление поля `notificationHandlers` в класс `TelegramTinderBot`
|
||||
- Добавляет создание экземпляра `NotificationHandlers` в конструкторе
|
||||
- Добавляет регистрацию обработчиков уведомлений в методе `registerHandlers`
|
||||
```bash
|
||||
node scripts/script-name.js
|
||||
```
|
||||
|
||||
### 3. `fix_all_notifications.js`
|
||||
Запускает оба скрипта последовательно для полного исправления проблемы
|
||||
Bash скрипты должны быть сделаны исполняемыми:
|
||||
|
||||
## Как использовать
|
||||
```bash
|
||||
chmod +x scripts/script-name.sh
|
||||
./scripts/script-name.sh
|
||||
```
|
||||
|
||||
1. Остановите бота, если он запущен:
|
||||
```bash
|
||||
# Нажмите Ctrl+C в терминале, где запущен бот
|
||||
# или найдите процесс и завершите его
|
||||
```
|
||||
## Добавление новых скриптов
|
||||
|
||||
2. Запустите комплексный скрипт исправления:
|
||||
```bash
|
||||
node scripts/fix_all_notifications.js
|
||||
```
|
||||
При добавлении новых скриптов соблюдайте следующие правила:
|
||||
1. Используйте понятное имя файла, отражающее его назначение
|
||||
2. Добавьте комментарии в начало файла с описанием его функциональности
|
||||
3. Добавьте запись об этом скрипте в текущий файл README.md
|
||||
|
||||
3. После успешного выполнения скрипта перезапустите бота:
|
||||
```bash
|
||||
npm run start
|
||||
```
|
||||
## Скрипты миграций
|
||||
|
||||
## Проверка результата
|
||||
Миграции базы данных следует создавать с помощью команды:
|
||||
|
||||
После запуска бота убедитесь, что:
|
||||
1. Бот отвечает на все callback запросы (включая кнопки, не связанные с уведомлениями)
|
||||
2. Настройки уведомлений работают корректно (команда /notifications или кнопка в меню настроек)
|
||||
3. Уведомления о лайках, супер-лайках и новых матчах приходят пользователям
|
||||
```bash
|
||||
npm run migrate:create your_migration_name
|
||||
```
|
||||
|
||||
## Если проблемы остались
|
||||
|
||||
Если после выполнения всех шагов проблемы остались, выполните следующие проверки:
|
||||
|
||||
1. Проверьте логи бота на наличие ошибок
|
||||
2. Проверьте структуру базы данных:
|
||||
```sql
|
||||
\dt -- Список всех таблиц
|
||||
\d notifications -- Структура таблицы notifications
|
||||
\d scheduled_notifications -- Структура таблицы scheduled_notifications
|
||||
\d notification_templates -- Структура таблицы notification_templates
|
||||
\d users -- Убедитесь, что поля state, state_data и notification_settings существуют
|
||||
```
|
||||
|
||||
3. Проверьте код в файлах:
|
||||
- `src/bot.ts`: должен содержать импорт, создание и регистрацию `NotificationHandlers`
|
||||
- `src/handlers/callbackHandlers.ts`: должен правильно обрабатывать все callback-запросы
|
||||
|
||||
В случае обнаружения ошибок, исправьте их вручную и перезапустите бота.
|
||||
Это создаст файл миграции в директории `/migrations`.
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
// add-premium-columns.js
|
||||
// Скрипт для добавления колонок premium и premium_expires_at в таблицу users
|
||||
|
||||
const { Pool } = require('pg');
|
||||
|
||||
// Настройки подключения к базе данных - используем те же настройки, что и раньше
|
||||
const pool = new Pool({
|
||||
host: '192.168.0.102',
|
||||
port: 5432,
|
||||
database: 'telegram_tinder_bot',
|
||||
user: 'trevor',
|
||||
password: 'Cl0ud_1985!'
|
||||
});
|
||||
|
||||
async function addPremiumColumns() {
|
||||
try {
|
||||
console.log('Подключение к базе данных...');
|
||||
const client = await pool.connect();
|
||||
|
||||
console.log('Добавление колонок premium и premium_expires_at в таблицу users...');
|
||||
|
||||
// SQL запрос для добавления колонок
|
||||
const sql = `
|
||||
ALTER TABLE users
|
||||
ADD COLUMN IF NOT EXISTS premium BOOLEAN DEFAULT FALSE,
|
||||
ADD COLUMN IF NOT EXISTS premium_expires_at TIMESTAMP;
|
||||
`;
|
||||
|
||||
await client.query(sql);
|
||||
console.log('✅ Колонки premium и premium_expires_at успешно добавлены в таблицу users');
|
||||
|
||||
// Закрытие соединения
|
||||
client.release();
|
||||
await pool.end();
|
||||
console.log('Подключение к базе данных закрыто');
|
||||
} catch (error) {
|
||||
console.error('❌ Ошибка при добавлении колонок:', error);
|
||||
await pool.end();
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Запуск функции
|
||||
addPremiumColumns();
|
||||
@@ -1,40 +0,0 @@
|
||||
// add-premium-columns.js
|
||||
// Скрипт для добавления колонок premium и premium_expires_at в таблицу users
|
||||
|
||||
const { Client } = require('pg');
|
||||
|
||||
// Настройки подключения к базе данных
|
||||
const client = new Client({
|
||||
host: '192.168.0.102',
|
||||
port: 5432,
|
||||
user: 'trevor',
|
||||
password: 'Cl0ud_1985!',
|
||||
database: 'telegram_tinder_bot'
|
||||
});
|
||||
|
||||
async function addPremiumColumns() {
|
||||
try {
|
||||
await client.connect();
|
||||
console.log('Подключение к базе данных успешно установлено');
|
||||
|
||||
// SQL запрос для добавления колонок
|
||||
const sql = `
|
||||
ALTER TABLE users
|
||||
ADD COLUMN IF NOT EXISTS premium BOOLEAN DEFAULT FALSE,
|
||||
ADD COLUMN IF NOT EXISTS premium_expires_at TIMESTAMP;
|
||||
`;
|
||||
|
||||
await client.query(sql);
|
||||
console.log('Колонки premium и premium_expires_at успешно добавлены в таблицу users');
|
||||
|
||||
// Закрываем подключение
|
||||
await client.end();
|
||||
console.log('Подключение к базе данных закрыто');
|
||||
} catch (error) {
|
||||
console.error('Ошибка при добавлении колонок:', error);
|
||||
await client.end();
|
||||
}
|
||||
}
|
||||
|
||||
// Запуск функции
|
||||
addPremiumColumns();
|
||||
@@ -1,28 +0,0 @@
|
||||
// add-premium-columns.ts
|
||||
// Скрипт для добавления колонок premium и premium_expires_at в таблицу users
|
||||
|
||||
import { query } from '../src/database/connection';
|
||||
|
||||
async function addPremiumColumns() {
|
||||
try {
|
||||
console.log('Добавление колонок premium и premium_expires_at в таблицу users...');
|
||||
|
||||
// SQL запрос для добавления колонок
|
||||
const sql = `
|
||||
ALTER TABLE users
|
||||
ADD COLUMN IF NOT EXISTS premium BOOLEAN DEFAULT FALSE,
|
||||
ADD COLUMN IF NOT EXISTS premium_expires_at TIMESTAMP;
|
||||
`;
|
||||
|
||||
await query(sql);
|
||||
console.log('✅ Колонки premium и premium_expires_at успешно добавлены в таблицу users');
|
||||
|
||||
process.exit(0);
|
||||
} catch (error) {
|
||||
console.error('❌ Ошибка при добавлении колонок:', error);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Запуск функции
|
||||
addPremiumColumns();
|
||||
@@ -1,58 +0,0 @@
|
||||
// Скрипт для добавления колонки premium в таблицу users и установки premium для всех пользователей
|
||||
require('dotenv').config();
|
||||
const { Pool } = require('pg');
|
||||
|
||||
// Создаем пул соединений
|
||||
const pool = new Pool({
|
||||
user: process.env.DB_USERNAME,
|
||||
host: process.env.DB_HOST,
|
||||
database: process.env.DB_NAME,
|
||||
password: process.env.DB_PASSWORD,
|
||||
port: parseInt(process.env.DB_PORT || '5432')
|
||||
});
|
||||
|
||||
async function setAllUsersToPremium() {
|
||||
try {
|
||||
console.log('Проверяем наличие столбца premium в таблице users...');
|
||||
|
||||
const result = await pool.query(`
|
||||
SELECT EXISTS (
|
||||
SELECT FROM information_schema.columns
|
||||
WHERE table_schema = 'public'
|
||||
AND table_name = 'users'
|
||||
AND column_name = 'premium'
|
||||
);
|
||||
`);
|
||||
|
||||
if (!result.rows[0].exists) {
|
||||
console.log('🔄 Добавляем столбец premium...');
|
||||
await pool.query(`ALTER TABLE users ADD COLUMN premium BOOLEAN DEFAULT false;`);
|
||||
console.log('✅ Столбец premium успешно добавлен');
|
||||
} else {
|
||||
console.log('✅ Столбец premium уже существует');
|
||||
}
|
||||
|
||||
console.log('Устанавливаем премиум-статус для всех пользователей...');
|
||||
|
||||
const updateResult = await pool.query(`
|
||||
UPDATE users
|
||||
SET premium = true
|
||||
WHERE true
|
||||
RETURNING id, telegram_id, premium
|
||||
`);
|
||||
|
||||
console.log(`✅ Успешно установлен премиум-статус для ${updateResult.rows.length} пользователей:`);
|
||||
updateResult.rows.forEach(row => {
|
||||
console.log(`ID: ${row.id.substr(0, 8)}... | Telegram ID: ${row.telegram_id} | Premium: ${row.premium}`);
|
||||
});
|
||||
|
||||
console.log('🎉 Все пользователи теперь имеют премиум-статус!');
|
||||
} catch (error) {
|
||||
console.error('Ошибка при установке премиум-статуса:', error);
|
||||
} finally {
|
||||
await pool.end();
|
||||
console.log('Соединение с базой данных закрыто');
|
||||
}
|
||||
}
|
||||
|
||||
setAllUsersToPremium();
|
||||
@@ -1,73 +0,0 @@
|
||||
// Скрипт для установки премиум-статуса всем пользователям
|
||||
require('dotenv').config();
|
||||
const { Pool } = require('pg');
|
||||
|
||||
// Проверяем и выводим параметры подключения
|
||||
console.log('Параметры подключения к БД:');
|
||||
console.log('DB_USERNAME:', process.env.DB_USERNAME);
|
||||
console.log('DB_HOST:', process.env.DB_HOST);
|
||||
console.log('DB_NAME:', process.env.DB_NAME);
|
||||
console.log('DB_PASSWORD:', process.env.DB_PASSWORD ? '[указан]' : '[не указан]');
|
||||
console.log('DB_PORT:', process.env.DB_PORT);
|
||||
|
||||
// Создаем пул соединений
|
||||
const pool = new Pool({
|
||||
user: process.env.DB_USERNAME,
|
||||
host: process.env.DB_HOST,
|
||||
database: process.env.DB_NAME,
|
||||
password: process.env.DB_PASSWORD,
|
||||
port: parseInt(process.env.DB_PORT || '5432')
|
||||
});
|
||||
|
||||
async function setAllUsersToPremium() {
|
||||
try {
|
||||
console.log('Устанавливаем премиум-статус для всех пользователей...');
|
||||
|
||||
// Проверка соединения с БД
|
||||
console.log('Проверка соединения с БД...');
|
||||
const testResult = await pool.query('SELECT NOW()');
|
||||
console.log('✅ Соединение успешно:', testResult.rows[0].now);
|
||||
|
||||
// Проверка наличия столбца premium
|
||||
console.log('Проверяем наличие столбца premium в таблице users...');
|
||||
|
||||
const checkResult = await pool.query(`
|
||||
SELECT EXISTS (
|
||||
SELECT FROM information_schema.columns
|
||||
WHERE table_schema = 'public'
|
||||
AND table_name = 'users'
|
||||
AND column_name = 'premium'
|
||||
);
|
||||
`);
|
||||
|
||||
if (!checkResult.rows[0].exists) {
|
||||
console.log('🔄 Добавляем столбец premium...');
|
||||
await pool.query(`ALTER TABLE users ADD COLUMN premium BOOLEAN DEFAULT false;`);
|
||||
console.log('✅ Столбец premium успешно добавлен');
|
||||
} else {
|
||||
console.log('✅ Столбец premium уже существует');
|
||||
}
|
||||
|
||||
// Устанавливаем premium=true для всех пользователей
|
||||
const updateResult = await pool.query(`
|
||||
UPDATE users
|
||||
SET premium = true
|
||||
WHERE true
|
||||
RETURNING id, telegram_id, premium
|
||||
`);
|
||||
|
||||
console.log(`✅ Успешно установлен премиум-статус для ${updateResult.rows.length} пользователей:`);
|
||||
updateResult.rows.forEach(row => {
|
||||
console.log(`ID: ${row.id.substr(0, 8)}... | Telegram ID: ${row.telegram_id} | Premium: ${row.premium}`);
|
||||
});
|
||||
|
||||
console.log('🎉 Все пользователи теперь имеют премиум-статус!');
|
||||
} catch (error) {
|
||||
console.error('❌ Ошибка при установке премиум-статуса:', error);
|
||||
} finally {
|
||||
await pool.end();
|
||||
console.log('Соединение с базой данных закрыто');
|
||||
}
|
||||
}
|
||||
|
||||
setAllUsersToPremium();
|
||||
16
scripts/startup.sh
Normal file
16
scripts/startup.sh
Normal file
@@ -0,0 +1,16 @@
|
||||
#!/bin/sh
|
||||
# startup.sh - Script to run migrations and start the bot
|
||||
|
||||
echo "🚀 Starting Telegram Tinder Bot..."
|
||||
|
||||
# Wait for database to be ready
|
||||
echo "⏳ Waiting for database to be ready..."
|
||||
sleep 5
|
||||
|
||||
# Run database migrations
|
||||
echo "🔄 Running database migrations..."
|
||||
node dist/database/migrateOnStartup.js
|
||||
|
||||
# Start the bot
|
||||
echo "✅ Starting the bot..."
|
||||
node dist/bot.js
|
||||
Reference in New Issue
Block a user