| 610 | } |
| 611 | |
| 612 | String CommandProcessor::ban(ConnectionId connectionId, String const& argumentString) { |
| 613 | if (auto errorMsg = adminCheck(connectionId, "ban a user")) |
| 614 | return *errorMsg; |
| 615 | |
| 616 | auto arguments = m_parser.tokenizeToStringList(argumentString); |
| 617 | |
| 618 | if (arguments.empty()) |
| 619 | return "No player specified"; |
| 620 | |
| 621 | auto toKick = playerCidFromCommand(arguments[0], m_universe); |
| 622 | if (!toKick) |
| 623 | return strf("No user with specifier {} found.", arguments[0]); |
| 624 | |
| 625 | String reason = arguments[0]; |
| 626 | if (arguments.size() < 2) |
| 627 | reason = m_universe->clientNick(*toKick); |
| 628 | else |
| 629 | reason = arguments[1]; |
| 630 | |
| 631 | pair<bool, bool> type = {true, true}; |
| 632 | |
| 633 | if (arguments.size() >= 3) { |
| 634 | if (arguments[2] == "ip") { |
| 635 | type = {true, false}; |
| 636 | } else if (arguments[2] == "uuid") { |
| 637 | type = {false, true}; |
| 638 | } else if (arguments[2] == "both") { |
| 639 | type = {true, true}; |
| 640 | } else { |
| 641 | return strf("Invalid argument {} passed as ban type to /ban. Options are ip, uuid, or both.", arguments[2]); |
| 642 | } |
| 643 | } |
| 644 | |
| 645 | Maybe<int> banTime; |
| 646 | if (arguments.size() == 4) { |
| 647 | try { |
| 648 | banTime = lexicalCast<int>(arguments[3]); |
| 649 | } catch (BadLexicalCast const&) { |
| 650 | return strf("Invalid argument {} passed as ban time to /ban.", arguments[3]); |
| 651 | } |
| 652 | } |
| 653 | |
| 654 | m_universe->banUser(*toKick, reason, type, banTime); |
| 655 | |
| 656 | return strf("Successfully kicked user with specifier {}. ConnectionId: {}. Reason given: {}", |
| 657 | arguments[0], toKick, reason); |
| 658 | } |
| 659 | |
| 660 | String CommandProcessor::unbanIp(ConnectionId connectionId, String const& argumentString) { |
| 661 | if (auto errorMsg = adminCheck(connectionId, "unban a user")) |
nothing calls this directly
no test coverage detected