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