public bool Equals(DiscordRoleId other)
 {
     return(Id == other.Id);
 }
Beispiel #2
0
 private bool IsGameInterestRole(DiscordRoleId roleId) =>
 _gameRoleProvider.Games
 .Any(m => m.GameInterestRoleId != null && m.GameInterestRoleId == roleId);
Beispiel #3
0
    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);
        }));
Beispiel #4
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}>";