#!/usr/bin/env python

__author__ = "Yoan Blanc <yoan at dosimple dot ch>"
__revision__ = "20071230"
__license__ = "MIT"

import logging

from jabberbot import JabberBot
from xmlrpclib import Fault, loads
from twisted.web import xmlrpc, server, http
from twisted.internet import defer, protocol, reactor, task

from twootr import web
from twootr.core import Core

JID = "greutly@swissjabber.ch"
#PASSWORD = "xxxxxxx"
PORT = 8081

# see init.sql
web.config.db_parameters = {
	"dbn":"sqlite",
	"db":"db.db"}

class TwootrBot(JabberBot):
	def gotMessage(self, jid, resource, msg, composing):
		if not composing and msg is not None:
			user = Core.get_user(jid=jid)
			if user:
				Core.post_twoot(user, msg)
				followers = Core.get_followers(user, full=True)
				for follower in followers:
					if self.roster.hasBuddy(follower.jid):
						self.sendMessage(follower.jid, u"%s: %s" % (user.nick, msg))
					else:
						# fail!
						logging.warn(u"%s not in roster" % follower.jid)
			else:
				self.sendMessage(jid, u"%s is unknown, register!" % jid)
		else:
			pass
	
	def gotPresence(self, jid, resource, status, show):
		pass

class TwootrRPC(xmlrpc.XMLRPC):
	def __init__(self, jabber_bot):
		xmlrpc.XMLRPC.__init__(self)
		self.__jabber = jabber_bot
	
	def xmlrpc_broadcast(self, jid, message, tos):
		for to in tos:
			if self.__jabber.roster.hasBuddy(to):
				self.__jabber.sendMessage(to, message)
			else:
				# fail!
				logging.warn("%s not in roster" % to)
		
		return tos
	
	def xmlrpc_adduser(self, jid):
		if not self.__jabber.roster.hasBuddy(jid):
			self.__jabber.add(jid)
			self.__jabber.sendPresence(jid, "subscribe")
		
		self.__jabber.sendMessage(jid, "Welcome to Twootr")
		return True
	
	def render(self, request):
		args, functionPath = loads(request.content.read())
		try:
			function = self._getFunction(functionPath)
		except Fault, f:
			self._cbRender(f, request)
		else:
			request.setHeader("Content-type", "text/xml")
			defer.maybeDeferred(function, *args).addErrback(
				self._ebRender
			).addCallback(
				self._cbRender, request
			)
		
		return server.NOT_DONE_YET

web.load()
j = TwootrBot(JID, PASSWORD)
s = TwootrRPC(j)
reactor.listenTCP(PORT, server.Site(s))

print "Twootr running, hit Ctrl+C to quit"
j.run()


