using System; using System.Diagnostics; using System.IO; using System.Net; using MonoTorrent; using MonoTorrent.Client.Encryption; using MonoTorrent.Common; using MonoTorrent.Dht; using MonoTorrent.Dht.Listeners; using MonoTorrent.Tracker; using MonoTorrent.Client; using HttpListener = MonoTorrent.Tracker.Listeners.HttpListener; namespace PatcherServer.Helper { public static class TrackerHelper { public const int CLIENT_PORT = 6666; public const int DHT_PORT = 6665; public static TorrentSettings StandartTorrentSettings { get; private set; } public static EngineSettings ClientSettings { get; private set; } private static Tracker tracker; private static HttpListener listener; private static ClientEngine clientEnginge; public static void Initialize() { StandartTorrentSettings = new TorrentSettings { MaxConnections = 120, UploadSlots = 120, MaxUploadSpeed = 6000, UseDht = true, EnablePeerExchange = true, InitialSeedingEnabled = true }; ClientSettings = new EngineSettings(DataProvider.PatchfilesFolder, 6666) { AllowedEncryption = EncryptionTypes.All, GlobalMaxUploadSpeed = 60000, GlobalMaxConnections = 10240, GlobalMaxHalfOpenConnections = 200 }; tracker = new Tracker { MinAnnounceInterval = TimeSpan.FromSeconds(10), AnnounceInterval = TimeSpan.FromSeconds(30), AllowNonCompact = true, AllowScrape = true }; clientEnginge = new ClientEngine(ClientSettings); DhtListener dhtListener = new DhtListener(new IPEndPoint(IPAddress.Any, DHT_PORT)); clientEnginge.RegisterDht(new DhtEngine(dhtListener)); clientEnginge.DhtEngine.Start(); clientEnginge.ChangeListenEndpoint(new IPEndPoint(IPAddress.Any, CLIENT_PORT)); clientEnginge.LocalPeerSearchEnabled = true; clientEnginge.StartAll(); } public static void Start() { listener = new HttpListener(DataProvider.TrackerURL); tracker.RegisterListener(listener); listener.Start(); } public static void Stop() { listener.Stop(); } public static void LoadTorrents() { int count = 0; foreach (var path in Directory.GetFiles(DataProvider.TorrentfilesFolder)) { LoadTorrent(path); count ++; } Trace.WriteLine("Loaded " + count + " torrents."); } public static void LoadTorrent(string path) { Debug.WriteLine("Loaded " + path); Torrent torrent = Torrent.Load(path); TorrentManager manager = new TorrentManager(torrent, DataProvider.PatchfilesFolder, StandartTorrentSettings); manager.TorrentStateChanged += TorrentStateChanged; AddToTracker(torrent); clientEnginge.Register(manager); manager.Start(); manager.TrackerManager.Announce(); } public static void AddToTracker(Torrent torrent) { InfoHashTrackable trackable = new InfoHashTrackable(torrent); tracker.Add(trackable); } private static void TorrentStateChanged(object sender, TorrentStateChangedEventArgs e) { Trace.WriteLine("Changed torrent state from " + e.OldState + " to " + e.NewState); } public static void CreateTorrent(string filePath, string savePath) { TorrentCreator creator = new TorrentCreator { Comment = "Generated Patch-File torrent.", CreatedBy = "skeleten's patch system", Publisher = "skeleten's patch system" }; TorrentFileSource source = new TorrentFileSource(filePath); AddAnnounces(creator); CreateTorrentToFile(creator, savePath, source); TorrentManager manager = new TorrentManager(Torrent.Load(savePath), DataProvider.PatchfilesFolder, StandartTorrentSettings); clientEnginge.Register(manager); manager.Start(); } private static void AddAnnounces(TorrentCreator creator) { RawTrackerTier tracker = new RawTrackerTier(); tracker.Add(DataProvider.TrackerURL); creator.Announces.Add(tracker); } private static void CreateTorrentToFile(TorrentCreator creator, string path, ITorrentFileSource filesource) { FileStream outputStream = File.Exists(path) ? new FileStream(path, FileMode.Truncate, FileAccess.ReadWrite) : File.Create(path); creator.Create(filesource, outputStream); } } }