New module SMS using new Free Mobile API
This commit is contained in:
parent
31fe146c6a
commit
7575c41645
108
modules/sms.py
Normal file
108
modules/sms.py
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
# coding=utf-8
|
||||||
|
|
||||||
|
import re
|
||||||
|
import socket
|
||||||
|
import time
|
||||||
|
import urllib.error
|
||||||
|
import urllib.request
|
||||||
|
import urllib.parse
|
||||||
|
|
||||||
|
nemubotversion = 3.3
|
||||||
|
|
||||||
|
def load(context):
|
||||||
|
global DATAS
|
||||||
|
DATAS.setIndex("name", "phone")
|
||||||
|
|
||||||
|
from hooks import Hook
|
||||||
|
add_hook("cmd_hook", Hook(cmd_sms, "sms"))
|
||||||
|
|
||||||
|
def help_tiny ():
|
||||||
|
"""Line inserted in the response to the command !help"""
|
||||||
|
return "Send SMS using SMS API (currently only Free Mobile)"
|
||||||
|
|
||||||
|
def help_full ():
|
||||||
|
return "!sms /who/[,/who/[,...]] message: send a SMS to /who/."
|
||||||
|
|
||||||
|
def send_sms(frm, api_usr, api_key, content):
|
||||||
|
content = "<%s> %s" % (frm, content)
|
||||||
|
|
||||||
|
try:
|
||||||
|
req = urllib.request.Request("https://smsapi.free-mobile.fr/sendmsg?user=%s&pass=%s&msg=%s" % (api_usr, api_key, urllib.parse.quote(content)))
|
||||||
|
res = urllib.request.urlopen(req, timeout=5)
|
||||||
|
except socket.timeout:
|
||||||
|
return "timeout"
|
||||||
|
except urllib.error.HTTPError as e:
|
||||||
|
if e.code == 400:
|
||||||
|
return "paramètre manquant"
|
||||||
|
elif e.code == 402:
|
||||||
|
return "paiement requis"
|
||||||
|
elif e.code == 403 or e.code == 404:
|
||||||
|
return "clef incorrecte"
|
||||||
|
elif e.code != 200:
|
||||||
|
return "erreur inconnue (%d)" % status
|
||||||
|
except:
|
||||||
|
return "unknown error"
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def cmd_sms(msg):
|
||||||
|
if len(msg.cmds) <= 2:
|
||||||
|
raise IRCException("À qui veux-tu envoyer ce SMS ?")
|
||||||
|
|
||||||
|
# Check dests
|
||||||
|
cur_epoch = time.mktime(time.localtime());
|
||||||
|
for u in msg.cmds[1].split(","):
|
||||||
|
if u not in DATAS.index:
|
||||||
|
raise IRCException("Désolé, je sais pas comment envoyer de SMS à %s." % u)
|
||||||
|
elif cur_epoch - DATAS.index[u]["lastuse"] < 42:
|
||||||
|
raise IRCException("Un peu de calme, %s a déjà reçu un SMS il n'y a pas si longtemps." % u)
|
||||||
|
|
||||||
|
# Go!
|
||||||
|
fails = list()
|
||||||
|
for u in msg.cmds[1].split(","):
|
||||||
|
DATAS.index[u]["lastuse"] = cur_epoch
|
||||||
|
if msg.private:
|
||||||
|
frm = msg.nick
|
||||||
|
else:
|
||||||
|
frm = msg.nick + "@" + msg.channel
|
||||||
|
test = send_sms(frm, DATAS.index[u]["user"], DATAS.index[u]["key"], " ".join(msg.cmds[2:]))
|
||||||
|
if test is not None:
|
||||||
|
fails.append( "%s: %s" % (u, test) )
|
||||||
|
|
||||||
|
if len(fails) > 0:
|
||||||
|
return Response(msg.sender, "quelque chose ne s'est pas bien passé durant l'envoi du SMS : " + ", ".join(fails), msg.channel, msg.nick)
|
||||||
|
else:
|
||||||
|
return Response(msg.sender, "le SMS a bien été envoyé", msg.channel, msg.nick)
|
||||||
|
|
||||||
|
apiuser_ask = re.compile(r"(utilisateur|user|numéro|numero|compte|abonne|abone|abonné|account)\s+(est|is)\s+(?P<user>[0-9]{7,})", re.IGNORECASE)
|
||||||
|
apikey_ask = re.compile(r"(clef|key|password|mot de passe?)\s+(?:est|is)?\s+(?P<key>[a-zA-Z0-9]{10,})", re.IGNORECASE)
|
||||||
|
|
||||||
|
def parseask(msg):
|
||||||
|
if msg.content.find("Free") >= 0 and (
|
||||||
|
msg.content.find("API") >= 0 or msg.content.find("api") >= 0) and (
|
||||||
|
msg.content.find("SMS") >= 0 or msg.content.find("sms") >= 0):
|
||||||
|
resuser = apiuser_ask.search(msg.content)
|
||||||
|
reskey = apikey_ask.search(msg.content)
|
||||||
|
if resuser is not None and reskey is not None:
|
||||||
|
apiuser = resuser.group("user")
|
||||||
|
apikey = reskey.group("key")
|
||||||
|
|
||||||
|
test = send_sms("nemubot", apiuser, apikey,
|
||||||
|
"Vous avez enregistré vos codes d'authentification dans nemubot, félicitation !")
|
||||||
|
if test is not None:
|
||||||
|
return Response(msg.sender, "je n'ai pas pu enregistrer tes identifiants : %s" % test, msg.channel, msg.nick)
|
||||||
|
|
||||||
|
if msg.nick in DATAS.index:
|
||||||
|
DATAS.index[msg.nick]["user"] = apiuser
|
||||||
|
DATAS.index[msg.nick]["key"] = apikey
|
||||||
|
else:
|
||||||
|
ms = ModuleState("phone")
|
||||||
|
ms.setAttribute("name", msg.nick)
|
||||||
|
ms.setAttribute("user", apiuser)
|
||||||
|
ms.setAttribute("key", apikey)
|
||||||
|
ms.setAttribute("lastuse", 0)
|
||||||
|
DATAS.addChild(ms)
|
||||||
|
save()
|
||||||
|
return Response(msg.sender, "ok, c'est noté. Je t'ai envoyé un SMS pour tester ;)",
|
||||||
|
msg.channel, msg.nick)
|
Loading…
Reference in New Issue
Block a user