diff --git a/lib/api/game/login.ml b/lib/api/game/login.ml index e69de29..592a647 100644 --- a/lib/api/game/login.ml +++ b/lib/api/game/login.ml @@ -0,0 +1,12 @@ +open Lwt.Syntax +open Data.Platform.Credentials + +let platform_login credentials game domain send = + let url = Uri.make ~scheme:"https" ~host:domain ~path:"/game/login/platformlogin" () in + let* json = send url in + match json with + | Some j -> + let model = Models.Response.Game.Platform_login.from_json j in + Lwt.return @@ Some model + | None -> Lwt.return None +;; diff --git a/lib/api/game/platformlogin.ml b/lib/api/game/platformlogin.ml deleted file mode 100644 index 00ec5b7..0000000 --- a/lib/api/game/platformlogin.ml +++ /dev/null @@ -1,4 +0,0 @@ -open Data.Platform -open Data.Credentials - -let login game domain platform credentials = () diff --git a/lib/form.ml b/lib/form.ml new file mode 100644 index 0000000..8a4b83b --- /dev/null +++ b/lib/form.ml @@ -0,0 +1,18 @@ +open Lwt.Syntax +open Cohttp_lwt + +let post (url : Uri.t) (form_data : (string * string) list) = + let headers = Header.init_with "Content-Type" "application/x-www-form-urlencoded" in + let body = Uri.encoded_of_query form_data in + let* resp, body = Client.post ~headers ~body:(Body.of_string body) url in + let status = Response.status resp in + if Code.code_of_status status = 200 + then + let* body = Body.to_string body in + let json = Yojson.Basic.from_string body in + Lwt.return (Some json) + else ( + let url_str = Uri.to_string url in + let* _ = Lwt_io.printl (Printf.sprintf "HTTP Error: %s for URL: %s" (Code.string_of_status status) url_str) in + Lwt.return None) +;; diff --git a/lib/models/response/platform_login.ml b/lib/models/response/platform_login.ml new file mode 100644 index 0000000..aaa5041 --- /dev/null +++ b/lib/models/response/platform_login.ml @@ -0,0 +1,165 @@ +type data_entry = + { id1 : string + ; id2 : string + ; url : string + ; icon : string + ; name : string + ; unknown1 : string + ; unknown2 : string + ; unknown3 : string + ; unknown4 : string + ; unknown5 : string option + ; unknown6 : string option + ; id3 : string + ; id4 : string + ; unknown7 : string list + } + +type config_entry = + { key : string + ; value : string + } + +type nested_entry = + { id1 : string + ; id2 : string + ; url : string + ; icon : string + ; name : string + ; clan : string + ; score1 : string + ; score2 : string + ; score3 : string + ; score4 : string + ; score5 : string option + ; id3 : string + ; id4 : string + ; unknown_list : string list + } + +type t = + { id1 : string + ; id2 : string + ; timestamp1 : string + ; timestamp2 : string + ; data_entries : data_entry list + ; unknown1 : string + ; unknown2 : string + ; unknown3 : string option + ; config : config_entry list + ; nested_entries : nested_entry list + } + +let from_json json = + let open Yojson.Basic.Util in + { id1 = json |> member "id1" |> to_string + ; id2 = json |> member "id2" |> to_string + ; timestamp1 = json |> member "timestamp1" |> to_string + ; timestamp2 = json |> member "timestamp2" |> to_string + ; data_entries = + json + |> member "data_entries" + |> to_list + |> List.map (fun entry -> + { id1 = entry |> member "id1" |> to_string + ; id2 = entry |> member "id2" |> to_string + ; url = entry |> member "url" |> to_string + ; icon = entry |> member "icon" |> to_string + ; name = entry |> member "name" |> to_string + ; unknown1 = entry |> member "unknown1" |> to_string + ; unknown2 = entry |> member "unknown2" |> to_string + ; unknown3 = entry |> member "unknown3" |> to_string + ; unknown4 = entry |> member "unknown4" |> to_string + ; unknown5 = entry |> member "unknown5" |> to_option to_string + ; unknown6 = entry |> member "unknown6" |> to_option to_string + ; id3 = entry |> member "id3" |> to_string + ; id4 = entry |> member "id4" |> to_string + ; unknown7 = entry |> member "unknown7" |> to_list |> List.map to_string + }) + ; unknown1 = json |> member "unknown1" |> to_string + ; unknown2 = json |> member "unknown2" |> to_string + ; unknown3 = json |> member "unknown3" |> to_option to_string + ; config = + json + |> member "config" + |> to_list + |> List.map (fun entry -> + { key = entry |> member "key" |> to_string; value = entry |> member "value" |> to_string }) + ; nested_entries = + json + |> member "nested_entries" + |> to_list + |> List.map (fun entry -> + { id1 = entry |> member "id1" |> to_string + ; id2 = entry |> member "id2" |> to_string + ; url = entry |> member "url" |> to_string + ; icon = entry |> member "icon" |> to_string + ; name = entry |> member "name" |> to_string + ; clan = entry |> member "clan" |> to_string + ; score1 = entry |> member "score1" |> to_string + ; score2 = entry |> member "score2" |> to_string + ; score3 = entry |> member "score3" |> to_string + ; score4 = entry |> member "score4" |> to_string + ; score5 = entry |> member "score5" |> to_option to_string + ; id3 = entry |> member "id3" |> to_string + ; id4 = entry |> member "id4" |> to_string + ; unknown_list = entry |> member "unknown_list" |> to_list |> List.map to_string + }) + } +;; + +let to_json a = + `Assoc + [ "id1", `String a.id1 + ; "id2", `String a.id2 + ; "timestamp1", `String a.timestamp1 + ; "timestamp2", `String a.timestamp2 + ; ( "data_entries" + , `List + (List.map + (fun entry -> + `Assoc + [ "id1", `String entry.id1 + ; "id2", `String entry.id2 + ; "url", `String entry.url + ; "icon", `String entry.icon + ; "name", `String entry.name + ; "unknown1", `String entry.unknown1 + ; "unknown2", `String entry.unknown2 + ; "unknown3", `String entry.unknown3 + ; "unknown4", `String entry.unknown4 + ; ("unknown5", match entry.unknown5 with Some v -> `String v | None -> `Null) + ; ("unknown6", match entry.unknown6 with Some v -> `String v | None -> `Null) + ; "id3", `String entry.id3 + ; "id4", `String entry.id4 + ; "unknown7", `List (List.map (fun i -> `String i) entry.unknown7) + ]) + a.data_entries) ) + ; "unknown1", `String a.unknown1 + ; "unknown2", `String a.unknown2 + ; ("unknown3", match a.unknown3 with Some v -> `String v | None -> `Null) + ; ( "config" + , `List (List.map (fun entry -> `Assoc [ "key", `String entry.key; "value", `String entry.value ]) a.config) ) + ; ( "nested_entries" + , `List + (List.map + (fun entry -> + `Assoc + [ "id1", `String entry.id1 + ; "id2", `String entry.id2 + ; "url", `String entry.url + ; "icon", `String entry.icon + ; "name", `String entry.name + ; "clan", `String entry.clan + ; "score1", `String entry.score1 + ; "score2", `String entry.score2 + ; "score3", `String entry.score3 + ; "score4", `String entry.score4 + ; ("score5", match entry.score5 with Some v -> `String v | None -> `Null) + ; "id3", `String entry.id3 + ; "id4", `String entry.id4 + ; "unknown_list", `List (List.map (fun i -> `String i) entry.unknown_list) + ]) + a.nested_entries) ) + ] +;; diff --git a/shell.nix b/shell.nix index 59e73c2..cbb6437 100644 --- a/shell.nix +++ b/shell.nix @@ -18,5 +18,6 @@ pkgs.mkShell{ shellHook = '' export C_INCLUDE_PATH=${pkgs.zlib.dev}/include:$C_INCLUDE_PATH export LIBRARY_PATH=${pkgs.zlib}/lib:$LIBRARY_PATH + export OPAM_SWITCH_PREFIX=$HOME/.opam/5.2.0 ''; }