private async Task AddToQueueList(List <PugUser> signupList, string regionText) { var user = Context.User; if (signupList.Count >= _maxPlayers) { string replayString = string.Format(Resources.ErrorPugIsFull, Context.User.GetName()); await SendEmbededMessageAsync(replayString); } else { if (signupList.Select(x => x.IUser.Id).Contains(user.Id)) { string replayString = string.Format(Resources.ErrorYouAreAlreadySignedUp, Context.User, regionText, signupList.Count, _maxPlayers); await SendEmbededMessageAsync(replayString); } else { var pugUser = new PugUser(user, datastore.GetOrCreateUser(user)); signupList.Add(pugUser); string replayString = string.Format(Resources.PlayerJoinedTheQueue, regionText, signupList.Count, _maxPlayers, Context.User.GetName()) + string.Join("\n", signupList.Select(x => string.Format(Resources.NameAndRating, x.IUser.GetName(), x.GetDisplayRanking()))); await SendEmbededMessageAsync(replayString); if (signupList.Count >= _maxPlayers) { datastore.SignedUpUsers = signupList; datastore.CurrentPug = new Pug() { Region = regionText == "EU" ? Region.EU : Region.NA }; string replayString2 = string.Format(Resources.PugIsNowFull, regionText); datastore.CurrentPugState = DataStore.PugState.Readyup; var autoEvent = new AutoResetEvent(false); datastore.ReadyUpTimer = new Timer(new TimerCallback(ReadyUpTimerProc), autoEvent, READY_UP_TIME * 1000, 0); await SendEmbededMessageAsync(replayString2); } } } }
public async Task ChooseCaptains() { //Tries to find captain that have alteast 15 games var chooseableCapatins = datastore.SignedUpUsers.Where(x => (x.DatabaseUser.Wins + x.DatabaseUser.Loses) >= 15); //If it cant find 2 that can do that, just include everyone if (chooseableCapatins.Count() < 2) { chooseableCapatins = datastore.SignedUpUsers; } int numOfChoosable = Math.Min(chooseableCapatins.Count(), 5); var orderList = chooseableCapatins.OrderByDescending(x => x.DatabaseUser.SkillRating).Take(numOfChoosable); Random random = new Random(); //First captain is random between the 5 highest ranked players int indexCapt1 = random.Next(orderList.Count()); PugUser capt1 = orderList.ToList()[indexCapt1]; //Second captain is the one cloest in rating to the first captain. int indexAbove = indexCapt1 - 1; int indexBelow = indexCapt1 + 1; double skillDiffAbove = double.MaxValue; double skillDiffBelow = double.MaxValue; var playerAbove = orderList.ElementAtOrDefault(indexAbove); var playerBelow = orderList.ElementAtOrDefault(indexBelow); if (playerAbove != null) { skillDiffAbove = Math.Abs(capt1.DatabaseUser.SkillRating - playerAbove.DatabaseUser.SkillRating); } if (playerBelow != null) { skillDiffBelow = Math.Abs(capt1.DatabaseUser.SkillRating - playerBelow.DatabaseUser.SkillRating); } PugUser capt2; if (skillDiffAbove < skillDiffBelow) { capt2 = playerAbove; } else { capt2 = playerBelow; } //Make sure so the lowest skillrating of the captains get first pick. if (capt1.DatabaseUser.SkillRating > capt2.DatabaseUser.SkillRating) { var tempCap = capt1; capt1 = capt2; capt2 = tempCap; } capt1.IsPicked = true; capt1.Team = DataStore.Teams.TeamOne; capt2.IsPicked = true; capt2.Team = DataStore.Teams.TeamTwo; datastore.Captain1 = capt1; datastore.Captain2 = capt2; int curId = 1; datastore.SignedUpUsers.Where(x => x.IsPicked == false).ToList().ForEach(x => { x.PickID = curId; curId++; }); await SendEmbededMessageAsync(string.Format(Resources.CaptainsWithSkill, capt1.IUser.Mention, capt1.GetDisplayRanking(), capt2.IUser.Mention, capt2.GetDisplayRanking())); await SendEmbededMessageAsync(Resources.PickNumber + string.Join("\n", datastore.SignedUpUsers.Where(x => x.IsPicked == false).Select(x => string.Format(Resources.UserPickingInfo, x.PickID, x.IUser.GetName(), x.GetDisplayRanking(), x.DatabaseUser.Info ?? ""))) + "\n" + string.Format(Resources.PlayersTurnToPick, capt1.IUser.Mention)); }