Регистрация | Вход
[ Главная · Новые сообщения ]
Форум » Основной раздел » Мастерская » Вопросы по скриптам
Вопросы по скриптам
pLanu2 14.08.12 11:15 #226
Quote
6. Скрипт добавляет строку в файл:


Code
bind pub - !строка com6                           

proc com6 {nick uhost hand chan text} {                           
set file "baza.txt"                           
if {$text == ""} {putserv "NOTICE $nick :Формат: !строка <текст>"; return}     
set filep [open $file a+]                           
puts $filep $text                           
close $filep                           
puthelp "NOTICE $nick :Строка была успешно сохранена. Спасибо!"                           
}


как сделать, чтобы не добавлять, а удалять строку из файла?
и еще: как перемещать строки в файле, например: вторую строку сделать 1, или 1 сделать второй?
Vladislav 14.08.12 15:55 #227
Про удаление строк добавил пример под номером 16. Про перемещение не буду писать готовый скрипт так как всё есть в 16-м примере, а лишь приведу пример самого действия перемещения:

Quote

# К примеру команда у нас "!перенос 1 5" (первую строку на пятую), до этого мы уже прочитали файл и создали список в переменной $list
# позиция элемента который переносим

set plist [expr [lindex [split $text] 0]-1]
# запоминаем его
set alist [lindex $list $plist]
# убираем его
set list [lreplace $list $plist $plist]
# добавляем его на нужную позицию
set list [linsert $list [expr [lindex [split $text] 1]-1] $alist]
осталось переписать файл


Quote
<Vladislav> !tcl set text "1 5"; set list {1 2 3 4 5}; set plist [expr [lindex [split $text] 0]-1]; set alist [lindex $list $plist]; set list [lreplace $list $plist $plist]; set list [linsert $list [expr [lindex [split $text] 1]-1] $alist]; return $list
<Windrop> [RETURN 0.101ms] 2 3 4 5 1
pLanu2 15.08.12 13:00 #228
а как сделать в скрипте

Code
bind pub - !-строка com16   

proc com16 {nick uhost hand chan text} {   
set file "baza.txt"   
# если команда без параметров то напоминаем их   
if {$text == ""} {putserv "NOTICE $nick :Формат: !-строка <номер/текст/все>"; return}   
# создаём файл если его нет   
if {![file exists $file]} {set f [open $file w+]; close $f}   
# читаем файл   
set filep [open $file r]; set list [lrange [split [read $filep] \n] 0 end-1]; close $filep   
# если файл пустой то сообщаем об этом   
if {$list == ""} {putserv "NOTICE $nick :База пуста."; return}   
# если указаны цифры то удаляем строку по номеру   
if {[string is digit $text]} {   
# проверяем есть ли такой номер   
if {$text <= [llength $list]} {   
# формируем новый список без этой строки   
set list [lreplace $list [expr $text-1] [expr $text-1]]   
# переписываем файл   
set filep [open $file w+]; foreach line $list { puts $filep $line }; close $filep   
# сообщаем что всё хорошо   
putserv "NOTICE $nick :Строка под номером $text удалена."; return   
} {   
# сообщаем что такой строки нет   
putserv "NOTICE $nick :Строки под номером $text не существует. Всего строк: [llength $list]."; return}   
} {   
# если указано слово "все" то чистим файл   
if {$text == "все"} {set f [open $file w+]; close $f; putserv "NOTICE $nick :Все строки удалены."; return}   
# в другом случае сравниваем строки, проверяем есть ли такая строка, если есть то получаем сразу её номер   
if {[set num [lsearch -exact -nocase $list $text]] != -1} {   
# формируем новый список без этой строки   
set list [lreplace $list $num $num]   
# переписываем файл   
set filep [open $file w+]; foreach line $list { puts $filep $line }; close $filep   
# сообщаем что всё хорошо   
putserv "NOTICE $nick :Строка \"$text\" удалена."; return   
} {   
# сообщаем что такой строки нет   
putserv "NOTICE $nick :Строки \"$text\" не существует."; return}   
}   
}


только надо изменить строку по номеру, например: !изменить 3 [текст]
con 15.08.12 15:18 #229
Нужна помощь чтобы установит stats.mod а именно веб статистику
Vladislav 15.08.12 17:51 #230
pLanu2:

Code
if {[string is digit [lindex [split $text] 0]]} {
set list [lreplace $list [expr [lindex [split $text] 0]-1] [expr [lindex [split $text] 0]-1] [join [lrange [split $text] 1 end]]]
}


Quote
<Vladislav> !tcl set text "2 -"; set list {1 2 3 4 5}; if {[string is digit [lindex [split $text] 0]]} {set list [lreplace $list [expr [lindex [split $text] 0]-1] [expr [lindex [split $text] 0]-1] [join [lrange [split $text] 1 end]]]}; return $list
<Windrop> [RETURN 0.11ms] 1 - 3 4 5


con:

в conf/stats.conf смотри (у меня нет возможности потестить параметры), статистика там убогая, я советую юзать pisg.
pLanu2 16.08.12 10:12 #231
Quote
[15:08:04] <@HKS> проверка
[15:08:04] <@HKS>

почему когда я добавляю строку в файл, а потом читаю их, он выводит строки, но еще и пробел, то есть пустую строку, на которой ничего нет, когда я ее вручную удаляю из файла, он уже потом не может удалять и изменять строки, пишет строки не существует
а когда я не удаляю этот пробел (пустую строку) в файле, он пишет все хорошо
как сделать, чтобы он не выводил эту пустую строку (т.к. я ее не писал)?
Vladislav 16.08.12 10:18 #232
Когда ты редактируешь файл через бота, всегда будет пустая строка внизу. Приведи код вывода. В нём надо указать чтоб он не выводил пустые строки либо указать чтоб не выводил только последнюю.
P.S: в ирклайне например пустые строки не выводит сервер)
pLanu2 16.08.12 10:48 #233
какое действие нужно, чтобы бот не выводил пустые строки?
Vladislav 16.08.12 10:58 #234
Когда идёт чтение файла:

Quote
set filep [open $file r]
set list [lrange [split [read $filep] \n] 0 end-1]
close $filep


или перед выводом строки

Quote
foreach line [split [read $filep] \n] {
if {$line == ""} {continue}
putserv "PRIVMSG $chan :$line"
}


или так

Quote
foreach line [lrange [split [read $filep] \n] 0 end-1] {
putserv "PRIVMSG $chan :$line"
}


а можно то и то

Quote
foreach line [lrange [split [read $filep] \n] 0 end-1] {
if {$line == ""} {continue}
putserv "PRIVMSG $chan :$line"
}
Jake 16.08.12 16:24 #235
а как в скрипт botisaop.tcl добавить функцию чтобы бот брал себе обратно статус хопа (полуоператора) при дехопе ?

написал в скрипт:

Quote
bind need - "% halfop" need:halfopwc
proc need:halfopwc {chan type} {
if {[channel get $chan botisaop]} {
global botnick
putquick "ChanServ HALFOP $chan $botnick"
}
}

но почему-то не работает ....
Vladislav 16.08.12 17:21 #236
Не работает потому что в боте нет такой функции для хопа. Добавил для хопа альтернативный вариант. Обнови скрипт.
pLanu2 17.08.12 19:19 #237
почему, когда я добавил несколько строк, а потом хочу изменить последнюю, он пишет: такой строки нет, все строк: 4, хотя изменяю последнюю - четвертую, если например: добавлю 5 строку, то можно будет изменить 4, но 5 нельзя, будет тоже самое, и изменится она только, когда я создам 6

Code
proc file {nick uhost hand chan text} {   
set file "data/file.txt"   
if {$text == ""} {putserv "NOTICE $nick :!&строка <номер> <текст>"; return}   
if {![file exists $file]} {set f [open $file w+]; close $f}   
set filep [open $file r]; set list [lrange [split [read $filep] \n] 0 end-1]; close $filep   
if {$list == ""} {putserv "NOTICE $nick :База пуста"; return}   
if {[string is digit [lindex [split $text] 0]]} {   
if {$text <= [llength $list]} {   
set list [lreplace $list [expr [lindex [split $text] 0]-1] [expr [lindex [split $text] 0]-1] [join [lrange [split $text] 1 end]]]   
set filep [open $file w+]; foreach line $list { puts $filep $line }; close $filep   
putserv "NOTICE $nick :Строка под номером $text успешно изменена"; return   
} {   
putserv "NOTICE $nick :Строки под номером $text не существует. Всего строк: [llength $list]."; return}   
if {[set num [lsearch -exact -nocase $list $text]] != -1} {   
set list [lreplace $list $num $num]   
set filep [open $file w+]; foreach line $list { puts $filep $line }; close $filep   
putserv "NOTICE $nick :Строка под номером $text успешно изменена"; return   
} {   
putserv "NOTICE $nick :Строки под номером $text не существует. Всего строк: [llength $list]."; return}   
}   
}
Vladislav 17.08.12 20:20 #238
Во-первых такое имя процедуры уже есть в боте подобное наслоение приведёт к ошибкам. Во-вторых тут уже два параметра задействованы в отличие от прошлых команд и это надо учитывать, в-третьих действие сверяющие по тексту тут не нужно.

Quote
bind pub - !замена zamenastr

proc zamenastr {nick uhost hand chan text} {
set file "data/file.txt"
if {$text == "" || [lindex [split $text] 1] == ""} {putserv "NOTICE $nick :!замена <номер> <текст>"; return}
if {![file exists $file]} {set f [open $file w+]; close $f}
set filep [open $file r]; set list [lrange [split [read $filep] \n] 0 end-1]; close $filep
if {$list == ""} {putserv "NOTICE $nick :База пуста"; return}
if {[string is digit [lindex [split $text] 0]]} {
if {[lindex [split $text] 0] <= [llength $list]} {
set list [lreplace $list [expr [lindex [split $text] 0]-1] [expr [lindex [split $text] 0]-1] [join [lrange [split $text] 1 end]]]
set filep [open $file w+]; foreach line $list { puts $filep $line }; close $filep
putserv "NOTICE $nick :Строка под номером [lindex [split $text] 0] успешно изменена."; return
} {
putserv "NOTICE $nick :Строки под номером [lindex [split $text] 0] не существует. Всего строк: [llength $list]."; return}
}
}
Rorsheg 17.08.12 23:47 #239
Возможен ли такой скрипт?
Vladislav 18.08.12 00:35 #240
Цитата
bind pub - !текст wtextoutput

proc wtextoutput {nick uhost hand chan text} {
set file "baza.txt"
if {![file exists $file]} {return}
set filep [open $file r]; set line [split [read $filep] \n]; close $filep
if {[llength $line] >= 24} {putserv "PRIVMSG $chan :[lindex $line 24]"}
}


или

Цитата
bind pub - !текст wtextoutput

proc wtextoutput {nick uhost hand chan text} {
set file "baza.txt"
if {![file exists $file]} {return}
set filep [open $file r]
set i 0; foreach line [split [read $filep] \n] {
if {$i == 24} {putserv "PRIVMSG $chan :$line"}
incr i
}
close $filep
}
Форум » Основной раздел » Мастерская » Вопросы по скриптам
Поиск: