0

自動化のために作成した IRC ボットがあります。

これがそのスニペットです:

def analyseIRCText(connection, event):
    global adminList, userList, commandPat, flood
    userName = extractUserName(event.source())
    userCommand = event.arguments()[0]
    escapedChannel = cleanUserCommand(config.channel).replace('\\.', '\\\\.')
    escapedUserCommand = cleanUserCommand(event.arguments()[0])
    #print userName, userCommand, escapedChannel, escapedUserCommand

    if flood.has_key(userName):
        flood[userName] += 1
    else:
        flood[userName] = 1
    ... (if flood[userName] > certain number do...)

つまり、洪水は、最近ボットにコマンドを入力したユーザーのリストが保持されている辞書であり、一定の時間が保持され、その期間内に何回そう言ったかということです。 .

ここで私はトラブルに遭遇します。ユーザーが時々何かを言うことができるように、この辞書をリセットする何かが必要ですよね? こういうちょっとした工夫でうまくいくと思います。

def floodClear():
    global flood
    while 1:
        flood = {} # Clear the list
        time.sleep(4) 

しかし、これを行う最善の方法は何でしょうか? プログラムの最後に、次のような小さな行があります。

thread.start_new_thread(floodClear,())

このことが呼び出されないように、他のすべてを停止させる無限ループに陥ります。これは良い解決策でしょうか、それとももっと良い方法がありますか?

4

1 に答える 1

1

あなたのロジック十分です。あなたが言うなら:

    if flood.has_key(userName):
        flood[userName] += 1
    else:
        flood[userName] = 1
    if flood[userName] > say 8:
        return 0

これにより、指定された期間内にユーザーがスパムを何度も送信した場合、ボットはユーザーを無視するようになります。そこにあるものは、洪水辞書をクリアするのにも役立つはずです。

于 2013-06-15T01:48:42.230 に答える