#!/usr/bin/python
#
# THIS FILE IS PART OF THE MUMBLES PROJECT AND IS LICENSED UNDER THE GPL.
# SEE THE 'COPYING' FILE FOR DETAILS
#
# Generic Mumbles Example
#
# usage: mumbles-send.py title content
#
# python script to do the same as:
#
# dbus-send --type=signal --dest=org.mumblesproject.Mumbles /org/mumblesproject/Mumbles org.mumblesproject.Mumbles.Notify string:'subject' string:'content'
#
#------------------------------------------------------------------------

import os 
import sys
import getopt
import dbus
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop
from socket import AF_INET, SOCK_DGRAM, socket
from getpass import getpass

from distutils.sysconfig import get_python_lib
syspath = get_python_lib(0)+"/mumbles"
sys.path.append(syspath)
print "syspath: %s" % (syspath)
os.environ.setdefault("MUMBLES_PATH", "/usr/share/mumbles/")

from MumblesGlobals import *
from OptionsHandler import *
from MumblesDBus import *
from GrowlNetwork import *

MUMBLES_SEND_ID = "mumbles-send"

class Usage(Exception):
	def __init__(self, msg=None):
		if msg != 'help':
			self.msg = 'mumbles-send: Invalid options. Try --help for usage details.'
		else:
			self.msg = \
				"mumbles-send: A simple script to send mumbles notifications.\n" \
				"Copyright (C) 2007 dot_j <dot_j@mumbles-project.org>\n\n" \
				"Usage: mumbles-send [options] title [message]\n\n" \
				"-h, --help\n" \
				"\tPrint a summary of the command-line usage of mumbles-send.\n" \
				"-l, --local\n" \
				"\tSend message to the local machine. Default behavior when not sending a growl network message.\n" \
				"-g {ip}, --growl-network {ip}\n" \
				"\tSend message to the supplied ip over the network using the growl network message protocol.\n" \
				"-p {password}, --password {password}\n" \
				"\tUse the supplied password for growl network message.\n" \
				"-s, --use-conf-password\n" \
				"\tUse the password from mumbles.conf for growl network message.\n"

# at least it's better than plain text...
def get_password_from_conf():
	oh = OptionsHandler()
	oh.options = {CONFIG_M:{}}
	oh.load()
	enc_passwd = oh.get_option(CONFIG_M, 'growl_network_password')
	passwd = ''
	for i in range(len(enc_passwd)):
		passwd += chr(ord(enc_passwd[i])-i-1)
	return passwd

def main(argv=None):

	send_local = False 
	send_network = False
	network_addr = None
	prompt_password = False
	get_conf_password = False

	if argv is None:
		argv = sys.argv
		try:
			try:
				opts, args = getopt.getopt(sys.argv[1:], "hlg:ps", ["help", "local", "growl-network", "password", "use-conf-password"])
			except getopt.GetoptError:

				raise Usage()

			for o, a in opts:
				if o in ("-h", "--help"):
					raise Usage('help')
				elif o in ("-l", "--local"):
					send_local = True
				elif o in ("-g", "--growl-network"):
					if not a:
						raise Usage()
					send_network = True
					network_addr = a
				elif o in ("-p", "--password"):
					prompt_password = True
				elif o in ("-s", "--use-conf-password"):
					get_conf_password = True
				else:
					raise Usage()
		except Usage, err:
			print >> sys.stderr, err.msg
			return 2

	if not send_network and not send_local:
		send_local = True


	content = ''
	try:
		if len(args) < 1:
			raise Usage()
		else:
			title = args[0]
	except Usage, err:
		print >> sys.stderr, err.msg
		return 2

	if len(args) > 1:
		content = args[1]

	if send_local:
		dbus_loop = DBusGMainLoop()
		name = dbus.service.BusName (MUMBLES_DBUS_INTERFACE, bus=dbus.SessionBus(mainloop=dbus_loop))

		sender = MumblesDBus(name)
		sender.Notify(title, content)

	if send_network:
		passwd = None
		if prompt_password:
			passwd = getpass()
                elif get_conf_password:
			passwd = get_password_from_conf()

		addr = (network_addr, GROWL_UDP_PORT)
		s = socket(AF_INET,SOCK_DGRAM)

		p = GrowlRegistrationPacket(application=MUMBLES_SEND_ID, password=passwd)
		p.addNotification(notification=MUMBLES_SEND_ID, enabled=True)
		s.sendto(p.payload(),addr)

		p = GrowlNotificationPacket(application=MUMBLES_SEND_ID,
				notification=MUMBLES_SEND_ID,
				title=title,
				description=content,
				priority=1, sticky=False, password=passwd)
		s.sendto(p.payload(),addr)
		s.close()


if __name__ == "__main__":
    sys.exit(main())
