modules/DICT.py
author Mikael Berthe <mikael@lilotux.net>
Thu, 03 May 2007 19:32:28 +0200
changeset 33 adf562e77977
parent 32 dcb1b0459f1c
child 34 535d03a56f9d
permissions -rw-r--r--
DICT.py: Get rid of tabs (coding style)


import socket, string, sys

def split_and_remove_quotes(str):
    pos = string.find(str, " ")
    return (str[ : pos], str[pos + 2 : -1])

class DictError(Exception):

    def __init__(self, msg, code):
        self._code = code

    def get_code(self):
        return self._code

class DictConnection:

    def __init__(self, server, port = 2628, identify = 1):
        self._server = server
        self._port = port
        self._conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self._conn.connect((socket.gethostbyname(self._server), self._port))
        self._conn.recv(1024) # eat welcome message

#        if identify:
#            self._send("CLIENT dict.py/0.00", 1)

    def get_databases(self):
        return map(split_and_remove_quotes,
                   self._interpret_multiline(self._send("SHOW DATABASES")))

    def get_strategies(self):
        return map(split_and_remove_quotes,
                   self._interpret_multiline(self._send("SHOW STRAT")))

    def get_database_info(self, db):
        return self._interpret_multiline(self._send("SHOW INFO %s" % db))

    def get_server_info(self):
        return self._interpret_multiline(self._send("SHOW SERVER"))

    def get_definition(self, word, db = "*"):
        try:
            return self._interpret_multiresp(self._send("DEFINE %s %s" %
                                                        (db, word),
                                                        "\r\n.\r\n250"))
        except DictError, e:
            if e.get_code() == 552:
                return []

            raise

    def get_words(self, search, db = "*", strategy = "prefix"):
        try:
            return map(split_and_remove_quotes,
                       self._interpret_multiline(self._send("MATCH %s %s %s" %
                                                     (db, strategy, search))))
        except DictError, e:
            if e.get_code() == 552:
                return []

            raise

    def _send(self, cmd, resp_term = "\r\n.\r\n"):
        self._conn.send(cmd + "\r\n")
        self._verify(self._conn.recv(1024 * 16))
        return self._receive_response(resp_term)

    def _verify(self, resp):
        if resp[0] < "1" or resp[0] > "3":
            raise DictError(resp[4 : ], int(resp[ : 3]))

    def _interpret_multiline(self, resp):
        lines = string.split(resp, "\r\n")
        return lines[ : lines.index(".")]

    def _interpret_multiresp(self, resp):
        resps = []
        lines = []
        for line in string.split(resp, "\r\n"):
            if line == ".":
                resps.append(lines)
                lines = []
            else:
                lines.append(line)

        return resps

    def _receive_response(self, look_for):
        resp = self._conn.recv(1024 * 16)
        while string.find(resp, look_for) == -1:
            resp = resp + self._conn.recv(1024 * 16)

        return resp

# ---

if __name__ == "__main__":
    from pprint import pprint

    if len(sys.argv) > 1:
        word = sys.argv[1]
    else:
        word = raw_input('Word: ')

    dict = DictConnection("dict.org")

    #pprint(dict.get_server_info())
    #pprint(dict.get_database_info(word))
    #pprint(dict.get_databases())
    #pprint(dict.get_strategies())
    pprint(dict.get_definition(word))
    #pprint(dict.get_words(word))

# vim:set et sts=4: