Пример #1
0
 ///<summary>Returns true if Update(SiteLink,SiteLink) would make changes to the database.
 ///Does not make any changes to the database and can be called before remoting role is checked.</summary>
 public static bool UpdateComparison(SiteLink siteLink, SiteLink oldSiteLink)
 {
     if (siteLink.SiteNum != oldSiteLink.SiteNum)
     {
         return(true);
     }
     if (siteLink.OctetStart != oldSiteLink.OctetStart)
     {
         return(true);
     }
     if (siteLink.EmployeeNum != oldSiteLink.EmployeeNum)
     {
         return(true);
     }
     if (siteLink.SiteColor != oldSiteLink.SiteColor)
     {
         return(true);
     }
     if (siteLink.ForeColor != oldSiteLink.ForeColor)
     {
         return(true);
     }
     if (siteLink.InnerColor != oldSiteLink.InnerColor)
     {
         return(true);
     }
     if (siteLink.OuterColor != oldSiteLink.OuterColor)
     {
         return(true);
     }
     return(false);
 }
Пример #2
0
    /// <summary>
    /// Add new link to db.
    /// </summary>
    private void AddNewLink()
    {
        LinksManager linkObj    = new LinksManager();
        SiteLink     linkToSave = new SiteLink();

        try
        {
            // assign newlink info.
            linkToSave.link_details = editorLinkDetails.Value;
            linkToSave.link_lang_id = Convert.ToInt32(ddlLanguage.SelectedValue);

            //if (ddlParentLinks.SelectedIndex > 0) { linkToSave.ParentID = Convert.ToInt32(ddlParentLinks.SelectedValue); }
            //if (txtLinkURL.Text.Trim() != String.Empty) { linkToSave.link_url = txtLinkURL.Text; }

            linkToSave.link_name  = txtName.Text;
            linkToSave.link_order = Convert.ToInt32(txtPriority.Text);
            //linkToSave.link_place = GetPlaceofLink();
            linkToSave.Active = cbActive.Checked;

            // perform saving method.
            if (linkObj.AddNewLink(linkToSave))
            {
                // go to links list.
                string url = "SiteLinksView.aspx"; //?langid=" + ddlLanguageID.SelectedValue;
                Response.Redirect(url);
            }
            else
            {
                lblError.Text = Resources.AdminResources_en.ErrorSave;
            }
        }
        catch { lblError.Text = Resources.AdminResources_en.ErrorSave; }
    }
        void PopulateSiteLinks(ComboBox cb)
        {
            List <SiteLink> items = new List <SiteLink>();

            try
            {
                int          odd    = 1;
                SiteLink     link   = null;
                string       input  = File.ReadAllText(_exe_dir + "\\website.txt");
                StringReader reader = new StringReader(input);
                string       line   = string.Empty;
                do
                {
                    line = reader.ReadLine();
                    if (line != null) // do something with the line
                    {
                        if (odd++ % 2 != 0)
                        {
                            link = new SiteLink {
                                Name = line
                            };
                        }
                        else
                        {
                            link.Link = line;
                            items.Add(link);
                        }
                    }
                } while (line != null);
            }
            catch { };
            cb.ItemsSource = items;
        }
Пример #4
0
        ///<summary>Inserts one SiteLink into the database.  Provides option to use the existing priKey.</summary>
        public static long Insert(SiteLink siteLink, bool useExistingPK)
        {
            if (!useExistingPK && PrefC.RandomKeys)
            {
                siteLink.SiteLinkNum = ReplicationServers.GetKey("sitelink", "SiteLinkNum");
            }
            string command = "INSERT INTO sitelink (";

            if (useExistingPK || PrefC.RandomKeys)
            {
                command += "SiteLinkNum,";
            }
            command += "SiteNum,OctetStart,EmployeeNum,SiteColor,ForeColor,InnerColor,OuterColor) VALUES(";
            if (useExistingPK || PrefC.RandomKeys)
            {
                command += POut.Long(siteLink.SiteLinkNum) + ",";
            }
            command +=
                POut.Long(siteLink.SiteNum) + ","
                + "'" + POut.String(siteLink.OctetStart) + "',"
                + POut.Long(siteLink.EmployeeNum) + ","
                + POut.Int(siteLink.SiteColor.ToArgb()) + ","
                + POut.Int(siteLink.ForeColor.ToArgb()) + ","
                + POut.Int(siteLink.InnerColor.ToArgb()) + ","
                + POut.Int(siteLink.OuterColor.ToArgb()) + ")";
            if (useExistingPK || PrefC.RandomKeys)
            {
                Db.NonQ(command);
            }
            else
            {
                siteLink.SiteLinkNum = Db.NonQ(command, true, "SiteLinkNum", "siteLink");
            }
            return(siteLink.SiteLinkNum);
        }
Пример #5
0
    /// <summary>
    /// Show palce of the link
    /// (v= vertical, h= horizontal).
    /// </summary>
    /// <param name="val"></param>
    /// <returns></returns>
    //private void ShowLinkPlace(string val)
    //{
    //    if (val == "v")
    //        v.Checked = true;
    //    else
    //        h.Checked = true;

    //}
    private void UpdateLinkInfo()
    {
        LinksManager linkObj    = new LinksManager();
        SiteLink     linkToSave = new SiteLink();

        try
        {
            linkToSave.id        = hfID.Value != String.Empty ? Convert.ToInt32(hfID.Value) : 0; // ConvertLinkIdToInt();
            linkToSave.link_name = txtName.Text;

            //if (ddlParentLinks.SelectedIndex > 0) { linkToSave.ParentID = Convert.ToInt32(ddlParentLinks.SelectedValue); }
            //if (txtLinkURL.Text.Trim() != String.Empty) { linkToSave.link_url = txtLinkURL.Text; }
            //linkToSave.link_place = GetPlaceofLink();

            linkToSave.link_lang_id = Convert.ToInt32(ddlLanguage.SelectedValue);
            linkToSave.link_order   = Convert.ToInt32(txtPriority.Text);

            linkToSave.link_details = editorLinkDetails.Value;
            linkToSave.Active       = cbActive.Checked;

            // Perform saving data.
            if (linkObj.UpdateLinkInfo(linkToSave))
            {
                Response.Redirect("../SiteLinksView.aspx"); //?langid=" + ddlLanguageID.SelectedValue); // success save.
            }
            else
            {
                lblError.Text = Resources.AdminResources_en.ErrorSave; lblError.ForeColor = System.Drawing.Color.DarkRed;
            }                                                                                                                  // fail save.
        }
        catch { lblError.Text = Resources.AdminResources_en.ErrorSave; lblError.ForeColor = System.Drawing.Color.DarkRed; }
    }
Пример #6
0
 ///<summary>Inserts one SiteLink into the database.  Returns the new priKey.</summary>
 public static long Insert(SiteLink siteLink)
 {
     if (DataConnection.DBtype == DatabaseType.Oracle)
     {
         siteLink.SiteLinkNum = DbHelper.GetNextOracleKey("sitelink", "SiteLinkNum");
         int loopcount = 0;
         while (loopcount < 100)
         {
             try {
                 return(Insert(siteLink, true));
             }
             catch (Oracle.ManagedDataAccess.Client.OracleException ex) {
                 if (ex.Number == 1 && ex.Message.ToLower().Contains("unique constraint") && ex.Message.ToLower().Contains("violated"))
                 {
                     siteLink.SiteLinkNum++;
                     loopcount++;
                 }
                 else
                 {
                     throw ex;
                 }
             }
         }
         throw new ApplicationException("Insert failed.  Could not generate primary key.");
     }
     else
     {
         return(Insert(siteLink, false));
     }
 }
Пример #7
0
        /// <summary>
        /// Creates a new SiteLink at Place.
        /// </summary>
        public static void CreateSiteLink(Quest parentQuest, Symbol placeSymbol)
        {
            // Attempt to get Place resource
            Place place = parentQuest.GetPlace(placeSymbol);

            if (place == null)
            {
                throw new Exception(string.Format("Attempted to add SiteLink for invalid Place symbol {0}", placeSymbol.Name));
            }

            // Create SiteLink in QuestMachine
            SiteLink siteLink = new SiteLink();

            siteLink.questUID    = parentQuest.UID;
            siteLink.placeSymbol = placeSymbol;
            siteLink.siteType    = place.SiteDetails.siteType;
            siteLink.mapId       = place.SiteDetails.mapId;
            siteLink.buildingKey = place.SiteDetails.buildingKey;
            Instance.AddSiteLink(siteLink);

            // Output debug information
            switch (siteLink.siteType)
            {
            case SiteTypes.Building:
                Debug.LogFormat("Created Building SiteLink to {0} in {1}/{2}", place.SiteDetails.buildingName, place.SiteDetails.regionName, place.SiteDetails.locationName);
                break;

            case SiteTypes.Dungeon:
                Debug.LogFormat("Created Dungeon SiteLink to {0}/{1}", place.SiteDetails.regionName, place.SiteDetails.locationName);
                break;
            }
        }
        public async Task <SiteLink> AddSiteLinkToEnvironment(int environmentId, [FromBody] SiteLink link)
        {
            link.EnvironmentId = environmentId;
            var linkEntry = _context.SiteLinks.Add(link);
            await _context.SaveChangesAsync();

            return(linkEntry.Entity);
        }
Пример #9
0
        internal override void ProcessMappingsFromRowValues(RowValues values)
        {
            SiteLink = new SiteLink();

            Identifier.ReadFromRowValues(values);

            values.ConvertToEntity(this, Mappings);
        }
Пример #10
0
        public async Task <IEnumerable <ReleaseInfo> > PerformQuery(TorznabQuery query)
        {
            var releases         = new List <ReleaseInfo>();
            var episodeSearchUrl = string.Format("{0}?search={1}&cat=0", SearchUrl, HttpUtility.UrlEncode(query.GetQueryString()));
            var results          = await RequestStringWithCookiesAndRetry(episodeSearchUrl);

            try
            {
                CQ dom = results.Content;

                var table = dom["tbody > tr > .latest"].Parent().Parent();

                foreach (var row in table.Children().Skip(1))
                {
                    var release = new ReleaseInfo();

                    CQ qDetailsCol = row.ChildElements.ElementAt(1).Cq();
                    CQ qLink       = qDetailsCol.Children("a").First();

                    release.MinimumRatio    = 1;
                    release.MinimumSeedTime = 172800;
                    release.Comments        = new Uri(SiteLink + "/" + qLink.Attr("href"));
                    release.Guid            = release.Comments;
                    release.Title           = qLink.Attr("title");
                    release.Description     = release.Title;

                    //"Tuesday, June 11th 2013 at 03:52:53 AM" to...
                    //"Tuesday June 11 2013 03:52:53 AM"
                    var timestamp = qDetailsCol.Children("font").Text().Trim() + " ";
                    var timeParts = new List <string>(timestamp.Replace(" at", "").Replace(",", "").Split(' '));
                    timeParts[2] = Regex.Replace(timeParts[2], "[^0-9.]", "");
                    var formattedTimeString = string.Join(" ", timeParts.ToArray()).Trim();
                    var date = DateTime.ParseExact(formattedTimeString, "dddd MMMM d yyyy hh:mm:ss tt", CultureInfo.InvariantCulture);
                    release.PublishDate = DateTime.SpecifyKind(date, DateTimeKind.Utc).ToLocalTime();

                    release.Link = new Uri(SiteLink.Replace("http:", "https:") + "/" + row.ChildElements.ElementAt(2).Cq().Children("a.index").Attr("href"));

                    var sizeStr = row.ChildElements.ElementAt(6).Cq().Text();
                    release.Size = ReleaseInfo.GetBytes(sizeStr);

                    release.Seeders = ParseUtil.CoerceInt(row.ChildElements.ElementAt(8).Cq().Text());
                    release.Peers   = ParseUtil.CoerceInt(row.ChildElements.ElementAt(9).Cq().Text()) + release.Seeders;

                    //if (!release.Title.ToLower().Contains(title.ToLower()))
                    //    continue;

                    releases.Add(release);
                }
            }
            catch (Exception ex)
            {
                OnParseError(results.Content, ex);
            }

            return(releases);
        }
Пример #11
0
        protected void Init(string DefinitionString)
        {
            var deserializer = new DeserializerBuilder()
                               .WithNamingConvention(new CamelCaseNamingConvention())
                               .IgnoreUnmatchedProperties()
                               .Build();

            Definition = deserializer.Deserialize <IndexerDefinition>(DefinitionString);

            // Add default data if necessary
            if (Definition.Settings == null)
            {
                Definition.Settings = new List <settingsField>();
            }

            if (Definition.Settings.Count == 0)
            {
                Definition.Settings.Add(new settingsField {
                    Name = "username", Label = "Username", Type = "text"
                });
                Definition.Settings.Add(new settingsField {
                    Name = "password", Label = "Password", Type = "password"
                });
            }

            // init missing mandatory attributes
            DisplayName        = Definition.Name;
            DisplayDescription = Definition.Description;
            SiteLink           = Definition.Links[0]; // TODO: implement alternative links
            if (!SiteLink.EndsWith("/"))
            {
                SiteLink += "/";
            }
            TorznabCaps = TorznabUtil.CreateDefaultTorznabTVCaps(); // TODO implement caps

            // init config Data
            configData = new ConfigurationData();
            foreach (var Setting in Definition.Settings)
            {
                configData.AddDynamic(Setting.Name, new StringItem {
                    Name = Setting.Label
                });
            }

            foreach (var Category in Definition.Caps.Categories)
            {
                var cat = TorznabCatType.GetCatByName(Category.Value);
                if (cat == null)
                {
                    logger.Error(string.Format("CardigannIndexer ({0}): Can't find a category for {1}", ID, Category.Value));
                    continue;
                }
                AddCategoryMapping(Category.Key, TorznabCatType.GetCatByName(Category.Value));
            }
        }
Пример #12
0
        public async Task <IEnumerable <ReleaseInfo> > PerformQuery(TorznabQuery query)
        {
            var releases = new List <ReleaseInfo>();
            var results  = await PostDataWithCookiesAndRetry(SearchUrl, GetSearchFormData(query.GetQueryString()));

            try
            {
                CQ dom = results.Content;

                ReleaseInfo release;
                var         rows = dom[".box_torrent_all"].Find(".box_torrent");

                foreach (var row in rows)
                {
                    CQ qRow = row.Cq();

                    release = new ReleaseInfo();
                    var torrentTxt = qRow.Find(".torrent_txt").Find("a").Get(0);
                    if (torrentTxt == null)
                    {
                        continue;
                    }
                    release.Title                = torrentTxt.GetAttribute("title");
                    release.Description          = release.Title;
                    release.MinimumRatio         = 1;
                    release.MinimumSeedTime      = 172800;
                    release.DownloadVolumeFactor = 0;
                    release.UploadVolumeFactor   = 1;

                    string downloadLink = SiteLink + torrentTxt.GetAttribute("href");
                    string downloadId   = downloadLink.Substring(downloadLink.IndexOf("&id=") + 4);

                    release.Link        = new Uri(SiteLink.ToString() + "torrents.php?action=download&id=" + downloadId);
                    release.Comments    = new Uri(SiteLink.ToString() + "torrents.php?action=details&id=" + downloadId);
                    release.Guid        = new Uri(release.Comments.ToString() + "#comments");;
                    release.Seeders     = ParseUtil.CoerceInt(qRow.Find(".box_s2").Find("a").First().Text());
                    release.Peers       = ParseUtil.CoerceInt(qRow.Find(".box_l2").Find("a").First().Text()) + release.Seeders;
                    release.PublishDate = DateTime.Parse(qRow.Find(".box_feltoltve2").Get(0).InnerHTML.Replace("<br />", " "), CultureInfo.InvariantCulture);
                    string[] sizeSplit = qRow.Find(".box_meret2").Get(0).InnerText.Split(' ');
                    release.Size = ReleaseInfo.GetBytes(sizeSplit[1].ToLower(), ParseUtil.CoerceFloat(sizeSplit[0]));
                    string cat = qRow.Find("img[class='categ_link']").First().Attr("title").Trim();
                    release.Category = MapTrackerCatToNewznab(cat);

                    releases.Add(release);
                }
            }
            catch (Exception ex)
            {
                OnParseError(results.Content, ex);
            }


            return(releases.ToArray());
        }
Пример #13
0
        public bool UpdateLinkInfo(SiteLink linkToUpdate)
        {
            try
            {
                ctxWrite.LinksUpdateLink(linkToUpdate.id, linkToUpdate.link_order, linkToUpdate.link_lang_id,
                                         linkToUpdate.Active, linkToUpdate.link_place, linkToUpdate.link_name, linkToUpdate.link_details);

                return(true);
            }
            catch { return(false); }
        }
Пример #14
0
        ///<summary></summary>
        public static SiteLink CreateSiteLink(long siteNum, string octetStart = "", string connectionSettingsHQOverrides = "")
        {
            SiteLink siteLink = new SiteLink()
            {
                SiteNum    = siteNum,
                OctetStart = octetStart,
                ConnectionSettingsHQOverrides = connectionSettingsHQOverrides
            };

            siteLink.SiteLinkNum = SiteLinks.Insert(siteLink);
            SiteLinks.RefreshCache();
            return(siteLink);
        }
Пример #15
0
        public bool AddNewLink(SiteLink linkToAdd)
        {
            try
            {
                //ctxWrite.LinksAddNew(linkToAdd.ParentID, linkToAdd.link_order, linkToAdd.Active, linkToAdd.link_lang_id,
                //    linkToAdd.link_place, linkToAdd.link_name, linkToAdd.link_details, linkToAdd.link_url);
                ctxWrite.SiteLinks.InsertOnSubmit(linkToAdd);
                ctxWrite.SubmitChanges();

                return(true);
            }
            catch { return(false); }
        }
Пример #16
0
        public void DataAction_WebChat_Override()
        {
            SiteT.ClearSiteTable();
            SiteLinkT.ClearSiteLinkTable();
            Site     site     = SiteT.CreateSite(MethodBase.GetCurrentMethod().Name);
            SiteLink siteLink = SiteLinkT.CreateSiteLink(site.SiteNum,
                                                         octetStart: ODEnvironment.GetLocalIPAddress(),
                                                         connectionSettingsHQOverrides: GetJsonSerializedConnectionOverride(ConnectionNames.WebChat, "127.0.0.1", _databaseNameWebChat, "root", ""));
            string serverName = "";

            DataAction.RunWebChat(() => { serverName = DataConnection.GetServerName(); });
            Assert.AreEqual("127.0.0.1", serverName);
            Assert.AreNotEqual(_dictConnectionDefaults[ConnectionNames.WebChat].ServerName, serverName);
        }
Пример #17
0
        ///<summary>Updates one SiteLink in the database.</summary>
        public static void Update(SiteLink siteLink)
        {
            string command = "UPDATE sitelink SET "
                             + "SiteNum    =  " + POut.Long(siteLink.SiteNum) + ", "
                             + "OctetStart = '" + POut.String(siteLink.OctetStart) + "', "
                             + "EmployeeNum=  " + POut.Long(siteLink.EmployeeNum) + ", "
                             + "SiteColor  =  " + POut.Int(siteLink.SiteColor.ToArgb()) + ", "
                             + "ForeColor  =  " + POut.Int(siteLink.ForeColor.ToArgb()) + ", "
                             + "InnerColor =  " + POut.Int(siteLink.InnerColor.ToArgb()) + ", "
                             + "OuterColor =  " + POut.Int(siteLink.OuterColor.ToArgb()) + " "
                             + "WHERE SiteLinkNum = " + POut.Long(siteLink.SiteLinkNum);

            Db.NonQ(command);
        }
Пример #18
0
 ///<summary>Inserts one SiteLink into the database.  Returns the new priKey.  Doesn't use the cache.</summary>
 public static long InsertNoCache(SiteLink siteLink)
 {
     if (DataConnection.DBtype == DatabaseType.MySql)
     {
         return(InsertNoCache(siteLink, false));
     }
     else
     {
         if (DataConnection.DBtype == DatabaseType.Oracle)
         {
             siteLink.SiteLinkNum = DbHelper.GetNextOracleKey("sitelink", "SiteLinkNum");                  //Cacheless method
         }
         return(InsertNoCache(siteLink, true));
     }
 }
Пример #19
0
        public async Task <IActionResult> UpdateLink(int linkId, [FromBody] SiteLink link)
        {
            if (linkId != link.Id)
            {
                return(BadRequest());
            }

            _context.SiteLinks
            .Update(link)
            .UpdateLastModified();

            await _context.SaveChangesAsync();

            return(NoContent());
        }
Пример #20
0
        ///<summary>Inserts one SiteLink into the database.  Provides option to use the existing priKey.  Doesn't use the cache.</summary>
        public static long InsertNoCache(SiteLink siteLink, bool useExistingPK)
        {
            bool   isRandomKeys = Prefs.GetBoolNoCache(PrefName.RandomPrimaryKeys);
            string command      = "INSERT INTO sitelink (";

            if (!useExistingPK && isRandomKeys)
            {
                siteLink.SiteLinkNum = ReplicationServers.GetKeyNoCache("sitelink", "SiteLinkNum");
            }
            if (isRandomKeys || useExistingPK)
            {
                command += "SiteLinkNum,";
            }
            command += "SiteNum,OctetStart,EmployeeNum,SiteColor,ForeColor,InnerColor,OuterColor,ConnectionSettingsHQOverrides) VALUES(";
            if (isRandomKeys || useExistingPK)
            {
                command += POut.Long(siteLink.SiteLinkNum) + ",";
            }
            command +=
                POut.Long(siteLink.SiteNum) + ","
                + "'" + POut.String(siteLink.OctetStart) + "',"
                + POut.Long(siteLink.EmployeeNum) + ","
                + POut.Int(siteLink.SiteColor.ToArgb()) + ","
                + POut.Int(siteLink.ForeColor.ToArgb()) + ","
                + POut.Int(siteLink.InnerColor.ToArgb()) + ","
                + POut.Int(siteLink.OuterColor.ToArgb()) + ","
                + DbHelper.ParamChar + "paramConnectionSettingsHQOverrides)";
            if (siteLink.ConnectionSettingsHQOverrides == null)
            {
                siteLink.ConnectionSettingsHQOverrides = "";
            }
            OdSqlParameter paramConnectionSettingsHQOverrides = new OdSqlParameter("paramConnectionSettingsHQOverrides", OdDbType.Text, POut.StringParam(siteLink.ConnectionSettingsHQOverrides));

            if (useExistingPK || isRandomKeys)
            {
                Db.NonQ(command, paramConnectionSettingsHQOverrides);
            }
            else
            {
                siteLink.SiteLinkNum = Db.NonQ(command, true, "SiteLinkNum", "siteLink", paramConnectionSettingsHQOverrides);
            }
            return(siteLink.SiteLinkNum);
        }
Пример #21
0
        public Human FromWikiDataResponse(WikiDataResponse wikiDataResponse)
        {
            var entity = wikiDataResponse.entities.First().Value;

            Language label;

            if (entity.labels.TryGetValue("en", out label))
            {
                label = entity.labels.First().Value;
            }
            string labelValue = label.value;
            string birthName  = GetClaimValue(entity, WikiDataProperties.BirthName, "text");

            string[]         countryOfCitizenship = GetClaimValues(entity, WikiDataProperties.CountryOfCitizenship, "numeric-id").ToArray();
            string[]         occupation           = GetClaimValues(entity, WikiDataProperties.Occupation, "numeric-id").ToArray();
            NodaTime.Instant?dateOfBirth          = null;
            var dateOfBirthStr = GetClaimValue(entity, WikiDataProperties.DateOfBirth, "time");

            if (dateOfBirthStr != null)
            {
                dateOfBirth = dateOfBirthStr.AsDateTime();
            }
            NodaTime.Instant?dateOfDeath = null;
            var dateOfDeathStr           = GetClaimValue(entity, WikiDataProperties.DateOfDeath, "time");

            if (dateOfDeathStr != null)
            {
                dateOfDeath = dateOfDeathStr.AsDateTime();
            }

            string   url        = null;
            SiteLink enSiteLink = null;

            if (entity.sitelinks.TryGetValue("enwiki", out enSiteLink))
            {
                url = enSiteLink.url;
            }

            var human = new Human(labelValue, birthName, countryOfCitizenship, occupation, dateOfBirth, dateOfDeath, url);

            return(human);
        }
Пример #22
0
        ///<summary>Converts a DataTable to a list of objects.</summary>
        public static List <SiteLink> TableToList(DataTable table)
        {
            List <SiteLink> retVal = new List <SiteLink>();
            SiteLink        siteLink;

            foreach (DataRow row in table.Rows)
            {
                siteLink             = new SiteLink();
                siteLink.SiteLinkNum = PIn.Long(row["SiteLinkNum"].ToString());
                siteLink.SiteNum     = PIn.Long(row["SiteNum"].ToString());
                siteLink.OctetStart  = PIn.String(row["OctetStart"].ToString());
                siteLink.EmployeeNum = PIn.Long(row["EmployeeNum"].ToString());
                siteLink.SiteColor   = Color.FromArgb(PIn.Int(row["SiteColor"].ToString()));
                siteLink.ForeColor   = Color.FromArgb(PIn.Int(row["ForeColor"].ToString()));
                siteLink.InnerColor  = Color.FromArgb(PIn.Int(row["InnerColor"].ToString()));
                siteLink.OuterColor  = Color.FromArgb(PIn.Int(row["OuterColor"].ToString()));
                retVal.Add(siteLink);
            }
            return(retVal);
        }
Пример #23
0
        ///<summary>Updates one SiteLink in the database.</summary>
        public static void Update(SiteLink siteLink)
        {
            string command = "UPDATE sitelink SET "
                             + "SiteNum                      =  " + POut.Long(siteLink.SiteNum) + ", "
                             + "OctetStart                   = '" + POut.String(siteLink.OctetStart) + "', "
                             + "EmployeeNum                  =  " + POut.Long(siteLink.EmployeeNum) + ", "
                             + "SiteColor                    =  " + POut.Int(siteLink.SiteColor.ToArgb()) + ", "
                             + "ForeColor                    =  " + POut.Int(siteLink.ForeColor.ToArgb()) + ", "
                             + "InnerColor                   =  " + POut.Int(siteLink.InnerColor.ToArgb()) + ", "
                             + "OuterColor                   =  " + POut.Int(siteLink.OuterColor.ToArgb()) + ", "
                             + "ConnectionSettingsHQOverrides=  " + DbHelper.ParamChar + "paramConnectionSettingsHQOverrides "
                             + "WHERE SiteLinkNum = " + POut.Long(siteLink.SiteLinkNum);

            if (siteLink.ConnectionSettingsHQOverrides == null)
            {
                siteLink.ConnectionSettingsHQOverrides = "";
            }
            OdSqlParameter paramConnectionSettingsHQOverrides = new OdSqlParameter("paramConnectionSettingsHQOverrides", OdDbType.Text, POut.StringParam(siteLink.ConnectionSettingsHQOverrides));

            Db.NonQ(command, paramConnectionSettingsHQOverrides);
        }
Пример #24
0
 private void PrintRelatedHistoricalFigures()
 {
     if (_site.RelatedHistoricalFigures.Count == 0)
     {
         return;
     }
     Html.AppendLine("<div class=\"row\">");
     Html.AppendLine("<div class=\"col-md-12\">");
     Html.AppendLine(Bold("Related Historical Figures") + LineBreak);
     StartList(ListType.Unordered);
     foreach (HistoricalFigure hf in _site.RelatedHistoricalFigures)
     {
         SiteLink hfToSiteLink = hf.RelatedSites.FirstOrDefault(link => link.Site == _site);
         if (hfToSiteLink != null)
         {
             Html.AppendLine(ListItem + hf.ToLink(true, _site));
             if (hfToSiteLink.SubId != 0)
             {
                 Structure structure = _site.Structures.FirstOrDefault(s => s.Id == hfToSiteLink.SubId);
                 if (structure != null)
                 {
                     Html.AppendLine(" - " + structure.ToLink(true, _site) + " - ");
                 }
             }
             if (hfToSiteLink.OccupationId != 0)
             {
                 Structure structure = _site.Structures.FirstOrDefault(s => s.Id == hfToSiteLink.OccupationId);
                 if (structure != null)
                 {
                     Html.AppendLine(" - " + structure.ToLink(true, _site) + " - ");
                 }
             }
             Html.AppendLine(" (" + hfToSiteLink.Type.GetDescription() + ")");
         }
     }
     EndList(ListType.Unordered);
     Html.AppendLine("</div>");
     Html.AppendLine("</div>");
 }
Пример #25
0
        private void butSiteLink_Click(object sender, EventArgs e)
        {
            SiteLink siteLink = SiteLinks.GetFirstOrDefault(x => x.SiteNum == SiteCur.SiteNum);

            if (siteLink == null)
            {
                siteLink = new SiteLink()
                {
                    SiteNum    = SiteCur.SiteNum,
                    ForeColor  = Color.Black,
                    InnerColor = Color.LightCyan,
                    OuterColor = Color.Blue
                };
            }
            FormSiteLinkEdit FormSE = new FormSiteLinkEdit(siteLink);

            FormSE.ShowDialog();
            if (FormSE.DialogResult == DialogResult.OK)
            {
                DataValid.SetInvalid(InvalidType.Sites);
            }
        }
Пример #26
0
        public static string GetSiteUrl(SiteLink link)
        {
            if (link == SiteLink.None)
            {
                return WebsiteRoot;
            }

            string baseUrl = WebsiteLinkBase;
            string linkString = link.ToString();

            if (link == SiteLink.CheckVersion)
            {
                baseUrl = VersionCheck;
                linkString = "Update";
            }
            else if (link == SiteLink.NewVersion)
            {
                linkString = Options.Current.Update.UpgradeURL.Value;
                return string.Format("{0}{1}", WebsiteRoot, linkString);
            }

            return string.Format("{0}{1}/{2}", baseUrl, linkString, AppVersion.Current.ToString());
        }
Пример #27
0
 /// <summary>
 /// Adds a site link to quest machine.
 /// There is no strong unique key to use for site links so they are stored in a flat list.
 /// Only a small number of site links will be ever active at one time in normal play.
 /// </summary>
 /// <param name="siteLink">SiteLink to add.</param>
 public void AddSiteLink(SiteLink siteLink)
 {
     siteLinks.Add(siteLink);
 }
Пример #28
0
        public async Task <IEnumerable <ReleaseInfo> > PerformQuery(TorznabQuery query)
        {
            var loggedInCheck = await RequestStringWithCookies(SearchUrl);

            if (!loggedInCheck.Content.Contains("/logout.php"))
            {
                //Cookie appears to expire after a period of time or logging in to the site via browser
                DateTime lastLoggedInCheck;
                DateTime.TryParse(configData.LastLoggedInCheck.Value, out lastLoggedInCheck);
                if (lastLoggedInCheck < DateTime.Now.AddMinutes(-15))
                {
                    await DoLogin();

                    configData.LastLoggedInCheck.Value = DateTime.Now.ToString("o");
                    SaveConfig();
                }
            }

            var    releases                = new List <ReleaseInfo>();
            bool   configFreeLeechOnly     = configData.FilterString.Value.ToLowerInvariant().Contains("freeleechonly");
            bool   configQualityEncodeOnly = configData.FilterString.Value.ToLowerInvariant().Contains("qualityencodeonly");
            string movieListSearchUrl;

            if (!string.IsNullOrEmpty(query.ImdbID))
            {
                movieListSearchUrl = string.Format("{0}?action=basic&searchstr={1}", SearchUrl, HttpUtility.UrlEncode(query.ImdbID));
            }
            else if (!string.IsNullOrEmpty(query.GetQueryString()))
            {
                movieListSearchUrl = string.Format("{0}?action=basic&searchstr={1}", SearchUrl, HttpUtility.UrlEncode(query.GetQueryString()));
            }
            else
            {
                movieListSearchUrl = SearchUrl;
            }

            var results = await RequestStringWithCookiesAndRetry(movieListSearchUrl);

            try
            {
                CQ mdom = results.Content;

                var mrows = mdom[".torrent_title_box"];
                foreach (var mrow in mrows.Take(5))
                {
                    var mqRow = mrow.Cq();

                    Uri movieReleasesLink = new Uri(SiteLink.TrimEnd('/') + mqRow.Find("a[title='View Torrent']").First().Attr("href").Trim());
                    Uri commentsLink      = new Uri(movieReleasesLink + "#comments");

                    string imdblink = mqRow.Find("span[class='imdb-number-rating']").Length > 0 ? mqRow.Find("span[class='imdb-number-rating'] > a").First().Attr("href").Trim() : "";
                    long   imdb_id  = 0;
                    try
                    {
                        if (!string.IsNullOrWhiteSpace(imdblink) && imdblink.ToLowerInvariant().Contains("tt"))
                        {
                            imdb_id = long.Parse(imdblink.Substring(imdblink.LastIndexOf('t') + 1).Replace("/", ""));
                        }
                    }
                    catch { imdb_id = 0; }

                    var release_results = await RequestStringWithCookiesAndRetry(movieReleasesLink.ToString());

                    //Iterate over the releases for each movie

                    CQ dom = release_results.Content;

                    var rows = dom[".torrent_widget.box.pad"];
                    foreach (var row in rows)
                    {
                        var release = new ReleaseInfo();
                        var qRow    = row.Cq();

                        string   title        = qRow.Find("[id^=desc_] > h2 > strong").First().Text().Trim();
                        Uri      link         = new Uri(SiteLink.TrimEnd('/') + qRow.Find("a[title='Download']").First().Attr("href").Trim());
                        Uri      guid         = new Uri(SiteLink.TrimEnd('/') + qRow.Find("a[title='Permalink']").First().Attr("href").Trim());
                        string   pubDateStr   = qRow.Find("div[class='box pad'] > p:contains('Uploaded by') > span").First().Attr("title").Trim();
                        DateTime pubDate      = DateTime.ParseExact(pubDateStr, "MMM dd yyyy, HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal).ToLocalTime();
                        string   sizeStr      = qRow.Find("[id^=desc_] > div > table > tbody > tr > td > strong:contains('Size:')").First().Parent().Parent().Find("td").Last().Text().Trim();
                        var      seeders      = ParseUtil.CoerceInt(qRow.Find("img[title='Seeders']").First().Parent().Text().Trim());
                        var      peers        = ParseUtil.CoerceInt(qRow.Find("img[title='Leechers']").First().Parent().Text().Trim()) + seeders;
                        var      CoverElement = dom.Find("div[id='poster'] > a > img");
                        if (CoverElement.Any())
                        {
                            Uri CoverUrl = new Uri(dom.Find("div[id='poster'] > a > img").First().Attr("src").Trim());
                            release.BannerUrl = CoverUrl;
                        }

                        bool   freeleech     = qRow.Find("span[class='freeleech']").Length == 1 ? true : false;
                        bool   qualityEncode = qRow.Find("img[class='approved']").Length == 1 ? true : false;
                        string grabs         = qRow.Find("img[title='Snatches']").First().Parent().Text().Trim();
                        if (string.IsNullOrWhiteSpace(sizeStr))
                        {
                            string secondSizeStr = qRow.Find("div[class='details_title'] > strong:contains('(')").Last().Text().Trim();
                            if (secondSizeStr.Length > 3 && secondSizeStr.Contains("(") && secondSizeStr.Contains(")"))
                            {
                                sizeStr = secondSizeStr.Replace("(", "").Replace(")", "").Trim();
                            }
                        }

                        if (string.IsNullOrWhiteSpace(title))
                        {
                            title = dom.Find("div.title_text").Text() + " - " + qRow.Find("div.details_title > a").Text();
                        }


                        release.Title           = title;
                        release.Guid            = guid;
                        release.Link            = link;
                        release.PublishDate     = pubDate;
                        release.Size            = ReleaseInfo.GetBytes(sizeStr);
                        release.Description     = release.Title;
                        release.Seeders         = seeders;
                        release.Peers           = peers;
                        release.MinimumRatio    = 1;
                        release.MinimumSeedTime = 345600;
                        release.Category        = 2000;
                        release.Comments        = movieReleasesLink;
                        if (imdb_id > 0)
                        {
                            release.Imdb = imdb_id;
                        }

                        var files = qRow.Find("div[id^=\"filelist\"] tr").Count() - 1;
                        release.Files = files;
                        release.Grabs = ParseUtil.CoerceLong(grabs);

                        if (freeleech)
                        {
                            release.DownloadVolumeFactor = 0;
                        }
                        else
                        {
                            release.DownloadVolumeFactor = 1;
                        }

                        release.UploadVolumeFactor = 1;

                        if (configFreeLeechOnly && !freeleech)
                        {
                            continue; //Skip release if user only wants FreeLeech
                        }
                        if (configQualityEncodeOnly && !qualityEncode)
                        {
                            continue; //Skip release if user only wants Quality Encode
                        }

                        releases.Add(release);
                    }
                }
            }
            catch (Exception ex)
            {
                OnParseError(results.Content, ex);
            }

            return(releases);
        }
Пример #29
0
        List <ReleaseInfo> parseTorrents(WebClientStringResult results, String seasonep, TorznabQuery query, int already_founded, int limit)
        {
            var releases = new List <ReleaseInfo>();

            try
            {
                CQ dom = results.Content;

                ReleaseInfo release;
                var         rows = dom[".box_torrent_all"].Find(".box_torrent");

                // Check torrents only till we reach the query Limit
                for (int i = 0; (i < rows.Length && ((already_founded + releases.Count) < limit)); i++)
                {
                    try
                    {
                        CQ  qRow = rows[i].Cq();
                        var key  = dom["link[rel=alternate]"].First().Attr("href").Split('=').Last();

                        release = new ReleaseInfo();
                        var torrentTxt = qRow.Find(".torrent_txt, .torrent_txt2").Find("a").Get(0);
                        //if (torrentTxt == null) continue;
                        release.Title       = torrentTxt.GetAttribute("title");
                        release.Description = qRow.Find("span").Get(0).GetAttribute("title") + " " + qRow.Find("a.infolink").Text();

                        release.MinimumRatio         = 1;
                        release.MinimumSeedTime      = 172800;
                        release.DownloadVolumeFactor = 0;
                        release.UploadVolumeFactor   = 1;

                        string downloadLink = SiteLink + torrentTxt.GetAttribute("href");
                        string downloadId   = downloadLink.Substring(downloadLink.IndexOf("&id=") + 4);

                        release.Link     = new Uri(SiteLink.ToString() + "torrents.php?action=download&id=" + downloadId + "&key=" + key);
                        release.Comments = new Uri(SiteLink.ToString() + "torrents.php?action=details&id=" + downloadId);
                        release.Guid     = new Uri(release.Comments.ToString() + "#comments");;
                        release.Seeders  = ParseUtil.CoerceInt(qRow.Find(".box_s2").Find("a").First().Text());
                        release.Peers    = ParseUtil.CoerceInt(qRow.Find(".box_l2").Find("a").First().Text()) + release.Seeders;
                        var imdblink = qRow.Find("a[href*=\".imdb.com/title\"]").Attr("href");
                        release.Imdb = ParseUtil.GetLongFromString(imdblink);
                        var banner = qRow.Find("img.infobar_ico").Attr("onmouseover");
                        if (banner != null)
                        {
                            Regex BannerRegEx = new Regex(@"mutat\('(.*?)', '", RegexOptions.Compiled);
                            var   BannerMatch = BannerRegEx.Match(banner);
                            var   bannerurl   = BannerMatch.Groups[1].Value;
                            release.BannerUrl = new Uri(bannerurl);
                        }
                        release.PublishDate = DateTime.Parse(qRow.Find(".box_feltoltve2").Get(0).InnerHTML.Replace("<br />", " "), CultureInfo.InvariantCulture);
                        string[] sizeSplit = qRow.Find(".box_meret2").Get(0).InnerText.Split(' ');
                        release.Size = ReleaseInfo.GetBytes(sizeSplit[1].ToLower(), ParseUtil.CoerceFloat(sizeSplit[0]));
                        string catlink = qRow.Find("a:has(img[class='categ_link'])").First().Attr("href");
                        string cat     = ParseUtil.GetArgumentFromQueryString(catlink, "tipus");
                        release.Category = MapTrackerCatToNewznab(cat);

                        /* if the release name not contains the language we add it because it is know from category */
                        if (cat.Contains("hun") && !release.Title.Contains("hun"))
                        {
                            release.Title += ".hun";
                        }

                        if (seasonep == null)
                        {
                            releases.Add(release);
                        }

                        else
                        {
                            if (query.MatchQueryStringAND(release.Title, null, seasonep))
                            {
                                /* For sonnar if the search querry was english the title must be english also so we need to change the Description and Title */
                                var temp = release.Title;

                                // releasedata everithing after Name.S0Xe0X
                                String releasedata = release.Title.Split(new[] { seasonep }, StringSplitOptions.None)[1].Trim();

                                /* if the release name not contains the language we add it because it is know from category */
                                if (cat.Contains("hun") && !releasedata.Contains("hun"))
                                {
                                    releasedata += ".hun";
                                }

                                // release description contains [imdb: ****] but we only need the data before it for title
                                String[] description = { release.Description, "" };
                                if (release.Description.Contains("[imdb:"))
                                {
                                    description    = release.Description.Split('[');
                                    description[1] = "[" + description[1];
                                }

                                release.Title = (description[0].Trim() + "." + seasonep.Trim() + "." + releasedata.Trim('.')).Replace(' ', '.');

                                // if search is done for S0X than we dont want to put . between S0X and E0X
                                Match match = Regex.Match(releasedata, @"^E\d\d?");
                                if (seasonep.Length == 3 && match.Success)
                                {
                                    release.Title = (description[0].Trim() + "." + seasonep.Trim() + releasedata.Trim('.')).Replace(' ', '.');
                                }

                                // add back imdb points to the description [imdb: 8.7]
                                release.Description = temp + " " + description[1];
                                release.Description = release.Description.Trim();
                                releases.Add(release);
                            }
                        }
                    }
                    catch (FormatException ex)
                    {
                        logger.Error("Problem of parsing Torrent:" + rows[i].InnerHTML);
                        logger.Error("Exception was the following:" + ex);
                    }
                }
            }
            catch (Exception ex)
            {
                OnParseError(results.Content, ex);
            }

            return(releases);
        }
Пример #30
0
        internal override void ProcessMappingsFromRowValues(RowValues values)
        {
            SiteLink = new SiteLink();

            Identifier.ReadFromRowValues(values);

            values.ConvertToEntity(this, Mappings);
        }
Пример #31
0
        private async Task <List <ReleaseInfo> > PerformQuerySearch(TorznabQuery query, bool matchWords)
        {
            var releases = new List <ReleaseInfo>();
            // search only the longest word, we filter the results later
            var searchTerm = GetLongestWord(query.SearchTerm);
            var url        = SiteLink + SearchUrl + searchTerm;
            var result     = await RequestWithCookiesAsync(url, referer : url);

            if (result.Status != HttpStatusCode.OK)
            {
                throw new ExceptionWithConfigData(result.ContentString, configData);
            }

            try
            {
                var searchResultParser = new HtmlParser();
                var doc = searchResultParser.ParseDocument(result.ContentString);

                var rows = doc.QuerySelectorAll("div.seccion#buscador > div.card > div.card-body > p");

                if (rows.First().TextContent.Contains("Introduce alguna palabra para buscar con al menos 2 letras."))
                {
                    return(releases); //no enough search terms
                }

                foreach (var row in rows.Skip(2))
                {
                    //href=/pelicula/6981/Saga-Spiderman
                    var link    = string.Format("{0}{1}", SiteLink.TrimEnd('/'), row.QuerySelector("p > span > a").GetAttribute("href"));
                    var title   = row.QuerySelector("p > span > a").TextContent;
                    var cat     = GetCategory(title, link);
                    var quality = "";

                    switch (GetCategoryFromURL(link))
                    {
                    case "pelicula":
                    case "serie":
                        quality = Regex.Replace(row.QuerySelector("p > span > span").TextContent, "([()])", "");

                        break;
                    }

                    switch (cat)
                    {
                    case "pelicula":
                    case "pelicula4k":
                    case "serie":
                    case "seriehd":
                    case "musica":
                        await ParseRelease(releases, link, title, cat, quality, query, matchWords);

                        break;

                    default:     //ignore different categories
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                OnParseError(result.ContentString, ex);
            }

            return(releases);
        }
Пример #32
0
        public async Task <IEnumerable <ReleaseInfo> > PerformQuery(TorznabQuery query)
        {
            var releases     = new List <ReleaseInfo>();
            var searchString = query.GetQueryString();
            var pairs        = new List <KeyValuePair <string, string> >();

            pairs.Add(new KeyValuePair <string, string>("nyit_sorozat_resz", "true"));
            pairs.Add(new KeyValuePair <string, string>("miben", "name"));
            pairs.Add(new KeyValuePair <string, string>("tipus", "kivalasztottak_kozott"));
            pairs.Add(new KeyValuePair <string, string>("submit.x", "1"));
            pairs.Add(new KeyValuePair <string, string>("submit.y", "1"));
            pairs.Add(new KeyValuePair <string, string>("submit", "Ok"));
            pairs.Add(new KeyValuePair <string, string>("mire", searchString));

            var cats = MapTorznabCapsToTrackers(query);

            if (cats.Count == 0)
            {
                cats = GetAllTrackerCategories();
            }

            foreach (var lcat in LanguageCats)
            {
                if (!configData.Hungarian.Value)
                {
                    cats.Remove(lcat + "_hun");
                }
                if (!configData.English.Value)
                {
                    cats.Remove(lcat);
                }
            }

            foreach (var cat in cats)
            {
                pairs.Add(new KeyValuePair <string, string>("kivalasztott_tipus[]", cat));
            }

            var results = await PostDataWithCookiesAndRetry(SearchUrl, pairs);

            try
            {
                CQ dom = results.Content;

                ReleaseInfo release;
                var         rows = dom[".box_torrent_all"].Find(".box_torrent");

                foreach (var row in rows)
                {
                    CQ qRow = row.Cq();

                    var key = dom ["link[rel=alternate]"].First().Attr("href").Split('=').Last();

                    release = new ReleaseInfo();
                    var torrentTxt = qRow.Find(".torrent_txt, .torrent_txt2").Find("a").Get(0);
                    //if (torrentTxt == null) continue;
                    release.Title                = torrentTxt.GetAttribute("title");
                    release.Description          = qRow.Find("div.siterank").Text();
                    release.MinimumRatio         = 1;
                    release.MinimumSeedTime      = 172800;
                    release.DownloadVolumeFactor = 0;
                    release.UploadVolumeFactor   = 1;

                    string downloadLink = SiteLink + torrentTxt.GetAttribute("href");
                    string downloadId   = downloadLink.Substring(downloadLink.IndexOf("&id=") + 4);

                    release.Link     = new Uri(SiteLink.ToString() + "torrents.php?action=download&id=" + downloadId + "&key=" + key);
                    release.Comments = new Uri(SiteLink.ToString() + "torrents.php?action=details&id=" + downloadId);
                    release.Guid     = new Uri(release.Comments.ToString() + "#comments");;
                    release.Seeders  = ParseUtil.CoerceInt(qRow.Find(".box_s2").Find("a").First().Text());
                    release.Peers    = ParseUtil.CoerceInt(qRow.Find(".box_l2").Find("a").First().Text()) + release.Seeders;
                    var imdblink = qRow.Find("a[href*=\".imdb.com/title\"]").Attr("href");
                    release.Imdb = ParseUtil.GetLongFromString(imdblink);
                    var banner = qRow.Find("img.infobar_ico").Attr("onmouseover");
                    if (banner != null)
                    {
                        Regex BannerRegEx = new Regex(@"mutat\('(.*?)', '", RegexOptions.Compiled);
                        var   BannerMatch = BannerRegEx.Match(banner);
                        var   bannerurl   = BannerMatch.Groups[1].Value;
                        release.BannerUrl = new Uri(bannerurl);
                    }
                    release.PublishDate = DateTime.Parse(qRow.Find(".box_feltoltve2").Get(0).InnerHTML.Replace("<br />", " "), CultureInfo.InvariantCulture);
                    string[] sizeSplit = qRow.Find(".box_meret2").Get(0).InnerText.Split(' ');
                    release.Size = ReleaseInfo.GetBytes(sizeSplit[1].ToLower(), ParseUtil.CoerceFloat(sizeSplit[0]));
                    string catlink = qRow.Find("a:has(img[class='categ_link'])").First().Attr("href");
                    string cat     = ParseUtil.GetArgumentFromQueryString(catlink, "tipus");
                    release.Category = MapTrackerCatToNewznab(cat);

                    releases.Add(release);
                }
            }
            catch (Exception ex)
            {
                OnParseError(results.Content, ex);
            }

            return(releases);
        }
        private SiteLink MapSiteLink(IDataReader reader)
        {
            SiteLink s = new SiteLink();
            int startingIndex = 0;

            s.Id = reader.GetSafeInt32(startingIndex++);
            s.Url = reader.GetSafeString(startingIndex++);
            s.Type = reader.GetSafeInt32(startingIndex++);
            s.Group = reader.GetSafeInt16(startingIndex++);
            s.OwnerId = reader.GetSafeInt32(startingIndex++);
            s.OwnerType = reader.GetSafeInt32(startingIndex++);
            s.DateAdded = reader.GetSafeDateTime(startingIndex++);
            s.DateModified = reader.GetSafeDateTime(startingIndex++);
            s.LanguageCode = reader.GetSafeString(startingIndex++);
            return s;
        }
Пример #34
0
 public static void OpenSite(SiteLink link)
 {
     OpenUrl(GetSiteUrl(link));
 }