Neale Pickett
·
2014-07-30
tput
1#!/usr/bin/env python
2
3""" Here's an example tank, in RFC822ish format:
4
5From: Joe Cool <joe@cool.cc>
6Tank-Name: Red Baron
7Color: #c7e148
8Sensor-0: 50 0 7 1
9Sensor-1: 30 0 90 0
10
11get-turret 12 + set-turret! ( Rotate turret )
1237 40 set-speed! ( Go in circles )
130 sensor? { fire! } if ( Fire if turret sensor triggered )
141 sensor? { -50 50 set-speed! } if ( Turn if collision sensor triggered )
15"""
16
17import argparse
18import sys
19import email
20import requests
21import os
22
23def parse_args():
24 parser = argparse.ArgumentParser(description="Upload forf tanks.",
25 formatter_class=argparse.ArgumentDefaultsHelpFormatter)
26 parser.add_argument('--infile', '-i', nargs='?', metavar='FILE',
27 help="filename containing tank program",
28 type=argparse.FileType('r'), default=sys.stdin)
29 parser.add_argument('--url', '-u', nargs='?', metavar='URL',
30 help="URL to submit your tank to",
31 default='http://woozle.org/tanks/upload.cgi')
32 return parser.parse_args()
33
34def read_tank(infile):
35 msg = email.message_from_file(infile)
36 headers = dict(msg.items())
37 return headers, msg.get_payload()
38
39def post_tank(headers, code, url):
40 token = os.environ.get('token')
41 if not token:
42 token = open('token').readline().strip()
43 request = {}
44 request['token'] = token
45 request['name'] = headers.get('Tank-Name', '')
46 request['author'] = headers.get('From', '')
47 request['color'] = headers.get('Color', '#c0c0c0')
48 for sn in range(0, 10):
49 sensor = 'Sensor-{}'.format(sn)
50 if sensor in headers:
51 sr, sa, sw, st = headers[sensor].split()
52 request['s{}r'.format(sn)] = sr
53 request['s{}a'.format(sn)] = sa
54 request['s{}w'.format(sn)] = sw
55 request['s{}t'.format(sn)] = st
56 request['program'] = code
57 r = requests.post(url, data=request, headers={'Accept': 'text/plain'})
58 print(r.text)
59 r.raise_for_status()
60
61if __name__ == '__main__':
62 args = parse_args()
63 headers, code = read_tank(args.infile)
64 post_tank(headers, code, args.url)