private async Task SetupMemberUpdateMessagesAsync(GuildConfig gcfg, CommandContext ctx, DiscordChannel channel)
        {
            await GetChannelIdAndMessageAsync(welcome : true);
            await GetChannelIdAndMessageAsync(welcome : false);


            async Task GetChannelIdAndMessageAsync(bool welcome)
            {
                InteractivityExtension interactivity = ctx.Client.GetInteractivity();

                if (await ctx.WaitForBoolReplyAsync(welcome ? "q-setup-memupd-wm" : "q-setup-memupd-lm", channel: channel, reply: false))
                {
                    await channel.LocalizedEmbedAsync(this.Localization, "q-setup-memupd-chn");

                    DiscordChannel?chn = await interactivity.WaitForChannelMentionAsync(channel, ctx.User);

                    if (chn is { } && chn.Type == ChannelType.Text)
                    {
                        if (welcome)
                        {
                            gcfg.WelcomeChannelId = chn?.Id ?? default;
                        }
                        else
                        {
                            gcfg.LeaveChannelId = chn?.Id ?? default;
                        }
                    }

                    if (await ctx.WaitForBoolReplyAsync("q-setup-memupd-msg", channel: channel, reply: false))
                    {
                        await channel.LocalizedEmbedAsync(this.Localization, "q-setup-memupd-msg-new");

                        InteractivityResult <DiscordMessage> mctx = await channel.GetNextMessageAsync(ctx.User, m => m.Content.Length <= 128);

                        if (mctx.TimedOut)
                        {
                            throw new CommandFailedException(ctx, "str-timeout");
                        }
                        else
                        {
                            if (welcome)
                            {
                                gcfg.WelcomeMessage = mctx.Result.Content;
                            }
                            else
                            {
                                gcfg.LeaveMessage = mctx.Result.Content;
                            }
                        }
                    }
                }
        private async Task SetupLoggingAsync(GuildConfig gcfg, CommandContext ctx, DiscordChannel channel)
        {
            if (await ctx.WaitForBoolReplyAsync("q-setup-log", channel: channel, reply: false))
            {
                await channel.LocalizedEmbedAsync(this.Localization, "q-setup-log-chn");

                DiscordChannel?logchn = await ctx.Client.GetInteractivity().WaitForChannelMentionAsync(channel, ctx.User);

                gcfg.LogChannelId = logchn?.Id ?? default;
            }
        }
        private async Task SetupPrefixAsync(GuildConfig gcfg, CommandContext ctx, DiscordChannel channel)
        {
            if (await ctx.WaitForBoolReplyAsync("q-setup-prefix", channel: channel, reply: false))
            {
                await channel.LocalizedEmbedAsync(this.Localization, "q-setup-prefix-new", GuildConfig.PrefixLimit);

                InteractivityResult <DiscordMessage> mctx = await channel.GetNextMessageAsync(ctx.User, m => m.Content.Length <= GuildConfig.PrefixLimit);

                gcfg.Prefix = mctx.TimedOut ? throw new CommandFailedException(ctx, "str-timeout") : mctx.Result.Content;
            }
        }
        private async Task SetupBackupAsync(GuildConfig gcfg, CommandContext ctx, DiscordChannel channel)
        {
            if (await ctx.WaitForBoolReplyAsync("q-setup-bak", channel: channel, reply: false))
            {
                gcfg.BackupEnabled = true;
                if (await ctx.WaitForBoolReplyAsync("q-setup-bak-ex", channel: channel, reply: false))
                {
                    await channel.LocalizedEmbedAsync(this.Localization, "q-setup-bak-ex-list");

                    InteractivityResult <DiscordMessage> res = await ctx.Client.GetInteractivity().WaitForMessageAsync(
                        msg => msg.Author == ctx.User && msg.Channel == channel && msg.MentionedChannels.Any()
                        );

                    if (!res.TimedOut)
                    {
                        BackupService bs = ctx.Services.GetRequiredService <BackupService>();
                        await bs.ExemptAsync(ctx.Guild.Id, res.Result.MentionedChannels.SelectIds());
                    }
                }
            }
        }