Ваша проблема заключается в том, что вы не соблюдаете последовательность выполняемых действий в коде. Например, некая команда, для которой нужно использовать какие то данные должна выполняться только после того, как будут получены эти данные или будет выполнена другая команда для получения и сохранения этих данных. В этом вам помогают различные обработчики событий, проверочные условия, переменные и алиасы, чтобы точно знать, после какого события, при каком совпадении данных и в каком месте кода нужно что-то указать, чтобы это было выполнено в нужное время и только после того как будут выполнены другие действия с сохранением необходимых данных.
Так как после выполнения команды "whois" для запроса у сервера пользовательских данных и их получения с помощью обработчика событий "raw 319:*:" требуется какое то время, то команда "set %canalescom $3-" для сохранения списка каналов пользователя выполняется с задержкой. Поэтому она остается сохранённой в списке ваших переменных и не удаляется с помощью команды "unset %canalescom", потому что алиас "texto" запускается сразу, после открытия приватного окна, что способствует выполнению всех команд, указанных в алиасе - значительно раньше и быстрее, чем срабатывает обработчик событий "raw". То есть, сначала переменная удаляется, а потом сохраняется. Но в вашем случае всё должно быть наоборот. Сначала должны быть получены данные и сохранены в переменную, чтобы в дальнейшем они могли быть использованы в командах, которые прописаны в алиасе "texto", и только потом, в конце кода, эти переменные должны быть удалены.
Далее, если я правильно понял ваш другой вопрос, то вы никак не сможете узнать, какой именно канал сейчас является активным у пользователя, который написал вам в приват. Только, если он вам сам передаст название активного канала. Но даже если представить, что это было бы возможно, то названием активного окна скорее всего будет не канал, а приватное окно с вашим ником, т.к. пользователь в этот момент написал вам в предварительно открытое приватное окно, например с помощью команды "/query Your_Nick Hello bro!", если конечно он не использовал другую команду "/msg Your_Nick How are you?", которая позволяет писать в приват другому пользователю без открытия нового окна в его собственном mIRC, пока не будет получен обратный ответ".
[indent=0.8,0.5]
Итак, вы можете попробовать использовать этот изменённый код скрипта:
Код:
on !*:OPEN:?: whois $nick
raw 319:*: set %nickq $2 | set %canalescom $3- | texto | haltdef
alias -l texto {
if (!$window(@privados)) { window -lke @privados 516 200 1582 253 font arial 15 }
aline @privados 00,04ATENCION %nickq 42|P|68 $date $time 42 %canalescom
var %mes $replace($asctime(mmmm),January,Enero,February,Febrero,March,Marzo,April,Abril,May,Mayo,June,Junio,July,Julio,August,Agosto,September,Septiembre,October,Octubre,November,Noviembre,December,Diciembre)
var %dia $replace($asctime(dddd),Sunday,Domingo,Monday,Lunes,Tuesday,Martes,Wednesday,Miércoles,Thursday,Jueves,Friday,Viernes,Saturday,Sabado)
echo -q (E)nSesion: %dia $date(dd) de %mes de $date(yyyy)
echo -q 00,02Hora: $time - 00,02Mascara: $address(%nickq,5)
echo -q 00,04Canales: %canalescom
unset %nickq %canalescom
}
Объяснение действий кода:
[c=black]on !*:OPEN:?: whois $nick[/c] - после того как открылось приватное окно скрипт делает запрос на сервер командой "whois" для получения пользовательских данных указанного ника.
[c=black]raw 319:*: set %nickq $2 | set %canalescom $3- | texto | haltdef[/c] - далее обработчик событий "raw" отлавливает необработанное (сырое) серверное сообщение под номером "319" со списком каналов, на которых присутствует пользователь, после чего выполняется команда "set %nickq $2" для записи в переменную ника пользователя и команда "set %canalescom $3-" для записи в переменную списка каналов, на которых присутствует этот ник. И только после этого выполняется команда "texto", которая вызывает одноимённый алиас, в котором будут выполнены все остальные команды, использующие сохранённые в переменных данные. Хотя на самом деле можно было обойтись без алиаса и прописать всё это сразу внутри фигурных скобок обработчика событий "raw", сделав всё проще и быстрее, без создания каких либо дополнительных переменных. В конце идёт команда "haltdef", которая останавливает дальнейшую обработку события и помогает скрыть оригинальное сообщение "whois", но не останавливает выполнение скрипта, в отличии от команды "halt".
Таким образом теперь всё должно работать правильно, а команды должны выполняться последовательно следуя друг за другом и не опережая другие выполняемые действия.
- Подпись автора
[html]<style>img {vertical-align:middle;}.hnet{color:#FFFFFF;}.hstar{color:#DE0000;}.htext{font-family:Verdana;font-size:13px;color:#6E1E00;}.heading{font-family:Verdana;font-size:13px;font-weight:bold;background-color:#4897E7;}.stitle{font-family:Verdana;font-size:12px;}.dot{color:#808000;}.desc{color:#ADADAD;}a .curl{font-family:Verdana;font-size:13px;color:#3A92CD;}</style><table><tr><td width="20px" height="20px"><img src="https://forumstatic.ru/files/000d/c9/8c/34681.jpg"></td><td><a href="https://forum.epicnet.ru/viewtopic.php?id=234"><span class="heading"> <span class="hstar">★</span> <span class="hnet">EpicNet.Ru</span> <span class="hstar">★</span> </span><span class="htext"> - IRC Чат © 2008</span></a></td></tr><tr><td></td><td><div class="stitle"><span class="dot">•</span> <span class="desc">Вход через вебгейт:</span> <a href="http://irc.epicnet.ru"><span class="curl">http://irc.epicnet.ru</span></a><br><span class="dot">•</span> <span class="desc">Сервер:</span> irc.epicnet.ru <span class="desc">Порты:</span> 6667, 6668 (ssl)<br><div></td></tr></table>[/html]