public NanoHttpResponse Handle(NanoHttpRequest request) { Hash hash = new Hash(request.Address.Split('/').Last()); if (hash.Invalid) { return(new ErrorHandler(StatusCode.BadRequest, "Invalid hash").Handle(request)); } try { var tag = _db.Get(hash).ContainerTag; for (int i = 0; i < _db.GetPostCount(); i++) { var p = _db.GetPost(i); if (p.ContainerTag != null && p.ContainerTag.Equals(tag)) { _db.HideOnce(p.GetHash()); } } return(new NanoHttpResponse(StatusCode.Ok, "\n")); } catch (Exception e) { return(new ErrorHandler(StatusCode.InternalServerError, e.ToString().Replace("\n", "<br>")).Handle(request)); } }
/* * Takes 50 or less last posts (up to 150000 bytes max total), * adds 50 or less random posts (up to 150000 bytes max total), * random is shifted towards latest posts. */ public void Create() { var count = _db.GetPostCount(); var take = 50; var last50s = _db.GetNLastPosts(take * 4).ExceptHidden(_db).Reverse().Take(take).ToArray(); var list = new List <NanoPost>(last50s); while (!ByteCountUnder(list, 150000)) { list.RemoveAt(list.Count - 1); } var r = new Random(); int rbytes = 0; int max = 50; for (int i = 0; i < max; i++) { int index = (int)Math.Min(Math.Pow(r.NextDouble(), 0.3) * count, count - 1); var p = _db.GetPost(index); if (_db.IsHidden(p.GetHash())) { if (max < 10000) { max += 1; } continue; } var bc = ByteCount(p); if (rbytes + bc > 150000) { break; } rbytes += bc; list.Add(p); } CreateWithList(list); }
public static void AddFooter(StringBuilder sb, long elapsedMs, NanoDB db) { sb.Append("<div style='height:15px'></div>"); sb.Append(HtmlStringExtensions.Catalog); sb.Append("<div style='height:15px'></div>"); sb.Append("<div style='text-align:center;width:100%;'><g>Сервер nboard_" + App.Version + " // Время генерации: " + elapsedMs + " ms // Постов в базе: " + db.GetPostCount() + "</g></div>"); sb.Append("<div style='height:15px'></div>"); }
public void SaveToPngContainer(NanoDB db) { db.RewriteDbExceptHidden(); db.ClearDb(); db.ReadPosts(); string[] ext = new[] { ".png", ".jpg", ".jpeg" }; var files = new DirectoryInfo(Strings.Containers).GetFiles().Where(f => ext.Contains(f.Extension.ToLower())).ToArray(); if (files.Length == 0) { NotificationHandler.Instance.AddNotification("Не найдены PNG файлы в папке containers."); return; } else if (files.Length <= 5) { if (!_smaller) { NotificationHandler.Instance.AddNotification("Предупреждение: у вас мало контейнеров."); } } FileInfo file = files[random.Next(files.Length - 1)]; var bmp = new Bitmap(file.FullName); int capacity = (int)(bmp.Width * bmp.Height * 3 / 8) - 32; string sessionPrefix = random.Next().ToString("x8"); sessionPrefix += random.Next().ToString("x8"); var packed = new byte[0]; var posts = new List <NanoPost>(); int i = db.GetPostCount() - 1; while (i >= 0 && posts.Count < FreshPosts) { var p = db.GetPost(i--); if (!db.IsHidden(p.GetHash())) { posts.Add(p); } } var parr = posts.ToArray(); var parents = new List <NanoPost>(); foreach (var post in parr) { var p = db.Get(post.ReplyTo); if (p != null && !db.IsHidden(p.GetHash())) { parents.Add(p); } } foreach (var post in parents) { posts.Add(post); var p = db.Get(post.ReplyTo); if (p != null && !db.IsHidden(p.GetHash())) { posts.Add(p); } } var slice0 = posts.GetRange(0, Math.Max(posts.Count, FreshPostsNotLimitedTo16384Allowed)); var slice1 = posts.GetRange(slice0.Count, posts.Count - slice0.Count); posts.Clear(); posts.AddRange(slice0); posts.AddRange(slice1.ToArray().FilterBySize(16384)); posts.AddRange(db.GetNRandomPosts(RandomPostsLimitedTo8192ALlowed).ExceptHidden(db).FilterBySize(8192)); posts.AddRange(db.GetNRandomPosts(RandomPostsLimitedTo16384Allowed).ExceptHidden(db).FilterBySize(16384)); posts = posts.Distinct().ToList(); packed = NanoPostPackUtil.Pack(posts.ToArray()); float scale = 1; if (packed.Length > capacity) { scale = (packed.Length / (float)capacity); scale = (float)Math.Sqrt(scale); if (scale > 2 && !_smaller) { new PngContainerCreatorNew(4).SaveToPngContainer(db); return; } bmp = new Bitmap(bmp, (int)(bmp.Width * scale + 1), (int)(bmp.Height * scale + 1)); } new PngStegoUtil().HideBytesInPng( bmp, Strings.Upload + Path.DirectorySeparatorChar + sessionPrefix + Strings.PngExt, packed); Console.WriteLine( string.Format( "PNG capacity:{0}, posts amount:{1}, packed size:{2}, image scaling: {3:n2}x", capacity, posts.Count, packed.Length, scale)); Console.WriteLine("Total posts in db: {0}, post length limit (bytes): {1}", db.GetPostCount(), NanoPost.MaxPostByteLength); NotificationHandler.Instance.AddNotification("Контейнер сохранён: " + Strings.Upload + Path.DirectorySeparatorChar + sessionPrefix + Strings.PngExt); }
public void SaveToPngContainer(NanoDB db) { db.RewriteDbExceptHidden(); db.ClearDb(); db.ReadPosts(); string[] ext = new[] { ".png", ".jpg", ".jpeg" }; var files = new DirectoryInfo(Strings.Containers).GetFiles().Where(f => ext.Contains(f.Extension.ToLower())).ToArray(); if (files.Length == 0) { NotificationHandler.Instance.AddNotification("Не найдены PNG файлы в папке containers."); return; } else if (files.Length <= 5) { if (!_smaller) { NotificationHandler.Instance.AddNotification("Предупреждение: у вас мало контейнеров."); } } FileInfo file = files[random.Next(files.Length - 1)]; var bmp = new Bitmap(file.FullName); int capacity = (int)(bmp.Width * bmp.Height * 3 / 8) - 32; string sessionPrefix = random.Next().ToString("x8"); sessionPrefix += random.Next().ToString("x8"); var packed = new byte[0]; var posts = new List<NanoPost>(); int i = db.GetPostCount() - 1; while (i >= 0 && posts.Count < FreshPosts) { var p = db.GetPost(i--); if (!db.IsHidden(p.GetHash())) { posts.Add(p); } } var parr = posts.ToArray(); var parents = new List<NanoPost>(); foreach (var post in parr) { var p = db.Get(post.ReplyTo); if (p != null && !db.IsHidden(p.GetHash())) { parents.Add(p); } } foreach (var post in parents) { posts.Add(post); var p = db.Get(post.ReplyTo); if (p != null && !db.IsHidden(p.GetHash())) { posts.Add(p); } } var slice0 = posts.GetRange(0, Math.Max(posts.Count, FreshPostsNotLimitedTo16384Allowed)); var slice1 = posts.GetRange(slice0.Count, posts.Count - slice0.Count); posts.Clear(); posts.AddRange(slice0); posts.AddRange(slice1.ToArray().FilterBySize(16384)); posts.AddRange(db.GetNRandomPosts(RandomPostsLimitedTo8192ALlowed).ExceptHidden(db).FilterBySize(8192)); posts.AddRange(db.GetNRandomPosts(RandomPostsLimitedTo16384Allowed).ExceptHidden(db).FilterBySize(16384)); posts = posts.Distinct().ToList(); packed = NanoPostPackUtil.Pack(posts.ToArray()); float scale = 1; if (packed.Length > capacity) { scale = (packed.Length / (float)capacity); scale = (float)Math.Sqrt(scale); if (scale > 2 && !_smaller) { new PngContainerCreatorNew(4).SaveToPngContainer(db); return; } bmp = new Bitmap(bmp, (int) (bmp.Width * scale + 1), (int) (bmp.Height * scale + 1)); } new PngStegoUtil().HideBytesInPng( bmp, Strings.Upload + Path.DirectorySeparatorChar + sessionPrefix + Strings.PngExt, packed); Console.WriteLine( string.Format( "PNG capacity:{0}, posts amount:{1}, packed size:{2}, image scaling: {3:n2}x", capacity, posts.Count, packed.Length, scale)); Console.WriteLine("Total posts in db: {0}, post length limit (bytes): {1}", db.GetPostCount(), NanoPost.MaxPostByteLength); NotificationHandler.Instance.AddNotification("Контейнер сохранён: " + Strings.Upload + Path.DirectorySeparatorChar + sessionPrefix + Strings.PngExt); }
public static void AddFooter(StringBuilder sb, long elapsedMs, NanoDB db) { sb.Append("<div style='height:15px'></div>"); sb.Append(HtmlStringExtensions.Catalog); sb.Append("<div style='height:15px'></div>"); sb.Append("<div style='text-align:center;width:100%;'><g>Сервер nboard_"+App.Version+" // Время генерации: "+elapsedMs+" ms // Постов в базе: "+db.GetPostCount()+"</g></div>"); sb.Append("<div style='height:15px'></div>"); }
public NanoHttpResponse Handle(NanoHttpRequest request) { return(new NanoHttpResponse(StatusCode.Ok, _db.GetPostCount().ToString())); }