Вот процедура добавления в фалй и присвоения каждой строке индекса/номера.
bind pub o|o !add add
proc add {nick uhost hand chan text} {
# Тут считываем данные из файла в переменную data.
set fname "yourfile.txt"
set fp [open $fname "r"]
set data [read -nonewline $fp]
close $fp
# Устанавливаем индекс строки который равен количеству строк.
set index [llength [split $data "\n"]]
set fp [open $fname "a+"]
# При записи в файл увеличиваем индекс на 1.
puts $fp "[expr $index + 1]|$text"
close $fp
putserv "PRIVMSG $chan :$nick, твоя строка $text добавлена с индексом [expr $index + 1]."
}
<tvrsh> !add a
<@bionic> tvrsh, твоя строка a добавлена с индексом 1.
<tvrsh> !add b
<@bionic> tvrsh, твоя строка b добавлена с индексом 2.
...
<tvrsh> !add e
<@bionic> tvrsh, твоя строка e добавлена с индексом 5.
И в файле yourfile.txt в корне бота имеем такое
1|a
2|b
3|c
4|d
5|e
Не очень хорошая идея давать номер каждой строке, как как при удалении стоки из середины файла придется переписывать номера всех строк после нее.
Пока над другим вариантом подумаю.
Добавлено спустя 23 минуты 36 секунд:
# Указываем канал.
set _chan "#erotic"
# и начальный индекс топика. Это менять не надо.
set index 0
bind time - "* * * * *" topic
proc topic {min hour day month year} {
global index _chan
set fname "yourfile.txt"
set fp [open $fname "r"]
set data [read -nonewline $fp]
close $fp
# Считываем данные из файла и показываем индексный топик по счету.
putserv "TOPIC $_chan :[lindex [split $data "\n"] $index]"
# после чего увеличиваем индекс.
incr index
}
# Процедура добавления строк.
bind pub o|o !add add
proc add {nick uhost hand chan text} {
set fname "yourfile.txt"
set fp [open $fname "a+"]
puts $fp "$text"
close $fp
putserv "PRIVMSG $chan :$nick, строка $text добавлена."
}
# Процедура удаления строк. Для удаления указывай точный текст строки.
bind pub o|o !del del
proc del {nick uhost hand chan text} {
set fname "yourfile.txt"
set fp [open $fname "r"]
set data [read -nonewline $fp]
close $fp
set index 0
set nomer ""
foreach line [split $data "\n"] {
incr index
if {$line == $text} {
set nomer [expr $index - 1]
}
}
if {$nomer != ""} {
set data [lreplace [split $data "\n"] $nomer $nomer]
} else {
putserv "PRIVMSG $chan :$nick, строка $text не найдена в базе."
return 0
}
set fp [open $fname "w"]
puts $fp [join $data "\n"]
close $fp
putserv "PRIVMSG $chan :$nick, строка $text удалена."
}
<tvrsh> !del c
<@bionic> tvrsh, строка c удалена.
* bionic changes topic to 'a'
* bionic changes topic to 'b'
* bionic changes topic to 'd'
...
Не хватает только всяких проверок на пустую строку и типо того, но это уж сам дописывай.