Beispiel #1
0
    def __init__(self, minecraft_version=None):
        if minecraft_version is None:
            minecraft_version = SUPPORTED_MINECRAFT_VERSIONS.keys()[-1]
        self.minecraft_version = minecraft_version
        protocol_version = SUPPORTED_MINECRAFT_VERSIONS[minecraft_version]
        self.context = connection.ConnectionContext(
            protocol_version=protocol_version)

        self.packets_handshake = {
            p.get_id(self.context): p
            for p in packets.state_handshake_serverbound(self.context)
        }
        self.packets_login = {
            p.get_id(self.context): p
            for p in packets.state_login_serverbound(self.context)
        }
        self.packets_playing = {
            p.get_id(self.context): p
            for p in packets.state_playing_serverbound(self.context)
        }

        self.listen_socket = socket.socket()
        self.listen_socket.bind(('0.0.0.0', 0))
        self.listen_socket.listen(0)

        super(FakeServer, self).__init__()
Beispiel #2
0
    def __init__(self,
                 minecraft_version=None,
                 compression_threshold=None,
                 client_handler_type=FakeClientHandler,
                 private_key=None,
                 public_key_bytes=None,
                 test_case=None):
        if minecraft_version is None:
            minecraft_version = list(SUPPORTED_MINECRAFT_VERSIONS.keys())[-1]

        if isinstance(minecraft_version, Integral):
            proto = minecraft_version
            minecraft_version = 'FakeVersion%d' % proto
            for ver, ver_proto in SUPPORTED_MINECRAFT_VERSIONS.items():
                if ver_proto == proto:
                    minecraft_version = ver
        else:
            proto = SUPPORTED_MINECRAFT_VERSIONS[minecraft_version]
        self.context = connection.ConnectionContext(protocol_version=proto)

        self.minecraft_version = minecraft_version
        self.compression_threshold = compression_threshold
        self.client_handler_type = client_handler_type
        self.private_key = private_key
        self.public_key_bytes = public_key_bytes
        self.test_case = test_case

        self.packets_handshake = {
            p.get_id(self.context): p
            for p in serverbound.handshake.get_packets(self.context)
        }

        self.packets_login = {
            p.get_id(self.context): p
            for p in serverbound.login.get_packets(self.context)
        }

        self.packets_playing = {
            p.get_id(self.context): p
            for p in serverbound.play.get_packets(self.context)
        }

        self.packets_status = {
            p.get_id(self.context): p
            for p in serverbound.status.get_packets(self.context)
        }

        self.listen_socket = socket.socket()
        self.listen_socket.settimeout(0.1)
        self.listen_socket.bind(('localhost', 0))
        self.listen_socket.listen(1)

        self.lock = threading.Lock()
        self.stopping = False

        super(FakeServer, self).__init__()
Beispiel #3
0
def main() -> int:

    # Handle program arguments
    ap = argparse.ArgumentParser(
        prog="mchat",
        description="A console chat client for most Minecraft server versions")
    ap.add_argument("server_address", help="IP address of a Minecraft server")
    ap.add_argument("-p",
                    "--port",
                    help="Minecraft server port (default: %(default)s)",
                    type=int,
                    default=25565)
    ap.add_argument("-u", "--username", help="Minecraft username or email")
    ap.add_argument(
        "-v",
        "--version",
        help="Client -> Server protocol version to use (default: %(default)s)",
        default="1.16.4")
    args = ap.parse_args()

    # Verify server version to keep the terminal looking clean
    if args.version not in SUPPORTED_MINECRAFT_VERSIONS.keys():
        console.print(
            f"[bold yellow]{args.version} is not a valid Minecraft version. Versions from {list(SUPPORTED_MINECRAFT_VERSIONS.keys())[0]} to {list(SUPPORTED_MINECRAFT_VERSIONS.keys())[-1]} are allowed."
        )
        return 1

    # Do authentication
    if not args.username:
        username = Prompt.ask("Username or email")
    else:
        username = args.username

    password = getpass.getpass("Password: "******"[bright_black]Loaded authentication information")

    # Determine the actual protocol version number
    protocol_version_num = SUPPORTED_MINECRAFT_VERSIONS[args.version]
    console.print(
        f"[bright_black]Selecting protocol version {protocol_version_num}")

    # Authenticate with Mojang
    auth_token = AuthenticationToken()
    console.print(f"[bright_black]Contacting Yggdrasil...")

    try:
        auth_token.authenticate(username, password)
    except YggdrasilError as e:
        console.print(f"[bold red]Failed to authenticate Minecraft session")
        return 1

    # Open a connection
    server_connection = Connection(args.server_address,
                                   args.port,
                                   auth_token,
                                   allowed_versions=[protocol_version_num])

    try:
        server_connection.connect()
    except:
        console.print(f"[bold red]Could not connect to server")
        return 1

    # Set up an incoming chat handler
    server_connection.register_packet_listener(incomingChatHandler,
                                               ChatMessagePacket)
    console.print(f"[bright_black]Listen to incoming chat packets")

    # Set up input loop
    console.print(
        "All further inputs will be sent to server chat. Press CTRL+C to stop")
    try:
        while True:

            # Get a line from the user
            chat_message = console.input()

            # Send the chat message
            packet = serverbound.play.ChatPacket()
            packet.message = chat_message
            server_connection.write_packet(packet)

    except KeyboardInterrupt as e:
        print("\rGoodbye")

    return 0