public Embed GetMsg(GameResult game, List <ulong> team1, ulong userid) { var msg2 = GameService.GetGameMessage(game, $"Game #{game.GameId} Started", GameFlag.map, GameFlag.time, GameFlag.usermentions, GameFlag.gamestate); var t1 = team1.Any(u => u == userid); var name = t1 ? "Team1" : "Team2"; msg2.Item2.AddField("Game Info", $"Lobby: {MentionUtils.MentionChannel(game.LobbyId)}\nGame: {game.GameId}\nTeam: {name}\n{MentionUtils.MentionChannel(game.LobbyId)} {game.GameId} {name}"); return(msg2.Item2.Build()); }
public virtual async Task LobbyFullAsync(ShardedCommandContext context, Lobby lobby) { using (var db = new Database()) { lobby = db.Lobbies.Find(lobby.ChannelId); await context.Channel.SendMessageAsync("", false, "Queue is full. Picking teams...".QuickEmbed(Color.Blue)); //Increment the game counter as there is now a new game. var vals = ((IQueryable <GameResult>)db.GameResults).Where(x => x.LobbyId == lobby.ChannelId).ToArray(); lobby.CurrentGameCount = vals.Length == 0 ? 1 : vals.Max(x => x.GameId) + 1; var game = new GameResult { LobbyId = lobby.ChannelId, GuildId = lobby.GuildId, GamePickMode = lobby.TeamPickMode, PickOrder = lobby.CaptainPickOrder, GameId = lobby.CurrentGameCount }; var maps = db.Maps.Where(x => x.ChannelId == lobby.ChannelId).ToArray(); if (maps.Length != 0) { var map = maps.OrderByDescending(x => Random.Next()).First(); game.MapName = map.MapName; } db.Lobbies.Update(lobby); db.GameResults.Add(game); db.SaveChanges(); if (lobby.PlayersPerTeam == 1 && (lobby.TeamPickMode == PickMode.Captains_HighestRanked || lobby.TeamPickMode == PickMode.Captains_Random || lobby.TeamPickMode == PickMode.Captains_RandomHighestRanked)) { //Ensure that there isnt a captain pick mode if the teams only consist of one player await context.Channel.SendMessageAsync("", false, "Lobby sort mode was set to random, you cannot have a captain lobby for solo queues.".QuickEmbed(Color.DarkBlue)); lobby.TeamPickMode = PickMode.Random; } var queue = db.GetQueue(game).ToList(); var team1Players = new List <ulong>(); var team2Players = new List <ulong>(); var t1Added = new List <ulong>(); var t2Added = new List <ulong>(); //Set team players/captains based on the team pick mode switch (lobby.TeamPickMode) { case PickMode.Captains_HighestRanked: case PickMode.Captains_Random: case PickMode.Captains_RandomHighestRanked: game.GameState = GameState.Picking; var captains = GetCaptains(context, lobby, game, Random); db.TeamCaptains.Add(new TeamCaptain { UserId = captains.Item1, ChannelId = lobby.ChannelId, GuildId = context.Guild.Id, TeamNumber = 1, GameNumber = game.GameId }); db.TeamCaptains.Add(new TeamCaptain { UserId = captains.Item2, ChannelId = lobby.ChannelId, GuildId = context.Guild.Id, TeamNumber = 2, GameNumber = game.GameId }); //TODO: Timer from when captains are mentioned to first pick time. Cancel game if command is not run. var gameEmbed = new EmbedBuilder { Title = $"Game #{game.GameId} - Current Teams." }; var remainingPlayers = queue.Where(x => x.UserId != captains.Item1 && x.UserId != captains.Item2).Select(x => MentionUtils.MentionUser(x.UserId)); if (lobby.HostSelectionMode != HostSelection.None) { var qIds = queue.Select(x => x.UserId).ToList(); var players = db.Players.Where(p => qIds.Contains(p.UserId)).ToArray(); if (lobby.HostSelectionMode == HostSelection.HighestRanked) { var selected = players.OrderByDescending(x => x.Points).First(); gameEmbed.AddField("Selected Host", MentionUtils.MentionUser(selected.UserId)); } else if (lobby.HostSelectionMode == HostSelection.Random) { var selected = players.OrderByDescending(x => Random.Next()).First(); gameEmbed.AddField("Selected Host", MentionUtils.MentionUser(selected.UserId)); } } gameEmbed.AddField("Team 1", $"Captain: {MentionUtils.MentionUser(captains.Item1)}"); gameEmbed.AddField("Team 2", $"Captain: {MentionUtils.MentionUser(captains.Item2)}"); gameEmbed.AddField("Remaining Players", string.Join("\n", remainingPlayers)); await context.Channel.SendMessageAsync($"Captains have been picked. Use the `pick` or `p` command to choose your players.\nCaptain 1: {MentionUtils.MentionUser(captains.Item1)}\nCaptain 2: {MentionUtils.MentionUser(captains.Item2)}", false, gameEmbed.Build()); break; case PickMode.Random: game.GameState = GameState.Undecided; var shuffled = queue.OrderBy(x => Random.Next()).ToList(); var partyPlayers = db.PartyMembers.Where(x => x.ChannelId == context.Channel.Id).ToArray(); var partyPlayerIds = partyPlayers.Select(x => x.UserId); var parties = partyPlayers.GroupBy(x => x.PartyHost).ToArray(); var partySelected = new List <ulong>(); int partySelection = 0; foreach (var party in parties.OrderBy(x => Random.Next())) { //Skip where a party member is not in the queue. if (party.Any(x => shuffled.All(sh => sh.UserId != x.UserId))) { continue; } //Ignore parties that are too large. if (party.Count() > lobby.PlayersPerTeam) { continue; } var partyIds = party.Select(x => x.UserId); if (partySelection % 2 == 0) { if (t1Added.Count + party.Count() > lobby.PlayersPerTeam) { continue; } db.TeamPlayers.AddRange(party.Select(x => new TeamPlayer { GuildId = context.Guild.Id, ChannelId = lobby.ChannelId, UserId = x.UserId, GameNumber = game.GameId, TeamNumber = 1 })); t1Added.AddRange(partyIds); team1Players.AddRange(partyIds); } else { if (t2Added.Count + party.Count() > lobby.PlayersPerTeam) { continue; } db.TeamPlayers.AddRange(party.Select(x => new TeamPlayer { GuildId = context.Guild.Id, ChannelId = lobby.ChannelId, UserId = x.UserId, GameNumber = game.GameId, TeamNumber = 2 })); t2Added.AddRange(partyIds); team2Players.AddRange(partyIds); } partySelected.AddRange(partyIds); partySelection++; } //Add remaining players to teams. foreach (var player in shuffled.Where(x => !partySelected.Contains(x.UserId))) { if (t1Added.Count > t2Added.Count) { db.TeamPlayers.Add(new TeamPlayer { GuildId = context.Guild.Id, ChannelId = lobby.ChannelId, UserId = player.UserId, GameNumber = game.GameId, TeamNumber = 2 }); t2Added.Add(player.UserId); team2Players.Add(player.UserId); } else { db.TeamPlayers.Add(new TeamPlayer { GuildId = context.Guild.Id, ChannelId = lobby.ChannelId, UserId = player.UserId, GameNumber = game.GameId, TeamNumber = 1 }); t1Added.Add(player.UserId); team1Players.Add(player.UserId); } } db.QueuedPlayers.RemoveRange(queue); break; case PickMode.TryBalance: game.GameState = GameState.Undecided; var ordered = queue.OrderByDescending(x => db.Players.Find(context.Guild.Id, x.UserId).Points).ToList(); //0-0 //1-0 //1-1 //2-1 //2-2 //... foreach (var user in ordered) { if (t1Added.Count <= t2Added.Count) { db.TeamPlayers.Add(new TeamPlayer { GuildId = context.Guild.Id, ChannelId = lobby.ChannelId, UserId = user.UserId, GameNumber = game.GameId, TeamNumber = 1 }); t1Added.Add(user.UserId); } else { db.TeamPlayers.Add(new TeamPlayer { GuildId = context.Guild.Id, ChannelId = lobby.ChannelId, UserId = user.UserId, GameNumber = game.GameId, TeamNumber = 2 }); t2Added.Add(user.UserId); } } db.QueuedPlayers.RemoveRange(queue); break; } db.SaveChanges(); if (lobby.TeamPickMode == PickMode.TryBalance || lobby.TeamPickMode == PickMode.Random) { var res = GameService.GetGameMessage(game, $"Game #{game.GameId} Started", GameFlag.lobby, GameFlag.map, GameFlag.time, GameFlag.usermentions, GameFlag.gamestate); if (lobby.HostSelectionMode != HostSelection.None) { var qIds = queue.Select(x => x.UserId).ToList(); var players = db.Players.Where(p => qIds.Contains(p.UserId)).ToArray(); if (lobby.HostSelectionMode == HostSelection.HighestRanked) { var selected = players.OrderByDescending(x => x.Points).First(); res.Item2.AddField("Selected Host", MentionUtils.MentionUser(selected.UserId)); } else if (lobby.HostSelectionMode == HostSelection.Random) { var selected = players.OrderByDescending(x => Random.Next()).First(); res.Item2.AddField("Selected Host", MentionUtils.MentionUser(selected.UserId)); } } await context.Channel.SendMessageAsync(res.Item1, false, res.Item2.Build()); if (lobby.GameReadyAnnouncementChannel != null) { var channel = context.Guild.GetTextChannel(lobby.GameReadyAnnouncementChannel.Value); if (channel != null) { if (lobby.MentionUsersInReadyAnnouncement) { await channel.SendMessageAsync(res.Item1, false, res.Item2.Build()); } else { var res2 = GameService.GetGameMessage(game, $"Game #{game.GameId} Started", GameFlag.lobby, GameFlag.map, GameFlag.time, GameFlag.gamestate); await channel.SendMessageAsync(res2.Item1, false, res2.Item2.Build()); } } } if (lobby.DmUsersOnGameReady) { foreach (var user in queue.Select(x => x.UserId).ToArray()) { try { var t1 = db.GetTeamFull(game, 1); var u = context.Client.GetUser(user); var _ = Task.Run(async() => { await u.SendMessageAsync(MentionUtils.MentionUser(user), false, GetMsg(game, t1.ToList(), user)); }); } catch { // } } } } db.SaveChanges(); } }