Exemple #1
0
        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());
        }
Exemple #2
0
        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();
            }
        }