Exemplo n.º 1
0
 public static List <string> GetLinkArray(ResourceContentFile cf)
 {
     if (cf.LinkCount == 0 || cf.Links == null)
     {
         return(new List <string>());
     }
     else
     {
         return(new List <string>(cf.Links.Split('\n')));
     }
 }
Exemplo n.º 2
0
        public static void UpdateLinks(ResourceContentFile content)
        {
            var valids = new List <string>();

            if (content.LinkCount > 0 || content.Links != null)
            {
                valids = new List <string>(content.Links.Split('\n'));                                                // get previous links
            }
            if (content.FileName.EndsWith(".sdp"))
            {
                return;
            }

            if (!Debugger.IsAttached)
            {
                // should we use cached entries or run full check?
                if (content.Resource.LastLinkCheck != null)
                {
                    if (content.LinkCount > 0 &&
                        DateTime.UtcNow.Subtract(content.Resource.LastLinkCheck.Value).TotalMinutes < CheckPeriodForValidLinks)
                    {
                        return;
                    }
                    if (content.LinkCount == 0 &&
                        DateTime.UtcNow.Subtract(content.Resource.LastLinkCheck.Value).TotalMinutes < CheckPeriodForMissingLinks)
                    {
                        return;
                    }
                }
            }

            // get mirror list from jobjol
            foreach (var link in GetJobjolMirrorLinks(content.FileName, content.Resource.InternalName))
            {
                if (!valids.Contains(link))
                {
                    valids.Add(link);
                }
            }

            // combine with hardcoded mirrors
            foreach (var url in Mirrors)
            {
                var replaced = url.Replace("%t", content.Resource.TypeID == ResourceType.Map ? "maps" : "games").Replace("%f", content.FileName);
                if (!valids.Contains(replaced))
                {
                    valids.Add(replaced);
                }
            }

            // check validity of all links at once

            Task.WaitAll(new List <string>(valids).Select(link => Task.Factory.StartNew(() => ValidateLink(link, content.Length, valids))).ToArray());

            valids = valids.Distinct().ToList();

            lock (content)
            {
                content.LinkCount = valids.Count;
                content.Resource.LastLinkCheck = DateTime.UtcNow;
                content.Links = string.Join("\n", valids.ToArray());
            }
        }
Exemplo n.º 3
0
 public static string GetTorrentPath(ResourceContentFile cf)
 {
     return(GetTorrentPath(cf.Resource.InternalName, cf.Md5));
 }
Exemplo n.º 4
0
        public static 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)
        {
            if (md5 == null)
            {
                throw new ArgumentNullException("md5");
            }
            if (archiveName == null)
            {
                throw new ArgumentNullException("archiveName");
            }
            if (internalName == null)
            {
                throw new ArgumentNullException("internalName");
            }
            if (serializedData == null)
            {
                throw new ArgumentNullException("serializedData");
            }
            if (torrentData == null)
            {
                throw new ArgumentNullException("torrentData");
            }
            if (PlasmaServerApiVersion > apiVersion)
            {
                throw new Exception("Obsolete PlasmaServer Client");
            }
            if (dependencies == null)
            {
                dependencies = new List <string>();
            }

            var db = new ZkDataContext();


            var contentFile = db.ResourceContentFiles.FirstOrDefault(x => x.Md5 == md5);

            if (contentFile != null)
            {
                // content file already stored
                if (contentFile.Resource.InternalName != internalName)
                {
                    return(ReturnValue.Md5AlreadyExistsWithDifferentName);
                }

                // new spring version we add its hash
                StoreMetadata(md5, contentFile.Resource, serializedData, torrentData, minimap, metalMap, heightMap);
                db.SaveChanges();
                return(ReturnValue.Ok);
            }

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

            if (resource == null)
            {
                resource = new Resource {
                    InternalName = internalName, TypeID = resourceType
                };
                db.Resources.Add(resource);
                StoreMetadata(md5, resource, serializedData, torrentData, minimap, metalMap, heightMap);
            }

            if (!resource.ResourceDependencies.Select(x => x.NeedsInternalName).Except(dependencies).Any())
            {
                // new dependencies are superset
                foreach (var depend in dependencies)
                {
                    // add missing dependencies
                    var s = depend;
                    if (!resource.ResourceDependencies.Any(x => x.NeedsInternalName == s))
                    {
                        resource.ResourceDependencies.Add(new ResourceDependency {
                            NeedsInternalName = depend
                        });
                    }
                }
            }

            if (resource.ResourceContentFiles.Any(x => x.Length == length && x.Md5 != md5))
            {
                return(ReturnValue.Md5AlreadyExistsWithDifferentName);
                // add proper message - file exists with different md5 and same size - cant register cant detect mirrors
            }

            var newContentFile = new ResourceContentFile {
                FileName = archiveName, Length = length, Md5 = md5, Resource = resource
            };

            resource.ResourceContentFiles.Add(newContentFile);
            ResourceLinkProvider.UpdateLinks(newContentFile);
            File.WriteAllBytes(GetTorrentPath(internalName, md5), torrentData); // add new torrent file

            db.SaveChanges();



            return(ReturnValue.Ok);
        }
Exemplo n.º 5
0
 public static byte[] GetTorrentData(ResourceContentFile cf)
 {
     return(File.ReadAllBytes(GetTorrentPath(cf)));
 }