예제 #1
0
        public async Task <RuntimeResult> Help()
        {
            IEnumerable <ModuleInfo> modules = Store.Get <IEnumerable <ModuleInfo> >();

            Embed embed = EmbedFactory.Create(builder =>
            {
                builder.WithColor(Color.Purple);
                builder.WithTitle("Help ");
                builder.WithDescription($"Commands are separated per module. To get all the commands in a module, use {Prefix}Help moduleName");

                foreach (var module in modules)
                {
                    if (module.Name == nameof(Module))
                    {
                        continue;
                    }

                    string remarks = string.IsNullOrEmpty(module.Remarks) ? string.Empty : $"({module.Remarks})";

                    builder.AddField(module.Name.Replace("Module", string.Empty), $"{(!string.IsNullOrEmpty(module.Summary) ? module.Summary : "No summary available")}\n{remarks}");
                }
            });

            return(new SuccessResult(embed));
        }
예제 #2
0
        public async Task OsuUser(
            [Name("Username")] string name   = "",
            [Name("Game mode")] int?gameMode = null
            )
        {
            if (name == "")
            {
                var query = _context.OsuUsers.FirstOrDefault(u => u.DiscordId == Context.User.Id);

                if (query is null)
                {
                    await ReplyAsync("User not registered");

                    return;
                }

                gameMode ??= query.DefaultGameMode;
                name = query.OsuUsername;
            }

            gameMode ??= 0;
            var user = await _client.GetUserByUsernameAsync(name, (GameMode)gameMode);

            await ReplyAsync(embed : EmbedFactory.OsuProfile(user));
        }
예제 #3
0
        public async Task AddDealAsync(string url, string timeLeft = null)
        {
            IEnumerable <IMessage> messages = await(Context.Channel as ITextChannel)?.GetMessagesAsync(1)?.FlattenAsync();

            await(Context.Channel as ITextChannel)?.DeleteMessagesAsync(messages);
            IUserMessage reply = await ReplyAsync("Adding your deal...");

            Deal deal = new Deal
            {
                Url  = url,
                User = User
            };

            if (timeLeft != null)
            {
                TimeSpan.TryParse(timeLeft, out TimeSpan expires);
                deal.ExpireDate = DateTime.Now.Add(expires);
            }

            Embed embed = EmbedFactory.Create(ResultType.Success, builder => {
                builder.WithTitle((messages.First() as IUserMessage).Content);
            });

            IUserMessage message = await ReplyAsync(embed);

            deal.MessageId = message.Id;

            Database.Deals.Add(deal);
        }
예제 #4
0
        public async Task <RuntimeResult> ListJokesAsync(SocketGuildUser user = null)
        {
            List <Joke> jokesList;

            if (user is null)
            {
                jokesList = await Database.Jokes
                            .OrderBy(x => Guid.NewGuid())
                            .Take(10)
                            .ToListAsync();
            }
            else
            {
                jokesList = await Database.Jokes
                            .Where(x => x.User.Id == user.Id)
                            .OrderBy(x => Guid.NewGuid())
                            .Take(10)
                            .ToListAsync();
            }

            if (jokesList.Count is 0)
            {
                return(new ErrorResult(CommandError.ObjectNotFound, "No jokes in the database"));
            }

            Embed embed = EmbedFactory.Create(ResultType.Info, builder => {
                builder.WithTitle("Here's the list of jokes");
                foreach (Joke joke in jokesList)
                {
                    builder.AddField($"{joke.Id} - {joke.Text}", $"Submitted by {joke.User.Username}");
                }
            });

            return(new InfoResult(embed));
        }
예제 #5
0
        public async Task <RuntimeResult> ShowJokeAsync(SocketGuildUser user = null)
        {
            Joke joke;

            if (user is null)
            {
                joke = await Database.Jokes
                       .OrderBy(x => Guid.NewGuid())
                       .FirstOrDefaultAsync();
            }
            else
            {
                joke = await Database.Jokes
                       .Where(x => x.User.Id == user.Id)
                       .OrderBy(x => Guid.NewGuid())
                       .FirstOrDefaultAsync();
            }

            if (joke is null)
            {
                return(new ErrorResult(CommandError.ObjectNotFound, "No jokes in the database"));
            }

            Embed embed = EmbedFactory.Create(ResultType.Info, builder => {
                builder.WithTitle($"{joke.Id} - {joke.Text}");
                builder.WithFooter($"Submitted by {joke.User.Username}", joke.User.AvatarUrl);
            });

            return(new InfoResult(embed));
        }
예제 #6
0
        public async Task <RuntimeResult> ListAlertsAsync()
        {
            List <Alert> alertList = await Database.Alerts
                                     .Where(x => x.User.Id == User.Id)
                                     .Include(x => x.User)
                                     .Include(x => x.TargetUser)
                                     .ToListAsync();

            if (alertList.Count is 0)
            {
                return(new ErrorResult("No alerts were found"));
            }

            Embed embed = EmbedFactory.Create(ResultType.Success, builder => {
                string description = "";
                foreach (Alert alert in alertList)
                {
                    description += $"Alert for **{alert.TargetUser.Username}**\n";
                }

                builder.WithDescription(description);
            });

            return(new SuccessResult(embed));
        }
예제 #7
0
        public async Task SetLanguage(string language)
        {
            var eb = new EmbedBuilder();
            var ts = await TranslationManager.CreateFor(Context.Channel);

            eb.Title = ts.GetMessage("commands/language:embed_title");

            try
            {
                CultureInfo lang = new CultureInfo(language);
                if (!TranslationManager.HasLanguage(lang))
                {
                    // Please translate :)
                    eb = EmbedFactory.CreateError()
                         .WithTitle(ts.GetMessage("commands/language:embed_title"))
                         .WithDescription(MessageFormatter.Format(ts.GetMessage("commands/language:error_language_not_found"), lang.TwoLetterISOLanguageName));
                }
                else
                {
                    eb.Color       = EmbedFactory.Success;
                    eb.Description = MessageFormatter.Format(ts.GetMessage("commands/language:language_set_message"), lang.TwoLetterISOLanguageName);
                    await TranslationManager.SetLanguageAsync(TranslationManager.GetId(Context.Channel), lang);
                }
            }
            catch (CultureNotFoundException)
            {
                eb.Description = ts.GetMessage("commands/language:error_unknown_language");
                eb.Color       = EmbedFactory.Error;
            }
            await ReplyAsync(embed : eb.Build());
        }
예제 #8
0
        public async Task <RuntimeResult> ShowRandomMemeAsync()
        {
            string meme = string.Format("http://images.memes.com/meme/{0}.jpg", new Random().Next(33000));

            Embed embed = EmbedFactory.Create(ResultType.Info, builder => {
                builder.WithTitle(meme);
                builder.WithImageUrl(meme);
            });

            return(new SuccessResult(embed));
        }
예제 #9
0
        public async Task <RuntimeResult> Reply(SocketGuildUser userToReplyTo, int prevMessageIndex, [Remainder] string reply)
        {
            if (prevMessageIndex < 1)
            {
                return(new ErrorResult("The number telling me which message you want to reply to, must be at least 1!"));
            }

            const int messageLogLength          = 20;
            IEnumerable <IMessage> lastMessages = await Context.Channel.GetMessagesAsync(messageLogLength).FlattenAsync();

            IEnumerable <IMessage> enumerable = lastMessages as IMessage[] ?? lastMessages.ToArray();

            if (enumerable.Count() < prevMessageIndex)
            {
                return(new ErrorResult(EmbedFactory.Create(x =>
                {
                    x.CreateError($"There are less than {prevMessageIndex} messages in this channel, let alone from {userToReplyTo.Username}... Please reconsider the command!");
                })));
            }

            if (enumerable.First(x => x.Author == userToReplyTo) is null)
            {
                return(new ErrorResult(EmbedFactory.Create(x =>
                {
                    x.CreateError($"{userToReplyTo.Username} hasn't sent a message in the last {messageLogLength} messages.");
                })));
            }

            if (enumerable.Count(x => x.Author == userToReplyTo) < prevMessageIndex)
            {
                return(new ErrorResult(EmbedFactory.Create(x =>
                {
                    x.CreateError($"{userToReplyTo.Username} hasn't sent {prevMessageIndex} messages in the last {messageLogLength} messages.");
                })));
            }

            var messageToReplyTo = enumerable.Where(x => x.Author == userToReplyTo).ToArray()[prevMessageIndex - (userToReplyTo == Context.User ? 0 : 1)];

            if (messageToReplyTo.Attachments.Count > 0 || messageToReplyTo.Embeds.Count > 0)
            {
                return(new ErrorResult(EmbedFactory.Create(x =>
                {
                    x.CreateError("Sadly, I'm unable to handle replying to messages containing attachments or embeds... sorry 😕");
                })));
            }

            return(new InfoResult(EmbedFactory.Create(x =>
            {
                x.WithColor(Color.Purple);
                x.WithDescription(userToReplyTo.Mention);
                x.AddField("Original:", messageToReplyTo.Content);
                x.AddField("Reply:", reply);
            })));
        }
예제 #10
0
        private async Task ProcessCommandAsync(SocketMessage arg)
        {
            // Source filter
            if (arg.Source != MessageSource.User)
            {
                return;
            }
            var message = (SocketUserMessage)arg;

            // Get the prefix
            string pfx;

            try
            {
                pfx = await GetPrefix(arg);
            }
            catch (Exception e)
            {
                string src = message.Channel is IGuildChannel gc ? $"{gc.Guild.Name} ({gc.Guild.Id})" : $"{message.Channel.Name}";
                Logger.GetLogger("Commands").Warning($"Failed to get prefix. {src}", e);
                return;
            }

            // Command check
            int argPos = 0;

            if (message.HasStringPrefix(pfx, ref argPos))
            {
                // Refresh the cached prefix
                if (message.Channel is IGuildChannel c)
                {
                    pm.RestoreCache(c.GuildId).Release();
                }
                var context = new SocketCommandContext(client, message);
                // Log message for debugging (doesn't check if the command exists)
                Logger.GetLogger("Commands").Debug($"Executing command: {GetExecutionInfo(context)}");
                // Execute command
                await commands.ExecuteAsync(context, argPos, services);
            }
            else if (message.Content.TrimEnd() == $"{pm.DefaultPrefix}prefix")
            {
                // Info
                var context = new SocketCommandContext(client, message);
                Logger.GetLogger("Commands").Debug($"Executing prefix get with default prefix: {GetExecutionInfo(context)}");
                var ts = await TranslationManager.CreateFor(context.Channel);

                message.Channel.SendMessageAsync(embed: EmbedFactory.CreateSuccess()
                                                 .WithTitle(ts.GetMessage("commands/prefix:embed_title"))
                                                 .WithDescription(MessageFormatter.Format(ts.GetMessage("commands/prefix:my_prefix_is"),
                                                                                          PrefixManagerService.PrettyPrefix(pfx)))
                                                 .Build()).Release();
            }
        }
예제 #11
0
        public async Task <RuntimeResult> ShowDefaultAuditChannelAsync()
        {
            SocketTextChannel channel = Context.Client.GetChannel(Guild.AuditChannelId) as SocketTextChannel;

            if (channel is null)
            {
                return(new ErrorResult(CommandError.UnmetPrecondition, "No default audit channel set for this guild"));
            }

            Embed embed = EmbedFactory.Create(ResultType.Info, builder => {
                builder.WithTitle("Here's the audit channel");
                builder.WithDescription(channel.Mention);
            });

            return(new InfoResult(embed));
        }
예제 #12
0
        public async Task ResetPrefix()
        {
            // Prepare reply
            var ts = await TranslationManager.CreateFor(Context.Channel);

            var eb = EmbedFactory.CreateSuccess()
                     .WithTitle(ts.GetMessage("commands/prefix:embed_title"));

            var messageSend = ReplyAsync(embed: eb.Build());

            await pm.CachePrefix(Context.Guild.Id, pm.DefaultPrefix);

            await pm.SetPrefixAsync(Context.Guild.Id, pm.DefaultPrefix);

            await messageSend;
        }
예제 #13
0
        public async Task Info()
        {
            Embed embed = EmbedFactory.Create(x =>
            {
                x.WithColor(Color.Purple);
                x.ThumbnailUrl = Guild.IconUrl;
                x.AddField("Server Name", Guild.Name ?? "null");

                if (Guild.AuditChannelId != null)
                {
                    SocketTextChannel auditChannel = (SocketTextChannel)Context.Guild.GetChannel(Guild.AuditChannelId.Value);
                    x.AddField("Audit Channel", auditChannel != null ? auditChannel.Mention : "Invalid channel!");
                }

                x.AddField("Command prefix", Prefix);
            });

            await ReplyAsync(embed);
        }
예제 #14
0
        public async Task CreatePollAsync([Remainder] string question)
        {
            IEnumerable <IMessage> messages = await Context.Channel.GetMessagesAsync(1).FlattenAsync();

            await(Context.Channel as ITextChannel).DeleteMessagesAsync(messages);

            Embed embed = EmbedFactory.Create(ResultType.Info, builder => {
                builder.WithTitle(question);
                builder.WithFooter($"Asked by {Context.User.Username}", Context.User.GetAvatarUrl() ?? null);
            });

            IUserMessage message = await ReplyAsync(embed);

            foreach (Emoji reaction in _reactions)
            {
                await message.AddReactionAsync(reaction);

                await Task.Delay(250);
            }
        }
예제 #15
0
        public async Task Help([Name("(Optional) Command name")] string commandName = "")
        {
            if (commandName == "")
            {
                await ReplyAsync(embed : EmbedFactory.ListCommands(_commands.Modules));

                return;
            }

            var command = _commands.Commands.FirstOrDefault(c => c.Name == commandName);

            if (command is null)
            {
                await ReplyAsync("Command not found");

                return;
            }

            await ReplyAsync(embed : EmbedFactory.CommandInfo(command));
        }
예제 #16
0
        public async Task <RuntimeResult> ListRemindersAsync()
        {
            List <Reminder> reminderList = await Database.Reminders
                                           .Where(x => x.User.Id == User.Id)
                                           .ToListAsync();

            if (reminderList.Count is 0)
            {
                return(new ErrorResult(CommandError.ObjectNotFound, "No reminders in the database"));
            }

            Embed embed = EmbedFactory.Create(ResultType.Info, builder => {
                builder.WithTitle("Here's your reminders");
                foreach (Reminder reminder in reminderList)
                {
                    builder.AddField($"{reminder.Id} - {reminder.Message ?? "No message"}", $"{reminder.DueDate}");
                }
            });

            return(new InfoResult(embed));
        }
예제 #17
0
        public async Task <RuntimeResult> ShowDealsAsync()
        {
            List <Deal> dealList = await Database.Deals
                                   .ToListAsync();

            if (dealList.Count is 0)
            {
                return(new ErrorResult(CommandError.ObjectNotFound, "No deals were found"));
            }

            Embed embed = EmbedFactory.Create(ResultType.Success, builder => {
                builder.WithTitle("Here's the deals");

                foreach (Deal deal in dealList)
                {
                    builder.AddField($"{deal.Url}", $"{deal.ExpireDate}");
                }
            });

            return(new SuccessResult("Success", embed));
        }
예제 #18
0
        public async Task League([Name("Summoner name")] string name = "", [Name("Region")] string region = "")
        {
            if (name == "")
            {
                var query = _context.LeagueSummoners.SingleOrDefault(u => u.DiscordId == Context.User.Id);

                if (query is null)
                {
                    await ReplyAsync("User not registered");

                    return;
                }

                name = query.SummonerName;
            }

            var summoner     = _api.SummonerV4.GetBySummonerName(Region.Get(region), name);
            var topChampions = await _api.ChampionMasteryV4.GetAllChampionMasteriesAsync(
                Region.Get(region), summoner.Id);

            await ReplyAsync(embed : EmbedFactory.LeagueProfile(summoner, topChampions));
        }
예제 #19
0
        public async Task <Embed> HelpAsync(ICommandContext context, string query, SearchContext searchContext)
        {
            if (context is null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            if (query is null)
            {
                throw new ArgumentNullException(nameof(query));
            }

            var commands = (await SearchCommands(context, query, searchContext)).ToList();

            if (commands.Count == 0)
            {
                var ts = await TranslationManager.CreateFor(context.Channel);

                return(EmbedFactory.CreateNeutral()
                       .WithTitle(ts.GetMessage("help:embed_title"))
                       .WithDescription(ts.GetMessage("help:command_not_found"))
                       .Build());
            }

            // NOTE: This system breaks when there are two commands with the same alias. Avoid using same aliases
            if (commands.Count > 1)
            {
                var ts = await TranslationManager.CreateFor(context.Channel);

                return(EmbedFactory.CreateNeutral()
                       .WithTitle(ts.GetMessage("help:embed_title"))
                       .WithDescription($"{ts.GetMessage("help:multiple_matches")}\n{String.Join("\n", commands.Select(x => Format.Code(x.GetUsage())))}")
                       .Build());
            }
            else
            {
                return(await commands[0].CreateHelpEmbedAsync(context));
            }
        }
예제 #20
0
        public async Task LeagueHistory([Name("Summoner name")] string summonerName = "", [Name("Region")] string region = "")
        {
            var summonerRegion = Region.Get(region);
            var summoner       = await _api.SummonerV4.GetBySummonerNameAsync(summonerRegion, summonerName);

            if (summoner is null)
            {
                await ReplyAsync("User not found");

                return;
            }
            var matchList = await _api.MatchV4.GetMatchlistAsync(
                summonerRegion,
                summoner.AccountId,
                endIndex : 10);

            var matchTasks = matchList.Matches.Select(
                matchData => _api.MatchV4.GetMatchAsync(summonerRegion, matchData.GameId)
                ).ToArray();
            var history = await Task.WhenAll(matchTasks);

            await ReplyAsync(embed : EmbedFactory.LeagueHistory(summoner, history));
        }
예제 #21
0
        public async Task <RuntimeResult> ListAllGamesAsync()
        {
            List <Domain.Game> gamesList = await Database.Games
                                           .ToListAsync();

            if (gamesList.Count is 0)
            {
                return(new ErrorResult(CommandError.ObjectNotFound, "No games found in the database"));
            }

            Embed embed = EmbedFactory.Create(ResultType.Info, builder => {
                builder.WithTitle("Here are the currently registered game servers");
                builder.WithCurrentTimestamp();

                foreach (Domain.Game game in gamesList)
                {
                    string st = game.IsOnline ? "Online " : "Offline ";
                    builder.AddField(game.Name, st + $"on port {game.Port}, version {game.Version}");
                }
            });

            return(new InfoResult("Info", embed));
        }
        /// <summary>
        /// Attempts to post a new announcement
        /// </summary>
        /// <param name="discordService">The discord service</param>
        /// <param name="tracker">The tracker</param>
        /// <param name="race">The race</param>
        /// <returns>On Success, returns the announcement</returns>
        private static async Task <Announcement?> PostAnnouncementAsync(DiscordService discordService, Tracker tracker, Race race, List <Entrant> entrants)
        {
            Logger.Info($"({race.SrlId}) Posting announcement in channel {tracker.ChannelId}: {tracker.Channel.Guild.DisplayName}/{tracker.Channel.DisplayName}.");

            try
            {
                RestUserMessage?message = await discordService
                                          .SendEmbedAsync(tracker.Channel.Snowflake, EmbedFactory.Build(race, entrants)).ConfigureAwait(false);

                if (message != null)
                {
                    return(new Announcement(tracker.Channel, tracker, race, message.Id)
                    {
                        MessageCreatedAt = DateTime.UtcNow
                    });
                }
            }
            catch (Exception ex)
            {
                Logger.Error($"({race.SrlId}) Exception thrown", ex);
            }

            return(null);
        }
        /// <summary>
        /// Attempts to update an existing announcement
        /// </summary>
        /// <param name="discordService">The discord service</param>
        /// <param name="announcement">The target announcement</param>
        private static async Task UpdateAnnouncementAsync(DiscordService discordService, Announcement announcement, List <Entrant> entrants)
        {
            Logger.Info($"({announcement.Race.SrlId}) Updating announcement {announcement.Snowflake} in channel {announcement.ChannelId}: {announcement.Channel.Guild.DisplayName}/{announcement.Channel.DisplayName}.");

            RestUserMessage?message = await discordService.FindMessageAsync(announcement.Channel, announcement.Snowflake).ConfigureAwait(false);

            if (message != null)
            {
                try
                {
                    await discordService.ModifyMessageAsync(message, EmbedFactory.Build(announcement.Race, entrants)).ConfigureAwait(false);

                    announcement.MessageUpdatedAt = DateTime.UtcNow;
                }
                catch (Exception ex)
                {
                    Logger.Error($"({announcement.Race.SrlId}) Exception thrown", ex);
                }
            }
            else
            {
                Logger.Info($"({announcement.Race.SrlId}) Failed to fetch message {announcement.Snowflake} in channel {announcement.ChannelId}: {announcement.Channel.Guild.DisplayName}/{announcement.Channel.DisplayName}.");
            }
        }
예제 #24
0
        public async Task <RuntimeResult> ShowActivitiesAsync()
        {
            List <Domain.Activity> activityList = await Database.Activities
                                                  .Where(x => x.User.Id == User.Id)
                                                  .ToListAsync();

            if (activityList.Count is 0)
            {
                return(new ErrorResult(CommandError.ObjectNotFound, "No activities were found"));
            }

            Embed embed = EmbedFactory.Create(ResultType.Success, builder => {
                foreach (Domain.Activity activity in activityList)
                {
                    builder.AddField(field => {
                        field.WithName(activity.Name);
                        field.WithValue(activity.Arguments);
                        field.WithIsInline(false);
                    });
                }
            });

            return(new SuccessResult(embed));
        }
예제 #25
0
        public async Task <RuntimeResult> Reply(ulong messageId, [Remainder] string reply)
        {
            if (!(Context.Channel is ITextChannel currentChannel))
            {
                return(new ErrorResult(EmbedFactory.Create(x =>
                {
                    x.CreateError("Sorry, was unable to cast the current channel to ITextChannel");
                })));
            }

            IMessage message = await currentChannel.GetMessageAsync(messageId);

            if (message is null)
            {
                return(new ErrorResult(EmbedFactory.Create(x =>
                {
                    x.CreateError("Sorry, was unable to find the requested message");
                })));
            }

            if (message.Attachments.Count > 0 || message.Embeds.Count > 0)
            {
                return(new ErrorResult(EmbedFactory.Create(x =>
                {
                    x.CreateError("Sadly, I'm unable to handle replying to messages containing attachments or embeds... sorry 😕");
                })));
            }

            return(new InfoResult(EmbedFactory.Create(x =>
            {
                x.WithColor(Color.Purple);
                x.WithDescription(message.Author.Mention);
                x.AddField("Original: ", message.Content);
                x.AddField("Reply: ", reply);
            })));
        }
예제 #26
0
 public async Task BotInfo()
 => await Context.Channel.SendMessageAsync(embed : EmbedFactory.About(Context));
예제 #27
0
 public async Task Avatar()
 => await Context.Channel.SendMessageAsync(embed : EmbedFactory.Avatar(Context));
예제 #28
0
 public CommandErrorHandler(EmbedFactory embedFactory)
 {
     _embedFactory = embedFactory;
 }
예제 #29
0
        public async Task Prefix([Summary("commands/prefix:parameter_prefix")][Remainder] string prefix = null)
        {
            // Prepare reply
            EmbedBuilder eb;
            var          reply = new StringBuilder();
            var          ts    = await TranslationManager.CreateFor(Context.Channel);

            // Get the prefix
            if (prefix is null)
            {
                // Get prefix
                var prefixGet = pm.GetPrefixAsync(Context.Guild?.Id);

                // Prepare message
                eb = EmbedFactory.CreateSuccess()
                     .WithTitle(ts.GetMessage("commands/prefix:embed_title"));

                // Send a message
                reply.AppendLine(MessageFormatter.Format(ts.GetMessage("commands/prefix:my_prefix_is"), PrefixManagerService.PrettyPrefix(await prefixGet)));
                if (Context.IsPrivate)
                {
                    reply.AppendLine(ts.GetMessage("commands/prefix:error_private_messages"));
                }
                eb.Description = reply.ToString();
                await ReplyAsync(embed : eb.Build());

                // Return!
                return;
            }

            // Check if in guild
            if (Context.Guild is null)
            {
                // No
                eb = EmbedFactory.CreateError()
                     .WithTitle(ts.GetMessage("errors:permission_denied"));
                reply.AppendLine(ts.GetMessage("commands/prefix:error_private_messages"));
            }
            else
            {
                // In guild
                string currentPrefix = await pm.GetPrefixAsync(Context.Guild.Id);

                if (currentPrefix == prefix)
                {
                    eb = EmbedFactory.CreateError()
                         .WithTitle(ts.GetMessage("errors:permission_denied"));
                    reply.AppendLine(ts.GetMessage("commands/prefix:error_same_prefix"));
                }
                else
                {
                    if (!Regex.IsMatch(prefix, @"[A-Za-zÅÖÄåöä0-9!?+\/%$#]*"))
                    {
                        eb = EmbedFactory.CreateError()
                             .WithTitle(ts.GetMessage("commands/prefix:embed_title"))
                             .WithDescription("commands/prefix:error_invalid_prefix");
                        await ReplyAsync(embed : eb.Build());

                        return;
                    }

                    // Update the prefix cache
                    await pm.CachePrefix(Context.Guild.Id, prefix);

                    // Send the info message here for seemingly better performance. The prefix is cached in Redis so it will still work.
                    eb = EmbedFactory.CreateSuccess()
                         .WithTitle(ts.GetMessage("commands/prefix:embed_title"));
                    reply.AppendLine(MessageFormatter.Format(ts.GetMessage("commands/prefix:prefix_set_message"),
                                                             PrefixManagerService.PrettyPrefix(prefix)));

                    // Send message
                    eb.Description = reply.ToString();
                    ReplyAsync(embed: eb.Build()).Release();

                    try
                    {
                        // Set prefix in the actual database.
                        await pm.SetPrefixAsync(Context.Guild.Id, prefix);
                    }
                    catch (Exception e)
                    {
                        // Log the error so that it can be debugged
                        var log = Logger.GetLogger(this);
                        log.Warning($"Failed to store prefix for guild {Context.Guild.Name} ({Context.Guild.Id}): pfx: {prefix} Exception:", e);
                    }
                    return;
                }
            }

            // Send message
            eb.Description = reply.ToString();
            await ReplyAsync(embed : eb.Build());
        }
예제 #30
0
파일: Music.cs 프로젝트: DraxCodes/Xylox
 public Music(IMusicService musicService, EmbedFactory embedFactory)
 {
     _musicService = musicService;
     _embedFactory = embedFactory;
 }