public ReturnValue RegisterResource(int apiVersion,
                                     string springVersion,
                                     string md5,
                                     int length,
                                     ResourceType resourceType,
                                     string archiveName,
                                     string internalName,
                                     byte[] serializedData,
                                     List <string> dependencies,
                                     byte[] minimap,
                                     byte[] metalMap,
                                     byte[] heightMap,
                                     byte[] torrentData)
 {
     return(PlasmaServer.RegisterResource(apiVersion,
                                          springVersion,
                                          md5,
                                          length,
                                          resourceType,
                                          archiveName,
                                          internalName,
                                          serializedData,
                                          dependencies,
                                          minimap,
                                          metalMap,
                                          heightMap,
                                          torrentData));
 }
Ejemplo n.º 2
0
 public bool DownloadFile(string internalName,
                          out List <string> links,
                          out byte[] torrent,
                          out List <string> dependencies,
                          out ResourceType resourceType,
                          out string torrentFileName)
 {
     return(PlasmaServer.DownloadFile(internalName, out links, out torrent, out dependencies, out resourceType, out torrentFileName));
 }
        public ResourceData GetResourceDataByInternalName(string internalName)
        {
            var db    = new ZkDataContext();
            var entry = db.Resources.SingleOrDefault(x => x.InternalName == internalName);

            if (entry != null)
            {
                return(PlasmaServer.ToResourceData(entry));
            }
            else
            {
                return(null);
            }
        }
Ejemplo n.º 4
0
        protected void lqContentFiles_Selecting(object sender, LinqDataSourceSelectEventArgs e)
        {
            var db = new ZkDataContext();

            e.Result =
                db.ResourceContentFiles.Where(x => x.ResourceID == resourceID).ToList().Select(
                    x =>
                    new
            {
                x.FileName,
                x.Md5,
                x.Length,
                TorrentFileName = PlasmaServer.GetTorrentFileName(x),
                x.LinkCount,
                x.ResourceID,
                LinkText = x.Links != null ? string.Join("<br/>", x.Links.Split('\n').Select(y => string.Format("<a href='{0}'>{0}</a>", y)).ToArray()): null
            });
        }
Ejemplo n.º 5
0
        protected void lqContentFiles_Deleting(object sender, LinqDataSourceDeleteEventArgs e)
        {
            e.Cancel = true;
            if ((bool?)Session["login"] == true)
            {
                var db    = new ZkDataContext();
                var todel = db.ResourceContentFiles.Single(x => x.Md5 == ((ResourceContentFile)e.OriginalObject).Md5);
                Utils.SafeDelete(PlasmaServer.GetTorrentPath(todel));

                db.ResourceContentFiles.DeleteOnSubmit(todel);
                db.SaveChanges();

                MessageBox.Show("Deleted " + todel.FileName);
            }
            else
            {
                MessageBox.Show("Not logged in");
            }
        }
        protected void lqResources_Deleting(object sender, LinqDataSourceDeleteEventArgs e)
        {
            e.Cancel = true;
            if ((bool?)Session["login"] == true)
            {
                var db    = new ZkDataContext();
                var todel = db.Resources.Single(x => x.InternalName == ((Resource)e.OriginalObject).InternalName);
                PlasmaServer.RemoveResourceFiles(todel);


                db.Resources.DeleteOnSubmit(todel);
                db.SubmitChanges();

                MessageBox.Show("Deleted " + todel.InternalName);
            }
            else
            {
                MessageBox.Show("Not logged in");
            }
        }
        /// <summary>
        /// Finds resource by either md5 or internal name
        /// </summary>
        /// <param name="md5"></param>
        /// <param name="internalName"></param>
        /// <returns></returns>

        public ResourceData GetResourceData(string md5, string internalName)
        {
            return(PlasmaServer.GetResourceData(md5, internalName));
        }
 public DownloadFileResult DownloadFile(string internalName)
 {
     return(PlasmaServer.DownloadFile(internalName));
 }
 public List <ResourceData> GetResourceList(DateTime?lastChange, out DateTime currentTime)
 {
     return(PlasmaServer.GetResourceList(lastChange, out currentTime));
 }
        public ResourceData GetResourceDataByResourceID(int resourceID)
        {
            var db = new ZkDataContext();

            return(PlasmaServer.ToResourceData(db.Resources.Single(x => x.ResourceID == resourceID)));
        }
Ejemplo n.º 11
0
        public static bool GetLinksAndTorrent(string internalName,
                                              out List <string> links,
                                              out byte[] torrent,
                                              out List <string> dependencies,
                                              out ResourceType resourceType,
                                              out string torrentFileName)
        {
            var db = new ZkDataContext();

            var resource = db.Resources.SingleOrDefault(x => x.InternalName == internalName);

            if (resource == null)
            {
                torrent         = null;
                links           = null;
                dependencies    = null;
                resourceType    = ResourceType.Map;
                torrentFileName = null;
                return(false);
            }

            dependencies = resource.ResourceDependencies.Select(x => x.NeedsInternalName).ToList();
            resourceType = resource.TypeID;

            var bestOld = resource.ResourceContentFiles.FirstOrDefault(x => x.LinkCount == resource.ResourceContentFiles.Max(y => y.LinkCount));

            if (bestOld != null && bestOld.LinkCount > 0 && (resource.MissionID != null ||
                                                             (resource.LastLinkCheck != null && DateTime.UtcNow.Subtract(resource.LastLinkCheck.Value).TotalHours < 2)))
            {
                // use cached values for missions or resources checked less than 1 day ago
                links           = PlasmaServer.GetLinkArray(bestOld);
                torrent         = PlasmaServer.GetTorrentData(bestOld);
                torrentFileName = PlasmaServer.GetTorrentFileName(bestOld);
                if (links.Count > 0)
                {
                    db.Database.ExecuteSqlCommand("UPDATE Resources SET DownloadCount = DownloadCount+1 WHERE ResourceID={0}", resource.ResourceID);
                }
                else
                {
                    db.Database.ExecuteSqlCommand("UPDATE Resources SET NoLinkDownloadCount = NoLinkDownloadCount+1 WHERE ResourceID={0}", resource.ResourceID);
                }

                return(true);
            }

            RequestData data;
            var         isNew = false;

            lock (Requests)
            {
                if (!Requests.TryGetValue(resource.ResourceID, out data))
                {
                    data  = new RequestData(resource.ResourceID);
                    isNew = true;
                    Requests.Add(resource.ResourceID, data);
                }
            }

            if (!isNew)
            {
                // request is ongoing, wait for completion
                data.WaitHandle.WaitOne();
                torrentFileName = PlasmaServer.GetTorrentFileName(data.ContentFile);
                links           = PlasmaServer.GetLinkArray(data.ContentFile);
                torrent         = PlasmaServer.GetTorrentData(data.ContentFile);
                if (links.Count > 0)
                {
                    db.Database.ExecuteSqlCommand("UPDATE Resources SET DownloadCount = DownloadCount+1 WHERE ResourceID={0}", resource.ResourceID);
                }
                else
                {
                    db.Database.ExecuteSqlCommand("UPDATE Resources SET NoLinkDownloadCount = NoLinkDownloadCount+1 WHERE ResourceID={0}", resource.ResourceID);
                }
                return(true);
            }
            else
            {
                // new request - actually perform it
                try
                {
                    var toCheck = from x in resource.ResourceContentFiles
                                  group x by new { x.FileName, x.Length }
                    into g
                    where !g.Key.FileName.EndsWith(".sdp")
                    select g.First();

                    Task.WaitAll(toCheck.Select(x => Task.Factory.StartNew(() => UpdateLinks(x))).ToArray());

                    db.SaveChanges();

                    // find best content file - the one with most links
                    var best = resource.ResourceContentFiles.FirstOrDefault(x => x.LinkCount == resource.ResourceContentFiles.Max(y => y.LinkCount));

                    if (best != null)
                    {
                        data.ContentFile = best;
                    }
                    else
                    {
                        data.ContentFile = resource.ResourceContentFiles.First();  // all content files sux, reurn any
                    }
                    links           = PlasmaServer.GetLinkArray(data.ContentFile);
                    torrent         = PlasmaServer.GetTorrentData(data.ContentFile);
                    torrentFileName = PlasmaServer.GetTorrentFileName(data.ContentFile);
                    if (links.Count > 0)
                    {
                        resource.DownloadCount++;
                    }
                    else
                    {
                        resource.NoLinkDownloadCount++;
                    }
                    db.SaveChanges();
                    return(true);
                }
                finally
                {
                    lock (Requests) Requests.Remove(data.ResourceID);
                    data.WaitHandle.Set(); // notify other waiting Requests that its done
                }
            }
        }