예제 #1
0
        public static async Task <bool> RemoveAllAsync()
        {
            return(await Task.Run(() =>
            {
                var urls = subs.ToArray();

                for (int i = 0; i < urls.Length; ++i)
                {
                    urls[i] = resolveFullPath(urls[i]);
                }

                string value = cfg.AppSettings.Settings[CFG_PREFIX].Value;
                List <string> forums = new List <string>(value.Split(CFG_SEPARATOR, StringSplitOptions.RemoveEmptyEntries));

                // Remove from subs list
                subs = new ConcurrentBag <string>(subs.Except(urls));

                WowCircleForum forumObj = null;
                foreach (var forumUrl in urls)
                {
                    if (snapshot.ContainsKey(forumUrl))
                    {
                        snapshot.Remove(forumUrl, out forumObj);
                    }
                }

                return RefreshCfgAsync(forums);
            }));
        }
예제 #2
0
        public static async Task <bool> RemoveServerAsync(string forumUrl)
        {
            forumUrl = resolveFullPath(forumUrl);

            if (!subs.Contains(forumUrl))
            {
                return(false);
            }

            string        value  = cfg.AppSettings.Settings[CFG_PREFIX].Value;
            List <string> forums = new List <string>(value.Split(CFG_SEPARATOR, StringSplitOptions.RemoveEmptyEntries));

            // Remove from local list
            if (forums.Contains(forumUrl))
            {
                forums.Remove(forumUrl);
            }

            // Remove from subs list
            subs = new ConcurrentBag <string>(subs.Except(new string[] { forumUrl }));

            WowCircleForum forumObj = null;

            if (snapshot.ContainsKey(forumUrl))
            {
                snapshot.Remove(forumUrl, out forumObj);
            }

            await RefreshCfgAsync(forums);

            return(true);
        }
예제 #3
0
        private static Task <WowCircleForum> fetchForum(string forumUrl)
        {
            return(Task.Run(() =>
            {
                forumUrl = resolveFullPath(forumUrl);

                WowCircleForum forum = new WowCircleForum()
                {
                    Title = fetchForumTitle(forumUrl),
                    Url = forumUrl,
                    threads = fetchThreads(forumUrl)
                };

                return forum;
            }));
        }
예제 #4
0
        private static async Task updateCache()
        {
            try
            {
                if (subs.Count == 0)
                {
                    Console.WriteLine("=================[Update cache declined(subs list is empty): {0}]=================", DateTime.Now);
                    return;
                }
                Console.WriteLine("=================[Update cache starts at: {0}]=================", DateTime.Now);

                // Update snapshot data
                foreach (var forumUrl in subs)
                {
                    Console.WriteLine("Fetching data for {0}...", forumUrl);
                    WowCircleForum forumObj = null;
                    if (!snapshot.ContainsKey(forumUrl))
                    {
                        snapshot.GetOrAdd(forumUrl, forumObj);
                    }
                    snapshot[forumUrl] = await fetchForum(forumUrl);

                    // Update thread status
                    for (int i = 0; i < snapshot[forumUrl].threads.Count; ++i)
                    {
                        var    thread  = snapshot[forumUrl].threads[i];
                        double elapsed = DateTime.Now.Subtract(thread.CreatedAt).TotalSeconds;

                        if (elapsed < NEW_TRHEAD_AGE &&
                            !visitedThreads.Contains(thread.ID))
                        {
                            visitedThreads.Add(thread.ID);
                            snapshot[forumUrl].threads[i].IsNew = true;
                            Console.WriteLine("New thread found: {0}\n\n", thread.ID);
                        }
                    }

                    int sleepTimeout = new Random().Next(MAX_SECONDS_BETWEEN_REQUEST) * 1000;
                    Console.WriteLine("Delay {0} ms", sleepTimeout);
                    Thread.Sleep(sleepTimeout);
                }
                // Sort
                foreach (var forumUrl in snapshot.Keys.ToArray())
                {
                    snapshot[forumUrl].threads.Sort((a, b) => a.CreatedAt.CompareTo(b.CreatedAt));
                    Console.WriteLine("Forum: {0}", snapshot[forumUrl].Title);
                    for (int i = 0; i < snapshot[forumUrl].threads.Count; ++i)
                    {
                        double elapsed = DateTime.Now.Subtract(snapshot[forumUrl].threads[i].CreatedAt).TotalSeconds;

                        Console.WriteLine("{0,-25} {1,-25} {2, -20}",
                                          snapshot[forumUrl].threads[i].ID,
                                          snapshot[forumUrl].threads[i].CreatedAt,
                                          elapsed);
                    }
                    Console.WriteLine();
                }
                Console.WriteLine("=================[Cache timestamp: {0}]=================", DateTime.Now);
            }
            catch (Exception ex)
            {
                Console.WriteLine("updateCache failure: {0}{1}{2}", ex.Message, ex.StackTrace, Environment.NewLine);
            }
        }