1
0
Fork 0
nemubot/modules/spell/__init__.py

98 lines
3.0 KiB
Python

"""Check words spelling"""
# PYTHON STUFFS #######################################################
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
from nemubot.module.more import Response
# LOADING #############################################################
def load(context):
context.data.setIndex("name", "score")
# MODULE CORE #########################################################
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()
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
# MODULE INTERFACE ####################################################
@hook.command("spell",
help="give the correct spelling of given words",
help_usage={"WORD": "give the correct spelling of the WORD."},
keywords={"lang=": "change the language use for checking, default fr"})
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 = msg.kwargs["lang"] if "lang" in msg.kwargs else "fr"
res = Response(channel=msg.channel)
for word in msg.args:
try:
r = check_spell(word, lang)
except AspellError:
raise IMException("Je n'ai pas le dictionnaire `%s' :(" % lang)
if r == True:
add_score(msg.frm, "correct")
res.append_message("l'orthographe de `%s' est correcte" % word)
elif len(r) > 0:
add_score(msg.frm, "bad")
res.append_message(r, title="suggestions pour `%s'" % word)
else:
add_score(msg.frm, "bad")
res.append_message("aucune suggestion pour `%s'" % word)
return res
@hook.command("spellscore",
help="Show spell score (tests, mistakes, ...) for someone",
help_usage={"USER": "Display score of USER"})
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