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



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 关键字.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
}

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

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


编辑插入的问题:您正在使用 while 循环来检查他们是否拥有 cookie - 对于他们拥有的每个 cookie,它将循环一次(没有 cookie 为 0 循环)。你根本不需要这个 while 循环,因为$istok(%keywords $1, 44)将获取所有关键字并返回$true如果$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)
}

相关内容

  • 没有找到相关文章

最新更新