~starkingdoms/starkingdoms

6acb9c546981599c15b3d1ab3100479e233799ef — c0repwn3r 2 years ago 6c4ea9f
fix compilation - update schema - add api to spacetime
M Cargo.lock => Cargo.lock +24 -24
@@ 3291,6 3291,30 @@ dependencies = [
]

[[package]]
name = "starkingdoms-api"
version = "0.1.0"
dependencies = [
 "actix-files",
 "actix-request-identifier",
 "actix-web",
 "hmac",
 "jwt",
 "log",
 "once_cell",
 "openssl",
 "reqwest",
 "sea-orm",
 "serde",
 "sha2",
 "simple_logger",
 "starkingdoms_api_entities",
 "starkingdoms_api_migration",
 "tera",
 "toml 0.7.3",
 "ulid",
]

[[package]]
name = "starkingdoms-protocol"
version = "0.1.0"
dependencies = [


@@ 3321,30 3345,6 @@ dependencies = [
]

[[package]]
name = "starkingdoms-server-api"
version = "0.1.0"
dependencies = [
 "actix-files",
 "actix-request-identifier",
 "actix-web",
 "hmac",
 "jwt",
 "log",
 "once_cell",
 "openssl",
 "reqwest",
 "sea-orm",
 "serde",
 "sha2",
 "simple_logger",
 "starkingdoms_api_entities",
 "starkingdoms_api_migration",
 "tera",
 "toml 0.7.3",
 "ulid",
]

[[package]]
name = "starkingdoms_api_entities"
version = "0.1.0"
dependencies = [

M api/Cargo.toml => api/Cargo.toml +1 -1
@@ 1,5 1,5 @@
[package]
name = "starkingdoms-server-api"
name = "starkingdoms-api"
version = "0.1.0"
edition = "2021"


M client/src/gateway.ts => client/src/gateway.ts +20 -5
@@ 67,11 67,26 @@ export async function gateway_connect(gateway_url: string, username: string): Ga
    }
    client.ping_timeout = setTimeout(ping_fn, 5 * 1000);

    let handshake_start_msg = MessageC2SHello.encode({
        version: 1,
        requestedUsername: username,
        nextState: State.Play
    }).finish();
    let handshake_start_msg;
    if (global.can_beam_out) {
        handshake_start_msg = MessageC2SHello.encode({
            version: 2,
            requestedUsername: username,
            nextState: State.Play,
            user: window.localStorage.getItem("user")!,
            token: window.localStorage.getItem("token")!
        }).finish();
    } else {
        handshake_start_msg = MessageC2SHello.encode({
            version: 2,
            requestedUsername: username,
            nextState: State.Play,
            // @ts-ignore
            user: null,
            // @ts-ignore
            token: null
        }).finish();
    }
    client.socket.send(encode(MessageC2SHello_packetInfo.type, handshake_start_msg));

    client.socket.addEventListener('message', async (msg) => {

M client/src/protocol/message_c2s.ts => client/src/protocol/message_c2s.ts +29 -1
@@ 12,6 12,8 @@ export interface MessageC2SHello {
  requestedUsername: string;
  /** The state the connection will go into after the handshake. */
  nextState: State;
  token: string;
  user: string;
}

export enum MessageC2SHello_packetInfo {


@@ 244,7 246,7 @@ export function messageC2SAuthenticateAndBeamOut_packetInfoToJSON(
}

function createBaseMessageC2SHello(): MessageC2SHello {
  return { version: 0, requestedUsername: "", nextState: 0 };
  return { version: 0, requestedUsername: "", nextState: 0, token: "", user: "" };
}

export const MessageC2SHello = {


@@ 258,6 260,12 @@ export const MessageC2SHello = {
    if (message.nextState !== 0) {
      writer.uint32(24).int32(message.nextState);
    }
    if (message.token !== "") {
      writer.uint32(34).string(message.token);
    }
    if (message.user !== "") {
      writer.uint32(42).string(message.user);
    }
    return writer;
  },



@@ 289,6 297,20 @@ export const MessageC2SHello = {

          message.nextState = reader.int32() as any;
          continue;
        case 4:
          if (tag != 34) {
            break;
          }

          message.token = reader.string();
          continue;
        case 5:
          if (tag != 42) {
            break;
          }

          message.user = reader.string();
          continue;
      }
      if ((tag & 7) == 4 || tag == 0) {
        break;


@@ 303,6 325,8 @@ export const MessageC2SHello = {
      version: isSet(object.version) ? Number(object.version) : 0,
      requestedUsername: isSet(object.requestedUsername) ? String(object.requestedUsername) : "",
      nextState: isSet(object.nextState) ? stateFromJSON(object.nextState) : 0,
      token: isSet(object.token) ? String(object.token) : "",
      user: isSet(object.user) ? String(object.user) : "",
    };
  },



@@ 311,6 335,8 @@ export const MessageC2SHello = {
    message.version !== undefined && (obj.version = Math.round(message.version));
    message.requestedUsername !== undefined && (obj.requestedUsername = message.requestedUsername);
    message.nextState !== undefined && (obj.nextState = stateToJSON(message.nextState));
    message.token !== undefined && (obj.token = message.token);
    message.user !== undefined && (obj.user = message.user);
    return obj;
  },



@@ 323,6 349,8 @@ export const MessageC2SHello = {
    message.version = object.version ?? 0;
    message.requestedUsername = object.requestedUsername ?? "";
    message.nextState = object.nextState ?? 0;
    message.token = object.token ?? "";
    message.user = object.user ?? "";
    return message;
  },
};

M server/src/handler.rs => server/src/handler.rs +15 -15
@@ 165,27 165,27 @@ pub async fn handle_client(mgr: ClientManager, entities: Arc<RwLock<EntityHandle
                                    handle: player_handle,
                                    input: Default::default(),
                                    addr: remote_addr,
                                    auth_token: pkt.token.clone(),
                                    auth_user: pkt.user.clone()
                                    auth_token: None,
                                    auth_user: None
                                };

                                let mut e_write_handle = entities.write().await;

                                if let Some(user) = pkt.user {
                                    if let Some(token) = pkt.token {
                                        info!("[{}] * Beamin: beaming in {} as {} with token {}", remote_addr, username, user, token);
                                if !pkt.user.is_empty() && !pkt.token.is_empty() {
                                    player.auth_token = Some(pkt.token.clone());
                                    player.auth_user = Some(pkt.user.clone());
                                    info!("[{}] * Beamin: beaming in {} as {} with token {}", remote_addr, username, pkt.user, pkt.token);

                                        let player_data = match load_player_data_from_api(&token, &user, &std::env::var("STK_API_KEY").unwrap()).await {
                                            Ok(d) => d,
                                            Err(e) => {
                                                warn!("[{}] * Beamin: ABORTED. API returned error: {}", remote_addr, e);
                                                e_write_handle.entities.insert(get_entity_id(), Entity::Player(player));
                                                continue;
                                            }
                                        };
                                    let player_data = match load_player_data_from_api(&pkt.token, &pkt.user, &std::env::var("STK_API_KEY").unwrap()).await {
                                        Ok(d) => d,
                                        Err(e) => {
                                            warn!("[{}] * Beamin: ABORTED. API returned error: {}", remote_addr, e);
                                            e_write_handle.entities.insert(get_entity_id(), Entity::Player(player));
                                            continue;
                                        }
                                    };

                                        player.load_api_data(&player_data);
                                    }
                                    player.load_api_data(&player_data);
                                }

                                e_write_handle.entities.insert(get_entity_id(), Entity::Player(player));

M spacetime => spacetime +28 -0
@@ 28,6 28,10 @@ sub_help() {
  echo "    build_server - Compile the game server" # done
  echo "    run_server_prod - Compile and run the game server with optimizations enabled" # done
  echo "    build_server_prod - Compile the game server with optimizations enabled" # done
  echo "    run_api - Compile and run the API server"
  echo "    build_api - Compile the API server"
  echo "    run_api_prod - Compile and run the API server with optimizations enabled"
  echo "    build_api_prod - Compile the API server with optimizations enabled"
  echo "    install_tooling - Install the compilation utilities required for compiling StarKingdoms" # done
  echo "    build_assets - Compile spritesheets in all three texture sizes for textures-fast" # done
  echo "    build_assets_full - Compile spritesheets in full size for textures-fast" # done


@@ 106,6 110,30 @@ sub_run_server_prod() {
  exec "$SCRIPT_DIR/target/release/starkingdoms-server"
}

sub_build_api() {
  check_all
  exec_spacetime api dev "$SCRIPT_DIR" "$SERVER_MODS"
  exec_ninja api
}
sub_run_api() {
  check_all
  exec_spacetime api dev "$SCRIPT_DIR" "$SERVER_MODS"
  exec_ninja api
  cd api && exec "$SCRIPT_DIR/target/debug/starkingdoms-api"
}

sub_build_api_prod() {
  check_all
  exec_spacetime api prod "$SCRIPT_DIR" "$SERVER_MODS"
  exec_ninja api
}
sub_run_api_prod() {
  check_all
  exec_spacetime api prod "$SCRIPT_DIR" "$SERVER_MODS"
  exec_ninja api
  cd api && exec "$SCRIPT_DIR/target/release/starkingdoms-api"
}

sub_build_assets() {
  check_all
  exec_spacetime asset dev "$SCRIPT_DIR"

M spacetime_py/spacetime.py => spacetime_py/spacetime.py +14 -0
@@ 75,6 75,18 @@ def gen_rules_for_server(root, env, writer, modules):
    writer.build([f'{root}/target/{out_dir}/starkingdoms-server'], 'cargo-server', ['server/Cargo.toml'])
    writer.build(['server'], 'phony', [f'{root}/target/{out_dir}/starkingdoms-server'])

def gen_rules_for_api(root, env, writer, modules):
    if env == 'dev':
        out_dir = 'debug'
        writer.rule('cargo-api', f'cargo build --bin starkingdoms-api --features "{modules}"',
                    depfile=f'{root}/target/debug/starkingdoms-api.d', pool='console')
    elif env == 'prod':
        out_dir = 'release'
        writer.rule('cargo-api', f'cargo build --bin starkingdoms-api --release --features "{modules}"',
                    depfile=f'{root}/target/release/starkingdoms-api.d', pool='console')

    writer.build([f'{root}/target/{out_dir}/starkingdoms-api'], 'cargo-api', ['server/Cargo.toml'])
    writer.build(['api'], 'phony', [f'{root}/target/{out_dir}/starkingdoms-api'])

def gen_inkscape(root, assets, writer, files_375, files_full, files_125):
    gen_inkscape_rules_for_asset_sizes(writer)


@@ 144,6 156,8 @@ def main():
            generate_assets_build_command(root, assets, writer)
        elif target == 'server':
            gen_rules_for_server(root, env, writer, modules)
        elif target == 'api':
            gen_rules_for_api(root, env, writer, modules)

    print(f'[spacetime] Configured build')