public void SaveToPngContainer(NanoDB db) { var files = new DirectoryInfo(Strings.Containers).GetFiles("*.png"); if (files.Length == 0) { NotificationHandler.Instance.AddNotification("Не найдены PNG файлы в папке containers."); return; } FileInfo file = files[random.Next(files.Length - 1)]; var bmp = new Bitmap(file.FullName); int capacity = (int)(bmp.Width * bmp.Height * 3 / 8); string sessionPrefix = random.Next().ToString("x8"); sessionPrefix += random.Next().ToString("x8"); byte[] packed = null; byte[] prevPacked = null; int amount = 1; int realAmount = 0; while (amount < 65535 && (prevPacked == null || packed == null || packed.Length < capacity - 32)) { prevPacked = packed; var lastPosts = db.GetNLastPosts(amount).ExceptHidden(db); var randomPosts = db.GetNRandomPosts(amount).ExceptHidden(db).FilterBySize(16384); var posts = new List <NanoPost>(); posts.AddRange(lastPosts); posts.AddRange(randomPosts); realAmount = posts.Count; packed = Pack(posts.ToArray().Randomized()); amount = 1 + amount + amount * 10 / 15; } packed = prevPacked; Console.WriteLine(string.Format("PNG capacity:{0}, posts amount (not unique):{1}, packed size:{2}", capacity, realAmount, packed.Length)); if (capacity - packed.Length > 32) { var noise = new byte[capacity - packed.Length - 32]; random.NextBytes(noise); var temp = new List <byte>(); temp.AddRange(packed); temp.AddRange(noise); packed = temp.ToArray(); } new PngStegoUtil().HideBytesInPng( file.FullName, Strings.Upload + Path.DirectorySeparatorChar + sessionPrefix + Strings.PngExt, packed); NotificationHandler.Instance.AddNotification("Контейнер сохранён: " + Strings.Upload + Path.DirectorySeparatorChar + sessionPrefix + Strings.PngExt); }
public void SaveToPngContainer(NanoDB db) { var files = new DirectoryInfo(Strings.Containers).GetFiles("*.png"); if (files.Length == 0) { NotificationHandler.Instance.AddNotification("Не найдены PNG файлы в папке containers."); return; } FileInfo file = files[random.Next(files.Length - 1)]; var bmp = new Bitmap(file.FullName); int capacity = (int)(bmp.Width * bmp.Height * 3 / 8); string sessionPrefix = random.Next().ToString("x8"); sessionPrefix += random.Next().ToString("x8"); byte[] packed = null; byte[] prevPacked = null; int amount = 1; int realAmount = 0; while (amount < 65535 && (prevPacked == null || packed == null || packed.Length < capacity - 32)) { prevPacked = packed; var lastPosts = db.GetNLastPosts(amount).ExceptHidden(db); var randomPosts = db.GetNRandomPosts(amount).ExceptHidden(db).FilterBySize(16384); var posts = new List<NanoPost>(); posts.AddRange(lastPosts); posts.AddRange(randomPosts); realAmount = posts.Count; packed = Pack(posts.ToArray().Randomized()); amount = 1 + amount + amount * 10 / 15; } packed = prevPacked; Console.WriteLine(string.Format("PNG capacity:{0}, posts amount (not unique):{1}, packed size:{2}", capacity, realAmount, packed.Length)); if (capacity - packed.Length > 32) { var noise = new byte[capacity - packed.Length - 32]; random.NextBytes(noise); var temp = new List<byte>(); temp.AddRange(packed); temp.AddRange(noise); packed = temp.ToArray(); } new PngStegoUtil().HideBytesInPng( file.FullName, Strings.Upload + Path.DirectorySeparatorChar + sessionPrefix + Strings.PngExt, packed); NotificationHandler.Instance.AddNotification("Контейнер сохранён: " + Strings.Upload + Path.DirectorySeparatorChar + sessionPrefix + Strings.PngExt); }
private NanoHttpResponse HandleSafe(NanoHttpRequest request) { int count = int.Parse(request.Address.Split('/').Last()); var sb = new StringBuilder(); sb.Append("{ \n \"posts\" : [\n"); var posts = _db.GetNLastPosts(count); for (int i = 0; i < posts.Length; i++) { var p = posts[i]; bool last = i == posts.Length - 1; sb.Append(" {\n \"hash\" : \""); sb.Append(p.GetHash().Value); sb.Append("\", \n \"isHidden\" : \""); sb.Append(_db.IsHidden(p.GetHash()) ? "1" : "0"); sb.Append("\", \n \"replyTo\" : \""); sb.Append(p.ReplyTo.Value); sb.Append("\", \n \"message\" : \""); string s = p.SerializedString().Substring(32); s = s.Replace("\\", "\\\\"); s = s.Replace("\n", "\\n"); s = s.Replace("\"", "\\\""); s = s.Replace("\t", "\\t"); s = s.Replace("\r", "\\r"); sb.Append(s); sb.Append("\"\n }"); if (!last) { sb.Append(",\n"); } } sb.Append("\n ]\n}"); return(new NanoHttpResponse(StatusCode.Ok, sb.ToString(), "application/json; charset=utf-8")); }
/* * 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); }
private NanoHttpResponse HandleSafe(NanoHttpRequest request) { var sw = new System.Diagnostics.Stopwatch(); sw.Start(); var sb = new StringBuilder(); ThreadViewHandler.AddHeader(sb); sb.Append(string.Format("<div>Количество правил игнорирования постов: {0}. Настройте spamfilter.txt под себя.</div>", SpamDetector.RuleCount)); sb.Append("[Очистить список]".ToButton("", "", @" var x = new XMLHttpRequest(); x.open('POST', '../save/', true); x.send(''); location.reload(); ").ToDiv("", "")); var posts = _db.GetNewPosts();//.ExceptHidden(_db); posts = posts.Reverse().ToArray(); if (posts.Length == 0) { posts = _db.GetNLastPosts(200).Reverse().ToArray(); } foreach (var p in posts) { int answers = _db.CountAnswers(p.GetHash()); string ans = "ответ"; if (answers != 11 && answers % 10 == 1) { // } else if (answers != 11 && answers % 10 == 5) { ans += "ов"; } else { ans += "а"; } bool corePost = false; if (_db.Get(p.ReplyTo) != null && (_db.Get(p.ReplyTo).ReplyTo.Value == NanoDB.CategoriesHashValue || _db.Get(p.ReplyTo).ReplyTo.Value == NanoDB.RootHashValue)) { corePost = true; } bool hidden = _db.IsHidden(p.GetHash()); sb.Append( ( p.Message.Strip(true).Replace("\n", "<br/>").ToStyledDiv("postinner", p.GetHash().Value, hidden?"visibility:hidden;height:0px;":"") + ((answers > ThreadViewHandler.MinAnswers ? ("[" + answers + " " + ans + "]").ToRef("/expand/" + p.GetHash().Value):"") + (hidden?"[Вернуть]":"[Удалить]").ToButton("", "", @"var x = new XMLHttpRequest(); x.open('POST', '../hide/" + p.GetHash().Value + @"', true); x.send(''); var elem = document.getElementById('" + p.GetHash().Value + @"'); if (elem.style.visibility != 'hidden') { elem.style.visibility='hidden'; elem.style.height = '0px'; innerHTML = '[Вернуть]'; } else { elem.style.visibility='visible'; elem.style.height = '100%'; innerHTML = '[Удалить]'; } ") + (p.ContainerTag != null ? "[Отклонить контейнер]".ToButton("", "", @"var x = new XMLHttpRequest(); x.open('POST', '../hideall/" + p.GetHash().Value + @"', true); x.send('');location.reload();") : "") + //("[В закладки]").ToRef("/bookmark/" + p.GetHash().Value) + ("[В тред]").ToRef((corePost?"/thread/":"/expand/") + p.ReplyTo.Value) + ("[Ответить]").ToRef("/reply/" + p.GetHash().Value)).ToDiv("", "") ).ToDiv("post", "")); } string s1 = "<a href='#' onclick='location.reload()'>[Обновить]</a>"; sb.Append(s1.ToDiv("", "")); sw.Stop(); ThreadViewHandler.AddFooter(sb, sw.ElapsedMilliseconds, _db); return(new NanoHttpResponse(StatusCode.Ok, sb.ToString().ToHtmlBody(ThreadViewHandler.NotifierScript))); }