tanks

Blow up enemy tanks using code
git clone https://git.woozle.org/neale/tanks.git

tanks / contrib
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)