Пример #1
0
        public static string GetCardAsPath(CompactUser user, PixelRenderingOptions options)
        {
            string s = "e";

            s.Debug("This is where the card is sent back as a path.");
            Bitmap card = SetCard(user, options);
            string path = $"{Directory.CreateDirectory($".//data//accounts//{user.Id}//resources//").FullName}card.png";

            card.SaveBitmap(path, ImageFormat.Png);
            return(path);
        }
Пример #2
0
        public static List <CardComponent> GetCardComponents(CompactUser user)
        {
            List <CardComponent> components = new List <CardComponent>();

            /*
             *  The Rendering Limit (SIZE) of a card
             *
             *  Width: 200 pixels
             *  Height: 150 pixels
             *
             *  By default, cards render on a 2.0 scale, which enforces the limit to 300 pixels by 400px
             *
             *      300px, 400px - The discord embed limit, before pixels start becoming blurry.
             *
             *  The structure of a Card:
             *      [CALLING_CONFIG]
             *      - IsUser - A check that determines if the user itself is checking for the card,
             *          or if another user is. If another user is checking, the user that is being
             *          checked on has their name plastered in the embed of the card.
             *
             *      [CARD_CONFIG]
             *
             *      [DELAYED] - Font : The font style they wish to use.
             *
             *      - Scheme : The collection of colors used for rendering the card.
             *      - Type : The type of card that is being rendered
             *          (Is it an exp card.... level card...?)
             *
             *      [BITMAP_COMPONENTS]
             *      - Border : the outline of the card they use to display.
             *      - Backdrop : the backdrop used behind the card.
             *
             *      [INFO_COMPONENTS] - At least one component has to exist.
             *      - Avatar : the icon of a user, or guild.
             *      - Username/Nickname : the name of a user/guild.
             *      - Activity/State : the current activity being played, or online status.
             *      - Status : the status of the user from their status, or online prescence.
             *      - Balance : How much the user currently has.
             *      - Level : What level the user is currently at.
             *      - Experience Bar : the percentage of the completion that the user is on that level.
             *      - Merit : the merit a user probably has chosen to display.
             *
             *
             *
             *
             *
             *
             *
             */
            return(components);
        }
Пример #3
0
        public static Bitmap SetCard(CompactUser u, PixelRenderingOptions options)
        {
            string s = "e";

            s.Debug("This is where the card is being built.");
            // Set the default attributes.
            Bitmap template    = new Bitmap(Locator.ProfileTemplate);
            Bitmap currencyMap = new Bitmap(Locator.CurrencySheet);
            Bitmap iconMap     = new Bitmap(Locator.IconSheet);

            Bitmap tmp = new Bitmap(template.Width, template.Height, template.PixelFormat);

            // Build the display card.
            using (Graphics g = Graphics.FromImage(tmp))
            {
                // Gets the letter rendering options for the username.
                LetterRenderingOptions config = new LetterRenderingOptions(u.Username);
                // Gets the status rendering options.
                StatusRenderingOptions status = new StatusRenderingOptions(u.Status);

                // Reduce the need for constant image opening.
                // This will help reduce constant rebuilding.

                // Size: 150px by 200px.
                // Border: 2px empty
                // 2px pixels
                // 2px empty
                // everything after can be placed.

                // Actual Size: 138px by 188px
                // actual starting x: 6px
                // actual starting y: 6px;
                // actual width: 144px
                // actual height 194px

                int padding     = 2;                         // 2px
                int lineWidth   = 2;                         // 2px
                int borderWidth = (2 * padding) + lineWidth; // 6px
                int avatarWidth = 32;                        // 32px

                // This is the vertical position of where the level and currency need to be.
                // This gets the username size, and shifts it down based on size.
                // This also gets shifted down by the current activity or state.


                Point defaultPoint = new Point(borderWidth, borderWidth);

                // The space after the starting border and avatar, with a 2px padding.
                int afterAvatarX = defaultPoint.X + avatarWidth + padding;

                Point usernamePoint = new Point(afterAvatarX, defaultPoint.Y);
                // This is the base board plus the font size plus padding.
                int usernameHeight = borderWidth + config.Spacing + padding; // 6 + spacing + 2



                int   activityTextSize = 4; // 4px;
                Point activityPoint    = new Point(afterAvatarX, usernameHeight);

                // The position at which the user name is written.
                // Font size used for activity is 4px.
                // To make a new line, it would be 4px + padding.
                int afterFirstActivity = activityPoint.Y + activityTextSize + padding;

                // This is where the second activity line would be placed if one exists
                bool hasSecondActivity = false;

                // this is where you want to see if there's an activity.

                // this sets the text to render.
                string firstActivity = "";                          // the first line for the activity to render.

                int firstActivityTextLimit  = 32;                   // Only 32 letters may be rendered per line.
                int secondActivityTextLimit = 32;                   // Only 32 letters may be rendered per line.

                string secondActivity = "";                         // the second line for the activity to render.
                if (u.Activity.Exists())
                {                                                   // activity does exist
                    firstActivity = u.Activity.Type.ToTypeString(); // Playing, Listening, etc.
                    // deduct the length of the playing type from the limit of the first line.
                    firstActivityTextLimit -= firstActivity.Length;
                    // get the activity name, and check if the name is longer than the limit
                    // if so, set hasSecondActivity to true
                    // and set the second activity text to 32;
                }
                else
                {
                    firstActivity = status.State;
                }



                int   secondActivityX     = afterAvatarX;
                Point secondActivityPoint = new Point(afterAvatarX, afterFirstActivity);

                // The y position of the level balance point after a second activity, if any.
                // 2px padding as default, with 1px added to help make it look nicer.
                int afterSecondActivity = secondActivityPoint.Y + padding + 1;

                // The + 1px is for another layer of padding.
                Point levelBalancePoint =
                    hasSecondActivity ?
                    new Point(afterAvatarX, afterSecondActivity) :
                    new Point(secondActivityPoint.X, secondActivityPoint.Y + 1);


                // This places the identifying state as a visual bar.
                // x: 6px
                // y: 6px + 32px + 1px : 39px // padding should only be one px.
                Point statusBarPoint = new Point(defaultPoint.X, defaultPoint.Y + avatarWidth + 1);


                // Places the template built before this method.

                /*using (Bitmap b = template)
                 * {
                 *  g.DrawImage(b, b.ToRectangle());
                 *  template.Dispose();
                 * }*/
                var borderBrush = new SolidBrush(options.Palette[0]);


                // Size: 150px by 200px.
                // Border: 2px empty
                // 2px pixels
                // 2px empty
                // everything after can be placed.

                // Actual Size: 138px by 188px
                // actual starting x: 6px
                // actual starting y: 6px;
                // actual width: 144px
                // actual height 194px

                // 47 pixels tall - 2px padding on both ends = 43px tall

                // LEFT BORDER
                Rectangle lBorder = new Rectangle(2, 2, 2, 43);

                g.SetClip(lBorder);
                g.FillRectangle(borderBrush, lBorder);

                // RIGHT BORDER
                Rectangle rBorder = new Rectangle(196, 2, 2, 43);

                g.SetClip(rBorder);
                g.FillRectangle(borderBrush, rBorder);

                // TOP BORDER
                Rectangle tBorder = new Rectangle(2, 2, 196, 2);

                g.SetClip(tBorder);
                g.FillRectangle(borderBrush, tBorder);

                // BOTTOM BORDER
                Rectangle bBorder = new Rectangle(2, 43, 196, 2);

                g.SetClip(bBorder);
                g.FillRectangle(borderBrush, bBorder);

                g.ResetClip();

                borderBrush.Dispose();

                // Avatar: 32px by 32px
                // Draw the Avatar onto the graphics.
                using (Bitmap b = Pixelate(u.Avatar, options))
                {
                    g.DrawImage(b, defaultPoint);
                    u.Avatar.Dispose();
                }

                // Place user status bar.
                SetStatus(g, statusBarPoint, status);

                // Place username.
                TextConfiguration.PixelateText(u.Username, usernamePoint, config.Size, tmp, options);

                // Place activity, or state if not doing anything.

                // Place current level.
                // Place icon

                /*using (Bitmap b = iconMap)
                 * {
                 *  // crops the sprite map icon to get the level icon.
                 *  Rectangle levelCrop = new Rectangle(0, 0, 4, iconMap.Height);
                 *  Rectangle coinCrop = new Rectangle(8, 0, iconMap.Height, iconMap.Height);
                 *
                 *  Bitmap icon = iconMap.Clone(levelCrop, iconMap.PixelFormat);
                 *  Bitmap coin = iconMap.Clone(coinCrop, iconMap.PixelFormat);
                 *
                 *  levelBalancePoint.Y -= activityTextSize + padding;
                 *  Rectangle iconSpot = new Rectangle(levelBalancePoint, icon.Size);
                 *  Point balancePoint = new Point(levelBalancePoint.X + 8, levelBalancePoint.Y);
                 *  Rectangle coinSpot = new Rectangle(balancePoint, coin.Size);
                 *
                 *  g.SetClip(iconSpot);
                 *  g.DrawImage(icon, iconSpot);
                 *  g.SetClip(coinSpot);
                 *  g.DrawImage(coin, coinSpot);
                 *
                 *  iconMap.Dispose();
                 *
                 *  // get the position of the level
                 *  // get the position of the coin
                 *  // build.
                 * }*/


                // Place current balance.
                // Place coin icon
                // then place the money amount
                // and if needed, the icon of the money amount.

                // Place experience bar, with the percentage to the next level.
                // first, get the point of where the experience bar is painted.
                // get the width of the experience bar based on the width of the level
                // divide the pixels into segments
                // divide the experience by the segments
                // if experience is higher than a segment, paint.
                // otherwise, leave empty.

                // Close off the entire image, and scale.

                // Send.
            }

            tmp = tmp.Resize(options.Scale);

            return(tmp);
        }