working with new login page, IOS is still a bit weird but it should just be HTML work
This commit is contained in:
parent
2ba48354ac
commit
88ce6db3aa
@ -6,8 +6,8 @@ pub type NewUserState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub type NewUserClientMessages {
|
pub type NewUserClientMessages {
|
||||||
JoinAsPlayer(token: String, user_id: Int, game_id: String)
|
JoinAsPlayer(token: String, user_id: Int, game_code: String)
|
||||||
JoinAsHost(token: String, user_id: Int, game_id: String)
|
JoinAsHost(token: String, user_id: Int, game_code: String)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new_user_client_messages_decoder() -> decode.Decoder(
|
pub fn new_user_client_messages_decoder() -> decode.Decoder(
|
||||||
@ -18,14 +18,14 @@ pub fn new_user_client_messages_decoder() -> decode.Decoder(
|
|||||||
"JoinAsPlayer" -> {
|
"JoinAsPlayer" -> {
|
||||||
use token <- decode.field("token", decode.string)
|
use token <- decode.field("token", decode.string)
|
||||||
use user_id <- decode.field("user_id", decode.int)
|
use user_id <- decode.field("user_id", decode.int)
|
||||||
use game_id <- decode.field("game_id", decode.string)
|
use game_code <- decode.field("game_code", decode.string)
|
||||||
decode.success(JoinAsPlayer(token:, user_id:, game_id:))
|
decode.success(JoinAsPlayer(token:, user_id:, game_code:))
|
||||||
}
|
}
|
||||||
"JoinAsHost" -> {
|
"JoinAsHost" -> {
|
||||||
use token <- decode.field("token", decode.string)
|
use token <- decode.field("token", decode.string)
|
||||||
use user_id <- decode.field("user_id", decode.int)
|
use user_id <- decode.field("user_id", decode.int)
|
||||||
use game_id <- decode.field("game_id", decode.string)
|
use game_code <- decode.field("game_code", decode.string)
|
||||||
decode.success(JoinAsHost(token:, user_id:, game_id:))
|
decode.success(JoinAsHost(token:, user_id:, game_code:))
|
||||||
}
|
}
|
||||||
_ -> decode.failure(JoinAsPlayer("", 0, ""), "NewUserClientMessages")
|
_ -> decode.failure(JoinAsPlayer("", 0, ""), "NewUserClientMessages")
|
||||||
}
|
}
|
||||||
@ -39,8 +39,10 @@ pub type NewUserServerMessages {
|
|||||||
pub fn encode_new_user_server_messages(
|
pub fn encode_new_user_server_messages(
|
||||||
new_user_server_messages: NewUserServerMessages,
|
new_user_server_messages: NewUserServerMessages,
|
||||||
) -> json.Json {
|
) -> json.Json {
|
||||||
case new_user_server_messages {
|
let msg_type = case new_user_server_messages {
|
||||||
RegisterResponse -> json.string("register_response")
|
RegisterResponse -> json.string("RegisterResponse")
|
||||||
HostRegisterResponse -> json.string("host_register_response")
|
HostRegisterResponse -> json.string("HostRegisterResponse")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
json.object([#("type", msg_type)])
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import app/clients/host_client
|
||||||
import app/clients/new_user_client
|
import app/clients/new_user_client
|
||||||
import app/web
|
import app/web
|
||||||
import gleam/bit_array
|
import gleam/bit_array
|
||||||
@ -61,6 +62,8 @@ fn server_login(
|
|||||||
let key = storail.key(ctx.sessions, login_req.game_code)
|
let key = storail.key(ctx.sessions, login_req.game_code)
|
||||||
let session = session.Session(login_req.game_code, user_id, dict.new())
|
let session = session.Session(login_req.game_code, user_id, dict.new())
|
||||||
let assert Ok(Nil) = storail.write(key, session)
|
let assert Ok(Nil) = storail.write(key, session)
|
||||||
|
|
||||||
|
Nil
|
||||||
}
|
}
|
||||||
JoinAsPlayer -> {
|
JoinAsPlayer -> {
|
||||||
let key = storail.key(ctx.sessions, login_req.game_code)
|
let key = storail.key(ctx.sessions, login_req.game_code)
|
||||||
@ -80,6 +83,13 @@ fn server_login(
|
|||||||
)
|
)
|
||||||
|
|
||||||
let assert Ok(Nil) = storail.write(key, session)
|
let assert Ok(Nil) = storail.write(key, session)
|
||||||
|
web.send_message_to_host(
|
||||||
|
ctx,
|
||||||
|
session.host_user_id,
|
||||||
|
host_client.UpdatePlayerStates(session.players),
|
||||||
|
)
|
||||||
|
|
||||||
|
Nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,22 +97,30 @@ fn server_login(
|
|||||||
JoinAsHost -> "host"
|
JoinAsHost -> "host"
|
||||||
JoinAsPlayer -> "player"
|
JoinAsPlayer -> "player"
|
||||||
}
|
}
|
||||||
|
let cookie_attr =
|
||||||
|
cookie.Attributes(..cookie.defaults(req.scheme), http_only: False)
|
||||||
|
|
||||||
response.new(200)
|
response.new(200)
|
||||||
|> response.set_cookie(
|
|> response.set_cookie("play_of_the_game/token", token, cookie_attr)
|
||||||
"play_of_the_game/token",
|
|
||||||
token,
|
|
||||||
cookie.defaults(req.scheme),
|
|
||||||
)
|
|
||||||
|> response.set_cookie(
|
|> response.set_cookie(
|
||||||
"play_of_the_game/client_type",
|
"play_of_the_game/client_type",
|
||||||
join_type_name,
|
join_type_name,
|
||||||
cookie.defaults(req.scheme),
|
cookie_attr,
|
||||||
)
|
)
|
||||||
|> response.set_cookie(
|
|> response.set_cookie(
|
||||||
"play_of_the_game/username",
|
"play_of_the_game/username",
|
||||||
login_req.username,
|
login_req.username,
|
||||||
cookie.defaults(req.scheme),
|
cookie_attr,
|
||||||
|
)
|
||||||
|
|> response.set_cookie(
|
||||||
|
"play_of_the_game/user_id",
|
||||||
|
int.to_string(user_id),
|
||||||
|
cookie_attr,
|
||||||
|
)
|
||||||
|
|> response.set_cookie(
|
||||||
|
"play_of_the_game/game_code",
|
||||||
|
login_req.game_code,
|
||||||
|
cookie_attr,
|
||||||
)
|
)
|
||||||
|> response.set_body(mist.Bytes(bytes_tree.new()))
|
|> response.set_body(mist.Bytes(bytes_tree.new()))
|
||||||
}
|
}
|
||||||
|
@ -78,7 +78,7 @@ fn set_buzz_in(
|
|||||||
let assert Ok(_) = storail.write(key, session)
|
let assert Ok(_) = storail.write(key, session)
|
||||||
|
|
||||||
send_message_to_host(
|
send_message_to_host(
|
||||||
socket_state,
|
socket_state.ctx,
|
||||||
session.host_user_id,
|
session.host_user_id,
|
||||||
host_client.UpdatePlayerStates(session.players),
|
host_client.UpdatePlayerStates(session.players),
|
||||||
)
|
)
|
||||||
@ -189,19 +189,20 @@ fn handle_new_user(
|
|||||||
#(
|
#(
|
||||||
SocketState(
|
SocketState(
|
||||||
..socket_state,
|
..socket_state,
|
||||||
state: Player(player_client.PlayerState(user_id:, game_id:)),
|
state: Host(host_client.HostState(user_id:, game_id:)),
|
||||||
),
|
),
|
||||||
new_user_client.HostRegisterResponse,
|
new_user_client.HostRegisterResponse,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
new_user_client.JoinAsPlayer(token, user_id, game_id) -> {
|
new_user_client.JoinAsPlayer(token, user_id, game_id) -> {
|
||||||
let assert Ok(_) = attach_socket_to_user(socket_state, user_id, token)
|
let assert Ok(_) = attach_socket_to_user(socket_state, user_id, token)
|
||||||
|
|
||||||
#(
|
#(
|
||||||
SocketState(
|
SocketState(
|
||||||
..socket_state,
|
..socket_state,
|
||||||
state: Host(host_client.HostState(user_id:, game_id:)),
|
state: Player(player_client.PlayerState(user_id:, game_id:)),
|
||||||
),
|
),
|
||||||
new_user_client.HostRegisterResponse,
|
new_user_client.RegisterResponse,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -231,41 +232,41 @@ fn get_player_session_subject(
|
|||||||
subject
|
subject
|
||||||
}
|
}
|
||||||
|
|
||||||
fn broadcast_message_to_players(
|
pub fn broadcast_message_to_players(
|
||||||
socket_state: SocketState,
|
ctx: Context,
|
||||||
session: session.Session,
|
session: session.Session,
|
||||||
msg: player_client.PlayerServerMessages,
|
msg: player_client.PlayerServerMessages,
|
||||||
) {
|
) {
|
||||||
dict.keys(session.players)
|
dict.keys(session.players)
|
||||||
|> list.map(get_player_session_from_id(socket_state.ctx, _))
|
|> list.map(get_player_session_from_id(ctx, _))
|
||||||
|> list.map(get_player_session_subject(socket_state.ctx, _))
|
|> list.map(get_player_session_subject(ctx, _))
|
||||||
|> list.each(fn(subject) {
|
|> list.each(fn(subject) {
|
||||||
let client_msg = player_client.encode_player_server_messages(msg)
|
let client_msg = player_client.encode_player_server_messages(msg)
|
||||||
actor.send(subject, json.to_string(client_msg))
|
actor.send(subject, json.to_string(client_msg))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn send_message_to_player(
|
pub fn send_message_to_player(
|
||||||
socket_state: SocketState,
|
ctx: Context,
|
||||||
id: Int,
|
id: Int,
|
||||||
msg: player_client.PlayerServerMessages,
|
msg: player_client.PlayerServerMessages,
|
||||||
) {
|
) {
|
||||||
let client_msg = player_client.encode_player_server_messages(msg)
|
let client_msg = player_client.encode_player_server_messages(msg)
|
||||||
|
|
||||||
get_player_session_from_id(socket_state.ctx, id)
|
get_player_session_from_id(ctx, id)
|
||||||
|> get_player_session_subject(socket_state.ctx, _)
|
|> get_player_session_subject(ctx, _)
|
||||||
|> actor.send(json.to_string(client_msg))
|
|> actor.send(json.to_string(client_msg))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn send_message_to_host(
|
pub fn send_message_to_host(
|
||||||
socket_state: SocketState,
|
ctx: Context,
|
||||||
id: Int,
|
id: Int,
|
||||||
msg: host_client.HostServerMessages,
|
msg: host_client.HostServerMessages,
|
||||||
) {
|
) {
|
||||||
let client_msg = host_client.encode_host_server_messages(msg)
|
let client_msg = host_client.encode_host_server_messages(msg)
|
||||||
|
|
||||||
get_player_session_from_id(socket_state.ctx, id)
|
get_player_session_from_id(ctx, id)
|
||||||
|> get_player_session_subject(socket_state.ctx, _)
|
|> get_player_session_subject(ctx, _)
|
||||||
|> actor.send(json.to_string(client_msg))
|
|> actor.send(json.to_string(client_msg))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -286,7 +287,7 @@ fn reset_player_buzzer(
|
|||||||
let assert Ok(_) = storail.write(session_key, session)
|
let assert Ok(_) = storail.write(session_key, session)
|
||||||
|
|
||||||
send_message_to_host(
|
send_message_to_host(
|
||||||
socket_state,
|
socket_state.ctx,
|
||||||
session.host_user_id,
|
session.host_user_id,
|
||||||
host_client.UpdatePlayerStates(session.players),
|
host_client.UpdatePlayerStates(session.players),
|
||||||
)
|
)
|
||||||
@ -311,7 +312,7 @@ fn handle_host(
|
|||||||
})
|
})
|
||||||
|
|
||||||
broadcast_message_to_players(
|
broadcast_message_to_players(
|
||||||
socket_state,
|
socket_state.ctx,
|
||||||
session,
|
session,
|
||||||
player_client.ResetBuzzer,
|
player_client.ResetBuzzer,
|
||||||
)
|
)
|
||||||
@ -319,7 +320,7 @@ fn handle_host(
|
|||||||
}
|
}
|
||||||
host_client.ResetPlayerBuzzer(id) -> {
|
host_client.ResetPlayerBuzzer(id) -> {
|
||||||
reset_player_buzzer(socket_state, session_key, id)
|
reset_player_buzzer(socket_state, session_key, id)
|
||||||
send_message_to_player(socket_state, id, player_client.ResetBuzzer)
|
send_message_to_player(socket_state.ctx, id, player_client.ResetBuzzer)
|
||||||
#(socket_state, host_client.Ack)
|
#(socket_state, host_client.Ack)
|
||||||
}
|
}
|
||||||
host_client.UpdateScore(id, score) -> {
|
host_client.UpdateScore(id, score) -> {
|
||||||
@ -333,13 +334,13 @@ fn handle_host(
|
|||||||
let assert Ok(_) = storail.write(session_key, session)
|
let assert Ok(_) = storail.write(session_key, session)
|
||||||
|
|
||||||
send_message_to_player(
|
send_message_to_player(
|
||||||
socket_state,
|
socket_state.ctx,
|
||||||
id,
|
id,
|
||||||
player_client.UpdatePointTotal(player.score),
|
player_client.UpdatePointTotal(player.score),
|
||||||
)
|
)
|
||||||
|
|
||||||
send_message_to_host(
|
send_message_to_host(
|
||||||
socket_state,
|
socket_state.ctx,
|
||||||
session.host_user_id,
|
session.host_user_id,
|
||||||
host_client.UpdatePlayerStates(session.players),
|
host_client.UpdatePlayerStates(session.players),
|
||||||
)
|
)
|
||||||
|
179
frontend/Cargo.lock
generated
179
frontend/Cargo.lock
generated
@ -14,6 +14,21 @@ version = "0.2.21"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
|
checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "android-tzdata"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "android_system_properties"
|
||||||
|
version = "0.1.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "autocfg"
|
name = "autocfg"
|
||||||
version = "1.4.0"
|
version = "1.4.0"
|
||||||
@ -59,18 +74,47 @@ version = "1.10.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
|
checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cc"
|
||||||
|
version = "1.2.24"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "16595d3be041c03b09d08d0858631facccee9221e579704070e6e9e4915d3bc7"
|
||||||
|
dependencies = [
|
||||||
|
"shlex",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cfg-if"
|
name = "cfg-if"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "chrono"
|
||||||
|
version = "0.4.41"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d"
|
||||||
|
dependencies = [
|
||||||
|
"android-tzdata",
|
||||||
|
"iana-time-zone",
|
||||||
|
"js-sys",
|
||||||
|
"num-traits",
|
||||||
|
"wasm-bindgen",
|
||||||
|
"windows-link",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "color_quant"
|
name = "color_quant"
|
||||||
version = "1.1.0"
|
version = "1.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
|
checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "core-foundation-sys"
|
||||||
|
version = "0.8.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cpufeatures"
|
name = "cpufeatures"
|
||||||
version = "0.2.17"
|
version = "0.2.17"
|
||||||
@ -194,6 +238,9 @@ dependencies = [
|
|||||||
"macroquad",
|
"macroquad",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
"thiserror 2.0.12",
|
||||||
|
"wasm-cookies",
|
||||||
|
"web-sys",
|
||||||
"web-time",
|
"web-time",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -252,6 +299,30 @@ version = "1.10.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
|
checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "iana-time-zone"
|
||||||
|
version = "0.1.63"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8"
|
||||||
|
dependencies = [
|
||||||
|
"android_system_properties",
|
||||||
|
"core-foundation-sys",
|
||||||
|
"iana-time-zone-haiku",
|
||||||
|
"js-sys",
|
||||||
|
"log",
|
||||||
|
"wasm-bindgen",
|
||||||
|
"windows-core",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "iana-time-zone-haiku"
|
||||||
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
|
||||||
|
dependencies = [
|
||||||
|
"cc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "image"
|
name = "image"
|
||||||
version = "0.24.9"
|
version = "0.24.9"
|
||||||
@ -517,6 +588,12 @@ dependencies = [
|
|||||||
"digest",
|
"digest",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "shlex"
|
||||||
|
version = "1.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "simd-adler32"
|
name = "simd-adler32"
|
||||||
version = "0.3.7"
|
version = "0.3.7"
|
||||||
@ -540,7 +617,16 @@ version = "1.0.69"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
|
checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"thiserror-impl",
|
"thiserror-impl 1.0.69",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "thiserror"
|
||||||
|
version = "2.0.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
|
||||||
|
dependencies = [
|
||||||
|
"thiserror-impl 2.0.12",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -554,6 +640,17 @@ dependencies = [
|
|||||||
"syn",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "thiserror-impl"
|
||||||
|
version = "2.0.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ttf-parser"
|
name = "ttf-parser"
|
||||||
version = "0.21.1"
|
version = "0.21.1"
|
||||||
@ -574,7 +671,7 @@ dependencies = [
|
|||||||
"log",
|
"log",
|
||||||
"rand",
|
"rand",
|
||||||
"sha1",
|
"sha1",
|
||||||
"thiserror",
|
"thiserror 1.0.69",
|
||||||
"utf-8",
|
"utf-8",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -590,6 +687,12 @@ version = "1.0.18"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
|
checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "urlencoding"
|
||||||
|
version = "1.3.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5a1f0175e03a0973cf4afd476bef05c26e228520400eb1fd473ad417b1c00ffb"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "utf-8"
|
name = "utf-8"
|
||||||
version = "0.7.6"
|
version = "0.7.6"
|
||||||
@ -679,6 +782,19 @@ dependencies = [
|
|||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wasm-cookies"
|
||||||
|
version = "0.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "792b7c4fd62cde421f0e757620053efa7b0c23441c05c6ec02baf96cd74973be"
|
||||||
|
dependencies = [
|
||||||
|
"chrono",
|
||||||
|
"js-sys",
|
||||||
|
"urlencoding",
|
||||||
|
"wasm-bindgen",
|
||||||
|
"web-sys",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "web-sys"
|
name = "web-sys"
|
||||||
version = "0.3.77"
|
version = "0.3.77"
|
||||||
@ -721,6 +837,65 @@ version = "0.4.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-core"
|
||||||
|
version = "0.61.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3"
|
||||||
|
dependencies = [
|
||||||
|
"windows-implement",
|
||||||
|
"windows-interface",
|
||||||
|
"windows-link",
|
||||||
|
"windows-result",
|
||||||
|
"windows-strings",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-implement"
|
||||||
|
version = "0.60.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-interface"
|
||||||
|
version = "0.59.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-link"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-result"
|
||||||
|
version = "0.3.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6"
|
||||||
|
dependencies = [
|
||||||
|
"windows-link",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-strings"
|
||||||
|
version = "0.4.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57"
|
||||||
|
dependencies = [
|
||||||
|
"windows-link",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zerocopy"
|
name = "zerocopy"
|
||||||
version = "0.8.25"
|
version = "0.8.25"
|
||||||
|
@ -8,4 +8,7 @@ ewebsock = "0.8.0"
|
|||||||
macroquad = "0.4.14"
|
macroquad = "0.4.14"
|
||||||
serde = { version = "1.0.219", features = ["derive"] }
|
serde = { version = "1.0.219", features = ["derive"] }
|
||||||
serde_json = "1.0.140"
|
serde_json = "1.0.140"
|
||||||
|
thiserror = "2.0.12"
|
||||||
|
wasm-cookies = "0.2.1"
|
||||||
|
web-sys = { version = "0.3.77", features = ["Window", "Document", "Location", "HtmlDocument"] }
|
||||||
web-time = "1.1.0"
|
web-time = "1.1.0"
|
||||||
|
@ -58,56 +58,6 @@ set -- "${POSITIONAL[@]}"
|
|||||||
|
|
||||||
PROJECT_NAME=$1
|
PROJECT_NAME=$1
|
||||||
|
|
||||||
HTML=$(
|
|
||||||
cat <<-END
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>${PROJECT_NAME}</title>
|
|
||||||
<style>
|
|
||||||
html,
|
|
||||||
body,
|
|
||||||
canvas {
|
|
||||||
margin: 0px;
|
|
||||||
padding: 0px;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
overflow: hidden;
|
|
||||||
position: absolute;
|
|
||||||
z-index: 0;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body style="margin: 0; padding: 0; height: 100vh; width: 100vw;">
|
|
||||||
<canvas id="glcanvas" tabindex='1' hidden></canvas>
|
|
||||||
<script src="https://not-fl3.github.io/miniquad-samples/mq_js_bundle.js"></script>
|
|
||||||
<script type="module">
|
|
||||||
import init, { set_wasm } from "./static/${PROJECT_NAME}.js";
|
|
||||||
async function impl_run() {
|
|
||||||
let wbg = await init();
|
|
||||||
miniquad_add_plugin({
|
|
||||||
register_plugin: (a) => (a.wbg = wbg),
|
|
||||||
on_init: () => set_wasm(wasm_exports),
|
|
||||||
version: "0.0.1",
|
|
||||||
name: "wbg",
|
|
||||||
});
|
|
||||||
load("./static/${PROJECT_NAME}_bg.wasm");
|
|
||||||
}
|
|
||||||
window.run = function() {
|
|
||||||
document.getElementById("run-container").remove();
|
|
||||||
document.getElementById("glcanvas").removeAttribute("hidden");
|
|
||||||
document.getElementById("glcanvas").focus();
|
|
||||||
impl_run();
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<div id="run-container" style="display: flex; justify-content: center; align-items: center; height: 100%; flex-direction: column;">
|
|
||||||
<button onclick="run()">Run Game</button>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
END
|
|
||||||
)
|
|
||||||
|
|
||||||
TARGET_DIR="target/wasm32-unknown-unknown"
|
TARGET_DIR="target/wasm32-unknown-unknown"
|
||||||
# Build
|
# Build
|
||||||
if [ -n "$RELEASE" ]; then
|
if [ -n "$RELEASE" ]; then
|
||||||
@ -127,6 +77,3 @@ sed -i "s/import \* as __wbg_star0 from 'env';//" dist/"$PROJECT_NAME".js
|
|||||||
sed -i "s/let wasm;/let wasm; export const set_wasm = (w) => wasm = w;/" dist/"$PROJECT_NAME".js
|
sed -i "s/let wasm;/let wasm; export const set_wasm = (w) => wasm = w;/" dist/"$PROJECT_NAME".js
|
||||||
sed -i "s/imports\['env'\] = __wbg_star0;/return imports.wbg\;/" dist/"$PROJECT_NAME".js
|
sed -i "s/imports\['env'\] = __wbg_star0;/return imports.wbg\;/" dist/"$PROJECT_NAME".js
|
||||||
sed -i "s/const imports = __wbg_get_imports();/return __wbg_get_imports();/" dist/"$PROJECT_NAME".js
|
sed -i "s/const imports = __wbg_get_imports();/return __wbg_get_imports();/" dist/"$PROJECT_NAME".js
|
||||||
|
|
||||||
# Create index from the HTML variable
|
|
||||||
echo "$HTML" >dist/index.html
|
|
||||||
|
66
frontend/src/cfg.rs
Normal file
66
frontend/src/cfg.rs
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
use thiserror::Error;
|
||||||
|
|
||||||
|
#[derive(Error, Debug)]
|
||||||
|
pub enum CfgError {
|
||||||
|
#[error("Unknown client type: '{0}'")]
|
||||||
|
UnkownClientType(String),
|
||||||
|
#[error("Missing cookie: '{0}'")]
|
||||||
|
MissingCookie(String),
|
||||||
|
#[error("Invalid cookie value: '{0}'")]
|
||||||
|
InvalidCookie(String),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub enum ClientType {
|
||||||
|
Host,
|
||||||
|
Player,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for ClientType {
|
||||||
|
type Err = CfgError;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
match s {
|
||||||
|
"host" => Ok(Self::Host),
|
||||||
|
"player" => Ok(Self::Player),
|
||||||
|
_ => Err(CfgError::UnkownClientType(s.to_string())),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Cfg {
|
||||||
|
pub token: String,
|
||||||
|
pub username: String,
|
||||||
|
pub user_id: u64,
|
||||||
|
pub game_code: String,
|
||||||
|
pub client_type: ClientType,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Cfg {
|
||||||
|
pub fn load_from_cookies() -> Result<Self, CfgError> {
|
||||||
|
let client_type = wasm_cookies::get_raw("play_of_the_game/client_type")
|
||||||
|
.ok_or(CfgError::MissingCookie("client_type".to_string()))?;
|
||||||
|
let token = wasm_cookies::get_raw("play_of_the_game/token")
|
||||||
|
.ok_or(CfgError::MissingCookie("token".to_string()))?;
|
||||||
|
let user_id = wasm_cookies::get_raw("play_of_the_game/user_id")
|
||||||
|
.ok_or(CfgError::MissingCookie("user_id".to_string()))?
|
||||||
|
.parse()
|
||||||
|
.map_err(|_| CfgError::InvalidCookie("user_id".to_string()))?;
|
||||||
|
let game_id = wasm_cookies::get_raw("play_of_the_game/game_code")
|
||||||
|
.ok_or(CfgError::MissingCookie("game_id".to_string()))?;
|
||||||
|
let username = wasm_cookies::get_raw("play_of_the_game/username")
|
||||||
|
.ok_or(CfgError::MissingCookie("username".to_string()))?;
|
||||||
|
|
||||||
|
let client_type: ClientType = ClientType::from_str(&client_type)?;
|
||||||
|
|
||||||
|
Ok(Self {
|
||||||
|
token,
|
||||||
|
username,
|
||||||
|
user_id,
|
||||||
|
game_code: game_id,
|
||||||
|
client_type,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@ -2,22 +2,30 @@ use ewebsock::WsEvent;
|
|||||||
use macroquad::prelude::{error, info};
|
use macroquad::prelude::{error, info};
|
||||||
use serde::{Serialize, de::DeserializeOwned};
|
use serde::{Serialize, de::DeserializeOwned};
|
||||||
|
|
||||||
|
use crate::cfg::{Cfg, ClientType};
|
||||||
|
|
||||||
pub struct Context {
|
pub struct Context {
|
||||||
pub sender: ewebsock::WsSender,
|
pub sender: ewebsock::WsSender,
|
||||||
pub reciever: ewebsock::WsReceiver,
|
pub reciever: ewebsock::WsReceiver,
|
||||||
pub token: String,
|
pub token: String,
|
||||||
pub username: String,
|
pub username: String,
|
||||||
|
pub user_id: u64,
|
||||||
|
pub game_code: String,
|
||||||
|
pub client_type: ClientType,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Context {
|
impl Context {
|
||||||
pub fn new(url: &str) -> Context {
|
pub fn new(url: &str, cfg: Cfg) -> Context {
|
||||||
let (sender, reciever) = ewebsock::connect(url, ewebsock::Options::default()).unwrap();
|
let (sender, reciever) = ewebsock::connect(url, ewebsock::Options::default()).unwrap();
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
sender,
|
sender,
|
||||||
reciever,
|
reciever,
|
||||||
token: String::new(),
|
token: cfg.token,
|
||||||
username: String::new(),
|
username: cfg.username,
|
||||||
|
game_code: cfg.game_code,
|
||||||
|
user_id: cfg.user_id,
|
||||||
|
client_type: cfg.client_type,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,131 +2,77 @@ use crate::StateTransition;
|
|||||||
use crate::context::Context;
|
use crate::context::Context;
|
||||||
use crate::font::FontSize;
|
use crate::font::FontSize;
|
||||||
use crate::screen::Screen;
|
use crate::screen::Screen;
|
||||||
use crate::ui_scaling::window_width;
|
use macroquad::prelude::*;
|
||||||
use macroquad::hash;
|
|
||||||
use macroquad::ui::widgets::Window;
|
|
||||||
use macroquad::{prelude::*, ui::root_ui};
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize)]
|
||||||
|
pub struct JoinMessage {
|
||||||
|
pub game_code: String,
|
||||||
|
pub user_id: u64,
|
||||||
|
pub token: String,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize)]
|
||||||
#[serde(tag = "type")]
|
#[serde(tag = "type")]
|
||||||
pub enum NewUserClientMessages {
|
pub enum NewUserClientMessages {
|
||||||
Register { game_code: String, username: String },
|
JoinAsPlayer(JoinMessage),
|
||||||
CreateRoom { game_code: String, username: String },
|
JoinAsHost(JoinMessage),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
#[derive(Debug, Deserialize)]
|
||||||
#[serde(tag = "type")]
|
#[serde(tag = "type")]
|
||||||
pub enum NewUserServerMessages {
|
pub enum NewUserServerMessages {
|
||||||
RegisterResponse { username: String, token: String },
|
RegisterResponse,
|
||||||
HostRegisterResponse { username: String, token: String },
|
HostRegisterResponse,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub struct LoginScreen {
|
pub struct LoginScreen {
|
||||||
new_username: String,
|
|
||||||
new_room_code: String,
|
|
||||||
sent_join: bool,
|
sent_join: bool,
|
||||||
sent_host: bool,
|
|
||||||
retry_count: usize,
|
retry_count: usize,
|
||||||
error_msg: bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Screen for LoginScreen {
|
impl Screen for LoginScreen {
|
||||||
fn handle_frame(&mut self, ctx: &mut Context) {
|
fn handle_frame(&mut self, ctx: &mut Context) {
|
||||||
clear_background(BEIGE);
|
clear_background(BEIGE);
|
||||||
|
|
||||||
let group_size = Vec2::new(window_width(), screen_height() * 0.05);
|
draw_text(
|
||||||
let window_size = Vec2::new(window_width(), screen_height() * 0.4);
|
"Starting up...",
|
||||||
|
screen_width() * 0.5,
|
||||||
let mut pressed_join = false;
|
screen_height() * 0.5,
|
||||||
let mut pressed_host = false;
|
FontSize::Large.size() as f32,
|
||||||
|
BLACK,
|
||||||
Window::new(
|
);
|
||||||
hash!("Window"),
|
|
||||||
Vec2::new(
|
|
||||||
screen_width() * 0.5 - window_size.x * 0.5,
|
|
||||||
screen_height() * 0.5 - window_size.x * 0.5,
|
|
||||||
),
|
|
||||||
window_size,
|
|
||||||
)
|
|
||||||
.movable(false)
|
|
||||||
.ui(&mut root_ui(), |ui| {
|
|
||||||
ui.group(hash!("User Group"), group_size, |ui| {
|
|
||||||
ui.input_text(hash!("Username In"), "Username", &mut self.new_username);
|
|
||||||
});
|
|
||||||
ui.group(hash!("Room Group"), group_size, |ui| {
|
|
||||||
ui.input_text(hash!("Room Code In"), "Room Code", &mut self.new_room_code);
|
|
||||||
});
|
|
||||||
ui.group(hash!("Join Group"), group_size, |ui| {
|
|
||||||
let dim = FontSize::Large.measure("Join");
|
|
||||||
if ui.button(
|
|
||||||
Vec2::new(group_size.x * 0.50, 0.0) - Vec2::new(dim.width * 0.5, 0.0),
|
|
||||||
"Join",
|
|
||||||
) {
|
|
||||||
info!(
|
|
||||||
"User pressed joined with name={} room_code={}",
|
|
||||||
self.new_username, self.new_room_code
|
|
||||||
);
|
|
||||||
|
|
||||||
pressed_join = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
ui.group(hash!("Host Group"), group_size, |ui| {
|
|
||||||
let dim = FontSize::Large.measure("Host Game");
|
|
||||||
if ui.button(
|
|
||||||
Vec2::new(group_size.x * 0.50, 0.0) - Vec2::new(dim.width * 0.5, 0.0),
|
|
||||||
"Host Game",
|
|
||||||
) {
|
|
||||||
info!(
|
|
||||||
"User pressed host with name={} room_code={}",
|
|
||||||
self.new_username, self.new_room_code
|
|
||||||
);
|
|
||||||
|
|
||||||
pressed_host = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if self.error_msg {
|
|
||||||
ui.group(hash!("Error Group"), group_size, |ui| {
|
|
||||||
ui.label(Vec2::new(0.0, 0.0), "Failed to join game, try again...");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if pressed_join {
|
|
||||||
ctx.send_msg(&NewUserClientMessages::Register {
|
|
||||||
game_code: self.new_room_code.clone(),
|
|
||||||
username: self.new_username.clone(),
|
|
||||||
});
|
|
||||||
|
|
||||||
|
if !self.sent_join {
|
||||||
self.sent_join = true;
|
self.sent_join = true;
|
||||||
}
|
|
||||||
|
|
||||||
if pressed_host {
|
let join_msg = JoinMessage {
|
||||||
ctx.send_msg(&NewUserClientMessages::CreateRoom {
|
game_code: ctx.game_code.clone(),
|
||||||
game_code: self.new_room_code.clone(),
|
user_id: ctx.user_id,
|
||||||
username: self.new_username.clone(),
|
token: ctx.token.clone(),
|
||||||
});
|
};
|
||||||
|
|
||||||
self.sent_host = true;
|
let msg = match ctx.client_type {
|
||||||
|
crate::cfg::ClientType::Host => NewUserClientMessages::JoinAsHost(join_msg),
|
||||||
|
crate::cfg::ClientType::Player => NewUserClientMessages::JoinAsPlayer(join_msg),
|
||||||
|
};
|
||||||
|
|
||||||
|
info!("Sending join request...");
|
||||||
|
ctx.send_msg(&msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_messages(&mut self, ctx: &mut Context) -> Option<StateTransition> {
|
fn handle_messages(&mut self, ctx: &mut Context) -> Option<StateTransition> {
|
||||||
if self.sent_join || self.sent_host {
|
if self.sent_join {
|
||||||
let msg = ctx.recv_msg();
|
let msg = ctx.recv_msg();
|
||||||
|
|
||||||
if let Some(msg) = msg {
|
if let Some(msg) = msg {
|
||||||
match msg {
|
match msg {
|
||||||
NewUserServerMessages::RegisterResponse { username, token } => {
|
NewUserServerMessages::RegisterResponse => {
|
||||||
ctx.username = username;
|
|
||||||
ctx.token = token;
|
|
||||||
return Some(StateTransition::JoinAsPlayer);
|
return Some(StateTransition::JoinAsPlayer);
|
||||||
}
|
}
|
||||||
NewUserServerMessages::HostRegisterResponse { username, token } => {
|
NewUserServerMessages::HostRegisterResponse => {
|
||||||
ctx.username = username;
|
|
||||||
ctx.token = token;
|
|
||||||
return Some(StateTransition::JoinAsHost);
|
return Some(StateTransition::JoinAsHost);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -134,11 +80,10 @@ impl Screen for LoginScreen {
|
|||||||
|
|
||||||
self.retry_count += 1;
|
self.retry_count += 1;
|
||||||
|
|
||||||
if self.retry_count > get_fps() as usize * 5 {
|
if self.retry_count > (get_fps() as usize * 100) {
|
||||||
warn!("Join failed, try again...");
|
warn!("Join failed, try again...");
|
||||||
self.retry_count = 0;
|
self.retry_count = 0;
|
||||||
self.sent_join = false;
|
self.sent_join = false;
|
||||||
self.error_msg = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
use cfg::Cfg;
|
||||||
use context::Context;
|
use context::Context;
|
||||||
use font::FontSize;
|
use font::FontSize;
|
||||||
use host_screen::HostScreen;
|
use host_screen::HostScreen;
|
||||||
@ -9,6 +10,7 @@ use macroquad::{
|
|||||||
use player_screen::PlayerScreen;
|
use player_screen::PlayerScreen;
|
||||||
use screen::Screen;
|
use screen::Screen;
|
||||||
|
|
||||||
|
mod cfg;
|
||||||
mod context;
|
mod context;
|
||||||
mod font;
|
mod font;
|
||||||
mod host_screen;
|
mod host_screen;
|
||||||
@ -96,9 +98,30 @@ pub fn default_skin() -> Skin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_ws_url() -> String {
|
||||||
|
let location = web_sys::window()
|
||||||
|
.unwrap()
|
||||||
|
.document()
|
||||||
|
.unwrap()
|
||||||
|
.location()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let protocol = if location.protocol().unwrap() == "https" {
|
||||||
|
"wss"
|
||||||
|
} else {
|
||||||
|
"ws"
|
||||||
|
};
|
||||||
|
|
||||||
|
format!("{}://{}/ws", protocol, location.host().unwrap())
|
||||||
|
}
|
||||||
|
|
||||||
|
mod modname {}
|
||||||
|
|
||||||
#[macroquad::main("Play of the Game")]
|
#[macroquad::main("Play of the Game")]
|
||||||
async fn main() {
|
async fn main() {
|
||||||
let mut context = Context::new("ws://127.0.0.1:8080/ws");
|
let cfg = Cfg::load_from_cookies().unwrap();
|
||||||
|
|
||||||
|
let mut context = Context::new(&get_ws_url(), cfg);
|
||||||
|
|
||||||
let mut state = State::Init;
|
let mut state = State::Init;
|
||||||
state.transition_state(StateTransition::Init);
|
state.transition_state(StateTransition::Init);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user