예제 #1
0
파일: tests.py 프로젝트: hcxiong/wouso
    def test_post_challenge(self):
        # create an active challenge, with fake questions
        Formula.add('chall-warranty')
        Formula.add('chall-timer')
        category = Category.add('challenge')
        for i in range(Challenge.LIMIT + 1):
            q = Question.objects.create(text='text %s' % i, category=category, active=True)
            for j in range(5):
                Answer.objects.create(correct=j==1, question=q)
        chall = Challenge.create(user_from=self.challuser2, user_to=self.challuser)
        chall.accept()
        response = self.client.get('/api/challenge/{id}/'.format(id=chall.id))
        data = json.loads(response.content)

        self.assertTrue(data)
        self.assertEqual(data['status'], 'A')
        self.assertEqual(data['to'], self.challuser.user.username)
        self.assertEqual(len(data['questions']), Challenge.LIMIT)

        # attempt post
        data = {}
        for q in Question.objects.all():
            answers = []
            for a in q.correct_answers:
                answers.append(str(a.id))

            data[q.id] = ','.join(answers)

        response = self.client.post('/api/challenge/{id}/'.format(id=chall.id), data)
        self.assertEqual(response.status_code, 200)

        data = json.loads(response.content)

        self.assertTrue(data['success'])
        self.assertEqual(data['result']['points'], Challenge.LIMIT * 100)
예제 #2
0
파일: tests.py 프로젝트: ArmandNM/wouso
    def test_post_challenge(self):
        # create an active challenge, with fake questions
        Formula.add('chall-warranty')
        Formula.add('chall-timer')
        category = Category.add('challenge')
        for i in range(Challenge.LIMIT + 1):
            q = Question.objects.create(text='text %s' % i, category=category, active=True)
            for j in range(5):
                Answer.objects.create(correct=j==1, question=q)
        chall = Challenge.create(user_from=self.challuser2, user_to=self.challuser)
        chall.accept()
        response = self.client.get('/api/challenge/{id}/'.format(id=chall.id))
        data = json.loads(response.content)

        self.assertTrue(data)
        self.assertEqual(data['status'], 'A')
        self.assertEqual(data['to'], self.challuser.user.username)
        self.assertEqual(len(data['questions']), Challenge.LIMIT)

        # attempt post
        data = {}
        for q in Question.objects.all():
            answers = []
            for a in q.correct_answers:
                answers.append(str(a.id))

            data[q.id] = ','.join(answers)

        response = self.client.post('/api/challenge/{id}/'.format(id=chall.id), data)
        self.assertEqual(response.status_code, 200)

        data = json.loads(response.content)

        self.assertTrue(data['success'])
        self.assertEqual(data['result']['points'], Challenge.LIMIT * 100)
예제 #3
0
파일: tests.py 프로젝트: ArmandNM/wouso
    def test_frenzy_loss(self):
        """
         If user loses while affected by frenzy he should lose frenzy.percents more points
        """
        initial_points = 100
        loss_points = -10
        warranty_points = -3

        player_frenzy = self._get_player(1).get_extension(ChallengeUser)
        player_dummy = self._get_player(2).get_extension(ChallengeUser)

        scoring.setup_scoring()
        Coin.add('points')
        scoring.score_simple(player_frenzy, 'points', initial_points)

        formula = Formula.get('chall-lost')
        formula.expression = 'points=' + str(loss_points)
        formula.save()

        formula = Formula.get('chall-warranty')
        formula.expression = 'points=' + str(warranty_points)
        formula.save()

        # Apply frenzy
        frenzy = Spell.objects.create(name='challenge-affect-scoring', available=True, price=25, percents=66, type='o')
        obs = PlayerSpellDue.objects.create(player=player_frenzy, source=player_frenzy, spell=frenzy, due=datetime.now() + timedelta(days=1))

        # Win challenge with dummy player to see the amount of points lost by the player affected with frenzy
        chall = Challenge.create(user_from=player_frenzy, user_to=player_dummy, ignore_questions=True)
        chall.set_won_by_player(player_dummy)

        # Player should lose frenzy.percents more points with frenzy applied
        target_points = initial_points + loss_points + frenzy.percents / 100.0 * loss_points + warranty_points

        self.assertEqual(player_frenzy.player_ptr.points, target_points)
예제 #4
0
파일: tests.py 프로젝트: ovidiugiorgi/wouso
    def test_paralyze(self):
        """
         Test if Paralyze spell works
        """
        Formula.add('chall-warranty')

        player = self._get_player()
        chall_user = player.get_extension(ChallengeUser)

        # Check if player can launch before spell is cast
        self.assertTrue(chall_user.can_launch())

        # Create and add spell to user
        paralyze = Spell.objects.create(name='challenge-cannot-challenge',
                                        available=True,
                                        price=10,
                                        percents=100,
                                        type='n')
        obs = PlayerSpellDue.objects.create(player=chall_user,
                                            source=chall_user,
                                            spell=paralyze,
                                            due=datetime.now() +
                                            timedelta(days=1))

        # Check if player has the modifier
        self.assertTrue(
            chall_user.magic.has_modifier('challenge-cannot-challenge'))

        # Player should not be able to launch challenge with Paralyze on
        self.assertFalse(chall_user.can_launch())
예제 #5
0
파일: tests.py 프로젝트: ArmandNM/wouso
    def test_get_challenge(self):
        # create an active challenge
        Formula.add('chall-warranty')
        Formula.add('chall-timer')
        chall = Challenge.create(user_from=self.challuser2, user_to=self.challuser, ignore_questions=True)
        chall.accept()
        response = self.client.get('/api/challenge/{id}/'.format(id=chall.id))
        data = json.loads(response.content)

        self.assertTrue(data)
        self.assertEqual(data['status'], 'A')
        self.assertEqual(data['to'], self.challuser.user.username)
예제 #6
0
파일: tests.py 프로젝트: hcxiong/wouso
    def test_get_challenge(self):
        # create an active challenge
        Formula.add('chall-warranty')
        Formula.add('chall-timer')
        chall = Challenge.create(user_from=self.challuser2, user_to=self.challuser, ignore_questions=True)
        chall.accept()
        response = self.client.get('/api/challenge/{id}/'.format(id=chall.id))
        data = json.loads(response.content)

        self.assertTrue(data)
        self.assertEqual(data['status'], 'A')
        self.assertEqual(data['to'], self.challuser.user.username)
예제 #7
0
 def get_formulas(kls):
     """ Returns a list of formulas used by qotd """
     fs = []
     quest_game = kls.get_instance()
     fs.append(Formula(id='quest-ok', formula='points={level}',
         owner=quest_game.game,
         description='Points earned when finishing a level. Arguments: level.')
     )
     fs.append(Formula(id='quest-finish-ok', formula='points=10',
         owner=quest_game.game,
         description='Bonus points earned when finishing the entire quest. No arguments.')
     )
     return fs
예제 #8
0
파일: sm.py 프로젝트: Ciocirlan/wouso
def score_simple(player, coin, amount, game=None, formula=None,
    external_id=None, percents=100):
    """ Give amount of coin to the player.
    """
    if not isinstance(game, Game) and game is not None:
        game = game.get_instance()

    if not isinstance(player, Player):
        raise InvalidScoreCall()

    user = player.user
    player = user.get_profile()
    user = player.user

    coin = Coin.get(coin)
    formula = Formula.get(formula)

    computed_amount = 1.0 * amount * percents / 100
    hs = History.add(user=user, coin=coin, amount=computed_amount,
            game=game, formula=formula, external_id=external_id, percents=percents)

    # update user.points asap
    if coin.name == 'points':
        if player.magic.has_modifier('top-disguise'):
            computed_amount = 1.0 * computed_amount * player.magic.modifier_percents('top-disguise') / 100

        player.points += computed_amount
        player.save()
        update_points(player, game)

    logging.debug("Scored %s with %f %s" % (user, computed_amount, coin))
    return hs
예제 #9
0
파일: views.py 프로젝트: alexukf/wouso
def bonus(request, player_id):
    player = get_object_or_404(Player, pk=player_id)

    if request.method == 'POST':
        form = BonusForm(request.POST)
        if form.is_valid():
            coin, amount = form.cleaned_data['coin'], form.cleaned_data['amount']
            formula = Formula.get('bonus-%s' % coin.name)
            if formula is None:
                messages.error(request, 'No such formula, bonus-%s' % coin.name)
            else:
                scoring.score(player, None, formula, external_id=request.user.get_profile().id, **{coin.name: amount})
                if form.cleaned_data['reason']:
                    add_activity(player, _('received {amount} {coin} bonus for {reason}'), amount=amount, coin=coin, reason=form.cleaned_data['reason'])
                messages.info(request, 'Successfully given bonus')
            return redirect('player_profile', id=player.id)
    else:
        form = BonusForm()

    bonuses = scoring.History.objects.filter(user=player, formula__name__startswith='bonus-').order_by('-timestamp')
    penalties = scoring.History.objects.filter(user=player, formula__name__startswith='penalty-').order_by('-timestamp')

    return render_to_response('cpanel/bonus.html', {'target_player': player, 'form': form, 'bonuses': bonuses, 'penalties': penalties},
        context_instance=RequestContext(request)
    )
예제 #10
0
파일: sm.py 프로젝트: andreip/wouso
def calculate(formula, **params):
    """ Calculate formula and return a dictionary of coin and amounts """
    formula = Formula.get(formula)
    if formula is None:
        raise InvalidFormula(formula)

    if not formula.formula:
        return {}

    ret = {}
    try:
        frml = formula.formula.format(**params)
        # Apparently, Python does not allow assignments inside eval
        # Using this workaround for now
        ass = frml.split(";")
        for a in ass:
            asp = a.split("=")
            coin = asp[0].strip()
            expr = "=".join(asp[1:])
            try:
                result = eval(expr)
            except ZeroDivisionError as e:
                result = 0
            ret[coin] = result
    except Exception as e:
        logging.exception(e)
        raise FormulaParsingError(formula)

    return ret
예제 #11
0
파일: views.py 프로젝트: adibranescu/wouso
def karma_group_view(request, group):
    group_id = group
    group = get_object_or_404(PlayerGroup, pk=group)
    players = group.players.all()
    if request.method == 'POST':
        form = KarmaBonusForm(request.POST, players=players)
        if form.is_valid():
            formula = Formula.get('bonus-karma')
            if formula is None:
                messages.error(request, 'No such formula, bonus-karma')
            else:
                for player, entry in zip(players, form.fields):
                    # get amount of karma points for current player
                    karma_points = form.cleaned_data[entry]
                    # if karma points are zero then skip
                    if karma_points == 0:
                        continue
                    # compute formula and calculate amount of bonus given
                    amount = eval(formula.expression.format(**{'karma_points': karma_points}).split('=')[1])
                    # apply scoring
                    scoring.score(player, None, formula, external_id=request.user.get_profile().id, **{'karma_points': karma_points})
                    # add activity (parse formula expression to get the coin from formula)
                    add_activity(player, _(
                        'received {amount} {coin} bonus for {karma_points} Karma Points'),
                                amount=amount, coin=formula.expression.split('=')[0], karma_points=karma_points,
                                reason='Bonus for Karma')
                    messages.info(request, 'Successfully given bonus')
            return redirect('karma_group', **{'group': group_id})
    else:
        form = KarmaBonusForm(players=players)
    return render_to_response('cpanel/karma_group.html',
                              {'form':form, 'group':group},
                              context_instance=RequestContext(request))
예제 #12
0
파일: sm.py 프로젝트: ciprianf/wouso
def score_simple(player, coin, amount, game=None, formula=None,
    external_id=None, percents=100):
    """ Give amount of coin to the player.
    """
    if not isinstance(game, Game) and game is not None:
        game = game.get_instance()

    if not isinstance(player, Player):
        raise InvalidScoreCall()

    user = player.user

    coin = Coin.get(coin)
    formula = Formula.get(formula)

    computed_amount = 1.0 * amount * percents / 100
    hs = History.objects.create(user=user, coin=coin, amount=computed_amount,
        game=game, formula=formula, external_id=external_id, percents=percents)

    # update user.points asap
    if coin.id == 'points':
        player.points += computed_amount
        player.save()
        update_points(player, game)

    logging.debug("Scored %s with %f %s" % (user, computed_amount, coin))
    return hs
예제 #13
0
파일: tests.py 프로젝트: ArmandNM/wouso
    def test_charge(self):
        """
         Test for Charge spell
        """
        initial_points = 100
        win_points = 10

        player_charge = self._get_player(1).get_extension(ChallengeUser)
        player_dummy = self._get_player(2).get_extension(ChallengeUser)

        scoring.setup_scoring()
        Coin.add('points')
        scoring.score_simple(player_charge, 'points', initial_points)

        formula = Formula.get('chall-won')
        formula.expression = 'points=' + str(win_points)
        formula.save()

        # Apply charge
        charge = Spell.objects.create(name='challenge-affect-scoring-won', available=True, price=10, percents=33, type='p')
        obs = PlayerSpellDue.objects.create(player=player_charge, source=player_charge, spell=charge, due=datetime.now() + timedelta(days=1))

        chall = Challenge.create(user_from=player_charge, user_to=player_dummy, ignore_questions=True)
        chall.set_won_by_player(player_charge)

        # Player should win weakness.percents more points with charge applied
        target_points = initial_points + win_points + charge.percents / 100.0 * win_points
        self.assertEqual(player_charge.player_ptr.points, target_points)
예제 #14
0
파일: sm.py 프로젝트: damianr13/wouso
def score_simple(player, coin, amount, game=None, formula=None,
    external_id=None, percents=100 ):
    """ Give amount of coin to the player.
    """
    if not isinstance(game, Game) and game is not None:
        game = game.get_instance()

    if not isinstance(player, Player):
        raise InvalidScoreCall()

    user = player.user
    player = user.get_profile()
    user = player.user

    coin = Coin.get(coin)
    formula = Formula.get(formula)

    computed_amount = 1.0 * amount * percents / 100
    hs = History.add(user=user, coin=coin, amount=computed_amount,
            game=game, formula=formula, external_id=external_id, percents=percents)

    # update user.points asap
    if coin.name == 'points':
        if player.magic.has_modifier('top-disguise'):
            computed_amount = 1.0 * computed_amount * player.magic.modifier_percents('top-disguise') / 100

        player.points += computed_amount
        player.save()
        update_points(player, game)

    logging.debug("Scored %s with %f %s" % (user, computed_amount, coin))
    return hs
예제 #15
0
파일: tests.py 프로젝트: ArmandNM/wouso
    def test_weakness_and_charge(self):
        """
         If both Weakness and Charge are active, a player should win weakness.percents + charge.percents less/more points
         after winning a challenge
        """
        initial_points = 100
        win_points = 10

        player = self._get_player(1).get_extension(ChallengeUser)
        player_dummy = self._get_player(2).get_extension(ChallengeUser)

        scoring.setup_scoring()
        Coin.add('points')
        scoring.score_simple(player, 'points', initial_points)

        formula = Formula.get('chall-won')
        formula.expression = 'points=' + str(win_points)
        formula.save()

        # Apply charge
        charge = Spell.objects.create(name='challenge-affect-scoring-won', available=True, price=10, percents=33, type='p')
        obs = PlayerSpellDue.objects.create(player=player, source=player, spell=charge, due=datetime.now() + timedelta(days=1))

        # Apply weakness
        weakness = Spell.objects.create(name='challenge-affect-scoring-won', available=True, price=10, percents=-66, type='p')
        obs = PlayerSpellDue.objects.create(player=player, source=player, spell=weakness, due=datetime.now() + timedelta(days=1))

        chall = Challenge.create(user_from=player, user_to=player_dummy, ignore_questions=True)
        chall.set_won_by_player(player)

        percents = (charge.percents + weakness.percents) / 100.0
        target_points = initial_points + win_points + percents * win_points

        self.assertEqual(player.player_ptr.points, target_points)
예제 #16
0
    def test_scoring_loss(self):
        initial_points = 10
        winner = self._get_player(1).get_extension(ChallengeUser)
        loser = self._get_player(2).get_extension(ChallengeUser)

        # Setup scoring
        scoring.setup_scoring()
        Coin.add('points')

        # Give initial points
        scoring.score_simple(winner, 'points', initial_points)
        scoring.score_simple(loser, 'points', initial_points)

        # Set formula
        loss_points = -2
        formula = Formula.get('chall-lost')
        formula.expression = 'points=' + str(loss_points)
        formula.save()

        # Play challenge
        chall = Challenge.create(user_from=winner,
                                 user_to=loser,
                                 ignore_questions=True)
        chall.set_won_by_player(winner)

        self.assertEqual(loser.player_ptr.points, initial_points +
                         loss_points)  # loss_points is negative
예제 #17
0
def calculate(formula, **params):
    """ Calculate formula and return a dictionary of coin and amounts """
    formula = Formula.get(formula)
    if formula is None:
        raise InvalidFormula(formula)

    ret = {}
    try:
        frml = formula.formula.format(**params)
        # Apparently, Python does not allow assignments inside eval
        # Using this workaround for now
        ass = frml.split(';')
        for a in ass:
            asp = a.split('=')
            coin = asp[0].strip()
            expr = '='.join(asp[1:])
            try:
                result = eval(expr)
            except ZeroDivisionError as e:
                result = 0
            ret[coin] = result
    except Exception as e:
        raise FormulaParsingError(e)

    return ret
예제 #18
0
파일: tests.py 프로젝트: ArmandNM/wouso
    def test_list_active(self):
        response = self.client.get('/api/challenge/list/')

        self.assertEqual(response.status_code, 200)

        data = json.loads(response.content)
        self.assertFalse(data)

        # create an active challenge
        Formula.add('chall-warranty')
        chall = Challenge.create(user_from=self.challuser2, user_to=self.challuser, ignore_questions=True)
        response = self.client.get('/api/challenge/list/')
        data = json.loads(response.content)

        self.assertTrue(data)
        data = data[0]
        self.assertEqual(data['id'], chall.id)
예제 #19
0
파일: tests.py 프로젝트: hcxiong/wouso
    def test_list_active(self):
        response = self.client.get('/api/challenge/list/')

        self.assertEqual(response.status_code, 200)

        data = json.loads(response.content)
        self.assertFalse(data)

        # create an active challenge
        Formula.add('chall-warranty')
        chall = Challenge.create(user_from=self.challuser2, user_to=self.challuser, ignore_questions=True)
        response = self.client.get('/api/challenge/list/')
        data = json.loads(response.content)

        self.assertTrue(data)
        data = data[0]
        self.assertEqual(data['id'], chall.id)
예제 #20
0
파일: tests.py 프로젝트: ovidiugiorgi/wouso
    def test_frenzy_loss(self):
        """
         If user loses while affected by frenzy he should lose frenzy.percents more points
        """
        initial_points = 100
        loss_points = -10
        warranty_points = -3

        player_frenzy = self._get_player(1).get_extension(ChallengeUser)
        player_dummy = self._get_player(2).get_extension(ChallengeUser)

        scoring.setup_scoring()
        Coin.add('points')
        scoring.score_simple(player_frenzy, 'points', initial_points)

        formula = Formula.get('chall-lost')
        formula.expression = 'points=' + str(loss_points)
        formula.save()

        formula = Formula.get('chall-warranty')
        formula.expression = 'points=' + str(warranty_points)
        formula.save()

        # Apply frenzy
        frenzy = Spell.objects.create(name='challenge-affect-scoring',
                                      available=True,
                                      price=25,
                                      percents=66,
                                      type='o')
        obs = PlayerSpellDue.objects.create(player=player_frenzy,
                                            source=player_frenzy,
                                            spell=frenzy,
                                            due=datetime.now() +
                                            timedelta(days=1))

        # Win challenge with dummy player to see the amount of points lost by the player affected with frenzy
        chall = Challenge.create(user_from=player_frenzy,
                                 user_to=player_dummy,
                                 ignore_questions=True)
        chall.set_won_by_player(player_dummy)

        # Player should lose frenzy.percents more points with frenzy applied
        target_points = initial_points + loss_points + frenzy.percents / 100.0 * loss_points + warranty_points

        self.assertEqual(player_frenzy.player_ptr.points, target_points)
예제 #21
0
파일: tests.py 프로젝트: ArmandNM/wouso
    def test_buy_spell(self):
         Coin.add('gold')
         Formula.add('buy-spell', expression="gold=-{price}")
         spell = Spell.objects.create(name='test-spell', available=True, price=10)
         player = User.objects.create_user('test', '*****@*****.**', password='******').get_profile()

         scoring.score_simple(player, 'gold', 100)
         self.assertEqual(player.coins['gold'], 100)

         response = self.client.get(reverse('bazaar_home'))
         self.assertTrue('test-spell' in response.content)

         self.client.login(username='******', password='******')
         response = self.client.get(reverse('bazaar_buy', kwargs={'spell': spell.id}))
         self.assertFalse('error' in response.content)

         player = Player.objects.get(user__username='******')
         self.assertEqual(player.coins['gold'], 90)
예제 #22
0
파일: sm.py 프로젝트: cvicentiu/wouso
def unset(user, game, formula, external_id=None, **params):
    """ Remove all history records by the external_id, formula and game given to the user """
    formula = Formula.get(formula)
    for history in History.objects.filter(user=user, game=game.get_instance(), formula=formula, external_id=external_id):
        if history.coin.name == 'points':
            user.points -= history.amount
        history.delete()
    user.save()
    update_points(user, game)
예제 #23
0
파일: sm.py 프로젝트: TomyRO/wouso
def rollback(user, game, formula, external_id=None, **params):
    if game != None:
        game = game.get_instance()
    formula = Formula.get(formula)
    for history in History.objects.filter(user=user, game=game, formula=formula, external_id=external_id):
        if history.coin.name == 'points':
            user.points -= history.amount
        history.delete()
    user.save()
예제 #24
0
    def test_buy_spell(self):
        Coin.add("gold")
        Formula.add("buy-spell", definition="gold=-{price}")
        spell = Spell.objects.create(name="test-spell", available=True, price=10)
        player = User.objects.create_user("test", "*****@*****.**", password="******").get_profile()

        scoring.score_simple(player, "gold", 100)
        self.assertEqual(player.coins["gold"], 100)

        # TODO: interface test should not be here
        response = self.client.get(reverse("bazaar_home"))
        self.assertTrue("test-spell" in response.content)

        self.client.login(username="******", password="******")
        response = self.client.get(reverse("bazaar_buy", kwargs={"spell": spell.id}))
        self.assertFalse("error" in response.content)

        player = Player.objects.get(user__username="******")
        self.assertEqual(player.coins["gold"], 90)
예제 #25
0
 def get_formulas(kls):
     """ Returns a list of formulas used by qotd """
     fs = []
     qotd_game = kls.get_instance()
     fs.append(
         Formula(id='qotd-ok',
                 formula='points=3',
                 owner=qotd_game.game,
                 description='Points earned on a correct answer'))
     return fs
예제 #26
0
파일: sm.py 프로젝트: damianr13/wouso
def unset(user, game, formula, external_id=None, **params):
    """ Remove all history records by the external_id, formula and game given to the user """
    formula = Formula.get(formula)
    user = user.user.get_profile() # make sure you are working on fresh Player
    for history in History.objects.filter(user=user, game=game.get_instance(), formula=formula, external_id=external_id):
        if history.coin.name == 'points':
            user.points -= history.amount
        history.delete()
    user.save()
    update_points(user, game)
예제 #27
0
 def get_formulas(kls):
     fs = []
     quest_game = kls.get_instance()
     fs.append(
         Formula(id='specialquest-passed',
                 formula='gold={value}',
                 owner=quest_game.game,
                 description=
                 'Points earned when finishing a task. Arguments: value.'))
     return fs
예제 #28
0
파일: sec.py 프로젝트: AndreiRO/wouso
 def activity_handler(cls, sender, **kwargs):
     action = kwargs.get('action', None)
     rules = filter(lambda x : x[2]==action, cls.SECURITY_RULES)
     for rule in rules:
         # check if rule is not disabled
         if not BoolSetting.objects.get(pk__startswith='disable-%s' % rule[0]).get_value():
             (guilty, player, external_id) = SecurityInspector.check(rule[0], **kwargs)
             if guilty:
                 formula = Formula.get('%s-infraction' % rule[0], 'general-infraction')
                 cls.penalise(player, formula, external_id)
예제 #29
0
def calculate(formula, **params):
    """ Calculate formula and return a dictionary of coin and amounts """
    formula = Formula.get(formula)
    if formula is None:
        raise InvalidFormula(formula)

    if not formula.definition:
        return {}

    return calculate_definition(formula.definition, formula, **params)
예제 #30
0
파일: sm.py 프로젝트: Ciocirlan/wouso
def rollback(user, game, formula, external_id=None, **params):
    if game is not None:
        game = game.get_instance()
    formula = Formula.get(formula)
    user = user.user.get_profile() # make sure you are working on fresh Player
    for history in History.objects.filter(user=user, game=game, formula=formula, external_id=external_id):
        if history.coin.name == 'points':
            user.points -= history.amount
        history.delete()
    user.save()
예제 #31
0
파일: sm.py 프로젝트: Ciocirlan/wouso
def calculate(formula, **params):
    """ Calculate formula and return a dictionary of coin and amounts """
    formula = Formula.get(formula)
    if formula is None:
        raise InvalidFormula(formula)

    if not formula.expression:
        return {}

    return calculate_expression(formula.expression, formula, **params)
예제 #32
0
    def test_buy_spell(self):
        Coin.add('gold')
        Formula.add('buy-spell', expression="gold=-{price}")
        spell = Spell.objects.create(name='test-spell', available=True, price=10)
        player = User.objects.create_user('test', '*****@*****.**', password='******').get_profile()

        scoring.score_simple(player, 'gold', 100)
        self.assertEqual(player.coins['gold'], 100)

        # TODO: interface test should not be here
        response = self.client.get(reverse('bazaar_home'))
        self.assertTrue('test-spell' in response.content)

        self.client.login(username='******', password='******')
        response = self.client.get(reverse('bazaar_buy', kwargs={'spell': spell.id}))
        self.assertFalse('error' in response.content)

        player = Player.objects.get(user__username='******')
        self.assertEqual(player.coins['gold'], 90)
예제 #33
0
파일: views.py 프로젝트: vladeugeniu/wouso
def karma_group_view(request, id):
    group = get_object_or_404(PlayerGroup, pk=id)
    players = group.players.all()

    if request.method == 'POST':
        form = KarmaBonusForm(request.POST, players=players)

        if form.is_valid():
            formula = Formula.get('bonus-karma')

            if formula is None:
                messages.error(request, 'No such formula, bonus-karma')
            else:
                for player, entry in zip(players, form.fields):
                    # Get amount of karma points for current player
                    karma_points = form.cleaned_data[entry]

                    # Skip if there are no karma points
                    if karma_points == 0:
                        continue

                    # Compute formula and calculate amount of bonus given
                    amount = eval(
                        formula.expression.format(**{
                            'karma_points': karma_points
                        }).split('=')[1])

                    # Apply scoring
                    scoring.score(player,
                                  None,
                                  formula,
                                  external_id=request.user.get_profile().id,
                                  **{'karma_points': karma_points})

                    # Add activity (parse formula expression to get the coin from formula)
                    add_activity(
                        player,
                        _('received {amount} {coin} bonus for {karma_points} Karma Points'
                          ),
                        amount=amount,
                        coin=formula.expression.split('=')[0],
                        karma_points=karma_points,
                        reason='Bonus for Karma')

                    messages.info(request, 'Successfully given bonus')

            return redirect('karma_group', id=id)
    else:
        form = KarmaBonusForm(players=players)

    return render_to_response('cpanel/karma_group.html', {
        'form': form,
        'group': group
    },
                              context_instance=RequestContext(request))
예제 #34
0
파일: tests.py 프로젝트: ArmandNM/wouso
    def test_variable_timer(self):
        formula = Formula.add('chall-timer')
        formula.expression = 'tlimit=10'
        formula.save()

        self.assertEqual(scoring.timer(self.chall_user, ChallengeGame, 'chall-timer', level=self.chall_user.level_no), 10)

        formula.expression = 'tlimit={level}'
        formula.save()

        self.assertEqual(scoring.timer(self.chall_user, ChallengeGame, 'chall-timer', level=self.chall_user.level_no), self.chall_user.level_no)
예제 #35
0
파일: tests.py 프로젝트: hcxiong/wouso
    def test_variable_timer(self):
        formula = Formula.add('chall-timer')
        formula.expression = 'tlimit=10'
        formula.save()

        self.assertEqual(scoring.timer(self.chall_user, ChallengeGame, 'chall-timer', level=self.chall_user.level_no), 10)

        formula.expression = 'tlimit={level}'
        formula.save()

        self.assertEqual(scoring.timer(self.chall_user, ChallengeGame, 'chall-timer', level=self.chall_user.level_no), self.chall_user.level_no)
예제 #36
0
def rollback(user, game, formula, external_id=None, **params):
    if game != None:
        game = game.get_instance()
    formula = Formula.get(formula)
    for history in History.objects.filter(user=user,
                                          game=game,
                                          formula=formula,
                                          external_id=external_id):
        if history.coin.name == 'points':
            user.points -= history.amount
        history.delete()
    user.save()
예제 #37
0
파일: sec.py 프로젝트: rosedu/wouso
 def activity_handler(cls, sender, **kwargs):
     action = kwargs.get('action', None)
     rules = filter(lambda x: x[2] == action, cls.SECURITY_RULES)
     for rule in rules:
         # check if rule is not disabled
         if not BoolSetting.objects.filter(pk__startswith='%s' % rule[0]):
             (guilty, player,
              external_id) = SecurityInspector.check(rule[0], **kwargs)
             if guilty:
                 formula = Formula.get('%s-infraction' % rule[0],
                                       'general-infraction')
                 cls.penalise(player, formula, external_id)
예제 #38
0
파일: tests.py 프로젝트: Sendroiu/wouso
    def test_paralyze(self):
        """
         Test if Paralyze spell works
        """
        Formula.add('chall-warranty')

        player = self._get_player()
        chall_user = player.get_extension(ChallengeUser)

        # Check if player can launch before spell is cast
        self.assertTrue(chall_user.can_launch())

        # Create and add spell to user
        paralyze = Spell.objects.create(name='challenge-cannot-challenge', available=True, price=10, percents=100, type='n')
        obs = PlayerSpellDue.objects.create(player=chall_user, source=chall_user, spell=paralyze, due=datetime.now() + timedelta(days=1))

        # Check if player has the modifier
        self.assertTrue(chall_user.magic.has_modifier('challenge-cannot-challenge'))

        # Player should not be able to launch challenge with Paralyze on
        self.assertFalse(chall_user.can_launch())
예제 #39
0
파일: tests.py 프로젝트: ovidiugiorgi/wouso
    def test_weakness_and_charge(self):
        """
         If both Weakness and Charge are active, a player should win weakness.percents + charge.percents less/more points
         after winning a challenge
        """
        initial_points = 100
        win_points = 10

        player = self._get_player(1).get_extension(ChallengeUser)
        player_dummy = self._get_player(2).get_extension(ChallengeUser)

        scoring.setup_scoring()
        Coin.add('points')
        scoring.score_simple(player, 'points', initial_points)

        formula = Formula.get('chall-won')
        formula.expression = 'points=' + str(win_points)
        formula.save()

        # Apply charge
        charge = Spell.objects.create(name='challenge-affect-scoring-won',
                                      available=True,
                                      price=10,
                                      percents=33,
                                      type='p')
        obs = PlayerSpellDue.objects.create(player=player,
                                            source=player,
                                            spell=charge,
                                            due=datetime.now() +
                                            timedelta(days=1))

        # Apply weakness
        weakness = Spell.objects.create(name='challenge-affect-scoring-won',
                                        available=True,
                                        price=10,
                                        percents=-66,
                                        type='p')
        obs = PlayerSpellDue.objects.create(player=player,
                                            source=player,
                                            spell=weakness,
                                            due=datetime.now() +
                                            timedelta(days=1))

        chall = Challenge.create(user_from=player,
                                 user_to=player_dummy,
                                 ignore_questions=True)
        chall.set_won_by_player(player)

        percents = (charge.percents + weakness.percents) / 100.0
        target_points = initial_points + win_points + percents * win_points

        self.assertEqual(player.player_ptr.points, target_points)
예제 #40
0
def rollback(user, game, formula, external_id=None, **params):
    if game is not None:
        game = game.get_instance()
    formula = Formula.get(formula)
    user = user.user.get_profile()  # make sure you are working on fresh Player
    for history in History.objects.filter(user=user,
                                          game=game,
                                          formula=formula,
                                          external_id=external_id):
        if history.coin.name == 'points':
            user.points -= history.amount
        history.delete()
    user.save()
예제 #41
0
파일: sm.py 프로젝트: andreip/wouso
def timer(user, game, formula, default=300, **params):
    """ Compute a timer value, or return default
    """
    formula = Formula.get(formula)
    if formula is None:
        raise InvalidFormula(formula)
    if not formula.formula:
        return default

    values = calculate(formula, **params)
    if values.has_key("tlimit"):
        return values["tlimit"]
    return default
예제 #42
0
def timer(user, game, formula, default=300, **params):
    """ Compute a timer value, or return default
    """
    formula = Formula.get(formula)
    if formula is None:
        raise InvalidFormula(formula)
    if not formula.definition:
        return default

    values = calculate(formula, **params)
    if values.has_key('tlimit'):
        return values['tlimit']
    return default
예제 #43
0
파일: sm.py 프로젝트: PopAdi/wouso
def timer(user, game, formula, default=300, **params):
    """ Compute a timer value, or return default
    """
    formula = Formula.get(formula)
    if formula is None:
        raise InvalidFormula(formula)
    if not formula.expression:
        return default

    values = calculate(formula, **params)
    if 'tlimit' in values:
        return values['tlimit']
    return default
예제 #44
0
def timer(user, game, formula, default=300, **params):
    """ Compute a timer value, or return default
    """
    formula = Formula.get(formula)
    if formula is None:
        raise InvalidFormula(formula)
    if not formula.expression:
        return default

    values = calculate(formula, **params)
    if 'tlimit' in values:
        return values['tlimit']
    return default
예제 #45
0
파일: tests.py 프로젝트: TomyRO/wouso
    def test_first_login_points(self):
        f = Formula.add('start-points', formula='points=10')
        Coin.add('points')
        player = self._get_player()

        self.assertEqual(player.points, 0)

        # this won't work, since the activity is sent in our custom view
        #self.client.login(username=player.user.username, password='******')
        # using this instead
        signals.addActivity.send(sender=None, user_from=player, action="login", game = None, public=False)

        player = Player.objects.get(pk=player.pk)
        self.assertEqual(player.points, 10)
예제 #46
0
 def get_formulas(kls):
     """ Returns a list of formulas used by qotd """
     fs = []
     chall_game = kls.get_instance()
     fs.append(Formula(id='chall-won', formula='points=6+{different_race}+{different_class}',
         owner=chall_game.game,
         description='Points earned when winning a challenge. Arguments: different_race (int 0,1), different_class (int 0,1)')
     )
     fs.append(Formula(id='chall-lost', formula='points=2',
         owner=chall_game.game,
         description='Points earned when losing a challenge')
     )
     fs.append(Formula(id='chall-draw', formula='points=4',
         owner=chall_game.game,
         description='Points earned when drawing a challenge')
     )
     fs.append(Formula(id='chall-warranty', formula='points=-3',
         owner=chall_game.game,
         description='Points taken as a warranty for challenge'))
     fs.append(Formula(id='chall-warranty-return', formula='points=3',
         owner=chall_game.game,
         description='Points given back as a warranty taken for challenge'))
     return fs
예제 #47
0
파일: tests.py 프로젝트: hcxiong/wouso
    def testScoring(self):
        chall = Challenge.create(user_from=self.chall_user, user_to=self.chall_user2, ignore_questions=True)

        chall.user_from.seconds_took = 10
        chall.user_from.score = 100
        chall.user_from.save()
        chall.user_to.seconds_took = 10
        chall.user_to.score = 10
        chall.user_to.save()

        # TODO: improve usage of formulas inside tests.
        formula = Formula.get('chall-won')
        formula.expression = 'points=10 + min(10, int(3 * {winner_points}/{loser_points}))'
        formula.save()
        chall.played()
예제 #48
0
파일: tests.py 프로젝트: ArmandNM/wouso
    def testScoring(self):
        chall = Challenge.create(user_from=self.chall_user, user_to=self.chall_user2, ignore_questions=True)

        chall.user_from.seconds_took = 10
        chall.user_from.score = 100
        chall.user_from.save()
        chall.user_to.seconds_took = 10
        chall.user_to.score = 10
        chall.user_to.save()

        # TODO: improve usage of formulas inside tests.
        formula = Formula.get('chall-won')
        formula.expression = 'points=10 + min(10, int(3 * {winner_points}/{loser_points}))'
        formula.save()
        chall.played()
예제 #49
0
    def test_first_login_points(self):
        f = Formula.add('start-points', formula='points=10')
        Coin.add('points')
        player = self._get_player()

        self.assertEqual(player.points, 0)

        # this won't work, since the activity is sent in our custom view
        #self.client.login(username=player.user.username, password='******')
        # using this instead
        signals.addActivity.send(sender=None,
                                 user_from=player,
                                 action="login",
                                 game=None,
                                 public=False)

        player = Player.objects.get(pk=player.pk)
        self.assertEqual(player.points, 10)
예제 #50
0
파일: tests.py 프로젝트: vladeugeniu/wouso
    def test_bazaar_buy_ok(self):
        spell = Spell.objects.create(price=0)
        f = Formula.add('buy-spell')
        f.expression = 'points=0'
        f.save()
        Coin.add('points')

        response = self.client.post('/api/bazaar/buy/', {'spell': spell.id})

        self.assertEqual(response.status_code, 200)
        data = json.loads(response.content)

        self.assertTrue(data)
        self.assertTrue(data['success'])

        player = self.user.get_profile()

        self.assertTrue(spell in [s.spell for s in player.magic.spells_available])
예제 #51
0
def bonus(request, player_id):
    player = get_object_or_404(Player, pk=player_id)

    if request.method == 'POST':
        form = BonusForm(request.POST)
        if form.is_valid():
            coin, amount = form.cleaned_data['coin'], form.cleaned_data[
                'amount']
            formula = Formula.get('bonus-%s' % coin.name)
            if formula is None:
                messages.error(request,
                               'No such formula, bonus-%s' % coin.name)
            else:
                scoring.score(player,
                              None,
                              formula,
                              external_id=request.user.get_profile().id,
                              **{coin.name: amount})
                if form.cleaned_data['reason']:
                    add_activity(
                        player,
                        _('received {amount} {coin} bonus for {reason}'),
                        amount=amount,
                        coin=coin,
                        reason=form.cleaned_data['reason'])
                messages.info(request, 'Successfully given bonus')
            return redirect('details_player', pk=player.id)
    else:
        form = BonusForm()

    bonuses = scoring.History.objects.filter(
        user=player, formula__name__startswith='bonus-').order_by('-timestamp')
    penalties = scoring.History.objects.filter(
        user=player,
        formula__name__startswith='penalty-').order_by('-timestamp')

    return render_to_response('cpanel/bonus.html', {
        'target_player': player,
        'form': form,
        'bonuses': bonuses,
        'penalties': penalties
    },
                              context_instance=RequestContext(request))
예제 #52
0
 def get_system_formulas(self):
     """ Return formulas used by the meta wouso game.
     If inherited, should not override super's result, but extend it.
     """
     from wouso.core.scoring.models import Formula
     fs = []
     fs.append(
         Formula(id='buy-spell',
                 formula='gold=-{price}',
                 owner=None,
                 description='Gold spent on spells'))
     fs.append(
         Formula(id='gold-points-rate',
                 formula='points={gold}*3;gold=-{gold}',
                 owner=None,
                 description='Exchange gold in points'))
     fs.append(
         Formula(id='points-gold-rate',
                 formula='points=-{points};gold={points}*0.1',
                 owner=None,
                 description='Exchange points in gold'))
     fs.append(
         Formula(id='bonus-gold',
                 formula='gold={gold}',
                 owner=None,
                 description='Give bonus gold to the poor people'))
     fs.append(
         Formula(id='bonus-points',
                 formula='points={points}',
                 owner=None,
                 description='Give bonus points'))
     fs.append(
         Formula(id='steal-points',
                 formula='points={points}',
                 owner=None,
                 description='Steal points using spells'))
     fs.append(
         Formula(id='penalty-points',
                 formula='points=-{points}',
                 owner=None,
                 description='Take back points from user'))
     return fs
예제 #53
0
def history_for(user, game, external_id=None, formula=None, coin=None):
    """ Return all history entries for given (user, game) pair.
    """
    # TODO: check usage
    fltr = {}
    if external_id:
        fltr['external_id'] = external_id
    if formula:
        fltr['formula'] = Formula.get(formula)
    if coin:
        fltr['coin'] = Coin.get(coin)

    if not isinstance(game, Game):
        game = game.get_instance()

    if not isinstance(user, User):
        user = user.user

    try:
        return History.objects.filter(user=user, game=game, **fltr)
    except History.DoesNotExist:
        return None
예제 #54
0
파일: sm.py 프로젝트: andreip/wouso
def history_for(user, game, external_id=None, formula=None, coin=None):
    """ Return all history entries for given (user, game) pair.
    """
    # TODO: check usage
    fltr = {}
    if external_id:
        fltr["external_id"] = external_id
    if formula:
        fltr["formula"] = Formula.get(formula)
    if coin:
        fltr["coin"] = Coin.get(coin)

    if not isinstance(game, Game):
        game = game.get_instance()

    if not isinstance(user, User):
        user = user.user

    try:
        return History.objects.filter(user=user, game=game, **fltr)
    except History.DoesNotExist:
        return None
예제 #55
0
파일: tests.py 프로젝트: ovidiugiorgi/wouso
    def test_weakness(self):
        """
         Test for Weakness spell
        """
        initial_points = 100
        win_points = 10

        player_weakness = self._get_player(1).get_extension(ChallengeUser)
        player_dummy = self._get_player(2).get_extension(ChallengeUser)

        scoring.setup_scoring()
        Coin.add('points')
        scoring.score_simple(player_weakness, 'points', initial_points)

        formula = Formula.get('chall-won')
        formula.expression = 'points=' + str(win_points)
        formula.save()

        # Apply weakness
        weakness = Spell.objects.create(name='challenge-affect-scoring-lost',
                                        available=True,
                                        price=10,
                                        percents=-66,
                                        type='n')
        obs = PlayerSpellDue.objects.create(player=player_weakness,
                                            source=player_weakness,
                                            spell=weakness,
                                            due=datetime.now() +
                                            timedelta(days=1))

        # Win challenge with player_weakness
        chall = Challenge.create(user_from=player_weakness,
                                 user_to=player_dummy,
                                 ignore_questions=True)
        chall.set_won_by_player(player_weakness)

        # Player should win weakness.percents less points with weakness applied
        target_points = initial_points + win_points + weakness.percents / 100.0 * win_points
        self.assertEqual(player_weakness.player_ptr.points, target_points)
예제 #56
0
파일: tests.py 프로젝트: ArmandNM/wouso
    def test_scoring_loss(self):
        initial_points = 10
        winner = self._get_player(1).get_extension(ChallengeUser)
        loser = self._get_player(2).get_extension(ChallengeUser)

        # Setup scoring
        scoring.setup_scoring()
        Coin.add('points')

        # Give initial points
        scoring.score_simple(winner, 'points', initial_points)
        scoring.score_simple(loser, 'points', initial_points)

        # Set formula
        loss_points = -2
        formula = Formula.get('chall-lost')
        formula.expression = 'points=' + str(loss_points)
        formula.save()

        # Play challenge
        chall = Challenge.create(user_from=winner, user_to=loser, ignore_questions=True)
        chall.set_won_by_player(winner)

        self.assertEqual(loser.player_ptr.points, initial_points + loss_points) # loss_points is negative
예제 #57
0
파일: sm.py 프로젝트: LucianU/wouso
def setup():
    """ Prepare database for Scoring """
    for cc in CORE_POINTS:
        if not Coin.get(cc):
            Coin.add(cc, name=cc)
    # special case, gold is integer
    gold = Coin.get('gold')
    gold.integer = True
    gold.save()

    # iterate through games and register formulas
    for game in get_games():
        for formula in game.get_formulas():
            if not Formula.get(formula.id):
                Formula.add(formula)
    # add wouso formulas
    for formula in God.get_system_formulas():
        if not Formula.get(formula.id):
            Formula.add(formula)