Example #1
0
 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;                 //宽度自适应
 }
Example #2
0
        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")));
        }
Example #3
0
    void SendInput()
    {
        string text = textInput.text;

        EmojiTools.Parse(richTextField, text);  //富文本解析string 替换emoji

        textInput.text = "";
    }
Example #4
0
        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;
            }
        }
Example #5
0
    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));
                    }
                });
Example #7
0
        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 });
            });
        }