telegram/command-handlers/events-handler.js

const { getRedis } = require('../../services/redis');
const { getHealth } = require('../../services/health');
const { getScheduled } = require('../../discord/event-subscriber')

const getKey = (chat_id) => `telegram:${chat_id}:event_subscriber:guild_ids`;

/** @type {Intl.DateTimeFormatOptions} */
const general_options = {
    hour: '2-digit',
    minute: '2-digit',
    day: '2-digit',
    month: '2-digit',
}

const date_options = {
    'CET': { timeZone: 'CET', ...general_options },
    'NIC': { timeZone: 'Asia/Nicosia', ...general_options },
    'MOW': { timeZone: 'Europe/Moscow', ...general_options },
}

async function events(ctx) {
    if (getHealth('redis') != 'ready') return ['Временно не могу ответить, попробуйте позже'];
    const chat_id = ctx.chat.id;

    const redis = getRedis();
    if (!getRedis()) return ['Команда не поддерживается'];

    const exists = await redis.exists(getKey(chat_id));
    if (!exists) return [null, 'Этот чат ещё не подписан на эвенты, чтобы подписаться добавьте бота на сервер в дискорде и воспользуйтесь командой /subevents.'];

    const guild_ids = await redis.smembers(getKey(chat_id));
    if (!guild_ids.length) return [null, 'Этот чат ещё не подписан на эвенты, чтобы подписаться добавьте бота на сервер в дискорде и воспользуйтесь командой /subevents.'];

    /** @type {{ [guild_name: string]: any[] }} */
    const events_map = {};
    for (const guild_id of guild_ids) {
        const guild_events = await getScheduled(guild_id);
        if (!guild_events.length) continue;
        events_map[guild_events[0].guild_name] = guild_events;
    }

    if (!Object.keys(events_map).length) return [null, 'Нет запланированных эвентов'];

    let message = '';
    for (const [guild_name, events] of Object.entries(events_map)) {
        if (!events.length) continue;
        message += `<b>${guild_name}</b>\n`;
        for (const event of events.sort((a, b) => a.start - b.start)) {
            message += `- <b><a href="${event.event_url}">${event.event_name}</a></b>\n`;
            const start = new Date(event.start);
            message += `<code>  </code>Начало:\n`;
            message += `<code>   AUG: </code>${start.toLocaleString('ru-RU', date_options['CET'])}\n`;
            message += `<code>   LIM: </code>${start.toLocaleString('ru-RU', date_options['NIC'])}\n`;
            message += `<code>   SPB: </code>${start.toLocaleString('ru-RU', date_options['MOW'])}\n`;
            if (!event.end) continue;
            const end = new Date(event.end);
            message += `<code>  </code>Продолжительность: ${new Date(end - start).toLocaleTimeString('ru-RU', { hour:'2-digit', minute: '2-digit' })}\n`;
        }
    }

    if (!message.length) return [null, 'Нет запланированных эвентов'];

    return [null, message];
}

module.exports = {
    events,
}