Страница 1 из 1

Скрипт для сохранения ip-адреса.

СообщениеДобавлено: 28 дек 2011 08:19
ayaal_86
Есть очень хороший скрипт по по поиску ip по команде !ип. Раньше проблем не было когда бот сидел на 1м канале, потом появился 2й канал. И посадил бота на 2-м канале и тоже работает команда !ип т.е. показывает тот же ip который был на 1м канале. Хотелось бы на каналах он показывал свои ip которые были на канале.
ВОт так выглядит сам скрипт:
namespace eval ipparser {

setudef flag ipparser

bind pubm - * ::ipparser::parser
proc ::ipparser::parser {nick uhost hand chan text} {
if {[channel get $chan ipparser]} {
if {[regexp -nocase -- {^[0-9\.]{7,20}$} [join [list [lindex [split $text] 0]]]] && [string match "*\.*" [join [list [lindex [split $text] 0]]]]} {
variable ipvrem [clock format [unixtime] -format "%H:%M:%S"]
variable iptext $text
}
}
}

bind pub - !ип ::ipparser::pubcom
proc ::ipparser::pubcom {nick uhost hand chan text} {
variable ipvrem; variable iptext
if {[info exists ipvrem] && [info exists iptext]} {putserv "PRIVMSG $chan :$nick, последний ip был записан в $ipvrem -> [join [lrange [split $iptext] 0 0]] [join [lrange [split $iptext] 1 end]]"} {putserv "PRIVMSG $chan :$nick, во время моего присутствия ip не было :("}
}
}

Re: Помогите чуток переделать пожалуйста

СообщениеДобавлено: 28 дек 2011 10:49
tvrsh
TCL: [ Скачать ] [ Скрыть ]
namespace eval ipparser {

setudef flag ipparser

bind pubm - * ::ipparser::parser
proc ::ipparser::parser {nick uhost hand chan text} {
if {[channel get $chan ipparser]} {
    if {[regexp -nocase -- {^[0-9\.]{7,20}$} [join [list [lindex [split $text] 0]]]] && [string match "*\.*" [join [list [lindex [split $text] 0]]]]} {
        variable ipvrem [clock format [unixtime] -format "%H:%M:%S"]
        variable iptext $text
        variable ipchan $chan
    }
}
}

bind pub - !ип ::ipparser::pubcom
proc ::ipparser::pubcom {nick uhost hand chan text} {
variable ipvrem; variable iptext; variable ipchan
if {[channel get $chan ipparser]} {
    if {[info exists ipvrem] && [info exists iptext] && $ipchan == $chan} {
        putserv "PRIVMSG $chan :$nick, последний ip на канале $chan был записан в $ipvrem -> [join [lrange [split $iptext] 0 0]] [join [lrange [split $iptext] 1 end]]"} {
        putserv "PRIVMSG $chan :$nick, во время моего присутствия на канале $chan ip не было"
    }
}
}
}

Re: Помогите чуток переделать пожалуйста

СообщениеДобавлено: 30 дек 2011 05:21
ayaal_86
Спасибо, tvrsh!
Тут тоже проблемка есть, например:
я вожу ip на 1м канале, и выходит
•(11:07:07)• <NeiLL> 10.161.234.12 проверка команды
•(11:07:12)• <NeiLL> !ип
•(11:07:12)• <NeObot> NeiLL, последний ip на канале #honlan был записан в 11:07:07 -> 10.161.234.12 проверка команды

после этого проверяю на 2м канале, и выходит:
•(11:07:19)• <NeiLL> !ип
•(11:07:19)• <NeObot> NeiLL, во время моего присутствия на канале #zombie_master ip не было

ранее я ввел ip на канале но вышло такое сообшение что ип не было.
далее на 2м канале проверяю, и выходит:
•(11:07:38)• <NeiLL> 10.163.36.152 проверка команды !ип
•(11:07:41)• <NeiLL> !ип
•(11:07:41)• <NeObot> NeiLL, последний ip на канале #zombie_master был записан в 11:07:38 -> 10.163.36.152 проверка команды !ип

после этого иду на 1й канал и ввожу команду !ип, и выходит:
•(11:07:51)• <NeiLL> !ип
•(11:07:51)• <NeObot> NeiLL, во время моего присутствия на канале #honlan ip не было

вот такая вот проблемка вышла. Еще раз посмотрите пожалуйста. Спасибо вам.

Re: Помогите чуток переделать пожалуйста

СообщениеДобавлено: 09 янв 2012 14:14
ayaal_86
tvrsh жду с надеждой, что вы решите проблему с командой.
Спасибо вам.

Re: Помогите чуток переделать пожалуйста

СообщениеДобавлено: 09 янв 2012 16:45
tvrsh
Попробуй это.

TCL: [ Скачать ] [ Скрыть ]
namespace eval ipparser {

setudef flag ipparser

bind pubm - * ::ipparser::parser
proc ::ipparser::parser {nick uhost hand chan text} {
global iplist
if {[channel get $chan ipparser]} {
    if {[regexp -nocase -- {^[0-9\.]{7,20}$} [join [list [lindex [split $text] 0]]]] && [string match "*\.*" [join [list [lindex [split $text] 0]]]]} {
        set ipvrem [clock format [unixtime] -format "%H:%M:%S"]
        set iptext $text
        set ipchan $chan

        if {[info exists iplist] && $iplist != ""} {
            set index [lsearch $iplist "$chan*"]
        } else {
            set index "-1"
        }

        if {$index == "-1"} {
            lappend iplist "$ipchan|$iptext|$ipvrem"
        } else {
            lreplace $iplist $index $index "$ipchan|$iptext|$ipvrem"
        }
    }
}
}

bind pub - !ip ::ipparser::pubcom
proc ::ipparser::pubcom {nick uhost hand chan text} {
global iplist
if {[channel get $chan ipparser]} {
    set index [lsearch -inline $iplist "$chan*"]
    if {[string is space $index]} {
        putserv "PRIVMSG $chan :$nick, во время моего присутствия на канале $chan ip не было"
    } else {
        putserv "PRIVMSG $chan :$nick, последний ip на канале [lindex [split $index "|"] 0] был записан в [lindex [split $index "|"] 2] -> [join [lrange [split [lindex [split $index "|"] 1]] 0 0]] [join [lrange [split [lindex [split $index "|"] 1]] 1 end]]"
    }
}
}
}


Добавлено спустя 42 минуты 50 секунд:
Обновил, пробуй.

Re: Помогите чуток переделать пожалуйста

СообщениеДобавлено: 09 янв 2012 18:44
Vertigo
lsearch с ключом -inline возвращает список. В случае ненахождения, вернется пустой список. Логичнее проверять на
 if {[string is space $index]} {

Re: Помогите чуток переделать пожалуйста

СообщениеДобавлено: 09 янв 2012 20:29
tvrsh
Vertigo, спасибо.
Подправил скрипт.

Re: Помогите чуток переделать пожалуйста

СообщениеДобавлено: 10 янв 2012 01:51
ayaal_86
Спасибо вам. но все равно есть проблемка, вот логи:

•(07:44:30)• <neill> 10.0.0.01 проверка команды !ип
•(07:44:50)• <neill> !ип
•(07:44:50)• <BotNet> neill, последний ip на канале #cod4mw2_promod был записан в 07:43:41 -> 10.0.0.01 проверка команды !ип
•(07:46:41)• <neill> 10.0.0.111 проверка команды !ип
•(07:46:43)• <neill> !ип
•(07:46:43)• <BotNet> neill, последний ip на канале #cod4mw2_promod был записан в 07:43:41 -> 10.0.0.01 проверка команды !ип
•(07:47:54)• <neill> 94.0.01.2
•(07:47:58)• <neill> !ип
•(07:47:58)• <BotNet> neill, последний ip на канале #cod4mw2_promod был записан в 07:43:41 -> 10.0.0.01 проверка команды !ип

Мы видим тут, что он сохраняет себе токо 1 ip след после первого он не видит. а по идее должен же менять и выводит последний ip. а так на обеих канал выводит свои ip.

Re: Помогите чуток переделать пожалуйста

СообщениеДобавлено: 10 янв 2012 17:30
tvrsh
Проверь с другими ипом, а то 94.0.01.2 какой-то странный. Может его регэксп не ловит.

Re: Помогите чуток переделать пожалуйста

СообщениеДобавлено: 10 янв 2012 18:25
ayaal_86
проверил другие ip вводить, результат тот же. опять же выдает первый ip который был введенн на канале, а текушего не выводит.

Re: Скрипт для сохранения ip-адреса.

СообщениеДобавлено: 23 янв 2012 18:13
ayaal_86
tvrsh, еще раз посмотришь скрипт? а то жду жду. сделаешь пожалуйста. прошу очень.

Re: Скрипт для сохранения ip-адреса.

СообщениеДобавлено: 23 янв 2012 21:05
tvrsh
Теперь точно работает.
TCL: [ Скачать ] [ Скрыть ]
namespace eval ipparser {

set iplist "";

setudef flag ipparser

bind pubm - * ::ipparser::parser
proc ::ipparser::parser {nick uhost hand chan text} {
global iplist
if {[channel get $chan ipparser]} {
    if {[regexp -nocase -- {^[0-9\.]{7,20}$} [join [list [lindex [split $text] 0]]]] && [string match "*\.*" [join [list [lindex [split $text] 0]]]]} {
        set ipvrem [clock format [unixtime] -format "%H:%M:%S"]
        set iptext $text
        set ipchan $chan

        if {[info exists iplist] && $iplist != ""} {
            set index [lsearch $iplist "$chan*"]
        } else {
            set index "-1"
        }


        if {$index == "-1"} {
            lappend iplist "$ipchan|$iptext|$ipvrem"
        } else {
           set iplist [lreplace $iplist $index $index "$ipchan|$iptext|$ipvrem"]
        }

    }
}
}

bind pub - !ip ::ipparser::pubcom
proc ::ipparser::pubcom {nick uhost hand chan text} {
global iplist
if {[channel get $chan ipparser]} {

    set index [lsearch -inline $iplist "$chan*"]
    if {$index == "-1"} {
        putserv "PRIVMSG $chan :$nick, во время моего присутствия на канале $chan ip не было"
    } else {
        putserv "PRIVMSG $chan :$nick, последний ip на канале [lindex [split $index "|"] 0] был записан в [lindex [split $index "|"] 2] -> [join [lrange [split [lindex [split $index "|"] 1]] 0 0]] [join [lrange [split [lindex [split $index "|"] 1]] 1 end]]"
    }
}
}
}


Почему-то при использовании Lreplace не работает
lreplace $iplist $index $index "$ipchan|$iptext|$ipvrem"
, а
set iplist [lreplace $iplist $index $index "$ipchan|$iptext|$ipvrem"]
отлично изменяет список.
А с Lappend все нормально.

Re: Скрипт для сохранения ip-адреса.

СообщениеДобавлено: 24 янв 2012 02:05
ayaal_86
спасибо. очень даже хорошо.
1 проблемка не большая, если не было ип то сообщение не выводит почему то.
putserv "PRIVMSG $chan :$nick, во время моего присутствия на канале $chan ip не было"

сможешь это еще пожалуйста пересмотреть.

Re: Скрипт для сохранения ip-адреса.

СообщениеДобавлено: 24 янв 2012 19:19
tvrsh
В процедуре ::ipparser::pubcom замени
if {$index == "-1"} {
на
if {$index == ""} {

Re: Скрипт для сохранения ip-адреса.

СообщениеДобавлено: 26 янв 2012 09:20
ayaal_86
пробовал так же, не выводит сообщение.

Re: Скрипт для сохранения ip-адреса.

СообщениеДобавлено: 04 фев 2012 12:16
tvrsh
Замени
    set index [lsearch -inline $iplist "$chan*"]
на
TCL: [ Скачать ] [ Скрыть ]
if {[info exist iplist] && $iplist != ""} {
    set index [lsearch -inline $iplist "$chan*"]
} else {
    set index ""
}


Весь скрипт:
TCL: [ Скачать ] [ Скрыть ]
namespace eval ipparser {

set iplist "";

setudef flag ipparser

bind pubm - * ::ipparser::parser
proc ::ipparser::parser {nick uhost hand chan text} {
global iplist
if {[channel get $chan ipparser]} {
    if {[regexp -nocase -- {^[0-9\.]{7,20}$} [join [list [lindex [split $text] 0]]]] && [string match "*\.*" [join [list [lindex [split $text] 0]]]]} {
        set ipvrem [clock format [unixtime] -format "%H:%M:%S"]
        set iptext $text
        set ipchan $chan

        if {[info exists iplist] && $iplist != ""} {
            set index [lsearch $iplist "$chan*"]
        } else {
            set index "-1"
        }


        if {$index == "-1"} {
            lappend iplist "$ipchan|$iptext|$ipvrem"
        } else {
           set iplist [lreplace $iplist $index $index "$ipchan|$iptext|$ipvrem"]
        }

    }
}
}

bind pub - !ip ::ipparser::pubcom
proc ::ipparser::pubcom {nick uhost hand chan text} {
global iplist
if {[channel get $chan ipparser]} {

if {[info exist iplist] && $iplist != ""} {
    set index [lsearch -inline $iplist "$chan*"]
} else {
    set index ""
}

    if {$index == ""} {
        putserv "PRIVMSG $chan :$nick, во время моего присутствия на канале $chan ip не было"
    } else {
        putserv "PRIVMSG $chan :$nick, последний ip на канале [lindex [split $index "|"] 0] был записан в [lindex [split $index "|"] 2] -> [join [lrange [split [lindex [split $index "|"] 1]] 0 0]] [join [lrange [split [lindex [split $index "|"] 1]] 1 end]]"
    }
}
}
}

Re: Скрипт для сохранения ip-адреса.

СообщениеДобавлено: 09 янв 2013 18:03
SuSpeCT
помогите взял я этот скрипт сделал все хорошо но только вот
проблема в том что он напрочь отказывается записывать порт игры
т.е я например пишу на канале
127.0.0.1 проверка
!ип
он выводит то что я написал
но как только пишу
127.0.0.1:27015
он выводит мне
127.0.0.1 проверка прошу помочь что надо сделать в процедуре?

Re: Скрипт для сохранения ip-адреса.

СообщениеДобавлено: 09 янв 2013 18:16
SuSpeCT
помогите
скрипт не записывет ипы с портом
т.е
я пишу
127.0.0.1 проверка
он записывает
а как только пишу
127.0.0.1:27015
все он не записывает и выводит мне
127.0.0.1 проверка
помогите пожалуйста

Re: Скрипт для сохранения ip-адреса.

СообщениеДобавлено: 09 янв 2013 23:39
tvrsh
Тут регэксп для ip-адреса очень неточный.
Попробуй такой скрипт:
TCL: [ Скачать ] [ Скрыть ]
namespace eval ipparser {

set iplist "";

setudef flag ipparser

bind pubm - * ::ipparser::parser
proc ::ipparser::parser {nick uhost hand chan text} {
global iplist
if {[channel get $chan ipparser]} {
    if {[::ipparser::findgameserver [join [list [lindex [split $text] 0]]]]} {
        set ipvrem [clock format [unixtime] -format "%H:%M:%S"]
        set iptext $text
        set ipchan $chan

        if {[info exists iplist] && $iplist != ""} {
            set index [lsearch $iplist "$chan*"]
        } else {
            set index "-1"
        }


        if {$index == "-1"} {
            lappend iplist "$ipchan|$iptext|$ipvrem"
        } else {
           set iplist [lreplace $iplist $index $index "$ipchan|$iptext|$ipvrem"]
        }

    }
}
}

bind pub - !ip ::ipparser::pubcom
proc ::ipparser::pubcom {nick uhost hand chan text} {
global iplist
if {[channel get $chan ipparser]} {

if {[info exist iplist] && $iplist != ""} {
    set index [lsearch -inline $iplist "$chan*"]
} else {
    set index ""
}

    if {$index == ""} {
        putserv "PRIVMSG $chan :$nick, во время моего присутствия на канале $chan ip не было"
    } else {
        putserv "PRIVMSG $chan :$nick, последний ip на канале [lindex [split $index "|"] 0] был записан в [lindex [split $index "|"] 2] -> [join [lrange [split [lindex [split $index "|"] 1]] 0 0]] [join [lrange [split [lindex [split $index "|"] 1]] 1 end]]"
    }
}
}

# Взято из http://tclhelp.net/unb/71,1#235
proc ::ipparser::findgameserver {str} {
    global re_gameserver;
    set re_port {([1-9]\d{0,4}|(((([0-5]\d|6[0-4])\d|65[0-4])\d|655[0-2])\d|6553[0-5]))} # port 1-65535
    set re_ipblk_m {([1-9]|(\d|1\d|2[0-4])\d|25[0-5])} # all but last ip block 0-255
    set re_ipblk_e {((\d?|1\d|2[0-4])\d|25[0-4])} # last ip block 1-254
    if {![info exists re_gameserver]} { # cache compiled re globally
        set re_gameserver "\[\[:<:]]($re_ipblk_m\.){3}($re_ipblk_e):($re_port)\[\[:>:]]" }
    if {regexp -- $re_gameserver $str} {
        return 1
    } else {
        return 0
    }
}

}