1

在使用 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> :mr-dynomite 状态为:未登录
编辑: mr-dynomite 当前未开启,如果这不是 = 不存在或者即使它们没有打开也会检查,如果是这样,这真是太棒了![02:00:04] <~MrTIMarshall> !isReged MrTIMarshall
[02:00:04] <&TornHQ> :MrTIMarshall 状态为:LOGGEDIN

$4 似乎不起作用,“存在,未登录”和“已识别,未登录”有什么区别?

此外,如何在不设置变量或标记化的情况下传递数据?

(PS 非常感谢您迄今为止所提供的帮助!)

另一个编辑:

我今天一直在深入研究,我认为如果 0 或 1 用户未在线或未注册,我是否正确(在评论中它说 0 = 不存在/不在线,1 = 未登录in 而 2 也表示未登录但已识别,我不确定识别的含义。否则我非常感谢这个脚本帮助,我只是不清楚数字......

4

2 回答 2

0

在大多数 IRCD 上,它仅在用户的 WHOIS 响应中公开,如果有的话。每次用户说某事时运行 WHOIS 是不可取的,尤其是因为服务器管理员可能会在每次发生时收到通知。

于 2012-11-07T20:53:11.143 回答
0

由于您没有指定任何特定网络,因此我为周围的一些常见网络(实际上具有用户身份验证系统)编写了大纲。您应该能够按照该模式添加许多其他网络。

基本上你执行/checkNickReg <target> <nick> [optional extra data],当服务器使用注册信息(如果适用)重播时,使用on isReged signal事件来处理回复。其他一切都非常透明。

编辑:看起来您正在使用的指定网络(撕裂)使用标准的 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所以你永远看不到它们,因为它们被清理干净了。它们在 $1- 中传递给 isReged 信号事件。

于 2012-11-08T19:28:23.940 回答