/// <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()); } }
/// <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); }
/// <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; } },
/// <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); }
/// <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); } }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); } } }
/// <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); } } } }
/// <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); }
/// <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); }
/// <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; } },
/// <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()); } }
/// <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()); } }
/// <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); }
/// <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); } } } }
/// <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); } }
/// <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); }
/// <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()); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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)}";
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); } } })); }
/// <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); }
/// <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); } } } }
/// <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); } } } } }