예제 #1
0
def for_winner(user, winning_tickets):
    player = data.get_player(user)

    winner_embed = create(title=YOU_WON, color=colors.random())
    winner_embed.set_thumbnail(url=user.avatar_url)

    for prize, tickets in zip(lotto.PRIZES, winning_tickets):
        prize_name = lotto.get_prize_name(prize)
        _, multi = prize
        values = []
        for number, worth in tickets[::-1]:
            prize_coins = worth * multi
            worth = as_coins(worth, suffix=False)
            prize_coins = as_coins(prize_coins)
            value = f'`{number:02}`: {worth} → {prize_coins}'
            values.append(value)
        if values:
            field = dict(name=prize_name, value='\n'.join(values))
            winner_embed.add_field(**field)

    total_spendings = player.get_total_spendings()
    initial_balance = player.balance + total_spendings - player.total_winnings
    change = player.total_winnings - total_spendings
    sign = '+' if change >= 0 else ''
    value = (f' {as_coins(initial_balance)}\n'
             f'-{as_coins(total_spendings)}\n'
             f'+{as_coins(player.total_winnings)}\n'
             f'({sign}{as_coins(change)})\n'
             f'={as_coins(player.balance)}')
    winner_embed.add_field(name=BALANCE, value=value)

    winner_embed.title += ' ' + (WELL_KINDA if change <= 0 else CONGRATS)

    return winner_embed
예제 #2
0
def for_ticket_order(user, order, announcing=False):
    player = data.get_player(user)

    title = TICKET_ORDER_OF + user.name
    description = ticket_parser.format_as_description(order.tickets)

    can_buy = player.can_buy(order) and not announcing
    color = CAN_BUY_COLOR if can_buy else CANNOT_BUY_COLOR

    embed = create(title=title,
                   description=description,
                   color=color,
                   footer_user=user)

    total_cost = order.total_cost()

    cost_value = (f'{UNIT_COST}: {as_coins(order.coins)}\n'
                  f'{TOTAL_COST}: {as_coins(total_cost)}')

    if order.coins == total_cost:
        cost_value = cost_value.split('\n')[1]

    embed.add_field(name=COST, value=cost_value)

    balance = player.balance
    balance_after = balance - total_cost

    balance_value = (f'{NOW}: {as_coins(balance)}\n'
                     f'{AFTER}: {as_coins(balance_after)}')

    embed.add_field(name=BALANCE, value=balance_value)

    reactions = ''
    if can_buy:
        reactions += BUY_FIELD + '\n'
    reactions += CANCEL_FIELD
    embed.add_field(name=REACTIONS, value=reactions)

    if not can_buy:
        reason = ''
        if not player.can_hold_more_tickets(order):
            reason = MAX_TICKET_COUNT % player.get_max_tickets()
        elif not player.can_afford(order):
            reason = CANNOT_AFFORD % as_coins(-balance_after)
            income = player.get_income()
            if balance < income:
                reason += '\n' + lotto.INCOME_TIP + as_coins(income)
        elif announcing:
            reason = RESULT_ANNOUNCING
        embed.add_field(name=CANNOT_BUY_FIELD, value=reason)

    return embed
예제 #3
0
def for_paid_tickets(user, next_draw=None):
    player = data.get_player(user)

    title = TICKETS_OF + user.name

    embed = create(title=title, color=discord.Color.green())

    tickets_by_price = player.group_paid_tickets()
    for price, tickets in tickets_by_price.items():
        desc = ticket_parser.format_as_description(tickets)
        embed.add_field(name=as_coins(price), value=desc)

    spendings = player.get_total_spendings()
    balance_before = player.balance + spendings
    balance_value = (f'{as_coins(balance_before)}\n'
                     f'-{as_coins(spendings)}\n'
                     f'={as_coins(player.balance)}')
    embed.add_field(name=BALANCE, value=balance_value)
    embed.add_field(name=REACTIONS, value=CLOSE_FIELD)

    if next_draw:
        embed.timestamp = next_draw

    footer_text = NEXT_DRAW_AT if next_draw else None
    embed.set_footer(text=footer_text, icon_url=user.avatar_url)

    return embed
예제 #4
0
    async def rich(self, context):
        if not context.guild: return

        ranks = []
        guild_players = data.get_players_in_guild(
            context.guild)[:RICH_PER_PAGE]
        guild_players.sort(key=lambda p: p.get_net_worth(), reverse=True)

        for i, player in enumerate(guild_players):
            net_worth = player.get_net_worth()
            if net_worth < MIN_RICH:
                continue
            user = self.bot.get_user(player.id)
            coins = as_coins(net_worth, suffix=False)
            rank = f'#{i+1:2} | {coins}'
            if user:
                rank += f' - {user.mention}'
            ranks.append(rank)

        embed = embeds.create()
        embed.set_author(name=SERVER_RICHEST_PLAYERS)
        embed.description = '\n'.join(ranks)

        if len(ranks) < RICH_PER_PAGE:
            embed.description += '\n' + EMPTY_RICH

        await context.send(embed=embed)
예제 #5
0
    async def balance(self, context, member=None):
        user = await cogs.convert_to_user(context, member)
        if not user: return

        player = data.get_player(user)
        income = player.get_income()

        embed = self.get_balance_embed(user)
        if user == context.author and player.balance < income:
            embed.description += '\n' + lotto.INCOME_TIP + as_coins(income)
        await context.send(embed=embed)
예제 #6
0
    async def add_xp(self, context, user_or_player, xp:int):
        user = data.get_user(self.bot, user_or_player)
        player = data.get_player(user_or_player)
        
        player.clear_level_up()
        player._add_xp(xp)
        if player.level_up:
            lines = [LEVEL_UP % player.level_up]

            old_max, new_max = map(lotto.get_max_tickets_for, player.level_up)
            if new_max > old_max:
                lines += [CAN_BUY % new_max]
                
            embed = embeds.for_level(user)
            lines += [embed.description]
            lines += [INCOME + as_coins(player.get_income(), backtick=True, suffix=False)]
            embed.description = '\n'.join(lines)
            await context.send(embed=embed)