Ejemplo n.º 1
0
async def send_code(ctx,
                    group_name,
                    users: commands.Greedy[User],
                    is_authorized_or_owner=is_authorized_or_owner):
    """Sends a promo code from a code group to each of the mentioned users."""
    logging.info(
        "Tentando enviar um código do grupo %s para o(s) usuário(s) %s",
        group_name, ', '.join([f'{user.name}({user.id})' for user in users]))
    group = PromoCodeGroup.get_or_none(
        (PromoCodeGroup.guild_id == ctx.guild.id)
        & (PromoCodeGroup.name == group_name))
    if group is None:
        await ctx.send("Grupo {} não existe".format(group_name))
        return
    messages_author = []
    messages_channel = []
    with db.atomic() as transaction:
        for user in users:
            if not await is_authorized_or_owner(ctx):
                used_codes = PromoCode.select().where(
                    (PromoCode.group == group)
                    & (PromoCode.sent_to_id == user.id))
                if used_codes.count() > 0:
                    messages_channel.append(
                        "Usuário {0} já resgatou código do grupo {1}".format(
                            user.name, group_name))
                    continue
            promo_code = PromoCode.select().where(
                (PromoCode.group == group) & (PromoCode.sent_to_id == None)  # noqa E501 pylint: disable=singleton-comparison
            ).first()
            if promo_code is None:
                messages_channel.append(
                    "Grupo {} não possui mais códigos disponíveis".format(
                        group_name))
                break
            promo_code.sent_to_name = user.name
            promo_code.sent_to_id = user.id
            promo_code.sent_at = datetime.now(timezone.utc)
            promo_code.save()
            await user.send("Olá! Você ganhou um código: {}".format(
                promo_code.code))
            # incluir essa linha nos testes!
            messages_author.append(
                "Código {} enviado para o usuário {}".format(
                    promo_code.code, user.name))
            messages_channel.append(
                "Enviado código do grupo {} para o usuário {}".format(
                    group_name, user.name))
        await ctx.send("\n".join(messages_channel))
        await ctx.author.send("\n".join(messages_author))
        transaction.commit()
Ejemplo n.º 2
0
async def remove_code(ctx, group_name, code):
    """Removes a code from a code group."""
    logging.info("Tentando remover o código %s do grupo %s", code, group_name)
    group = PromoCodeGroup.get_or_none(
        (PromoCodeGroup.guild_id == ctx.guild.id)
        & (PromoCodeGroup.name == group_name))
    if group is None:
        await ctx.send("Código {0} não encontrado no grupo {1}".format(
            code, group_name))
        return
    query = PromoCode.delete().where((PromoCode.code == code)
                                     & (PromoCode.group == group))
    rows_removed = query.execute()
    if rows_removed > 0:
        await ctx.send("Código {0} excluído do grupo {1}".format(
            code, group_name))
    else:
        await ctx.send("Código {0} não encontrado no grupo {1}".format(
            code, group_name))
Ejemplo n.º 3
0
async def list_code(ctx, group_name):
    """Lists all codes inside a code group."""
    logging.info("Tentando listar os códigos do grupo %s", group_name)
    group = PromoCodeGroup.get_or_none(
        (PromoCodeGroup.guild_id == ctx.guild.id)
        & (PromoCodeGroup.name == group_name))
    if group is None:
        await ctx.send("Grupo {} não existe".format(group_name))
        return
    codes = PromoCode.select().where((PromoCode.group == group))
    if codes.count() == 0:  # pylint: disable=no-value-for-parameter
        await ctx.send("Grupo {} não possui códigos".format(group_name))
        return
    output = "Códigos para o grupo {}: ".format(group_name)
    for code in codes:
        output += "\n- {}".format(code.code)
        sent_at = sqlite_datetime_hack(code.sent_at)
        if code.sent_to_id:
            output += " enviado para o usuário {0} em {1}".format(
                code.sent_to_name,
                sent_at.astimezone(LOCAL_TIMEZONE).strftime(DATETIME_FORMAT))
    await send_long_message_array(ctx.author.send, output)
Ejemplo n.º 4
0
async def add_code_bulk(ctx, group_name, *, code_bulk):
    """Adds a lot of codes to the same group.

    Codes are separated by anything that is not:
      - a letter
      - a number
      - a dash (-)"""
    logging.info("Tentando adicionar códigos em massa ao grupo %s: %s",
                 group_name, code_bulk)
    group = PromoCodeGroup.get_or_none(
        (PromoCodeGroup.guild_id == ctx.guild.id)
        & (PromoCodeGroup.name == group_name))
    if group is None:
        await ctx.send(
            "Grupo de códigos promocionais não encontrado: {}".format(
                group_name))
        return
    codes = parse_codes_in_bulk(code_bulk)
    insert_bulk_data = [{'group': group, 'code': code} for code in codes]
    with db.atomic() as transaction:
        PromoCode.insert_many(insert_bulk_data).execute()  # noqa E501 pylint: disable=no-value-for-parameter
        transaction.commit()
    await ctx.send("Códigos adicionados ao grupo {}".format(group_name))