Example #1
0
        private async Task <MemoryStream> CreateCharacterCard(CharacterModel character, FreeCompanyModel freeCompany)
        {
            string cardFilePath = Path.Combine(Environment.CurrentDirectory, "Images/character_card.png");

            if (!File.Exists(cardFilePath))
            {
                Logger.Error($"Unabled to located card file. Looked for it at {cardFilePath}");
                return(null);
            }

            XIVTitleModel title = await _db.XIVTitles.FirstOrDefaultAsync(t => t.ID == character.Title);

            ClassJobIndex activeJob = (ClassJobIndex)character.ActiveClassJob.JobID;

            using (var card = Bitmap.FromFile(cardFilePath))
            {
                using (var g = Graphics.FromImage(card))
                {
                    Font nameFont = new Font("Russo One", 40, GraphicsUnit.Pixel);
                    Font jobFont  = new Font("Russo One", 30, GraphicsUnit.Pixel);
                    Font baseFont = new Font("Russo One", 20, GraphicsUnit.Pixel);


                    SolidBrush whiteBrush = new SolidBrush(System.Drawing.Color.White);
                    SolidBrush goldBrush  = new SolidBrush(System.Drawing.Color.FromArgb(148, 134, 90));

                    StringFormat centerCenterFormat = new StringFormat();
                    centerCenterFormat.Alignment     = StringAlignment.Center;
                    centerCenterFormat.LineAlignment = StringAlignment.Center;

                    StringFormat leftCenterFormat = new StringFormat();
                    leftCenterFormat.Alignment     = StringAlignment.Near;
                    leftCenterFormat.LineAlignment = StringAlignment.Center;

                    StringFormat leftTopFormat = new StringFormat();
                    leftTopFormat.Alignment     = StringAlignment.Near;
                    leftTopFormat.LineAlignment = StringAlignment.Near;

                    StringFormat leftBottomFormat = new StringFormat();
                    leftBottomFormat.Alignment     = StringAlignment.Near;
                    leftBottomFormat.LineAlignment = StringAlignment.Far;

                    using (var client = new HttpClient())
                    {
                        var response = await client.GetAsync(character.Portrait);

                        if (response != null && response.StatusCode == HttpStatusCode.OK)
                        {
                            using (var stream = await response.Content.ReadAsStreamAsync())
                            {
                                MemoryStream tempStream = new MemoryStream();
                                await stream.CopyToAsync(tempStream);

                                tempStream.Position = 0;

                                using (var portrait = Bitmap.FromStream(tempStream))
                                {
                                    g.DrawImage(portrait, new Rectangle(14, 14, 640, 873));
                                }
                            }
                        }
                    }

                    string portraitBorderFilePath = Path.Combine(Environment.CurrentDirectory, "Images/portrait_border.png");

                    if (File.Exists(portraitBorderFilePath))
                    {
                        using (var jobIcon = Bitmap.FromFile(portraitBorderFilePath))
                        {
                            g.DrawImage(jobIcon, 14, 14, 640, 640);
                        }
                    }

                    //  Title
                    if (title != null)
                    {
                        g.DrawString(title.Name, baseFont, whiteBrush, new Rectangle(714, 32, 542, 63), leftTopFormat);
                    }

                    //  Name
                    g.DrawString(character.Name, nameFont, goldBrush, new Rectangle(709, 50, 542, 45), leftTopFormat);

                    //  Server
                    g.DrawString(character.Server, baseFont, whiteBrush, new Rectangle(714, 132, 542, 34), leftCenterFormat);

                    //  Free Company
                    if (freeCompany != null)
                    {
                        g.DrawString($"{freeCompany.Name} <{freeCompany.Tag}>", baseFont, whiteBrush, new Rectangle(714, 201, 542, 34), leftCenterFormat);
                    }
                    else
                    {
                        g.DrawString("-", baseFont, whiteBrush, new Rectangle(714, 201, 542, 34), leftCenterFormat);
                    }

                    string jobIconFilePath = ClassJobUtilities.ClassJobToAbbr(activeJob);

                    if (!string.IsNullOrEmpty(jobIconFilePath))
                    {
                        jobIconFilePath = Path.Combine(Environment.CurrentDirectory, $"Images/Icons/{jobIconFilePath}.png");

                        if (File.Exists(jobIconFilePath))
                        {
                            using (var jobIcon = Bitmap.FromFile(jobIconFilePath))
                            {
                                g.DrawImage(jobIcon, 713, 275, 24, 24);
                            }
                        }
                    }

                    //  Active Job Level
                    g.DrawString($"Level {character.ActiveClassJob.Level}", baseFont, whiteBrush, new Rectangle(739, 270, 120, 34), leftCenterFormat);

                    //  Active Job
                    g.DrawString(ClassJobUtilities.ClassJobToName(activeJob), baseFont, goldBrush, new Rectangle(835, 270, 169, 34), leftCenterFormat);

                    //  Paladin
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Paladin).Level}", jobFont, whiteBrush, new Rectangle(710, 388, 55, 55), centerCenterFormat);

                    //  Warrior
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Warrior).Level}", jobFont, whiteBrush, new Rectangle(780, 388, 55, 55), centerCenterFormat);

                    //  Dark Knight
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.DarkKnight).Level}", jobFont, whiteBrush, new Rectangle(850, 388, 55, 55), centerCenterFormat);

                    //  Gunbreaker
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Gunbreaker).Level}", jobFont, whiteBrush, new Rectangle(920, 388, 55, 55), centerCenterFormat);

                    //  Whitemage
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.WhiteMage).Level}", jobFont, whiteBrush, new Rectangle(1060, 388, 55, 55), centerCenterFormat);

                    //  Scholar
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Scholar).Level}", jobFont, whiteBrush, new Rectangle(1130, 388, 55, 55), centerCenterFormat);

                    //  Astro
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Astrologian).Level}", jobFont, whiteBrush, new Rectangle(1200, 388, 55, 55), centerCenterFormat);

                    //  Monk
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Monk).Level}", jobFont, whiteBrush, new Rectangle(710, 498, 55, 55), centerCenterFormat);

                    //  Dragoon
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Dragoon).Level}", jobFont, whiteBrush, new Rectangle(780, 498, 55, 55), centerCenterFormat);

                    //  Ninja
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Ninja).Level}", jobFont, whiteBrush, new Rectangle(850, 498, 55, 55), centerCenterFormat);
                    //  Samurai
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Samurai).Level}", jobFont, whiteBrush, new Rectangle(920, 498, 55, 55), centerCenterFormat);

                    //  Bard
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Bard).Level}", jobFont, whiteBrush, new Rectangle(1060, 498, 55, 55), centerCenterFormat);

                    //  Machinist
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Machinist).Level}", jobFont, whiteBrush, new Rectangle(1130, 498, 55, 55), centerCenterFormat);

                    //  Dancer
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Dancer).Level}", jobFont, whiteBrush, new Rectangle(1200, 498, 55, 55), centerCenterFormat);

                    //  Black Mage
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.BlackMage).Level}", jobFont, whiteBrush, new Rectangle(710, 608, 55, 55), centerCenterFormat);

                    //  Summoner
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Summoner).Level}", jobFont, whiteBrush, new Rectangle(780, 608, 55, 55), centerCenterFormat);

                    //  Red Mage
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.RedMage).Level}", jobFont, whiteBrush, new Rectangle(850, 608, 55, 55), centerCenterFormat);

                    //  Blue Mage
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.BlueMage).Level}", jobFont, whiteBrush, new Rectangle(1060, 608, 55, 55), centerCenterFormat);

                    //  Carpenter
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Carpenter).Level}", jobFont, whiteBrush, new Rectangle(710, 718, 55, 55), centerCenterFormat);

                    //  Blacksmith
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Blacksmith).Level}", jobFont, whiteBrush, new Rectangle(780, 718, 55, 55), centerCenterFormat);

                    //  Armorer
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Armorer).Level}", jobFont, whiteBrush, new Rectangle(850, 718, 55, 55), centerCenterFormat);

                    //  Goldsmith
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Goldsmith).Level}", jobFont, whiteBrush, new Rectangle(920, 718, 55, 55), centerCenterFormat);

                    //  Leatherworker
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Leatherworker).Level}", jobFont, whiteBrush, new Rectangle(990, 718, 55, 55), centerCenterFormat);

                    //  Weaver
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Weaver).Level}", jobFont, whiteBrush, new Rectangle(1060, 718, 55, 55), centerCenterFormat);

                    //  Alchemist
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Alchemist).Level}", jobFont, whiteBrush, new Rectangle(1130, 718, 55, 55), centerCenterFormat);

                    //  Culinarian
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Culinarian).Level}", jobFont, whiteBrush, new Rectangle(1200, 718, 55, 55), centerCenterFormat);

                    //  Miner
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Miner).Level}", jobFont, whiteBrush, new Rectangle(710, 828, 55, 55), centerCenterFormat);

                    //  Botanist
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Botanist).Level}", jobFont, whiteBrush, new Rectangle(780, 828, 55, 55), centerCenterFormat);

                    //  Fisher
                    g.DrawString($"{character.ClassJobs.First(x => x.JobID == (int)ClassJobIndex.Fisher).Level}", jobFont, whiteBrush, new Rectangle(850, 828, 55, 55), centerCenterFormat);
                }

                MemoryStream memoryStream = new MemoryStream();

                card.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png);

                //card.Save(@"C:\Users\Dart\Desktop\saved_card.png");
                return(memoryStream);
            }
        }
 public static string ClassJobToAbbr(ClassJobIndex classJob) => classJob switch
 {