public static async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "emoji/{emoji}")] HttpRequest req, string emoji, ILogger log) { if (!string.IsNullOrWhiteSpace(emoji) && EmojiMetadata.Lookup.ContainsKey(emoji)) { var emojiEntity = await EmojiTable.GetEmoji( EmojiMetadata.Lookup[emoji].groupId.ToString(EmojiMetadata.IdFormat), EmojiMetadata.Lookup[emoji].emojiId.ToString(EmojiMetadata.IdFormat)); if (emojiEntity != null) { var jsonObject = new { Group = emojiEntity.Group, SubGroup = emojiEntity.SubGroup, Emoji = emojiEntity.Emoji, Cldr = emojiEntity.Cldr, Codes = emojiEntity.Code.Split('_'), Keywords = emojiEntity.Keywords }; var serializerSettings = new JsonSerializerSettings(); serializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); return(new JsonResult(jsonObject, serializerSettings)); } } return(new NotFoundResult()); }
public static async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "emoji")] HttpRequest req, ILogger log) { var emojiList = await EmojiTable.GetAllEmojis(); var groupedEmojis = emojiList.GroupBy(e => e.Group) .Select(g => new { Group = g.Key, SubGroups = g.GroupBy(e => e.SubGroup) .Select(sg => new { SubGroup = sg.Key, Emojis = sg.Select(e => new { Emoji = e.Emoji, Cldr = e.Cldr, Codes = e.Code.Split('_'), Keywords = e.Keywords, }) }) }); var serializerSettings = new JsonSerializerSettings(); serializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); return(new JsonResult(groupedEmojis, serializerSettings)); }
public static async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "emoji/random")] HttpRequest req, ILogger log) { var numOfGroups = EmojiMetadata.Groups.Count; var randomPartition = Random.Next(0, numOfGroups - 1); var gk = EmojiMetadata.Groups.Keys.ElementAt(randomPartition); var randomRowKey = Random.Next(EmojiMetadata.Groups[gk].min, EmojiMetadata.Groups[gk].max); var emoji = await EmojiTable.GetEmoji( randomPartition.ToString(EmojiMetadata.IdFormat), randomRowKey.ToString(EmojiMetadata.IdFormat)); var serializerSettings = new JsonSerializerSettings(); serializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); return(new JsonResult(new { emoji.Emoji, emoji.Cldr }, serializerSettings)); }
public static async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "emoji/palettes")] HttpRequest req, ILogger log) { var emojiList = await EmojiTable.GetAllEmojis(); var groupedEmojis = emojiList.GroupBy(e => e.Group) .Select(g => new { Group = g.Key, Emoji = g.Select(e => e.Emoji) }); var serializerSettings = new JsonSerializerSettings(); serializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); return(new JsonResult(groupedEmojis, serializerSettings)); }
public static async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "img/{emoji}")] HttpRequest req, string emoji, ILogger log) { if (!string.IsNullOrWhiteSpace(emoji) && EmojiMetadata.Lookup.ContainsKey(emoji)) { var emojiImg = await EmojiTable.GetEmojiImg( EmojiMetadata.Lookup[emoji].groupId.ToString(EmojiMetadata.IdFormat), EmojiMetadata.Lookup[emoji].emojiId.ToString(EmojiMetadata.IdFormat)); if (!string.IsNullOrWhiteSpace(emojiImg?.ImageBase64)) { var etag = new EntityTagHeaderValue($"\"{Convert.ToString(emojiImg.Timestamp.ToFileTime() ^ emojiImg.ImageBase64.Length, 16)}\""); return(new FileContentResult(Convert.FromBase64String(emojiImg.ImageBase64), "image/png") { EntityTag = etag, LastModified = emojiImg.Timestamp }); } } return(new NotFoundResult()); }
private void Render(Image image) { // TODO: Dynamically determine height double height = 22; image.Source = _emoji switch { SurrogateEmoji se => new SvgImageSource(new Uri($"ms-appx:///Quarrel.Markdown/Assets/Emoji/{EmojiTable.ToCodePoint(se.Surrogate).ToLower()}.svg")), Emoji e => new BitmapImage(new Uri($"https://cdn.discordapp.com/emojis/{e.Id}.webp?size={2 * height}&quality=lossless")), AnimatedEmoji ae => new BitmapImage(new Uri($"https://cdn.discordapp.com/emojis/{ae.Id}.gif?size={2 * height}&quality=lossless")) { AutoPlay = true, }, _ => null, }; }
async static Task CreateTableAndPopulate(Emojis emojisToLoad) { var table = EmojiTable.Get(); var imgTable = EmojiTable.GetImg(); // Drop and recreate table await table.DeleteIfExistsAsync(); await table.CreateIfNotExistsAsync(); await imgTable.DeleteIfExistsAsync(); await imgTable.CreateIfNotExistsAsync(); //Entities var emojis = new List <EmojiEntity>(); //Create the batch operation var batchOps = new List <TableBatchOperation>(); var imgBatchOps = new List <TableBatchOperation>(); foreach (var g in emojisToLoad.Groups) { var batchOp = new TableBatchOperation(); var imgBatchOp = new TableBatchOperation(); var groupId = emojisToLoad.Groups.IndexOf(g).ToString(EmojiMetadata.IdFormat); foreach (var sg in g.SubGroups) { foreach (var e in sg.Emojis) { var entity = new EmojiEntity(groupId, e.Id.ToString(EmojiMetadata.IdFormat)) { Group = g.Name, SubGroup = sg.Name, Code = e.CodeString, Emoji = e.Emoji, Cldr = e.Cldr, Keywords = e.Haystack, IsNew = e.IsNew }; emojis.Add(entity); batchOp.Insert(entity); if (!string.IsNullOrWhiteSpace(e.ImageBase64)) { var imgEntity = new EmojiImageEntity(groupId, e.Id.ToString(EmojiMetadata.IdFormat)) { Emoji = e.Emoji, ImageBase64 = e.ImageBase64 }; imgBatchOp.Insert(imgEntity); } // Maximum operations in a batch if (batchOp.Count == 100) { batchOps.Add(batchOp); batchOp = new TableBatchOperation(); imgBatchOps.Add(imgBatchOp); imgBatchOp = new TableBatchOperation(); } } } // Batch can only contain operations in the same partition if (batchOp.Count > 0) { batchOps.Add(batchOp); } } var sw = new System.Diagnostics.Stopwatch(); var processedCount = 0; foreach (var bo in batchOps) { sw.Reset(); Console.WriteLine($"Inserting batch for group {bo.First().Entity.PartitionKey}, {bo.Count} entries"); sw.Start(); var result = await table.ExecuteBatchAsync(bo); processedCount += bo.Count; sw.Stop(); Console.WriteLine($" Insert complete: {sw.ElapsedMilliseconds}ms"); Console.WriteLine($" Processed: {processedCount} emojis"); } processedCount = 0; Console.WriteLine($"###IMAGES###"); foreach (var bo in imgBatchOps) { sw.Reset(); Console.WriteLine($"Inserting image batch for group {bo.First().Entity.PartitionKey}, {bo.Count} entries"); sw.Start(); var result = await imgTable.ExecuteBatchAsync(bo); sw.Stop(); processedCount += bo.Count; Console.WriteLine($" Insert complete: {sw.ElapsedMilliseconds}ms"); Console.WriteLine($" Processed: {processedCount} emojis"); } }