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

그래서 생각입니다 : 여기

그것의 조각이다 유지하고, 몇 번이나 그렇게 말한 적이 있습니까?

여기 내가 문제가되는 곳입니다. 거기에 사용자가 잠깐마다 물건을 말할 수 있도록이 사전을 다시 설정해야합니다. 나는 이것과 같은 작은 일이 트릭을 할 것이라고 생각한다.

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