Правильный способ сделать бот Python IRC? - PullRequest
0 голосов
/ 28 апреля 2011

Итак, я начинаю писать простой процедурный бот Python IRC с нуля (то есть необработанные сокеты) и пытаюсь найти лучший способ его разработки.

Обычно у меня есть большой цикл while (), который будет сидеть там и помещать данные, полученные из сокета, в буфер, и я буду использовать массивный оператор if / else для сканирования строки (используя регулярные выражения) выяснить, что с этим делать. У меня такое чувство, что я не должен этого делать, потому что это ужасно.

Я решил создать словарь регулярных выражений и связанных с ними значений, например,

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

и просто используйте цикл for / in для поиска по тексту и выяснения, какое регулярное выражение соответствует ему. Я зашел так далеко, и я первым делом подумал: «Хорошо, я могу просто сделать каждую« процедуру », которая будет вызываться, когда конкретное регулярное выражение соответствует функции, и вызывать соответствующую функцию в зависимости от значения. I» Либо я застрял с использованием массивного оператора if / else, чего я не хотел делать в первую очередь, либо я мог бы использовать какой-то Pythonic 'eval', который немедленно запускает тревожные звонки.

В любом случае, я облажался, и я не могу придумать, как подойти к этому, не пройдя полностью ООП (сейчас я не планирую делать это, не спрашиваю почему).

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 28 апреля 2011

Напишите общий анализатор протокола IRC, который может быть основан на регулярных выражениях. Кажется немного излишним писать отдельное регулярное выражение для каждой отдельной команды (^PING\s, ^PRIVMSG\s), когда команды следуют более общей схеме (^[A-Z]\s).

Затем, проанализировав команду, вы можете найти метод / функцию, которая выполняет эту команду, используя getattr(obj, 'irc_%s' % command).

Преимущество заключается в том, что вам не нужно поддерживать все ваши методы плюс таблица сопоставления с шаблоном для каждой команды.

Этот метод используется в IRC-клиенте Twisted :

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
    ...
2 голосов
/ 28 апреля 2011
def incoming_ping():
    pass

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

Вместо строк используйте ссылки на функции.

пс.Если вы «серьезно» относитесь к IRC-ботам, вам стоит взглянуть на Twisted.

...