| 486 text = "Disconnected."; |
486 text = "Disconnected."; |
| 487 break; |
487 break; |
| 488 |
488 |
| 489 case RCON_CONNECTING: |
489 case RCON_CONNECTING: |
| 490 case RCON_AUTHENTICATING: |
490 case RCON_AUTHENTICATING: |
| 491 text = "Connecting to " + m_session.address().to_string(IPAddress::WITH_PORT) + "..."; |
491 text = "Connecting to " + net::ip_address_to_string(m_session.address()) + "..."; |
| 492 break; |
492 break; |
| 493 |
493 |
| 494 case RCON_CONNECTED: |
494 case RCON_CONNECTED: |
| 495 { |
495 { |
| 496 std::string adminText; |
496 std::string adminText; |
| 504 adminText = zfc::sprintf("%d other admin%s", m_session.getAdminCount(), |
504 adminText = zfc::sprintf("%d other admin%s", m_session.getAdminCount(), |
| 505 m_session.getAdminCount() != 1 ? "s" : ""); |
505 m_session.getAdminCount() != 1 ? "s" : ""); |
| 506 } |
506 } |
| 507 |
507 |
| 508 text = zfc::sprintf("%s | %s | %s", |
508 text = zfc::sprintf("%s | %s | %s", |
| 509 m_session.address().to_string(IPAddress::WITH_PORT).data(), |
509 net::ip_address_to_string(m_session.address()).data(), |
| 510 m_session.getLevel().data(), |
510 m_session.getLevel().data(), |
| 511 adminText.data()); |
511 adminText.data()); |
| 512 } |
512 } |
| 513 break; |
513 break; |
| 514 } |
514 } |
| 602 |
602 |
| 603 std::string& input = getEditableInput(); |
603 std::string& input = getEditableInput(); |
| 604 m_pasteBuffer = mid(input, a, b); |
604 m_pasteBuffer = mid(input, a, b); |
| 605 input = remove_range(input, a, b - a); |
605 input = remove_range(input, a, b - a); |
| 606 m_needInputRender = true; |
606 m_needInputRender = true; |
| |
607 } |
| |
608 |
| |
609 bool Interface::tryResolveAddress(const std::string &address_string, net::ip_address* target) |
| |
610 { |
| |
611 std::stringstream errors; |
| |
612 const std::optional<net::ip_address> address_opt = net::ip_resolve(address_string, errors); |
| |
613 if (address_opt.has_value()) |
| |
614 { |
| |
615 *target = address_opt.value(); |
| |
616 if (target->port == 0) |
| |
617 { |
| |
618 target->port = 10666; |
| |
619 } |
| |
620 return true; |
| |
621 } |
| |
622 else |
| |
623 { |
| |
624 this->printError("%s\n", errors.str().data()); |
| |
625 return false; |
| |
626 } |
| 607 } |
627 } |
| 608 |
628 |
| 609 // ------------------------------------------------------------------------------------------------- |
629 // ------------------------------------------------------------------------------------------------- |
| 610 // |
630 // |
| 611 void Interface::handleInput() |
631 void Interface::handleInput() |
| 792 { |
812 { |
| 793 case INPUTSTATE_CONFIRM_DISCONNECTION: |
813 case INPUTSTATE_CONFIRM_DISCONNECTION: |
| 794 break; // handled above |
814 break; // handled above |
| 795 |
815 |
| 796 case INPUTSTATE_ADDRESS: |
816 case INPUTSTATE_ADDRESS: |
| 797 try |
817 if (this->tryResolveAddress(this->getCurrentInput(), &this->m_remoteAddress)) |
| 798 { |
818 { |
| 799 m_remoteAddress = IPAddress::from_string(getCurrentInput()); |
819 setInputState(INPUTSTATE_PASSWORD); |
| 800 } |
820 } |
| 801 catch (std::exception& e) |
|
| 802 { |
|
| 803 print("%s\n", e.what()); |
|
| 804 return; |
|
| 805 } |
|
| 806 |
|
| 807 if (m_remoteAddress.port == 0) |
|
| 808 m_remoteAddress.port = 10666; |
|
| 809 |
|
| 810 setInputState(INPUTSTATE_PASSWORD); |
|
| 811 break; |
821 break; |
| 812 |
822 |
| 813 case INPUTSTATE_PASSWORD: |
823 case INPUTSTATE_PASSWORD: |
| 814 if (m_inputState == INPUTSTATE_PASSWORD and not getCurrentInput().empty()) |
824 if (m_inputState == INPUTSTATE_PASSWORD and not getCurrentInput().empty()) |
| 815 { |
825 { |
| 994 m_needOutputRender = true; |
1004 m_needOutputRender = true; |
| 995 } |
1005 } |
| 996 |
1006 |
| 997 // ------------------------------------------------------------------------------------------------- |
1007 // ------------------------------------------------------------------------------------------------- |
| 998 // |
1008 // |
| 999 void Interface::connect(std::string address, std::string password) |
1009 void Interface::connect(std::string address_string, std::string password) |
| 1000 { |
1010 { |
| 1001 try |
1011 if (this->tryResolveAddress(address_string, &this->m_remoteAddress)) |
| 1002 { |
1012 { |
| 1003 m_remoteAddress = IPAddress::from_string(address); |
1013 m_session.disconnect(); |
| 1004 } |
1014 m_session.setPassword(password); |
| 1005 catch (std::exception& e) |
1015 m_session.connect(m_remoteAddress); |
| 1006 { |
1016 } |
| 1007 print("%s\n", e.what()); |
|
| 1008 return; |
|
| 1009 } |
|
| 1010 |
|
| 1011 if (m_remoteAddress.port == 0) |
|
| 1012 m_remoteAddress.port = 10666; |
|
| 1013 |
|
| 1014 m_session.disconnect(); |
|
| 1015 m_session.setPassword(password); |
|
| 1016 m_session.connect(m_remoteAddress); |
|
| 1017 } |
1017 } |
| 1018 |
1018 |
| 1019 // ------------------------------------------------------------------------------------------------- |
1019 // ------------------------------------------------------------------------------------------------- |
| 1020 // |
1020 // |
| 1021 void Interface::setPlayerNames(const std::vector<std::string>& names) |
1021 void Interface::setPlayerNames(const std::vector<std::string>& names) |
| 1067 { |
1067 { |
| 1068 printError("Usage: /connect <address> <password>\n"); |
1068 printError("Usage: /connect <address> <password>\n"); |
| 1069 } |
1069 } |
| 1070 else |
1070 else |
| 1071 { |
1071 { |
| 1072 IPAddress address; |
1072 this->connect(args[0], args[1]); |
| 1073 |
|
| 1074 try |
|
| 1075 { |
|
| 1076 address = IPAddress::from_string(args[0]); |
|
| 1077 } |
|
| 1078 catch (std::exception& e) |
|
| 1079 { |
|
| 1080 printError("%s\n", e.what()); |
|
| 1081 return; |
|
| 1082 } |
|
| 1083 |
|
| 1084 if (address.port == 0) |
|
| 1085 address.port = 10666; |
|
| 1086 |
|
| 1087 m_session.setPassword(args[1]); |
|
| 1088 m_session.disconnect(); |
|
| 1089 m_session.connect(m_remoteAddress = address); |
|
| 1090 } |
1073 } |
| 1091 } |
1074 } |
| 1092 else if (command == "disconnect") |
1075 else if (command == "disconnect") |
| 1093 { |
1076 { |
| 1094 m_session.disconnect(); |
1077 m_session.disconnect(); |
| 1105 |
1088 |
| 1106 // ------------------------------------------------------------------------------------------------- |
1089 // ------------------------------------------------------------------------------------------------- |
| 1107 // |
1090 // |
| 1108 void Interface::disconnected() |
1091 void Interface::disconnected() |
| 1109 { |
1092 { |
| 1110 print("Disconnected from %s\n", m_session.address().to_string(IPAddress::WITH_PORT).data()); |
1093 print("Disconnected from %s\n", net::ip_address_to_string(m_session.address()).data()); |
| 1111 resetTitle(); |
1094 resetTitle(); |
| 1112 renderFull(); |
1095 renderFull(); |
| 1113 } |
1096 } |
| 1114 |
1097 |
| 1115 // ------------------------------------------------------------------------------------------------- |
1098 // ------------------------------------------------------------------------------------------------- |