public bool Equals(DiscordRoleId other) { return(Id == other.Id); }
private bool IsGameInterestRole(DiscordRoleId roleId) => _gameRoleProvider.Games .Any(m => m.GameInterestRoleId != null && m.GameInterestRoleId == roleId);
private Stream CreateBarChartImage(BarChartDrawingData barChartDrawingData, DiscordRoleId primaryGameDiscordRoleId, string[] rolesInChart) { // Collect data var game = _gameRoleProvider.Games.Single(m => m.PrimaryGameDiscordRoleId == primaryGameDiscordRoleId); var(gameMembers, roleDistribution) = _gameRoleProvider.GetGameRoleDistribution(game); roleDistribution = (from rd in roleDistribution from ric in rolesInChart where rd.Key.EndsWith(ric) select new { RoleName = ric, Count = rd.Value }) .ToDictionary(m => m.RoleName, m => m.Count); // Load background and foreground image var backgroundImage = GetImageFromResource(barChartDrawingData.BackgroundImageName); var foregroundImage = GetImageFromResource(barChartDrawingData.ForegroundImageName); // Create image return(CreateImage(BarChartDrawingData.ImageWidth, BarChartDrawingData.ImageHeight, bitmap => { using var canvas = new SKCanvas(bitmap); var arial = SKTypeface.FromFamilyName("Arial"); var arialBold = SKTypeface.FromFamilyName("Arial", SKFontStyleWeight.Bold, SKFontStyleWidth.Normal, SKFontStyleSlant.Upright); // Draw background image canvas.DrawImage(backgroundImage, 0, 0); // Draw meta info var infoFont = new SKFont(arial, 16f); var infoPaint = new SKPaint(infoFont) { Color = SKColors.Black }; var gameMembersText = $"Game Members: {gameMembers}"; var createdOnText = $"Created: {DateTime.UtcNow:yyyy-MM-dd}"; var gameMembersRequiredSize = new SKRect(); var createdOnRequiredSize = new SKRect(); infoPaint.MeasureText(gameMembersText, ref gameMembersRequiredSize); infoPaint.MeasureText(createdOnText, ref createdOnRequiredSize); var metaTopOffset = (BarChartDrawingData.ContentTopOffset - ((int)gameMembersRequiredSize.Height + (int)createdOnRequiredSize.Height + BarChartDrawingData.VerticalInfoTextMargin)) / 2 + 15; canvas.DrawText(gameMembersText, BarChartDrawingData.ImageWidth - BarChartDrawingData.HorizontalInfoTextMargin - gameMembersRequiredSize.Width, metaTopOffset, infoFont, infoPaint); metaTopOffset = metaTopOffset + (int)gameMembersRequiredSize.Height + BarChartDrawingData.VerticalInfoTextMargin; canvas.DrawText(createdOnText, BarChartDrawingData.ImageWidth - BarChartDrawingData.HorizontalInfoTextMargin - createdOnRequiredSize.Width, metaTopOffset, infoFont, infoPaint); // Data var indent = barChartDrawingData.InitialIndent; var labelFont = new SKFont(arialBold, barChartDrawingData.LabelFontSize); var amountFont = new SKFont(arialBold, 16f); double maxCount = roleDistribution.Values.Max(); foreach (var(roleName, roleCount) in roleDistribution.OrderByDescending(m => m.Value).ThenBy(m => m.Key)) { // Bar label var labelPaint = new SKPaint(labelFont) { Color = SKColors.Black }; var requiredLabelSize = new SKRect(); labelPaint.MeasureText(roleName, ref requiredLabelSize); canvas.DrawText(roleName, indent + (barChartDrawingData.IndentIncrement - requiredLabelSize.Width) / 2, BarChartDrawingData.LabelsTopOffset, labelFont, labelPaint); // Bar var barHeight = (int)(roleCount / maxCount * BarChartDrawingData.BarMaxHeight); var topOffset = BarChartDrawingData.BarTopOffset + BarChartDrawingData.BarMaxHeight - barHeight; var leftOffset = indent + (barChartDrawingData.IndentIncrement - BarChartDrawingData.BarWidth) / 2; var rightOffset = leftOffset + BarChartDrawingData.BarWidth; var bottomOffset = topOffset + barHeight; var rect = new SKRect(leftOffset, topOffset, rightOffset, bottomOffset); var barColor = barChartDrawingData.BarColors[roleName]; var barPaint = new SKPaint { Color = barColor }; canvas.DrawRect(rect, barPaint); // Amount label var amountPaint = new SKPaint(amountFont) { Color = SKColors.Black }; var amount = roleCount.ToString(CultureInfo.InvariantCulture); amountPaint.MeasureText(amount, ref requiredLabelSize); canvas.DrawText(amount, indent + (barChartDrawingData.IndentIncrement - requiredLabelSize.Width) / 2, topOffset - 10 - requiredLabelSize.Height, amountFont, amountPaint); indent += barChartDrawingData.IndentIncrement; } // Draw foreground image canvas.DrawImage(foregroundImage, 0, 0); }));
/// <summary> /// Converts the <paramref name="roleId"/> into the mention syntax. /// </summary> /// <param name="roleId">The <see cref="DiscordRoleId"/> to convert into the mention syntax.</param> /// <returns>A string that will cause a mention in Discord.</returns> public static string ToMention(this DiscordRoleId roleId) => $"<@&{roleId}>";