Скрипт Mirc, чтобы найти точное совпадение в списке клиентов
Я использую это, чтобы найти имя клиента в текстовом файле. Имена каждого на отдельной строке. Мне нужно найти точное имя. Если искать Ник специально, он должен найти только Ника, но мой код скажет "найдено", даже если в списке есть только Никольсон.
On*:text:*!Customer*:#: {
if ($read(system\Customer.txt,$2)) {
.msg $chan $2 Customer found in list! | halt }
else { .msg $chan 4 $2 Customer not found in list. | halt }
}
2 ответа
Если вы ищете точное совпадение в отдельном списке новой строки, то вы можете использовать переключатель "w" без использования подстановочного знака "*".
Из документации mIRC
$read(имя файла, [ntswrp], [matchtext], [N])
Сканирует файл info.txt для строки, начинающейся со слова mirc, и возвращает текст, следующий за значением совпадения. //echo $read(help.txt, w, *help*)
Поскольку мы не хотим совпадения с подстановочными знаками, но точного соответствия, мы будем использовать:
$read(customers.txt, w, Nick)
Полный код:
ON *:TEXT:!Customer *:#: {
var %foundInTheList = $read(system\Customer.txt, w, $2)
if (%foundInTheList) {
.msg # $2 Customer found in list!
}
else {
.msg 4 # $2 Customer not found in list.
}
}
Несколько замечаний по оригинальному коду
запинающийся
halt
следует использовать только тогда, когда вы хотите принудительно остановить любую будущую обработку. В большинстве случаев вы можете избежать этого, написав свой поток кода таким образом, что он будет вести себя так, без явного использования halting. Это также решит новые проблемы, которые могут возникнуть, в случае, если вы захотите добавить новый код, но вы будете удивляться, почему он не выполняется.. из-за черта, который сейчас забыт halt
команда. Это также улучшит вашу отладку, в том случае, если вы не будете удивляться выходу из другого потока без вашего ведома.
читабельность
if (..) {
.... }
else { .. }
При рассмотрении множества строк кода внутри первого { } будет трудно заметить else
(или же elseif
) потому что удаленный парсер mIRC будет иметь ту же идентификацию, что и строка else, а также строку над ней, которая содержит закрывающий символ }
код. Вы должны почти всегда иметь немного дополнительного кода в случае читабельности, особенно если он ничего нового не стоит! Как я помню, новые строки бесплатны.
Поэтому убедитесь, что у каждой команды в новой строке есть правило удара. (включая закрывающую скобку)
Соответствующий текст
On*:text:*!Customer*:#: {
Приведенный выше код имеет критическую проблему и ошибку.
Критическое: не будет работать, потому что в *: текст не содержит пробелов между on
а также *:text
Ошибка :! Клиент будет соответствовать EVERYTHING-BEFORE!customerANDAFTER <NICK>
, что явно не желаемое поведение. Что вы хотите :!Customer *:
будет соответствовать, только если первое слово было!customer, и вы должны ввести хотя бы другой текст, потому что я использовал [SPACE]*.
Вы должны пройтись по каждой совпадающей строке и посмотреть, является ли линия точным соответствием
Что-то вроде этого
On*:text:*!Custodsddmer*:#: {
var %nick
; loop over all lines that contains nick
while ($read(customer.txt, nw, *nick*, $calc($readn + 1))) {
; check if the line is an exact match
if ($v1 == nick) {
%nick = $v1
; stop the loop because a result is found
break;
}
}
if (%nick == $null) {
.msg $chan 4 $2 Customer not found in list.
}
else{
.msg $chan $2 Customer found in list!
}
Вы можете найти больше здесь: https://en.wikichip.org/wiki/mirc/text_files