3 """Go all (or not) depending on whats in the hole.
11 class RunComplete (Exception):
12 """Raised after receiving the `END` tag to abort execution.
17 class HoleBot (object):
18 def __init__(self, stdin=None, stdout=None, log_level=logging.WARN):
25 log_file = '%s_%d.log' % (self.__class__.__name__, os.getpid())
26 logging.basicConfig(filename=log_file, level=log_level)
30 state = self._initial_state()
32 line = self.stdin.readline().strip()
34 continue # skip blank lines
35 tag,type,data = self._parse(line)
37 self._process(tag, type, data, state)
41 def _parse(self, line):
42 self.log.debug('read: %s' % line)
43 fields = line.split(' ')
49 self.log.debug('tag only: %s' % str(fields))
52 self.log.debug('parsed tag %s, type %s, data %s'
53 % (repr(tag), repr(type), repr(data)))
54 return (tag, type, data)
56 def _process(self, tag, type, data, state):
60 bet = self._bet(state)
61 self.log.info('bet %s' % bet)
62 self.stdout.write('%s\n' % bet)
64 elif tag == 'INFO' and type == 'HOLE':
65 self._process_hole(data, state)
66 self.log.info('processed hole %s, state: %s' % (data, state))
68 def _initial_state(self):
69 return {'all_in': False}
71 def _bet(self, state):
76 state['all_in'] = False
79 def _process_hole(self, data, state):
80 raise NotImplementedError