#!/usr/bin/env python """Listen on a UDP port and play a sound when 'M' is received Starts the server listening on UDP port PORT (3533 by default) on address HOST (by default all addresses). Valid commands are: M - play Music S - Stop the server """ try: import socketserver except ImportError: import SocketServer as socketserver from os import system,getpid import threading import sys # leave it empty to listen on all addresses HOST = "" PORT = 3533 class UDPSvr(socketserver.BaseRequestHandler): def handle(self): data = self.request[0] if sys.version >= '3': data = str(data, "ISO-8859-1") data = data.strip() if data == "M": ding.dong() elif data == "S": ding.die() class Worker(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.daemon = True def run(self): server.serve_forever(); class Handler(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.daemon = True self.play = False self.must_die = False def run(self): self.event = threading.Event() while True: self.event.wait(1.) if self.event.isSet(): if self.play: print("Playing...") system("paplay /usr/share/sounds/KDE-Im-Irc-Event.ogg") # no else if to allow shutdown signals if self.must_die: print("Shutting down...") server.shutdown() break self.play = False self.event.clear() def dong(self): self.play = True self.event.set() def die(self): self.must_die = True self.event.set() def ca(num, x): print("Caught SIGINT, shutting down...") ding.die() import signal if __name__ == "__main__": print("My PID is: " + str(getpid())) if len(sys.argv) > 1: HOST = sys.argv[1] if len(sys.argv) > 2: PORT = int(sys.argv[2]) print("Host: " + HOST) print("Port: " + str(PORT)) server = socketserver.UDPServer((HOST, PORT), UDPSvr) ding = Handler() signal.signal(signal.SIGINT, ca) worker = Worker() ding.start() worker.start() # might not be the cleanest, but it allows Ctrl + C while ding.isAlive(): ding.join(3600) # vim: set expandtab shiftwidth=4: