public LocalizedHelpFormatter(CommandContext ctx)
     : base(ctx)
 {
     this.lcs = ctx.Services.GetRequiredService <LocalizationService>();
     this.emb = new LocalizedEmbedBuilder(this.lcs, this.GuildId);
     this.emb.WithLocalizedFooter("h-footer", ctx.Client.CurrentUser.AvatarUrl);
 }
        public LocalizedEmbedBuilder AddToEmbed(LocalizedEmbedBuilder emb, MovieInfo info)
        {
            emb.WithTitle(info.Title);
            emb.WithDescription(info.Plot);
            emb.WithColor(DiscordColor.Yellow);
            emb.WithUrl(this.Service.GetUrl(info.IMDbId));

            emb.AddLocalizedTitleField("str-type", info.Type, inline: true, unknown: false);
            emb.AddLocalizedTitleField("str-year", info.Year, inline: true, unknown: false);
            emb.AddLocalizedTitleField("str-id", info.IMDbId, inline: true, unknown: false);
            emb.AddLocalizedTitleField("str-genre", info.Genre, inline: true, unknown: false);
            emb.AddLocalizedTitleField("str-rel-date", info.ReleaseDate, inline: true, unknown: false);
            emb.AddLocalizedField("str-score", "fmt-rating-imdb", inline: true, contentArgs: new[] { info.IMDbRating, info.IMDbVotes });
            emb.AddLocalizedTitleField("str-rating", info.Rated, inline: true, unknown: false);
            emb.AddLocalizedTitleField("str-duration", info.Duration, inline: true, unknown: false);
            emb.AddLocalizedTitleField("str-writer", info.Writer, inline: true, unknown: false);
            emb.AddLocalizedTitleField("str-director", info.Director, inline: true, unknown: false);
            emb.AddLocalizedTitleField("str-actors", info.Actors, inline: true, unknown: false);
            if (!string.IsNullOrWhiteSpace(info.Poster) && info.Poster != "N/A")
            {
                emb.WithThumbnail(info.Poster);
            }

            emb.WithLocalizedFooter("fmt-powered-by", null, "OMDb");
            return(emb);
        }
Exemple #3
0
        public static async Task <bool> SendFeedUpdateAsync(TheGodfatherBot shard, RssSubscription sub, SyndicationItem latest)
        {
            DiscordChannel?chn;

            try {
                chn = await shard.Client.GetShard(sub.GuildId).GetChannelAsync(sub.ChannelId);
            } catch (NotFoundException) {
                return(false);
            }

            if (chn is null)
            {
                return(false);
            }

            var emb = new LocalizedEmbedBuilder(shard.Services.GetRequiredService <LocalizationService>(), sub.GuildId);

            emb.WithTitle(latest.Title.Text);
            emb.WithUrl(sub.Feed.LastPostUrl);
            emb.WithColor(DiscordColor.Gold);
            emb.WithLocalizedTimestamp(latest.LastUpdatedTime > latest.PublishDate ? latest.LastUpdatedTime : latest.PublishDate);

            if (latest.Content is TextSyndicationContent content)
            {
                string?imageUrl = RedditService.GetImageUrl(content);
                if (imageUrl is { })
Exemple #4
0
        public async Task EvaluateAsync(CommandContext ctx,
                                        [RemainingText, Description("desc-code")] string code)
        {
            if (string.IsNullOrWhiteSpace(code))
            {
                throw new InvalidCommandUsageException(ctx, "cmd-err-cmd-add-cb");
            }

            DiscordMessage msg = await ctx.RespondWithLocalizedEmbedAsync(emb => {
                emb.WithLocalizedTitle("str-eval");
                emb.WithColor(this.ModuleColor);
            });

            Script <object>?snippet = CSharpCompilationService.Compile(code, out ImmutableArray <Diagnostic> diag, out Stopwatch compileTime);

            if (snippet is null)
            {
                await msg.DeleteAsync();

                throw new InvalidCommandUsageException(ctx, "cmd-err-cmd-add-cb");
            }

            var emb = new LocalizedEmbedBuilder(this.Localization, ctx.Guild?.Id);

            if (diag.Any(d => d.Severity == DiagnosticSeverity.Error))
            {
                emb.WithLocalizedTitle("str-eval-fail-compile");
                emb.WithLocalizedDescription("fmt-eval-fail-compile", compileTime.ElapsedMilliseconds, diag.Length);
                emb.WithColor(DiscordColor.Red);

                foreach (Diagnostic d in diag.Take(3))
                {
                    FileLinePositionSpan ls = d.Location.GetLineSpan();
                    emb.AddLocalizedTitleField("fmt-eval-err", Formatter.InlineCode(d.GetMessage()),
                                               titleArgs: new object[] { ls.StartLinePosition.Line, ls.StartLinePosition.Character }
                                               );
                }

                if (diag.Length > 3)
                {
                    emb.AddLocalizedField("str-eval-omit", "fmt-eval-omit", contentArgs: new object[] { diag.Length - 3 });
                }

                await UpdateOrRespondAsync();

                return;
            }

            Exception?           exc = null;
            ScriptState <object>?res = null;
            var runTime = Stopwatch.StartNew();

            try {
                res = await snippet.RunAsync(new EvaluationEnvironment(ctx));
            } catch (Exception e) {
                exc = e;
            }
            runTime.Stop();

            if (exc is { } || res is null)
Exemple #5
0
        public static async Task HandleAdded(PopUpNews popUpNews)
        {
            // Localize the embed description
            Dictionary <Language, string> localizedDescriptions = Localizer.LocalizeToAllLanguages("popup_news.description", Nintendo.SmashUltimate.Bcat.Container.LanguageOrder);

            // Create a new Dictionary for localized descriptions with the URL
            Dictionary <Language, string> localizedDescriptionsWithUrl = new Dictionary <Language, string>();

            // Loop over every localized description
            foreach (KeyValuePair <Language, string> pair in localizedDescriptions)
            {
                // Format the URL in the description
                localizedDescriptionsWithUrl.Add(pair.Key, string.Format(pair.Value, popUpNews.ContentText[pair.Key], $"https://smash.oatmealdome.me/popup_news/{popUpNews.Id}/{pair.Key.GetCode()}/"));
            }

            // Create localized Embeds
            Dictionary <Language, Embed> localizedEmbeds = new LocalizedEmbedBuilder(Nintendo.SmashUltimate.Bcat.Container.LanguageOrder)
                                                           .WithTitle(popUpNews.TitleText)
                                                           .WithDescription(localizedDescriptionsWithUrl)
                                                           .AddField("popup_news.start_time", Localizer.LocalizeDateTimeToAllLanguages(popUpNews.StartDateTime))
                                                           .AddField("popup_news.end_time", Localizer.LocalizeDateTimeToAllLanguages(popUpNews.EndDateTime))
                                                           .WithImageUrl($"https://cdn.oatmealdome.me/smash/popup_news/{popUpNews.Id}/image.jpg")
                                                           .Build();

            // Send the notifications
            await DiscordBot.SendNotificationAsync("**[News]**", localizedEmbeds);
        }
        private Task PrintGameAsync(LocalizationService lcs, DiscordMessage msg, Participant?toMove = null)
        {
            var sb = new StringBuilder();

            sb.AppendLine(Formatter.Bold($"{lcs.GetString(this.Channel.GuildId, "str-house")}: {this.HandValue(this.hand)}"));
            if (this.hand.Any())
            {
                sb.AppendJoin(" | ", this.hand).AppendLine();
            }
            else
            {
                sb.AppendLine(Emojis.Question).AppendLine();
            }

            foreach (Participant participant in this.participants)
            {
                sb.Append(participant.User.Mention).Append(": ");
                sb.AppendLine(Formatter.Bold(this.HandValue(participant.Hand).ToString()));
                sb.AppendJoin(" | ", participant.Hand);
                sb.AppendLine().AppendLine();
            }

            var emb = new LocalizedEmbedBuilder(lcs, this.Channel.GuildId);

            emb.WithLocalizedTitle("fmt-casino-blackjack", Emojis.Cards.Suits[0], Emojis.Cards.Suits[0]);
            emb.WithColor(DiscordColor.DarkGreen);
            emb.WithDescription(sb);

            if (!this.gameOver)
            {
                emb.AddLocalizedTitleField("str-casino-blackjack-hit", toMove?.User.Mention ?? lcs.GetString(this.Channel.GuildId, "str-house"));
            }

            return(msg.ModifyAsync(embed: emb.Build()));
        }
Exemple #7
0
        public static async Task HandleAdded(LineNews lineNews)
        {
            // Localize the embed title
            Dictionary <Language, string> localizedTitles = Localizer.LocalizeToAllLanguagesWithFormat("line_news.title", Nintendo.SmashUltimate.Bcat.Container.LanguageOrder, lineNews.Id);

            // Localize the embed description
            // Dictionary<Language, string> localizedDescriptions = Localizer.LocalizeToAllLanguages("line_news.more_info", $"https://smash.oatmealdome.me/line_news/{lineNews.Id}/{pair.Key.GetCode()}/");

            // Create localized Embeds
            LocalizedEmbedBuilder localizedEmbedBuilder = new LocalizedEmbedBuilder(Nintendo.SmashUltimate.Bcat.Container.LanguageOrder)
                                                          .WithTitle(localizedTitles)
                                                          //.WithDescription(localizedDescriptions)
                                                          .AddField("line_news.start_time", Localizer.LocalizeDateTimeToAllLanguages(lineNews.StartDateTime))
                                                          .AddField("line_news.end_time", Localizer.LocalizeDateTimeToAllLanguages(lineNews.EndDateTime));

            // Add every OneLine
            foreach (OneLine oneLine in lineNews.OneLines)
            {
                localizedEmbedBuilder.AddField(Localizer.LocalizeToAllLanguagesWithFormat("line_news.line_title", oneLine.Id), oneLine.Text);
            }

            // Create localized Embeds
            Dictionary <Language, Embed> localizedEmbeds = localizedEmbedBuilder.Build();

            // Send the notifications
            await DiscordBot.SendNotificationAsync("**[Line News]**", localizedEmbeds);
        }
        private async Task CreateWebhookAsync(CommandContext ctx, DiscordChannel channel, string name, Uri?avatarUrl, string?reason)
        {
            // TODO what about other channel types? news, store etc?
            if (channel?.Type != ChannelType.Text)
            {
                throw new InvalidCommandUsageException(ctx, "cmd-err-chn-type-text");
            }

            if (string.IsNullOrWhiteSpace(name) || name.Length > DiscordLimits.NameLimit)
            {
                throw new CommandFailedException(ctx, "cmd-err-name", DiscordLimits.NameLimit);
            }

            DiscordWebhook wh;

            if (avatarUrl is null)
            {
                wh = await channel.CreateWebhookAsync(name, reason : ctx.BuildInvocationDetailsString(reason));
            }
            else
            {
                (_, HttpContentHeaders headers) = await HttpService.HeadAsync(avatarUrl);

                if (!headers.ContentTypeHeaderIsImage() || headers.ContentLength.GetValueOrDefault() > 8 * 1024 * 1024)
                {
                    throw new CommandFailedException(ctx, "err-url-image-8mb");
                }
                try {
                    using MemoryStream ms = await HttpService.GetMemoryStreamAsync(avatarUrl);

                    wh = await channel.CreateWebhookAsync(name, ms, reason : ctx.BuildInvocationDetailsString(reason));
                } catch (WebException e) {
                    throw new CommandFailedException(ctx, "err-url-image-fail", e);
                }
            }

            if (await ctx.WaitForBoolReplyAsync("q-send-token"))
            {
                try {
                    DiscordDmChannel?dm = await ctx.Client.CreateDmChannelAsync(ctx.User.Id);

                    if (dm is { })
                    {
                        var emb = new LocalizedEmbedBuilder(this.Localization, ctx.Guild.Id);
                        emb.WithLocalizedTitle("fmt-wh-add", Formatter.Bold(Formatter.Strip(wh.Name)), channel.Mention);
                        emb.WithDescription($"||{wh.BuildUrlString()}||");
                        emb.WithColor(this.ModuleColor);
                        emb.WithThumbnail(wh.AvatarUrl);
                        emb.AddLocalizedTitleField("str-id", wh.Id, inline: true);
                        emb.AddLocalizedTitleField("str-name", wh.Name, inline: true);
                        emb.AddLocalizedTitleField("str-token", $"||{wh.Token}||");
                        await dm.SendMessageAsync(embed : emb.Build());
                    }
                    else
                    {
                        await ctx.FailAsync("err-dm-fail");
                    }
                } catch {
Exemple #9
0
        public static Task <DiscordMessage> RespondWithLocalizedEmbedAsync(this CommandContext ctx, Action <LocalizedEmbedBuilder> action,
                                                                           DiscordChannel?channel = null)
        {
            channel ??= ctx.Channel;
            LocalizationService lcs = ctx.Services.GetRequiredService <LocalizationService>();
            var emb = new LocalizedEmbedBuilder(lcs, ctx.Guild?.Id);

            action(emb);
            return(channel.SendMessageAsync(embed: emb.Build()));
        }
 private LocalizedEmbedBuilder AddDataToEmbed(LocalizedEmbedBuilder emb, PartialWeatherData data)
 {
     emb.WithColor(this.ModuleColor);
     emb.AddLocalizedTitleField("str-w-condition", data.Weather.Select(w => w.Main).JoinWith(", "), inline: true, titleArgs: Emojis.Cloud);
     emb.AddLocalizedTitleField("str-w-humidity", $"{data.Main.Humidity}%", inline: true, titleArgs: Emojis.Drops);
     emb.AddLocalizedTitleField("str-w-temp", $"{data.Main.Temp:F1}°C", inline: true, titleArgs: Emojis.Thermometer);
     emb.AddLocalizedTitleField("str-w-temp-minmax", $"{data.Main.TempMin:F1}°C / {data.Main.TempMax:F1}°C", inline: true, titleArgs: Emojis.Thermometer);
     emb.AddLocalizedTitleField("str-w-wind", $"{data.Wind.Speed} m/s", inline: true, titleArgs: Emojis.Wind);
     emb.WithThumbnail(WeatherService.GetWeatherIconUrl(data.Weather[0]));
     emb.WithLocalizedFooter("fmt-powered-by", null, "openweathermap.org");
     return(emb);
 }
Exemple #11
0
        private async Task AdvanceAsync(LocalizationService lcs)
        {
            this.DealDamage();
            await this.WaitForPotionUseAsync();

            this.UpdateHpBars();

            string header = $"{this.player1.Mention} {this.hp1str} {Emojis.DuelSwords} {this.hp2str} {this.player2.Mention}";
            var    emb    = new LocalizedEmbedBuilder(lcs, this.Channel.GuildId);

            emb.WithDescription($"{header}\n\n{this.eb}");
            emb.WithColor(DiscordColor.Teal);

            this.msgHandle = await this.msgHandle.ModifyOrResendAsync(this.Channel, emb.Build());
        }
Exemple #12
0
        public DiscordEmbed EmbedResults(LocalizationService lcs, IEnumerable <KeyValuePair <DiscordUser, int> > results)
        {
            var sb = new StringBuilder();

            foreach ((DiscordUser user, int result) in results)
            {
                sb.AppendLine(lcs.GetString(this.Channel.GuildId, "fmt-game-tr-errors", user.Mention, result));
            }

            var emb = new LocalizedEmbedBuilder(lcs, this.Channel.GuildId);

            emb.WithLocalizedTitle("fmt-game-tr-res");
            emb.WithDescription(sb);
            emb.WithColor(DiscordColor.Teal);
            return(emb.Build());
        }
Exemple #13
0
        public static DiscordEmbed ToDiscordEmbed(this Poll poll, LocalizationService lcs)
        {
            var emb = new LocalizedEmbedBuilder(lcs, poll.Channel.GuildId);

            emb.WithTitle(poll.Question);
            emb.WithLocalizedDescription("str-vote-text");
            emb.WithColor(DiscordColor.Orange);

            for (int i = 0; i < poll.Options.Count; i++)
            {
                if (!string.IsNullOrWhiteSpace(poll.Options[i]))
                {
                    emb.AddField($"{i + 1} : {poll.Options[i]}", $"{poll.Results.Count(kvp => kvp.Value == i)}");
                }
            }

            if (poll.EndTime is { })
Exemple #14
0
        public static DiscordEmbed ToEmbed(this ReactionsPoll poll, LocalizationService lcs)
        {
            var emb = new LocalizedEmbedBuilder(lcs, poll.Channel.GuildId);

            emb.WithTitle(poll.Question);
            emb.WithLocalizedDescription("str-vote-react");
            emb.WithColor(DiscordColor.Orange);

            for (int i = 0; i < poll.Options.Count; i++)
            {
                if (!string.IsNullOrWhiteSpace(poll.Options[i]))
                {
                    emb.AddField($"{i + 1}", poll.Options[i], inline: true);
                }
            }

            if (poll.EndTime is { })
        public async Task ListPinnedMessagesAsync(CommandContext ctx,
                                                  [Description("desc-chn-pins")] DiscordChannel?chn = null)
        {
            chn ??= ctx.Channel;
            if (!chn.PermissionsFor(ctx.Member).HasPermission(Permissions.AccessChannels))
            {
                throw new CommandFailedException(ctx, "cmd-chk-perms-usr", Permissions.AccessChannels);
            }

            IReadOnlyList <DiscordMessage> pinned = await ctx.Channel.GetPinnedMessagesAsync();

            if (!pinned.Any())
            {
                throw new CommandFailedException(ctx, "cmd-err-pinned-none");
            }

            IEnumerable <Page> pages = pinned.Select(m => new Page(
                                                         $"{Formatter.Bold(m.Author.Username)} @ {this.Localization.GetLocalizedTimeString(ctx.Guild.Id, m.CreationTimestamp)}",
                                                         // TODO
                                                         GetFirstEmbedOrDefaultAsBuilder(m).AddField("URL", Formatter.MaskedUrl(this.Localization.GetString(ctx.Guild.Id, "str-jumplink"), m.JumpLink))
                                                         ));

            await ctx.Client.GetInteractivity().SendPaginatedMessageAsync(ctx.Channel, ctx.User, pages);

            DiscordEmbedBuilder GetFirstEmbedOrDefaultAsBuilder(DiscordMessage m)
            {
                DiscordEmbed?em = m.Embeds.FirstOrDefault();

                if (em is { })
                {
                    return(new DiscordEmbedBuilder(em));
                }

                var emb = new LocalizedEmbedBuilder(this.Localization, ctx.Guild.Id);

                if (!string.IsNullOrWhiteSpace(m.Content))
                {
                    emb.WithDescription(m.Content);
                }
                return(emb.GetBuilder());
            }
Exemple #16
0
        public static DiscordEmbed ToStarboardEmbed(this DiscordMessage msg, LocalizationService lcs, DiscordEmoji star, int count)
        {
            var emb = new LocalizedEmbedBuilder(lcs, msg.Channel.Guild.Id);

            emb.WithColor(DiscordColor.Gold);
            emb.WithUrl(msg.JumpLink);
            emb.WithAuthor(msg.Author.ToDiscriminatorString(), iconUrl: msg.Author.AvatarUrl);
            emb.WithDescription(msg.Content.Truncate(DiscordLimits.EmbedDescriptionLimit - 5, " ..."));
            emb.AddLocalizedTitleField("str-votes", $"{Formatter.Bold(count.ToString())} {star}", inline: true);
            emb.AddLocalizedTitleField("str-chn", msg.Channel.Mention, inline: true);

            string jumplink = Formatter.MaskedUrl(lcs.GetString(msg.Channel.Guild.Id, "str-jumplink"), msg.JumpLink);

            emb.AddLocalizedTitleField("str-link", jumplink, inline: true);

            string?url = msg.Attachments
                         .Select(a => a.Url)
                         .FirstOrDefault(u => u.EndsWith(".jpg") || u.EndsWith(".png") || u.EndsWith(".jpeg") || u.EndsWith(".gif"))
            ;

            if (url is { })
        public async ValueTask <AdminCommandResult> GetEmojiInfoAsync([RequireCustomEmoji] IEmoji emoji)
        {
            var customEmoji = (LocalCustomEmoji)emoji;
            var ownedGuild  = Context.Client.Guilds.Values.FirstOrDefault(x => x.Emojis.ContainsKey(customEmoji.Id));
            var builder     = new LocalizedEmbedBuilder(this)
                              .WithSuccessColor()
                              .WithThumbnailUrl(customEmoji.GetUrl())
                              .WithLocalizedTitle("emoji_info_title", customEmoji.Name)
                              .AddField(new LocalizedFieldBuilder(this)
                                        .WithLocalizedName("info_id")
                                        .WithValue(customEmoji.Id))
                              .AddField(new LocalizedFieldBuilder(this)
                                        .WithLocalizedName("info_created")
                                        .WithValue(string.Join('\n', customEmoji.Id.CreatedAt.ToString("G", Context.Language.Culture),
                                                               (DateTimeOffset.UtcNow - customEmoji.Id.CreatedAt).HumanizeFormatted(Localization,
                                                                                                                                    Context.Language, TimeUnit.Second, true))))
                              .AddField(new LocalizedFieldBuilder(this)
                                        .WithLocalizedName("emoji_info_animated")
                                        .WithValue(customEmoji.IsAnimated ? EmojiTools.Checkmark : EmojiTools.X));

            if (ownedGuild is { })
        private Task PrintGameAsync(LocalizationService lcs, DiscordMessage msg, IEnumerable <int> numbers, int step)
        {
            var sb = new StringBuilder();

            sb.Append(Formatter.Bold(lcs.GetString(this.Channel.GuildId, "str-casino-lottery-drawn"))).Append(' ');
            sb.AppendLine(Formatter.Bold(numbers.Take(step).JoinWith(" "))).AppendLine();

            foreach (Participant participant in this.participants)
            {
                sb.Append(participant.User.Mention).Append(" | ");
                sb.AppendLine(Formatter.Bold(participant.Numbers.JoinWith(" ")));
                sb.AppendLine();
            }

            var emb = new LocalizedEmbedBuilder(lcs, this.Channel.GuildId);

            emb.WithLocalizedTitle("fmt-casino-lottery", Emojis.MoneyBag, Emojis.MoneyBag);
            emb.WithColor(DiscordColor.DarkGreen);
            emb.WithDescription(sb);

            return(msg.ModifyAsync(embed: emb.Build()));
        }
Exemple #19
0
        public async Task AnnounceAsync(CommandContext ctx,
                                        [RemainingText, Description("desc-announcement")] string message)
        {
            if (!await ctx.WaitForBoolReplyAsync("q-announcement", args: Formatter.Strip(message)))
            {
                return;
            }

            var emb = new LocalizedEmbedBuilder(this.Localization, ctx.Guild?.Id);

            emb.WithLocalizedTitle("str-announcement");
            emb.WithDescription(message);
            emb.WithColor(DiscordColor.Red);

            var eb = new StringBuilder();
            IEnumerable <(int, IEnumerable <DiscordGuild>)> shardGuilds = TheGodfather.Bot !.Client.ShardClients
                                                                          .Select(kvp => (kvp.Key, kvp.Value.Guilds.Values));

            foreach ((int shardId, IEnumerable <DiscordGuild> guilds) in shardGuilds)
            {
                foreach (DiscordGuild guild in guilds)
                {
                    try {
                        await guild.GetDefaultChannel().SendMessageAsync(embed: emb.Build());
                    } catch {
                        eb.AppendLine(this.Localization.GetString(ctx.Guild?.Id, "cmd-err-announce", shardId, guild.Name, guild.Id));
                    }
                }
            }

            if (eb.Length > 0)
            {
                await ctx.ImpInfoAsync(this.ModuleColor, "fmt-err", eb.ToString());
            }
            else
            {
                await ctx.InfoAsync(this.ModuleColor);
            }
        }
Exemple #20
0
        public async Task InfoAsync(CommandContext ctx,
                                    [Description("desc-emoji-info")] DiscordEmoji emoji)
        {
            try {
                DiscordGuildEmoji gemoji = await ctx.Guild.GetEmojiAsync(emoji.Id);

                var emb = new LocalizedEmbedBuilder(this.Localization, ctx.Guild.Id);
                emb.WithColor(this.ModuleColor);
                emb.WithLocalizedTitle("str-emoji-details");
                emb.WithDescription($"{gemoji.GetDiscordName()} ({gemoji.Id})");
                emb.WithThumbnail(gemoji.Url);

                emb.AddLocalizedTitleField("str-created-by", gemoji.User?.ToDiscriminatorString(), inline: true);
                emb.AddLocalizedTitleField("str-animated", gemoji.IsAnimated, inline: true);
                emb.AddLocalizedTitleField("str-managed", gemoji.IsManaged, inline: true);
                emb.AddLocalizedTitleField("str-url", gemoji.Url);
                emb.AddLocalizedTimestampField("str-created-at", gemoji.CreationTimestamp);

                await ctx.RespondAsync(embed : emb.Build());
            } catch (NotFoundException) {
                throw new CommandFailedException(ctx, "cmd-err-emoji-404");
            }
        }
        public override async Task RunAsync(LocalizationService lcs)
        {
            this.Started = true;

            var rng = new SecureRandom();

            for (int round = 1; round <= 5 && this.ParticipantCount > 1; round++)
            {
                DiscordMessage msg = await this.Channel.LocalizedEmbedAsync(lcs, Emojis.Gun, DiscordColor.DarkRed, "fmt-game-rr-starting", round);

                await Task.Delay(TimeSpan.FromSeconds(5));

                var eb = new StringBuilder();
                foreach (DiscordUser participant in this.participants)
                {
                    if (rng.NextBool(round))
                    {
                        eb.AppendLine($"{participant.Mention} {Emojis.Dead} {Emojis.Blast} {Emojis.Gun}");
                        this.participants.TryRemove(participant);
                    }
                    else
                    {
                        eb.AppendLine($"{participant.Mention} {Emojis.Relieved} {Emojis.Gun}");
                    }

                    var emb = new LocalizedEmbedBuilder(lcs, this.Channel.GuildId);
                    emb.WithLocalizedTitle("fmt-game-rr-round", round);
                    emb.WithDescription(eb.ToString());
                    emb.WithColor(DiscordColor.DarkRed);
                    msg = await msg.ModifyOrResendAsync(this.Channel, emb.Build());

                    await Task.Delay(TimeSpan.FromSeconds(2));
                }
            }

            this.Survivors = this.participants.ToList().AsReadOnly();
        }
Exemple #22
0
 public static bool IsLogEnabledForGuild(TheGodfatherBot shard, ulong gid, out LoggingService logService, out LocalizedEmbedBuilder emb)
 {
     logService = shard.Services.GetRequiredService <LoggingService>();
     return(logService.IsLogEnabledFor(gid, out emb));
 }
Exemple #23
0
 public static LocalizedEmbedBuilder WithSuccessColor(this LocalizedEmbedBuilder builder)
 => builder.WithColor(Config.SuccessColor);
Exemple #24
0
 public static LocalizedEmbedBuilder WithWarnColor(this LocalizedEmbedBuilder builder)
 => builder.WithColor(Config.WarnColor);
Exemple #25
0
 public static LocalizedEmbedBuilder WithErrorColor(this LocalizedEmbedBuilder builder)
 => builder.WithColor(Config.ErrorColor);
Exemple #26
0
        public override async Task RunAsync(LocalizationService lcs)
        {
            int timeouts = 0;

            foreach ((QuizQuestion question, int i) in this.questions.Select((q, i) => (q, i)))
            {
                var emb = new LocalizedEmbedBuilder(lcs, this.Channel.GuildId);
                emb.WithLocalizedTitle("fmt-game-quiz-q", i + 1);
                emb.WithDescription(Formatter.Bold(question.Content));
                emb.WithColor(DiscordColor.Teal);
                emb.AddLocalizedTitleField("str-category", question.Category, inline: false);

                var answers = new List <string>(question.IncorrectAnswers)
                {
                    question.CorrectAnswer
                }.Shuffle().ToList();

                foreach ((string answer, int index) in answers.Select((a, i) => (a, i)))
                {
                    emb.AddLocalizedTitleField("fmt-game-quiz-a", answer, inline: true, titleArgs: index + 1);
                }

                var            options = Emojis.Numbers.All.Skip(1).Take(4).ToList();
                DiscordMessage msg     = await this.Channel.SendMessageAsync(embed : emb.Build());

                foreach (DiscordEmoji emoji in options)
                {
                    await msg.CreateReactionAsync(emoji);
                }

                bool timeout = true;
                var  failed  = new ConcurrentHashSet <ulong>();
                InteractivityResult <MessageReactionAddEventArgs> res = await this.Interactivity.WaitForReactionAsync(
                    e => {
                    if (e.User.IsBot || failed.Contains(e.User.Id) || e.Message != msg)
                    {
                        return(false);
                    }
                    int opt = options.IndexOf(e.Emoji);
                    if (opt == -1)
                    {
                        return(false);
                    }
                    if (answers[opt].Equals(question.CorrectAnswer))
                    {
                        return(true);
                    }
                    else
                    {
                        failed.Add(e.User.Id);
                    }
                    return(false);
                },
                    TimeSpan.FromSeconds(10)
                    );

                if (res.TimedOut)
                {
                    if (!failed.Any())
                    {
                        timeouts = timeout ? timeouts + 1 : 0;
                        if (timeouts == 3)
                        {
                            this.IsTimeoutReached = true;
                            return;
                        }
                    }
                    else
                    {
                        timeouts = 0;
                    }
                    await this.Channel.LocalizedEmbedAsync(lcs, Emojis.AlarmClock, DiscordColor.Teal, "fmt-game-quiz-timeout", question.CorrectAnswer);
                }
                else
                {
                    await this.Channel.LocalizedEmbedAsync(lcs, Emojis.CheckMarkSuccess, DiscordColor.Teal, "fmt-game-quiz-correct", res.Result.User.Mention);

                    this.results.AddOrUpdate(res.Result.User, u => 1, (u, v) => v + 1);
                }

                await Task.Delay(TimeSpan.FromSeconds(2));
            }
        }
Exemple #27
0
        public override async Task RunAsync(LocalizationService lcs)
        {
            if (_countries is null)
            {
                throw new InvalidOperationException("The quiz flag paths have not been loaded.");
            }

            var questions = new Queue <string>(_countries.Keys.Shuffle().Take(this.NumberOfQuestions));

            int timeouts = 0;

            for (int i = 0; i < this.NumberOfQuestions; i++)
            {
                string question = questions.Dequeue();

                var emb = new LocalizedEmbedBuilder(lcs, this.Channel.GuildId);
                emb.WithLocalizedDescription("fmt-game-quiz-q", i + 1);
                await this.Channel.SendFileAsync("flag.png", new FileStream(question, FileMode.Open), embed : emb.Build());

                bool timeout     = true;
                var  failed      = new ConcurrentHashSet <ulong>();
                var  answerRegex = new Regex($@"\b{_countries[question]}\b", RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
                InteractivityResult <DiscordMessage> res = await this.Interactivity.WaitForMessageAsync(
                    xm => {
                    if (xm.ChannelId != this.Channel.Id || xm.Author.IsBot || failed.Contains(xm.Author.Id))
                    {
                        return(false);
                    }
                    timeout = false;
                    if (answerRegex.IsMatch(xm.Content))
                    {
                        return(true);
                    }
                    else
                    {
                        failed.Add(xm.Author.Id);
                    }
                    return(false);
                },
                    TimeSpan.FromSeconds(10)
                    );

                if (res.TimedOut)
                {
                    if (!failed.Any())
                    {
                        timeouts = timeout ? timeouts + 1 : 0;
                        if (timeouts == 3)
                        {
                            this.IsTimeoutReached = true;
                            return;
                        }
                    }
                    else
                    {
                        timeouts = 0;
                    }
                    await this.Channel.LocalizedEmbedAsync(lcs, Emojis.AlarmClock, DiscordColor.Teal, "fmt-game-quiz-timeout", _countries[question]);
                }
                else
                {
                    await this.Channel.LocalizedEmbedAsync(lcs, Emojis.CheckMarkSuccess, DiscordColor.Teal, "fmt-game-quiz-correct", res.Result.Author.Mention);

                    this.results.AddOrUpdate(res.Result.Author, u => 1, (u, v) => v + 1);
                }

                await Task.Delay(TimeSpan.FromSeconds(2));
            }
        }
Exemple #28
0
        public static async Task HandleFestival(RomType romType, Dictionary <string, byte[]> data, FestivalSetting previousFestival, FestivalSetting newFestival, byte[] rawFile)
        {
            // Don't do anything
            if (previousFestival.FestivalId == newFestival.FestivalId)
            {
                return;
            }

            // Get the Color for the neutral team
            System.Drawing.Color drawingColor = newFestival.Teams[2].GetColor4fAsColor();

            // Localize the times
            Dictionary <Language, string> startTime = Localizer.LocalizeDateTimeToAllLanguages(newFestival.Times.Start);
            Dictionary <Language, string> endTime   = Localizer.LocalizeDateTimeToAllLanguages(newFestival.Times.End);

            // Create the format parameters
            Dictionary <Language, object[]> formatParams = new Dictionary <Language, object[]>();

            foreach (Language language in BlitzUtil.SupportedLanguages)
            {
                formatParams[language] = new object[] { startTime[language], endTime[language] };
            }

            // Format the final string
            Dictionary <Language, string> periodStr = Localizer.LocalizeToAllLanguagesWithFormat("festival.period_format", BlitzUtil.SupportedLanguages, formatParams);

            Dictionary <Language, string> AddMissingLocalizations(Dictionary <Language, string> originalDict)
            {
                // Add any missing strings for team alpha
                Dictionary <Language, string> names = new Dictionary <Language, string>();

                foreach (Language language in BlitzUtil.SupportedLanguages)
                {
                    // Try getting the name from the original dictionary
                    if (originalDict.TryGetValue(language, out string name))
                    {
                        names.Add(language, $"**{name}**");
                    }
                    else
                    {
                        // Use the RomType to get the name
                        switch (romType)
                        {
                        case RomType.NorthAmerica:
                            names.Add(language, $"**{originalDict[Language.EnglishUS]}**");
                            break;

                        case RomType.Europe:
                            names.Add(language, $"**{originalDict[Language.EnglishUK]}**");
                            break;

                        case RomType.Japan:
                            names.Add(language, $"**{originalDict[Language.Japanese]}**");
                            break;

                        default:
                            throw new Exception("Unsupported RomType");
                        }
                    }
                }

                return(names);
            }

            // Add any missing strings for the teams
            Dictionary <Language, string> alphaNames = AddMissingLocalizations(newFestival.Teams[0].Name);
            Dictionary <Language, string> bravoNames = AddMissingLocalizations(newFestival.Teams[1].Name);

            // Localize the RomType
            Dictionary <Language, string> localizedRomType = Localizer.LocalizeToAllLanguages($"romtype.{romType.ToString().ToLower()}");

            // Use the special title if necessary
            Dictionary <Language, string> localizedTitle;

            if (newFestival.SpecialType != null)
            {
                // Localize the special type
                Dictionary <Language, string> localizedSpecialTypes = Localizer.LocalizeToAllLanguages($"festival.special_type.{newFestival.SpecialType.ToLower()}");

                // Create the format parameters
                formatParams = new Dictionary <Language, object[]>();
                foreach (Language language in BlitzUtil.SupportedLanguages)
                {
                    formatParams[language] = new object[] { localizedRomType[language], localizedSpecialTypes[language] };
                }

                // Localize the title
                localizedTitle = Localizer.LocalizeToAllLanguagesWithFormat("festival.title_special", BlitzUtil.SupportedLanguages, formatParams);
            }
            else
            {
                // Create the format parameters
                formatParams = new Dictionary <Language, object[]>();
                foreach (Language language in BlitzUtil.SupportedLanguages)
                {
                    formatParams[language] = new object[] { localizedRomType[language] };
                }

                // Localize the title
                localizedTitle = Localizer.LocalizeToAllLanguagesWithFormat("festival.title", BlitzUtil.SupportedLanguages, formatParams);
            }

            // Start building the embed
            LocalizedEmbedBuilder embedBuilder = new LocalizedEmbedBuilder(BlitzUtil.SupportedLanguages)
                                                 .WithTitle(localizedTitle)
                                                 .AddField("festival.team_alpha", alphaNames, true)
                                                 .AddField("festival.team_bravo", bravoNames, true)
                                                 .AddField("festival.rule", BlitzLocalizer.LocalizeRuleToAllLanguages(newFestival.VersusRule), true)
                                                 .AddField("festival.special_stage", BlitzLocalizer.LocalizeStageToAllLanguages(newFestival.SpecialStage), true)
                                                 .AddField("festival.announcement_time", Localizer.LocalizeDateTimeToAllLanguages(newFestival.Times.Announcement))
                                                 .AddField("festival.period", periodStr)
                                                 .AddField("festival.results_time", Localizer.LocalizeDateTimeToAllLanguages(newFestival.Times.Result))
                                                 .WithImageUrl($"https://cdn.oatmealdome.me/splatoon/festival/{romType.ToString()}/{newFestival.FestivalId}/panel.png")
                                                 .WithColor(new Color(drawingColor.R, drawingColor.G, drawingColor.B));

            // Send the notification
            await DiscordBot.SendNotificationAsync("**[Splatfest]**", embedBuilder.Build());
        }
Exemple #29
0
        public static DiscordEmbed ToDiscordEmbed(this GuildConfig gcfg, DiscordGuild guild, LocalizationService lcs, bool update = false)
        {
            var emb = new LocalizedEmbedBuilder(lcs, guild.Id);

            emb.WithLocalizedTitle(DiscordEventType.GuildUpdated, update ? "evt-cfg-update" : "str-guild-cfg");
            emb.WithThumbnail(guild.IconUrl);

            emb.AddLocalizedTitleField("str-prefix", gcfg.Prefix ?? lcs.GetString(guild.Id, "str-default"), inline: true);
            emb.AddLocalizedTitleField("str-silent", gcfg.ReactionResponse, inline: true);
            emb.AddLocalizedTitleField("str-cmd-suggestions", gcfg.SuggestionsEnabled, inline: true);

            if (gcfg.LoggingEnabled)
            {
                DiscordChannel?logchn = guild.GetChannel(gcfg.LogChannelId);
                if (logchn is null)
                {
                    emb.AddLocalizedField("str-logging", "err-log-404", inline: true);
                }
                else
                {
                    emb.AddLocalizedField("str-logging", "fmt-logs", inline: true, contentArgs: new[] { logchn.Mention });
                }
            }
            else
            {
                emb.AddLocalizedField("str-logging", "str-off", inline: true);
            }

            emb.AddLocalizedField("str-backup", gcfg.BackupEnabled ? "str-enabled" : "str-disabled", inline: true);

            if (gcfg.WelcomeChannelId != default)
            {
                DiscordChannel?wchn = guild.GetChannel(gcfg.WelcomeChannelId);
                if (wchn is null)
                {
                    emb.AddLocalizedField("str-memupd-w", "err-memupd-w-404", inline: true);
                }
                else
                {
                    emb.AddLocalizedField("str-memupd-w", "fmt-memupd", inline: true, contentArgs: new[] {
                        wchn.Mention,
                        Formatter.Strip(gcfg.WelcomeMessage ?? lcs.GetString(guild.Id, "str-default"))
                    });
                }
            }
            else
            {
                emb.AddLocalizedField("str-memupd-w", "str-off", inline: true);
            }

            if (gcfg.LeaveChannelId != default)
            {
                DiscordChannel?lchn = guild.GetChannel(gcfg.LeaveChannelId);
                if (lchn is null)
                {
                    emb.AddLocalizedField("str-memupd-l", "err-memupd-l-404", inline: true);
                }
                else
                {
                    emb.AddLocalizedField("str-memupd-l", "fmt-memupd", inline: true, contentArgs: new[] {
                        lchn.Mention,
                        Formatter.Strip(gcfg.LeaveMessage ?? lcs.GetString(guild.Id, "str-default"))
                    });
                }
            }
            else
            {
                emb.AddLocalizedField("str-memupd-l", "str-off", inline: true);
            }

            emb.AddLocalizedTitleField("str-ratelimit", gcfg.RatelimitSettings.ToEmbedFieldString(guild.Id, lcs), inline: true);
            emb.AddLocalizedTitleField("str-antispam", gcfg.AntispamSettings.ToEmbedFieldString(guild.Id, lcs), inline: true);
            emb.AddLocalizedTitleField("str-antiflood", gcfg.AntifloodSettings.ToEmbedFieldString(guild.Id, lcs), inline: true);
            emb.AddLocalizedTitleField("str-instantleave", gcfg.AntiInstantLeaveSettings.ToEmbedFieldString(guild.Id, lcs), inline: true);

            if (gcfg.MuteRoleId != default)
            {
                DiscordRole?muteRole = guild.GetRole(gcfg.MuteRoleId);
                if (muteRole is null)
                {
                    emb.AddLocalizedField("str-muterole", "err-muterole-404", inline: true);
                }
                else
                {
                    emb.AddLocalizedTitleField("str-muterole", muteRole.Name, inline: true);
                }
            }
            else
            {
                emb.AddLocalizedField("str-muterole", "str-none", inline: true);
            }

            emb.AddLocalizedTitleField("str-lf", gcfg.LinkfilterSettings.ToEmbedFieldString(guild.Id, lcs), inline: true);

            return(emb.Build());
        }