///-------------------------------------------------------------------------------------------------------- /// 채굴 시작 요청에 대한 응답메세지 생성 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); }
///-------------------------------------------------------------------------------------------------------- /// 확인 요청에 대한 응답메세지 생성 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); }
///-------------------------------------------------------------------------------------------------------- /// 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); }
///-------------------------------------------------------------------------------------------------------- /// 확인 요청에 대한 응답메세지 생성 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); }
///-------------------------------------------------------------------------------------------------------- /// 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; } }
///-------------------------------------------------------------------------------------------------------- /// 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); }
///-------------------------------------------------------------------------------------------------------- /// 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; } }