Как проверить, зарегистрировано ли 4 доллара в IRC?

Я довольно опытный специалист по программированию на языке MSL, однако я незнаком с необработанными командами и еще много чего.

Я нахожусь в разработке нового сценария. В этом сценарии я хотел бы проверить, является ли $4 в том, что пользователь говорит, зарегистрированным ником или нет, но я не знаю, как это сделать.

Большое спасибо за любую помощь и / или совет заранее.

С наилучшими пожеланиями, Тим

Обновить:

raw 307:*:{ set $+(%,%chan,-,%CheckNick) Registered }
on *:TEXT:*:#:{
    if ($1 == !regtest) {
        set %chan $remove($chan,$chr(35))

        set %CheckNick $4
        whois $4
    }
    if ($($+(%,%chan,-,%CheckNick),$4),5) != $null) {
        do this...
    }
    else {
        else message...
    }
}

Я получил это на работу, чтобы проверить, однако, мой оператор if, чтобы проверить, была ли переменная установлена ​​или нет, игнорируется...

Редактировать:

Я пытался использовать это:

checkNickReg $chan $2 $nick

... и повторяя это:

  echo -a Target: $1
  echo -a Nick: $2
  echo -a Status: $3
  echo -a Chan: $3 - $chan

Я пытаюсь получить ответ на канал, такой как; $nick $+, $1 не зарегистрирован / зарегистрирован / зарегистрирован, но не авторизован.

То, что я написал выше, очевидно, неверно, так как оно не работает, однако я попробовал несколько методов, и я на самом деле не уверен, как данные передаются без подобных токенизации или установки переменных...

Ответить

[01:59:06] <~ MrTIMarshall>! IsReged mr-dynomite
[01:59:08] <& TornHQ>: статус м-р-динамита: NOTLOGGED
РЕДАКТИРОВАТЬ: г-н-dynomite в настоящее время не включен, если это не = не существует или делает эту проверку, даже если они не включены, если это так, это кровавый блеск!!! [02:00:04] <~ MrTIMarshall>! IsReged MrTIMarshall
[02:00:04] <& TornHQ>: Статус MrTIMarshall: LOGGEDIN

Кажется, что $4 не работает, и в чем разница между "существует, не авторизован" и "распознан, не авторизован"?

Кроме того, как данные передаются без установки переменных или токенизации?

(PS Большое спасибо за помощь, которую вы посвятили до сих пор!)

Другое Править:

Сегодня я внимательно изучил вопрос, правильно ли я считаю, что если 0 или 1, пользователь либо не подключен к сети, либо не зарегистрирован (в комментариях говорится, что 0 = не существует / не подключен к сети, 1 = не зарегистрировано) в то время как 2 также говорит, что не вошел в систему, но узнал, что я не уверен, что значит "распознанный". В противном случае, я очень благодарен за помощь в этом сценарии, и вообще я просто неясен в цифрах...

2 ответа

Решение

Поскольку вы не указали какую-либо конкретную сеть, я написал схему для некоторых распространенных сетей (которые на самом деле имеют системы аутентификации пользователей). Вы должны быть в состоянии добавить много других сетей, следуя шаблону.

В основном вы выполняете /checkNickReg <target> <nick> [optional extra data] и когда сервер воспроизводит информацию о регистрации (если применимо), используйте on isReged signal событие для обработки ответа. Все остальное в значительной степени прозрачно.

РЕДАКТИРОВАТЬ: Похоже, что указанная сеть, которую вы используете (Torn) использует стандартные услуги anope. Поэтому я обновил код для поддержки этой сети.

; triggers when you get nick registration info back
; $1 = Target
; $2 = Nick
; $3 = Status, can be: LOGGEDIN, RECOGNIZED, NOTLOGGED
; $4- = Everything else passed
on *:signal:isReged:{
  echo -a Target: $1
  echo -a Nick: $2
  echo -a Status: $3
  echo -a Else: $4-
}

; reg lookup routines
alias checkNickReg {
  set %reg. $+ $network 1
  set %reg.target. $+ $network $1
  set %reg.nick. $+ $network $2
  set %reg.other. $+ $network $3-

  ; Freenode uses: NickServ ACC <nick>
  if ($network == Freenode) msg NickServ ACC $2
  ; Rizon/SwiftIRC/OFTC/Torn use: NickServ STATUS <nick>
  elseif ($istok(Rizon SwiftIRC OFTC Torn, $network, 32)) msg NickServ STATUS $2
}

; listen for replays
on *:notice:*:*:{
  if ($($+(%, reg., $network),2)) {
    ;
    var %target = $($+(%, reg.target., $network),2)
    var %nick = $($+(%, reg.nick., $network),2)
    var %other = $($+(%, reg.other., $network),2)
    ;
    unset %reg*. $+ $network

    if (($network == FreeNode) && ($2 == ACC)) $&
      || (($istok(Rizon SwiftIRC OFTC Torn, $network, 32)) && ($1 == STATUS)) {

      ; FreeNode:

      ; 0 = does not exist
      ; 1 = exists, not logged in
      ; 2 = recognized, not logged in
      ; 3 = logged in

      ; Rizon/SwiftIRC/OFTC/Torn:

      ; 0 = does not exists / not online
      ; 1 = not logged in
      ; 2 = recognized, not logged in
      ; 3 = logged in

      if ($3 < 2) var %status = NOTLOGGED
      elseif ($3 == 2) var %status = RECOGNIZED
      else var %status = LOGGEDIN
    }

    ;send status signal
    .signal isReged %target %nick %status %other 
  }
}

(Дополнительное примечание: может быть полезно добавить дополнительную проверку, чтобы убедиться, что $nick является AuthServ/NickServ по соображениям безопасности.)

Простой пример использования:

; Just a basic example of how to call it.
on *:text:!isReged &:#:{
  checkNickReg $chan $2 $nick
}

on *:signal:isReged:{
  msg $1 $4: $2 status is: $3
}

Тип !isReged <nick>

Редактировать: данные передаются событию on isReged через глобальные переменные. Я установил их в checkNickReg псевдоним, и я убираю их в on notice событие. Таким образом, вы никогда не видите их, потому что они убираются. Они передаются сигнальному событию isReged в $1-.

На большинстве IRCD он отображается только в ответе WHOIS для пользователя, если он вообще есть. Запуск WHOIS каждый раз, когда пользователь говорит, что что-то нежелательно, особенно потому, что администраторы сервера могут получать уведомления каждый раз, когда это происходит.

Другие вопросы по тегам