2013-06-02 58 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

您應該真正將'analyseIRText'作爲一個具有'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