来自readini的mIRC / mSL单词,可以拆分吗?

时间:2014-03-09 21:10:32

标签: scripting mirc

全新的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
 }
}

keyword.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
  }

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

使用$numtok()$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()(就像我上面所做的那样),尤其< / em>当用户可以输入的数据时。没有它,$readini()将评估内容(例如,$ me将被评估为您当前的昵称)。用户可以通过这种方式注入恶意代码。


编辑插入的问题:您正在使用while循环检查它们是否拥有Cookie - 它将为每个Cookie循环一次(0循环表示没有Cookie)。您根本不需要这个while循环,因为$istok(%keywords $1, 44)所有关键字,如果$true位于该令牌列表中,则返回$1。< / p>

以下就足够了:

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)
}