From 8ecd9a88d3f26518e832b5f4683295a7e1e22829 Mon Sep 17 00:00:00 2001 From: Pyrite Date: Sat, 24 May 2025 14:35:56 +0200 Subject: [PATCH] feat(torn-api): add chrono for datetime support --- Cargo.lock | 2 + torn-api-codegen/openapi.json | 727 +++++++++++++++++++++++- torn-api-codegen/src/model/mod.rs | 5 +- torn-api-codegen/src/model/object.rs | 5 + torn-api-codegen/src/model/parameter.rs | 7 +- torn-api/Cargo.toml | 1 + torn-api/src/scopes.rs | 16 + 7 files changed, 741 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 65a0c28..f8e47bc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -227,6 +227,7 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", + "serde", "wasm-bindgen", "windows-link", ] @@ -2275,6 +2276,7 @@ version = "1.2.0" dependencies = [ "bon", "bytes", + "chrono", "futures", "http", "prettyplease", diff --git a/torn-api-codegen/openapi.json b/torn-api-codegen/openapi.json index c5ddb7a..e70979a 100644 --- a/torn-api-codegen/openapi.json +++ b/torn-api-codegen/openapi.json @@ -3,7 +3,7 @@ "info": { "title": "Torn API", "description": "\n * The development of Torn's API v2 is still ongoing.\n * If selections remain unaltered, they will default to the API v1 version.\n * Unlike API v1, API v2 accepts both selections and IDs as path and query parameters.\n * If any discrepancies or errors are found, please submit a [bug report](https://www.torn.com/forums.php#/p=forums&f=19&b=0&a=0) on the Torn Forums.\n * In case you're using bots to check for changes on openapi.json file, make sure to specificy a custom user-agent header - CloudFlare sometimes prevents requests from default user-agents.", - "version": "1.6.1" + "version": "1.7.0" }, "servers": [ { @@ -1226,6 +1226,69 @@ "x-stability": "Stable" } }, + "/user/reports": { + "get": { + "tags": [ + "User" + ], + "summary": "Get your reports", + "description": "Requires limited access key.
\n * The default limit is set to 25. However, the limit can be set to 100 for the 'stats' category.", + "operationId": "6ba15a813fe1cc014564e9dba892e022", + "parameters": [ + { + "name": "cat", + "in": "query", + "description": "Used to filter reports with a specific type.", + "required": false, + "schema": { + "$ref": "#/components/schemas/ReportTypeEnum" + } + }, + { + "name": "target", + "in": "query", + "description": "Get reports for a specific player by passing their player ID.", + "required": false, + "schema": { + "$ref": "#/components/schemas/UserId" + } + }, + { + "$ref": "#/components/parameters/ApiLimit100Default20" + }, + { + "$ref": "#/components/parameters/ApiOffset" + }, + { + "$ref": "#/components/parameters/ApiTimestamp" + }, + { + "$ref": "#/components/parameters/ApiComment" + }, + { + "$ref": "#/components/parameters/ApiKeyLimited" + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReportsResponse" + } + } + } + } + }, + "security": [ + { + "api_key": [] + } + ], + "x-stability": "Unstable" + } + }, "/user/revives": { "get": { "tags": [ @@ -2787,6 +2850,69 @@ "x-stability": "Stable" } }, + "/faction/reports": { + "get": { + "tags": [ + "Faction" + ], + "summary": "Get faction reports", + "description": "Requires limited access key.
\n * The default limit is set to 25. However, the limit can be set to 100 for the 'stats' category.", + "operationId": "e8bd37f10cc5e0e8d6694bb306f3a1e4", + "parameters": [ + { + "name": "cat", + "in": "query", + "description": "Used to filter reports with a specific type.", + "required": false, + "schema": { + "$ref": "#/components/schemas/ReportTypeEnum" + } + }, + { + "name": "target", + "in": "query", + "description": "Get reports for a specific player by passing their player ID.", + "required": false, + "schema": { + "$ref": "#/components/schemas/UserId" + } + }, + { + "$ref": "#/components/parameters/ApiLimit100Default20" + }, + { + "$ref": "#/components/parameters/ApiOffset" + }, + { + "$ref": "#/components/parameters/ApiTimestamp" + }, + { + "$ref": "#/components/parameters/ApiComment" + }, + { + "$ref": "#/components/parameters/ApiKeyLimited" + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReportsResponse" + } + } + } + } + }, + "security": [ + { + "api_key": [] + } + ], + "x-stability": "Unstable" + } + }, "/faction/revives": { "get": { "tags": [ @@ -3998,15 +4124,6 @@ { "$ref": "#/components/parameters/ApiOffsetNoDefault" }, - { - "name": "cat", - "in": "query", - "description": "Selection category", - "required": false, - "schema": { - "type": "string" - } - }, { "$ref": "#/components/parameters/ApiTimestamp" }, @@ -5983,6 +6100,37 @@ "E" ] }, + "CountryEnum": { + "type": "string", + "enum": [ + "Mexico", + "Hawaii", + "South Africa", + "Japan", + "China", + "Argentina", + "Switzerland", + "Canada", + "United Kingdom", + "UAE", + "Cayman Islands" + ] + }, + "ReportTypeEnum": { + "type": "string", + "enum": [ + "mostwanted", + "money", + "stats", + "references", + "friendorfoe", + "companyfinancials", + "truelevel", + "stockanalysis", + "anonymousbounties", + "investment" + ] + }, "ApiKeyAccessTypeEnum": { "type": "string", "enum": [ @@ -11450,6 +11598,551 @@ }, "type": "object" }, + "ReportBase": { + "required": [ + "type", + "target_id", + "reporter_id", + "faction_id", + "timestamp" + ], + "properties": { + "type": { + "$ref": "#/components/schemas/ReportTypeEnum" + }, + "target_id": { + "description": "The target ID if applicable.", + "oneOf": [ + { + "$ref": "#/components/schemas/UserId" + }, + { + "type": "null" + } + ] + }, + "reporter_id": { + "$ref": "#/components/schemas/UserId" + }, + "faction_id": { + "description": "Reporter's faction ID if applicable.", + "oneOf": [ + { + "$ref": "#/components/schemas/FactionId" + }, + { + "type": "null" + } + ] + }, + "timestamp": { + "type": "integer", + "format": "int32" + } + }, + "type": "object" + }, + "ReportWarrantDetails": { + "required": [ + "id", + "name", + "warrant" + ], + "properties": { + "id": { + "$ref": "#/components/schemas/UserId" + }, + "name": { + "type": "string" + }, + "warrant": { + "type": "integer", + "format": "int32" + } + }, + "type": "object" + }, + "ReportMostWanted": { + "required": [ + "top", + "notable" + ], + "properties": { + "top": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ReportWarrantDetails" + } + }, + "notable": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ReportWarrantDetails" + } + } + }, + "type": "object" + }, + "ReportMoney": { + "required": [ + "money" + ], + "properties": { + "money": { + "type": "integer", + "format": "int32" + } + }, + "type": "object" + }, + "ReportInvestment": { + "required": [ + "amount", + "until" + ], + "properties": { + "amount": { + "type": "integer", + "format": "int64" + }, + "until": { + "type": "integer", + "format": "int32" + } + }, + "type": "object" + }, + "ReportTrueLevel": { + "required": [ + "level" + ], + "properties": { + "level": { + "type": "integer", + "format": "int32" + } + }, + "type": "object" + }, + "ReportStats": { + "required": [ + "strength", + "speed", + "dexterity", + "defense", + "total" + ], + "properties": { + "strength": { + "oneOf": [ + { + "type": "integer", + "format": "int64" + }, + { + "type": "null" + } + ] + }, + "speed": { + "oneOf": [ + { + "type": "integer", + "format": "int64" + }, + { + "type": "null" + } + ] + }, + "dexterity": { + "oneOf": [ + { + "type": "integer", + "format": "int64" + }, + { + "type": "null" + } + ] + }, + "defense": { + "oneOf": [ + { + "type": "integer", + "format": "int64" + }, + { + "type": "null" + } + ] + }, + "total": { + "oneOf": [ + { + "type": "integer", + "format": "int64" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "ReportHistoryFaction": { + "required": [ + "id", + "name", + "joined", + "left" + ], + "properties": { + "id": { + "$ref": "#/components/schemas/FactionId" + }, + "name": { + "type": "string" + }, + "joined": { + "type": "string", + "format": "date" + }, + "left": { + "oneOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "ReportHistoryCompany": { + "required": [ + "id", + "name", + "joined", + "left" + ], + "properties": { + "id": { + "$ref": "#/components/schemas/CompanyId" + }, + "name": { + "type": "string" + }, + "joined": { + "type": "string", + "format": "date" + }, + "left": { + "oneOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "ReportHistory": { + "required": [ + "factions", + "companies" + ], + "properties": { + "factions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ReportHistoryFaction" + } + }, + "companies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ReportHistoryCompany" + } + } + }, + "type": "object" + }, + "ReportFriendOrFoeUser": { + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "$ref": "#/components/schemas/UserId" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "ReportFriendOrFoe": { + "required": [ + "friends", + "enemies" + ], + "properties": { + "friends": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ReportFriendOrFoeUser" + } + }, + "enemies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ReportFriendOrFoeUser" + } + } + }, + "type": "object" + }, + "ReportCompanyFinancials": { + "required": [ + "balance", + "employees", + "wages" + ], + "properties": { + "balance": { + "type": "integer", + "format": "int64" + }, + "employees": { + "type": "integer", + "format": "int32" + }, + "wages": { + "required": [ + "highest", + "lowest", + "average" + ], + "properties": { + "highest": { + "type": "integer", + "format": "int32" + }, + "lowest": { + "type": "integer", + "format": "int32" + }, + "average": { + "type": "integer", + "format": "int32" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "ReportStockAnalysis": { + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "items": { + "required": [ + "country", + "item", + "trip_duration", + "hourly_profit" + ], + "properties": { + "country": { + "$ref": "#/components/schemas/CountryEnum" + }, + "item": { + "required": [ + "id", + "name", + "stock", + "price", + "value", + "due" + ], + "properties": { + "id": { + "$ref": "#/components/schemas/ItemId" + }, + "name": { + "type": "string" + }, + "price": { + "type": "integer", + "format": "int32" + }, + "value": { + "type": "integer", + "format": "int32" + }, + "due": { + "oneOf": [ + { + "type": "integer", + "format": "int32" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "trip_duration": { + "type": "integer", + "format": "int32" + }, + "hourly_profit": { + "type": "integer", + "format": "int32" + } + }, + "type": "object" + } + } + }, + "type": "object" + }, + "ReportAnonymousBounties": { + "required": [ + "bounties" + ], + "properties": { + "bounties": { + "type": "array", + "items": { + "required": [ + "bounty", + "user", + "text" + ], + "properties": { + "text": { + "type": "string" + }, + "bounty": { + "type": "integer", + "format": "int64" + }, + "user": { + "oneOf": [ + { + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "$ref": "#/components/schemas/UserId" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + } + } + }, + "type": "object" + }, + "ReportReport": { + "required": [ + "report" + ], + "properties": { + "report": { + "oneOf": [ + { + "$ref": "#/components/schemas/ReportMoney" + }, + { + "$ref": "#/components/schemas/ReportStats" + }, + { + "$ref": "#/components/schemas/ReportMostWanted" + }, + { + "$ref": "#/components/schemas/ReportHistory" + }, + { + "$ref": "#/components/schemas/ReportFriendOrFoe" + }, + { + "$ref": "#/components/schemas/ReportCompanyFinancials" + }, + { + "$ref": "#/components/schemas/ReportTrueLevel" + }, + { + "$ref": "#/components/schemas/ReportStockAnalysis" + }, + { + "$ref": "#/components/schemas/ReportAnonymousBounties" + }, + { + "$ref": "#/components/schemas/ReportInvestment" + } + ] + } + }, + "type": "object" + }, + "Report": { + "allOf": [ + { + "$ref": "#/components/schemas/ReportBase" + }, + { + "$ref": "#/components/schemas/ReportReport" + } + ] + }, + "ReportsResponse": { + "required": [ + "reports", + "_metadata" + ], + "properties": { + "reports": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Report" + } + }, + "_metadata": { + "$ref": "#/components/schemas/RequestMetadataWithLinks" + } + }, + "type": "object" + }, "UserCurrentEducation": { "required": [ "id", @@ -12412,7 +13105,7 @@ ], "properties": { "value": { - "type": "integer", + "type": "number", "format": "float" }, "rank": { @@ -12434,7 +13127,7 @@ "rank": { "oneOf": [ { - "type": "number", + "type": "integer", "format": "int32" }, { @@ -21603,6 +22296,16 @@ "minimum": 1 } }, + "ApiTarget": { + "name": "target", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "minimum": 1 + } + }, "ApiSort": { "name": "sort", "in": "query", diff --git a/torn-api-codegen/src/model/mod.rs b/torn-api-codegen/src/model/mod.rs index e230952..6b9c313 100644 --- a/torn-api-codegen/src/model/mod.rs +++ b/torn-api-codegen/src/model/mod.rs @@ -61,10 +61,7 @@ impl Model { #[cfg(test)] mod test { use super::*; - use crate::{ - model::r#enum::{EnumRepr, EnumVariant}, - openapi::schema::OpenApiSchema, - }; + use crate::openapi::schema::OpenApiSchema; #[test] fn resolve_newtypes() { diff --git a/torn-api-codegen/src/model/object.rs b/torn-api-codegen/src/model/object.rs index c29dcbe..8b96376 100644 --- a/torn-api-codegen/src/model/object.rs +++ b/torn-api-codegen/src/model/object.rs @@ -15,6 +15,7 @@ pub enum PrimitiveType { I64, String, Float, + DateTime, } #[derive(Debug, Clone, PartialEq, Eq)] @@ -35,6 +36,9 @@ impl PropertyType { Self::Primitive(PrimitiveType::String) => { Some(format_ident!("String").into_token_stream()) } + Self::Primitive(PrimitiveType::DateTime) => { + Some(quote! { chrono::DateTime }) + } Self::Primitive(PrimitiveType::Float) => Some(format_ident!("f64").into_token_stream()), Self::Ref(path) => { let name = path.strip_prefix("#/components/schemas/")?; @@ -211,6 +215,7 @@ impl Property { PrimitiveType::Float } (Some("string"), None) => PrimitiveType::String, + (Some("string"), Some("date")) => PrimitiveType::DateTime, (Some("boolean"), None) => PrimitiveType::Bool, _ => return None, }; diff --git a/torn-api-codegen/src/model/parameter.rs b/torn-api-codegen/src/model/parameter.rs index 23daff1..613b8a9 100644 --- a/torn-api-codegen/src/model/parameter.rs +++ b/torn-api-codegen/src/model/parameter.rs @@ -303,12 +303,7 @@ The default value [Self::{}](self::{}#variant.{})"#, let mut code = inner.codegen().unwrap_or_default(); let name = format_ident!("{}", outer_name); - let inner_ty = if matches!(items.as_ref(), ParameterType::Schema { type_name: _ }) { - let inner_name = format_ident!("{}", inner_name); - quote! { crate::models::#inner_name } - } else { - items.codegen_type_name(&inner_name).to_token_stream() - }; + let inner_ty = items.codegen_type_name(&inner_name); code.extend(quote! { #[derive(Debug, Clone)] diff --git a/torn-api/Cargo.toml b/torn-api/Cargo.toml index b9c49dc..0dfc324 100644 --- a/torn-api/Cargo.toml +++ b/torn-api/Cargo.toml @@ -31,6 +31,7 @@ futures = { version = "0.3", default-features = false, features = [ "std", "async-await", ] } +chrono = { version = "0.4.41", features = ["serde"] } [dev-dependencies] tokio = { version = "1", features = ["full"] } diff --git a/torn-api/src/scopes.rs b/torn-api/src/scopes.rs index 9910897..ea548f0 100644 --- a/torn-api/src/scopes.rs +++ b/torn-api/src/scopes.rs @@ -366,6 +366,15 @@ pub(super) mod test { faction_scope.lookup(|b| b).await.unwrap(); } + #[tokio::test] + async fn faction_reports() { + let client = test_client().await; + + let faction_scope = FactionScope(&client); + + faction_scope.reports(|b| b).await.unwrap(); + } + #[tokio::test] async fn forum_categories() { let client = test_client().await; @@ -954,4 +963,11 @@ pub(super) mod test { client.user().attacks(|b| b).await.unwrap(); } + + #[tokio::test] + async fn user_reports() { + let client = test_client().await; + + client.user().reports(|b| b).await.unwrap(); + } }