public async Task HeadpatCommand([Optional] IGuildUser User) { if (User == null) { User = Context.Guild.GetUser(Context.User.Id); } string NameOfUser = Regex.Replace(User.Username, "[^a-zA-Z]", "", RegexOptions.Compiled); if (NameOfUser.Length < 2) { NameOfUser = "******"; } string ImageCacheDir = Path.Combine(Directory.GetCurrentDirectory(), "ImageCache"); if (!Directory.Exists(ImageCacheDir)) { Directory.CreateDirectory(ImageCacheDir); } string FilePath = Path.Join(ImageCacheDir, $"{NameOfUser}.gif"); using (AnimatedGifCreator Gif = AnimatedGif.AnimatedGif.Create(FilePath, 80)) { string[] Files = Directory.GetFiles(FunConfiguration.HeadpatsDir, "*.png", SearchOption.AllDirectories); using WebClient WebClient = new(); using MemoryStream MemoryStream = new(WebClient.DownloadData(User.GetTrueAvatarUrl())); using Image PFPImage = Image.FromStream(MemoryStream); for (int Index = 0; Index < Files.Length; Index++) { using Image Headpat = Image.FromFile(Files[Index]); using Bitmap DrawnImage = new(Headpat.Width, Headpat.Height); List <ushort> HeadpatPos = FunConfiguration.HeadpatPositions[Index]; using (Graphics Graphics = Graphics.FromImage(DrawnImage)) { Graphics.DrawImage(PFPImage, HeadpatPos[0], HeadpatPos[1], HeadpatPos[2], HeadpatPos[3]); Graphics.DrawImage(Headpat, 0, 0); } await Gif.AddFrameAsync(DrawnImage, delay : -1, quality : GifQuality.Bit8); } } using (Discord.Image EmoteImage = new (FilePath)) { IGuild Guild = DiscordSocketClient.GetGuild(FunConfiguration.HeadpatStorageGuild); Console.WriteLine(NameOfUser.Length); Console.WriteLine(EmoteImage); GuildEmote PrevEmote = Guild.Emotes.Where(Emote => Emote.Name == NameOfUser).FirstOrDefault(); if (PrevEmote != null) { await Guild.DeleteEmoteAsync(PrevEmote); } GuildEmote Emote = await Guild.CreateEmoteAsync(NameOfUser, EmoteImage); DiscordWebhookClient Webhook = await CreateOrGetWebhook(Context.Channel.Id, FunConfiguration.HeadpatWebhookName); await Webhook.SendMessageAsync( Emote.ToString(), username : string.IsNullOrEmpty(Context.Guild.GetUser(Context.User.Id).Nickname)?Context.User.Username : Context.Guild.GetUser(Context.User.Id).Nickname, avatarUrl : Context.User.GetTrueAvatarUrl() ); await Guild.DeleteEmoteAsync(Emote); } File.Delete(FilePath); }
public async Task Custom(string name, string fontName, string color, string fontSize, [Remainder] string text) { if (!Program.Owners.Contains(Context.User.Id)) { await Utility.SendEmbedMessage(Context, "이 커맨드를 실행할 권한이 없습니다."); return; } name = new string(name.Where(c => alpha.Contains(c.ToString())).ToArray()); if (name.Length == 1) { await Utility.SendEmbedMessage(Context, "이름이 한 글자 이하인 이모지를 만들 수 없습니다."); return; } FontFamily font = new FontFamily(fontName == "_" ? "NanumGothic" : fontName); Bitmap img = new Bitmap(512, 512); Graphics graphic = Graphics.FromImage(img); graphic.Clear(System.Drawing.Color.Transparent); graphic.InterpolationMode = InterpolationMode.High; graphic.SmoothingMode = SmoothingMode.HighQuality; graphic.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; graphic.CompositingQuality = CompositingQuality.HighQuality; int len = text.Length; float size = fontSize == "_" ? (len == 1 ? 300 : len <= 4 ? 225 : 175) : int.Parse(fontSize); GraphicsPath path = new GraphicsPath(); path.AddString(text, font, style, size, rect, format); graphic.DrawPath(pen, path); graphic.FillPath(new SolidBrush(System.Drawing.Color.FromName(color == "_" ? "White" : color)), path); graphic.Dispose(); SocketGuild guild = GetChoGuild(text[0]); if (guild == null) { await Utility.SendEmbedMessage(Context, "남은 이모지 슬롯이 없습니다."); return; } if (GetChoGuilds(text[0]).Where(g => g.Emotes.Where(e => e.Name == name).Count() != 0).Count() == 0) { if (guild.Emotes.Where(e => !e.Animated).Count() < 50) { img.Save($"img/{name}.png"); img.Dispose(); GuildEmote emote = await guild.CreateEmoteAsync(name, new Discord.Image($"img/{name}.png")); await ReplyAsync(emote.ToString()); } else { AnimatedGifEncoder e = new AnimatedGifEncoder(); e.SetTransparent(System.Drawing.Color.Black); e.Start($"img/{name}.gif"); e.SetDelay(1); e.SetRepeat(-1); e.AddFrame(img); e.AddFrame(img); e.Finish(); img.Dispose(); GuildEmote emote = await guild.CreateEmoteAsync(name, new Discord.Image($"img/{name}.gif")); await ReplyAsync(emote.ToString()); } } else { await Utility.SendEmbedMessage(Context, "이미 존재하는 이모지입니다."); } }