Guest User

Untitled

a guest
Aug 2nd, 2012
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 5.94 KB | None | 0 0
  1. #include <a_samp>
  2. //#include <timerfix>       // Фикс таймеров
  3.  
  4. new ShowIPRange[32];    // Если IP играка забанен, сюда попадает диапазон, в котором он забанен.
  5.  
  6. public OnFilterScriptInit()
  7. {
  8.     print("\n                     ------------------------------------- ");
  9.     print("                    |         Range Ban System 1.0        |");
  10.     print("                    |By Dragon_Knight (ex: FITZ_NICK) 2012|");
  11.     print("                     ------------------------------------- \n");
  12.  
  13.     return 1;
  14. }
  15.  
  16. public OnFilterScriptExit()
  17. {
  18.  
  19.     return 1;
  20. }
  21.  
  22. public OnPlayerConnect(playerid)
  23. {
  24.     if(IsPlayerNPC(playerid)) return 1;
  25.  
  26.     SetTimerEx("CheckPlayer",2500,false,"d",playerid);
  27.  
  28.     return 1;
  29. }
  30.  
  31. public OnPlayerDisconnect(playerid, reason)
  32. {
  33.  
  34.     return 1;
  35. }
  36.  
  37. public OnPlayerCommandText(playerid, cmdtext[])
  38. {
  39.     new cmd[128], idx;
  40.     new strmsg[200];
  41.     cmd = strtok(cmdtext, idx);
  42.  
  43.     if(strcmp(cmd, "/rangeadd", true) == 0)
  44.     {
  45.         new rangeIP[32];
  46.         rangeIP = strtok(cmdtext, idx);
  47.  
  48.         if(!strlen(rangeIP))
  49.         {
  50.             SendClientMessage(playerid,0xFF0000FF,"Использование: /rangeadd [диапазон]. Например: '/rangeban 192.168.0.0-192.168.0.255'");
  51.             return 1;
  52.         }
  53.  
  54.         new File:f = fopen("/range_ban.lst",io_append);
  55.         if(f)
  56.         {
  57.             new writestr[64];
  58.             format(writestr,sizeof(writestr),"%s\n",rangeIP);
  59.             fwrite(f,writestr);
  60.             fclose(f);
  61.             format(strmsg,sizeof(strmsg),"[RBS]: Диапазон адресов: '%s' ушпешно добавлен в банлист",rangeIP);
  62.             SendClientMessage(playerid,0x00FF00FF,strmsg);
  63.         }
  64.         else
  65.         {
  66.             format(strmsg,sizeof(strmsg),"[RBS]: Ошибка добавления диапазона адресов: '%s'",rangeIP);
  67.             SendClientMessage(playerid,0xFF0000FF,strmsg);
  68.         }
  69.  
  70.         return 1;
  71.     }
  72.  
  73.     if(strcmp(cmd, "/rangecheck", true) == 0)
  74.     {
  75.         new checkIP[32];
  76.         checkIP = strtok(cmdtext, idx);
  77.  
  78.         if(!strlen(checkIP))
  79.         {
  80.             SendClientMessage(playerid,0xFF0000FF,"Использование: /rangecheck [ip адрес]. Например: '/rangeban 192.168.0.1'");
  81.             return 1;
  82.         }
  83.  
  84.         switch(CheckIPBan(checkIP))
  85.         {
  86.             case -1:
  87.             {
  88.                 SendClientMessage(playerid,0xFF0000FF,"[RBS]: При чтении файла произошла ошибка");
  89.             }
  90.             case 0:
  91.             {
  92.                 format(strmsg,sizeof(strmsg),"[RBS]: IP адрес: '%s' не находиться в банлисте",checkIP);
  93.                 SendClientMessage(playerid,0x00FF00FF,strmsg);
  94.             }
  95.             case 1:
  96.             {
  97.                 format(strmsg,sizeof(strmsg),"[RBS]: IP адрес: '%s' находиться в банлисте. Забаненый диапазон: '%s'",checkIP,ShowIPRange);
  98.                 SendClientMessage(playerid,0xFF6600FF,strmsg);
  99.             }
  100.         }
  101.  
  102.         return 1;
  103.     }
  104.  
  105.     return 0;
  106. }
  107.  
  108. forward CheckPlayer(playerid);
  109. public CheckPlayer(playerid)
  110. {
  111.     new PlayerIP[16], strmsg[200];
  112.     GetPlayerIp(playerid,PlayerIP,sizeof(PlayerIP));
  113.  
  114.     switch(CheckIPBan(PlayerIP))
  115.     {
  116.         case -1:
  117.         {
  118.             SendClientMessage(playerid,0xFF0000FF,"[RBS]: При чтении файла произошла ошибка. Мы проверим Вас через 30 секунд.");
  119.             SetTimerEx("CheckPlayer",30000,false,"d",playerid);
  120.         }
  121.         case 0:
  122.         {
  123.             SendClientMessage(playerid,0x00FF00FF,"[RBS]: Всё нормально, можете играть.");
  124.         }
  125.         case 1:
  126.         {
  127.             format(strmsg,sizeof(strmsg),"[RBS]: IP адрес: '%s' находиться в банлисте. Забаненый диапазон: '%s'",PlayerIP,ShowIPRange);
  128.             SendClientMessage(playerid,0xFF6600FF,strmsg);
  129.             Kick(playerid);
  130.         }
  131.     }
  132. }
  133.  
  134. CheckIPBan(playerIP[])
  135. {
  136.     new bool:IPFound;
  137.     new File: f = fopen("/range_ban.lst",io_read), buff[32];
  138.     if(!f)
  139.     {
  140.         print("\n[RBS]: Error reading banlist file\n");
  141.         return -1;
  142.     }
  143.     while(fread(f,buff))
  144.     {
  145.         new IPRange[2][16], FirstIP, IP[16], CurrentIP, LastIP;
  146.         strclr(buff);
  147.         split(buff,IPRange,'-');
  148.         FirstIP = EncodeIP(IPRange[0]);
  149.         format(IP,sizeof(IP),"%s",playerIP); // Тапорка. Так мы указываем размер массива.
  150.         CurrentIP = EncodeIP(IP);
  151.         LastIP = EncodeIP(IPRange[1]);
  152.  
  153.         if(FirstIP <= CurrentIP <= LastIP)
  154.         {
  155.             IPFound = true;
  156.             format(ShowIPRange,sizeof(ShowIPRange),"%s",buff);
  157.             break;
  158.         }
  159.     }
  160.     fclose(f);
  161.  
  162.     if(IPFound == true) return 1;
  163.     else return 0;
  164. }
  165.  
  166. //-----------------------------------[Стоки]------------------------------------
  167. stock split(const strsrc[], strdest[][], delimiter = '|')
  168. {
  169.     new i, li, aNum, len, srclen = strlen(strsrc);
  170.     while(i <= srclen)
  171.     {
  172.         if (strsrc[i] == delimiter || i == srclen)
  173.         {
  174.             len = strmid(strdest[aNum], strsrc, li, i, 128);
  175.             strdest[aNum][len] = 0;
  176.             li = i + 1;
  177.             aNum++;
  178.         }
  179.         i++;
  180.     }
  181. }
  182.  
  183. stock EncodeIP(ip[], size=sizeof(ip))
  184. {
  185.     new val=0, acc=0, s=3;
  186.     for(new i=0; i < size; i++)
  187.     {
  188.         switch(ip[i])
  189.         {
  190.             case '.', '\0':
  191.             {
  192.                 val += acc << (s*8);
  193.                 acc = 0;
  194.                 if ((s--) == 0 || ip[i] == '\0') break;
  195.             }
  196.             case '0'..'9':
  197.             {
  198.                 acc = (acc * 10) + (ip[i] - '0');
  199.             }
  200.             case '*': continue;
  201.             default: printf("WARNING: unknown character #%d in ip address '%s': %c", ip[i], ip, ip[i]);
  202.         }
  203.     }
  204.  
  205.     return val;
  206. }
  207.  
  208. stock DecodeIP(value)
  209. {
  210.     new ip[16];
  211.     format(ip,sizeof(ip),"%i.%i.%i.%i",(value >> 24) & 0x000000FF,(value >> 16) & 0x000000FF,(value >> 8) & 0x000000FF,(value) & 0x000000FF);
  212.  
  213.     return ip;
  214. }
  215.  
  216. stock strclr(str[])
  217. {
  218.     for(new i=0; i<strlen(str); i++)
  219.     {
  220.         if(str[i] == '\n' || str[i] == '\r')
  221.         {
  222.             strdel(str,i,i+2);
  223.         }
  224.     }
  225. }
  226.  
  227. stock strtok(const string[], &index)
  228. {
  229.     new length = strlen(string);
  230.     while ((index < length) && (string[index] <= ' ')) index++;
  231.     new offset = index;
  232.     new result[32];
  233.     while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
  234.     {
  235.         result[index - offset] = string[index];
  236.         index++;
  237.     }
  238.     result[index - offset] = EOS;
  239.  
  240.     return result;
  241. }
  242. //------------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment