Спецификация системы наказаний

Сообщения
198
Реакции
273
Помог
5 раз(а)
DEVCS-2097-23771 (Не утверждено)


Описанная ниже спецификация предоставляет гибкие возможности для разработчиков плагинов.
В данном случае указывается централизованный плагин, который будет оперировать всеми необходимыми данными для плагинов наказаний.
Это позволит:
- избежать дублирования таблиц со схожим функционалом.
- наращивать функционал без изменения исходника центрального плагина (на функционал влияет итерация типов наказаний)
- хранить причины наказаний отдельно от каждого наказания.

Названия методов даны в обобщенном виде, без привязки к конкретному плагину (или его названию) и рекомендованы к написанию именно в таком виде.
Прошу меня поправить, если чего-то не хватает/нужно исправить.


Структуры/enum:
C:
// Результат работы форварда - для определения дальнейшей обработки события
enum
{
    PUNISH_CONTINUE = 0,
    PUNISH_SUPERCEDE
};

// API ключи для взаимодействия плагинов через punish_get_info/punish_set_info
enum PunishInfo {
    PunishInfoType = 0,       // Флаги наказания, см. PUNISH_TYPE
    PunishInfoReason,          // Причина наказания
    PunishInfoHiddenReason,    // Скрытая причина/причина администратора
    PunishInfoTime,            // Время наказания в минутах
    PunishInfoDate,            // Дата/время момента X
    PunishInfoPunisher            // ID пользователя, который наказал игрока (0 - сервер)
};

// Типы наказаний игрока (см. DEVCS-2097-23829)
enum PUNISH_TYPE {
...
};

Нативы плагина:
C:
/**
* Метод отвечает на вопрос: является ли игрок наказанны.
* @param player_id - номер игрока на сервере
* @param punish_type - тип наказания.
*/
native punish_client_status(player_id, punish_type)

/**
* Метод инициализирует событие бана игрока
* @param player_id - номер игрока на сервере
* @param punish_flags - флаги наказания игрока
*/
naitve punish_client(player_id, punish_flags)

/**
* Метод получает информацию по id игрока и ключу (см. PunishInfo)
* @param player_id - номер игрока на сервере
* @param PunishInfo:info - ключ
* @param any:... - буффер для получения строчных значений
* @return value - числовое значение ключа
*/
native punish_get_info(player_id, PunishInfo:info, any:... );

/**
* Метод задаёт информацию по id игрока и ключу (см. PunishInfo)
* @param player_id - номер игрока на сервере
* @param PunishInfo:info - ключ
* @param any:... - значение ключа (может быть как массив, так и числовое значение
*/
native punish_set_info(player_id, PunishInfo:info, any:... );

События плагина:
C:
/**
* Метод вызывается фактически перед наказанием пользователя
* @param player_id - номер игрока на сервере
* @param punish_type - тип наказания
* @return PUNISH_SUPERCEDE - наказание игрока заблокировано
*         PUNISH_CONTINUE - продолжаем наказывать игрока
*/
forward punish_client_punishning(player_id)

/**
* Метод метод вызывается фактически во время наказания, констатируя то, что клиент сейчас будет наказан
* @param player_id - номер игрока на сервере
* @param punish_type - номер игрока на сервере
*/
forward punish_client_punishned(player_id, punish_type)

/**
* Метод вызывается во время подключения игрока на сервер, объявляя начало проверки наказаний
* @param player_id - номер подключающегося игрока
* @param punish_type - тип наказания, который будет проверен
* @return PUNISH_SUPERCEDE - клиент имеет наказание (плагин принял действия)
*         PUNISH_CONTINUE - клиент не имеет наказания
*/
forward punish_client_checking(const player_id, const punish_type);

/**
* Метод вызывается после проверки игрока и констатирует результат проверки.
* @param player_id - номер подключающегося игрока
* @param punish_type - тип наказания
* @param bool:status - результат проверки
*/
forward punish_client_checked(const player_id, const punish_type, bool:status);
 
Последнее редактирование:
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
Мое видение АПИ
Код:
enum
{
    BAN_CONTINUE = 0,
    BAN_SUPERCEDE
};

enum BanInfo {
    BanInfoFlags = 0,
    BanInfoReason,
    BanInfoHiddenReason,
    BanInfoTime,
    BanInfoDate,
    BanInfoAdmin
}

enum (<<=1) {
    BAN_FLAG_BANNED = 1,
    BAN_FLAG_CHAT,
    BAN_FLAG_VOICE,
    BAN_FLAG_ATTACK,
}

forward ban_client_checking(const id);
forward ban_client_checked(const id, bool:banned);

forward ban_client_banning(const id);
forward ban_client_banned(const id);

native ban_get_info(id, BanInfo:info, any:... );
native ban_set_info(id, BanInfo:info, any:... );
Раздел я думаю не верный
 
Сообщения
198
Реакции
273
Помог
5 раз(а)
fantom, принял к сведению. Обновил спецификацию.
я просил выделить отдельный раздел под это дело, админы сказали: "сначала посмотрим как попрёт".
 
Последнее редактирование:
Сообщения
198
Реакции
273
Помог
5 раз(а)
fantom, был мелкий недостаток - для нескольких наказаний одного игрока будет действовать по одной причине, времени, и тд.

UPD: Обновил спецификацию для более абстрактного уровня. Это должно помочь избежать схожих таблиц в БД и способствовать расширению функционала без надобности переписывания кода данной системы (достигается лишь инкрементом номера наказания).

Заметка по столбцам таблицы: user_id, punish_type, reason, hidden_reason, punish_time, punish_datetime, admin_id
Уникальность по составному ключу из user_id, punish_type, punish_datetime.
 
Последнее редактирование:
Сообщения
198
Реакции
273
Помог
5 раз(а)
DEVCS-2097-23829 - Типы наказаний игрока (Не утверждено)


C:
enum PUNISH_TYPE {
    PUNISH_FLAG_BAN = 1,     // Блокировать попытку подключения к серверу (Ban)
    PUNISH_FLAG_CHAT,        // Блокировать чат (Gag)
    PUNISH_FLAG_VOICE,       // Блокировать голосовой чат (Mute)
    PUNISH_FLAG_ATTACK,      // Блокировать урон по врагам (Block The Bastards)
    PUNISH_FLAG_ACCESS,      // Блокировать флаги доступа
    PUNISH_FLAG_GROUP        // Запретить доступ к группам (Group System)
};
 
Последнее редактирование:
Сообщения
2,713
Реакции
2,993
Помог
59 раз(а)
Сообщения
6
Реакции
7
События плагина:
C:
/**
* Метод вызывается фактически перед наказанием пользователя
* @param player_id - номер игрока на сервере
* @param punish_type - номер игрока на сервере
* @return PUNISH_SUPERCEDE - наказание игрока заблокировано
*         PUNISH_CONTINUE - продолжаем наказывать игрока
*/
forward punish_client_punishning(player_id)

/**
* Метод метод вызывается фактически во время наказания, констатируя то, что клиент сейчас будет наказан
* @param player_id - номер игрока на сервере
* @param punish_type - номер игрока на сервере
*/
forward punish_client_punishned(player_id, punish_type)

/**
* Метод вызывается во время подключения игрока на сервер, объявляя начало проверки наказаний
* @param player_id - номер подключающегося игрока
* @param punish_type - тип наказания, который будет проверен
* @return PUNISH_SUPERCEDE - клиент имеет наказание (плагин принял действия)
*         PUNISH_CONTINUE - клиент не имеет наказания
*/
forward punish_client_checking(const player_id, const punish_type);

/**
* Метод вызывается после проверки игрока и констатирует результат проверки.
* @param player_id - номер подключающегося игрока
* @param punish_type - тип наказания
* @param bool:status - результат проверки
*/
forward punish_client_checked(const player_id, const punish_type, bool:status);
[/QUOTE]
@param player_id - номер игрока на сервере
@param punish_type - номер игрока на сервере
 
Сообщения
198
Реакции
273
Помог
5 раз(а)
wopox1337,
1) PunishInfoAdmin -> PunishInfoPunisher (ID пользователя, который наказал игрока)
По нему мы сможем получить все остальные необходимые данные.
2) PUNISH_TYPE
Предлагаю регулировать спецификацией, иначе могут возникнуть коллизии при регистрации/хранении новых типов наказаний.
Например, если сделать динамически, через плагин наказаний, то ID наказаний может измениться, если поменять пару плагинов местами.
Если вопрос регулируется спецификацией, то нам достаточно просто пополнять enum PUNISH_TYPE. При этом не нужно перекомпилирование системы наказаний.
20 Фев 2018
Salvatore, Исправлено
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу