#!/usr/bin/python

# Boodler: a programmable soundscape tool
# Designed by Andrew Plotkin <erkyrath@eblong.com>
# For more information, see <http://boodler.org/>
#
# This Python script ("boodle-event") is in the public domain. 

"""boodle-event: send events to Boodler
usage: boodle-event [--hostname host] [--port port] evname [ evdata ... ]

Send an event to a listening Boodler process.

The hostname defaults to "localhost". The port defaults to the Boodler
port of 31863. If port is given as an absolute pathname (beginning
with "/"), boodle-event uses a Unix domain socket instead of a network
socket.
"""

import sys
import os.path
import optparse
import socket

usage = 'usage: %prog [--hostname host] [--port port] evname [ evdata ... ]'

popt = optparse.OptionParser(usage=usage)

popt.add_option('-H', '--hostname',
    action='store', type='string', dest='hostname', metavar='HOST',
    help='Boodler host to send event to (default: localhost)')
popt.add_option('-p', '--port',
    action='store', type='string', dest='port', metavar='PORT/PIPE',
    help='Port (or Unix pipe) to send event to (default: port 31863)')

popt.set_defaults(hostname='localhost', port='31863')

(opts, args) = popt.parse_args()

host = opts.hostname
if (opts.port.startswith('/')):
    port = opts.port
    use_tcp = False
    if (host != 'localhost'):
        print 'Cannot write to a Unix pipe on a different host.'
        sys.exit(1)
else:
    try:
        port = int(opts.port)
        use_tcp = True
    except:
        print 'Port must be an absolute pathname or an integer.'
        sys.exit(1)

if (len(args) == 0):
    print usage.replace('%prog', os.path.basename(sys.argv[0]))
    sys.exit()

dat = ' '.join(args) + '\n'

if (use_tcp):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((host, port))
else:
    sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
    sock.connect(port)
sock.send(dat)
sock.close()

