Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- [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;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement