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 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)); } }
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()); }