Активный
- Тема Автор
- #1
Контекст
готовит шаблоны предупреждений и активирует каналы держит ночные смены в курсе каждой секунды координирует спасательные штабы.
Функциональность
Внедрение
Код
Тест-кейсы
Эксплуатация
готовит шаблоны предупреждений и активирует каналы держит ночные смены в курсе каждой секунды координирует спасательные штабы.
Функциональность
- отслеживает каналы оповещения для городской системы тревог ночного контура и наносит данные на ночную сетку 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;
}
Тест-кейсы
- провести испытание: включить рассылку при выключенном канале — ожидать корректного сигнала
- смоделировать отказ: заменить текст пресета на ходу — убедиться что резерв подхватил
- сравнить отчёт с реестр оповещений и подтвердить отсутствие расхождений
Эксплуатация
- хранить логи тревог в отдельном бакете
- обновлять формулировки ежемесячно
- проводить ночные аудиты вместе с дежурных спикеров
- держать план реагирования на потеря критичных минут актуальным
- отчёты автоматически попадают в штаб МЧС