0

对 mSL 来说是全新的,只是在尝试制作一个机器人。因此,我正在尝试做一些事情,当用户说出某个单词时,他们会得到 +1 以计入他们的名字。但是他们不能再把这个词再说一遍,以进一步增加他们的计数无限次,他们必须找到一个新词。

为了确保这些词不能被多次使用,我将这些词写入文件,然后我需要加载这些词并检查它是否已经说过或没有与用户刚刚所说的内容相矛盾,并采取适当的行动

on *:TEXT:&:#:{
var %msg

if ($1 == text1) { %msg = msg1 }
elseif ($1 == text2) { %msg = msg2 }
elseif ($1 == text3) { %msg = msg3 }
else { return }
msg # %msg 

var %keyword = $readini(keyword.ini,#,$nick)
if (%keyword == $1) {
 msg # you already have this keyword! :(
}
else {
  var %count = $readini(cookies.ini,#,$nick)
  inc %count
  writeini cookies.ini # $nick %count
  writeini keyword.ini # $nick %keyword $+ , $+ $1
 }
}

关键字.ini 文件如下所示:

nickname=text1,text2

在 mSL 中是否有我可以获取列表(已经在上面的代码中完成)然后使用类似于 .split(,) 的东西来划分单词以通过 for/next 运行?

提前致谢

编辑: 我尝试了以下方法,尽管它确实有效!然后我删除了该文件以对其进行测试,尽管使用了 writeini,但它从未重新制作过该文件。我什至在脚本的开头添加了 writeini keyword.ini 以确保在写入任何文本之前文件存在,但仍然没有成功。

on *:TEXT:&:#:{
  var %msg

if ($1 == text1) { %msg = msg1 }
elseif ($1 == text2) { %msg = msg2 }
elseif ($1 == text3) { %msg = msg3 }
else { return }
msg # %msg 

  var %i = 1, %keyword = $readini(keyword.ini,n,$chan,$nick), %cookie = $readini(cookies.ini,n,#,$nick)
  while (%i <= $numtok(%keyword, 44)) {
    if ($istok(%keyword, $1, 44)) {
      msg # you already have this keyword! :(
    }
    else {
      inc %cookie
      writeini cookies.ini $chan $nick %cookie
      msg # congrats! you found a keywords
      writeini keyword.ini $chan $nick $addtok(%keyword, $1, 44)
    }
    inc %i
  }
4

1 回答 1

1

您正在寻找 mIRC 的令牌标识符。我建议阅读帮助文件(/help 令牌标识符)以了解更多信息。

用于$istok()检查该行是否已经包含该关键字:

if ($istok(%keyword, $1, 44)) // Keyword exists

用于$addtok()向该行添加一个新关键字,然后将其写入文件:

writeini keyword.ini # $nick $addtok(%keyword, $1, 44)

使用$numtok()and$gettok()创建一个循环来读取所有值:

var %i = 1, %keywords = $readini(cookies.ini, n, channel, nick)
while (%i <= $numtok(%keywords, 44)) {
  echo -a Keyword %i $+ : $gettok(%keywords, %i, 44)
  inc %i
}

重要提示:在读取数据时(尤其是用户可以输入的数据)始终使用n开关$readini()(就像我上面所做的那样) 。没有它,将评估内容(例如,$me 将评估为您当前的昵称)。用户可以通过这种方式注入恶意代码。$readini()


编辑插入的问题:您正在使用 while 循环来检查他们是否拥有 cookie - 对于他们拥有的每个 cookie,它将循环一次(0 循环表示没有 cookie)。您根本不需要这个 while 循环,因为$istok(%keywords $1, 44)它将获取所有关键字并返回$trueif$1是否在该标记列表中。

只需以下内容就足够了:

var %keywords = $readini(keyword.ini,n,$chan,$nick), %cookie = $readini(cookies.ini,n,#,$nick)
if ($istok(%keywords, $1, 44)) {
  ; the token $1 is in the list of tokens %keywords
  msg # you already have this cookie! :(
}
else {
  ; the token $1 did not appear in the list of tokens %keywords
  inc %cookie
  writeini cookies.ini $chan $nick %cookie
  writeini keyword.ini $chan $nick $addtok(%keywords, $1, 44)
}
于 2014-03-09T22:30:11.793 回答