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();
+ }
}