using System; using TYTD.Server.Models; using TYTD.Server.Functions; using System.Threading; using System.Collections.Generic; using System.IO; using System.Reflection; namespace TYTD { public abstract class Api : IDisposable { public Api() { } public virtual void OnStart() { Console.WriteLine("Extension Loaded"); } internal string storage; protected string StorageLocation { get { return storage; } } private System.Timers.Timer t = null; protected void SetTimer(TimeSpan timespan) { if(t == null) { t = new System.Timers.Timer(); t.Elapsed += (sender, e) => { TimerElapsed(); }; } t.Interval = timespan.TotalMilliseconds; t.Start(); } public bool TimerEnabled { get { if (t != null) { return t.Enabled; } else { return false; } } set { if (t != null) { t.Enabled = value; } } } protected virtual void TimerElapsed() { Console.WriteLine("Event Fired"); } public Api AddItem(string id) { Downloader.DownloadItem(id); return this; } internal void SendDLStart(object sender,DownloadStartEventArgs e) { if(DownloadStart != null) { DownloadStart.Invoke(sender, e); } } internal void SendDLComplete(object sender, DownloadCompleteEventArgs e) { if (DownloadComplete != null) { DownloadComplete.Invoke(sender, e); } } public event EventHandler DownloadStart; public event EventHandler DownloadComplete; public void Dispose() { if( t != null) { t.Dispose(); } } } public class DownloadCompleteEventArgs : EventArgs { public bool RegularFile { get; set; } public SavedVideo Video { get; set; } } public class DownloadStartEventArgs : EventArgs { public bool RegularFile { get; set; } public SavedVideo Video { get; set; } public bool Cancel { get; set; } } public static class ApiLoader { internal static List apis = new List(); internal static void DownloadStarted(object sender,DownloadStartEventArgs evt) { foreach(var api in apis) { api.SendDLStart(sender, evt); } } internal static void DownloadComplete(object sender, DownloadCompleteEventArgs evt) { foreach (var api in apis) { api.SendDLComplete(sender, evt); } } public static void Dispose() { foreach(var api in apis) { api.Dispose(); } } internal static void Load(string dll,string confpath) { var asm=Assembly.LoadFile(dll); foreach(var item in asm.GetTypes()) { if(typeof(Api).IsAssignableFrom(item)) { Api api = (Api)Activator.CreateInstance(item); api.storage = confpath; apis.Add(api); Thread thrd = new Thread(new ThreadStart(api.OnStart)); thrd.Start(); } } } public static void Init() { string root = Path.Combine(Environment.CurrentDirectory,"config", "apidll"); string appconfroot = Path.Combine(Environment.CurrentDirectory,"config", "apistore"); foreach(var dir in Directory.GetDirectories(root)) { string name = Path.GetFileName(dir); string dllpath = Path.Combine(root, name, name + ".dll"); string confpath = Path.Combine(appconfroot, name); if(File.Exists(dllpath)) { Directory.CreateDirectory(confpath); Load(dllpath, confpath); } } } } }