Example #1
0
        static private async Task HandleRpcMessage(string method, string data)
        {
            string       btc          = null;
            string       worker       = null;
            string       group        = null;
            int          rpcId        = -1;
            bool         executed     = false;
            bool         loginNeeded  = false;
            ExecutedCall executedCall = null;

            try
            {
                _isInRPC.Value = true;
                dynamic message     = JsonConvert.DeserializeObject(data);
                int?    rpcIdOption = (int?)message.id;
                rpcId = rpcIdOption ?? -1;

                ThrowIfWeCannotHanldeRPC();
                switch (method)
                {
                case "mining.set.username":
                    btc      = (string)message.username;
                    executed = await miningSetUsername(btc);

                    loginNeeded = executed;
                    break;

                case "mining.set.worker":
                    worker   = (string)message.worker;
                    executed = await miningSetWorker(worker);

                    loginNeeded = executed;
                    break;

                case "mining.set.group":
                    group       = (string)message.group;
                    executed    = miningSetGroup(group);
                    loginNeeded = executed;
                    break;

                case "mining.enable":
                    executed = await SetDevicesEnabled((string)message.device, true);

                    break;

                case "mining.disable":
                    executed = await SetDevicesEnabled((string)message.device, false);

                    break;

                case "mining.start":
                    executed = await StartMining((string)message.device);

                    break;

                case "mining.stop":
                    executed = await StopMining((string)message.device);

                    break;

                case "mining.set.power_mode":
                    // TODO not supported atm
                    SetPowerMode((string)message.device, (TDPSimpleType)message.power_mode);
                    break;

                default:
                    throw new RpcException($"RpcMessage operation not supported for method '{method}'", ErrorCode.UnableToHandleRpc);
                }

                executedCall = new ExecutedCall(rpcId, 0, null);
            }
            catch (RpcException rpcEx)
            {
                executedCall = new ExecutedCall(rpcId, rpcEx.Code, rpcEx.Message);
            }
            finally
            {
                _isInRPC.Value = false;
                if (executedCall != null)
                {
                    // send miner status and send executed
                    var minerStatusMsg = CreateMinerStatusMessage();
                    Send(minerStatusMsg);
                    _lastSendMinerStatusTimestamp.Value = DateTime.UtcNow;
                    // Then executed
                    var rpcMessage = executedCall.Serialize();
                    Send(rpcMessage);
                    // Login if we have to
                    if (loginNeeded)
                    {
                        SetCredentials(btc, worker, group);
                    }
                }
            }
        }