Центр экстренных оповещений Vector ночного режима для МЧС

Активный
Статус
Сообщения
516
Лайки
32

8

месяц на сайте

Контекст
готовит шаблоны предупреждений и активирует каналы держит ночные смены в курсе каждой секунды координирует спасательные штабы.

Функциональность
  • отслеживает каналы оповещения для городской системы тревог ночного контура и наносит данные на ночную сетку Watcher
  • управляет пресеты Vector через панель Siren без задержек
  • прогнозирует потеря критичных минут и заранее предупреждает дежурных спикеров

Внедрение
  • прописать каталог формулировок и ночные ключи доступа перед вводом
  • сверить расписание тестов с марки Chronos
  • назначить ответственных за резерв каналов и ночной резерв каналов
  • загрузить сценарии пакет уведомлений и ночные регламенты

Код
Код:
#include <a_samp>
#include <zcmd>
#include <sscanf2>

#define MODULE_TAG "MCS_ALERT_VECTOR_NIGHT"
#define PRESET_LIMIT 16

enum e_alert
{
    bool:used,
    channel,
    text[96]
};
new MCS_Presets[PRESET_LIMIT][e_alert];
new bool:MCS_ChannelEnabled[2] = {true, true}; // 0-radio 1-sms

stock MCS_Send(channel, const text[])
{
    if(channel < 0 || channel > 1 || !MCS_ChannelEnabled[channel]) return 0;
    if(channel == 0) SendClientMessageToAll(0xFF4500FF, text);
    else for(new i = 0; i < MAX_PLAYERS; i++)
    {
        if(IsPlayerConnected(i)) SendClientMessage(i, 0xFFFF00FF, text);
    }
    return 1;
}

CMD:alertvectornstatres(playerid, const params[])
{
    new slot;
    if(sscanf(params, "i", slot)) return SendClientMessage(playerid, -1, "Используй: /alertvectornstatres [слот]");
    if(slot < 0 || slot >= PRESET_LIMIT || !MCS_Presets[slot][used]) return SendClientMessage(playerid, 0xDC143CFF, "[%s] Нет пресета.", MODULE_TAG);
    new msg[128];
    format(msg, sizeof msg, "[%s] %s", MODULE_TAG, MCS_Presets[slot][text]);
    if(!MCS_Send(MCS_Presets[slot][channel], msg)) SendClientMessage(playerid, 0xFF0000FF, "[%s] Канал выключен.", MODULE_TAG);
    return 1;
}

CMD:alertvectornctlres(playerid, const params[])
{
    new action[8], slot, channel, enabled;
    new text[96];
    if(sscanf(params, "s[8]", action)) return SendClientMessage(playerid, -1, "Используй: /alertvectornctlres preset/toggle");

    if(!strcmp(action, "preset", true))
    {
        if(sscanf(params, "s[8]iis[96]", action, slot, channel, text)) return SendClientMessage(playerid, -1, "/alertvectornctlres preset [слот] [канал 0/1] [текст]");
        MCS_Presets[slot][used] = true;
        MCS_Presets[slot][channel] = channel;
        format(MCS_Presets[slot][text], 96, "%s", text);
        SendClientMessage(playerid, 0x32CD32FF, "[%s] Пресет #%d сохранен.", MODULE_TAG, slot);
    }
    else if(!strcmp(action, "toggle", true))
    {
        if(sscanf(params, "s[8]ii", action, channel, enabled)) return SendClientMessage(playerid, -1, "/alertvectornctlres toggle [канал] [0/1]");
        MCS_ChannelEnabled[channel] = (enabled != 0);
        SendClientMessage(playerid, 0xD8BFD8FF, "[%s] Канал %d => %d.", MODULE_TAG, channel, enabled);
    }
    return 1;
}

Тест-кейсы
  • провести испытание: включить рассылку при выключенном канале — ожидать корректного сигнала
  • смоделировать отказ: заменить текст пресета на ходу — убедиться что резерв подхватил
  • сравнить отчёт с реестр оповещений и подтвердить отсутствие расхождений

Эксплуатация
  • хранить логи тревог в отдельном бакете
  • обновлять формулировки ежемесячно
  • проводить ночные аудиты вместе с дежурных спикеров
  • держать план реагирования на потеря критичных минут актуальным
  • отчёты автоматически попадают в штаб МЧС
 

1 человек читают эту тему (Всего: 1, Пользователей: 0, Гостей: 1)

Сверху