コード例 #1
0
        public IActionResult GetServiceInfo(string service, string nodePubKey = null, int node_count = 1)
        {
            //TODO: refactor this into a class so it becomes a thin controller.

            ConnectedNodeResponse        serviceNode;
            List <ConnectedNodeResponse> otherNodes;

            var connectResponse = xrouterService.xrConnect(service, node_count);
            var configReply     = xrouterService.xrShowConfigs();

            var connectReply = connectResponse.Reply;

            if (string.IsNullOrWhiteSpace(nodePubKey))
            {
                serviceNode = serviceNode = connectReply.OrderByDescending(n => n.Score).FirstOrDefault();
                // split node list
                otherNodes = connectReply.Where(s => s.NodePubKey != serviceNode.NodePubKey).ToList();
            }
            else
            {
                serviceNode = connectReply.Find(s => s.NodePubKey == nodePubKey);
                otherNodes  = connectReply.Where(s => s.NodePubKey != nodePubKey).ToList();
            }

            if (string.IsNullOrEmpty(serviceNode.NodePubKey))
            {
                return(StatusCode(StatusCodes.Status500InternalServerError, "Service node SnodeKey is empty."));
            }

            var serviceNodeConfig = configReply.Find(c => c.NodePubKey == serviceNode.NodePubKey);

            var serviceNodeConfigElements = serviceNodeConfig.Config.Split(new string[] { "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries)
                                            .Select(value => value.Split('='));

            string serviceNodeHost = null;

            if (serviceNodeConfigElements.Any(lc => lc[0] == "host"))
            {
                serviceNodeHost = serviceNodeConfigElements.FirstOrDefault(e => e[0] == "host")[1];
            }

            string serviceNodePort = null;

            if (serviceNodeConfigElements.Any(lc => lc[0] == "port"))
            {
                serviceNodePort = serviceNodeConfigElements.FirstOrDefault(e => e[0] == "port")[1];
            }


            var serviceName   = service.Replace("xrs::", "");
            var serviceConfig = serviceNode.Services[serviceName];

            var configReader = new ConfigReader(serviceNodeConfig.Config);

            var mainSectionSettings = configReader.EnumSection("Main");

            string xcloudConfig = string.Empty;

            if (!string.IsNullOrEmpty(serviceConfig.Parameters))
            {
                xcloudConfig += ("parameters=" + serviceConfig.Parameters + "\n");
            }

            var mainFee = configReader.GetSetting("Main", "fee");

            if (!string.IsNullOrEmpty(mainFee))
            {
                if (serviceConfig.Fee != double.Parse(mainFee))
                {
                    xcloudConfig += ("fee=" + serviceConfig.Fee.ToString(new NumberFormatInfo()
                    {
                        NumberDecimalSeparator = "."
                    }) + "\n");
                }
            }
            else
            {
                xcloudConfig += ("fee=" + serviceConfig.Fee.ToString(new NumberFormatInfo()
                {
                    NumberDecimalSeparator = "."
                } +"\n"));
            }

            if (serviceConfig.Disabled)
            {
                xcloudConfig += ("disabled=" + Convert.ToByte(serviceConfig.Disabled) + "\n");
            }

            var mainFetchLimit = configReader.GetSetting("Main", "fetchlimit");

            if (!string.IsNullOrEmpty(mainFetchLimit))
            {
                if (serviceConfig.FetchLimit != int.Parse(mainFetchLimit))
                {
                    xcloudConfig += ("fetchlimit=" + serviceConfig.FetchLimit + "\n");
                }
            }
            else
            {
                xcloudConfig += ("fetchlimit=" + serviceConfig.FetchLimit + "\n");
            }

            var mainClientRequestLimit = configReader.GetSetting("Main", "clientrequestlimit");

            if (!string.IsNullOrEmpty(mainClientRequestLimit))
            {
                if (serviceConfig.RequestLimit != int.Parse(mainClientRequestLimit))
                {
                    xcloudConfig += ("clientrequestlimit=" + serviceConfig.RequestLimit + "\n");
                }
            }
            else
            {
                xcloudConfig += ("clientrequestlimit=" + int.Parse(mainClientRequestLimit) + "\n");
            }

            string help        = string.Empty;
            string description = string.Empty;

            if (serviceNodeConfig?.Plugins.Count > 0)
            {
                // Try get help key from config string
                var configDictionary = serviceNodeConfig.Plugins[serviceName]
                                       .Split(new string[] { "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries)
                                       .Select(value => value.Split('=')).ToDictionary(l => l[0], l => string.Join("", l.Skip(1).ToArray()));

                if (configDictionary.ContainsKey("help"))
                {
                    help = configDictionary["help"];
                }

                if (configDictionary.ContainsKey("description"))
                {
                    description = configDictionary["description"];
                }
            }

            //TODO: Add AutoMapper to replace
            var viewModel = new XCloudServiceResultViewModel
            {
                Service = new XCloudServiceViewModel
                {
                    Help           = help,
                    Description    = description,
                    Disabled       = serviceConfig.Disabled,
                    Fee            = serviceConfig.Fee,
                    FetchLimit     = serviceConfig.FetchLimit,
                    Parameters     = serviceConfig.Parameters,
                    ParametersList = serviceConfig.Parameters != string.Empty ? serviceConfig.Parameters.Split(',').ToList() : null,
                    PaymentAddress = serviceConfig.PaymentAddress,
                    RequestLimit   = serviceConfig.RequestLimit,
                    Config         = xcloudConfig
                },
                Node = new NodeInfoViewModel
                {
                    Type           = (serviceNodePort == "41412" || string.IsNullOrEmpty(serviceNodePort)) ? "Regular" : "Enterprise",
                    Host           = serviceNodeHost,
                    Port           = serviceNodePort,
                    Banned         = serviceNode.Banned,
                    NodePubKey     = serviceNode.NodePubKey,
                    PaymentAddress = serviceNode.PaymentAddress,
                    Score          = serviceNode.Score
                },
                OtherNodes = otherNodes.Select(n => new NodeInfoViewModel {
                    Banned         = n.Banned,
                    NodePubKey     = n.NodePubKey,
                    PaymentAddress = n.PaymentAddress,
                    Score          = n.Score
                }).ToList()
            };

            return(Ok(viewModel));
        }
コード例 #2
0
        public IActionResult GetServiceInfo(string service, string nodePubKey = null, int node_count = 1)
        {
            //TODO: refactor this into a class so it becomes a thin controller.

            ConnectedNodeResponse        serviceNode;
            List <ConnectedNodeResponse> otherNodes;

            var connectReply = this._blocknetService.xrConnect(service, node_count).Reply;
            var configReply  = this._blocknetService.xrShowConfigs();

            if (connectReply == null || configReply == null)
            {
                return(BadRequest());
            }

            if (string.IsNullOrWhiteSpace(nodePubKey))
            {
                // Randomly choose a service node from the list if no nodePubKey is given
                var r     = new Random();
                var index = r.Next(connectReply.Count);
                serviceNode = connectReply[index];
                // split node list
                //otherNodes = connectReply.Skip(index + 1).ToList();
                otherNodes = connectReply.Where(s => s.NodePubKey != nodePubKey).ToList();
            }
            else
            {
                serviceNode = connectReply.Find(s => s.NodePubKey == nodePubKey);
                //otherNodes = connectReply.Skip(connectReply.IndexOf(serviceNode)+1).ToList();
                otherNodes = connectReply.Where(s => s.NodePubKey != nodePubKey).ToList();
            }

            var serviceNodeConfig = configReply.Find(c => c.NodePubKey == serviceNode.NodePubKey);

            var serviceName = service.Replace("xrs::", "");
            var serv        = serviceNode.Services[serviceName];

            string help         = string.Empty;
            string xcloudConfig = string.Empty;

            if (serviceNodeConfig.Plugins.Count > 0)
            {
                // Try get help key from config string
                var dictConfig = serviceNodeConfig.Plugins[serviceName]
                                 .Split(new string[] { "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries)
                                 .Select(value => value.Split('='))
                                 .ToDictionary(pair => pair[0], pair => pair[1]);

                dictConfig.TryGetValue("help", out help);
                xcloudConfig = serviceNodeConfig.Plugins[serviceName];
            }

            //TODO: Add AutoMapper to replace this.
            var viewModel = new XCloudServiceResultViewModel
            {
                Service = new XCloudServiceViewModel
                {
                    HelpDescription = help,
                    Disabled        = serv.Disabled,
                    Fee             = serv.Fee,
                    FetchLimit      = serv.FetchLimit,
                    Parameters      = serv.Parameters,
                    PaymentAddress  = serv.PaymentAddress,
                    RequestLimit    = serv.RequestLimit,
                    Config          = xcloudConfig
                },
                Node = new NodeInfoViewModel
                {
                    Banned         = serviceNode.Banned,
                    NodePubKey     = serviceNode.NodePubKey,
                    PaymentAddress = serviceNode.PaymentAddress,
                    Score          = serviceNode.Score
                },
                OtherNodes = otherNodes.Select(n => new NodeInfoViewModel {
                    Banned         = n.Banned,
                    NodePubKey     = n.NodePubKey,
                    PaymentAddress = n.PaymentAddress,
                    Score          = n.Score
                }).ToList()
            };

            return(Ok(viewModel));
        }