import random from otree.api import Submission from . import pages from ._builtin import Bot from main.models import Constants, QUESTIONS class PlayerBot(Bot): cases = sorted(2 * ['pass', 'timeout_first', 'timeout_offer', 'timeout_response', 'quiz_fail']) def play_round(self): if not self.player.active: # Quiz Fail assert self.participant.label not in self.html assert self.player.payoff == 0 yield Submission(pages.Timeout, check_html=False) return if self.case == 'timeout_first' and self.player.id_in_group == 1: yield Submission(pages.PeriodOne, timeout_happened=True) else: yield (pages.PeriodOne) if self.timeout(): yield Submission(pages.Timeout, check_html=False) return if self.player.role == Constants.proposer: if self.case == 'timeout_offer': yield Submission(pages.Offer, timeout_happened=True) else: offer = random.randint(0, self.group.offer_max) yield ( pages.Offer, {'offer': offer} ) elif self.player.role == Constants.responder: if self.timeout(): yield Submission(pages.Timeout, check_html=False) return if self.case == 'timeout_response': yield Submission(pages.Response, timeout_happened=True) else: response = random.choice([True, False]) yield ( pages.Response, {'response': response} ) else: raise ValueError if self.timeout(): yield Submission(pages.Timeout, check_html=False) return if self.case == 'quiz_fail': yield ( pages.PostQuiz, { 'q_own_payoff': 0, 'q_stranger_payoff': 0, } ) assert self.player.payoff == 0 assert self.participant.label in self.html yield Submission(pages.PostDeadEnd, check_html=False) return else: yield ( pages.PostQuiz, { 'q_own_payoff': 1, 'q_stranger_payoff': 1, } ) yield Submission( pages.Demographics, { 'age': random.choice(QUESTIONS['age']['choices']), 'gender': random.choice(QUESTIONS['gender']['choices']), 'control': random.choice(QUESTIONS['control']['choices']), 'income': random.choice(QUESTIONS['income']['choices']), 'region': random.choice(QUESTIONS['region']['choices']) }, ) if self.player.role == Constants.responder: if self.group.response: assert self.player.payoff == self.group.offer else: assert self.player.payoff == 0 else: if self.group.response: assert self.player.payoff == self.session.config['endowment'] - self.group.offer else: assert self.player.payoff == 0 assert self.participant.label in self.html yield Submission(pages.Payment, check_html=False) def timeout(self): if self.player.timeout_happened: assert self.player.payoff == 0 assert self.participant.label not in self.html return True if self.player.stranger.timeout_happened: assert self.player.payoff == 0 assert self.player.stranger.payoff == 0 assert self.participant.label in self.html return True return False