Teams

RandomTeams

by Jon Lambell

HTML

<span id="output">Nothing</span>
<button id="go">
  Go
</button>

JavaScript

const VoiceUsers = [
	'User1',
  'User2',
  'User3',
  'User4',
  'User5',
  'Player6',
  'Player7'
];

const AutoFetchUsers = () => VoiceUsers;

const WriteResults = (message) => {
	document.getElementById('output').innerText = message;
}

let Players = [];

const SetPlayers = (players) => Players = players;

const GetRandomPlayer = (removeOnGet = true) => {
	const player = Players[Math.floor(Math.random()*Players.length)];
  
  if (removeOnGet) {
  	Players.splice(Players.indexOf(player), 1);
  }
  
  return player;
};

const PlayersLeft = () => !!Players.length;

const Teams = {};
const SetTeams = (numberOfTeams, maxPlayers = 4) => {
	for(let i = 0; i < numberOfTeams; i+=1) {
  	Teams[`Team${i+1}`] = {
    	players: [],
      maxPlayers
    };
  }
};

const IsTeamFull = (team) => (Teams[`Team${team}`].players.length >= Teams[`Team${team}`].maxPlayers);

const AddPlayerToTeam = (player, team) => {
	Teams[`Team${team}`].players.push(player);
}

const GenerateTeams = (
	numberOfTeams,
  users = AutoFetchUsers()
) => {
	SetPlayers(users);
  SetTeams(numberOfTeams, Math.ceil(Players.length/numberOfTeams))

	const maxLoops = 1000;
  let currentLoops = 0;
  
  let currentTeam = 1;
  
  while (PlayersLeft() && currentLoops < maxLoops) {
  	currentLoops+=1;
    if (currentLoops >= maxLoops) {
    	throw new Error('Aborting due to potential infinate loop...');
    }

    AddPlayerToTeam(GetRandomPlayer(), currentTeam);
    
    if (IsTeamFull(currentTeam) || !PlayersLeft()) {
    	currentTeam += 1;
    }
  }
  console.log(Teams);
}

document.getElementById('go').addEventListener('click', (event) => {
	GenerateTeams(3);
});