Beispiel #1
0
        public void Invoke(DiscordHandler client, CommandHandler handler, CommandEventArg args)
        {
            if (!args.Parameters[0].Equals("reset", StringComparison.CurrentCultureIgnoreCase))
            {
                AccessLevel newAccess;
                if (args.Parameters[1].TryParseEnum(out AccessLevel acc))
                {
                    newAccess = acc;
                }
                else
                {
                    HelpCommand.ShowHelp(args.Channel, this, string.Format(CultureInfo.CurrentCulture, ResourceExceptions.FailedParseException, "Access Level"));
                    return;
                }

                if (newAccess == AccessLevel.Dev)
                {
                    HelpCommand.ShowHelp(args.Channel, this, "Dev can only be set via DB");
                    return;
                }

                if (!handler.SetCommandAccessLevel(args.Parameters[0], args.Guild.Id, newAccess))
                {
                    client.SendSimpleEmbed(args.Channel, "Failed to change accesslevel", "Command not found or command not overwrittable").ConfigureAwait(false);
                }
                else
                {
                    client.SendSimpleEmbed(args.Channel, "Accesslevel changed", "Changed commands accesslevel").ConfigureAwait(false);
                }
            }
            else
            {
                using DBContext c = new DBContext();
                CommandAccess ca = c.CommandAccess.FirstOrDefault(ca => ca.DiscordGuildId == (long)args.Guild.Id &&
                                                                  ca.TypeName.StartsWith(args.Parameters[1], StringComparison.CurrentCultureIgnoreCase));

                if (ca != null)
                {
                    c.CommandAccess.Remove(ca);
                    c.SaveChanges();

                    client.SendSimpleEmbed(args.Channel, "Resetted", "Resetted command " + args.Parameters[1]).ConfigureAwait(false);
                }
                else
                {
                    client.SendSimpleEmbed(args.Channel, "Not Found/Resetted", "Could not find command or command already resetted").ConfigureAwait(false);
                }
            }
        }
Beispiel #2
0
        private static void OnTeamTopList(DiscordHandler client, CommandEventArg args, bool reverse = false)
        {
            int page = 1;

            if (args.Parameters.Count > 0 && int.TryParse(args.Parameters[0], out int p))
            {
                page = p;
            }

            page--;

            List <SeasonTeamCardCache> teams = GetTeams(args.Guild).OrderByDescending(sp => sp.TeamRating).ToList();

            if (teams.Count == 0)
            {
                client.SendSimpleEmbed(args.Channel, "Could not find any stats").ConfigureAwait(false);
                return;
            }
            if (reverse)
            {
                teams.Reverse();
            }

            args.Channel.SendMessageAsync(embed: GetListAsEmbed <SeasonTeamCardCache>(teams, page * 10, 10, "Teams",
                                                                                      new Func <SeasonTeamCardCache, string>(sp => sp.TeamName),
                                                                                      new Func <SeasonTeamCardCache, double>(sp => Math.Round(sp.TeamRating, 2, MidpointRounding.AwayFromZero))));
        }
Beispiel #3
0
        private static void OnPlayerTopList(DiscordHandler client, CommandEventArg args, bool reverse = false)
        {
            int page = 1;

            if (args.Parameters.Count > 0 && int.TryParse(args.Parameters[0], out int p))
            {
                page = p;
            }

            page--;

            List <SeasonPlayerCardCache> players = GetPlayers(args.Guild).OrderByDescending(sp => sp.OverallRating).ToList();

            if (players.Count == 0)
            {
                client.SendSimpleEmbed(args.Channel, "Could not find any stats").ConfigureAwait(false);
                return;
            }
            else if (reverse)
            {
                players.Reverse();
            }

            args.Channel.SendMessageAsync(embed: GetListAsEmbed <SeasonPlayerCardCache>(players, page * 10, 10, "Players",
                                                                                        new Func <SeasonPlayerCardCache, string>(sp => sp.Username),
                                                                                        new Func <SeasonPlayerCardCache, double>(sp => sp.OverallRating)));
        }
Beispiel #4
0
        private void OnMatchCommand(DiscordHandler client, CommandEventArg args)
        {
            using DBContext c = new DBContext();
            long matchId = -1;

            //team a vs team b
            if (args.Parameters.Count > 1)
            {
                StringBuilder vsSb = new StringBuilder();

                for (int i = 0; i < args.Parameters.Count; i++)
                {
                    vsSb.Append(" " + args.Parameters[i]);
                }

                vsSb.Remove(0, 1);

                string matchName = vsSb.ToString();

                matchId = c.SeasonResult.FirstOrDefault(sr => sr.MatchName.Equals(matchName, StringComparison.CurrentCultureIgnoreCase) &&
                                                        sr.DiscordGuildId == (long)args.Guild.Id)?.Id ?? -1;
            }
            else //matchid
            {
                if (!int.TryParse(args.Parameters[0], out int mid))
                {
                    HelpCommand.ShowHelp(args.Channel, this);
                    return;
                }

                matchId = mid;

                if (!c.SeasonResult.Any(sr => sr.MatchId == matchId &&
                                        sr.DiscordGuildId == (long)args.Guild.Id))
                {
                    client.SendSimpleEmbed(args.Channel, "Could not find match " + matchId).ConfigureAwait(false);
                    return;
                }
            }

            DiscordEmbed embed = GetMatchEmbedFromDB((int)matchId);

            if (embed == null)
            {
                DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
                {
                    Title       = "Could not find match ",
                    Description = Resources.InvisibleCharacter
                };

                embed = builder.Build();
            }

            args.Channel.SendMessageAsync(embed: embed);
        }
Beispiel #5
0
        public void SendEmbed(ulong channel, string title, string description)
        {
            var dchannel = _discord.GetChannelAsync(_guildId, channel).ConfigureAwait(false).GetAwaiter().GetResult();

            if (dchannel == null)
            {
                return;
            }

            _discord.SendSimpleEmbed(dchannel, title, description).ConfigureAwait(false);
        }
Beispiel #6
0
        private static void OnPlayerProfile(DiscordHandler client, CommandEventArg args)
        {
            try
            {
                using DBContext c        = new DBContext();
                (string, long)userParsed = TryParseIdOrUsernameString(args.Parameters);

                long osuUserId = -1;

                if (userParsed.Item1 != null)
                {
                    osuUserId = c.SeasonPlayer.FirstOrDefault(sp => sp.LastOsuUsername.Equals(userParsed.Item1, StringComparison.CurrentCultureIgnoreCase) &&
                                                              sp.DiscordGuildId == (long)args.Guild.Id).OsuUserId;
                }
                else if (userParsed.Item2 != -1)
                {
                    osuUserId = userParsed.Item2;
                }

                if (osuUserId == -1)
                {
                    client.SendSimpleEmbed(args.Channel, "Could not find player " + osuUserId).ConfigureAwait(false);
                    return;
                }

                SeasonPlayerCardCache spcc = GetPlayer(args.Guild, osuUserId);

                if (spcc == null)
                {
                    client.SendSimpleEmbed(args.Channel, "Could not find player " + osuUserId).ConfigureAwait(false);
                    return;
                }

                args.Channel.SendMessageAsync(embed: GetPlayerEmbed(spcc.Username, spcc.TeamName, spcc.OsuUserId, spcc.AverageAccuracy, (int)spcc.AverageScore, spcc.AverageMisses, (int)spcc.AverageCombo, spcc.AveragePerformance, spcc.MatchMvps, spcc.OverallRating));
            }
            catch (Exception)
            {
                client.SendSimpleEmbed(args.Channel, "Profile not found").ConfigureAwait(false);
            }
        }
Beispiel #7
0
        private static void OnTeamProfile(DiscordHandler client, CommandEventArg args)
        {
            (string, long)userParsed = TryParseIdOrUsernameString(args.Parameters);

            string teamName = userParsed.Item1;

            SeasonTeamCardCache stcc = GetTeam(args.Guild, teamName);

            if (stcc == null)
            {
                client.SendSimpleEmbed(args.Channel, "Could not find team " + teamName).ConfigureAwait(false);
                return;
            }

            args.Channel.SendMessageAsync(embed: GetTeamEmbed(stcc.TeamName, stcc.AverageAccuracy, (int)stcc.AverageScore, stcc.AverageMisses, (int)stcc.AverageCombo, stcc.AverageGeneralPerformanceScore, stcc.TotalMatchMVPs, stcc.AverageOverallRating, stcc.TeamRating, stcc.MVPName));
        }
Beispiel #8
0
        private static void EditEmbed(DiscordHandler client, CommandEventArg args, DiscordEmbed embed, string content, ulong channelId, ulong messageId, DiscordGuild guild)
        {
            DiscordChannel channel;
            DiscordMessage message;

            try
            {
                channel = guild.GetChannel(channelId);
                message = channel.GetMessageAsync(messageId).ConfigureAwait(false).GetAwaiter().GetResult();
            }
            catch (DSharpPlus.Exceptions.NotFoundException)
            {
                throw new ReadableCmdException("Could not find the discord channel");
            }

            message.ModifyAsync(string.IsNullOrEmpty(content) ? default : content, embed).ConfigureAwait(false).GetAwaiter().GetResult();

            client.SendSimpleEmbed(args.Channel, "Embed modified").ConfigureAwait(false);
        }
Beispiel #9
0
        public void Invoke(DiscordHandler client, CommandHandler handler, CommandEventArg args)
        {
            if (!int.TryParse(args.Parameters[0], out int rank))
            {
                HelpCommand.ShowHelp(args.Channel, this, $"Could not parse the rank {args.Parameters[0]}");
                return;
            }

            if (!int.TryParse(args.Parameters[1], out int badgeCount))
            {
                HelpCommand.ShowHelp(args.Channel, this, $"Could not parse the badge count {args.Parameters[1]}");
                return;
            }

            if (args.Parameters.Count >= 3 && args.Parameters[2].Equals("test", StringComparison.CurrentCultureIgnoreCase))
            {
                return;
            }

            client.SendSimpleEmbed(args.Channel, "BWS Rank", GSStatisticHandler.CalculateBWS(rank, badgeCount).ToString()).ConfigureAwait(false);
        }
Beispiel #10
0
        /// <summary>
        /// Sends an embed to a specific channel
        /// </summary>
        /// <param name="content">message content</param>
        /// <param name="webhook">Use webhook or message</param>
        /// <param name="webhookUser">Webhook username</param>
        private static void SendEmbed(DiscordHandler client, ICommand cmd, CommandEventArg args, DiscordEmbed embed, string content, ulong channelId, DiscordGuild guild, bool webhook, string webhookUser, string webhookAvatar = null)
        {
            DiscordChannel channel;

            try
            {
                channel = guild.GetChannel(channelId);
            }
            catch (DSharpPlus.Exceptions.NotFoundException)
            {
                throw new ReadableCmdException("Could not find the discord channel");
            }

            //TODO: make it so webhook and default can both send up to 5 embeds max at once

            if (webhook)
            {
                try
                {
                    using (WebHookHandler whh = new WebHookHandler(channel, webhookUser, webhookAvatar))
                    {
                        whh.SendEmbed(content, new DiscordEmbed[] { embed }).ConfigureAwait(false).GetAwaiter().GetResult();
                    }
                }
                catch (UriFormatException)
                {
                    HelpCommand.ShowHelp(args.Channel, cmd, "Invalid link");
                    return;
                }
            }
            else
            {
                channel.SendMessageAsync(content: content, embed: embed).ConfigureAwait(false).GetAwaiter().GetResult();
            }

            client.SendSimpleEmbed(args.Channel, "Sent Embed").ConfigureAwait(false);
        }
Beispiel #11
0
        public void Invoke(DiscordHandler client, CommandHandler handler, CommandEventArg args)
        {
            if (args.Parameters[0].Equals("list", StringComparison.CurrentCultureIgnoreCase))
            {
                int page = 1;

                if (args.Parameters.Count > 1 && int.TryParse(args.Parameters[1], out int newPage))
                {
                    page = newPage;
                }

                using DBContext c = new DBContext();

                List <DiscordRoleBind> drbs = c.DiscordRoleBind.Where(drb => drb.GuildId == (long)args.Guild.Id).ToList();

                if (drbs.Count == 0)
                {
                    client.SendSimpleEmbed(args.Channel, "Could not find any role binds").ConfigureAwait(false);
                    return;
                }

                StringBuilder roleIdBuilder = new StringBuilder();
                StringBuilder accessBuilder = new StringBuilder();

                for (int i = 0; i < drbs.Count; i++)
                {
                    roleIdBuilder.AppendLine(((ulong)drbs[i].RoleId).ToString(CultureInfo.CurrentCulture));
                    accessBuilder.AppendLine(drbs[i].AccessLevel.ToString(CultureInfo.CurrentCulture));
                }

                EmbedPageBuilder epb = new EmbedPageBuilder(2);
                epb.AddColumn("RoleId", roleIdBuilder.ToString());
                epb.AddColumn("Access Level", accessBuilder.ToString());

                args.Channel.SendMessageAsync(embed: epb.BuildPage(page));
                return;
            }
            else if (args.Parameters.Count < 2)
            {
                HelpCommand.ShowHelp(args.Channel, this, ResourceExceptions.NotEnoughParameters);
                return;
            }

            if (!ulong.TryParse(args.Parameters[1], out ulong roleId))
            {
                HelpCommand.ShowHelp(args.Channel, this, string.Format(CultureInfo.CurrentCulture, ResourceExceptions.FailedParseException, args.Parameters[1]));
                return;
            }
            else if (args.Guild.GetRole(roleId) == null)
            {
                HelpCommand.ShowHelp(args.Channel, this, $"Discord Role {args.Parameters[1]} not found!");
                return;
            }

            AccessLevel?access = null;

            if (args.Parameters.Count > 2)
            {
                if (args.Parameters[2].TryParseEnum(out AccessLevel acc))
                {
                    access = acc;
                }
                else
                {
                    HelpCommand.ShowHelp(args.Channel, this, $"Access Level {args.Parameters[2]} not found!");
                    return;
                }

                if (access.HasValue)
                {
                    switch (access.Value)
                    {
                    case AccessLevel.Dev:
                        args.Channel.SendMessageAsync("You do not have enough permissions");
                        return;

                    case AccessLevel.Admin:
                    case AccessLevel.Host:
                        if (args.AccessLevel < AccessLevel.Host)
                        {
                            args.Channel.SendMessageAsync("You do not have enough permissions");
                            return;
                        }
                        break;
                    }
                }
            }


            switch (args.Parameters[0].ToLower(CultureInfo.CurrentCulture))
            {
            case "bind":
                if (!access.HasValue)
                {
                    HelpCommand.ShowHelp(args.Channel, this, $"Access Level {args.Parameters[2]} not found!");
                    return;
                }

                if (CommandHandler.BindPermssion(args.Guild, roleId, access.Value))
                {
                    args.Channel.SendMessageAsync("Binded permission");
                }
                else
                {
                    args.Channel.SendMessageAsync("Already binded or failed to bind");
                }

                break;

            case "unbind":
                if (CommandHandler.UnbindPermission(args.Guild, roleId, access))
                {
                    args.Channel.SendMessageAsync("Unbinded permission");
                }
                else
                {
                    args.Channel.SendMessageAsync("Already unbinded or failed to unbind");
                }
                break;
            }
        }