summaryrefslogtreecommitdiff
path: root/commands.py
diff options
context:
space:
mode:
Diffstat (limited to 'commands.py')
-rw-r--r--commands.py27
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