Оперативный центр мониторинга в Pawn

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

8

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

Зачем нужен
Когда на сервере десятки событий (пожары, гонки, рейды), администраторам важно видеть картину в одном месте. Этот модуль собирает ключевые сигналы (онлайн фракций, состояние экономики, активность ивентов) и выводит их через единую команду.

Структура данных
Код:
enum MonitorWidget
{
    WidgetTitle[32],
    WidgetValue[64],
    WidgetColor,
    WidgetUpdated,
    WidgetHandler[32]
}

new MonitorData[16][MonitorWidget];
new MonitorCount;

Регистрация виджетов
Код:
AddWidget(const title[], const handler[], color)
{
    if(MonitorCount >= sizeof(MonitorData))
        return -1;

    new idx = MonitorCount++;
    format(MonitorData[idx][WidgetTitle], 32, "%s", title);
    MonitorData[idx][WidgetHandler] = handler;
    MonitorData[idx][WidgetColor] = color;
    MonitorData[idx][WidgetValue][0] = '\0';
    MonitorData[idx][WidgetUpdated] = 0;
    return idx;
}

Обновление
Раз в 15 секунд дергаем обработчики и записываем свежие значения.
Код:
forward MonitorTick();
public MonitorTick()
{
    for(new i = 0; i < MonitorCount; i++)
    {
        CallLocalFunction(MonitorData[i][WidgetHandler], "i", i);
        MonitorData[i][WidgetUpdated] = gettime();
    }
    return 1;
}

Примеры обработчиков
Код:
forward Widget_FractionOnline(idx);
public Widget_FractionOnline(idx)
{
    new count = 0;
    foreach(new i : Player)
    {
        if(PlayerInfo[i][pFaction] == LSPD)
            count++;
    }
    format(MonitorData[idx][WidgetValue], 64, "%d офицеров на смене", count);
    return 1;
}

forward Widget_EconomyState(idx);
public Widget_EconomyState(idx)
{
    new total = 0;
    foreach(new i : Player)
        total += GetPlayerMoney(i);
    format(MonitorData[idx][WidgetValue], 64, "$%d в обороте", total);
    return 1;
}

Интерфейс
Команда `/monitor` выводит краткую сводку.
Код:
CMD:monitor(playerid, params[])
{
    if(PlayerInfo[playerid][pAdmin] < 1)
        return 0;

    new buffer[1024];
    for(new i = 0; i < MonitorCount; i++)
    {
        format(buffer, sizeof buffer, "%s{%06x}%s\n\\t%s\n",
            buffer,
            MonitorData[i][WidgetColor],
            MonitorData[i][WidgetTitle],
            MonitorData[i][WidgetValue]);
    }
    ShowPlayerDialog(playerid, DIALOG_MONITOR, DIALOG_STYLE_MSGBOX,
        "Оперативный центр", buffer, "Закрыть", "");
    return 1;
}

Практические советы
* Добавьте виджет свободных слотов на ивент: когда их мало, админы смогут открыть дополнительную сессию.
* Фиксируйте время последнего обновления и подсвечивайте пункты, если данные устарели (например, нет лаунчера).
* Подключите логгер: каждые 5 минут сбрасывайте значения в файл, чтобы анализировать тенденции.
* Если список виджетов растёт, разбейте их на вкладки (экономика, безопасность, ивенты) и передавайте параметр `/monitor economy`.

Проверка
1. Вручную измените количество офицеров и убедитесь, что виджет обновляется.
2. Отключите один из обработчиков (уберите запись в массиве), посмотрите, как интерфейс реагирует на “нет данных”.
3. Добавьте тестовый виджет, который показывает пинг сервера, чтобы убедиться, что система подходит и для технических метрик.
 

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

Сверху