using Newtonsoft.Json;
using Shared.Engine.Utilities;
using System.Web;
namespace Shared.Models.Base
{
public class BaseSettings : Iproxy, Istreamproxy, Icors, Igroup, ICloneable
{
bool _enable;
public bool enable
{
get
{
if (AppInit.conf.defaultOn == "enabled")
return enabled;
return _enable;
}
set
{
_enable = value;
}
}
public bool enabled { get; set; }
public bool spider { get; set; } = true;
public bool kit { get; set; } = true;
public bool IsKitConf { get; set; }
public bool IsCloneable { get; set; }
public string plugin { get; set; }
public int group { get; set; }
public bool group_hide { get; set; } = true;
public bool rhub { get; set; }
public bool rhub_safety { get; set; } = true;
public bool rhub_streamproxy { get; set; }
public bool rhub_fallback { get; set; }
public string[] rhub_geo_disable { get; set; }
public string[] geo_hide { get; set; }
///
/// Список устройств которым выводить источник не зависимво от rhub
///
public string client_type { get; set; }
///
/// Список устройств которым выводить источник при включеном rhub
///
public string rch_access { get; set; }
public string RchAccessNotSupport(bool nocheck = false)
{
if (string.IsNullOrWhiteSpace(rch_access))
return null;
if (nocheck == false)
{
// rch выключен
// разрешен fallback
// указан webcorshost или включен corseu
if (!rhub || rhub_fallback || !string.IsNullOrWhiteSpace(webcorshost) || corseu)
return null;
}
var noAccess = new List(3);
if (!rch_access.Contains("apk"))
noAccess.Add("apk");
if (!rch_access.Contains("cors"))
noAccess.Add("cors");
if (!rch_access.Contains("web"))
noAccess.Add("web");
return noAccess.Count > 0 ? string.Join(",", noAccess) : null;
}
public bool rip { get; set; }
public int cache_time { get; set; }
public string displayname { get; set; }
public int displayindex { get; set; }
public string overridehost { get; set; }
public string[] overridehosts { get; set; }
public string overridepasswd { get; set; }
public string host { get; set; }
public string apihost { get; set; }
public string scheme { get; set; }
public bool hls { get; set; }
public string cookie { get; set; }
public string token { get; set; }
[JsonProperty("headers",
ObjectCreationHandling = ObjectCreationHandling.Replace, // ← заменить, а не дополнять
NullValueHandling = NullValueHandling.Ignore // ← не затирать null-ом
)]
public Dictionary headers { get; set; }
[JsonProperty("headers_stream",
ObjectCreationHandling = ObjectCreationHandling.Replace, // ← заменить, а не дополнять
NullValueHandling = NullValueHandling.Ignore // ← не затирать null-ом
)]
public Dictionary headers_stream { get; set; }
[JsonProperty("headers_image",
ObjectCreationHandling = ObjectCreationHandling.Replace, // ← заменить, а не дополнять
NullValueHandling = NullValueHandling.Ignore // ← не затирать null-ом
)]
public Dictionary headers_image { get; set; }
public VastConf vast { get; set; }
public string priorityBrowser { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public int? httptimeout { get; set; }
public int GetHttpTimeout() => httpversion ?? 8;
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public int? httpversion { get; set; }
public int GetHttpVersion() => httpversion ?? 1;
#region proxy
public bool useproxy { get; set; }
public string globalnameproxy { get; set; }
public ProxySettings proxy { get; set; }
public bool useproxystream { get; set; }
public bool streamproxy { get; set; }
public bool streamproxy_preview { get; set; }
public bool apnstream { get; set; }
public string[] geostreamproxy { get; set; }
public string rchstreamproxy { get; set; }
public ApnConf apn { get; set; }
public bool qualitys_proxy { get; set; }
public bool url_reserve { get; set; }
public string stream_access { get; set; }
public string StreamAccessNotSupport(bool nocheck = false)
{
if (string.IsNullOrWhiteSpace(stream_access))
return null;
if (nocheck == false)
{
if (AppInit.conf.serverproxy.forced_apn && !string.IsNullOrWhiteSpace(AppInit.conf?.apn?.host))
return null;
if (rhub && !rhub_streamproxy && !rhub_fallback && rhub_geo_disable == null) { }
else
{
if (streamproxy || apnstream || qualitys_proxy || geostreamproxy != null || rchstreamproxy != null)
return null;
}
}
var noAccess = new List(3);
if (!stream_access.Contains("apk"))
noAccess.Add("apk");
if (!stream_access.Contains("cors"))
noAccess.Add("cors");
if (!stream_access.Contains("web"))
noAccess.Add("web");
return noAccess.Count > 0 ? string.Join(",", noAccess) : null;
}
#endregion
#region cors
public bool corseu { get; set; }
public string webcorshost { get; set; }
public string corsHost()
{
string crhost = !string.IsNullOrWhiteSpace(webcorshost) ? webcorshost : corseu ? AppInit.conf.corsehost : null;
if (string.IsNullOrWhiteSpace(crhost))
return host;
if (crhost.Contains("{encode_uri}") || crhost.Contains("{uri}"))
return crhost.Replace("{encode_uri}", HttpUtility.UrlEncode(host)).Replace("{uri}", host);
return $"{crhost}/{host}";
}
public string cors(string uri)
{
string crhost = !string.IsNullOrWhiteSpace(webcorshost) ? webcorshost : corseu ? AppInit.conf.corsehost : null;
if (string.IsNullOrWhiteSpace(crhost) || string.IsNullOrWhiteSpace(uri))
return uri;
if (uri.AsSpan().Contains(IPNetwork.ExtractHost(crhost), StringComparison.OrdinalIgnoreCase))
return uri;
crhost = crhost.Trim();
if (crhost.Contains("{encode_uri}") || crhost.Contains("{uri}"))
return crhost.Replace("{encode_uri}", HttpUtility.UrlEncode(uri)).Replace("{uri}", uri);
return $"{crhost}/{uri}";
}
#endregion
public string Decrypt(ReadOnlySpan data)
=> BaseDecrypt(data);
public static string BaseDecrypt(ReadOnlySpan data)
{
if (data.IsEmpty)
return null;
return string.Create(data.Length, data, static (span, source) =>
{
for (int i = 0; i < span.Length; i++)
{
span[i] = (char)(source[i] - 3);
}
});
}
object ICloneable.Clone()
{
return MemberwiseClone();
}
}
}