Русское сообщество по скриптингу

Редирект на внутренний IP

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Редирект на внутренний IP

Сообщение Skriptar » 07 апр 2010, 09:20

Нужен скрипт для вывода клиенту Connect 10.xxx.xxx.xxx если имя хоста содержит corbina.ru
Я знаю только то, что я ничего не знаю.
Аватара пользователя
Skriptar
 
Сообщения: 953
Зарегистрирован: 20 окт 2009, 15:34
Благодарил (а): 180 раз.
Поблагодарили: 136 раз.
Языки программирования: Counter-Strike 1.6

Re: Редирект на внутренний IP

Сообщение wext » 09 апр 2010, 23:56

Хост по ипу вроде с помощью функций в стандартынх модулях получить нельзя.

Учти, что пиринг не по всей корбине, т.е. подлючиться к тебе сможет тока пару районов, а остальные будут сосать лапу и читать ненужные сообщения.

Как вариант посмотри диапазоны ИПов корбины и на их основе уже можно писать плагин. Что самое хорошее, у них диапазоны вроде как сразу по 65 536 адресов, т.е. достаточно сделать проверку на сооветствие первых символов ИПа.
Аватара пользователя
wext
 
Сообщения: 25
Зарегистрирован: 26 фев 2010, 16:17
Благодарил (а): 13 раз.
Поблагодарили: 5 раз.
Языки программирования: Counter-Strike 1.6

Re: Редирект на внутренний IP

Сообщение Skriptar » 17 апр 2010, 13:56

Хост можно определить через модуль netdb из showip.
А диапазон исходя из маски внешнего IP смотреть ?
Я знаю только то, что я ничего не знаю.
Аватара пользователя
Skriptar
 
Сообщения: 953
Зарегистрирован: 20 окт 2009, 15:34
Благодарил (а): 180 раз.
Поблагодарили: 136 раз.
Языки программирования: Counter-Strike 1.6

Re: Редирект на внутренний IP

Сообщение qpAHToMAS » 17 апр 2010, 14:30

С диапазонами IP адресов работает iptools.inc инклуд.
Аватара пользователя
qpAHToMAS
 
Сообщения: 707
Зарегистрирован: 02 ноя 2009, 18:45
Благодарил (а): 79 раз.
Поблагодарили: 204 раз.
Языки программирования: CStrike

Re: Редирект на внутренний IP

Сообщение Skriptar » 17 апр 2010, 16:11

qpAHToMAS писал(а):С диапазонами IP адресов работает iptools.inc инклуд.


можешь в функцию check_subnet после получения IP вставить проверку на IP которые начинаются на 123.123. и вывод клиенту Connect 10.123.123.123 ?

Код: Выделить всё


#include <amxmodx>
#include <amxmisc>
#include <iptools>

public plugin_init()
{
   register_plugin("Amx Subnet Ban", "2.0", "sjgunner")
   register_cvar("amx_subnet_mode", "1") //0 - off subnet checking, 1 (default) - block users with no unique ID from subnets in ips.ini, 2 - block all users from subnets in ips.ini, 3 - allow users from subnets in ips.ini only.
   register_cvar("amx_subnet_msg", "Your subnet blocked in this server to play with old Non-Steam Patch. Please use Steam or latest client with revEmu")
   register_concmd("amx_bansubnet", "cmdAddSubnet", ADMIN_RCON, "<ip range>")
   register_concmd("amx_unbansubnet", "cmdRemoveSubnet", ADMIN_RCON, "<ip range>")
}
public client_putinserver(id)
{
   check_subnet(id)
   return PLUGIN_CONTINUE
}

public client_infochanged(id)
{
   if (!is_user_connected(id))
      return PLUGIN_CONTINUE

   new newname[32], oldname[32]
   
   get_user_name(id, oldname, 31)
   get_user_info(id, "name", newname, 31)
   if (!equal(newname, oldname))
         check_subnet(id);
   return PLUGIN_CONTINUE
}

public check_subnet(id)
{
   if (!is_user_bot(id)) {
      
      new subnetmsg[512]
      new readdata[50]
      new sipaddr1[16]
      new sipaddr2[16]
      new len, pos
      new userip[16]
      new userauth[32]
      new mode = get_cvar_num("amx_subnet_mode")
      new allowed = 0
      get_user_ip(id,userip,16,1)
      get_user_authid(id, userauth, 31)
      get_cvar_string("amx_subnet_msg", subnetmsg, 512)
      while(read_file("addons/amxmodx/configs/ips.ini",pos++,readdata,50,len)) {
         if(readdata[0] == ';' || readdata[0] == '#') continue
         replace(readdata, 50, "/", " ")
         parse(readdata, sipaddr1, 16, sipaddr2, 16)
         switch(mode)
         {
            case 1:
            {
               if (((ip_to_number(sipaddr1) <= ip_to_number(userip)) && (ip_to_number(userip) <= ip_to_number(sipaddr2))) && !((get_user_flags(id) & ADMIN_USER)) && !((get_user_flags(id) & ADMIN_RESERVATION)) && ((containi(userauth, "LAN")!=-1) || (containi(userauth, "STEAM_0:4")!=-1)))
               server_cmd("kick #%d ^"%s^"", get_user_userid(id), subnetmsg);
            }
            case 2:
            {
               if (((ip_to_number(sipaddr1) <= ip_to_number(userip)) && (ip_to_number(userip) <= ip_to_number(sipaddr2))) && !((get_user_flags(id) & ADMIN_USER)) && !((get_user_flags(id) & ADMIN_RESERVATION)))
               server_cmd("kick #%d ^"%s^"", get_user_userid(id), subnetmsg);
            }
            case 3:
            {
               if ((ip_to_number(sipaddr1) <= ip_to_number(userip)) && (ip_to_number(userip) <= ip_to_number(sipaddr2)))
               allowed = 1;
            }
         }
      }
      if((mode==3) && (allowed==0) && !((get_user_flags(id) & ADMIN_USER)) && !((get_user_flags(id) & ADMIN_RESERVATION)))
      server_cmd("kick #%d ^"%s^"", get_user_userid(id), subnetmsg);
   } else {
      set_user_flags(id,read_flags("b"))
   }
}

public cmdAddSubnet(id, level, cid)
{
   if (!cmd_access(id, level, cid, 2))
      return PLUGIN_HANDLED

   new arg[32]
   read_argv(1, arg, 31)
   write_file("addons/amxmodx/configs/ips.ini", arg, -1)
   return PLUGIN_HANDLED
}

public cmdRemoveSubnet(id, level, cid)
{
   if (!cmd_access(id, level, cid, 2))
      return PLUGIN_HANDLED
   
   new arg[32]
   read_argv(1, arg, 31)
   new len, pos
   new readdata[50]
   while(read_file("addons/amxmodx/configs/ips.ini",pos++,readdata,50,len)){
   if(readdata[0] == ';' || readdata[0] == '#') continue
   if(containi(readdata, arg)!=-1) write_file("addons/amxmodx/configs/ips.ini", "", pos-1);
   }
   return PLUGIN_HANDLED
}


Я знаю только то, что я ничего не знаю.
Аватара пользователя
Skriptar
 
Сообщения: 953
Зарегистрирован: 20 окт 2009, 15:34
Благодарил (а): 180 раз.
Поблагодарили: 136 раз.
Языки программирования: Counter-Strike 1.6

Re: Редирект на внутренний IP

Сообщение qpAHToMAS » 17 апр 2010, 17:10

Skriptar, я сам в данный момент нуждаюсь в помощи по этому вопросу :).

Вы должны зарегистрироваться, чтобы видеть ссылки., который выложил Shidla в Вы должны зарегистрироваться, чтобы видеть ссылки., он читает файл настроек с IP адресами такого вида:
Код: Выделить всё
10.10.5.0/255.255.255.0
10.10.57.0/255.255.255.0
10.10.55.0/255.255.255.0

Если я не ошибаюсь, то в твоем случае строка будет такая:
Код: Выделить всё
123.123.0.0/123.123.255.255

Но не уверен, в прочем, ты судя по всему "123" назвал как пример. Мне лично терпения не хватило разобраться в этой проверке...

Выложенный тобой SubNetBan 2 кстати тоже использует iptools.inc, но он не идет в комплекте, прикрепляю к сообщению на случай если будешь экспериментировать.
Аватара пользователя
qpAHToMAS
 
Сообщения: 707
Зарегистрирован: 02 ноя 2009, 18:45
Благодарил (а): 79 раз.
Поблагодарили: 204 раз.
Языки программирования: CStrike

Re: Редирект на внутренний IP

Сообщение Skriptar » 17 апр 2010, 17:35

new ip[25]
get_user_ip(id, ip, 25, 1)
if(ip[0] == '1')
if( (ip[1] == '0') || (containi(ip, "123.123.") != -1) )
return PLUGIN_CONTINUE

я так понял туда надо после get_user_ip:
if(userip[0] == '1')
if( (userip[1] == '0') || (containi(ip, "123.123.") != -1))
client_cmd(id, "Connect 10.123.123.123")
return PLUGIN_CONTINUE

правильно я сделал ? и еще интересно зачем нужно if(userip[0] == '1') ?
и как сделать проверку слева на право ?
Я знаю только то, что я ничего не знаю.
Аватара пользователя
Skriptar
 
Сообщения: 953
Зарегистрирован: 20 окт 2009, 15:34
Благодарил (а): 180 раз.
Поблагодарили: 136 раз.
Языки программирования: Counter-Strike 1.6

Re: Редирект на внутренний IP

Сообщение Fedcomp » 17 апр 2010, 18:48

если что
[ип]/[маска]

Где то была утилита для переделки подсетей в субнет формат
Не помогаю в ЛС - есть форум.
Плагины тоже не пишу, на форуме достаточно хороших скриптеров.


"я ставлю зависимости потому что мне приятно" - subb98 @ 2017
Аватара пользователя
Fedcomp
Администратор
 
Сообщения: 4936
Зарегистрирован: 28 авг 2009, 20:47
Благодарил (а): 813 раз.
Поблагодарили: 1317 раз.
Языки программирования: =>
pawn / php / python / ruby
javascript / rust

Re: Редирект на внутренний IP

Сообщение Skriptar » 17 апр 2010, 19:01

Зачем усложнять себе жизнь ?
Я же написал что хочу по имени хоста так как это было бы более оптимально, wext объяснил почему это не прокатить
Постоянно пополнять файл с диапазонами IP с которых можно делать редирект никому не потребуется.
Пример был не мой, поэтому мне интересно что за if(userip[0] == '1') ?
И как сделать проверку слева на право т.к. может некоторых кикнуть ошибочно насколько я понимаю.
Я знаю только то, что я ничего не знаю.
Аватара пользователя
Skriptar
 
Сообщения: 953
Зарегистрирован: 20 окт 2009, 15:34
Благодарил (а): 180 раз.
Поблагодарили: 136 раз.
Языки программирования: Counter-Strike 1.6

Re: Редирект на внутренний IP

Сообщение qpAHToMAS » 18 апр 2010, 13:43

Skriptar, походу я разобрался в этом:
Качаешь выше выложенный мною iptools.inc, кидаешь в include. В твоем плагине подсоединяешь его:
[pawn]#include <iptools>  [/pawn]
Ты, судя по коду выше уже это сделал, далее необходимо использовать "ip_to_number" функцию, которая преобразовывает IP адрес в цельное число, но для начла возьмем IP адрес игрока:
[pawn]new usrip[16]
get_user_ip(id, usrip, 16, 1) [/pawn]
Будет работать с условием того, что id -- идентификатор игрока в данном блоке. Далее ставим условие по проверке адреса:
[pawn]if(ip_to_number(usrip) >= ip_to_number("192.168.1.1") && ip_to_number(usrip) <= ip_to_number("192.168.1.255") && !is_user_bot(id))
{
    //Your code
} [/pawn]
Условие выше выполниться только если IP адрес игрока больше 192.168.1.0 и меньше 192.168.1.256, т.е. 192.168.1.XXX. Убедиться в этом ты можешь сменив usrip переменную на другой IP адрес (вне зоны):
[pawn]new usrip[16] = "192.168.2.2"
//get_user_ip(id, usrip, 16, 1)  [/pawn]
Полный код:
[pawn]new id read_data(2)
new 
usrip[16]
get_user_ip(idusrip161)

if(
ip_to_number(usrip) >= ip_to_number("192.168.1.1") && ip_to_number(usrip) <= ip_to_number("192.168.1.255") && !is_user_bot(id))
{
    
//Your code
[/pawn]
Аватара пользователя
qpAHToMAS
 
Сообщения: 707
Зарегистрирован: 02 ноя 2009, 18:45
Благодарил (а): 79 раз.
Поблагодарили: 204 раз.
Языки программирования: CStrike


Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12