示例#1
0
        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);
        }
示例#2
0
        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();
            }
        }