Exemplo n.º 1
0
        public static string GenerateLink(NexusData nexus, Address address, string name = null)
        {
            if (address.IsInterop)
            {
                try
                {
                    var temp = Pay.Chains.NeoWallet.DecodeAddress(address);
                    return($"<a href=\"https://neoscan.io/address/{temp}\" target=\"_blank\">{temp}</a>");
                }
                catch (Exception e)
                {
                    // skip for now, check later tx ED66C4F42E52EB720F7B4DC25B2CE25F65315F384F1F6A27BAEC56C01CE36094
                }
            }

            if (name == null)
            {
                var account = nexus.FindAccount(address, false);
                if (account != null && account.Name != ValidationUtils.ANONYMOUS)
                {
                    name = account.Name;
                }
                else
                {
                    name = address.Text;
                }
            }

            return($"<a href=\"/address/{address.Text}\">{name}</a>");
        }
Exemplo n.º 2
0
        public static string GenerateLink(NexusData nexus, Address address, string name = null)
        {
            if (address.IsInterop)
            {
                try
                {
                    string addressText = null;
                    string url         = null;

                    switch (address.PlatformID)
                    {
                    case NeoWallet.NeoID:
                    {
                        addressText = Pay.Chains.NeoWallet.DecodeAddress(address);
                        url         = "https://neoscan.io/address/";
                        break;
                    }

                    case EthereumWallet.EthereumID:
                    {
                        addressText = Pay.Chains.EthereumWallet.DecodeAddress(address);
                        url         = "https://etherscan.io/address/";
                        break;
                    }

                        /* case BscWallet.BscID:
                         *  {
                         *      addressText = Pay.Chains.BscWallet.DecodeAddress(address);
                         *      url = "https://bscscan.com/address/";
                         *      break;
                         *  } */
                    }

                    if (url != null && addressText != null)
                    {
                        return($"<a href=\"{url}/{addressText}\" target=\"_blank\">{addressText}</a>");
                    }
                }
                catch (Exception e)
                {
                    // skip for now, check later tx ED66C4F42E52EB720F7B4DC25B2CE25F65315F384F1F6A27BAEC56C01CE36094
                }
            }

            if (name == null)
            {
                var account = nexus.FindAccount(address, false);
                if (account != null && account.Name != ValidationUtils.ANONYMOUS_NAME)
                {
                    name = account.Name;
                }
                else
                {
                    name = address.Text;
                }
            }

            return($"<a href=\"/address/{address.Text}\">{name}</a>");
        }
Exemplo n.º 3
0
    /// <summary>
    /// Creates a nexus based on the Data Identifier parameters
    /// </summary>
    /// <param name="entityIdentifier">Entity Identifier</param>
    /// <param name="pos">Position</param>
    /// <param name="rot">Rotation</param>
    public void SpawnNexus(string entityIdentifier, Vector3 pos, Quaternion rot)
    {
        NexusData  def               = GameDataManager.instance.GetEntityData(entityIdentifier) as NexusData;
        GameObject nexusObj          = SpawnManager.instance.InstantiatePool(def.m_prefab, pos, rot);
        AIEntity   aientityComponent = nexusObj.GetComponent <AIEntity>();

        aientityComponent.InitializeEntity(def, Guid.NewGuid().ToString());
        NetworkServer.Spawn(nexusObj);
    }
Exemplo n.º 4
0
        public LinkAddressTag(NexusData nexus, Document doc, string key) : base(doc)
        {
            this.nexus = nexus;

            if (key.StartsWith("_"))
            {
                hideName = true;
                key      = key.Substring(1);
            }

            _key = RenderingKey.Parse(key, RenderingType.String);
        }
Exemplo n.º 5
0
        static void Main(string[] args)
        {
            Console.WriteLine("Initializing Phantasma Block Explorer....");

            menus = new List <MenuContext>();
            menus.Add(new MenuContext()
            {
                Text = "Blocks", Url = "/chain/main", Active = true
            });
            //menus.Add(new MenuContext() { Text = "Transactions", Url = "/transactions", Active = true });
            // menus.Add(new MenuContext() { Text = "Chains", Url = "/chains", Active = false });
            //menus.Add(new MenuContext() { Text = "Blocks", Url = "/blocks", Active = false });
            // menus.Add(new MenuContext() { Text = "Tokens", Url = "/tokens", Active = false });
            //menus.Add(new MenuContext() { Text = "Addresses", Url = "/addresses", Active = false });

            // TODO this should be updated every 5 minutes or so
            //soulRate = CoinUtils.GetCoinRate(2827);

            var defaultCachePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "/Cache";

            var explorerArgs = new Arguments(args);
            var restURL      = explorerArgs.GetString("phantasma.rest", "http://localhost:7078/api");
            var cachePath    = explorerArgs.GetString("cache.path", defaultCachePath);

            nexus = new NexusData(restURL, cachePath);

            if (!string.IsNullOrEmpty(cachePath))
            {
                Console.WriteLine("Explorer cache path: " + cachePath);
                if (!Directory.Exists(cachePath))
                {
                    Directory.CreateDirectory(cachePath);
                }
            }
            else
            {
                Console.WriteLine("Explorer cache not set");
            }

            Console.WriteLine("Connecting explorer via REST: " + restURL);

            bool   initialized = false;
            string nexusError  = null;

            new Thread(() =>
            {
                if (!nexus.Update())
                {
                    nexusError = "Initialization failed!";
                }

                initialized = true;
                Console.WriteLine("Explorer is now ready");
            }).Start();

            var curPath = Directory.GetCurrentDirectory();

            Console.WriteLine("Current path: " + curPath);

            // initialize a logger
            // either parse the settings from the program args or initialize them manually
            var settings = ServerSettings.Parse(args);

            var server = new HTTPServer(settings, ConsoleLogger.Write);

            var templateEngine = new TemplateEngine(server, "views");

            templateEngine.Compiler.RegisterTag("value", (doc, val) => new ValueTag(doc, val));
            templateEngine.Compiler.RegisterTag("number", (doc, val) => new NumberTag(doc, val));
            templateEngine.Compiler.RegisterTag("hex", (doc, val) => new HexTag(doc, val));
            templateEngine.Compiler.RegisterTag("timeago", (doc, val) => new TimeAgoTag(doc, val));
            templateEngine.Compiler.RegisterTag("async", (doc, val) => new AsyncTag(doc, val));
            templateEngine.Compiler.RegisterTag("link-chain", (doc, val) => new LinkChainTag(doc, val));
            templateEngine.Compiler.RegisterTag("link-tx", (doc, val) => new LinkTransactionTag(doc, val));
            templateEngine.Compiler.RegisterTag("link-address", (doc, val) => new LinkAddressTag(nexus, doc, val));
            templateEngine.Compiler.RegisterTag("link-block", (doc, val) => new LinkBlockTag(doc, val));
            templateEngine.Compiler.RegisterTag("link-org", (doc, val) => new LinkOrganizationTag(doc, val));
            templateEngine.Compiler.RegisterTag("description", (doc, val) => new DescriptionTag(doc, val));
            templateEngine.Compiler.RegisterTag("externalLink", (doc, val) => new LinkExternalTag(doc, val));

            server.Get("/", (request) =>
            {
                return(HTTPResponse.Redirect("/nexus"));
            });

            server.Get("/progress", (request) =>
            {
                var progress = "{\"status\": \"" + nexus.UpdateStatus + "\", \"percent\": " + nexus.UpdateProgress + "}";
                return(HTTPResponse.FromString(progress, HTTPCode.OK, false, "application/json"));
            });

            server.Get("/nexus", (request) =>
            {
                var context = CreateContext();

                if (!initialized)
                {
                    context["progress"] = nexus.UpdateProgress;
                    context["status"]   = nexusError != null ? nexusError : nexus.UpdateStatus;
                    return(templateEngine.Render(context, "layout", "init"));
                }

                context["nexus"] = nexus;
                return(templateEngine.Render(context, "layout", "nexus"));
            });

            server.Get("/chain/{input}", (request) =>
            {
                if (!initialized)
                {
                    return(HTTPResponse.Redirect("/nexus"));
                }

                var chainName = request.GetVariable("input");

                var chain = nexus.FindChainByName(chainName);
                if (chain != null)
                {
                    var context      = CreateContext();
                    context["chain"] = chain;
                    return(templateEngine.Render(context, "layout", "chain"));
                }

                return(Error(templateEngine, "Could not find chain: " + chainName));
            });

            server.Get("/chains", (request) =>
            {
                if (!initialized)
                {
                    return(HTTPResponse.Redirect("/nexus"));
                }

                var context       = CreateContext();
                context["chains"] = nexus.Chains;

                return(templateEngine.Render(context, "layout", "chains"));
            });

            server.Get("/tokens", (request) =>
            {
                if (!initialized)
                {
                    return(HTTPResponse.Redirect("/nexus"));
                }

                var context       = CreateContext();
                context["tokens"] = nexus.Tokens;

                return(templateEngine.Render(context, "layout", "tokens"));
            });

            server.Get("/block/{chain}/{hash}", (request) =>
            {
                if (!initialized)
                {
                    return(HTTPResponse.Redirect("/nexus"));
                }

                var chainName = request.GetVariable("chain");

                var chain = nexus.FindChainByName(chainName);
                if (chain != null)
                {
                    var hash  = Hash.Parse(request.GetVariable("hash"));
                    var block = nexus.FindBlockByHash(chain, hash);
                    if (block != null)
                    {
                        var context      = CreateContext();
                        context["block"] = block;
                        return(templateEngine.Render(context, "layout", "block"));
                    }
                    else
                    {
                        return(Error(templateEngine, "Could not find block with hash: " + hash));
                    }
                }
                else
                {
                    return(Error(templateEngine, "Could not find chain with name: " + chainName));
                }
            });

            server.Get("/height/{chain}/{index}", (request) =>
            {
                if (!initialized)
                {
                    return(HTTPResponse.Redirect("/nexus"));
                }

                var chainName = request.GetVariable("chain");

                var chain = nexus.FindChainByName(chainName);
                if (chain != null)
                {
                    var height = int.Parse(request.GetVariable("index"));
                    var block  = height > 0 && height <= chain.BlockList.Count ? chain.BlockList[height - 1] : null;

                    if (block != null)
                    {
                        var context      = CreateContext();
                        context["block"] = block;
                        return(templateEngine.Render(context, "layout", "block"));
                    }
                    else
                    {
                        return(Error(templateEngine, "Could not find block with height: " + height));
                    }
                }
                else
                {
                    return(Error(templateEngine, "Could not find chain with name: " + chainName));
                }
            });

            server.Get("/tx/{input}", (request) =>
            {
                if (!initialized)
                {
                    return(HTTPResponse.Redirect("/nexus"));
                }

                var hash = Hash.Parse(request.GetVariable("input"));

                var tx = nexus.FindTransaction(nexus.RootChain, hash);
                if (tx != null)
                {
                    var context            = CreateContext();
                    context["transaction"] = tx;

                    return(templateEngine.Render(context, "layout", "transaction"));
                }

                return(Error(templateEngine, "Could not find transaction with hash: " + hash));
            });

            server.Get("/dao/{input}", (request) =>
            {
                if (!initialized)
                {
                    return(HTTPResponse.Redirect("/nexus"));
                }

                var id = request.GetVariable("input");

                var org = nexus.FindOrganization(id);
                if (org != null)
                {
                    var context    = CreateContext();
                    context["dao"] = org;

                    return(templateEngine.Render(context, "layout", "dao"));
                }

                return(Error(templateEngine, "Could not find organization with id: " + id));
            });

            server.Get("/token/{input}", (request) =>
            {
                if (!initialized)
                {
                    return(HTTPResponse.Redirect("/nexus"));
                }

                var symbol = request.GetVariable("input");

                var token = nexus.FindTokenBySymbol(symbol);
                if (token != null)
                {
                    var context      = CreateContext();
                    context["token"] = token;

                    return(templateEngine.Render(context, "layout", "token"));
                }

                return(Error(templateEngine, "Could not find token with symbol: " + symbol));
            });

            server.Get("/address/{input}", (request) =>
            {
                if (!initialized)
                {
                    return(HTTPResponse.Redirect("/nexus"));
                }

                var address = Address.FromText(request.GetVariable("input"));

                var account = nexus.FindAccount(address, true);
                if (account != null)
                {
                    var context        = CreateContext();
                    context["account"] = account;

                    return(templateEngine.Render(context, "layout", "account"));
                }

                return(Error(templateEngine, "Could not find address: " + address));
            });

            server.Get("/leaderboard/{input}", (request) =>
            {
                if (!initialized)
                {
                    return(HTTPResponse.Redirect("/nexus"));
                }

                var input = request.GetVariable("input");

                var leaderboard = nexus.FindLeaderboard(input);

                if (leaderboard != null)
                {
                    var context      = CreateContext();
                    context["board"] = leaderboard;

                    return(templateEngine.Render(context, "layout", "leaderboard"));
                }

                return(Error(templateEngine, "Could not find season: " + input));
            });

            server.Post("/nexus", (request) =>
            {
                if (!initialized)
                {
                    return(HTTPResponse.Redirect("/nexus"));
                }

                var input = request.GetVariable("searchInput");

                var results = nexus.SearchItem(input).Select(x => new SearchResultWithURL()
                {
                    Kind = x.Kind,
                    Text = x.Text,
                    URL  = GetURLForSearch(x.Kind, x.Data)
                }).ToList();

                var context = CreateContext();

                context["results"] = results;

                return(templateEngine.Render(context, "layout", "search"));

                //return Error(templateEngine, "Could not find anything...");
            });

            bool running = true;

            new Thread(() =>
            {
                while (running)
                {
                    Thread.Sleep(1000 * 30);

                    if (initialized)
                    {
                        nexus.Update();
                    }
                }
            }).Start();

            Console.CancelKeyPress += delegate {
                Console.WriteLine("Terminating explorer...");
                running = false;
                try
                {
                    server.Stop();
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                }

                Environment.Exit(0);
            };


            Console.WriteLine($"Explorer running at port {settings.Port}");
            server.Run();
        }