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

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

1 に答える 1

1

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スイッチを使用してください。それがなければ、内容を評価します (たとえば、$me はあなたの現在のニックネームに評価されます)。ユーザーはこの方法で悪意のあるコードを挿入できます。$readini()$readini()


挿入された質問の編集: while ループを使用して、Cookie を所有しているかどうかを確認しています。Cookie があるたびに 1 回ループします (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)
}
于 2014-03-09T22:30:11.793 に答える