Пример #1
0
        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());
            }
        }
Пример #2
0
 public bool AddPost(NanoPost post)
 {
     if (post.Invalid)
     {
         return(false);
     }
     return(AddPost(post, true));
 }
Пример #3
0
        //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());
            }
        }
Пример #4
0
        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));
            }
        }
Пример #5
0
        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);
        }
Пример #6
0
        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());
        }
Пример #7
0
        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());
        }
Пример #8
0
        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());
        }
Пример #9
0
 private static int ByteCount(NanoPost p)
 {
     return(p.Message.Length + 32);
 }