3 """Go all (or not) depending on whats in the hole.
12 class RunComplete (Exception):
13 """Raised after receiving the `END` tag to abort execution.
18 class HoleBot (object):
19 def __init__(self, stdin=None, stdout=None, log_level=logging.WARN):
26 self.log_file = '%s_%d.log' % (self.__class__.__name__, os.getpid())
27 logging.basicConfig(filename=self.log_file, level=log_level)
30 def cleanup_log(self):
32 if os.path.getsize(self.log_file) == 0:
33 os.remove(self.log_file)
36 state = self._initial_state()
38 line = self.stdin.readline().strip()
40 continue # skip blank lines
41 tag,type,data = self._parse(line)
43 self._process(tag, type, data, state)
48 def _parse(self, line):
49 self.log.debug('read: %s' % line)
50 fields = line.split(' ')
56 self.log.debug('tag only: %s' % str(fields))
59 self.log.debug('parsed tag %s, type %s, data %s'
60 % (repr(tag), repr(type), repr(data)))
61 return (tag, type, data)
63 def _process(self, tag, type, data, state):
67 bet = self._bet(state)
68 self.log.info('bet %s' % bet)
69 self.stdout.write('%s\n' % bet)
71 elif tag == 'INFO' and type == 'HOLE':
72 self._process_hole(data, state)
73 self.log.info('processed hole %s, state: %s' % (data, state))
75 def _initial_state(self):
76 return {'all_in': False}
78 def _bet(self, state):
83 state['all_in'] = False
86 def _process_hole(self, data, state):
87 raise NotImplementedError