2013-06-02 2 views
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...) 

Таким образом, идея в том, что потоп вещь представляет собой словарь, где список пользователей, которые вошли в команду боту в последнее время ... какое-то время это и сколько раз они говорили так и так в течение этого периода времени.

Вот где я столкнулся с проблемой. Должно быть SOMETHING, который сбрасывает этот словарь, чтобы пользователи могли говорить вещи каждый раз в какое-то время, нет? Я думаю, что такая мелочь сделала бы трюк.

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

Но какой был бы лучший способ для этого? В конце программы, у меня есть маленькая линия под названием:

thread.start_new_thread(floodClear,()) 

так, что эта вещь не дозвонилась на застревает в бесконечном цикле, который останавливает все остальное. Будет ли это хорошим решением или есть что-то лучшее, что я мог бы сделать?

+0

Вы можете сохранить время каждого сообщения в списке и удалить старые, прежде чем проверять длину списка. – ejno

+0

Вы должны действительно реорганизовать 'analyseIRCText' как класс с' adminList', 'userList',' commandPat' и 'flood' в качестве атрибутов экземпляра. Глобальные переменные обычно представляют собой [плохую идею] (http://stackoverflow.com/questions/146557/do-you-use-the-global-statement-in-python). –

ответ

1

Ваша логика должно быть достаточно. Если у вас есть сказать:

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

Это должно сделать ваш бот игнорировать пользователь, если он слишком много спама раз в течение вашего заданного периода времени. То, что у вас есть, должно также работать, чтобы прояснить ваш словарь.

+0

Э-э ... Я уже понял это. Думаю, я приму это, потому что твой единственный ответ, и это технически не так ... – Joe