Ejemplo n.º 1
0
        ///--------------------------------------------------------------------------------------------------------
        /// 채굴 시작 요청에 대한 응답메세지 생성
        private static string MakeStartStakingResponse(DateTime requestTime, out bool invalidPassword)
        {
            string msgDateStr = "";

            invalidPassword = false;

            msgDateStr = string.Format("{0:yyyy/MM/dd HH:mm:ss}", requestTime);

            string resultStr = QtumHandler.StartSaking();

            var response = strings.Format(@"
 ---------------------------------
 요청 : {0}
 응답 : {1:yyyy/MM/dd HH:mm:ss}
 결과 : {2}
 ---------------------------------", msgDateStr, DateTimeHandler.GetTimeZoneNow(), resultStr.Count() == 0 ? "Success" : resultStr);

            Logger.Log(response);
            Logger.Log("");

            if (resultStr == strings.GetString("패스워드 오류"))
            {
                invalidPassword = true;
            }

            return(response);
        }
Ejemplo n.º 2
0
        ///--------------------------------------------------------------------------------------------------------
        /// 확인 요청에 대한 응답메세지 생성
        private async Task <string> MakeResponse(long requesterId, DateTime requestTime)
        {
            string msgDateStr = string.Format("{0:yyyy/MM/dd HH:mm:ss}", requestTime);

            Dictionary <string, double> balances = null;

            QtumHandler.GetInfo(out balances);

            string addressListStr = "";

            foreach (KeyValuePair <string, double> elem in balances)
            {
                await SendMessage(requesterId, GetAddressLink(elem.Key));
                await SendMessage(requesterId, elem.Value.ToString());

                addressListStr += string.Format("\n{0} : {1}", GetAddressLink(elem.Key), elem.Value.ToString());
            }

            var response = strings.Format(@"
 ---------------------------------
 요청 : {0}
 응답 : {1:yyyy/MM/dd HH:mm:ss}
{2}
 ---------------------------------", msgDateStr, DateTimeHandler.GetTimeZoneNow(), addressListStr);

            Logger.Log(response);
            Logger.Log("");

            return(response);
        }
        ///--------------------------------------------------------------------------------------------------------
        ///
        protected override async Task <bool> OnStart(long requesterId, string requesterName, DateTime requestTime, params object[] args)
        {
            //if(QtumHandler.IsStakingState())
            //{
            //    await SendMessage(requesterId, strings.GetString("채굴 상태에서는 전송 할 수 없습니다."));
            //    IsCompleted = true;
            //    return true;
            //}

            myAddress  = "";
            destAdress = "";

            myAddressList.Clear();

            QtumHandler.GetInfo(out myAddressList);

            if (myAddressList.Count == 0 || QtumHandler.GetBalance() == 0)
            {
                IsCompleted = true;

                await SendMessage(requesterId, strings.GetString("지갑이 비어있습니다."));
            }
            else
            {
                commandState = eSendCommandState.InputWaitOtp;

                otpWaitUserId = requesterId;

                waitStartTime = DateTime.Now;

                await SendMessage(requesterId, strings.GetString("Otp 인증 번호를 입력 하세요."));
            }

            return(true);
        }
Ejemplo n.º 4
0
        ///--------------------------------------------------------------------------------------------------------
        ///
        protected override async Task <bool> OnStart(long requesterId, string requesterName, DateTime requestTime, params object[] args)
        {
            string msgDateStr = string.Format("{0:yyyy/MM/dd HH:mm:ss}\n", requestTime);

            await SendMessage(requesterId, strings.Format("{0} {1} 트랜잭션 목록을 확인하는 중 입니다.", msgDateStr, requesterName));

            uint listCount = 10;

            if (args.Length > 1 && args[1] != null)
            {
                uint.TryParse(args[1].ToString(), out listCount);
            }

            List <QtumTxInfo> list = QtumHandler.GetTransactions(listCount);

            for (int i = 0; i < list.Count; i += 10)
            {
                string listStr = "--------------------\n";

                for (int k = 0; k < 10; ++k)
                {
                    if ((i + k) >= list.Count)
                    {
                        break;
                    }

                    var txInfo = list[i + k];
                    listStr += txInfo.GetString() + "\n";
                }

                listStr += "--------------------";

                Logger.Log(listStr);
                Logger.Log("");

                await SendMessage(requesterId, listStr);
            }

            Logger.Log("트랜젝션 리스트 응답 완료.\n");
            await SendMessage(requesterId, "트랜젝션 리스트 응답 완료.\n");

            IsCompleted = true;

            return(list.Count != 0);
        }
        ///--------------------------------------------------------------------------------------------------------
        /// 확인 요청에 대한 응답메세지 생성
        private static string MakeCheckResponse(DateTime requestTime)
        {
            string msgDateStr = string.Format("{0:yyyy/MM/dd HH:mm:ss}", requestTime);

            Dictionary <string, double> balances = null;

            string walletState = QtumHandler.GetInfo(out balances);

            var response = strings.Format(@"
 ---------------------------------
 요청 : {0}
 응답 : {1:yyyy/MM/dd HH:mm:ss}
{2}
 ---------------------------------", msgDateStr, DateTimeHandler.GetTimeZoneNow(), walletState);

            Logger.Log(response);
            Logger.Log("");

            return(response);
        }
Ejemplo n.º 6
0
        ///--------------------------------------------------------------------------------------------------------
        /// 확인 요청에 대한 응답메세지 생성
        private async Task <string> MakeResponse(long requesterId, DateTime requestTime)
        {
            await Task <string> .Run(() => { });

            string msgDateStr = string.Format("{0:yyyy/MM/dd HH:mm:ss}", requestTime);

            string newAddress = QtumHandler.CreateNewAddress();

            var response = strings.Format(@"
 ---------------------------------
 요청 : {0}
 응답 : {1:yyyy/MM/dd HH:mm:ss}
{2}
 ---------------------------------", msgDateStr, DateTimeHandler.GetTimeZoneNow(), GetAddressLink(newAddress));

            Logger.Log(response);
            Logger.Log("");

            return(response);
        }
Ejemplo n.º 7
0
        ///--------------------------------------------------------------------------------------------------------
        ///
        public override async Task OnMessage(Telegram.Bot.Types.Message message)
        {
            await base.OnMessage(message);

            string msg = message.Text.Trim();

            long requesterId = message.Chat.Id;

            if (requesterId != otpWaitUserId)
            {
                return;
            }

            switch (commandState)
            {
            case eCommandState.InputWaitOtp:
            {
                IsCompleted = true;

                string otpStr = message.Text.Trim();

                if (OtpChecker.CheckOtp(otpStr))
                {
                    string response = strings.GetString("지갑 백업 응답 완료.\n");

                    response += "\n" + QtumHandler.BackupWallet();

                    await SendMessage(requesterId, response.Trim());
                }
                else
                {
                    await SendMessage(requesterId, strings.GetString("Otp 인증에 실패 했습니다."));
                }
            }
            break;
            }
        }
        ///--------------------------------------------------------------------------------------------------------
        ///
        public override async Task OnMessage(Telegram.Bot.Types.Message message)
        {
            await base.OnMessage(message);

            string msg = message.Text.Trim();

            long requesterId = message.Chat.Id;

            if (requesterId != otpWaitUserId)
            {
                return;
            }

            switch (commandState)
            {
            case eCommandState.InputWaitOtp:
            {
                string otpStr = message.Text.Trim();

                if (OtpChecker.CheckOtp(otpStr))
                {
                    List <string> fileList = GetBackupFileList();

                    if (fileList.Count == 0)
                    {
                        IsCompleted = true;

                        await SendMessage(requesterId, strings.GetString("백업 파일이 없습니다."));

                        return;
                    }

                    string response = strings.GetString("백업 파일을 숫자로 선택하세요.");

                    for (int i = 0; i < fileList.Count; ++i)
                    {
                        response += string.Format("\n{0}. {1}", i + 1, fileList[i]);
                    }

                    waitStartTime = DateTime.Now;

                    commandState = eCommandState.InputWaitChoiceWallet;

                    await SendMessage(requesterId, response);
                }
                else
                {
                    IsCompleted = true;

                    await SendMessage(requesterId, strings.GetString("Otp 인증에 실패 했습니다."));
                }
            }
            break;

            case eCommandState.InputWaitChoiceWallet:
            {
                IsCompleted = true;

                int backupNum = 0;

                List <string> fileList = GetBackupFileList();

                string response = strings.GetString("지갑 복구 응답 완료.\n");

                if (int.TryParse(msg, out backupNum) == false || backupNum <= 0 || fileList.Count < backupNum)
                {
                    response += "\n" + strings.GetString("잘못된 번호 입니다.");
                    await SendMessage(requesterId, response);
                }
                else
                {
                    string filename = fileList[backupNum - 1];

                    await SendMessage(requesterId, strings.GetString("지갑을 복구하는 중 입니다....") + " " + filename);

                    response += "\n" + QtumHandler.RestoreWallet("./backups/" + filename);

                    await SendMessage(requesterId, response);
                }
            }
            break;
            }
        }
Ejemplo n.º 9
0
        ///--------------------------------------------------------------------------------------------------------
        ///
        public static async Task <bool> Restart(params object[] args)
        {
            Logger.Log("RestartQtumWallet");

            try
            {
                Process[] processList = System.Diagnostics.Process.GetProcessesByName("qtum-qt");

                if (processList.Length > 0)
                {
                    foreach (var process in processList)
                    {
                        process.Kill();
                    }
                }

                DateTime startTime = DateTime.Now;

                while (System.Diagnostics.Process.GetProcessesByName("qtum-qt").Length != 0)
                {
                    Thread.Sleep(500);

                    if ((DateTime.Now.Ticks - startTime.Ticks) * TimeSpan.TicksPerSecond > 30)
                    {
                        processList = System.Diagnostics.Process.GetProcessesByName("qtum-qt");

                        foreach (var process in processList)
                        {
                            process.Kill();
                        }
                    }
                }

                string cliPath = Config.QtumWalletPath;
                string rpcUser = Config.RPCUserName;
                string rpcPwd  = Config.RPCPassword;
                string command = string.Format(@"{0}\qtum-qt.exe -server -rpcuser={1} -rpcpassword={2} -rpcallowip=127.0.0.1", cliPath, rpcUser, rpcPwd);

                for (int i = 1; args != null && i < args.Length; ++i)
                {
                    object arg = args[i];
                    if (arg != null && string.IsNullOrEmpty(arg.ToString().Trim()) == false)
                    {
                        command += " " + arg.ToString().Trim();
                    }
                }

                using (Process process = new Process())
                {
                    ProcessStartInfo startInfo = new ProcessStartInfo();

                    startInfo.FileName       = @"cmd";
                    startInfo.WindowStyle    = ProcessWindowStyle.Hidden;         // cmd창이 숨겨지도록 하기
                    startInfo.CreateNoWindow = true;                              // cmd창을 띄우지 안도록 하기

                    startInfo.UseShellExecute        = false;
                    startInfo.RedirectStandardOutput = true;                      // cmd창에서 데이터를 가져오기
                    startInfo.RedirectStandardInput  = true;                      // cmd창으로 데이터 보내기
                    startInfo.RedirectStandardError  = true;                      // cmd창에서 오류 내용 가져오기

                    process.EnableRaisingEvents = false;
                    process.StartInfo           = startInfo;

                    if (process.Start() == false)
                    {
                        Logger.Log("퀀텀 월렛의 경로가 잘못되었습니다. Config.txt 파일에서 경로를 확인 해 주세요.\n");
                        return(false);
                    }
                    process.StandardInput.Write(command + Environment.NewLine);
                    process.StandardInput.Close();

                    Logger.Log("Waiting for Qtum Wallet to run ...\n");

                    var waitRunTask = Task.Run(() =>
                    {
                        while (true)
                        {
                            processList = System.Diagnostics.Process.GetProcessesByName("qtum-qt");
                            if (processList.Length > 0)
                            {
                                break;
                            }

                            Thread.Sleep(1000);
                        }
                    });

                    await waitRunTask;

                    var waitSyncTask = Task.Run(() =>
                    {
                        while (true)
                        {
                            if (string.IsNullOrEmpty(QtumHandler.GetHDMasterKeyId(false)) == false)
                            {
                                break;
                            }

                            Thread.Sleep(1000);
                        }
                    }
                                                );

                    await waitSyncTask;
                }
            }
            catch (Exception e)
            {
                Logger.Log(e.ToString());
                //Logger.Log("퀀텀 월렛 실행에 실패했습니다. 프로그램을 종료합니다.");
                return(false);
            }

            return(true);
        }
Ejemplo n.º 10
0
        ///--------------------------------------------------------------------------------------------------------
        ///
        public override async Task OnMessage(Telegram.Bot.Types.Message message)
        {
            await base.OnMessage(message);

            string msg = message.Text.Trim();

            long requesterId = message.Chat.Id;

            if (requesterId != otpWaitUserId)
            {
                return;
            }

            switch (commandState)
            {
            case eCommandState.InputWaitOtp:
            {
                string otpStr = message.Text.Trim();

                if (OtpChecker.CheckOtp(otpStr))
                {
                    commandState = eCommandState.InputWaitCommandLine;

                    waitStartTime = DateTime.Now;

                    await SendMessage(requesterId, strings.GetString("명령을 입력하세요.\n\n"));
                }
                else
                {
                    IsCompleted = true;

                    await SendMessage(requesterId, strings.GetString("Otp 인증에 실패 했습니다."));
                }
            }
            break;

            case eCommandState.InputWaitCommandLine:
            {
                string commandLineStr = msg;

                Logger.Log("[" + message.Chat.Username + "] [" + message.Chat.Id + "] : " + commandLineStr);

                string commandResult = QtumHandler.CommandLine(commandLineStr).Trim();

                List <string> resultList = new List <string>();

                await SendMessage(requesterId, "------------------------", Telegram.Bot.Types.Enums.ParseMode.Default);

                if (string.IsNullOrEmpty(commandResult))
                {
                    commandResult = "empty";

                    resultList.Add(commandResult);
                }
                else
                {
                    // convert string to stream
                    byte[] byteArray = Encoding.UTF8.GetBytes(commandResult);
                    using (MemoryStream stream = new MemoryStream(byteArray))
                    {
                        using (StreamReader reader = new StreamReader(stream))
                        {
                            while (reader.EndOfStream == false)
                            {
                                resultList.Add(reader.ReadLine());
                            }
                        }
                    }
                }

                const int maxSendCount  = 10;
                const int onceListCount = 50;

                int sendCount = 0;

                for (int i = 0; i < resultList.Count(); i += onceListCount)
                {
                    string responseMsg = "";

                    for (int j = 0; j < onceListCount; ++j)
                    {
                        int idx = i + j;

                        if (idx >= resultList.Count())
                        {
                            break;
                        }

                        responseMsg += resultList[idx] + "\n";
                    }

                    if (++sendCount >= maxSendCount)
                    {
                        await SendMessage(requesterId, "The result text is too long....", Telegram.Bot.Types.Enums.ParseMode.Default);

                        break;
                    }

                    await SendMessage(requesterId, responseMsg, Telegram.Bot.Types.Enums.ParseMode.Default);
                }

                await SendMessage(requesterId, "------------------------", Telegram.Bot.Types.Enums.ParseMode.Default);


                IsCompleted = true;
            }
            break;
            }
        }
        ///--------------------------------------------------------------------------------------------------------
        ///
        public override async Task OnMessage(Telegram.Bot.Types.Message message)
        {
            await base.OnMessage(message);

            string msg = message.Text.Trim();

            long requesterId = message.Chat.Id;

            if (requesterId != otpWaitUserId)
            {
                return;
            }

            switch (commandState)
            {
            case eSendCommandState.InputWaitOtp:
            {
                string otpStr = message.Text.Trim();

                if (OtpChecker.CheckOtp(otpStr))
                {
                    commandState = eSendCommandState.InputWaitSendAddress;

                    waitStartTime = DateTime.Now;

                    string sendMsg = strings.GetString("사용 할 본인의 주소를 번호로 선택하세요.");

                    sendMsg += "\n0. " + strings.GetString("자동으로 선택");

                    int num = 1;
                    foreach (var pair in myAddressList)
                    {
                        sendMsg += string.Format("\n{0}. {1}:{2} Qtum", num, GetAddressLink(pair.Key), pair.Value);
                        ++num;
                    }

                    await SendMessage(requesterId, sendMsg);
                }
                else
                {
                    IsCompleted = true;

                    await SendMessage(requesterId, strings.GetString("Otp 인증에 실패 했습니다."));
                }
            }
            break;

            case eSendCommandState.InputWaitSendAddress:
            {
                string[] args       = msg.Split(' ');
                int      addressNum = 0;
                if (args.Length <= 0 || int.TryParse(args[0], out addressNum) == false || addressNum <0 || addressNum> myAddressList.Count)
                {
                    IsCompleted = true;

                    await SendMessage(requesterId, strings.GetString("유효하지 않은 주소입니다."));
                }
                else
                {
                    if (addressNum == 0)
                    {
                        myAddress = "";         // 자동이면 주소가 없습니다.
                    }
                    else
                    {
                        myAddress = myAddressList.Keys.ToArray()[addressNum - 1];
                    }

                    if (string.IsNullOrEmpty(myAddress) || QtumHandler.IsValidateAddress(myAddress))
                    {
                        commandState = eSendCommandState.InputWaitReceiveAddress;

                        waitStartTime = DateTime.Now;

                        await SendMessage(requesterId, strings.GetString("상대방의 퀀텀 주소를 입력하세요."));
                    }
                    else
                    {
                        IsCompleted = true;

                        await SendMessage(requesterId, strings.GetString("유효하지 않은 주소입니다."));
                    }
                }
            }
            break;

            case eSendCommandState.InputWaitReceiveAddress:
            {
                bool invalidMyAddress = false;

                double myBalance = 0;

                if (string.IsNullOrEmpty(myAddress) == false && myAddressList.TryGetValue(myAddress, out myBalance) == false)
                {
                    invalidMyAddress = true;
                }

                if (invalidMyAddress == false && QtumHandler.IsValidateAddress(msg))
                {
                    destAdress = msg;

                    commandState = eSendCommandState.InputWaitAmount;

                    waitStartTime = DateTime.Now;

                    if (string.IsNullOrEmpty(myAddress) || myAddressList.TryGetValue(myAddress, out myBalance) == false)
                    {
                        myBalance = QtumHandler.GetBalance();
                    }
                    else
                    {
                        myBalance = myAddressList[myAddress];
                    }

                    string sendMsg = strings.GetString("보낼 수량을 입력하세요.");

                    sendMsg += "\n" + strings.Format("가능 수량 {0}", myAddress + " " + myBalance);

                    await SendMessage(requesterId, sendMsg);
                }
                else
                {
                    IsCompleted = true;

                    await SendMessage(requesterId, strings.GetString("유효하지 않은 주소입니다."));
                }
            }
            break;

            case eSendCommandState.InputWaitAmount:
            {
                double amount = 0;
                if (double.TryParse(msg, out amount) && QtumHandler.GetBalance() >= amount)
                {
                    destAmount = amount;

                    commandState = eSendCommandState.InputWaitConfirm;

                    string myAddressStr = myAddress;

                    if (string.IsNullOrEmpty(myAddressStr))
                    {
                        myAddressStr = strings.GetString("자동으로 선택");
                    }

                    string str = strings.Format("나의 주소 : {0}", GetAddressLink(myAddressStr)) + "\n" + strings.Format("받는 주소 : {0}", GetAddressLink(destAdress)) + "\n" + strings.Format("보낼 수량 : {0}", destAmount);
                    str += "\n" + strings.Format("정말 진행 하시려면 숫자 1을 입력하세요.");

                    waitStartTime = DateTime.Now;

                    await SendMessage(requesterId, str);
                }
                else
                {
                    IsCompleted = true;

                    await SendMessage(requesterId, strings.GetString("수량이 부족합니다."));
                }
            }
            break;

            case eSendCommandState.InputWaitConfirm:
            {
                int num = 0;
                if (int.TryParse(msg, out num) && num == 1)
                {
                    commandState = eSendCommandState.Ready;

                    waitStartTime = DateTime.MinValue;

                    string result = QtumHandler.Send(myAddress, destAdress, destAmount);

                    if (string.IsNullOrEmpty(result) == false)
                    {
                        string sendResultMsg = string.Format("tx: {0}", GetTxLink(result));
                        await SendMessage(requesterId, sendResultMsg);
                        await SendMessage(requesterId, strings.GetString("보내기 응답 완료.\n"));
                    }
                    else
                    {
                        await SendMessage(requesterId, strings.GetString("보내기에 실패했습니다."));
                    }

                    IsCompleted = true;
                }
                else
                {
                    IsCompleted = true;

                    await SendMessage(requesterId, strings.GetString("보내기가 취소되었습니다."));
                }
            }
            break;
            }
        }