Required magic to kill the spawned instance.
[irker.git] / irk
1 #!/usr/bin/env python
2 # Illustrates how to test irkerd.
3 #
4 # First argument must be a channel URL. If it does not begin with "irc", 
5 # the base URL for freenode is prepended.
6 #
7 # -k option kills irkerd if irk hard to spawn one.
8 #
9 # Second argument must be a payload string.  Standard C-style escapes 
10 # such as \n and \t are decoded.
11 #
12 import json
13 import socket
14 import sys
15 import fileinput
16 import subprocess
17 import time
18 import os
19 import signal
20 import getopt
21
22 def send(target, message):
23     data = {"to": target, "privmsg" : message}
24     #print(json.dumps(data))
25     try:
26         s = socket.create_connection(("localhost", 6659))
27         s.sendall(json.dumps(data))
28     except socket.error, e:
29         sys.stderr.write("irkerd: write to server failed: %r\n" % e)
30
31 if __name__ == "__main__":
32     (options, arguments) = getopt.getopt(sys.argv[1:], "k", )
33     killafter = False
34     for (opt, val) in options:
35         if opt == '-k':
36             killafter = True
37
38     # Spawn an irkerd instance if none is running.
39     try:
40         # irkerd might already be running
41         s = socket.create_connection(("localhost", 6659))
42         irkerd = None
43     except:
44         # If it isn't, spawn an instance
45         print "Spawning an irker instance..."
46         irkerd = subprocess.Popen("irkerd", shell=True, preexec_fn=os.setsid)
47         time.sleep(0.5)
48
49     target = arguments[0]
50     if not "irc:" in target:
51         target = "irc://chat.freenode.net/{0}".format(target)
52     message = " ".join(arguments[1:])
53     message = message.decode('string_escape')
54     if message == '-':
55         for line in fileinput.input('-'):
56             send(target, line.rstrip('\n'))
57     else:
58         send(target, message)
59     if killafter:
60         if irkerd:
61             time.sleep(0.5)
62             # Magic required because shell=True, terminate() won't work.
63             os.killpg(irkerd.pid, signal.SIGTERM)
64             print "...terminated."