public void ReadPosts() { if (!File.Exists(Index) || !File.Exists(Data)) { return; } string indexes = Encoding.UTF8.GetString(File.ReadAllBytes(Index)); string posts = Encoding.UTF8.GetString(File.ReadAllBytes(Data)); try { for (int i = 0; i < indexes.Length / 8; i += 2) { string offset = indexes.Substring(i * 8, 8); string length = indexes.Substring(i * 8 + 8, 8); string rawpost = posts.Substring( int.Parse(offset, System.Globalization.NumberStyles.HexNumber), int.Parse(length, System.Globalization.NumberStyles.HexNumber)); var post = new NanoPost(rawpost); if (!SpamDetector.IsSpam(post.Message)) { AddPost(new NanoPost(rawpost), false); } } } catch (Exception e) { Logger.LogError("Error while reading posts db:\n" + e.ToString()); } }
public bool AddPost(NanoPost post) { if (post.Invalid) { return(false); } return(AddPost(post, true)); }
//public event Action<NanoPost> BookmarkAdded = delegate(NanoPost obj) {}; public void Init() { var root = new NanoPost(Hash.CreateZero(), NanoPost.RootStub); AddPost(root, false); RootHash = root.GetHash(); var cat = new NanoPost(RootHash, "[b]КАТЕГОРИИ[/b]\nЧтобы создать новую категорию, ответьте на это сообщение.\nОтветьте на одну из категорий, чтобы создать там тред."); AddPost(cat, false); var cathash = cat.GetHash(); AddPost(new NanoPost(cathash, "[b]Автомобили/Мотоциклы[/b]"), false); AddPost(new NanoPost(cathash, "[b]Бред/Разное[/b]"), false); AddPost(new NanoPost(cathash, "[b]Видеоигры[/b]"), false); AddPost(new NanoPost(cathash, "[b]Выживание[/b]"), false); AddPost(new NanoPost(cathash, "[b]Железо/Софт[/b]"), false); AddPost(new NanoPost(cathash, "[b]Иностранные языки[/b]"), false); AddPost(new NanoPost(cathash, "[b]Кино и ТВ[/b]"), false); AddPost(new NanoPost(cathash, "[b]Книги[/b]"), false); AddPost(new NanoPost(cathash, "[b]Криптоанархия[/b]"), false); AddPost(new NanoPost(cathash, "[b]Музыка[/b]"), false); AddPost(new NanoPost(cathash, "[b]Мода и стиль[/b]"), false); AddPost(new NanoPost(cathash, "[b]Наука[/b]"), false); AddPost(new NanoPost(cathash, "[b]Обсуждение Наноборды[/b]"), false); AddPost(new NanoPost(cathash, "[b]Паранормальное[/b]"), false); AddPost(new NanoPost(cathash, "[b]Политика[/b]"), false); AddPost(new NanoPost(cathash, "[b]Психология[/b]"), false); AddPost(new NanoPost(cathash, "[b]Программирование[/b]"), false); AddPost(new NanoPost(cathash, "[b]Реквесты[/b]"), false); AddPost(new NanoPost(cathash, "[b]Смартфоны/Планшеты[/b]"), false); AddPost(new NanoPost(cathash, "[b]Секс[/b]"), false); AddPost(new NanoPost(cathash, "[b]Спорт[/b]"), false); AddPost(new NanoPost(cathash, "[b]Творчество[/b]"), false); AddPost(new NanoPost(cathash, "[b]Японская культура[/b]"), false); AddPost(new NanoPost(cathash, "[b]18+[/b]"), false); foreach (var p in _posts) { p.Value.NumberTag = int.MaxValue; } try { if (File.Exists(HideList)) { _hideList = new HashSet <string>(File.ReadAllLines(HideList)); } } catch (Exception e) { Logger.LogError("Error wile reading hide.list\n" + e.ToString()); } }
public NanoHttpResponse Handle(NanoHttpRequest request) { if (string.IsNullOrEmpty(request.Content)) { return(new ErrorHandler(StatusCode.BadRequest, "Empty message").Handle(request)); } Hash thread = new Hash(request.Address.Split('/').Last()); if (thread.Invalid) { return(new ErrorHandler(StatusCode.BadRequest, "Invalid hash").Handle(request)); } var str = Encoding.UTF8.GetString(request.Connection.Raw); str = str.Substring(str.IndexOf("\r\n\r\n") + 4); NanoPost post = null; if (thread.Value != NanoDB.CategoriesHashValue) { post = new NanoPost(thread, "[g]" + GetPostHeader() + "[/g]\n" + str); } else { post = new NanoPost(thread, str); } if (post.Invalid) { NotificationHandler.Instance.AddNotification("Превышен максимальный размер поста."); return(new NanoHttpResponse(StatusCode.BadRequest, "")); } if (SpamDetector.IsSpam(post.Message)) { NotificationHandler.Instance.AddNotification("Ваш пост из-за своего содержания будет считаться спамом."); return(new NanoHttpResponse(StatusCode.BadRequest, "")); } else { NotificationHandler.Instance.AddNotification( "Сообщение добавлено, " + post.SerializedBytes().Length + " байт (" + post.SerializedString().Length + " симв.)"); if (_db.AddPost(post)) { _db.WriteNewPosts(false); } return(new NanoHttpResponse(StatusCode.Ok, post.GetHash().Value)); } }
private bool AddPost(NanoPost post, bool isNew) { if (_posts.ContainsKey(post.GetHash())) { return(false); } if (IsHidden(post.GetHash())) { return(false); } if (post.ReplyTo.Value == CategoriesHashValue) { post.NumberTag = int.MaxValue; } else if (post.NumberTag != int.MaxValue) { post.NumberTag = ++_postNo; } if (isNew) { _new.Add(post); } _addedPosts.Add(post); _posts[post.GetHash()] = post; _threads.Add(post.ReplyTo); if (!_threadPosts.ContainsKey(post.ReplyTo)) { _threadPosts[post.ReplyTo] = new List <NanoPost>(); } _threadPosts[post.ReplyTo].Add(post); if (post.ReplyTo.Zero || post.ReplyTo.Value == RootHash.Value) { _threads.Add(post.GetHash()); } if (isNew) { Updated(post); } return(true); }
public static NanoPost[] Unpack(byte[] bytes) { bytes = GZipUtil.Decompress(bytes); List <NanoPost> posts = new List <NanoPost>(); string str = Encoding.UTF8.GetString(bytes); int count = int.Parse(str.Substring(0, 6), System.Globalization.NumberStyles.HexNumber); List <int> sizes = new List <int>(); List <string> raws = new List <string>(); for (int i = 0; i < count; i++) { int size = int.Parse(str.Substring((i + 1) * 6, 6), System.Globalization.NumberStyles.HexNumber); sizes.Add(size); } int offset = count * 6 + 6; for (int i = 0; i < sizes.Count; i++) { int size = sizes[i]; raws.Add(str.Substring(offset, size)); offset += size; } var containerHash = SHA256.Create().ComputeHash(bytes); var containerHashString = ""; containerHash.ToList().ForEach(b => containerHashString += b.ToString("x2")); for (int i = 0; i < raws.Count; i++) { var p = new NanoPost(raws[i]); p.ContainerTag = containerHashString; if (SpamDetector.IsSpam(p.Message)) { continue; } posts.Add(p); } return(posts.ToArray()); }
public static NanoPost[] Sorted(this NanoPost[] posts) { var list = new List <NanoPost>(); for (int i = 0; i < posts.Length; i++) { NanoPost post = posts[i]; for (int x = 0; x < posts.Length; x++) { if (x == i) { continue; } NanoPost reply = posts[x]; if (reply.ReplyTo == post.GetHash()) { if (!list.Contains(post)) { list.Add(post); } list.Add(reply); } } } var added = new HashSet <NanoPost>(list); foreach (var post in posts) { if (!added.Contains(post)) { list.Add(post); } } return(list.ToArray()); }
public static NanoPost[] Unpack(byte[] bytes) { bytes = GZipUtil.Decompress(bytes); List <NanoPost> posts = new List <NanoPost>(); string str = Encoding.UTF8.GetString(bytes); int count = int.Parse(str.Substring(0, 6), System.Globalization.NumberStyles.HexNumber); //int count = nbpack.NBPackMain.parse_number(str.Substring(0, 6), System.Globalization.NumberStyles.HexNumber); List <int> sizes = new List <int>(); List <string> raws = new List <string>(); for (int i = 0; i < count; i++) { int size = int.Parse(str.Substring((i + 1) * 6, 6), System.Globalization.NumberStyles.HexNumber); // int size = nbpack.NBPackMain.parse_number(str.Substring((i + 1) * 6, 6), System.Globalization.NumberStyles.HexNumber); sizes.Add(size); } int offset = count * 6 + 6; for (int i = 0; i < Math.Min(sizes.Count, IncomingPostsLimit); i++) { int size = sizes[i]; raws.Add(str.Substring(offset, size)); offset += size; } var containerHash = SHA256.Create().ComputeHash(bytes); var containerHashString = ""; containerHash.ToList().ForEach(b => containerHashString += b.ToString("x2")); for (int i = 0; i < Math.Min(raws.Count, IncomingPostsLimit); i++) { var p = new NanoPost(raws[i]); posts.Add(p); } return(posts.ToArray()); }
private static int ByteCount(NanoPost p) { return(p.Message.Length + 32); }