使用mSL和mIRC从文件中获取最高价值

时间:2014-03-14 11:53:47

标签: loops scripting irc mirc

目前我有一个irc bot,当用户说出一个关键词例如test1时,他们会将+1添加到他们的计数中,并将其存储在一个文件中。但是我想知道谁算得最多(谁赢了)。我觉得像while循环这样的东西会起作用,不幸的是,虽然我的伪代码是正确的,但理论代码并没有那么多。

这是我到目前为止所做的。

on *:TEXT:!winning:#:{
  var %i = 1, %highest = 0, %mycookie = $readini(cookies.ini,n,#,$nick)

  while (%i < $lines(cookies.ini)) {
    if (%mycookie > %highest) {
      %highest = %mycookie
          if (%highest == 1) {
      msg $chan $nick is winning with %highest count. }
      elseif (%highest > 1) {
      msg $chan $nick is winning with %highest counts. }
      else {
            msg $chan No one has any count! Must try harder! }
    }
        else { return }  
    inc %i
  }
}

我希望循环浏览文件,每当它找到高于%的最高数字(从0开始)时,将其放入变量中,然后移到下一个名称。 同样地,我知道使用$ nick是错误的,因为它会显示我的昵称,而不是从文件中获取昵称...我可以从文件中获取昵称吗?

由于

同样,在完全不相关的说明上。 mIRC中是否有一种方法可以为每个通道使用不同的脚本文件? 类似的东西:

if ($chan == #mychan) {
  $remote == script1.ini }
else { }

1 个答案:

答案 0 :(得分:1)

您可以使用$ini()标识符遍历INI文件的内容。 $ini(cookies.ini, $chan, 0)将返回在该频道上有记录的人的总数,而$ini(cookies.ini, $chan, N)将返回第N个人的名字(然后可以作为$readini()中的最后一个参数传递)。

此外,不要在while循环中包含if / elseif / else结构的消息;在找到最高记录后,您可能想要将结果通知一次:

on *:TEXT:!winning:#:{
  var %i = 1, %highestCookies = 0, %highestUser

  ; This will run as long as %i is smaller than or equal to the number of lines in the ini section $chan
  while (%i <= $ini(cookies.ini, $chan, 0)) {

    ; As we loop through the file, store the item name (the nickname) and the cookies (the value) 
    var %user = $ini(cookies.ini, $chan, %i), %cookies = $readini(cookies.ini, n, $chan, %user)

    ; Is this the highest found so far?
    if (%cookies > %highestCookies) {
      var %highestCookies = %cookies
      var %highestUser = %user
    }

    inc %i
  }

  ; Now that we have the correct values in our variables, display the message once
  if (%highestCookies == 1) {
    msg $chan %highestUser is winning with %highestCookies count.
  }
  elseif (%highestCookies > 1) {
    msg $chan %highestUser is winning with %highestCookies counts.
  }
  else {
    msg $chan No one has any count! Must try harder!
  }
}

编辑:修复了导致找不到更高值的问题,因为%highestCookies被分配了$ null值而不是0。


至于你的第二个问题,不可能为不同的频道提供不同的脚本文件。但是,您可以修改事件捕获器中的位置参数,以便它只捕获特定通道上的事件。例如,这就是on TEXT的样子:

; This event will only listen to the word "hello" in #directpixel and #stackoverflow
on *:TEXT:hello:#directpixel,#stackoverflow:{
  msg $chan Hello $nick $+ !
}