nemubot/modules/spell/__init__.py

88 lines
2.7 KiB
Python
Raw Normal View History

2012-11-08 15:23:38 +00:00
# coding=utf-8
2014-08-27 23:39:31 +00:00
"""Check words spelling"""
2012-11-08 15:23:38 +00:00
import re
from urllib.parse import quote
2015-02-11 17:12:39 +00:00
from nemubot import context
from nemubot.exception import IRCException
from nemubot.hooks import hook
2015-01-05 09:18:40 +00:00
from nemubot.tools.xmlparser.node import ModuleState
2012-11-08 15:23:38 +00:00
from .pyaspell import Aspell
from .pyaspell import AspellError
2014-08-13 13:53:55 +00:00
nemubotversion = 3.4
2012-11-08 15:23:38 +00:00
from more import Response
def help_full():
2012-11-08 15:23:38 +00:00
return "!spell [<lang>] <word>: give the correct spelling of <word> in <lang=fr>."
def load(context):
2015-02-11 17:12:39 +00:00
context.data.setIndex("name", "score")
@hook("cmd_hook", "spell")
2012-11-08 15:23:38 +00:00
def cmd_spell(msg):
2015-07-10 21:09:54 +00:00
if not len(msg.args):
2014-07-25 16:02:30 +00:00
raise IRCException("indique une orthographe approximative du mot dont tu veux vérifier l'orthographe.")
2012-11-08 15:23:38 +00:00
lang = "fr"
strRes = list()
2015-07-10 21:09:54 +00:00
for word in msg.args:
if len(word) <= 2 and len(msg.args) > 2:
2012-11-08 15:23:38 +00:00
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)
2012-11-08 15:23:38 +00:00
if r == True:
add_score(msg.nick, "correct")
2012-11-08 15:23:38 +00:00
strRes.append("l'orthographe de `%s' est correcte" % word)
elif len(r) > 0:
add_score(msg.nick, "bad")
2012-11-08 15:23:38 +00:00
strRes.append("suggestions pour `%s' : %s" % (word, ", ".join(r)))
else:
add_score(msg.nick, "bad")
2012-11-08 15:23:38 +00:00
strRes.append("aucune suggestion pour `%s'" % word)
return Response(strRes, channel=msg.channel, nick=msg.nick)
2012-11-08 15:23:38 +00:00
def add_score(nick, t):
2015-02-11 17:12:39 +00:00
if nick not in context.data.index:
st = ModuleState("score")
st["name"] = nick
2015-02-11 17:12:39 +00:00
context.data.addChild(st)
2015-02-11 17:12:39 +00:00
if context.data.index[nick].hasAttribute(t):
context.data.index[nick][t] = context.data.index[nick].getInt(t) + 1
else:
2015-02-11 17:12:39 +00:00
context.data.index[nick][t] = 1
context.save()
@hook("cmd_hook", "spellscore")
def cmd_score(msg):
res = list()
unknown = list()
2015-07-10 21:09:54 +00:00
if not len(msg.args):
raise IRCException("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
2012-11-08 15:23:38 +00:00
def check_spell(word, lang='fr'):
a = Aspell([("lang", lang)])
if a.check(word.encode("utf-8")):
ret = True
2012-11-08 15:23:38 +00:00
else:
ret = a.suggest(word.encode("utf-8"))
a.close()
return ret