#!/usr/bin/python

# sucked from:
#  * http://twistedmatrix.com/pipermail/twisted-python/2004-May/007903.html
#  * http://redfoot.net/hypercode/modules/xmpp/client

# Twisted Imports
from twisted.words.protocols.jabber import client, jid
from twisted.xish import domish, xmlstream
from twisted.internet import reactor

# System Imports
import sys, getpass

name = None
server = None
resource = None
password = None
me = None

thexmlstream = None
tryandregister = 1

def initOnline(xmlstream):
	global factory
	print 'Initializing...'
	xmlstream.addObserver('/message', gotMessage)
	xmlstream.addObserver('/*', gotSomething)

def authd(xmlstream):
	global thexmlstream
	thexmlstream = xmlstream
	print "we've authd!"
	print repr(xmlstream)

	#need to send presence so clients know we're
	#actually online
	presence = domish.Element(('jabber:client', 'presence'))
	presence.addElement('status').addContent('Online')
	xmlstream.send(presence)

	initOnline(xmlstream)

def send(author, to, msg):
	global thexmlstream
	message = domish.Element(('jabber:client','message'))
	message["to"] = jid.JID(to).full()
	message["from"] = jid.JID(author).full()
	message["type"] = "chat"
	message.addElement("body", "jabber:client", msg)
	
	thexmlstream.send(message)

def gotMessage(el):
	global me
	#print 'Got message: %s' % str(el.attributes)
	from_id = el["from"]
	
	body = "empty"
	for e in el.elements():
		if e.name == "body":
			body = unicode(e.__str__())
			break
	
	body = body.split(" ")
	body.reverse()
	body = " ".join(body)
	
	send(me, from_id, body)

def gotSomething(el):
	print 'Got something: %s -> %s' % (el.name, str(el.attributes))

def authfailedEvent(xmlstream):
	global reactor
	print 'Auth failed!'
	reactor.stop()

if __name__ == '__main__':
	USER_HANDLE = raw_input("JID: ")
	PASSWORD = getpass.getpass()
	me = USER_HANDLE + "/TwistedWords"
	myJid = jid.JID(me)
	server = USER_HANDLE[USER_HANDLE.find('@')+1:]
	
	factory = client.basicClientFactory(myJid, PASSWORD)
	
	# Register authentication callbacks
	factory.addBootstrap(xmlstream.STREAM_AUTHD_EVENT, authd)

	# Go!
	reactor.connectTCP(server, 5222, factory)
	reactor.run() 

