Добавить в корзинуПозвонить
Найти в Дзене

Как я сделал бота-напоминателя для Code Review сидя в поликлинике

Как я сделал бота-напоминателя для Code Review сидя в поликлинике С ребятами вроде как договорились установить окна для ревью, и все согласились, но осталась проблема, которая видна не только из-за этих договоренностей. Как я люблю говорить: «Проблема любых законов — это отсутствие регулирующего органа». Так же и с договоренностями: если некому следить, то они могут быстро кануть в лету. Это чисто человеческая проблема, и исправить её может только привычка. А привычку нужно вырабатывать. Это как в Англии ввели закон, что нужно убирать за собаками, и пока не установили большие штрафы и не начали штрафовать всех, привычка не сформировалась. А сейчас не то что привычка — уже сформировался стереотип. Вот что я сделал за 2 часа сидя в поликлинике и ожидая повторной сдачи крове на инсулинорезистентность 🙃: 0️⃣ Взял сервер за ˜1200₽ в месяц Выбрал Yandex Cloud — дают 4000₽ на тесты. Самый простой инстанс: 🔘1 ядро 🔘1 ГБ RAM 🔘10 ГБ диска 1️⃣ Создал бота за 2 минуты Просто написал @BotF

Как я сделал бота-напоминателя для Code Review сидя в поликлинике

С ребятами вроде как договорились установить окна для ревью, и все согласились, но осталась проблема, которая видна не только из-за этих договоренностей.

Как я люблю говорить: «Проблема любых законов — это отсутствие регулирующего органа». Так же и с договоренностями: если некому следить, то они могут быстро кануть в лету. Это чисто человеческая проблема, и исправить её может только привычка. А привычку нужно вырабатывать. Это как в Англии ввели закон, что нужно убирать за собаками, и пока не установили большие штрафы и не начали штрафовать всех, привычка не сформировалась. А сейчас не то что привычка — уже сформировался стереотип.

Вот что я сделал за 2 часа сидя в поликлинике и ожидая повторной сдачи крове на инсулинорезистентность 🙃:

0️⃣ Взял сервер за ˜1200₽ в месяц

Выбрал Yandex Cloud — дают 4000₽ на тесты. Самый простой инстанс:

🔘1 ядро

🔘1 ГБ RAM

🔘10 ГБ диска

1️⃣ Создал бота за 2 минуты

Просто написал @BotFather в Telegram:

/newbot

Имя: ReviewReminderBot

Юзернейм: ReviewReminder

Получил токен — это как пароль для управления ботом.

2️⃣ Написал простой скрипт на Node.js

Вот самая важная часть — напоминания:

function setReminder(timeStr, windowName) {

const [startTime] = timeStr.split('-');

const [hours, minutes] = startTime.split(':').map(Number);

const now = new Date();

const reminderTime = new Date();

reminderTime.setHours(hours, minutes - 10, 0, 0);

if (reminderTime < now) {

reminderTime.setDate(reminderTime.getDate() + 1);

}

const timeoutMs = reminderTime - now;

const timeoutId = setTimeout(() => {

sendToChat(`⏰ Через 10 минут начинается ${windowName} окно PR (${timeStr})! @all`);

setReminder(timeStr, windowName);

}, timeoutMs);

state.reminders.add(timeoutId);

}

3️⃣ Обработчик команды:

bot.command('set_windows', (ctx) => {

const args = ctx.message.text.split(' ').slice(1);

clearAllReminders();

if (args.length === 0 || args.length > 2) {

return ctx.reply(

'❌ Укажите одно или два окна. Примеры:\n' +

'/set_windows 10:00-11:00\n' +

'/set_windows 10:00-11:00 18:00-19:00'

);

}

if (!args.every(isValidTimeWindow)) {

return ctx.reply('❌ Неверный формат времени. Используйте: HH:MM-HH:MM');

}

state.windows = {

morning: args[0],

evening: args.length > 1 ? args[1] : null

};

state.chatId = ctx.chat.id;

setReminder(state.windows.morning, 'утреннее');

if (state.windows.evening) {

setReminder(state.windows.evening, 'вечернее');

}

let response = '🕒 Установлены окна для PR:\n';

response += `☀️ Утро: ${state.windows.morning}\n`;

if (state.windows.evening) {

response += `🌙 Вечер: ${state.windows.evening}\n`;

}

response += '\nЯ буду напоминать за 10 минут до начала!';

ctx.reply(response);

if (ctx.chat.id !== TARGET_CHAT_ID) {

sendToChat(response + '\n@all');

}

});

4️⃣ Запустили и забыли

Использовали PM2, чтобы бот работал всегда:

pm2 start index.js --name review-bot --watch

pm2 save

pm2 startup

5️⃣ .env

Не забываем указать переменные. Их указываем только на сервере и не коммитем в git.

Помним - id чата группы всегда отрицательно число!

BOT_TOKEN=ваш_токен

TARGET_CHAT_ID=id чатик

Теперь наш бот:

⭐️Каждый день сам пинает команду перед ревью

⭐️Работает, даже если сервер перезагрузился

⭐️Может пережить мелкие баги (--watch перезапускает при ошибках)

Фишка в том, что весь код — это буквально чуть больше 150 строк (я выложил его на GitHub).

Попробуй повторить — и твоя команда тоже забудет, что такое "ой, я не успел посмотреть PR". А если будут вопросы — пиши, помогу разобраться! 🙃

#Разработка #TelegramBot #JavaScript