【发布时间】:2021-06-06 00:44:56
【问题描述】:
我正在制作一个 Discord 机器人,它将 6 人排入队列,然后将 3 人随机分配到 2 个团队。然后这些团队进行私人 3v3。
我当前的问题是,一旦一个人离开队列,它就会删除其他所有人,我不知道为什么通过查看我的代码。我有两个数组:
self.total 和 self.mention
self.total 用于存储用户 ID(以便我可以让机器人 DM 他们),而 self.mention 存储他们的标签(以便机器人可以标记它们)。 self.qcount 用于统计排队的用户数,达到 6 个用户就关闭队列。
下面是离开命令。
@commands.command()
async def leave(self, ctx):
if len(self.total) > 1:
if ctx.author.mention in self.mention:
self.total = self.total.remove(ctx.author)
self.mention = self.mention.remove(ctx.author.mention)
await ctx.send('You\'ve left the queue.')
self.qcount -= 1
elif len(self.total) == 1:
if ctx.author.mention in self.mention:
self.total = self.total.remove(ctx.author)
self.mention = self.mention.remove(ctx.author.mention)
await ctx.send('You\'ve left the queue.')
self.total = []
self.mention = []
self.qcount = 0
#elif len(self.total) > 1:
#if ctx.author.mention in self.mention:
#self.total = self.total.remove(ctx.author)
#self.mention = self.mention.remove(ctx.author.mention)
#await ctx.send('You\'ve left the queue.')
else:
await ctx.send('You\'re not in the queue.')
return
下面是队列命令:
class queue(commands.Cog):
def __init__(self, client):
self.client = client
self.qcount = 0
self.total = []
self.mention = []
@commands.command()
async def q(self, ctx):
if self.qcount < 6:
self.total
self.mention
guild = ctx.guild
if ctx.author.mention in self.mention:
await ctx.send('You\'re already queued.')
return
else:
#checking if the channel id matches the id allowed.
if ctx.channel.id == 818292898067382297:
self.qcount += 1
await ctx.send('Added to the queue!' + ' ' + f'{ctx.author.mention}')
#adds users to the queue
self.total.append(ctx.author)
self.mention.append(ctx.author.mention)
if self.qcount == 6:
#Takes the teams and shuffles, then splits into two teams.
random.shuffle(self.total)
blue = self.mention[:3]
orange = self.mention [3:6]
blueDM = self.total[:3]
orangeDM = self.total [3:6]
#set p to equal a random user in the queue
p = random.choice(self.total)
username = str((random.randint(1,9999)))
password = str((random.randint(1,9999)))
#Embedded info via dms
HostEmbed = discord.Embed(
title = '6Mans',
description = 'You\'re the host so create the lobby and let the other team know once the lobby is up.\n ' + '**Lobby Name:** OU' + username + '\n' + '**Password:** OU' + password,
colour = discord.Colour.green()
)
BlueEmbed = discord.Embed(
title = '6Mans',
description = '**Host:** ' + f'{p}\n' + 'You\'re on the blue team, please keep an eye on the 6mans channel for an update from the host as to when the lobby is up.\n' + '**Lobby Name:** OU ' + username + '\n' + '**Password:** OU' + password,
colour = discord.Colour.blue()
)
OrangeEmbed = discord.Embed(
title = '6Mans',
description = '**Host:** ' + f'{p}\n' + 'You\'re on the orange team, please keep an eye on the 6mans channel for an update from the host as to when the lobby is up.\n' + '**Lobby Name:** OU' + username + '\n' + '**Password:** OU' + password,
colour = discord.Colour.orange()
)
#dm a random person to be the host + dm other members the lobby info
await p.send(embed = HostEmbed)
for i in blueDM:
await i.send(embed = BlueEmbed)
for i in orangeDM:
await i.send(embed = OrangeEmbed)
#tags the users when queue is ready
await ctx.send('Queue is ready, view the teams below. Check your DMs for lobby info.')
#Voice Channels Created
overwrites = {
guild.default_role: discord.PermissionOverwrite (read_messages=True),
guild.me: discord.PermissionOverwrite(read_messages=True)
}
teamNumber = (random.randint(1,999))
blueVoice = await guild.create_voice_channel('Blue Team' + ' ' + str (teamNumber), user_limit = 3, overwrites=overwrites)
orangeVoice = await guild.create_voice_channel('Orange Team' + ' ' + str(teamNumber), user_limit = 3,overwrites=overwrites)
#Embedded Teams Info
embed1 = discord.Embed(
title = 'Blue Team',
description = 'Your voice channel is: ' + str(blueVoice) + '\n' + f'{blue}',
colour = discord.Colour.blue()
)
await ctx.send(embed=embed1)
embed2 = discord.Embed(
title = 'Orange Team',
description = 'Your voice channel is: ' + str(orangeVoice) + '\n' + f'{orange}',
colour = discord.Colour.orange()
)
await ctx.send(embed=embed2)
#Queue resets, voice channels get deleted
await ctx.send('Setting up the next queue, please wait 5 seconds.')
await asyncio.sleep(3)
self.total.clear()
await asyncio.sleep(3)
self.qcount = 0
await asyncio.sleep(2400)
await blueVoice.delete()
await orangeVoice.delete()
else:
await ctx.send('Please wait a few seconds before trying to queue.')
await asyncio.sleep(3)
self.total.clear()
self.mention.clear()
await asyncio.sleep(3)
self.qcount = 0
return
【问题讨论】:
标签: python discord.py