2011-04-28 25 views
0

所以我開始從頭開始編寫一個簡單的程序Python的IRC機器人(即原始套接字),我試圖找出設計它的最佳途徑。做一個Python IRC機器人的正確方法?

平時我有一個大醇」,而()循環坐在那兒,推動從套接字接收數據到緩衝區,然後我將使用一個巨大的if/else語句通過字符串進行掃描(使用正則表達式)找出如何處理它。我有一種感覺,我不應該這樣做,因爲它感覺很糟糕。

我決定做正則表達式的字典及其關聯的含義,例如

regexes = {"^PING: (.+)": "incomming_ping", 
      "more regex": "more meanings"} 

只是使用for/in循環來搜索文本並找出哪個正則表達式匹配它。我已經得到了這麼多,我第一個想到的就是「好吧,我可以讓每個'程序'在特定的正則表達式匹配到一個函數時被調用,並根據它的意義調用適當的函數。 m或者使用了一個大量的if/else語句,我不想​​這麼做,或者我可以使用某種Pythonic的'eval',它會立即觸發警鐘。

無論哪種方式我搞砸了,我想不出一種方法來完成面向對象的操作(目前我不打算這麼做,不要問爲什麼)。

有沒有想法?

+0

這就是我怎麼https://github.com/mouuff/MouBot – mou 2012-10-13 20:48:59

+0

我知道你「從零開始」之稱,但你可能想看看Supybot如果你還沒有。它用Python編寫,旨在進行擴展。 – 2012-12-30 11:50:51

回答

2
def incoming_ping(): 
    pass 

regexes = {"^PING: (.+)": incoming_ping, 
      "more regex": "more meanings"} 

而不是字符串,請使用對函數的引用。

ps。如果你對IRC bot的事情「認真」,你可能想看看Twisted。

+0

這就是我正在尋找的!我正在思考這些問題,但我不知道你實際上可以在字典中引用函數。謝謝! – 2011-04-28 17:25:16

+1

你可以在任何地方引用它們 - 在Python中,函數是第一類對象。 – aviraldg 2011-04-28 17:26:21

+0

@Kye samplebias的解決方案更好,而且是通常的做法。這樣做讓你在接受命令時有更多的自由。 – aviraldg 2012-10-15 15:09:20

2

寫一個通用的IRC協議解析器,其可以是正則表達式爲基礎。當命令遵循更通用的模式(^[A-Z]\s)時,爲每個不同的命令(^PING\s, ^PRIVMSG\s)編寫單獨的正則表達式似乎有點多餘。

然後,一旦你解析的命令,則可以查找該方法/功能,其通過使用getattr(obj, 'irc_%s' % command)執行該命令。

好處是,您不需要維護所有方法一個映射表,每個命令有一個模式。

這是Twisted's IRC client使用的技術:

def handleCommand(self, command, prefix, params): 
    """Determine the function to call for the given command and call 
    it with the given arguments. 
    """ 
    method = getattr(self, "irc_%s" % command, None) 
    try: 
     if method is not None: 
      method(prefix, params) 
     else: 
      self.irc_unknown(prefix, command, params) 

def irc_JOIN(self, prefix, params): 
    # perform the JOIN action 
    ... 

def irc_unknown(self, prefix, command, params): 
    # unknown command 
    ...