Exemple #1
0
    /// <summary>
    /// Editing the embedded message
    /// </summary>
    /// <param name="builder">Builder</param>
    /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
    public override async Task EditMessage(DiscordEmbedBuilder builder)
    {
        builder.WithTitle(LocalizationGroup.GetText("ChooseCommandTitle", "Rank configuration"));
        builder.WithDescription(LocalizationGroup.GetText("ChooseCommandDescription", "With this assistant you are able to configure the rank."));

        using (var dbFactory = RepositoryFactory.CreateInstance())
        {
            var rankId = DialogContext.GetValue <int>("RankId");

            var data = await dbFactory.GetRepository <GuildRankRepository>()
                       .GetQuery()
                       .Where(obj => obj.Id == rankId)
                       .Select(obj => new
            {
                obj.InGameName,
                obj.DiscordRoleId,
                obj.Percentage
            })
                       .FirstAsync()
                       .ConfigureAwait(false);

            var fieldBuilder = new StringBuilder();
            fieldBuilder.AppendLine($"{Formatter.Bold(LocalizationGroup.GetText("InGameName", "In game name"))}: {data.InGameName}");
            fieldBuilder.AppendLine($"{Formatter.Bold(LocalizationGroup.GetText("DiscordRoleId", "Discord role"))}: {CommandContext.Guild.GetRole(data.DiscordRoleId).Mention}");
            fieldBuilder.AppendLine($"{Formatter.Bold(LocalizationGroup.GetText("Percentage", "Percentage quota"))}: {data.Percentage.ToString(LocalizationGroup.CultureInfo)}");
            builder.AddField(LocalizationGroup.GetText("General", "General"), fieldBuilder.ToString());
        }
    }
Exemple #2
0
    /// <summary>
    /// Return the message of element
    /// </summary>
    /// <returns>Message</returns>
    public override DiscordEmbedBuilder GetMessage()
    {
        var builder = new DiscordEmbedBuilder();

        builder.WithTitle(LocalizationGroup.GetText("ChooseTypeTitle", "Type selection"));
        builder.WithDescription(LocalizationGroup.GetText("ChooseTypeDescription", "Please choose one of the following types:"));

        _types = new Dictionary <int, CalendarAppointmentScheduleType>();
        var typesField = new StringBuilder();

        var i = 1;

        foreach (var type in Enum.GetValues(typeof(CalendarAppointmentScheduleType))
                 .OfType <CalendarAppointmentScheduleType>())
        {
            typesField.Append('`');
            typesField.Append(i);
            typesField.Append("` - ");
            typesField.Append(' ');
            typesField.Append(LocalizationGroup.GetText(type.ToString(), type.ToString()));
            typesField.Append('\n');

            _types[i] = type;

            i++;
        }

        builder.AddField(LocalizationGroup.GetText("TypesField", "Types"), typesField.ToString());

        return(builder);
    }
Exemple #3
0
    /// <summary>
    /// Returns the reactions which should be added to the message
    /// </summary>
    /// <returns>Reactions</returns>
    public override IReadOnlyList <ReactionData <bool> > GetReactions()
    {
        return(_reactions ??= new List <ReactionData <bool> >
        {
            new ()
            {
                Emoji = DiscordEmojiService.GetAddEmoji(CommandContext.Client),
                CommandText = LocalizationGroup.GetFormattedText("AddCommand", "{0} Add user", DiscordEmojiService.GetAddEmoji(CommandContext.Client)),
                Func = async() =>
                {
                    var data = await RunSubForm <RaidCommitUserFormData>().ConfigureAwait(false);

                    var user = _commitData.Users
                               .FirstOrDefault(obj => obj.DiscordUserId == data.User.Id);

                    if (user != null)
                    {
                        user.Points = data.Points;
                    }
                    else
                    {
                        _commitData.Users
                        .Add(new RaidCommitUserData
                        {
                            Points = data.Points,
                            DiscordUserId = data.User.Id
                        });
                    }

                    return true;
                }
            },
Exemple #4
0
    /// <summary>
    /// Editing the embedded message
    /// </summary>
    /// <param name="builder">Builder</param>
    /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
    public override Task EditMessage(DiscordEmbedBuilder builder)
    {
        builder.WithTitle(LocalizationGroup.GetText("ChooseCommandTitle", "Raid template configuration"));
        builder.WithDescription(LocalizationGroup.GetText("ChooseCommandDescription", "With this assistant you are able to configure the raid templates. The following templates are already created:"));

        var templatesBuilder = new StringBuilder();

        var templates = GetTemplates();

        if (templates.Count > 0)
        {
            foreach (var template in templates)
            {
                templatesBuilder.AppendLine(Formatter.Bold($"{DiscordEmojiService.GetBulletEmoji(CommandContext.Client)} {template}"));
            }
        }
        else
        {
            templatesBuilder.Append('\u200B');
        }

        builder.AddField(LocalizationGroup.GetText("TemplatesField", "Templates"), templatesBuilder.ToString());

        return(Task.CompletedTask);
    }
Exemple #5
0
    /// <summary>
    /// Editing the embedded message
    /// </summary>
    /// <param name="builder">Builder</param>
    /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
    public override async Task EditMessage(DiscordEmbedBuilder builder)
    {
        builder.WithTitle(LocalizationGroup.GetText("ChooseCommandTitle", "Raid template configuration"));
        builder.WithDescription(LocalizationGroup.GetText("ChooseCommandDescription", "With this assistant you are able to configure the raid template."));

        using (var dbFactory = RepositoryFactory.CreateInstance())
        {
            var templateId = DialogContext.GetValue <long>("TemplateId");

            var data = await dbFactory.GetRepository <RaidDayTemplateRepository>()
                       .GetQuery()
                       .Where(obj => obj.Id == templateId)
                       .Select(obj => new
            {
                obj.AliasName,
                obj.Title,
                obj.Description,
                obj.Thumbnail
            })
                       .FirstAsync()
                       .ConfigureAwait(false);

            builder.AddField(LocalizationGroup.GetText("AliasName", "Alias name"), data.AliasName);
            builder.AddField(LocalizationGroup.GetText("Title", "Title"), data.Title);
            builder.AddField(LocalizationGroup.GetText("Description", "Description"), data.Description);
            builder.WithThumbnail(data.Thumbnail);
        }
    }
Exemple #6
0
    /// <summary>
    /// Return the message of element
    /// </summary>
    /// <returns>Message</returns>
    public override DiscordEmbedBuilder GetMessage()
    {
        var builder = new DiscordEmbedBuilder();

        builder.WithTitle(LocalizationGroup.GetText("ChooseTitle", "Voice channel selection"));
        builder.WithDescription(LocalizationGroup.GetText("ChooseDescription", "Please choose one of the voice channels:"));

        _channels = new Dictionary <int, ulong>();
        var fieldText = new StringBuilder();

        var i = 0;

        foreach (var(key, channel) in CommandContext.Guild.Channels.Where(obj => obj.Value.Type == ChannelType.Voice))
        {
            fieldText.Append('`');
            fieldText.Append(i);
            fieldText.Append("` - ");
            fieldText.Append(' ');
            fieldText.Append(channel.Mention);
            fieldText.Append('\n');

            _channels[i] = key;

            i++;
        }

        builder.AddField(LocalizationGroup.GetText("Field", "Channels"), fieldText.ToString());

        return(builder);
    }
Exemple #7
0
    /// <summary>
    /// Editing the embedded message
    /// </summary>
    /// <param name="builder">Builder</param>
    /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
    public override Task EditMessage(DiscordEmbedBuilder builder)
    {
        builder.WithTitle(LocalizationGroup.GetText("ChooseCommandTitle", "Guild special rank configuration"));
        builder.WithDescription(LocalizationGroup.GetText("ChooseCommandDescription", "With this assistant you are able to configure the guild special ranks. The following special ranks are already created:"));

        var levelsBuilder = new StringBuilder();

        var ranks = GetRanks();

        if (ranks.Count > 0)
        {
            foreach (var rank in ranks)
            {
                var role = CommandContext.Guild.GetRole(rank.DiscordRoleId);

                levelsBuilder.AppendLine(Formatter.Bold($"{rank.Description} ({role.Mention})"));
            }
        }
        else
        {
            levelsBuilder.Append('\u200B');
        }

        builder.AddField(LocalizationGroup.GetText("RanksFields", "Ranks"), levelsBuilder.ToString());

        return(Task.CompletedTask);
    }
Exemple #8
0
    /// <summary>
    /// Editing the embedded message
    /// </summary>
    /// <param name="builder">Builder</param>
    /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
    public override Task EditMessage(DiscordEmbedBuilder builder)
    {
        builder.WithTitle(LocalizationGroup.GetText("Title", "Schedule options selection"));
        builder.WithDescription(LocalizationGroup.GetText("Description", "Please choose one of the following options:"));

        return(Task.CompletedTask);
    }
Exemple #9
0
    /// <summary>
    /// Editing the embedded message
    /// </summary>
    /// <param name="builder">Builder</param>
    /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
    public override Task EditMessage(DiscordEmbedBuilder builder)
    {
        builder.WithTitle(LocalizationGroup.GetText("ChooseCommandTitle", "Raid experience levels configuration"));
        builder.WithDescription(LocalizationGroup.GetText("ChooseCommandDescription", "With this assistant you are able to configure the raid experience levels. The following experience levels are already created:"));

        var levelsBuilder = new StringBuilder();

        var levels = GetLevels();

        if (levels.Count > 0)
        {
            var currentLevel = levels.FirstOrDefault(obj => obj.SuperiorExperienceLevelId == null);
            while (currentLevel != null)
            {
                levelsBuilder.AppendLine(Formatter.Bold($"{DiscordEmoji.FromGuildEmote(CommandContext.Client, currentLevel.DiscordEmoji)} {currentLevel.Description}"));

                currentLevel = levels.FirstOrDefault(obj => obj.SuperiorExperienceLevelId == currentLevel.Id);
            }
        }
        else
        {
            levelsBuilder.Append('\u200B');
        }

        builder.AddField(LocalizationGroup.GetText("LevelsFields", "Levels"), levelsBuilder.ToString());

        return(Task.CompletedTask);
    }
Exemple #10
0
    /// <summary>
    /// Editing the embedded message
    /// </summary>
    /// <param name="builder">Builder</param>
    /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
    public override async Task EditMessage(DiscordEmbedBuilder builder)
    {
        builder.WithTitle(LocalizationGroup.GetText("ChooseCommandTitle", "Raid experience level configuration"));
        builder.WithDescription(LocalizationGroup.GetText("ChooseCommandDescription", "With this assistant you are able to configure the raid experience level."));

        using (var dbFactory = RepositoryFactory.CreateInstance())
        {
            var templateId = DialogContext.GetValue <long>("ExperienceLevelId");

            var data = await dbFactory.GetRepository <RaidExperienceLevelRepository>()
                       .GetQuery()
                       .Where(obj => obj.Id == templateId)
                       .Select(obj => new
            {
                obj.Description,
                obj.AliasName,
                obj.DiscordEmoji,
                obj.DiscordRoleId
            })
                       .FirstAsync()
                       .ConfigureAwait(false);

            builder.AddField(LocalizationGroup.GetText("Description", "Description"), data.Description);
            builder.AddField(LocalizationGroup.GetText("AliasName", "Alias name"), data.AliasName);
            builder.AddField(LocalizationGroup.GetText("Emoji", "Emoji"), DiscordEmoji.FromGuildEmote(CommandContext.Client, data.DiscordEmoji));

            if (data.DiscordRoleId != null)
            {
                builder.AddField(LocalizationGroup.GetText("Role", "Role"), CommandContext.Guild.Roles[data.DiscordRoleId.Value].Mention);
            }
        }
    }
Exemple #11
0
    /// <summary>
    /// Starting the role deletion assistant
    /// </summary>
    /// <param name="commandContextContainer">Current command context</param>
    /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
    private async Task RunDeleteAssistantAsync(CommandContextContainer commandContextContainer)
    {
        var roleId = await SelectRoleAsync(commandContextContainer, null).ConfigureAwait(false);

        if (roleId != null)
        {
            var checkEmoji = DiscordEmojiService.GetCheckEmoji(commandContextContainer.Client);
            var crossEmoji = DiscordEmojiService.GetCrossEmoji(commandContextContainer.Client);

            var message = await commandContextContainer.Channel
                          .SendMessageAsync(LocalizationGroup.GetText("DeleteRolePrompt", "Are you sure you want to delete the role?"))
                          .ConfigureAwait(false);

            var userReactionTask = commandContextContainer.Client
                                   .GetInteractivity()
                                   .WaitForReactionAsync(message, commandContextContainer.User);

            await message.CreateReactionAsync(checkEmoji).ConfigureAwait(false);

            await message.CreateReactionAsync(crossEmoji).ConfigureAwait(false);

            var userReaction = await userReactionTask.ConfigureAwait(false);

            if (userReaction.TimedOut == false)
            {
                using (var dbFactory = RepositoryFactory.CreateInstance())
                {
                    dbFactory.GetRepository <RaidRoleRepository>()
                    .Refresh(obj => obj.Id == roleId.Value,
                             obj => obj.IsDeleted = true);
                }
            }
        }
    }
Exemple #12
0
    /// <summary>
    /// Editing the embedded message
    /// </summary>
    /// <param name="builder">Builder</param>
    /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
    public override Task EditMessage(DiscordEmbedBuilder builder)
    {
        builder.WithTitle(LocalizationGroup.GetText("ChooseCommandTitle", "Calendar schedule configuration"));
        builder.WithDescription(LocalizationGroup.GetText("ChooseCommandDescription", "With this assistant you are able to configure the calendar schedules. The following schedules are already created:"));

        var schedulesBuilder = new StringBuilder();

        var schedules = GetSchedules();

        if (schedules.Count > 0)
        {
            foreach (var schedule in schedules)
            {
                schedulesBuilder.AppendLine(schedule);
            }
        }
        else
        {
            schedulesBuilder.Append('\u200B');
        }

        builder.AddField(LocalizationGroup.GetText("SchedulesField", "Schedules"), schedulesBuilder.ToString());

        return(Task.CompletedTask);
    }
Exemple #13
0
    /// <summary>
    /// Return the message of element
    /// </summary>
    /// <returns>Message</returns>
    public override DiscordEmbedBuilder GetMessage()
    {
        var builder = new DiscordEmbedBuilder();

        builder.WithTitle(LocalizationGroup.GetText("ChooseTitle", "Superior rank selection"));
        builder.WithDescription(LocalizationGroup.GetText("ChooseDescription", "Please choose one of the following ranks:"));

        _ranks = new Dictionary <int, int?>();
        var stringBuilder = new StringBuilder();

        var ranksCounter  = 1;
        var fieldsCounter = 1;

        using (var dbFactory = RepositoryFactory.CreateInstance())
        {
            var ranks = dbFactory.GetRepository <GuildRankRepository>()
                        .GetQuery()
                        .Where(obj => obj.Guild.DiscordServerId == CommandContext.Guild.Id)
                        .OrderBy(obj => obj.Order)
                        .Select(obj => new
            {
                obj.Id,
                obj.InGameName,
                obj.DiscordRoleId
            })
                        .ToList();

            stringBuilder.Append("`0` - ");
            stringBuilder.Append(LocalizationGroup.GetText("NoSuperior", "No superior rank"));
            stringBuilder.Append('\n');

            _ranks[0] = null;

            foreach (var rank in ranks)
            {
                var currentLine = $"`{ranksCounter}` -  {rank.InGameName} {CommandContext.Guild.GetRole(rank.DiscordRoleId).Mention}\n";
                if (currentLine.Length + stringBuilder.Length > 1024)
                {
                    builder.AddField(LocalizationGroup.GetText("RanksField", "Ranks") + " #" + fieldsCounter, stringBuilder.ToString());
                    stringBuilder.Clear();
                    fieldsCounter++;
                }

                stringBuilder.Append(currentLine);

                _ranks[ranksCounter] = rank.Id;

                ranksCounter++;
            }
        }

        if (stringBuilder.Length == 0)
        {
            stringBuilder.Append("\u200D");
        }

        builder.AddField(LocalizationGroup.GetText("RanksField", "Ranks") + " #" + fieldsCounter, stringBuilder.ToString());

        return(builder);
    }
Exemple #14
0
    /// <summary>
    /// Returns the reactions which should be added to the message
    /// </summary>
    /// <returns>Reactions</returns>
    public override IReadOnlyList <ReactionData <bool> > GetReactions()
    {
        return(_reactions ??= new List <ReactionData <bool> >
        {
            new ()
            {
                Emoji = DiscordEmojiService.GetAddEmoji(CommandContext.Client),
                CommandText = LocalizationGroup.GetFormattedText("AddUserCommand", "{0} Add user", DiscordEmojiService.GetAddEmoji(CommandContext.Client)),
                Func = async() =>
                {
                    var members = await RunSubElement <CalendarAddParticipantsDialogElement, List <DiscordMember> >().ConfigureAwait(false);

                    if (members != null)
                    {
                        foreach (var member in members)
                        {
                            if (_data.Participants.Any(obj => obj.Member.Id == member.Id) == false)
                            {
                                _data.Participants.Add(new CalendarAppointmentParticipantData
                                {
                                    Member = member,
                                    IsLeader = false
                                });
                            }
                        }
                    }

                    return true;
                }
            },
Exemple #15
0
    /// <summary>
    /// Editing the embedded message
    /// </summary>
    /// <param name="builder">Builder</param>
    /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
    public override async Task EditMessage(DiscordEmbedBuilder builder)
    {
        builder.WithTitle(LocalizationGroup.GetText("ChooseCommandTitle", "Account configuration"));
        builder.WithDescription(LocalizationGroup.GetText("ChooseCommandDescription", "With this assistant you are able to configure your Guild Wars 2 account configuration."));

        using (var dbFactory = RepositoryFactory.CreateInstance())
        {
            var name = DialogContext.GetValue <string>("AccountName");

            var data = await dbFactory.GetRepository <AccountRepository>()
                       .GetQuery()
                       .Where(obj => obj.User.DiscordAccounts.Any(obj2 => obj2.Id == CommandContext.User.Id) &&
                              obj.Name == name)
                       .Select(obj => new
            {
                obj.Name,
                IsApiKeyAvailable = obj.ApiKey != null,
                obj.DpsReportUserToken,
            })
                       .FirstAsync()
                       .ConfigureAwait(false);

            var stringBuilder = new StringBuilder();

            stringBuilder.AppendLine($"{Formatter.InlineCode(LocalizationGroup.GetText("Name", "Name"))}: {data.Name}");
            stringBuilder.AppendLine($"{Formatter.InlineCode(LocalizationGroup.GetText("IsApiKeyAvailable", "Api Key"))}: {(data.IsApiKeyAvailable ? DiscordEmojiService.GetCheckEmoji(CommandContext.Client) : DiscordEmojiService.GetCrossEmoji(CommandContext.Client))}");
            stringBuilder.AppendLine($"{Formatter.InlineCode(LocalizationGroup.GetText("DpsReportUserToken", "dps.report user token"))}: {(string.IsNullOrWhiteSpace(data.DpsReportUserToken) ? DiscordEmojiService.GetCrossEmoji(CommandContext.Client) : data.DpsReportUserToken)}");

            builder.AddField(LocalizationGroup.GetText("Data", "Data"), stringBuilder.ToString());
        }
    }
Exemple #16
0
    /// <summary>
    /// Editing the embedded message
    /// </summary>
    /// <param name="builder">Builder</param>
    /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
    public override async Task EditMessage(DiscordEmbedBuilder builder)
    {
        builder.WithTitle(LocalizationGroup.GetText("ChooseCommandTitle", "Special rank configuration"));
        builder.WithDescription(LocalizationGroup.GetText("ChooseCommandDescription", "With this assistant you are able to configure the special rank."));

        using (var dbFactory = RepositoryFactory.CreateInstance())
        {
            var rankId = DialogContext.GetValue <long>("RankId");

            var data = await dbFactory.GetRepository <GuildSpecialRankConfigurationRepository>()
                       .GetQuery()
                       .Where(obj => obj.Id == rankId)
                       .Select(obj => new
            {
                obj.Description,
                obj.DiscordRoleId,
                obj.MaximumPoints,
                obj.GrantThreshold,
                obj.RemoveThreshold,
                Roles = obj.GuildSpecialRankRoleAssignments
                        .Select(obj2 => new
                {
                    obj2.DiscordRoleId,
                    obj2.Points
                }),
                IgnoreRoles = obj.GuildSpecialRankIgnoreRoleAssignments
                              .Select(obj => obj.DiscordRoleId)
            })
                       .FirstAsync()
                       .ConfigureAwait(false);

            var fieldBuilder = new StringBuilder();
            fieldBuilder.AppendLine($"{Formatter.Bold(LocalizationGroup.GetText("Description", "Description"))}: {data.Description}");
            fieldBuilder.AppendLine($"{Formatter.Bold(LocalizationGroup.GetText("DiscordRole", "Discord role"))}: {CommandContext.Guild.GetRole(data.DiscordRoleId).Mention}");
            fieldBuilder.AppendLine($"{Formatter.Bold(LocalizationGroup.GetText("MaximumPoints", "Maximum points"))}: {data.MaximumPoints.ToString(LocalizationGroup.CultureInfo)}");
            fieldBuilder.AppendLine($"{Formatter.Bold(LocalizationGroup.GetText("GrantThreshold", "Grant threshold"))}: {data.GrantThreshold.ToString(LocalizationGroup.CultureInfo)}");
            fieldBuilder.AppendLine($"{Formatter.Bold(LocalizationGroup.GetText("RemoveThreshold", "Remove threshold"))}: {data.RemoveThreshold.ToString(LocalizationGroup.CultureInfo)}");
            builder.AddField(LocalizationGroup.GetText("General", "General"), fieldBuilder.ToString());

            fieldBuilder.Clear();

            foreach (var role in data.Roles)
            {
                fieldBuilder.AppendLine($"{CommandContext.Guild.GetRole(role.DiscordRoleId).Mention}: {role.Points.ToString(LocalizationGroup.CultureInfo)}");
            }

            fieldBuilder.Append("\u200B");
            builder.AddField(LocalizationGroup.GetText("Roles", "Point roles"), fieldBuilder.ToString());

            fieldBuilder.Clear();

            foreach (var role in data.IgnoreRoles)
            {
                fieldBuilder.AppendLine(CommandContext.Guild.GetRole(role).Mention);
            }

            fieldBuilder.Append("\u200B");
            builder.AddField(LocalizationGroup.GetText("IgnoreRoles", "Ignore roles"), fieldBuilder.ToString());
        }
    }
Exemple #17
0
    /// <summary>
    /// Editing the embedded message
    /// </summary>
    /// <param name="builder">Builder</param>
    /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
    public override Task EditMessage(DiscordEmbedBuilder builder)
    {
        builder.WithTitle(LocalizationGroup.GetText("Title", "Raid day selection"));
        builder.WithDescription(LocalizationGroup.GetText("Description", "Please choose the day of the week:"));

        return(Task.CompletedTask);
    }
Exemple #18
0
    /// <summary>
    /// Setting up the calendar
    /// </summary>
    /// <param name="commandContext">Command context</param>
    /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
    public async Task SetupMotd(CommandContextContainer commandContext)
    {
        var message = await commandContext.Channel
                      .SendMessageAsync(LocalizationGroup.GetText("MotdBuilding", "The message of the day will be build with the next refresh."))
                      .ConfigureAwait(false);

        using (var dbFactory = RepositoryFactory.CreateInstance())
        {
            var guildId = dbFactory.GetRepository <GuildRepository>()
                          .GetQuery()
                          .Where(obj => obj.DiscordServerId == commandContext.Guild.Id)
                          .Select(obj => obj.Id)
                          .FirstOrDefault();

            if (guildId > 0)
            {
                if (dbFactory.GetRepository <GuildChannelConfigurationRepository>()
                    .AddOrRefresh(obj => obj.GuildId == guildId &&
                                  obj.Type == GuildChannelConfigurationType.CalendarMessageOfTheDay,
                                  obj =>
                {
                    obj.Type = GuildChannelConfigurationType.CalendarMessageOfTheDay;
                    obj.DiscordChannelId = commandContext.Channel.Id;
                    obj.DiscordMessageId = message.Id;
                }))
                {
                    await _calendarScheduleService.CreateAppointments(commandContext.Guild.Id)
                    .ConfigureAwait(false);

                    await _calendarMessageBuilderService.RefreshMotds(commandContext.Guild.Id)
                    .ConfigureAwait(false);
                }
            }
        }
    }
Exemple #19
0
 /// <summary>
 /// Member joined
 /// </summary>
 /// <param name="discordChannel">Discord channel</param>
 /// <param name="entry">Entry</param>
 /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
 private async Task OnJoined(DiscordChannel discordChannel, GuildLogEntry entry)
 {
     if (discordChannel != null)
     {
         await discordChannel.SendMessageAsync(LocalizationGroup.GetFormattedText("MemberJoined", "**{0}** joined the guild.", entry.User))
         .ConfigureAwait(false);
     }
 }
Exemple #20
0
    /// <summary>
    /// Creates a new default help formatter.
    /// </summary>
    /// <param name="ctx">Context in which this formatter is being invoked.</param>
    /// <param name="localizationService">Localization service</param>
    public HelpCommandFormatter(CommandContext ctx, LocalizationService localizationService)
        : base(ctx)
    {
        _localizationGroup = localizationService.GetGroup(GetType().Name);

        _embedBuilder = new DiscordEmbedBuilder().WithTitle(_localizationGroup.GetText("Help", "Help"))
                        .WithColor(DiscordColor.MidnightBlue);
    }
Exemple #21
0
    /// <summary>
    /// Editing the embedded message
    /// </summary>
    /// <param name="builder">Builder</param>
    /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
    public override async Task EditMessage(DiscordEmbedBuilder builder)
    {
        builder.WithTitle(LocalizationGroup.GetText("CommitTitle", "Participants"));
        builder.WithDescription(LocalizationGroup.GetText("CommitText", "The following participants are recorded:"));
        builder.WithColor(DiscordColor.Green);
        builder.WithFooter("Scruffy", "https://cdn.discordapp.com/app-icons/838381119585648650/823930922cbe1e5a9fa8552ed4b2a392.png?size=64");
        builder.WithTimestamp(DateTime.Now);

        var message = new StringBuilder();

        if (_data.Participants == null)
        {
            _data.Participants = new List <CalendarAppointmentParticipantData>();

            using (var dbFactory = RepositoryFactory.CreateInstance())
            {
                foreach (var entry in dbFactory.GetRepository <CalendarAppointmentParticipantRepository>()
                         .GetQuery()
                         .Where(obj => obj.AppointmentId == _data.AppointmentId)
                         .Select(obj => new
                {
                    UserId = obj.User
                             .DiscordAccounts
                             .Select(obj2 => obj2.Id)
                             .FirstOrDefault(),
                    obj.IsLeader
                }))
                {
                    _data.Participants.Add(new CalendarAppointmentParticipantData
                    {
                        Member = await CommandContext.Guild
                                 .GetMemberAsync(entry.UserId)
                                 .ConfigureAwait(false),
                        IsLeader = entry.IsLeader
                    });
                }
            }
        }

        foreach (var entry in _data.Participants
                 .OrderBy(obj => obj.Member.TryGetDisplayName()))
        {
            message.Append($"> {entry.Member.Mention}");

            if (entry.IsLeader)
            {
                message.Append(' ');
                message.Append(DiscordEmojiService.GetStarEmoji(CommandContext.Client));
            }

            message.Append('\n');
        }

        message.AppendLine("\u200b");

        builder.AddField($"{LocalizationGroup.GetText("Participants", "Participants")} ({_data.Participants.Count})", message.ToString());
    }
Exemple #22
0
    /// <summary>
    /// Return a group by the given key
    /// </summary>
    /// <param name="key">Key</param>
    /// <returns>The <see cref="LocalizationGroup"/> matching the given key.</returns>
    public LocalizationGroup GetGroup(string key)
    {
        if (_groups.TryGetValue(key, out var group) == false)
        {
            group = new LocalizationGroup(this);
        }

        return(group);
    }
Exemple #23
0
    /// <summary>
    /// Return the message of element
    /// </summary>
    /// <returns>Message</returns>
    public override DiscordEmbedBuilder GetMessage()
    {
        var builder = new DiscordEmbedBuilder();

        builder.WithTitle(LocalizationGroup.GetText("ChooseTitle", "In game rank selection"));
        builder.WithDescription(LocalizationGroup.GetText("ChooseDescription", "Please choose one of the following ranks:"));

        _ranks = new Dictionary <int, string>();
        var stringBuilder = new StringBuilder();

        var ranksCounter  = 1;
        var fieldsCounter = 1;

        using (var dbFactory = RepositoryFactory.CreateInstance())
        {
            var guild = dbFactory.GetRepository <GuildRepository>()
                        .GetQuery()
                        .Where(obj => obj.DiscordServerId == CommandContext.Guild.Id)
                        .Select(obj => new
            {
                obj.GuildId,
                obj.ApiKey
            })
                        .First();

            var connector = new GuidWars2ApiConnector(guild.ApiKey);

            foreach (var rank in connector.GetGuildRanks(guild.GuildId)
                     .Result
                     .OrderBy(obj => obj.Order))
            {
                var currentLine = $"`{ranksCounter}` -  {rank.Id}\n";
                if (currentLine.Length + stringBuilder.Length > 1024)
                {
                    builder.AddField(LocalizationGroup.GetText("RanksField", "Ranks") + " #" + fieldsCounter, stringBuilder.ToString());
                    stringBuilder.Clear();
                    fieldsCounter++;
                }

                stringBuilder.Append(currentLine);

                _ranks[ranksCounter] = rank.Id;

                ranksCounter++;
            }
        }

        if (stringBuilder.Length == 0)
        {
            stringBuilder.Append("\u200D");
        }

        builder.AddField(LocalizationGroup.GetText("RanksField", "Ranks") + " #" + fieldsCounter, stringBuilder.ToString());

        return(builder);
    }
Exemple #24
0
    /// <summary>
    /// Return the message of element
    /// </summary>
    /// <returns>Message</returns>
    public override DiscordEmbedBuilder GetMessage()
    {
        var builder = new DiscordEmbedBuilder();

        builder.WithTitle(LocalizationGroup.GetText("ChooseLevelTitle", "Raid role selection"));
        builder.WithDescription(LocalizationGroup.GetText("ChooseLevelDescription", "Please choose one of the following roles:"));

        _roles = new Dictionary <int, long?>();
        var levelsFieldsText = new StringBuilder();

        using (var dbFactory = RepositoryFactory.CreateInstance())
        {
            var mainRoles = dbFactory.GetRepository <RaidRoleRepository>()
                            .GetQuery()
                            .Where(obj => obj.MainRoleId == _mainRoleId &&
                                   obj.IsDeleted == false)
                            .Select(obj => new
            {
                obj.Id,
                obj.Description,
                obj.DiscordEmojiId
            })
                            .OrderBy(obj => obj.Description)
                            .ToList();

            levelsFieldsText.Append("`0` - ");
            levelsFieldsText.Append(LocalizationGroup.GetText("NoRole", "No additional role"));
            levelsFieldsText.Append('\n');
            _roles[0] = null;

            var i            = 1;
            var fieldCounter = 1;

            foreach (var role in mainRoles)
            {
                var currentLine = $"`{i}` -  {DiscordEmojiService.GetGuildEmoji(CommandContext.Client, role.DiscordEmojiId)} {role.Description}{'\n'}";

                _roles[i] = role.Id;
                i++;

                if (currentLine.Length + levelsFieldsText.Length > 1024)
                {
                    builder.AddField(LocalizationGroup.GetText("RolesField", "Roles") + " #" + fieldCounter, levelsFieldsText.ToString());
                    levelsFieldsText.Clear();
                    fieldCounter++;
                }

                levelsFieldsText.Append(currentLine);
            }

            builder.AddField(LocalizationGroup.GetText("RolesField", "Roles") + " #" + fieldCounter, levelsFieldsText.ToString());
        }

        return(builder);
    }
Exemple #25
0
    /// <summary>
    /// Return the message of element
    /// </summary>
    /// <returns>Message</returns>
    public override DiscordEmbedBuilder GetMessage()
    {
        var builder = new DiscordEmbedBuilder();

        builder.WithTitle(LocalizationGroup.GetText("ChooseTitle", "Appointment selection"));
        builder.WithDescription(LocalizationGroup.GetText("ChooseDescription", "Please choose one of the following appointments:"));

        _appointments = new Dictionary <int, long>();
        var fieldText = new StringBuilder();

        using (var dbFactory = RepositoryFactory.CreateInstance())
        {
            var limit = DateTime.Now.AddMinutes(15);

            var entries = dbFactory.GetRepository <CalendarAppointmentRepository>()
                          .GetQuery()
                          .Where(obj => obj.TimeStamp < limit)
                          .Select(obj => new
            {
                obj.Id,
                obj.TimeStamp,
                obj.CalendarAppointmentTemplate.Description
            })
                          .OrderByDescending(obj => obj.TimeStamp)
                          .Take(10)
                          .ToList();

            var i = 0;
            foreach (var entry in entries)
            {
                fieldText.Append('`');
                fieldText.Append(i);
                fieldText.Append("` - ");
                fieldText.Append(' ');
                fieldText.Append(Formatter.Bold(entry.Description));
                fieldText.Append(' ');
                fieldText.Append('(');
                fieldText.Append(entry.TimeStamp.ToString("g", LocalizationGroup.CultureInfo));
                fieldText.Append(')');
                fieldText.Append('\n');

                _appointments[i] = entry.Id;

                i++;
            }

            builder.AddField(LocalizationGroup.GetText("Field", "Appointments"), fieldText.ToString());
        }

        return(builder);
    }
Exemple #26
0
    /// <summary>
    /// Refresh the message
    /// </summary>
    /// <param name="configurationId">Id of the configuration</param>
    /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
    public async Task RefreshMessageAsync(long configurationId)
    {
        using (var dbFactory = RepositoryFactory.CreateInstance())
        {
            var from = DateTime.Today;

            var data = await dbFactory.GetRepository <FractalLfgConfigurationRepository>()
                       .GetQuery()
                       .Where(obj => obj.Id == configurationId)
                       .Select(obj => new
            {
                ChannelId = obj.DiscordChannelId,
                MessageId = obj.DiscordMessageId,
                obj.Title,
                obj.Description,
                Registrations = obj.FractalRegistrations
                                .Select(obj2 => new
                {
                    obj2.AppointmentTimeStamp,
                    UserId = obj2.User
                             .DiscordAccounts
                             .Select(obj3 => obj3.Id)
                             .FirstOrDefault(),
                    obj2.RegistrationTimeStamp,
                })
                                .Where(obj2 => obj2.AppointmentTimeStamp > from)
            })
                       .FirstOrDefaultAsync().ConfigureAwait(false);

            if (data != null)
            {
                var registrations = data.Registrations
                                    .GroupBy(obj2 => obj2.AppointmentTimeStamp)
                                    .GroupBy(obj2 => obj2.Key.Date)
                                    .ToList();

                var messageBuilder = new DiscordEmbedBuilder
                {
                    Title       = data.Title,
                    Color       = DiscordColor.Green,
                    Description = data.Description
                };

                var stringBuilder = new StringBuilder(500);

                for (var i = 0; i < 8; i++)
                {
                    var date = DateTime.Today.AddDays(i);
                    var name = i == 0
                                   ? $"`{i} - {LocalizationGroup.GetText("Today", "Today")}`"
                                   : $"`{i} - {LocalizationGroup.CultureInfo.DateTimeFormat.GetDayName(date.DayOfWeek)[..2]}:` {date.ToString("d", LocalizationGroup.CultureInfo)}";
Exemple #27
0
    public Task Google(CommandContext commandContext, [RemainingText] string searchTerm)
    {
        return(InvokeAsync(commandContext,
                           async commandContextContainer =>
        {
            using (var customSearchService = new CustomsearchService(new BaseClientService.Initializer
            {
                ApiKey = Environment.GetEnvironmentVariable("SCRUFFY_GOOGLE_API_KEY")
            }))
            {
                var request = customSearchService.Cse.List();

                request.C2coff = "1";
                request.Cx = Environment.GetEnvironmentVariable("SCRUFFY_GOOGLE_CSE_ID");
                request.Num = 6;
                request.Q = searchTerm;
                request.Safe = CseResource.ListRequest.SafeEnum.Active;

                var resultContainer = await request.ExecuteAsync()
                                      .ConfigureAwait(false);

                if (resultContainer.Items?.Count > 0)
                {
                    var embedBuilder = new DiscordEmbedBuilder
                    {
                        Color = DiscordColor.Green
                    };

                    embedBuilder.WithTitle(LocalizationGroup.GetText("SearchResults", "Search results"));

                    foreach (var result in resultContainer.Items.Take(6))
                    {
                        embedBuilder.AddField(result.Title, Formatter.MaskedUrl(result.Snippet, new Uri(result.Link)));
                    }

                    embedBuilder.WithThumbnail("https://cdn.discordapp.com/attachments/847555191842537552/861182135000236032/google.png");
                    embedBuilder.WithFooter("Scruffy", "https://cdn.discordapp.com/app-icons/838381119585648650/823930922cbe1e5a9fa8552ed4b2a392.png?size=64");
                    embedBuilder.WithTimestamp(DateTime.Now);

                    await commandContext.RespondAsync(embedBuilder)
                    .ConfigureAwait(false);
                }
                else
                {
                    await commandContext.RespondAsync(LocalizationGroup.GetText("NoResults", "I couldn't find anything."))
                    .ConfigureAwait(false);
                }
            }
        }));
    }
Exemple #28
0
    /// <summary>
    /// Return the message of element
    /// </summary>
    /// <returns>Message</returns>
    public override DiscordEmbedBuilder GetMessage()
    {
        var builder = new DiscordEmbedBuilder();

        builder.WithTitle(LocalizationGroup.GetText("ChooseLevelTitle", "Raid experience level selection"));
        builder.WithDescription(LocalizationGroup.GetText("ChooseLevelDescription", "Please choose one of the following experience levels:"));

        _levels = new Dictionary <int, long?>();
        var levelsFieldsText = new StringBuilder();

        using (var dbFactory = RepositoryFactory.CreateInstance())
        {
            var mainRoles = dbFactory.GetRepository <RaidExperienceLevelRepository>()
                            .GetQuery()
                            .Where(obj => obj.IsDeleted == false)
                            .Select(obj => new
            {
                obj.Id,
                obj.Description
            })
                            .OrderBy(obj => obj.Description)
                            .ToList();

            levelsFieldsText.Append('`');
            levelsFieldsText.Append(0);
            levelsFieldsText.Append("` - ");
            levelsFieldsText.Append(' ');
            levelsFieldsText.Append(LocalizationGroup.GetText("NoExperienceLevel", "No superior level"));
            levelsFieldsText.Append('\n');

            var i = 1;
            foreach (var role in mainRoles)
            {
                levelsFieldsText.Append('`');
                levelsFieldsText.Append(i);
                levelsFieldsText.Append("` - ");
                levelsFieldsText.Append(' ');
                levelsFieldsText.Append(role.Description);
                levelsFieldsText.Append('\n');

                _levels[i] = role.Id;

                i++;
            }

            builder.AddField(LocalizationGroup.GetText("LevelsField", "Levels"), levelsFieldsText.ToString());
        }

        return(builder);
    }
Exemple #29
0
    /// <summary>
    /// Editing a sub role
    /// </summary>
    /// <param name="commandContextContainer">Current command context</param>
    /// <param name="mainRoleId">Id of the role</param>
    /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
    private async Task RunEditSubRoleAssistantAsync(CommandContextContainer commandContextContainer, long mainRoleId)
    {
        var roleId = await SelectRoleAsync(commandContextContainer, mainRoleId).ConfigureAwait(false);

        if (roleId != null)
        {
            var builder = new DiscordEmbedBuilder();
            builder.WithTitle(LocalizationGroup.GetText("RoleEditTitle", "Raid role configuration"));

            var descriptionEmoji = DiscordEmojiService.GetEditEmoji(commandContextContainer.Client);
            var emojiEmoji       = DiscordEmojiService.GetEmojiEmoji(commandContextContainer.Client);
            var cancelEmoji      = DiscordEmojiService.GetCrossEmoji(commandContextContainer.Client);

            var commands = new StringBuilder();
            commands.AppendLine(LocalizationGroup.GetFormattedText("RoleEditEditDescriptionCommand", "{0} Edit description", descriptionEmoji));
            commands.AppendLine(LocalizationGroup.GetFormattedText("RoleEditEditEmojiCommand", "{0} Edit emoji", emojiEmoji));
            commands.AppendLine(LocalizationGroup.GetFormattedText("AssistantCancelCommand", "{0} Cancel", cancelEmoji));

            builder.AddField(LocalizationGroup.GetText("AssistantCommandsField", "Commands"), commands.ToString());

            var message = await commandContextContainer.Channel
                          .SendMessageAsync(builder)
                          .ConfigureAwait(false);

            var userReactionTask = commandContextContainer.Client
                                   .GetInteractivity()
                                   .WaitForReactionAsync(message, commandContextContainer.User);

            await message.CreateReactionAsync(descriptionEmoji).ConfigureAwait(false);

            await message.CreateReactionAsync(emojiEmoji).ConfigureAwait(false);

            await message.CreateReactionAsync(cancelEmoji).ConfigureAwait(false);

            var userReaction = await userReactionTask.ConfigureAwait(false);

            if (userReaction.TimedOut == false)
            {
                if (userReaction.Result.Emoji.Id == descriptionEmoji.Id)
                {
                    await RunEditDescriptionAssistantAsync(commandContextContainer, roleId.Value).ConfigureAwait(false);
                }
                else if (userReaction.Result.Emoji.Id == emojiEmoji.Id)
                {
                    await RunEditEmojiAssistantAsync(commandContextContainer, roleId.Value).ConfigureAwait(false);
                }
            }
        }
    }
Exemple #30
0
    /// <summary>
    /// Setting up the calendar
    /// </summary>
    /// <param name="commandContext">Command context</param>
    /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
    public async Task SetupCalendar(CommandContextContainer commandContext)
    {
        var data = await DialogHandler.RunForm <SetGuildCalendarFormData>(commandContext, true)
                   .ConfigureAwait(false);

        if (data != null)
        {
            var message = await commandContext.Channel
                          .SendMessageAsync(LocalizationGroup.GetText("CalendarBuilding", "The calendar will be build with the next refresh."))
                          .ConfigureAwait(false);

            using (var dbFactory = RepositoryFactory.CreateInstance())
            {
                var guildId = dbFactory.GetRepository <GuildRepository>()
                              .GetQuery()
                              .Where(obj => obj.DiscordServerId == commandContext.Guild.Id)
                              .Select(obj => obj.Id)
                              .FirstOrDefault();

                if (guildId > 0)
                {
                    if (dbFactory.GetRepository <GuildChannelConfigurationRepository>()
                        .AddOrRefresh(obj => obj.GuildId == guildId &&
                                      obj.Type == GuildChannelConfigurationType.CalendarOverview,
                                      obj =>
                    {
                        obj.DiscordChannelId = commandContext.Channel.Id;
                        obj.DiscordMessageId = message.Id;
                        obj.AdditionalData = JsonConvert.SerializeObject(new AdditionalCalendarChannelData
                        {
                            Title = data.Title,
                            Description = data.Description
                        });
                    }))
                    {
                        await _calendarScheduleService.CreateAppointments(commandContext.Guild.Id)
                        .ConfigureAwait(false);

                        await _calendarMessageBuilderService.RefreshMessages(commandContext.Guild.Id)
                        .ConfigureAwait(false);

                        await _calendarMessageBuilderService.RefreshMotds(commandContext.Guild.Id)
                        .ConfigureAwait(false);
                    }
                }
            }
        }
    }