#!/usr/bin/env python
# -*- coding: utf-8 -*-

#import cgitb; cgitb.enable()
from time import time
from urllib import quote

import xmpp
import os
bichoname="web"

class bot:
	def __init__(self, jid, password):
		j = xmpp.JID(jid)
		self.conecta(j.getNode(), password, j.getDomain())

	def conecta(self, user, password, server, realserver='localhost'):
		self.server = server
		self.cl = xmpp.Client(server, debug=[])
		if not self.cl.connect(server=(realserver,5223)):
			raise IOError('no pude conectar')
		if not self.cl.auth(user, password):
			raise IOError('no pude autentificar')
    		self.cl.RegisterHandler('message',self.messageCB)

	def entra_sala(self, room):
		self.room = room
		self.cl.send(xmpp.Presence(self.room + "/bot"))
	
	def mensaje_sala(self, mensaje):
		msg = xmpp.Message(self.room, mensaje)
		msg.setType('groupchat')
		self.cl.send(msg)

	def salir_sala(self):
		self.cl.send(xmpp.Presence(self.room, 'unavailable'))

	def end(self):
		self.cl.disconnect()

	def mensaje_usuario(self, jid, mensaje):
		self.cl.send(xmpp.Message(jid, mensaje))
		
	def mensaje_broadcast(self, mensaje):
		self.mensaje_usuario(self.server + '/announce/online', mensaje)

	def messageCB(self, sess, mess):
		pass

	def procesa(self):
		self.cl.Process(1)

class bot_base:
	def __init__(self, jid, password):
		j = xmpp.JID(jid)
		self.conecta(j.getNode(), password, j.getDomain())

	def conecta(self, user, password, server, realserver='savor.gulic.org'):
		self.server = server
		self.cl = xmpp.Client(server, debug=[])
		if not self.cl.connect(server=(realserver,5223)):
			raise IOError('no pude conectar')
		if not self.cl.auth(user, password):
			raise IOError('no pude autentificar')
    		self.cl.RegisterHandler('message',self.messageCB)

	def send(self, msg):
		self.cl.send(msg)

	def entra_sala(self, room):
		self.room = room
		self.send(xmpp.Presence(self.room + "/" + bichoname))
	
	def mensaje(self, jid, mensaje, type):
		msg = xmpp.Message(jid, mensaje)
		msg.setType(type)
		self.send(msg)

	def mensaje_sala(self, mensaje):
		self.mensaje(self.room, mensaje, 'groupchat')

	def mensaje_usuario(self, jid, mensaje):
		self.mensaje(jid, mensaje, 'chat')
		
	def mensaje_broadcast(self, mensaje):
		self.mensaje(self.server + '/announce/online', mensaje, 'chat')

	def responde(self, mess, mensaje):
		# mess.buildReply(mensaje) no es cosa fina :-(
		if mess.getType() == 'error':
			pass # amos
		elif mess.getType() == 'groupchat':
			self.mensaje(mess.getFrom().getStripped(), mensaje, 'groupchat')
		else:
			self.mensaje(mess.getFrom(), mensaje, 'chat')

	def salir_sala(self):
		self.send(xmpp.Presence(self.room, 'unavailable'))

	def end(self):
		self.cl.disconnect()

	def messageCB(self, sess, mess):
		self.last_mess = mess
		nick=mess.getFrom() #.getResource()
		text=mess.getBody()
		tipo=mess.getType()
		ts=mess.getTimestamp()

	def itera(self):
		pass
	def procesa(self):
		self.cl.Process(1)

def enviamensaje(msg):
	mybot = bot_base("ulysses@gulic.org/bot", "M4/Udce2")
	mybot.entra_sala("gulic@jabber.gulic.org")
	mybot.mensaje_sala(msg)
	#mybot.mensaje_broadcast("mensajito de prueba para el broadcast")
	#mybot.mensaje_usuario("amd77@gulic.org", "mensajito de prueba para amd77@gulic.org")
	#for i in range(5): mybot.procesa()
	mybot.salir_sala()
	mybot.end()

def comprueba(ip):
	fecha = time()
	f = open("/tmp/ips.txt","r")
	lines = f.readlines()
	f.close()
	for line in lines:
		[ifecha, iip, imsg] = line.split(":", 2)
		ifecha = float(ifecha)
		if iip == ip and (fecha-ifecha)<20*60: return True
	return False

def memoriza(ip, msg):
	fecha = time()
	f = open("/tmp/ips.txt","a")
	f.write("%s:%s:%s\n" % (fecha, ip, quote(msg)))
	f.close()

import cgi
form = cgi.FieldStorage()
ip = os.environ["REMOTE_ADDR"]

if comprueba(ip):
	# ya hemos operado
	hecho = True
elif form.has_key('msg'):
	# no hemos operado y lo estamos intentando
	msg = form["msg"].value
	if len(msg)>256: msg=msg[:256]
	enviamensaje("[%s] %s" % (ip, msg))
	memoriza(ip,msg)
	hecho = True
else:
	# no hemos operado ni lo intentamos
	hecho = False


print 'Content-type: text/html\n\n'
if (hecho):
	print """
	
<html>
	<body>
		<p style="text-align: center"><b>Hemos registrado su comentario y nos pondremos manos a la obra. Gracias por su colaboración.</b></p>
	</body>
</html>
"""
else:
	print """
<html>
	<body>
		<p>
			<form action="jabber.py">
				<b>Háganos una consulta, cuentenos su opinión o sugiéranos algo. Se lo agradeceremos: </b>
				<input type="text" name="msg" maxlength="256" size=60>
				<input type="submit" value="enviar">
			</form>
		</p>
	</body>
</html>
"""
