# coding=utf-8 """Check words spelling""" import re from urllib.parse import quote from nemubot import context from nemubot.exception import IMException from nemubot.hooks import hook from nemubot.tools.xmlparser.node import ModuleState from .pyaspell import Aspell from .pyaspell import AspellError nemubotversion = 3.4 from more import Response def help_full(): return "!spell [] : give the correct spelling of in ." def load(context): context.data.setIndex("name", "score") @hook.command("spell") def cmd_spell(msg): if not len(msg.args): raise IMException("indique une orthographe approximative du mot dont tu veux vérifier l'orthographe.") lang = "fr" strRes = list() for word in msg.args: if len(word) <= 2 and len(msg.args) > 2: lang = word else: try: r = check_spell(word, lang) except AspellError: return Response("Je n'ai pas le dictionnaire `%s' :(" % lang, msg.channel, msg.nick) if r == True: add_score(msg.nick, "correct") strRes.append("l'orthographe de `%s' est correcte" % word) elif len(r) > 0: add_score(msg.nick, "bad") strRes.append("suggestions pour `%s' : %s" % (word, ", ".join(r))) else: add_score(msg.nick, "bad") strRes.append("aucune suggestion pour `%s'" % word) return Response(strRes, channel=msg.channel, nick=msg.nick) def add_score(nick, t): if nick not in context.data.index: st = ModuleState("score") st["name"] = nick context.data.addChild(st) if context.data.index[nick].hasAttribute(t): context.data.index[nick][t] = context.data.index[nick].getInt(t) + 1 else: context.data.index[nick][t] = 1 context.save() @hook.command("spellscore") def cmd_score(msg): res = list() unknown = list() if not len(msg.args): raise IMException("De qui veux-tu voir les scores ?") for cmd in msg.args: if cmd in context.data.index: res.append(Response("%s: %s" % (cmd, " ; ".join(["%s: %d" % (a, context.data.index[cmd].getInt(a)) for a in context.data.index[cmd].attributes.keys() if a != "name"])), channel=msg.channel)) else: unknown.append(cmd) if len(unknown) > 0: res.append(Response("%s inconnus" % ", ".join(unknown), channel=msg.channel)) return res def check_spell(word, lang='fr'): a = Aspell([("lang", lang)]) if a.check(word.encode("utf-8")): ret = True else: ret = a.suggest(word.encode("utf-8")) a.close() return ret