Advertisement
Guest User

MX_Master

a guest
Apr 5th, 2010
1,323
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 9.80 KB | None | 0 0
  1. /*
  2.     [FS] Временный бан по нику
  3.  
  4.     06/04/2010, MX_Master
  5.  
  6.     Предупреждение:
  7.      - FS работает на сервере версии 0.3a R5 и выше, т.к. ранее функция fseek правильно не работала.
  8.  
  9.     Описание:
  10.      - Это простой на вид, но очень полезный фильтрскрипт, который позволяет админам банить ники игроков на определенное кол-во часов.
  11.      - Скрипт использует текстовый файл для хранения ников, дат разбана и причин бана.
  12.        Файл очищается от истекших банов автоматически каждые 47 мин. После очистки в лог сервера выводится инфо.
  13.      - При получении бана игрок получает уведомление в чате и кик. В лог сервера выводится инфо о забаненном нике.
  14.  
  15.      - Если кол-во часов не указывать, то бан будет на 12 часов.
  16.      - Если причину не указывать, то причина будет "причина не указана".
  17.      - Можно забанить и себя.
  18.  
  19.     Как использовать:
  20.      - нужно быть ркон админом
  21.      - нужно использовать команду чата: /tempban [ID игрока] [кол-во часов] [причина бана]
  22. */
  23.  
  24. #include <a_samp>
  25.  
  26.  
  27.  
  28.  
  29.  
  30. #define tempBanFile                 "temp_bans.txt"
  31.  
  32. #define defaultTempBanHours         12 // часов
  33. #define defaultTempBanReason        "причина не указана"
  34.  
  35. #define tempBansCleaningInterval    47 // минут
  36.  
  37. #define fwritebin(%0,%1)            for ( new sp, size = strlen(%1); sp < size; sp++ ) fputchar( %0, %1[sp], false )
  38.  
  39.  
  40.  
  41.  
  42.  
  43. stock tempBansCleaningTimer;
  44.  
  45.  
  46.  
  47.  
  48.  
  49. stock tempBanPlayer ( playerid, adminid, hours = defaultTempBanHours, reason[] = defaultTempBanReason )
  50. {
  51.     new File: banFile = fopen( tempBanFile, io_append );
  52.     if ( !banFile ) return 0;
  53.  
  54.     new unbanTime = gettime() + hours*3600, banStr[160], plName[24], admName[24];
  55.  
  56.     GetPlayerName( playerid, plName, 24 );
  57.     GetPlayerName( adminid, admName, 24 );
  58.  
  59.     format( banStr, 160, "%s:%d:%s\r\n", plName, unbanTime, reason );
  60.     fwritebin( banFile, banStr );
  61.     fclose(banFile);
  62.  
  63.  
  64.     format( banStr, 160, " * Ты забанен на %d час(ов). Причина: %s", hours, reason );
  65.     SendClientMessage( playerid, 0xFF0000AA, banStr );
  66.     printf( " * %s (id:%d) was temp banned for %d hour(s) by %s (id:%d). Reason: %s",
  67.         plName, playerid, hours, admName, adminid, reason );
  68.  
  69.  
  70.     Kick(playerid);
  71.     return 1;
  72. }
  73.  
  74. stock isPlayerTempBanned ( playerid, & unbanTime, reason[] )
  75. {
  76.     if ( !fexist(tempBanFile) ) return 0;
  77.     new File: banFile = fopen( tempBanFile, io_read );
  78.     if ( !banFile ) return 0;
  79.  
  80.  
  81.     new plName[24], plNameLen;
  82.     GetPlayerName( playerid, plName, 24 );
  83.     plNameLen = strlen(plName);
  84.  
  85.  
  86.     for ( new banStr[160]; fread( banFile, banStr ) > 0; )
  87.     {
  88.         if ( banStr[plNameLen] == ':' && strcmp( banStr, plName, true, plNameLen ) == 0 )
  89.         {
  90.             unbanTime = iparam( banStr, ':', 1 );
  91.             sparam( reason, 128, banStr, ':', 2, 1 );
  92.  
  93.             if ( reason[0] == 0 ) format( reason, 128, "%s", defaultTempBanReason );
  94.  
  95.             fclose(banFile);
  96.             return 1;
  97.         }
  98.     }
  99.  
  100.  
  101.     fclose(banFile);
  102.     return 0;
  103. }
  104.  
  105. forward tempBansCleaning();
  106. public tempBansCleaning()
  107. {
  108.     if ( !fexist(tempBanFile) ) return;
  109.  
  110.     new File: banFile = fopen( tempBanFile, io_read ), File: tmpFile = ftemp();
  111.  
  112.     if ( !banFile || !tmpFile )
  113.     {
  114.         fclose(banFile);
  115.         fclose(tmpFile);
  116.         return;
  117.     }
  118.  
  119.  
  120.     for ( new buffer[160]; fread( banFile, buffer ) > 0; ) fwritebin( tmpFile, buffer );
  121.  
  122.     fclose(banFile);
  123.     fseek( tmpFile, 0, seek_start );
  124.  
  125.  
  126.     banFile = fopen( tempBanFile, io_write );
  127.     if ( !banFile )
  128.     {
  129.         fclose(tmpFile);
  130.         return;
  131.     }
  132.  
  133.     new curTime = gettime(), banStr[160], cleanedCount;
  134.  
  135.     while ( fread( tmpFile, banStr ) > 0 )
  136.     {
  137.         if ( iparam( banStr, ':', 1 ) - curTime > 0 ) fwritebin( banFile, banStr );
  138.         else cleanedCount++;
  139.     }
  140.  
  141.     fclose(banFile);
  142.     fclose(tmpFile);
  143.  
  144.     printf( " * Temp bans file `" tempBanFile "` cleaning: %d expired bans removed", cleanedCount );
  145. }
  146.  
  147. stock sparam
  148. (
  149.     dest[],             maxSize     = sizeof(dest),
  150.     const source[],     delimiter   = ' ',
  151.     substrIndex = 0,    withRest    = 0
  152. )
  153. {
  154.     dest[0] = 0; // очистим строку назначения
  155.  
  156.     for ( new cur, pre, i = -1; ; cur++ ) // пробежимся по каждому символу в строке source
  157.     {
  158.         if ( source[cur] == 0 ) // если текущий символ в source - это символ конца строки
  159.         {
  160.             if ( ++i == substrIndex ) // если индекс текущей подстроки и есть sourceIndex
  161.                 // скопируем в dest нужную подстроку из source
  162.                 strmid( dest, source, pre, ( withRest ? strlen(source) : cur ), maxSize );
  163.  
  164.             goto sparam_end;
  165.         }
  166.  
  167.         if ( source[cur] == delimiter ) // если текущий символ в source - это символ для разделения строки
  168.         {
  169.             if ( ++i == substrIndex ) // если индекс текущей подстроки и есть sourceIndex
  170.             {
  171.                 // скопируем в dest нужную подстроку из source
  172.                 strmid( dest, source, pre, ( withRest ? strlen(source) : cur ), maxSize );
  173.                 goto sparam_end;
  174.             }
  175.  
  176.             pre = cur + 1;
  177.         }
  178.     }
  179.  
  180.     sparam_end:
  181.     return; // завершим работу функции
  182. }
  183.  
  184. stock iparam ( const source[], delimiter = ' ', substrIndex = 0 )
  185. {
  186.     new dest[12], cur, pre, i = -1;
  187.  
  188.     for ( ; ; cur++ ) // пробежимся по каждому символу в строке source
  189.     {
  190.         if ( source[cur] == 0 ) // если текущий символ в source - это символ конца строки
  191.         {
  192.             if ( ++i == substrIndex ) // если индекс текущей подстроки и есть sourceIndex
  193.                 strmid( dest, source, pre, cur, 12 ); // скопируем в dest нужную подстроку из source
  194.  
  195.             goto iparam_end;
  196.         }
  197.  
  198.         if ( source[cur] == delimiter ) // если текущий символ в source - это символ для разделения строки
  199.         {
  200.             if ( ++i == substrIndex ) // если индекс текущей подстроки и есть sourceIndex
  201.             {
  202.                 strmid( dest, source, pre, cur, 12 );// скопируем в dest нужную подстроку из source
  203.                 goto iparam_end;
  204.             }
  205.  
  206.             pre = cur + 1;
  207.         }
  208.     }
  209.  
  210.     iparam_end:
  211.     return strval(dest); // завершим работу функции и вернем целочисленное значение подстроки
  212. }
  213.  
  214.  
  215.  
  216.  
  217.  
  218. public OnFilterScriptInit() { tempBansCleaningTimer = SetTimer( "tempBansCleaning", tempBansCleaningInterval*60000, 1 ); }
  219. public OnFilterScriptExit() { KillTimer(tempBansCleaningTimer); }
  220.  
  221. public OnPlayerConnect ( playerid )
  222. {
  223.     static unbanTime, curTime, reason[128];
  224.  
  225.     curTime = gettime();
  226.  
  227.     if ( isPlayerTempBanned( playerid, unbanTime, reason ) && (unbanTime - curTime) > 0 )
  228.     {
  229.         new banMessage[160],
  230.             unbanSeconds    = unbanTime - curTime,
  231.             unbanMinutes    = unbanSeconds / 60,
  232.             unbanHours      = unbanMinutes / 60;
  233.  
  234.         unbanMinutes -= unbanHours*60;
  235.         unbanSeconds -= unbanHours*3600 + unbanMinutes*60;
  236.  
  237.         format( banMessage, 160, " * Твой ник забанен по причине: %s", reason );
  238.         SendClientMessage( playerid, 0xFF0000AA, banMessage );
  239.  
  240.         format( banMessage, 80,  " * До разбана осталось %d час., %d мин., %d сек.", unbanHours, unbanMinutes, unbanSeconds );
  241.         SendClientMessage( playerid, 0xFF0000AA, banMessage );
  242.  
  243.         Kick(playerid);
  244.     }
  245.  
  246.     return 1;
  247. }
  248.  
  249. public OnPlayerCommandText ( playerid, cmdtext[] )
  250. {
  251.     // синтаксис /tempban [ID игрока] [кол-во часов] [причина бана]
  252.  
  253.     if ( IsPlayerAdmin(playerid) && strcmp( cmdtext, "/tempban", true, 8 ) == 0 )
  254.     {
  255.         if ( cmdtext[8] != ' ' || cmdtext[9] == 0 )
  256.         {
  257.             SendClientMessage( playerid, 0xFFFFFFAA, " * Синтаксис: /tempban [ID игрока] [кол-во часов] [причина бана]" );
  258.             return 1;
  259.         }
  260.  
  261.  
  262.         new id = iparam( cmdtext, ' ', 1 );
  263.  
  264.         if ( ( id == 0 && cmdtext[9] != '0' ) || !IsPlayerConnected(id) )
  265.         {
  266.             SendClientMessage( playerid, 0xFFFFFFAA, " * Игрок с таким ID не найден" );
  267.             return 1;
  268.         }
  269.  
  270.  
  271.         new hours = iparam( cmdtext, ' ', 2 ), reason[128];
  272.         sparam( reason, 128, cmdtext, ' ', 3, 1 );
  273.  
  274.         if ( hours <= 0 )       hours  = defaultTempBanHours;
  275.         if ( reason[0] == 0 )   reason = defaultTempBanReason;
  276.  
  277.  
  278.         if ( tempBanPlayer( id, playerid, hours, reason ) )
  279.         {
  280.             new reportStr[160];
  281.             GetPlayerName( id, reportStr, 24 );
  282.             format( reportStr, 160, " * %s (id:%d) забанен на %d час(ов): %s", reportStr, id, hours, reason );
  283.  
  284.             SendClientMessage( playerid, 0xFF0000AA, reportStr );
  285.         }
  286.         else
  287.             SendClientMessage( playerid, 0xFFFFFFAA, " * Ошибка записи в файл при добавлении нового временного бана" );
  288.  
  289.  
  290.         return 1;
  291.     }
  292.  
  293.     return 0;
  294. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement