public static void Parse(GRichTextField tf, string text) { tf.emojies = EmojiTools.GetEmojis(); //给富文本设置emoji包 tf.width = tf.initWidth; tf.text = EmojiParser.inst.Parse(text); //解析string替换Emoji表情 tf.width = tf.textWidth; //宽度自适应 }
public override ValueTask <TypeParserResult <IEmoji> > ParseAsync(Parameter parameter, string value, CommandContext ctx) { var context = (AdminCommandContext)ctx; var random = context.ServiceProvider.GetRequiredService <Random>(); var validSearchableEmojis = context.Client.Guilds.Values.SelectMany(x => x.Emojis.Values).ToList(); if (!EmojiTools.TryParse(value, out var emoji)) { if (Snowflake.TryParse(value, out var id)) { emoji = validSearchableEmojis.FirstOrDefault(x => x.Id == id); } else { var matchingEmojis = validSearchableEmojis .Where(x => x.Name.Equals(value, StringComparison.OrdinalIgnoreCase)).ToList(); if (matchingEmojis.Count > 0 && !parameter.Checks.OfType <RequireGuildEmojiAttribute>().Any()) { emoji = matchingEmojis.GetRandomElement(random); } } } return(!(emoji is null) ? TypeParserResult <IEmoji> .Successful(emoji) : TypeParserResult <IEmoji> .Unsuccessful(context.Localize("emojiparser_notfound"))); }
void SendInput() { string text = textInput.text; EmojiTools.Parse(richTextField, text); //富文本解析string 替换emoji textInput.text = ""; }
private static void DrawEmoji(Graphics g, string content, List <string> emojis, Rectangle rect) { Point point = new Point(); point.X = rect.X + 5; point.Y = rect.Y + 4; foreach (string item in emojis) { if (string.IsNullOrEmpty(item)) { continue; } Image image = EmojiTools.GetBitmap(item); g.DrawImageUnscaled(image, point); point.X += image.Width; } }
void Start() { UIPackage.AddPackage("UI/EmojiDemo/EmojiDemo"); GRoot.inst.SetContentScaleFactor(1080, 1920, UIContentScaler.ScreenMatchMode.MatchWidthOrHeight); view = UIPackage.CreateObject("EmojiDemo", "EmojiDemo").asCom; view.SetSize(GRoot.inst.width, GRoot.inst.height); view.AddRelation(GRoot.inst, RelationType.Size); GRoot.inst.AddChild(view); richTextField = view.GetChild("richtext").asRichTextField; string text = "An awesome string with a few 😉emojis!"; EmojiTools.Parse(richTextField, text); textInput = view.GetChild("input").asTextInput; textInput.onFocusOut.Set(() => { SendInput(); }); }
public async Task <Stream> CreateXpImageAsync(AdminCommandContext context, CachedUser target) { var output = new MemoryStream(); try { var user = await context.Database.GetOrCreateGlobalUserAsync(target.Id); var globalUsers = await context.Database.GlobalUsers.OrderByDescending(x => x.TotalXp).ToListAsync(); GuildUser guildUser = null; Guild guild = null; Stream guildIcon = null; var guildPosition = 1; if (target is CachedMember guildTarget) { guildUser = await context.Database.GetOrCreateGuildUserAsync(target.Id, guildTarget.Guild.Id); guild = await context.Database.GetOrCreateGuildAsync(guildTarget.Guild.Id); guildIcon = await _http.GetStreamAsync(guildTarget.Guild.GetIconUrl()); var guildUsers = await context.Database.GuildUsers.OrderByDescending(x => x.TotalXp).ToListAsync(); guildPosition = guildUsers.IndexOf(guildUser) + 1; } var guildOffset = guild?.Settings.HasFlag(GuildSettings.XpTracking) == true ? 45 : 0; using var background = Image.Load <Rgba32>(new FileStream("./Data/Images/01.png", FileMode.Open)); using var avatarStream = await _http.GetStreamAsync(target.GetAvatarUrl()); using var avatar = Image.Load <Rgba32>(avatarStream); using var canvas = new Image <Rgba32>(Configuration.Default, 450, 300); using var currentLevelStream = await _http.GetStreamAsync(EmojiTools.GetUrl(GetLevelEmoji(user))); using var currentLevel = Image.Load <Rgba32>(currentLevelStream); currentLevel.Mutate(x => x.Resize(45 / currentLevel.Height * currentLevel.Width, 45)); Stream currentGuildLevelStream = null; if (guildUser is { }) { currentGuildLevelStream = await _http.GetStreamAsync(EmojiTools.GetUrl(GetLevelEmoji(guildUser))); } canvas.Mutate(cnvs => { var sb = new StringBuilder(); foreach (var c in target.Name) { if (char.IsLetterOrDigit(c)) { sb.Append(c); } } sb.Append($"#{target.Discriminator}"); var userFontSize = 20; var box = TextMeasurer.MeasureBounds(sb.ToString(), new RendererOptions(ImageTools.Fonts.TF2(userFontSize))); while (box.Width > 420 || box.Height > 20) { box = TextMeasurer.MeasureBounds(sb.ToString(), new RendererOptions(ImageTools.Fonts.TF2(--userFontSize))); } // Draw XP image (background) cnvs.DrawImage(background, PixelColorBlendingMode.Normal, 1); // Draw outer bounding box cnvs.FillPolygon(ImageTools.Colors.DarkButTransparent, new PointF(10, 190 - guildOffset), new PointF(440, 190 - guildOffset), /* * new PointF(440, 210 - guildReduction), * new PointF(10, 210 - guildReduction), * new PointF(440, 210 - guildReduction), */ new PointF(440, 290 - guildOffset), new PointF(10, 290 - guildOffset)); // Draw avatar bounding box cnvs.FillPolygon(ImageTools.Colors.Blurple, new PointF(385, 215 - guildOffset), new PointF(435, 215 - guildOffset), new PointF(435, 265 - guildOffset), new PointF(385, 265 - guildOffset)); // Draw avatar cnvs.DrawImage(avatar.Clone(x => x.Resize(50, 50)), new Point(385, 215 - guildOffset), PixelColorBlendingMode.Normal, PixelAlphaCompositionMode.SrcOver, 1); // Draw avatar bounding box outline cnvs.DrawPolygon(Rgba32.WhiteSmoke, 2, new PointF(386, 216 - guildOffset), new PointF(434, 216 - guildOffset), new PointF(434, 264 - guildOffset), new PointF(386, 264 - guildOffset)); // Write username cnvs.DrawText(sb.ToString().Trim(), ImageTools.Fonts.TF2(userFontSize), Rgba32.WhiteSmoke, new PointF(15, 195 - guildOffset)); /* Write user info * if (!string.IsNullOrWhiteSpace(global.Info)) * { * cnvs.DrawText(new TextGraphicsOptions { WrapTextWidth = 350 }, * global.Info, * ImageTools.Fonts.TF2Secondary(13), * Rgba32.WhiteSmoke, * new PointF(15, 215 - guildOffset)); * }*/ // Draw inner box (XP bar outline) cnvs.FillPolygon(ImageTools.Colors.LessDark, new PointF(75, 272 - guildOffset), new PointF(435, 272 - guildOffset), new PointF(435, 285 - guildOffset), new PointF(75, 285 - guildOffset)); // Draw current XP bar cnvs.FillPolygon(ImageTools.Colors.XpBar, new PointF(77, 274 - guildOffset), new PointF(356F * ((float)user.CurrentLevelXp / user.NextLevelXp) + 77, 274 - guildOffset), new PointF(356F * ((float)user.CurrentLevelXp / user.NextLevelXp) + 77, 283 - guildOffset), new PointF(77, 283 - guildOffset)); // Write current level text cnvs.DrawText(new TextGraphicsOptions { HorizontalAlignment = HorizontalAlignment.Center }, $"Tier {user.Tier}, Level {user.Level} ({user.Grade} Grade)", ImageTools.Fonts.TF2(13), ImageTools.Colors.GetGradeColor(user.Grade), new PointF(255, 259 - guildOffset)); // Write current XP text cnvs.DrawText(new TextGraphicsOptions { HorizontalAlignment = HorizontalAlignment.Center }, $"{user.TotalXp} / {user.NextLevelTotalXp} XP", ImageTools.Fonts.TF2(13), Rgba32.WhiteSmoke, new PointF(255, 273 - guildOffset)); // Draw current level cnvs.DrawImage( currentLevel.Clone(x => x.Resize(45 / currentLevel.Height * currentLevel.Width, 45)), ImageTools.Justify(new Point(45, 285 - guildOffset), currentLevel, Justification.BottomCenter), PixelColorBlendingMode.Normal, PixelAlphaCompositionMode.SrcOver, 1); // Write current global position cnvs.DrawText(new TextGraphicsOptions { HorizontalAlignment = HorizontalAlignment.Center }, $"Global position #{globalUsers.IndexOf(user) + 1}", ImageTools.Fonts.TF2(11), Rgba32.WhiteSmoke, new PointF(255, 248 - guildOffset)); if (guildUser is { } && guildOffset > 0) { // Draw guild bounding box // 270 cnvs.FillPolygon(ImageTools.Colors.DarkButTransparent, new PointF(10, 250), new PointF(440, 250), new PointF(440, 295), new PointF(10, 295)); // Draw guild XP bar outline cnvs.FillPolygon(ImageTools.Colors.LessDark, new PointF(75, 277), new PointF(435, 277), new PointF(435, 290), new PointF(75, 290)); // Draw guild XP bar cnvs.FillPolygon(ImageTools.Colors.XpBar, new PointF(77, 279), new PointF(356F * ((float)guildUser.CurrentLevelXp / guildUser.NextLevelXp) + 77, 279), new PointF(356F * ((float)guildUser.CurrentLevelXp / guildUser.NextLevelXp) + 77, 288), new PointF(77, 288)); // Write current guild level text cnvs.DrawText(new TextGraphicsOptions { HorizontalAlignment = HorizontalAlignment.Center }, $"Tier {guildUser.Tier}, Level {guildUser.Level} ({guildUser.Grade} Grade)", ImageTools.Fonts.TF2(13), ImageTools.Colors.GetGradeColor(guildUser.Grade), new PointF(255, 264)); // Write current guild XP text cnvs.DrawText(new TextGraphicsOptions { HorizontalAlignment = HorizontalAlignment.Center }, $"{guildUser.TotalXp} / {guildUser.NextLevelTotalXp} XP", ImageTools.Fonts.TF2(13), Rgba32.WhiteSmoke, new PointF(255, 278)); // using (var guildLevel = Image.Load(guildLevelStream)) using var guildImage = Image.Load <Rgba32>(guildIcon); using var currentGuildLevel = Image.Load <Rgba32>(currentGuildLevelStream); currentGuildLevel.Mutate(x => x.Resize(40 / currentGuildLevel.Height * currentGuildLevel.Width, 40)); // Draw current guild level cnvs.DrawImage(currentGuildLevel, ImageTools.Justify(new Point(45, 292), currentGuildLevel, Justification.BottomCenter), PixelColorBlendingMode.Normal, PixelAlphaCompositionMode.SrcOver, 1); // Draw current guild icon guildImage.Mutate(img => img.Resize(18, 18)); cnvs.DrawImage(guildImage, ImageTools.Justify(new Point(435, 255), guildImage, Justification.TopRight), PixelColorBlendingMode.Normal, PixelAlphaCompositionMode.SrcOver, 1f); // Write current guild position cnvs.DrawText(new TextGraphicsOptions { HorizontalAlignment = HorizontalAlignment.Center }, $"Guild position #{guildPosition}", ImageTools.Fonts.TF2(11), Rgba32.WhiteSmoke, new PointF(255, 253)); } });
private static List <string> IsEmoji(string content) { List <string> emojis = EmojiTools.IsContainsEmoji(content); return(emojis); }
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity <Guild>(guild => { guild.HasKey(x => x.Id); guild.Property(x => x.Language) .HasConversion(x => x.CultureCode, x => _localization.Languages .First(y => y.CultureCode.Equals(x))); guild.Property(x => x.CustomPrefixes).HasDefaultValueSql("'{}'"); guild.Property(x => x.BlacklistedModmailAuthors) .HasConversion(new SnowflakeCollectionConverter()) .HasDefaultValueSql("''"); guild.Property(x => x.BlacklistedEmojiGuilds) .HasConversion(new SnowflakeCollectionConverter()) .HasDefaultValueSql("''"); guild.Property(x => x.BlacklistedStarboardIds) .HasConversion(new SnowflakeCollectionConverter()) .HasDefaultValueSql("''"); }); modelBuilder.Entity <GlobalUser>(user => { user.HasKey(x => x.Id); user.Property(x => x.Language) .HasConversion(x => x.CultureCode, x => _localization.Languages .First(y => y.CultureCode.Equals(x))); user.Property(x => x.PreviousNames) .HasDefaultValueSql("'{}'"); user.Property(x => x.HighlightBlacklist) .HasConversion(new SnowflakeCollectionConverter()) .HasDefaultValueSql("''"); }); modelBuilder.Entity <GuildUser>(user => { user.HasKey(x => new { x.Id, x.GuildId }); user.Property(x => x.PreviousNames) .HasDefaultValueSql("'{}'"); }); modelBuilder.Entity <Punishment>(punishment => { punishment.HasKey(x => x.Id); punishment.Property(x => x.Id).ValueGeneratedOnAdd(); punishment.Property(x => x.Image).HasConversion(x => x.ToArray(), x => new MemoryStream(x)); }); modelBuilder.Entity <Kick>(kick => { kick.HasBaseType <Punishment>(); }); modelBuilder.Entity <RevocablePunishment>(punishment => { punishment.HasBaseType <Punishment>(); }); modelBuilder.Entity <Ban>(ban => { ban.HasBaseType <RevocablePunishment>(); }); modelBuilder.Entity <Mute>(mute => { mute.HasBaseType <RevocablePunishment>(); }); modelBuilder.Entity <Warning>(warning => { warning.HasBaseType <RevocablePunishment>(); }); modelBuilder.Entity <LoggingChannel>(channel => { channel.HasKey(x => new { x.GuildId, x.Type }); }); modelBuilder.Entity <SpecialRole>(role => { role.HasKey(x => new { x.GuildId, x.Type }); }); modelBuilder.Entity <Modmail>(mail => { mail.HasKey(x => x.Id); mail.Property(x => x.Id).ValueGeneratedOnAdd(); mail.HasMany(x => x.Messages) .WithOne(x => x.Source) .HasForeignKey(x => x.SourceId); }); modelBuilder.Entity <ModmailMessage>(message => { message.HasKey(x => x.Id); message.Property(x => x.Id).ValueGeneratedOnAdd(); }); modelBuilder.Entity <WarningPunishment>(punishment => { punishment.HasKey(x => new { x.GuildId, x.Count }); }); modelBuilder.Entity <Permission>(permission => { permission.HasKey(x => x.Id); permission.Property(x => x.Id).ValueGeneratedOnAdd(); }); modelBuilder.Entity <Suggestion>(suggestion => { suggestion.HasKey(x => x.Id); suggestion.Property(x => x.Id).ValueGeneratedOnAdd(); suggestion.Property(x => x.Image).HasConversion(x => x.ToArray(), x => new MemoryStream(x)); }); modelBuilder.Entity <SpecialEmoji>(emoji => { emoji.HasKey(x => new { x.GuildId, x.Type }); emoji.Property(x => x.Emoji).HasConversion(new EmojiConverter()) .HasDefaultValueSql("''"); }); modelBuilder.Entity <Highlight>(highlight => { highlight.HasKey(x => x.Id); highlight.Property(x => x.Id) .ValueGeneratedOnAdd(); }); modelBuilder.Entity <ReactionRole>(role => { role.HasKey(x => x.Id); role.Property(x => x.Id) .ValueGeneratedOnAdd(); role.Property(x => x.Emoji) .HasConversion(x => x.ToString(), x => EmojiTools.Parse(x)); }); modelBuilder.Entity <LevelReward>(reward => { reward.HasKey(x => x.Id); reward.Property(x => x.Id) .ValueGeneratedOnAdd(); }); modelBuilder.Entity <RoleLevelReward>(reward => { reward.HasBaseType <LevelReward>(); reward.Property(x => x.AddedRoleIds) .HasConversion(new SnowflakeCollectionConverter()) .HasDefaultValueSql("''"); reward.Property(x => x.RemovedRoleIds) .HasConversion(new SnowflakeCollectionConverter()) .HasDefaultValueSql("''"); }); modelBuilder.Entity <Tag>(tag => { tag.HasKey(x => new { x.GuildId, x.Name }); tag.Property(x => x.Image).HasConversion(x => x.ToArray(), x => new MemoryStream(x)); }); modelBuilder.Entity <Reminder>(reminder => { reminder.HasKey(x => x.Id); reminder.Property(x => x.Id) .ValueGeneratedOnAdd(); }); modelBuilder.Entity <CommandAlias>(alias => { alias.HasKey(x => new { x.GuildId, x.Alias }); }); modelBuilder.Entity <StarboardEntry>(entry => { entry.HasKey(x => x.MessageId); entry.Property(x => x.Stars) .HasConversion(new SnowflakeCollectionConverter()) .HasDefaultValueSql("''"); }); modelBuilder.Entity <CyclingStatus>(status => { status.HasKey(x => x.Id); status.Property(x => x.Id) .ValueGeneratedOnAdd(); }); modelBuilder.Entity <TextChannel>(channel => { channel.HasKey(x => new { x.GuildId, x.ChannelId }); }); modelBuilder.Entity <CommandCooldown>(cooldown => { cooldown.HasKey(x => new { x.GuildId, x.CommandName }); }); modelBuilder.Entity <CooldownData>(data => { data.HasKey(x => new { x.GuildId, x.UserId, x.Command }); }); modelBuilder.Entity <SelfAssignableRole>(role => { role.HasKey(x => new { x.GuildId, x.RoleId }); }); }