Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Мануал Система логирования действий

faraday.

Эксперт
Регистрация
15 Окт 2015
Сообщения
1,667
Лучшие ответы
77
Репутация
1,008
Награды
1
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!

Описание:

Погуглив в rambler, yahoo и mail я не нашел хорошей заготовки, подобной этой.
Данная система добавит на ваш сервер отслеживание действий игрока в базу данных.

Я создал 5 баз данных, для действий: Администраторов | Домов | Бизнесов | Денег | Фракций
Всё динамически продумано, лог из игры показывает последние 15 действий в порядке 'от последнего действия к прошлым'.


Так же при вводе имени игрока, идет проверка на Создан/Не создан

Версия mysql - R39+

Инструкция:

C++:
//Ключи для каждого лога:

ADMIN_LOG
HOUSE_LOG
BUSINESS_LOG
MONEY_LOG
FACTION_LOG

//Функция для логирования:
writeLog(playerid, type, logs_fmt[])

//Пример:
writeLog(playerid, ADMIN_LOG, "Сюда отправляем формат действия в таблицу `logs_admin`");
//
writeLog(playerid, HOUSE_LOG, "Действия с покупкой/продажей дома в таблицу `logs_house");
//
writeLog(playerid, BUSINESS_LOG, "Действия с покупкой/продажей/выводом денег бизнеса в таблицу `logs_business`");
//Тут отправляем действия когда игрок тратит/получает деньги
//(Пример:)
new str[64];
format(str, sizeof str, "передал %d$ игроку %s", player_info[playerid][player_money], target_name);
writeLog(playerid, MONEY_LOG, str);
//
writeLog(playerid, FACTION_LOG, "Передаем лог invite / uninvite / rank +/- в таблицу `logs_faction`");


Скриншоты:

Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!




Код:

C++:
//В шапку мода


#define MYSQL_CONNECTID /*ваша переменная отвечающая за подключение*/

//Диалоги
#define D_UPLOAD_LOGS 1350
#define D_RESULT_LOGS 1351
//
const LOG_TABLE_MAX = 5;

enum e_LOG_SECTION {
    ADMIN_LOG = 0,
    HOUSE_LOG,
    BUSINESS_LOG,
    MONEY_LOG,
    FACTION_LOG//4 ID
}


new
    table_name_logs[LOG_TABLE_MAX][16] = {"logs_admin", "logs_house", "logs_business", "logs_money", "logs_faction"}, //Названия таблиц в БД
    select_id_acc[MAX_PLAYERS]; //для записи имени игрока, на которого пускаем запрос в базу

//---------------------------------------------------------------------------------------

//Ко всем диалогам в public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])

    case D_UPLOAD_LOGS: //Для поиска аккаунта введеного в input
    {
        if(!response)
            return 1;
   
        new
            query_string[128];
   
        format(query_string, sizeof query_string, "SELECT * FROM `accounts` WHERE `name` = '%s'", inputtext);
        mysql_tquery(MYSQL_CONNECTID, query_string, "findNickName", "is", playerid, inputtext);
        return 1;
    }
   
    case D_RESULT_LOGS: //Для запроса в бд, относительно выбранного listitem
    {
        if(!response)
            return 1;
   
        new mysql_fmt[128];
   
        format(mysql_fmt, sizeof mysql_fmt, "SELECT * FROM `%s` WHERE `id_account` LIKE '%d' ORDER BY `ID` DESC LIMIT 15", table_name_logs[listitem], select_id_acc[playerid]);
        mysql_tquery(MYSQL_CONNECTID, mysql_fmt, "UploadLogsPlayer", "id", playerid, listitem);
   
        return 1;
    }

//----------------------------------------------------------//


//В любое свободное место в моде:


CMD:logs(playerid)
{
    /*Проверка на администратора*/
   
    return ShowPlayerDialog(playerid, D_UPLOAD_LOGS, DIALOG_STYLE_INPUT, "Введите имя", "{ffffff}Введите никнейм в строку ниже:", "Далее", "Выход");

}

forward findNickName(playerid, name_player[]);
public findNickName(playerid, name_player[]) {
    new
        rows,
        str[72];

    cache_get_row_count(rows);
    if(rows) {
        cache_get_value_name_int(0, "id", select_id_acc[playerid]); //'id' замените на имя своего столбца с ID аккаунта что  у вас в таблице игрока

       
        format(str, sizeof str, "Список действий игрока %s", name_player);
        ShowPlayerDialog(playerid, D_RESULT_LOGS, DIALOG_STYLE_TABLIST_HEADERS, str, "Список действий:\nАдминистратор\nНедвижимость\nБизнес\nДеньги\nФракция", "Выбрать", "Выход");
    } else {
        format(str, sizeof str, "Аккаунт с именем %s не создан.", name_player);
        SendClientMessage(playerid, -1, str);
    }
    return 1;
}




forward UploadLogsPlayer(playerid, type);
public UploadLogsPlayer(playerid, type)
{
    new
        rows,
        total_string[2048],
        name_player[MAX_PLAYER_NAME],
        action[64],
        date[24];


    cache_get_row_count(rows);


    for(new u; u < rows; u++) {
        cache_get_value_name(u, "name", name_player, MAX_PLAYER_NAME);
        cache_get_value_name(u, "action", action, 64);
        cache_get_value_name(u, "date", date, 24);
        format(total_string, sizeof total_string, "%s{d3d3d3}Дата: {ffffff}%s\t{ff9d14}Действие: {ffffff}%s\n", total_string, date, action);
     }

    if(!rows)//Если список пуст
        total_string = "Никаких действий не совершал";


    switch(type) { //Названия для шапки диалога
        case 0: action = "Администратор";
        case 1: action = "Дом";
        case 2: action = "Бизнес";
        case 3: action = "Финансы";
        case 4: action = "Фракция";
    }
    format(action, sizeof action, "{ffffff}Логи {ff9d14}%s {ffffff}| %s", name_player, action);
    ShowPlayerDialog(playerid, 0000 ,DIALOG_STYLE_MSGBOX, action, total_string, "Закрыть", "");
    //Показываем и обнуляем Имя
    select_id_acc[playerid] = INVALID_PLAYER_ID;
    return 1;
}

stock writeLog(playerid, type, logs_fmt[]) {
    new
        mysql_fmt[256];

    GetPlayerName(playerid, mysql_fmt, MAX_PLAYER_NAME);



    format(mysql_fmt, sizeof mysql_fmt, "INSERT INTO `%s` (`name`, `id_account`, `action`) VALUES ('%s', '%d', '%s')", table_name_logs[type], mysql_fmt, /*переменная отвечающая за ID игрока при регистрации*/, logs_fmt);
    return mysql_tquery(MYSQL_CONNECTID, mysql_fmt, "", "");
}

//=------------------------------------------------------------------=//
C++:
CREATE TABLE `logs_admin` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(24) NOT NULL,
  `id_account` int(6) NOT NULL,
  `action` text NOT NULL,
  `date`  timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

CREATE TABLE `logs_house` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(24) NOT NULL,
  `id_account` int(6) NOT NULL,
  `action` text NOT NULL,
  `date`  timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

CREATE TABLE `logs_business` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(24) NOT NULL,
  `id_account` int(6) NOT NULL,
  `action` text NOT NULL,
  `date`  timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

CREATE TABLE `logs_money` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(24) NOT NULL,
  `id_account` int(6) NOT NULL,
  `action` text NOT NULL,
  `date`  timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

CREATE TABLE `logs_faction` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(24) NOT NULL,
  `id_account` int(6) NOT NULL,
  `action` text NOT NULL,
  `date`  timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;



Автор: unreal
 
Последнее редактирование:
Сверху Снизу