Пример #1
0
        public static List <TaggableSource> GetFacebookPages(Calinfo calinfo, string location)
        {
            var search_template      = String.Format("site:www.facebook.com/__TARGET__ \"{0}\"", location);
            var search_for_fan_pages = search_template.Replace("__TARGET__", "pages");
            var search_for_groups    = search_template.Replace("__TARGET__", "groups");
            var stats            = new Dictionary <string, object>();
            var fan_page_results = Search.BingSearch(search_for_fan_pages, 1000, stats);
            // var group_results = Search.BingSearch(search_for_groups, 1000, stats); // doesn't work, location string won't usually appear
            var group_results = new List <SearchResult>();                                        // placeholder for now
            var bing_results  = fan_page_results.Concat(group_results).ToList();

            var taggable_sources = InitializeTaggables(calinfo, "facebook");

            var    seen_ids    = new List <string>();
            string name_and_pk = "facebooksources";

            var settings = GenUtils.GetSettingsFromAzureTable();
            var options  = new ParallelOptions();

            Parallel.ForEach(source: bing_results, parallelOptions: options, body: (result) =>
                             //foreach (var result in bing_results)
            {
                try
                {
                    var url  = Regex.Replace(result.url, @"\?.+", "");                     // remove query string if any
                    var name = Regex.Match(result.url, "facebook.com/(pages|groups)/([^/]+)").Groups[2].Value;
                    name     = name.Replace('-', ' ');

                    var fb_id = Utils.id_from_fb_fanpage_or_group(url);

                    if (seen_ids.Exists(x => x == fb_id))
                    {
                        return;
                    }
                    else
                    {
                        seen_ids.Add(fb_id);
                    }

                    string slat = null;
                    string slon = null;
                    var ical    = new DDay.iCal.iCalendar();
                    var facebook_access_token = settings["facebook_access_token"];                     // todo: merge with code in collector
                    var j_obj  = Utils.GetFacebookEventsAsJsonObject(fb_id, facebook_access_token);
                    var events = Utils.iCalendarizeJsonObjectFromFacebook(j_obj, calinfo, ical, slat, slon, settings);

                    if (events.Count == 0)                      // no calendar on this page
                    {
                        return;
                    }

                    string page;

                    if (FacebookPageMatchesLocation(url, location, settings, out page) == false)
                    {
                        return;
                    }

                    string origin_url = "";
                    if (!String.IsNullOrEmpty(page))
                    {
                        origin_url = GetFacebookPageOrGroupOriginUrl(page);
                    }

                    var ical_url = string.Format("http://{0}/ics_from_fb_page?fb_id={1}&elmcity_id={2}",
                                                 ElmcityUtils.Configurator.appdomain,
                                                 fb_id,
                                                 calinfo.id);

                    var has_future_events = FacebookPageHasFutureEvents(events, calinfo);

                    var taggable = new TaggableSource(name, calinfo.id, url + "?sk=events", ical_url, has_future_events, origin_url);

                    taggable_sources.Add(taggable);

                    RememberTaggable(name_and_pk, fb_id, taggable);
                }
                catch (Exception e)
                {
                    GenUtils.PriorityLogMsg("exception", "GetFacebookPages", e.Message + e.StackTrace);
                    return;
                }
            });

            return(taggable_sources);
        }