[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: Stepan23  
Урок Pawno 29 ( Система логов )
Stepan23Дата: Среда, 04.04.2012, 20:51 | Сообщение # 1
Майор
Группа: Администраторы
Сообщений: 91
Репутация: 6
Статус: Offline
Всем привет! Надеюсь такой темы нет на pawno.ru, поиск мне не особо помог.
Так вот, создавая свой мод, я понял, что мне необходима система логов.

Чему меня научит это готовое решение?
В этой теме я научу вас создавать систему логов, которая поможет прочитать/получить необходимую вам информацию. (чат,пм,подключение/отключение игроков).

Особенности системы:

Данная система довольно проста, используется всего 1 stock.
Каждый лог имеет формат:[день][месяц]Имя.log
Текст внутри лога записывается так: [Час:Мин:Сек]Текст

Как это сделать?

1) Как я и говорил выше, используется всего 1 stock, поэтому в конец мода добавляем:

Code
stock WriteLog(namelog[],string[])  
{  
     new text[256],log[50],computation1, computation2, computation3,File:LogFile,i;  
     gettime(computation1, computation2, computation3);  
     format(text, sizeof(text), "[%02d:%02d:%02d]%s\r\n",computation1,computation2,computation3,string);  
     getdate(computation1, computation2, computation3);  
     format(log,sizeof(log),"logs/%s/[%02d][%02d]%s.log",namelog,computation3,computation2,namelog);  
     LogFile = fopen(log, io_append);  
     while (text[i] != EOS)  
     {  
         fputchar(LogFile, text[i], false);  
         i++;  
     }  
     fclose(LogFile);  
}  

Параметры:
namelog[] - имя лога
string[] - текст, который нужно записать в лог.

2) В scriptfiles создаем папку logs

Использование системы:
Возьмем банальный пример, запись пм сообщения в лог по такому формату:
[время]Имя Отправителя[ид] -> Имя Получателя[ид]: текст пм
Время у нас определяется автоматически, поэтому нам нужно указать только имена отправителя/получателя, их ид, ну и сам текст.

Возьмем простую систему пм:

Code
public OnPlayerCommandText(playerid, cmdtext[])  
{  
     new cmd[256], idx, tmp[256];  
     cmd = strtok(cmdtext, idx);  

     if(!strcmp(cmd, "/pm", true))  
     {  
         new message[256];  
         new id;  
         cmd = strtok(cmdtext,idx);  
         id = strval(cmd);  
         cmd = strrest(cmdtext,idx);  
         format(message, sizeof(message), "{ffd700}PM для %s(%i): %s", PlayerName(id), id, cmd);  
         SendClientMessage(playerid, -1, message);  
         format(message, sizeof(message), "{ffd700}PM от %s(%i): %s", PlayerName(playerid), playerid, cmd);  
         SendClientMessage(id, -1, message);  
         //------------Запись в лог----------------------------------------------------------          
         format(message,sizeof(message),"%s[%d]->%s[%d]:%s",PlayerName(playerid),playerid,PlayerName(id),id,cmd);  
         WriteLog("PmLog",message);  
         //--------------------------------------------------------------------------------------  
         return 1;  
     }  
     return 1;  
}  

Как видно на примере, за запись в лог отвечает всего 2 строки:
format(message,sizeof(message),"%s[%d]->%s[%d]:%s",PlayerName(playerid),playerid,PlayerName(id), id,cmd);
WriteLog("PmLog",message);

Переменная message уже была объявлена в команде.

WriteLog("PmLog",message);
"PmLog" - имя лога, указывается в ковычках.

Внимание!!! В logs должна быть создана папка с именем, которое указано в WriteLog(namelog[],string[]);

В результате этого, вы получите такой лог:

Возможные ошибки/проблемы:

1) error 017: undefined symbol "strtok"

Вниз мода добавить:

Code
strtok(const string[], &index)  
{  
     new length = strlen(string);  
     while ((index < length) && (string[index] <= ' ')) index++;  
     new offset = index;  
     new result[20];  
     while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))  
     {  
         result[index - offset] = string[index];  
         index++;  
     }  
     result[index - offset] = EOS;  
     return result;  
}  

2) error 017: undefined symbol "PlayerName"

Вниз мода добавить:


Code
stock PlayerName(playerid){  
new pname[MAX_PLAYER_NAME];  
GetPlayerName(playerid,pname,sizeof(pname));  
return pname;}  

3) У меня вылетает сервер при записи.Что делать?

Не создана папка logs, или не создана папка, которая указана в WriteLog(namelog[],string[]);
 
  • Страница 1 из 1
  • 1
Поиск: