diff options
Diffstat (limited to 'commands.py')
-rw-r--r-- | commands.py | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/commands.py b/commands.py index 2739445..b974435 100644 --- a/commands.py +++ b/commands.py @@ -4,6 +4,7 @@ import random import config +import discord from discord.ext import commands @@ -57,34 +58,34 @@ async def shuffle(ctx: commands.Context, channel_size=2): if not channels: return False meta_channel, lobby_channel = channels - members = lobby_channel.members[:] + members = await await_n(map(ctx.guild.fetch_member, lobby_channel.voice_states.keys())) if not members: await answer(ctx, 'error: nobody wants to get shuffeled :(') return False if len(members) < channel_size: await answer(ctx, f'error: you are too few people ({len(members)}). Group size is {channel_size}') return False - # round up the quotient between the member count and the channel size - channel_count = (len(members) + channel_size - 1) // channel_size + channel_count = len(members) // channel_size + excess_slots = list(range(channel_count)) + random.shuffle(excess_slots) + excess_slots = excess_slots[:len(members) - channel_count * channel_size] ctx.bot.pair_channels = await ctx.bot.create_pair_channels(ctx, meta_channel, channel_count) slots = [] for i, _ in enumerate(ctx.bot.pair_channels): slots.extend([i] * channel_size) + slots.extend(excess_slots) random.shuffle(slots) futures = [] - group_members = [[] for _ in ctx.bot.pair_channels] - slot_members = [] - for slot in slots: - member = members.pop() + groups = [[] for _ in range(channel_count)] + member_slot_map = [] + for (member, slot) in zip(members, slots): channel = ctx.bot.pair_channels[slot] futures.append(member.move_to(channel)) - group_members[slot].append(member) - slot_members.append(member) - for member, slot in zip(slot_members, slots): - group = group_members[slot] + groups[slot].append(member) + member_slot_map.append(slot) + for i, (member, slot) in enumerate(zip(members, member_slot_map)): + group = groups[slot] await ctx.bot.send_panel(ctx, member, group) - if members: - await answer(ctx, 'warning: not all members got shuffeled') await await_n(futures) return True |