[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: Gank  
[FS] Временный бан по нику
Дата: 16.02.2011, Среда, 03:03:30 | Сообщение # $NUMBER
Группа: VIP
Сообщений: 1021
Репутация: 815+

Автор:MX_Master

[c][FS] Временный бан по нику

Предупреждение:
- FS работает на сервере версии 0.3a R5 и выше, т.к. ранее функция fseek правильно не работала.

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

- Если кол-во часов не указывать, то бан будет на 12 часов.
- Если причину не указывать, то причина будет "причина не указана".
- Можно забанить и себя.

Как использовать:
- нужно быть ркон админом
- нужно использовать команду чата: /tempban [ID игрока] [кол-во часов] [причина бана]

Quote
/*
[FS] Временный бан по нику

06/04/2010, MX_Master

Предупреждение:
- FS работает на сервере версии 0.3a R5 и выше, т.к. ранее функция fseek правильно не работала.

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

- Если кол-во часов не указывать, то бан будет на 12 часов.
- Если причину не указывать, то причина будет "причина не указана".
- Можно забанить и себя.

Как использовать:
- нужно быть ркон админом
- нужно использовать команду чата: /tempban [ID игрока] [кол-во часов] [причина бана]
*/

#include <a_samp>

#define tempBanFile "temp_bans.txt"

#define defaultTempBanHours 12 // часов
#define defaultTempBanReason "причина не указана"

#define tempBansCleaningInterval 47 // минут

#define fwritebin(%0,%1) for ( new sp, size = strlen(%1); sp < size; sp++ ) fputchar( %0, %1[sp], false )

stock tempBansCleaningTimer;

stock tempBanPlayer ( playerid, adminid, hours = defaultTempBanHours, reason[] = defaultTempBanReason )
{
new File: banFile = fopen( tempBanFile, io_append );
if ( !banFile ) return 0;

new unbanTime = gettime() + hours*3600, banStr[160], plName[24], admName[24];

GetPlayerName( playerid, plName, 24 );
GetPlayerName( adminid, admName, 24 );

format( banStr, 160, "%s:%d:%s\r\n", plName, unbanTime, reason );
fwritebin( banFile, banStr );
fclose(banFile);

format( banStr, 160, " * Ты забанен на %d час(ов). Причина: %s", hours, reason );
SendClientMessage( playerid, 0xFF0000AA, banStr );
printf( " * %s (id:%d) was temp banned for %d hour(s) by %s (id:%d). Reason: %s",
plName, playerid, hours, admName, adminid, reason );

Kick(playerid);
return 1;
}

stock isPlayerTempBanned ( playerid, & unbanTime, reason[] )
{
if ( !fexist(tempBanFile) ) return 0;
new File: banFile = fopen( tempBanFile, io_read );
if ( !banFile ) return 0;

new plName[24], plNameLen;
GetPlayerName( playerid, plName, 24 );
plNameLen = strlen(plName);

for ( new banStr[160]; fread( banFile, banStr ) > 0; )
{
if ( banStr[plNameLen] == ':' && strcmp( banStr, plName, true, plNameLen ) == 0 )
{
unbanTime = iparam( banStr, ':', 1 );
sparam( reason, 128, banStr, ':', 2, 1 );

if ( reason[0] == 0 ) format( reason, 128, "%s", defaultTempBanReason );

fclose(banFile);
return 1;
}
}

fclose(banFile);
return 0;
}

forward tempBansCleaning();
public tempBansCleaning()
{
if ( !fexist(tempBanFile) ) return;

new File: banFile = fopen( tempBanFile, io_read ), File: tmpFile = ftemp();

if ( !banFile || !tmpFile )
{
fclose(banFile);
fclose(tmpFile);
return;
}

for ( new buffer[160]; fread( banFile, buffer ) > 0; ) fwritebin( tmpFile, buffer );

fclose(banFile);
fseek( tmpFile, 0, seek_start );

banFile = fopen( tempBanFile, io_write );
if ( !banFile )
{
fclose(tmpFile);
return;
}

new curTime = gettime(), banStr[160], cleanedCount;

while ( fread( tmpFile, banStr ) > 0 )
{
if ( iparam( banStr, ':', 1 ) - curTime > 0 ) fwritebin( banFile, banStr );
else cleanedCount++;
}

fclose(banFile);
fclose(tmpFile);

printf( " * Temp bans file `" tempBanFile "` cleaning: %d expired bans removed", cleanedCount );
}

stock sparam
(
dest[], maxSize = sizeof(dest),
const source[], delimiter = ' ',
substrIndex = 0, withRest = 0
)
{
dest[0] = 0; // очистим строку назначения

for ( new cur, pre, i = -1; ; cur++ ) // пробежимся по каждому символу в строке source
{
if ( source[cur] == 0 ) // если текущий символ в source - это символ конца строки
{
if ( ++i == substrIndex ) // если индекс текущей подстроки и есть sourceIndex
// скопируем в dest нужную подстроку из source
strmid( dest, source, pre, ( withRest ? strlen(source) : cur ), maxSize );

goto sparam_end;
}

if ( source[cur] == delimiter ) // если текущий символ в source - это символ для разделения строки
{
if ( ++i == substrIndex ) // если индекс текущей подстроки и есть sourceIndex
{
// скопируем в dest нужную подстроку из source
strmid( dest, source, pre, ( withRest ? strlen(source) : cur ), maxSize );
goto sparam_end;
}

pre = cur + 1;
}
}

sparam_end:
return; // завершим работу функции
}

stock iparam ( const source[], delimiter = ' ', substrIndex = 0 )
{
new dest[12], cur, pre, i = -1;

for ( ; ; cur++ ) // пробежимся по каждому символу в строке source
{
if ( source[cur] == 0 ) // если текущий символ в source - это символ конца строки
{
if ( ++i == substrIndex ) // если индекс текущей подстроки и есть sourceIndex
strmid( dest, source, pre, cur, 12 ); // скопируем в dest нужную подстроку из source

goto iparam_end;
}

if ( source[cur] == delimiter ) // если текущий символ в source - это символ для разделения строки
{
if ( ++i == substrIndex ) // если индекс текущей подстроки и есть sourceIndex
{
strmid( dest, source, pre, cur, 12 );// скопируем в dest нужную подстроку из source
goto iparam_end;
}

pre = cur + 1;
}
}

iparam_end:
return strval(dest); // завершим работу функции и вернем целочисленное значение подстроки
}

public OnFilterScriptInit() { tempBansCleaningTimer = SetTimer( "tempBansCleaning", tempBansCleaningInterval*60000, 1 ); }
public OnFilterScriptExit() { KillTimer(tempBansCleaningTimer); }

public OnPlayerConnect ( playerid )
{
static unbanTime, curTime, reason[128];

curTime = gettime();

if ( isPlayerTempBanned( playerid, unbanTime, reason ) && (unbanTime - curTime) > 0 )
{
new banMessage[160],
unbanSeconds = unbanTime - curTime,
unbanMinutes = unbanSeconds / 60,
unbanHours = unbanMinutes / 60;

unbanMinutes -= unbanHours*60;
unbanSeconds -= unbanHours*3600 + unbanMinutes*60;

format( banMessage, 160, " * Твой ник забанен по причине: %s", reason );
SendClientMessage( playerid, 0xFF0000AA, banMessage );

format( banMessage, 80, " * До разбана осталось %d час., %d мин., %d сек.", unbanHours, unbanMinutes, unbanSeconds );
SendClientMessage( playerid, 0xFF0000AA, banMessage );

Kick(playerid);
}

return 1;
}

public OnPlayerCommandText ( playerid, cmdtext[] )
{
// синтаксис /tempban [ID игрока] [кол-во часов] [причина бана]

if ( IsPlayerAdmin(playerid) && strcmp( cmdtext, "/tempban", true, 8 ) == 0 )
{
if ( cmdtext[8] != ' ' || cmdtext[9] == 0 )
{
SendClientMessage( playerid, 0xFFFFFFAA, " * Синтаксис: /tempban [ID игрока] [кол-во часов] [причина бана]" );
return 1;
}

new id = iparam( cmdtext, ' ', 1 );

if ( ( id == 0 && cmdtext[9] != '0' ) || !IsPlayerConnected(id) )
{
SendClientMessage( playerid, 0xFFFFFFAA, " * Игрок с таким ID не найден" );
return 1;
}

new hours = iparam( cmdtext, ' ', 2 ), reason[128];
sparam( reason, 128, cmdtext, ' ', 3, 1 );

if ( hours <= 0 ) hours = defaultTempBanHours;
if ( reason[0] == 0 ) reason = defaultTempBanReason;

if ( tempBanPlayer( id, playerid, hours, reason ) )
{
new reportStr[160];
GetPlayerName( id, reportStr, 24 );
format( reportStr, 160, " * %s (id:%d) забанен на %d час(ов): %s", reportStr, id, hours, reason );

SendClientMessage( playerid, 0xFF0000AA, reportStr );
}
else
SendClientMessage( playerid, 0xFFFFFFAA, " * Ошибка записи в файл при добавлении нового временного бана" );

return 1;
}

return 0;
}

[/c]
  • Страница 1 из 1
  • 1
Поиск: