Бот-рандомайзер с input для Discord, вывод нескольких значений со списка и исключение их

Рейтинг: 1Ответов: 1Опубликовано: 21.05.2023

Создал простенького бота, выводящего командой "/roll" 2 случайных языка из готового списка. Суть в чем:

  1. Мне необходимо, чтобы я мог несколько раз дублировать эту команду в одном сообщении бота, и чтобы каждый раз был случайный результат, не имеющий значений с предыдущего. Прим.: /roll 2 # 2 - кол-во выполнений команды --> ['Английский', 'Русский'] ['Бразильский', 'Китайский']
  2. Было бы неплохо исключить какое-то количество языков, написав в той же команде их название. Допустим, я пишу "Английский, Японский" (/roll n Английский Японский), и они не выдаются мне, как результат.

Код:

import discord 
import random
from discord.ext import commands


intents = discord.Intents.default() 
intents.message_content = True
bot = commands.Bot(command_prefix='/', intents=intents) 


lan_list = ['Японский', 'Английский', 'Арабский', 'Русский', 'Французский', 
           'Бразильский', 'Немецкий', 'Китайский']
k = 2


@bot.command()
async def roll(ctx):
    randoms = (random.SystemRandom().sample(lan_list, k))
    await ctx.send(randoms)

Ответы

▲ 0Принят

Мой вариант решения:

@bot.command()
async def roll(ctx, *args):
    ar = ' '.join(args)
    ar2 = [ar][0].split(' ')

    lan_list = ['Японский', 'Английский', 'Арабский', 'Русский', 'Французский', 'Бразильский', 'Немецкий', 'Китайский']

    for i in ar2:
        i.capitalize()
        if i in lan_list:
            lan_list.remove(i)
            
    k = 2
    x = int(ar2[0])

    for i in range(x):
        randoms = (random.SystemRandom().sample(lan_list, k))
        arguments = ', '.join(randoms)
        await ctx.send(arguments)

        for i in randoms:
            if i in lan_list:
                lan_list.remove(i)

Пользователь вводит сколько раз нужно прогнать команду (количество итераций цикла) и через пробел указывает языки, которые нужно убрать, затем циклом выполняем отправку команды. Во вложенном цикле сопоставляем выпавшие в рандоме значения с теми, которые имеются в основном списке и, при совпадениях, удаляем.

Таким образом, при следующей отправке пары языков, повторов не будет.

Команда выглядит подобным видом: !roll 2 Немецкий Русский Английский