private static IEnumerable <MLSankakuPost> GetPosts(long userId) { var outPosts = new List <MLSankakuPost>(); var context = new DiscordContext(); var allTags = context.SankakuTag.ToArray(); outPosts.Add(new MLSankakuPost() { Tags = 0, UserScore = 0 }); outPosts.Add(new MLSankakuPost() { Tags = 1, UserScore = 1 }); outPosts.Add(new MLSankakuPost() { Tags = 1, UserScore = 1 }); outPosts.Add(new MLSankakuPost() { Tags = 0, UserScore = 0 }); return(outPosts); foreach (var vote in context.SankakuImageVote.Where(indVote => indVote.UserId == userId)) { MLSankakuPost post = new MLSankakuPost(); var tags = context.SankakuImageTag.Where(imageTag => imageTag.ImageId == vote.ImageId) .Select(tag => tag.TagId).ToArray(); var image = context.SankakuImage.Find(vote.ImageId); //post.Tags = new float[allTags.Length]; int cIndex = 0; foreach (var generalTag in allTags) { if (tags.Contains(generalTag.Id)) { //post.Tags[cIndex] = 1; } else { //post.Tags[cIndex] = 0; } } post.UserScore = vote.VoteValue; post.imgRating = vote.Image.Rating; post.score = Convert.ToSingle(image.Score); outPosts.Add(post); } return(outPosts); }
public static async Task PostPrediction(long userId, DiscordChannel channel) { var context = new DiscordContext(); SankakuImage imgToPost = null; Random rnd = new Random(); var channelIDLong = Convert.ToInt64(channel.Id); var blacklistedTags = await context.SankakuTagBlacklist.Where(blackTag => blackTag.ChannelId == channelIDLong).Select(tag => tag.TagId).ToListAsync(); var startDate = DateTime.Now - TimeSpan.FromDays(90); var trainedModel = Train(userId); int skip = 0; while (imgToPost == null) { //imgToPost = context.SankakuImage.Where(si => si.SankakuPost.Count == 0).Skip(skip).First(); imgToPost = context.SankakuImage.Find(88415l); if (imgToPost == null) { await ScrapeNewest(); } List <MLSankakuPost> posts = new List <MLSankakuPost>(); MLSankakuPost mlPost = new MLSankakuPost() { //imgRating = imgToPost.Rating, //score = Convert.ToSingle(imgToPost.Score), //Tags = context.SankakuImageTag.Where(imageTag => imageTag.ImageId == imgToPost.Id).Select(tag => Convert.ToSingle(tag.TagId)).ToArray(), Tags = 1, }; posts.Add(mlPost); var prediction = trainedModel.Predict(posts, true); if (prediction.First().Score < 1) { skip++; imgToPost = null; } } DiscordEmbedBuilder builder = new DiscordEmbedBuilder() { Color = DiscordColor.Orange, Title = context.Puns.Skip(new Random().Next(context.Puns.Count() - 1)).First().Text }; var link = HttpUtility.HtmlDecode(await GetOriginalImageLink(imgToPost.Id)); var request = Helpers.CreateRequestWithHeaders(link); var response = request.GetResponse(); SKImage img = SKImage.FromEncodedData(response.GetResponseStream()); if (img.ColorType == SKColorType.Bgra8888) { //Bgra8888 needs an indexed Colortable, so convert it to Rgba8888 first var bitmap = new SKBitmap(new SKImageInfo(img.Width, img.Height, SKColorType.Rgba8888)); var canvas = new SKCanvas(bitmap); canvas.DrawImage(img, 0, 0, null); canvas.Flush(); img = SKImage.FromBitmap(bitmap); } var imageData = img.Encode(SKEncodedImageFormat.Jpeg, 75); //Encode in Jpeg instead of Webp because of IOS using (var outStream = imageData.AsStream()) { var msg = await channel.SendFileAsync(outStream, builder.Title + ".jpeg", embed : builder.Build()); context.SankakuPost.Add(new Models.SankakuPost() { Date = DateTime.Now, Image = imgToPost, MessageId = Convert.ToInt64(msg.Id) }); await context.SaveChangesAsync(); } }