From f7bf5e4b57f2f3410dc58a842fddd071583ace63 Mon Sep 17 00:00:00 2001 From: Dave Lewis Date: Wed, 8 Jul 2026 13:37:21 +0100 Subject: [PATCH 1/4] Add Wargaming.net plugin New low-code plugin covering World of Tanks, World of Warships and World of Warplanes via the Wargaming.net Public API, from a single datasource. - Object types: Player and Clan (cross-game), plus WoT Vehicle, WoWs Ship and WoWp Aircraft encyclopedias - 14 data streams: per-game player summaries, per-vehicle/ship stats, clan summary + members, encyclopedias, and nickname search - OOB dashboards: overview, per-game Player perspective, and Clan/Vehicle/ Ship/Aircraft perspectives - Multi-host: baseUrl is the scheme only (https://) with each stream's full host in endpointPath, so all three games work from one datasource - WoWs ship encyclopedia paginates (100/page); imported via one step per page Co-Authored-By: Claude Opus 4.8 (1M context) --- .../Wargaming.net/v1/configValidation.json | 11 + plugins/Wargaming.net/v1/custom_types.json | 37 ++ .../v1/dataStreams/accountInfo.json | 27 + .../v1/dataStreams/clanInfo.json | 31 + .../v1/dataStreams/clanMembers.json | 28 + .../v1/dataStreams/clanSummary.json | 31 + .../v1/dataStreams/encyclopediaInfo.json | 27 + .../v1/dataStreams/encyclopediaVehicles.json | 25 + .../v1/dataStreams/planesEncyclopedia.json | 25 + .../v1/dataStreams/playerSearch.json | 34 + .../v1/dataStreams/playerShipStats.json | 30 + .../v1/dataStreams/playerSummary.json | 35 ++ .../v1/dataStreams/playerVehicleStats.json | 32 + .../dataStreams/playerWarplanesSummary.json | 33 + .../v1/dataStreams/playerWarshipsSummary.json | 31 + .../v1/dataStreams/scripts/accountInfo.js | 2 + .../v1/dataStreams/scripts/clanInfo.js | 8 + .../v1/dataStreams/scripts/clanMembers.js | 10 + .../v1/dataStreams/scripts/clanSummary.js | 13 + .../scripts/encyclopediaVehicles.js | 2 + .../dataStreams/scripts/planesEncyclopedia.js | 2 + .../v1/dataStreams/scripts/playerShipStats.js | 14 + .../v1/dataStreams/scripts/playerSummary.js | 21 + .../dataStreams/scripts/playerVehicleStats.js | 17 + .../scripts/playerWarplanesSummary.js | 21 + .../scripts/playerWarshipsSummary.js | 17 + .../dataStreams/scripts/shipsEncyclopedia.js | 2 + .../v1/dataStreams/shipsEncyclopedia.json | 32 + .../v1/defaultContent/aircraft.dash.json | 54 ++ .../v1/defaultContent/clan.dash.json | 96 +++ .../v1/defaultContent/manifest.json | 10 + .../v1/defaultContent/overview.dash.json | 324 ++++++++++ .../v1/defaultContent/player.dash.json | 593 ++++++++++++++++++ .../v1/defaultContent/scopes.json | 62 ++ .../v1/defaultContent/ship.dash.json | 54 ++ .../v1/defaultContent/vehicle.dash.json | 54 ++ plugins/Wargaming.net/v1/docs/README.md | 59 ++ plugins/Wargaming.net/v1/icon.svg | 10 + .../v1/indexDefinitions/default.json | 169 +++++ plugins/Wargaming.net/v1/metadata.json | 56 ++ plugins/Wargaming.net/v1/ui.json | 54 ++ 41 files changed, 2193 insertions(+) create mode 100644 plugins/Wargaming.net/v1/configValidation.json create mode 100644 plugins/Wargaming.net/v1/custom_types.json create mode 100644 plugins/Wargaming.net/v1/dataStreams/accountInfo.json create mode 100644 plugins/Wargaming.net/v1/dataStreams/clanInfo.json create mode 100644 plugins/Wargaming.net/v1/dataStreams/clanMembers.json create mode 100644 plugins/Wargaming.net/v1/dataStreams/clanSummary.json create mode 100644 plugins/Wargaming.net/v1/dataStreams/encyclopediaInfo.json create mode 100644 plugins/Wargaming.net/v1/dataStreams/encyclopediaVehicles.json create mode 100644 plugins/Wargaming.net/v1/dataStreams/planesEncyclopedia.json create mode 100644 plugins/Wargaming.net/v1/dataStreams/playerSearch.json create mode 100644 plugins/Wargaming.net/v1/dataStreams/playerShipStats.json create mode 100644 plugins/Wargaming.net/v1/dataStreams/playerSummary.json create mode 100644 plugins/Wargaming.net/v1/dataStreams/playerVehicleStats.json create mode 100644 plugins/Wargaming.net/v1/dataStreams/playerWarplanesSummary.json create mode 100644 plugins/Wargaming.net/v1/dataStreams/playerWarshipsSummary.json create mode 100644 plugins/Wargaming.net/v1/dataStreams/scripts/accountInfo.js create mode 100644 plugins/Wargaming.net/v1/dataStreams/scripts/clanInfo.js create mode 100644 plugins/Wargaming.net/v1/dataStreams/scripts/clanMembers.js create mode 100644 plugins/Wargaming.net/v1/dataStreams/scripts/clanSummary.js create mode 100644 plugins/Wargaming.net/v1/dataStreams/scripts/encyclopediaVehicles.js create mode 100644 plugins/Wargaming.net/v1/dataStreams/scripts/planesEncyclopedia.js create mode 100644 plugins/Wargaming.net/v1/dataStreams/scripts/playerShipStats.js create mode 100644 plugins/Wargaming.net/v1/dataStreams/scripts/playerSummary.js create mode 100644 plugins/Wargaming.net/v1/dataStreams/scripts/playerVehicleStats.js create mode 100644 plugins/Wargaming.net/v1/dataStreams/scripts/playerWarplanesSummary.js create mode 100644 plugins/Wargaming.net/v1/dataStreams/scripts/playerWarshipsSummary.js create mode 100644 plugins/Wargaming.net/v1/dataStreams/scripts/shipsEncyclopedia.js create mode 100644 plugins/Wargaming.net/v1/dataStreams/shipsEncyclopedia.json create mode 100644 plugins/Wargaming.net/v1/defaultContent/aircraft.dash.json create mode 100644 plugins/Wargaming.net/v1/defaultContent/clan.dash.json create mode 100644 plugins/Wargaming.net/v1/defaultContent/manifest.json create mode 100644 plugins/Wargaming.net/v1/defaultContent/overview.dash.json create mode 100644 plugins/Wargaming.net/v1/defaultContent/player.dash.json create mode 100644 plugins/Wargaming.net/v1/defaultContent/scopes.json create mode 100644 plugins/Wargaming.net/v1/defaultContent/ship.dash.json create mode 100644 plugins/Wargaming.net/v1/defaultContent/vehicle.dash.json create mode 100644 plugins/Wargaming.net/v1/docs/README.md create mode 100644 plugins/Wargaming.net/v1/icon.svg create mode 100644 plugins/Wargaming.net/v1/indexDefinitions/default.json create mode 100644 plugins/Wargaming.net/v1/metadata.json create mode 100644 plugins/Wargaming.net/v1/ui.json diff --git a/plugins/Wargaming.net/v1/configValidation.json b/plugins/Wargaming.net/v1/configValidation.json new file mode 100644 index 0000000..60f582f --- /dev/null +++ b/plugins/Wargaming.net/v1/configValidation.json @@ -0,0 +1,11 @@ +{ + "steps": [ + { + "displayName": "Authenticate", + "dataStream": { "name": "encyclopediaInfo" }, + "required": true, + "error": "Could not authenticate. Check your Application ID is correct and matches the selected realm.", + "success": "Connected to the Wargaming API successfully." + } + ] +} diff --git a/plugins/Wargaming.net/v1/custom_types.json b/plugins/Wargaming.net/v1/custom_types.json new file mode 100644 index 0000000..a733143 --- /dev/null +++ b/plugins/Wargaming.net/v1/custom_types.json @@ -0,0 +1,37 @@ +[ + { + "name": "Player", + "sourceType": "Player", + "icon": "user", + "singular": "Player", + "plural": "Players" + }, + { + "name": "Clan", + "sourceType": "Clan", + "icon": "shield-halved", + "singular": "Clan", + "plural": "Clans" + }, + { + "name": "WoT Vehicle", + "sourceType": "WoT Vehicle", + "icon": "truck-monster", + "singular": "Vehicle", + "plural": "Vehicles" + }, + { + "name": "WoWs Ship", + "sourceType": "WoWs Ship", + "icon": "ship", + "singular": "Ship", + "plural": "Ships" + }, + { + "name": "WoWp Aircraft", + "sourceType": "WoWp Aircraft", + "icon": "plane", + "singular": "Aircraft", + "plural": "Aircraft" + } +] diff --git a/plugins/Wargaming.net/v1/dataStreams/accountInfo.json b/plugins/Wargaming.net/v1/dataStreams/accountInfo.json new file mode 100644 index 0000000..fb42ed7 --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/accountInfo.json @@ -0,0 +1,27 @@ +{ + "name": "accountInfo", + "displayName": "Account Info", + "description": "Identity details for the tracked player accounts", + "tags": ["Player"], + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "endpointPath": "api.worldoftanks.{{dataSource.realm}}/wot/account/info/", + "getArgs": [ + { + "key": "account_id", + "value": "{{(dataSource.accountIds || []).map(o => o.value).join(',') || null}}" + }, + { "key": "fields", "value": "account_id,nickname,clan_id" } + ], + "postRequestScript": "accountInfo.js" + }, + "matches": "none", + "visibility": { "type": "hidden" }, + "metadata": [ + { "name": "account_id", "displayName": "Account ID", "shape": "string" }, + { "name": "nickname", "displayName": "Nickname", "shape": "string", "role": "label" }, + { "name": "clan_id", "displayName": "Clan ID", "shape": "string" } + ], + "timeframes": false +} diff --git a/plugins/Wargaming.net/v1/dataStreams/clanInfo.json b/plugins/Wargaming.net/v1/dataStreams/clanInfo.json new file mode 100644 index 0000000..12621a0 --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/clanInfo.json @@ -0,0 +1,31 @@ +{ + "name": "clanInfo", + "displayName": "Clan Info", + "description": "Details for the tracked clans including tag, member count and leader", + "tags": ["Clan"], + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "endpointPath": "api.worldoftanks.{{dataSource.realm}}/wgn/clans/info/", + "getArgs": [ + { + "key": "clan_id", + "value": "{{(dataSource.clanIds || []).map(o => o.value).join(',') || null}}" + }, + { "key": "fields", "value": "clan_id,name,tag,members_count,leader_name,motto,created_at" } + ], + "postRequestScript": "clanInfo.js" + }, + "matches": "none", + "visibility": { "type": "hidden" }, + "metadata": [ + { "name": "clan_id", "displayName": "Clan ID", "shape": "string" }, + { "name": "name", "displayName": "Name", "shape": "string", "role": "label" }, + { "name": "tag", "displayName": "Tag", "shape": "string" }, + { "name": "members_count", "displayName": "Members", "shape": "number" }, + { "name": "leader_name", "displayName": "Leader", "shape": "string" }, + { "name": "motto", "displayName": "Motto", "shape": "string" }, + { "name": "created_at", "displayName": "Created", "shape": "date" } + ], + "timeframes": false +} diff --git a/plugins/Wargaming.net/v1/dataStreams/clanMembers.json b/plugins/Wargaming.net/v1/dataStreams/clanMembers.json new file mode 100644 index 0000000..840811c --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/clanMembers.json @@ -0,0 +1,28 @@ +{ + "name": "clanMembers", + "displayName": "Clan Members", + "description": "The member roster of a selected clan", + "tags": ["Clan", "Player"], + "baseDataSourceName": "httpRequestScopedSingle", + "config": { + "httpMethod": "get", + "endpointPath": "api.worldoftanks.{{dataSource.realm}}/wgn/clans/info/", + "getArgs": [ + { "key": "clan_id", "value": "{{object.rawId}}" }, + { + "key": "fields", + "value": "clan_id,members_count,members.account_id,members.account_name,members.role,members.joined_at" + } + ], + "errorHandling": { "type": "path", "realm": "payload", "path": "error.message" }, + "postRequestScript": "clanMembers.js" + }, + "matches": { "sourceType": { "type": "oneOf", "values": ["Clan"] } }, + "metadata": [ + { "name": "memberName", "displayName": "Member Name", "shape": "string", "role": "label" }, + { "name": "role", "displayName": "Role", "shape": "string" }, + { "name": "joined", "displayName": "Joined", "shape": "date" }, + { "name": "accountId", "displayName": "Account ID", "shape": "string", "visible": false } + ], + "timeframes": false +} diff --git a/plugins/Wargaming.net/v1/dataStreams/clanSummary.json b/plugins/Wargaming.net/v1/dataStreams/clanSummary.json new file mode 100644 index 0000000..f1701bc --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/clanSummary.json @@ -0,0 +1,31 @@ +{ + "name": "clanSummary", + "displayName": "Clan Summary", + "description": "Current details for the selected clans", + "tags": ["Clan"], + "baseDataSourceName": "httpRequestScoped", + "config": { + "httpMethod": "get", + "endpointPath": "api.worldoftanks.{{dataSource.realm}}/wgn/clans/info/", + "getArgs": [ + { "key": "clan_id", "value": "{{objects.map(o => o.rawId).join(',')}}" }, + { + "key": "fields", + "value": "clan_id,name,tag,members_count,motto,leader_name,created_at,description" + } + ], + "errorHandling": { "type": "path", "realm": "payload", "path": "error.message" }, + "postRequestScript": "clanSummary.js" + }, + "matches": { "sourceType": { "type": "oneOf", "values": ["Clan"] } }, + "metadata": [ + { "name": "name", "displayName": "Name", "shape": "string", "role": "label" }, + { "name": "tag", "displayName": "Tag", "shape": "string" }, + { "name": "membersCount", "displayName": "Members", "shape": "number" }, + { "name": "leaderName", "displayName": "Leader", "shape": "string" }, + { "name": "motto", "displayName": "Motto", "shape": "string" }, + { "name": "created", "displayName": "Created", "shape": "date" }, + { "name": "description", "displayName": "Description", "shape": "string", "visible": false } + ], + "timeframes": false +} diff --git a/plugins/Wargaming.net/v1/dataStreams/encyclopediaInfo.json b/plugins/Wargaming.net/v1/dataStreams/encyclopediaInfo.json new file mode 100644 index 0000000..50e0893 --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/encyclopediaInfo.json @@ -0,0 +1,27 @@ +{ + "name": "encyclopediaInfo", + "displayName": "Encyclopedia Info", + "description": "World of Tanks game metadata such as the current game version", + "tags": ["Encyclopedia"], + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "endpointPath": "api.worldoftanks.{{dataSource.realm}}/wot/encyclopedia/info/", + "pathToData": "data", + "errorHandling": { + "type": "script", + "script": "result = (data && data.status === 'error') ? (data.error && data.error.message) : undefined;" + } + }, + "matches": "none", + "visibility": { "type": "hidden" }, + "metadata": [ + { + "name": "game_version", + "displayName": "Game Version", + "shape": "string" + }, + { "pattern": ".*" } + ], + "timeframes": false +} diff --git a/plugins/Wargaming.net/v1/dataStreams/encyclopediaVehicles.json b/plugins/Wargaming.net/v1/dataStreams/encyclopediaVehicles.json new file mode 100644 index 0000000..fc0c4fa --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/encyclopediaVehicles.json @@ -0,0 +1,25 @@ +{ + "name": "encyclopediaVehicles", + "displayName": "Encyclopedia Vehicles", + "description": "Every vehicle in the World of Tanks encyclopedia with tier, nation and type", + "tags": ["Encyclopedia", "Vehicle"], + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "endpointPath": "api.worldoftanks.{{dataSource.realm}}/wot/encyclopedia/vehicles/", + "getArgs": [ + { "key": "fields", "value": "tank_id,name,tier,nation,type,is_premium" } + ], + "postRequestScript": "encyclopediaVehicles.js" + }, + "matches": "none", + "metadata": [ + { "name": "tank_id", "displayName": "Tank ID", "shape": "string", "visible": false }, + { "name": "name", "displayName": "Name", "shape": "string", "role": "label" }, + { "name": "tier", "displayName": "Tier", "shape": "number" }, + { "name": "nation", "displayName": "Nation", "shape": "string" }, + { "name": "type", "displayName": "Type", "shape": "string" }, + { "name": "is_premium", "displayName": "Premium", "shape": "boolean" } + ], + "timeframes": false +} diff --git a/plugins/Wargaming.net/v1/dataStreams/planesEncyclopedia.json b/plugins/Wargaming.net/v1/dataStreams/planesEncyclopedia.json new file mode 100644 index 0000000..16015d2 --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/planesEncyclopedia.json @@ -0,0 +1,25 @@ +{ + "name": "planesEncyclopedia", + "displayName": "Encyclopedia Aircraft", + "description": "Every aircraft in the World of Warplanes encyclopedia with level, nation and type", + "tags": ["Encyclopedia", "Aircraft"], + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "endpointPath": "api.worldofwarplanes.{{dataSource.realm}}/wowp/encyclopedia/planes/", + "getArgs": [ + { "key": "fields", "value": "plane_id,name,level,nation,type" } + ], + "postRequestScript": "planesEncyclopedia.js", + "errorHandling": { "type": "path", "realm": "payload", "path": "error.message" } + }, + "matches": "none", + "metadata": [ + { "name": "plane_id", "displayName": "Plane ID", "shape": "string", "visible": false }, + { "name": "name", "displayName": "Name", "shape": "string", "role": "label" }, + { "name": "level", "displayName": "Level", "shape": "number" }, + { "name": "nation", "displayName": "Nation", "shape": "string" }, + { "name": "type", "displayName": "Type", "shape": "string" } + ], + "timeframes": false +} diff --git a/plugins/Wargaming.net/v1/dataStreams/playerSearch.json b/plugins/Wargaming.net/v1/dataStreams/playerSearch.json new file mode 100644 index 0000000..3a161d3 --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/playerSearch.json @@ -0,0 +1,34 @@ +{ + "name": "playerSearch", + "displayName": "Player Search", + "description": "Search for player account IDs by nickname", + "tags": ["Player"], + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "endpointPath": "api.worldoftanks.{{dataSource.realm}}/wot/account/list/", + "getArgs": [ + { "key": "search", "value": "{{search}}" }, + { "key": "type", "value": "startswith" }, + { "key": "limit", "value": "100" }, + { "key": "fields", "value": "account_id,nickname" } + ], + "pathToData": "data", + "errorHandling": { "type": "path", "realm": "payload", "path": "error.message" } + }, + "matches": "none", + "ui": [ + { + "type": "text", + "name": "search", + "label": "Nickname", + "placeholder": "Start of a player nickname" + } + ], + "manualConfigApply": true, + "metadata": [ + { "name": "nickname", "displayName": "Nickname", "shape": "string", "role": "label" }, + { "name": "account_id", "displayName": "Account ID", "shape": "string", "role": "value" } + ], + "timeframes": false +} diff --git a/plugins/Wargaming.net/v1/dataStreams/playerShipStats.json b/plugins/Wargaming.net/v1/dataStreams/playerShipStats.json new file mode 100644 index 0000000..5cd8e92 --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/playerShipStats.json @@ -0,0 +1,30 @@ +{ + "name": "playerShipStats", + "displayName": "Player Ship Stats", + "description": "Per-ship battle statistics for a selected player", + "tags": ["Player", "Ship"], + "baseDataSourceName": "httpRequestScopedSingle", + "config": { + "httpMethod": "get", + "endpointPath": "api.worldofwarships.{{dataSource.realm}}/wows/ships/stats/", + "getArgs": [ + { "key": "account_id", "value": "{{object.rawId}}" }, + { + "key": "fields", + "value": "ship_id,pvp.battles,pvp.wins,pvp.damage_dealt,pvp.frags,last_battle_time" + } + ], + "errorHandling": { "type": "path", "realm": "payload", "path": "error.message" }, + "postRequestScript": "playerShipStats.js" + }, + "matches": { "sourceType": { "type": "oneOf", "values": ["Player"] } }, + "metadata": [ + { "name": "shipId", "displayName": "Ship ID", "shape": "string", "visible": false }, + { "name": "ship", "sourceId": "shipId", "sourceType": "WoWs Ship", "objectPropertyPath": "name", "role": "label" }, + { "name": "battles", "displayName": "Battles", "shape": "number" }, + { "name": "winRate", "displayName": "Win Rate", "shape": ["percent", { "decimalPlaces": 1 }] }, + { "name": "avgDamage", "displayName": "Avg. Damage", "shape": ["number", { "decimalPlaces": 0 }] }, + { "name": "frags", "displayName": "Frags", "shape": "number" } + ], + "timeframes": false +} diff --git a/plugins/Wargaming.net/v1/dataStreams/playerSummary.json b/plugins/Wargaming.net/v1/dataStreams/playerSummary.json new file mode 100644 index 0000000..3d11fe8 --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/playerSummary.json @@ -0,0 +1,35 @@ +{ + "name": "playerSummary", + "displayName": "Player Summary", + "description": "Current all-time statistics for the selected players", + "tags": ["Player"], + "baseDataSourceName": "httpRequestScoped", + "config": { + "httpMethod": "get", + "endpointPath": "api.worldoftanks.{{dataSource.realm}}/wot/account/info/", + "getArgs": [ + { "key": "account_id", "value": "{{objects.map(o => o.rawId).join(',')}}" }, + { + "key": "fields", + "value": "account_id,nickname,global_rating,last_battle_time,created_at,clan_id,statistics.all.battles,statistics.all.wins,statistics.all.damage_dealt,statistics.all.xp,statistics.all.survived_battles,statistics.all.frags,statistics.all.spotted" + } + ], + "errorHandling": { "type": "path", "realm": "payload", "path": "error.message" }, + "postRequestScript": "playerSummary.js" + }, + "matches": { "sourceType": { "type": "oneOf", "values": ["Player"] } }, + "metadata": [ + { "name": "nickname", "displayName": "Nickname", "shape": "string", "role": "label" }, + { "name": "battles", "displayName": "Battles", "shape": "number" }, + { "name": "winRate", "displayName": "Win Rate", "shape": ["percent", { "decimalPlaces": 1 }] }, + { "name": "avgDamage", "displayName": "Avg. Damage", "shape": ["number", { "decimalPlaces": 0 }] }, + { "name": "avgXp", "displayName": "Avg. XP", "shape": ["number", { "decimalPlaces": 0 }] }, + { "name": "survivalRate", "displayName": "Survival Rate", "shape": ["percent", { "decimalPlaces": 1 }] }, + { "name": "globalRating", "displayName": "Global Rating", "shape": "number" }, + { "name": "frags", "displayName": "Frags", "shape": "number" }, + { "name": "spotted", "displayName": "Spotted", "shape": "number" }, + { "name": "lastBattle", "displayName": "Last Battle", "shape": "date" }, + { "name": "clanId", "displayName": "Clan ID", "shape": "string", "visible": false } + ], + "timeframes": false +} diff --git a/plugins/Wargaming.net/v1/dataStreams/playerVehicleStats.json b/plugins/Wargaming.net/v1/dataStreams/playerVehicleStats.json new file mode 100644 index 0000000..7947a66 --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/playerVehicleStats.json @@ -0,0 +1,32 @@ +{ + "name": "playerVehicleStats", + "displayName": "Player Vehicle Stats", + "description": "Per-vehicle battle statistics for a selected player", + "tags": ["Player", "Vehicle"], + "baseDataSourceName": "httpRequestScopedSingle", + "config": { + "httpMethod": "get", + "endpointPath": "api.worldoftanks.{{dataSource.realm}}/wot/tanks/stats/", + "getArgs": [ + { "key": "account_id", "value": "{{object.rawId}}" }, + { + "key": "fields", + "value": "tank_id,mark_of_mastery,all.battles,all.wins,all.damage_dealt,all.spotted,all.frags" + } + ], + "errorHandling": { "type": "path", "realm": "payload", "path": "error.message" }, + "postRequestScript": "playerVehicleStats.js" + }, + "matches": { "sourceType": { "type": "oneOf", "values": ["Player"] } }, + "metadata": [ + { "name": "tankId", "displayName": "Tank ID", "shape": "string", "visible": false }, + { "name": "vehicle", "sourceId": "tankId", "sourceType": "WoT Vehicle", "objectPropertyPath": "name", "role": "label" }, + { "name": "battles", "displayName": "Battles", "shape": "number" }, + { "name": "winRate", "displayName": "Win Rate", "shape": ["percent", { "decimalPlaces": 1 }] }, + { "name": "avgDamage", "displayName": "Avg. Damage", "shape": ["number", { "decimalPlaces": 0 }] }, + { "name": "frags", "displayName": "Frags", "shape": "number" }, + { "name": "spotted", "displayName": "Spotted", "shape": "number" }, + { "name": "markOfMastery", "displayName": "Mark of Mastery", "shape": "number" } + ], + "timeframes": false +} diff --git a/plugins/Wargaming.net/v1/dataStreams/playerWarplanesSummary.json b/plugins/Wargaming.net/v1/dataStreams/playerWarplanesSummary.json new file mode 100644 index 0000000..553c901 --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/playerWarplanesSummary.json @@ -0,0 +1,33 @@ +{ + "name": "playerWarplanesSummary", + "displayName": "Player Warplanes Summary", + "description": "Current World of Warplanes statistics for the selected players", + "tags": ["Player", "Aircraft"], + "baseDataSourceName": "httpRequestScoped", + "config": { + "httpMethod": "get", + "endpointPath": "api.worldofwarplanes.{{dataSource.realm}}/wowp/account/info/", + "getArgs": [ + { "key": "account_id", "value": "{{objects.map(o => o.rawId).join(',')}}" }, + { + "key": "fields", + "value": "account_id,nickname,last_battle_time,global_rating,statistics.battles,statistics.wins,statistics.losses,statistics.survived_battles,statistics.xp,statistics.damage_dealt.total,statistics.frags.total" + } + ], + "errorHandling": { "type": "path", "realm": "payload", "path": "error.message" }, + "postRequestScript": "playerWarplanesSummary.js" + }, + "matches": { "sourceType": { "type": "oneOf", "values": ["Player"] } }, + "metadata": [ + { "name": "nickname", "displayName": "Nickname", "shape": "string", "role": "label" }, + { "name": "battles", "displayName": "Battles", "shape": "number" }, + { "name": "winRate", "displayName": "Win Rate", "shape": ["percent", { "decimalPlaces": 1 }] }, + { "name": "avgDamage", "displayName": "Avg. Damage", "shape": ["number", { "decimalPlaces": 0 }] }, + { "name": "avgXp", "displayName": "Avg. XP", "shape": ["number", { "decimalPlaces": 0 }] }, + { "name": "survivalRate", "displayName": "Survival Rate", "shape": ["percent", { "decimalPlaces": 1 }] }, + { "name": "globalRating", "displayName": "Global Rating", "shape": "number" }, + { "name": "frags", "displayName": "Frags", "shape": "number" }, + { "name": "lastBattle", "displayName": "Last Battle", "shape": "date" } + ], + "timeframes": false +} diff --git a/plugins/Wargaming.net/v1/dataStreams/playerWarshipsSummary.json b/plugins/Wargaming.net/v1/dataStreams/playerWarshipsSummary.json new file mode 100644 index 0000000..05a1e02 --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/playerWarshipsSummary.json @@ -0,0 +1,31 @@ +{ + "name": "playerWarshipsSummary", + "displayName": "Player Warships Summary", + "description": "Current World of Warships statistics for the selected players", + "tags": ["Player", "Ship"], + "baseDataSourceName": "httpRequestScoped", + "config": { + "httpMethod": "get", + "endpointPath": "api.worldofwarships.{{dataSource.realm}}/wows/account/info/", + "getArgs": [ + { "key": "account_id", "value": "{{objects.map(o => o.rawId).join(',')}}" }, + { + "key": "fields", + "value": "account_id,nickname,last_battle_time,statistics.pvp.battles,statistics.pvp.wins,statistics.pvp.damage_dealt,statistics.pvp.frags,statistics.pvp.xp,statistics.pvp.survived_battles" + } + ], + "errorHandling": { "type": "path", "realm": "payload", "path": "error.message" }, + "postRequestScript": "playerWarshipsSummary.js" + }, + "matches": { "sourceType": { "type": "oneOf", "values": ["Player"] } }, + "metadata": [ + { "name": "nickname", "displayName": "Nickname", "shape": "string", "role": "label" }, + { "name": "battles", "displayName": "Battles", "shape": "number" }, + { "name": "winRate", "displayName": "Win Rate", "shape": ["percent", { "decimalPlaces": 1 }] }, + { "name": "avgDamage", "displayName": "Avg. Damage", "shape": ["number", { "decimalPlaces": 0 }] }, + { "name": "survivalRate", "displayName": "Survival Rate", "shape": ["percent", { "decimalPlaces": 1 }] }, + { "name": "frags", "displayName": "Frags", "shape": "number" }, + { "name": "lastBattle", "displayName": "Last Battle", "shape": "date" } + ], + "timeframes": false +} diff --git a/plugins/Wargaming.net/v1/dataStreams/scripts/accountInfo.js b/plugins/Wargaming.net/v1/dataStreams/scripts/accountInfo.js new file mode 100644 index 0000000..277cd6c --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/scripts/accountInfo.js @@ -0,0 +1,2 @@ +// account/info returns `data` as an object keyed by account_id; invalid ids come back null +result = Object.values(data.data || {}).filter(Boolean); diff --git a/plugins/Wargaming.net/v1/dataStreams/scripts/clanInfo.js b/plugins/Wargaming.net/v1/dataStreams/scripts/clanInfo.js new file mode 100644 index 0000000..63d8bb2 --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/scripts/clanInfo.js @@ -0,0 +1,8 @@ +// wgn/clans/info returns `data` as an object keyed by clan_id; invalid ids come back null +result = Object.values(data.data || {}) + .filter(Boolean) + .map((clan) => ({ + ...clan, + // created_at is Unix epoch seconds; convert to ISO so the "date" shape parses it + created_at: clan.created_at ? new Date(clan.created_at * 1000).toISOString() : null + })); diff --git a/plugins/Wargaming.net/v1/dataStreams/scripts/clanMembers.js b/plugins/Wargaming.net/v1/dataStreams/scripts/clanMembers.js new file mode 100644 index 0000000..5ca6d58 --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/scripts/clanMembers.js @@ -0,0 +1,10 @@ +// wgn/clans/info returns `data` as an object keyed by clan_id; the single requested +// clan's `members` is an array of { account_id, account_name, role, joined_at } +const clan = Object.values(data.data || {})[0]; +result = ((clan && clan.members) || []).map((m) => ({ + accountId: String(m.account_id), + memberName: m.account_name, + role: m.role, + // joined_at is Unix epoch seconds; convert to ISO so the "date" shape parses it + joined: m.joined_at ? new Date(m.joined_at * 1000).toISOString() : null +})); diff --git a/plugins/Wargaming.net/v1/dataStreams/scripts/clanSummary.js b/plugins/Wargaming.net/v1/dataStreams/scripts/clanSummary.js new file mode 100644 index 0000000..a83965b --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/scripts/clanSummary.js @@ -0,0 +1,13 @@ +// wgn/clans/info returns `data` as an object keyed by clan_id; invalid ids come back null +result = Object.values(data.data || {}) + .filter(Boolean) + .map((clan) => ({ + name: clan.name, + tag: clan.tag, + membersCount: clan.members_count, + leaderName: clan.leader_name, + motto: clan.motto, + // created_at is Unix epoch seconds; convert to ISO so the "date" shape parses it + created: clan.created_at ? new Date(clan.created_at * 1000).toISOString() : null, + description: clan.description + })); diff --git a/plugins/Wargaming.net/v1/dataStreams/scripts/encyclopediaVehicles.js b/plugins/Wargaming.net/v1/dataStreams/scripts/encyclopediaVehicles.js new file mode 100644 index 0000000..299f2d0 --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/scripts/encyclopediaVehicles.js @@ -0,0 +1,2 @@ +// encyclopedia/vehicles returns `data` as an object keyed by tank_id — turn it into one row per vehicle +result = Object.values(data.data || {}).filter(Boolean); diff --git a/plugins/Wargaming.net/v1/dataStreams/scripts/planesEncyclopedia.js b/plugins/Wargaming.net/v1/dataStreams/scripts/planesEncyclopedia.js new file mode 100644 index 0000000..4151865 --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/scripts/planesEncyclopedia.js @@ -0,0 +1,2 @@ +// wowp/encyclopedia/planes returns `data` as an object keyed by plane_id — flatten to rows +result = Object.values(data.data || {}).filter(Boolean); diff --git a/plugins/Wargaming.net/v1/dataStreams/scripts/playerShipStats.js b/plugins/Wargaming.net/v1/dataStreams/scripts/playerShipStats.js new file mode 100644 index 0000000..88e90da --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/scripts/playerShipStats.js @@ -0,0 +1,14 @@ +// wows/ships/stats returns `data` keyed by account_id, value is an array of per-ship objects +const arr = Object.values(data.data || {})[0] || []; + +result = arr.map((s) => { + const p = s.pvp || {}; + const battles = p.battles || 0; + return { + shipId: String(s.ship_id), + battles, + winRate: battles ? (p.wins / battles) * 100 : 0, + avgDamage: battles ? p.damage_dealt / battles : 0, + frags: p.frags || 0 + }; +}); diff --git a/plugins/Wargaming.net/v1/dataStreams/scripts/playerSummary.js b/plugins/Wargaming.net/v1/dataStreams/scripts/playerSummary.js new file mode 100644 index 0000000..3d984b5 --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/scripts/playerSummary.js @@ -0,0 +1,21 @@ +// account/info returns `data` as an object keyed by account_id; invalid ids come back null +const players = Object.values(data.data || {}).filter(Boolean); + +result = players.map((p) => { + const stats = (p.statistics && p.statistics.all) || {}; + const battles = stats.battles || 0; + + return { + nickname: p.nickname, + battles: battles, + winRate: battles ? (stats.wins / battles) * 100 : 0, + avgDamage: battles ? stats.damage_dealt / battles : 0, + avgXp: battles ? stats.xp / battles : 0, + survivalRate: battles ? (stats.survived_battles / battles) * 100 : 0, + globalRating: p.global_rating, + frags: stats.frags || 0, + spotted: stats.spotted || 0, + lastBattle: p.last_battle_time ? new Date(p.last_battle_time * 1000).toISOString() : null, + clanId: p.clan_id != null ? String(p.clan_id) : null + }; +}); diff --git a/plugins/Wargaming.net/v1/dataStreams/scripts/playerVehicleStats.js b/plugins/Wargaming.net/v1/dataStreams/scripts/playerVehicleStats.js new file mode 100644 index 0000000..2a57e04 --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/scripts/playerVehicleStats.js @@ -0,0 +1,17 @@ +// tanks/stats returns `data` keyed by account_id, value is an array of per-tank objects +const arr = Object.values(data.data || {})[0] || []; + +result = arr.map((t) => { + const s = t.all || {}; + const battles = s.battles || 0; + return { + tankId: String(t.tank_id), + battles, + wins: s.wins || 0, + winRate: battles ? (s.wins / battles) * 100 : 0, + avgDamage: battles ? s.damage_dealt / battles : 0, + frags: s.frags || 0, + spotted: s.spotted || 0, + markOfMastery: t.mark_of_mastery || 0 + }; +}); diff --git a/plugins/Wargaming.net/v1/dataStreams/scripts/playerWarplanesSummary.js b/plugins/Wargaming.net/v1/dataStreams/scripts/playerWarplanesSummary.js new file mode 100644 index 0000000..c126a84 --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/scripts/playerWarplanesSummary.js @@ -0,0 +1,21 @@ +// account/info returns `data` as an object keyed by account_id; invalid ids come back null +const players = Object.values(data.data || {}).filter(Boolean); + +result = players.map((p) => { + const stats = p.statistics || {}; + const battles = stats.battles || 0; + const damageDealt = (stats.damage_dealt && stats.damage_dealt.total) || 0; + const frags = (stats.frags && stats.frags.total) || 0; + + return { + nickname: p.nickname, + battles: battles, + winRate: battles ? (stats.wins / battles) * 100 : 0, + avgDamage: battles ? damageDealt / battles : 0, + avgXp: battles ? stats.xp / battles : 0, + survivalRate: battles ? (stats.survived_battles / battles) * 100 : 0, + globalRating: p.global_rating || 0, + frags: frags, + lastBattle: p.last_battle_time ? new Date(p.last_battle_time * 1000).toISOString() : null + }; +}); diff --git a/plugins/Wargaming.net/v1/dataStreams/scripts/playerWarshipsSummary.js b/plugins/Wargaming.net/v1/dataStreams/scripts/playerWarshipsSummary.js new file mode 100644 index 0000000..aa55863 --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/scripts/playerWarshipsSummary.js @@ -0,0 +1,17 @@ +// account/info returns `data` as an object keyed by account_id; invalid ids come back null +const players = Object.values(data.data || {}).filter(Boolean); + +result = players.map((p) => { + const stats = (p.statistics && p.statistics.pvp) || {}; + const battles = stats.battles || 0; + + return { + nickname: p.nickname, + battles: battles, + winRate: battles ? (stats.wins / battles) * 100 : 0, + avgDamage: battles ? stats.damage_dealt / battles : 0, + survivalRate: battles ? (stats.survived_battles / battles) * 100 : 0, + frags: stats.frags || 0, + lastBattle: p.last_battle_time ? new Date(p.last_battle_time * 1000).toISOString() : null + }; +}); diff --git a/plugins/Wargaming.net/v1/dataStreams/scripts/shipsEncyclopedia.js b/plugins/Wargaming.net/v1/dataStreams/scripts/shipsEncyclopedia.js new file mode 100644 index 0000000..b7925a2 --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/scripts/shipsEncyclopedia.js @@ -0,0 +1,2 @@ +// wows/encyclopedia/ships returns `data` as an object keyed by ship_id — flatten to rows +result = Object.values(data.data || {}).filter(Boolean); diff --git a/plugins/Wargaming.net/v1/dataStreams/shipsEncyclopedia.json b/plugins/Wargaming.net/v1/dataStreams/shipsEncyclopedia.json new file mode 100644 index 0000000..99f2159 --- /dev/null +++ b/plugins/Wargaming.net/v1/dataStreams/shipsEncyclopedia.json @@ -0,0 +1,32 @@ +{ + "name": "shipsEncyclopedia", + "displayName": "Encyclopedia Ships", + "description": "Every ship in the World of Warships encyclopedia with tier, nation and type", + "tags": ["Encyclopedia", "Ship"], + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "endpointPath": "api.worldofwarships.{{dataSource.realm}}/wows/encyclopedia/ships/", + "getArgs": [ + { "key": "fields", "value": "ship_id,name,tier,nation,type,is_premium" }, + { "key": "limit", "value": "100" }, + { "key": "page_no", "value": "{{page || 1}}" } + ], + "postRequestScript": "shipsEncyclopedia.js", + "errorHandling": { "type": "path", "realm": "payload", "path": "error.message" } + }, + "matches": "none", + "visibility": { "type": "hidden" }, + "ui": [ + { "type": "text", "name": "page", "label": "Page", "defaultValue": "1" } + ], + "metadata": [ + { "name": "ship_id", "displayName": "Ship ID", "shape": "string", "visible": false }, + { "name": "name", "displayName": "Name", "shape": "string", "role": "label" }, + { "name": "tier", "displayName": "Tier", "shape": "number" }, + { "name": "nation", "displayName": "Nation", "shape": "string" }, + { "name": "type", "displayName": "Type", "shape": "string" }, + { "name": "is_premium", "displayName": "Premium", "shape": "boolean" } + ], + "timeframes": false +} diff --git a/plugins/Wargaming.net/v1/defaultContent/aircraft.dash.json b/plugins/Wargaming.net/v1/defaultContent/aircraft.dash.json new file mode 100644 index 0000000..100a8cf --- /dev/null +++ b/plugins/Wargaming.net/v1/defaultContent/aircraft.dash.json @@ -0,0 +1,54 @@ +{ + "name": "Aircraft", + "schemaVersion": "1.5", + "variables": ["{{variables.[WoWp Aircraft]}}"], + "dashboard": { + "_type": "layout/grid", + "columns": 4, + "version": 1, + "contents": [ + { + "i": "a094feff-73be-4210-b752-d9568f3d02da", + "x": 0, + "y": 0, + "w": 4, + "h": 4, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Aircraft Details", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "variables": ["{{variables.[WoWp Aircraft]}}"], + "scope": { + "scope": "{{scopes.[WoWp Aircraft]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[WoWp Aircraft]}}" + }, + "dataStream": { + "id": "datastream-properties", + "name": "properties" + }, + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "transpose": true, + "hiddenColumns": [ + "id", + "link", + "links", + "sourceId", + "sourceType" + ] + } + } + } + } + } + ] + } +} diff --git a/plugins/Wargaming.net/v1/defaultContent/clan.dash.json b/plugins/Wargaming.net/v1/defaultContent/clan.dash.json new file mode 100644 index 0000000..a1e4535 --- /dev/null +++ b/plugins/Wargaming.net/v1/defaultContent/clan.dash.json @@ -0,0 +1,96 @@ +{ + "name": "Clan", + "schemaVersion": "1.5", + "variables": ["{{variables.[Clan]}}"], + "dashboard": { + "_type": "layout/grid", + "columns": 4, + "version": 1, + "contents": [ + { + "i": "31c41a08-2453-4d66-8900-f9a243bad4e3", + "x": 0, + "y": 0, + "w": 2, + "h": 5, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Clan Details", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "variables": ["{{variables.[Clan]}}"], + "scope": { + "scope": "{{scopes.[Clans]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[Clan]}}" + }, + "dataStream": { + "id": "{{dataStreams.clanSummary}}", + "name": "clanSummary", + "pluginConfigId": "{{configId}}" + }, + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "transpose": true, + "columnOrder": [ + "name", + "tag", + "membersCount", + "leaderName", + "motto", + "created" + ], + "hiddenColumns": ["description"] + } + } + } + } + }, + { + "i": "c379379d-5250-4483-a72e-2a3b316624a5", + "x": 2, + "y": 0, + "w": 2, + "h": 5, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Clan Members", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "variables": ["{{variables.[Clan]}}"], + "scope": { + "scope": "{{scopes.[Clans]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[Clan]}}" + }, + "dataStream": { + "id": "{{dataStreams.clanMembers}}", + "name": "clanMembers", + "pluginConfigId": "{{configId}}", + "sort": { "by": [["joined", "desc"]] } + }, + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "transpose": false, + "columnOrder": ["memberName", "role", "joined"], + "hiddenColumns": ["accountId"] + } + } + } + } + } + ] + } +} diff --git a/plugins/Wargaming.net/v1/defaultContent/manifest.json b/plugins/Wargaming.net/v1/defaultContent/manifest.json new file mode 100644 index 0000000..ba53671 --- /dev/null +++ b/plugins/Wargaming.net/v1/defaultContent/manifest.json @@ -0,0 +1,10 @@ +{ + "items": [ + { "name": "overview", "type": "dashboard" }, + { "name": "player", "type": "dashboard" }, + { "name": "clan", "type": "dashboard" }, + { "name": "vehicle", "type": "dashboard" }, + { "name": "ship", "type": "dashboard" }, + { "name": "aircraft", "type": "dashboard" } + ] +} diff --git a/plugins/Wargaming.net/v1/defaultContent/overview.dash.json b/plugins/Wargaming.net/v1/defaultContent/overview.dash.json new file mode 100644 index 0000000..498be2e --- /dev/null +++ b/plugins/Wargaming.net/v1/defaultContent/overview.dash.json @@ -0,0 +1,324 @@ +{ + "name": "Overview", + "schemaVersion": "1.5", + "dashboard": { + "_type": "layout/grid", + "columns": 4, + "version": 1, + "contents": [ + { + "i": "505afb30-2c31-41ea-be35-e54ea60482cd", + "x": 0, + "y": 0, + "w": 2, + "h": 4, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Vehicles by Tier", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "dataStream": { + "id": "{{dataStreams.encyclopediaVehicles}}", + "name": "encyclopediaVehicles", + "pluginConfigId": "{{configId}}", + "group": { + "by": [["tier", "uniqueValues"]], + "aggregate": [{ "type": "count" }] + }, + "sort": { "by": [["tier_uniqueValues", "asc"]] } + }, + "visualisation": { + "type": "data-stream-bar-chart", + "config": { + "data-stream-bar-chart": { + "xAxisData": "tier_uniqueValues", + "yAxisData": ["count"], + "xAxisGroup": "none", + "xAxisLabel": "Tier", + "yAxisLabel": "Vehicles", + "showXAxisLabel": true, + "showYAxisLabel": true, + "showLegend": false, + "legendPosition": "bottom", + "showGrid": true, + "horizontalLayout": "vertical", + "displayMode": "actual", + "showTotals": false, + "showValue": false, + "grouping": false, + "range": { "type": "auto" } + } + } + } + } + }, + { + "i": "697008a3-5b12-4a47-be88-6b47417b56a0", + "x": 2, + "y": 0, + "w": 1, + "h": 4, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Vehicles by Nation", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "dataStream": { + "id": "{{dataStreams.encyclopediaVehicles}}", + "name": "encyclopediaVehicles", + "pluginConfigId": "{{configId}}", + "group": { + "by": [["nation", "uniqueValues"]], + "aggregate": [{ "type": "count" }] + } + }, + "visualisation": { + "type": "data-stream-donut-chart", + "config": { + "data-stream-donut-chart": { + "valueColumn": "count", + "labelColumn": "nation_uniqueValues", + "hideCenterValue": false, + "showValuesAsPercentage": false, + "legendPosition": "right", + "legendMode": "table" + } + } + } + } + }, + { + "i": "5594786a-ebb2-40d1-a2ac-bb0dc68b5722", + "x": 3, + "y": 0, + "w": 1, + "h": 4, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Vehicles by Type", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "dataStream": { + "id": "{{dataStreams.encyclopediaVehicles}}", + "name": "encyclopediaVehicles", + "pluginConfigId": "{{configId}}", + "group": { + "by": [["type", "uniqueValues"]], + "aggregate": [{ "type": "count" }] + } + }, + "visualisation": { + "type": "data-stream-donut-chart", + "config": { + "data-stream-donut-chart": { + "valueColumn": "count", + "labelColumn": "type_uniqueValues", + "hideCenterValue": false, + "showValuesAsPercentage": false, + "legendPosition": "right", + "legendMode": "table" + } + } + } + } + }, + { + "i": "405cf8fb-1a5e-48a7-af63-e6d5fd52cb6c", + "x": 0, + "y": 4, + "w": 2, + "h": 5, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Tracked Players", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "dataStream": { + "id": "{{dataStreams.playerSummary}}", + "name": "playerSummary", + "pluginConfigId": "{{configId}}", + "sort": { "by": [["battles", "desc"]] } + }, + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "transpose": false, + "columnOrder": [ + "nickname", + "battles", + "winRate", + "avgDamage", + "globalRating" + ], + "hiddenColumns": [ + "avgXp", + "survivalRate", + "frags", + "spotted", + "lastBattle", + "clanId" + ] + } + } + } + } + }, + { + "i": "f3091f83-0c47-4234-b624-6b2598740776", + "x": 2, + "y": 4, + "w": 2, + "h": 5, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Tracked Clans", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "dataStream": { + "id": "{{dataStreams.clanSummary}}", + "name": "clanSummary", + "pluginConfigId": "{{configId}}", + "sort": { "by": [["membersCount", "desc"]] } + }, + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "transpose": false, + "columnOrder": [ + "name", + "tag", + "membersCount", + "leaderName" + ], + "hiddenColumns": ["motto", "created", "description"] + } + } + } + } + }, + { + "i": "2e6b3f33-d068-4031-845e-0869aae2b0dc", + "x": 0, + "y": 9, + "w": 4, + "h": 1, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/text", + "title": "", + "description": "", + "visualisation": { + "config": { + "content": "World of Warplanes", + "fontSize": 16, + "align": "center", + "autoSize": true + } + } + } + }, + { + "i": "41e4370e-d8ef-4c2d-9b69-bf379da0a40b", + "x": 0, + "y": 10, + "w": 2, + "h": 4, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Aircraft by Nation", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "dataStream": { + "id": "{{dataStreams.planesEncyclopedia}}", + "name": "planesEncyclopedia", + "pluginConfigId": "{{configId}}", + "group": { + "by": [["nation", "uniqueValues"]], + "aggregate": [{ "type": "count" }] + } + }, + "visualisation": { + "type": "data-stream-donut-chart", + "config": { + "data-stream-donut-chart": { + "valueColumn": "count", + "labelColumn": "nation_uniqueValues", + "hideCenterValue": false, + "showValuesAsPercentage": false, + "legendPosition": "right", + "legendMode": "table" + } + } + } + } + }, + { + "i": "2c4326f7-1321-4d05-93d7-91d4d018e99f", + "x": 2, + "y": 10, + "w": 2, + "h": 4, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Aircraft by Type", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "dataStream": { + "id": "{{dataStreams.planesEncyclopedia}}", + "name": "planesEncyclopedia", + "pluginConfigId": "{{configId}}", + "group": { + "by": [["type", "uniqueValues"]], + "aggregate": [{ "type": "count" }] + } + }, + "visualisation": { + "type": "data-stream-donut-chart", + "config": { + "data-stream-donut-chart": { + "valueColumn": "count", + "labelColumn": "type_uniqueValues", + "hideCenterValue": false, + "showValuesAsPercentage": false, + "legendPosition": "right", + "legendMode": "table" + } + } + } + } + } + ] + } +} diff --git a/plugins/Wargaming.net/v1/defaultContent/player.dash.json b/plugins/Wargaming.net/v1/defaultContent/player.dash.json new file mode 100644 index 0000000..9cfbd27 --- /dev/null +++ b/plugins/Wargaming.net/v1/defaultContent/player.dash.json @@ -0,0 +1,593 @@ +{ + "name": "Player", + "schemaVersion": "1.5", + "variables": ["{{variables.[Player]}}"], + "dashboard": { + "_type": "layout/grid", + "columns": 4, + "version": 1, + "contents": [ + { + "i": "bba12d1b-0244-4083-8a4a-c77d462e67d9", + "x": 0, + "y": 0, + "w": 4, + "h": 1, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/text", + "title": "", + "description": "", + "visualisation": { + "config": { + "content": "World of Tanks", + "fontSize": 16, + "align": "center", + "autoSize": true + } + } + } + }, + { + "i": "aafbc8dc-db02-4792-b9f5-0d8bea9a7ef3", + "x": 0, + "y": 1, + "w": 1, + "h": 2, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Win Rate", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "variables": ["{{variables.[Player]}}"], + "scope": { + "scope": "{{scopes.[Players]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[Player]}}" + }, + "dataStream": { + "id": "{{dataStreams.playerSummary}}", + "name": "playerSummary", + "pluginConfigId": "{{configId}}" + }, + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "winRate", + "comparisonColumn": "none", + "label": "Win Rate" + } + } + } + } + }, + { + "i": "606fdfa9-ea68-4ec7-8499-b4dd129fd982", + "x": 1, + "y": 1, + "w": 1, + "h": 2, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Battles", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "variables": ["{{variables.[Player]}}"], + "scope": { + "scope": "{{scopes.[Players]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[Player]}}" + }, + "dataStream": { + "id": "{{dataStreams.playerSummary}}", + "name": "playerSummary", + "pluginConfigId": "{{configId}}" + }, + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "battles", + "comparisonColumn": "none", + "label": "Battles" + } + } + } + } + }, + { + "i": "5e1c48ea-84bd-4a85-a016-5cafbdcf704d", + "x": 2, + "y": 1, + "w": 1, + "h": 2, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Avg. Damage", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "variables": ["{{variables.[Player]}}"], + "scope": { + "scope": "{{scopes.[Players]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[Player]}}" + }, + "dataStream": { + "id": "{{dataStreams.playerSummary}}", + "name": "playerSummary", + "pluginConfigId": "{{configId}}" + }, + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "avgDamage", + "comparisonColumn": "none", + "label": "Avg. Damage" + } + } + } + } + }, + { + "i": "bcb7d773-9ece-4fae-9cc4-0f844524e8a0", + "x": 3, + "y": 1, + "w": 1, + "h": 2, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Global Rating", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "variables": ["{{variables.[Player]}}"], + "scope": { + "scope": "{{scopes.[Players]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[Player]}}" + }, + "dataStream": { + "id": "{{dataStreams.playerSummary}}", + "name": "playerSummary", + "pluginConfigId": "{{configId}}" + }, + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "globalRating", + "comparisonColumn": "none", + "label": "Global Rating" + } + } + } + } + }, + { + "i": "f9405ea4-9ce3-4546-acb5-16711d6f3d89", + "x": 0, + "y": 3, + "w": 1, + "h": 4, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Player Details", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "variables": ["{{variables.[Player]}}"], + "scope": { + "scope": "{{scopes.[Players]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[Player]}}" + }, + "dataStream": { + "id": "datastream-properties", + "name": "properties" + }, + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "transpose": true, + "hiddenColumns": [ + "id", + "link", + "links", + "sourceId", + "sourceType" + ] + } + } + } + } + }, + { + "i": "e5da744a-a4b7-443d-8a3a-9101d961ec8e", + "x": 1, + "y": 3, + "w": 3, + "h": 4, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Vehicle Stats", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "variables": ["{{variables.[Player]}}"], + "scope": { + "scope": "{{scopes.[Players]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[Player]}}" + }, + "dataStream": { + "id": "{{dataStreams.playerVehicleStats}}", + "name": "playerVehicleStats", + "pluginConfigId": "{{configId}}", + "sort": { "by": [["battles", "desc"]] } + }, + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "transpose": false, + "columnOrder": [ + "vehicle", + "battles", + "winRate", + "avgDamage", + "markOfMastery" + ], + "hiddenColumns": ["frags", "spotted", "tankId"] + } + } + } + } + }, + { + "i": "6ec2682d-d978-4ed0-8890-348f53d61c9d", + "x": 0, + "y": 7, + "w": 4, + "h": 1, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/text", + "title": "", + "description": "", + "visualisation": { + "config": { + "content": "World of Warships", + "fontSize": 16, + "align": "center", + "autoSize": true + } + } + } + }, + { + "i": "d3858838-9a9b-42f5-9bb2-982985edee75", + "x": 0, + "y": 8, + "w": 1, + "h": 2, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Win Rate", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "variables": ["{{variables.[Player]}}"], + "scope": { + "scope": "{{scopes.[Players]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[Player]}}" + }, + "dataStream": { + "id": "{{dataStreams.playerWarshipsSummary}}", + "name": "playerWarshipsSummary", + "pluginConfigId": "{{configId}}" + }, + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "winRate", + "comparisonColumn": "none", + "label": "Win Rate" + } + } + } + } + }, + { + "i": "53b42168-7873-4224-a24b-97cc2aeb6351", + "x": 1, + "y": 8, + "w": 1, + "h": 2, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Battles", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "variables": ["{{variables.[Player]}}"], + "scope": { + "scope": "{{scopes.[Players]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[Player]}}" + }, + "dataStream": { + "id": "{{dataStreams.playerWarshipsSummary}}", + "name": "playerWarshipsSummary", + "pluginConfigId": "{{configId}}" + }, + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "battles", + "comparisonColumn": "none", + "label": "Battles" + } + } + } + } + }, + { + "i": "01f82522-ad55-4239-988e-2aa7dffe86af", + "x": 2, + "y": 8, + "w": 1, + "h": 2, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Avg. Damage", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "variables": ["{{variables.[Player]}}"], + "scope": { + "scope": "{{scopes.[Players]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[Player]}}" + }, + "dataStream": { + "id": "{{dataStreams.playerWarshipsSummary}}", + "name": "playerWarshipsSummary", + "pluginConfigId": "{{configId}}" + }, + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "avgDamage", + "comparisonColumn": "none", + "label": "Avg. Damage" + } + } + } + } + }, + { + "i": "ca76e379-5bea-4ab7-becc-8471753893bc", + "x": 0, + "y": 10, + "w": 4, + "h": 4, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Ship Stats", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "variables": ["{{variables.[Player]}}"], + "scope": { + "scope": "{{scopes.[Players]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[Player]}}" + }, + "dataStream": { + "id": "{{dataStreams.playerShipStats}}", + "name": "playerShipStats", + "pluginConfigId": "{{configId}}", + "sort": { "by": [["battles", "desc"]] } + }, + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "transpose": false, + "columnOrder": [ + "ship", + "battles", + "winRate", + "avgDamage", + "frags" + ], + "hiddenColumns": ["shipId"] + } + } + } + } + }, + { + "i": "bffd1f5b-66cc-4757-81fd-ce72076876fb", + "x": 0, + "y": 14, + "w": 4, + "h": 1, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/text", + "title": "", + "description": "", + "visualisation": { + "config": { + "content": "World of Warplanes", + "fontSize": 16, + "align": "center", + "autoSize": true + } + } + } + }, + { + "i": "cd4c6629-d973-4d09-9804-cbed6b27b18f", + "x": 0, + "y": 15, + "w": 1, + "h": 2, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Win Rate", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "variables": ["{{variables.[Player]}}"], + "scope": { + "scope": "{{scopes.[Players]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[Player]}}" + }, + "dataStream": { + "id": "{{dataStreams.playerWarplanesSummary}}", + "name": "playerWarplanesSummary", + "pluginConfigId": "{{configId}}" + }, + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "winRate", + "comparisonColumn": "none", + "label": "Win Rate" + } + } + } + } + }, + { + "i": "ae8b7cbb-dd13-4458-bdfa-7c35e34dd591", + "x": 1, + "y": 15, + "w": 1, + "h": 2, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Battles", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "variables": ["{{variables.[Player]}}"], + "scope": { + "scope": "{{scopes.[Players]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[Player]}}" + }, + "dataStream": { + "id": "{{dataStreams.playerWarplanesSummary}}", + "name": "playerWarplanesSummary", + "pluginConfigId": "{{configId}}" + }, + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "battles", + "comparisonColumn": "none", + "label": "Battles" + } + } + } + } + }, + { + "i": "8b7ecff1-ce5f-4973-8c23-a9cd9ec4e550", + "x": 2, + "y": 15, + "w": 1, + "h": 2, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Avg. Damage", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "variables": ["{{variables.[Player]}}"], + "scope": { + "scope": "{{scopes.[Players]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[Player]}}" + }, + "dataStream": { + "id": "{{dataStreams.playerWarplanesSummary}}", + "name": "playerWarplanesSummary", + "pluginConfigId": "{{configId}}" + }, + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "avgDamage", + "comparisonColumn": "none", + "label": "Avg. Damage" + } + } + } + } + } + ] + } +} diff --git a/plugins/Wargaming.net/v1/defaultContent/scopes.json b/plugins/Wargaming.net/v1/defaultContent/scopes.json new file mode 100644 index 0000000..6daddcc --- /dev/null +++ b/plugins/Wargaming.net/v1/defaultContent/scopes.json @@ -0,0 +1,62 @@ +[ + { + "name": "Players", + "matches": { + "sourceType": { "type": "oneOf", "values": ["Player"] } + }, + "variable": { + "name": "Player", + "allowMultipleSelection": false, + "default": "none", + "type": "object" + } + }, + { + "name": "Clans", + "matches": { + "sourceType": { "type": "oneOf", "values": ["Clan"] } + }, + "variable": { + "name": "Clan", + "allowMultipleSelection": false, + "default": "none", + "type": "object" + } + }, + { + "name": "WoT Vehicles", + "matches": { + "sourceType": { "type": "oneOf", "values": ["WoT Vehicle"] } + }, + "variable": { + "name": "WoT Vehicle", + "allowMultipleSelection": false, + "default": "none", + "type": "object" + } + }, + { + "name": "WoWs Ships", + "matches": { + "sourceType": { "type": "oneOf", "values": ["WoWs Ship"] } + }, + "variable": { + "name": "WoWs Ship", + "allowMultipleSelection": false, + "default": "none", + "type": "object" + } + }, + { + "name": "WoWp Aircraft", + "matches": { + "sourceType": { "type": "oneOf", "values": ["WoWp Aircraft"] } + }, + "variable": { + "name": "WoWp Aircraft", + "allowMultipleSelection": false, + "default": "none", + "type": "object" + } + } +] diff --git a/plugins/Wargaming.net/v1/defaultContent/ship.dash.json b/plugins/Wargaming.net/v1/defaultContent/ship.dash.json new file mode 100644 index 0000000..4774aca --- /dev/null +++ b/plugins/Wargaming.net/v1/defaultContent/ship.dash.json @@ -0,0 +1,54 @@ +{ + "name": "Ship", + "schemaVersion": "1.5", + "variables": ["{{variables.[WoWs Ship]}}"], + "dashboard": { + "_type": "layout/grid", + "columns": 4, + "version": 1, + "contents": [ + { + "i": "d7d7924e-2722-4a29-a91a-289e6bc5880c", + "x": 0, + "y": 0, + "w": 4, + "h": 4, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Ship Details", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "variables": ["{{variables.[WoWs Ship]}}"], + "scope": { + "scope": "{{scopes.[WoWs Ships]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[WoWs Ship]}}" + }, + "dataStream": { + "id": "datastream-properties", + "name": "properties" + }, + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "transpose": true, + "hiddenColumns": [ + "id", + "link", + "links", + "sourceId", + "sourceType" + ] + } + } + } + } + } + ] + } +} diff --git a/plugins/Wargaming.net/v1/defaultContent/vehicle.dash.json b/plugins/Wargaming.net/v1/defaultContent/vehicle.dash.json new file mode 100644 index 0000000..964e163 --- /dev/null +++ b/plugins/Wargaming.net/v1/defaultContent/vehicle.dash.json @@ -0,0 +1,54 @@ +{ + "name": "Vehicle", + "schemaVersion": "1.5", + "variables": ["{{variables.[WoT Vehicle]}}"], + "dashboard": { + "_type": "layout/grid", + "columns": 4, + "version": 1, + "contents": [ + { + "i": "f0c4de50-d07a-4854-80fd-36ed48304d98", + "x": 0, + "y": 0, + "w": 4, + "h": 4, + "moved": false, + "static": false, + "z": 0, + "config": { + "_type": "tile/data-stream", + "title": "Vehicle Details", + "description": "", + "timeframe": "none", + "activePluginConfigIds": ["{{configId}}"], + "variables": ["{{variables.[WoT Vehicle]}}"], + "scope": { + "scope": "{{scopes.[WoT Vehicles]}}", + "workspace": "{{workspaceId}}", + "variable": "{{variables.[WoT Vehicle]}}" + }, + "dataStream": { + "id": "datastream-properties", + "name": "properties" + }, + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "transpose": true, + "hiddenColumns": [ + "id", + "link", + "links", + "sourceId", + "sourceType" + ] + } + } + } + } + } + ] + } +} diff --git a/plugins/Wargaming.net/v1/docs/README.md b/plugins/Wargaming.net/v1/docs/README.md new file mode 100644 index 0000000..65e168d --- /dev/null +++ b/plugins/Wargaming.net/v1/docs/README.md @@ -0,0 +1,59 @@ +# Wargaming.net + +Monitor **World of Tanks**, **World of Warships**, and **World of Warplanes** players, clans, and encyclopedias in SquaredUp using the [Wargaming.net Public API](https://developers.wargaming.net/). A single Wargaming account is shared across all three games, so one tracked **Player** shows tank, ship, and aircraft statistics side by side. + +## What this plugin monitors + +- **Players** you choose to track (by account ID) — per-game statistics for World of Tanks, World of Warships, and World of Warplanes: battles, win rate, average damage, survival rate, global rating, last battle time, and more. +- **Clans** you choose to track (by clan ID) — member count, tag, motto, leader, creation date, and the full member roster. +- **Vehicles / Ships / Aircraft** — the complete encyclopedias for all three games (tanks, warships, and warplanes), each with tier/level, nation, and type. Imported automatically. + +Out-of-the-box dashboards give you an Overview (encyclopedia breakdowns plus your tracked players and clans) and a drill-down perspective for each player (with a section per game), clan, vehicle, ship, and aircraft. + +> The Wargaming public API returns **cumulative, all-time** statistics only — there are no historical/time-range endpoints, so figures are current snapshots rather than trends over a chosen timeframe. + +## Prerequisites — getting an application ID + +The plugin authenticates with a Wargaming **application ID** (a free API key). To create one: + +1. Go to and sign in with your Wargaming account (the account for your region). +2. Open **Applications** (). +3. Click **Add application**, give it a name, and choose application type **Server** (works for a service-to-service integration like SquaredUp). +4. Copy the **Application ID** shown for your new application. + +The application ID is tied to a **region (realm)** — EU, North America, or Asia — and is valid across all three games on that realm. Use the realm your Wargaming account belongs to. + +## Finding player and clan IDs + +The plugin tracks the specific players and clans you list by their numeric IDs (the API cannot enumerate all players). + +- **Account ID** — open a player's profile on the World of Tanks portal; the URL contains the ID, e.g. `worldoftanks.eu/en/community/accounts/`**`500123456`**`-PlayerName/`. The same account ID works for all three games. You can also use the built-in **Player Search** data stream (search by nickname) inside SquaredUp to look up an account ID. +- **Clan ID** — open a clan's page on the portal; the URL contains the clan ID, e.g. `worldoftanks.eu/en/clans/`**`500001234`**`-TAG/`. + +Add each ID as a chip in the configuration fields below (type the ID and press Enter). Leave a field blank to skip importing that object type. + +## Configuration fields + +| Field | Required | What it is / where to find it | +| --- | --- | --- | +| **Application ID** | Yes | Your Wargaming application ID from . | +| **Realm** | Yes | The region your Wargaming account is on: EU, North America (`com`), or Asia. Applies to all three games. | +| **Account IDs** | No | Player account IDs to track (add each as a chip). Leave blank to skip player import. | +| **Clan IDs** | No | Clan IDs to track (add each as a chip). Leave blank to skip clan import. | + +## What gets indexed + +- **Player** — each tracked player account (one cross-game Wargaming account, with World of Tanks / Warships / Warplanes statistics). +- **Clan** — each tracked clan. +- **WoT Vehicle** — every tank in the World of Tanks encyclopedia. +- **WoWs Ship** — every ship in the World of Warships encyclopedia. +- **WoWp Aircraft** — every aircraft in the World of Warplanes encyclopedia. + +## Known limitations + +- **Region-bound** — an application ID and its data are specific to one realm (EU/NA/Asia). To monitor accounts across regions you would add the plugin once per realm. +- **No history** — the public API exposes cumulative totals only; there are no time-series or timeframe-filtered endpoints, so dashboards show current values. +- **Players and clans must be listed explicitly** — the API has no "list all players/clans" capability, so you track the specific IDs you enter in configuration. +- **A player may not play every game** — per-game statistics are blank for games a tracked player has never played. +- **World of Warplanes is semi-deprecated** — Wargaming flags the Warplanes API as deprecated; it still works but has less data and may change. +- **Rate limits** — the Wargaming API enforces per-application rate limits (typically 10 requests/second, 20 with a mobile app type). Encyclopedia imports (especially World of Warships, fetched page by page) are the heaviest calls; large lists of tracked players/clans may approach these limits. diff --git a/plugins/Wargaming.net/v1/icon.svg b/plugins/Wargaming.net/v1/icon.svg new file mode 100644 index 0000000..3dab263 --- /dev/null +++ b/plugins/Wargaming.net/v1/icon.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/plugins/Wargaming.net/v1/indexDefinitions/default.json b/plugins/Wargaming.net/v1/indexDefinitions/default.json new file mode 100644 index 0000000..afff18b --- /dev/null +++ b/plugins/Wargaming.net/v1/indexDefinitions/default.json @@ -0,0 +1,169 @@ +{ + "steps": [ + { + "name": "vehicles", + "dataStream": { "name": "encyclopediaVehicles" }, + "timeframe": "none", + "objectMapping": { + "id": "tank_id", + "name": "name", + "type": { "value": "WoT Vehicle" }, + "properties": ["tier", "nation", { "vehicleType": "type" }, "is_premium"] + } + }, + { + "name": "players", + "dataStream": { "name": "accountInfo" }, + "timeframe": "none", + "objectMapping": { + "id": "account_id", + "name": "nickname", + "type": { "value": "Player" }, + "properties": ["clan_id"] + } + }, + { + "name": "clans", + "dataStream": { "name": "clanInfo" }, + "timeframe": "none", + "objectMapping": { + "id": "clan_id", + "name": "name", + "type": { "value": "Clan" }, + "properties": ["tag", "members_count", "leader_name"] + } + }, + { + "name": "ships_p1", + "dataStream": { "name": "shipsEncyclopedia", "config": { "page": "1" } }, + "timeframe": "none", + "objectMapping": { + "id": "ship_id", + "name": "name", + "type": { "value": "WoWs Ship" }, + "properties": ["tier", "nation", { "shipType": "type" }, "is_premium"] + } + }, + { + "name": "ships_p2", + "dataStream": { "name": "shipsEncyclopedia", "config": { "page": "2" } }, + "timeframe": "none", + "objectMapping": { + "id": "ship_id", + "name": "name", + "type": { "value": "WoWs Ship" }, + "properties": ["tier", "nation", { "shipType": "type" }, "is_premium"] + } + }, + { + "name": "ships_p3", + "dataStream": { "name": "shipsEncyclopedia", "config": { "page": "3" } }, + "timeframe": "none", + "objectMapping": { + "id": "ship_id", + "name": "name", + "type": { "value": "WoWs Ship" }, + "properties": ["tier", "nation", { "shipType": "type" }, "is_premium"] + } + }, + { + "name": "ships_p4", + "dataStream": { "name": "shipsEncyclopedia", "config": { "page": "4" } }, + "timeframe": "none", + "objectMapping": { + "id": "ship_id", + "name": "name", + "type": { "value": "WoWs Ship" }, + "properties": ["tier", "nation", { "shipType": "type" }, "is_premium"] + } + }, + { + "name": "ships_p5", + "dataStream": { "name": "shipsEncyclopedia", "config": { "page": "5" } }, + "timeframe": "none", + "objectMapping": { + "id": "ship_id", + "name": "name", + "type": { "value": "WoWs Ship" }, + "properties": ["tier", "nation", { "shipType": "type" }, "is_premium"] + } + }, + { + "name": "ships_p6", + "dataStream": { "name": "shipsEncyclopedia", "config": { "page": "6" } }, + "timeframe": "none", + "objectMapping": { + "id": "ship_id", + "name": "name", + "type": { "value": "WoWs Ship" }, + "properties": ["tier", "nation", { "shipType": "type" }, "is_premium"] + } + }, + { + "name": "ships_p7", + "dataStream": { "name": "shipsEncyclopedia", "config": { "page": "7" } }, + "timeframe": "none", + "objectMapping": { + "id": "ship_id", + "name": "name", + "type": { "value": "WoWs Ship" }, + "properties": ["tier", "nation", { "shipType": "type" }, "is_premium"] + } + }, + { + "name": "ships_p8", + "dataStream": { "name": "shipsEncyclopedia", "config": { "page": "8" } }, + "timeframe": "none", + "objectMapping": { + "id": "ship_id", + "name": "name", + "type": { "value": "WoWs Ship" }, + "properties": ["tier", "nation", { "shipType": "type" }, "is_premium"] + } + }, + { + "name": "ships_p9", + "dataStream": { "name": "shipsEncyclopedia", "config": { "page": "9" } }, + "timeframe": "none", + "objectMapping": { + "id": "ship_id", + "name": "name", + "type": { "value": "WoWs Ship" }, + "properties": ["tier", "nation", { "shipType": "type" }, "is_premium"] + } + }, + { + "name": "ships_p10", + "dataStream": { "name": "shipsEncyclopedia", "config": { "page": "10" } }, + "timeframe": "none", + "objectMapping": { + "id": "ship_id", + "name": "name", + "type": { "value": "WoWs Ship" }, + "properties": ["tier", "nation", { "shipType": "type" }, "is_premium"] + } + }, + { + "name": "ships_p11", + "dataStream": { "name": "shipsEncyclopedia", "config": { "page": "11" } }, + "timeframe": "none", + "objectMapping": { + "id": "ship_id", + "name": "name", + "type": { "value": "WoWs Ship" }, + "properties": ["tier", "nation", { "shipType": "type" }, "is_premium"] + } + }, + { + "name": "planes", + "dataStream": { "name": "planesEncyclopedia" }, + "timeframe": "none", + "objectMapping": { + "id": "plane_id", + "name": "name", + "type": { "value": "WoWp Aircraft" }, + "properties": ["level", "nation", { "planeType": "type" }] + } + } + ] +} diff --git a/plugins/Wargaming.net/v1/metadata.json b/plugins/Wargaming.net/v1/metadata.json new file mode 100644 index 0000000..8b93ad3 --- /dev/null +++ b/plugins/Wargaming.net/v1/metadata.json @@ -0,0 +1,56 @@ +{ + "name": "wargaming", + "displayName": "Wargaming.net", + "version": "1.0.0", + "author": { + "name": "@AnEvilPenguin", + "type": "community" + }, + "description": "Monitor World of Tanks, World of Warships and World of Warplanes players, clans, and encyclopedias using the Wargaming.net Public API.", + "category": "Fun", + "type": "hybrid", + "schemaVersion": "2.1", + "importNotSupported": false, + "restrictedToPlatforms": [], + "keywords": [ + "wargaming.net", + "wargaming", + "world of tanks", + "world of warships", + "world of warplanes", + "wot", + "wows", + "wowp", + "gaming", + "tanks", + "clan" + ], + "objectTypes": ["Player", "Clan", "WoT Vehicle", "WoWs Ship", "WoWp Aircraft"], + "links": [ + { + "category": "documentation", + "url": "https://github.com/squaredup/plugins/blob/main/plugins/Wargaming.net/v1/docs/README.md", + "label": "Help adding this plugin" + }, + { + "category": "source", + "url": "https://github.com/squaredup/plugins/tree/main/plugins/Wargaming.net/v1", + "label": "Repository" + } + ], + "base": { + "plugin": "WebAPI", + "majorVersion": "1", + "config": { + "baseUrl": "https://", + "authMode": "none", + "headers": [], + "queryArgs": [ + { + "key": "application_id", + "value": "{{applicationId}}" + } + ] + } + } +} diff --git a/plugins/Wargaming.net/v1/ui.json b/plugins/Wargaming.net/v1/ui.json new file mode 100644 index 0000000..e667e9c --- /dev/null +++ b/plugins/Wargaming.net/v1/ui.json @@ -0,0 +1,54 @@ +[ + { + "type": "password", + "name": "applicationId", + "label": "Application ID", + "help": "Your Wargaming application ID (a free API key). Create one at [https://developers.wargaming.net](developers.wargaming.net/applications/) — sign in, open **Applications**, add a **Server** application, and copy its Application ID.", + "validation": { + "required": true + } + }, + { + "type": "radio", + "name": "realm", + "label": "Realm", + "help": "The region your Wargaming account belongs to. Your application ID and data are specific to one realm.", + "defaultValue": "eu", + "options": [ + { "value": "eu", "label": "Europe (EU)" }, + { "value": "com", "label": "North America (NA)" }, + { "value": "asia", "label": "Asia" } + ], + "validation": { + "required": true + } + }, + { + "type": "autocomplete", + "name": "accountIds", + "label": "Account IDs", + "help": "Player account IDs to track. Type an ID and press Enter to add it as a chip. Find an ID in a player's portal profile URL, or use the Player Search data stream. Leave blank to skip player import.", + "placeholder": "500123456", + "isMulti": true, + "allowCustomValues": true, + "isClearable": true, + "data": { + "source": "fixed", + "values": [] + } + }, + { + "type": "autocomplete", + "name": "clanIds", + "label": "Clan IDs", + "help": "Clan IDs to track. Type an ID and press Enter to add it as a chip. Find an ID in a clan's portal page URL. Leave blank to skip clan import.", + "placeholder": "500001234", + "isMulti": true, + "allowCustomValues": true, + "isClearable": true, + "data": { + "source": "fixed", + "values": [] + } + } +] From 826de0e0c4cf79c3cb588821578d44262fa9e977 Mon Sep 17 00:00:00 2001 From: Dave Lewis Date: Fri, 10 Jul 2026 07:51:25 +0100 Subject: [PATCH 2/4] Address CodeRabbit review feedback on Wargaming.net plugin - clanInfo: add errorHandling for HTTP-200 error payloads, matching the pattern used by every other stream on this endpoint family - ui.json: fix inverted markdown link (URL was in the label, not the href) - playerShipStats/playerVehicleStats scripts: default wins/damage_dealt before dividing, matching the existing battles/frags fallback pattern; drop the unused computed `wins` field from playerVehicleStats (dead output, not declared in its stream metadata) Co-Authored-By: Claude Sonnet 5 --- plugins/Wargaming.net/v1/dataStreams/clanInfo.json | 1 + .../v1/dataStreams/scripts/playerShipStats.js | 6 ++++-- .../v1/dataStreams/scripts/playerVehicleStats.js | 7 ++++--- plugins/Wargaming.net/v1/ui.json | 2 +- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/plugins/Wargaming.net/v1/dataStreams/clanInfo.json b/plugins/Wargaming.net/v1/dataStreams/clanInfo.json index 12621a0..7235f12 100644 --- a/plugins/Wargaming.net/v1/dataStreams/clanInfo.json +++ b/plugins/Wargaming.net/v1/dataStreams/clanInfo.json @@ -14,6 +14,7 @@ }, { "key": "fields", "value": "clan_id,name,tag,members_count,leader_name,motto,created_at" } ], + "errorHandling": { "type": "path", "realm": "payload", "path": "error.message" }, "postRequestScript": "clanInfo.js" }, "matches": "none", diff --git a/plugins/Wargaming.net/v1/dataStreams/scripts/playerShipStats.js b/plugins/Wargaming.net/v1/dataStreams/scripts/playerShipStats.js index 88e90da..7704a84 100644 --- a/plugins/Wargaming.net/v1/dataStreams/scripts/playerShipStats.js +++ b/plugins/Wargaming.net/v1/dataStreams/scripts/playerShipStats.js @@ -4,11 +4,13 @@ const arr = Object.values(data.data || {})[0] || []; result = arr.map((s) => { const p = s.pvp || {}; const battles = p.battles || 0; + const wins = p.wins || 0; + const damageDealt = p.damage_dealt || 0; return { shipId: String(s.ship_id), battles, - winRate: battles ? (p.wins / battles) * 100 : 0, - avgDamage: battles ? p.damage_dealt / battles : 0, + winRate: battles ? (wins / battles) * 100 : 0, + avgDamage: battles ? damageDealt / battles : 0, frags: p.frags || 0 }; }); diff --git a/plugins/Wargaming.net/v1/dataStreams/scripts/playerVehicleStats.js b/plugins/Wargaming.net/v1/dataStreams/scripts/playerVehicleStats.js index 2a57e04..e5db9bc 100644 --- a/plugins/Wargaming.net/v1/dataStreams/scripts/playerVehicleStats.js +++ b/plugins/Wargaming.net/v1/dataStreams/scripts/playerVehicleStats.js @@ -4,12 +4,13 @@ const arr = Object.values(data.data || {})[0] || []; result = arr.map((t) => { const s = t.all || {}; const battles = s.battles || 0; + const wins = s.wins || 0; + const damageDealt = s.damage_dealt || 0; return { tankId: String(t.tank_id), battles, - wins: s.wins || 0, - winRate: battles ? (s.wins / battles) * 100 : 0, - avgDamage: battles ? s.damage_dealt / battles : 0, + winRate: battles ? (wins / battles) * 100 : 0, + avgDamage: battles ? damageDealt / battles : 0, frags: s.frags || 0, spotted: s.spotted || 0, markOfMastery: t.mark_of_mastery || 0 diff --git a/plugins/Wargaming.net/v1/ui.json b/plugins/Wargaming.net/v1/ui.json index e667e9c..f22914b 100644 --- a/plugins/Wargaming.net/v1/ui.json +++ b/plugins/Wargaming.net/v1/ui.json @@ -3,7 +3,7 @@ "type": "password", "name": "applicationId", "label": "Application ID", - "help": "Your Wargaming application ID (a free API key). Create one at [https://developers.wargaming.net](developers.wargaming.net/applications/) — sign in, open **Applications**, add a **Server** application, and copy its Application ID.", + "help": "Your Wargaming application ID (a free API key). Create one at [developers.wargaming.net](https://developers.wargaming.net/applications/) — sign in, open **Applications**, add a **Server** application, and copy its Application ID.", "validation": { "required": true } From 98dc5ab3198bf8c90200e95c09ec5a1e3aad728e Mon Sep 17 00:00:00 2001 From: Dave Lewis Date: Fri, 10 Jul 2026 09:26:33 +0100 Subject: [PATCH 3/4] Wargaming.net: self-paginate the WoWs ships encyclopedia import Replaces the 11 hardcoded ships_p1..p11 index steps with a single "ships" step that drives its own pagination via a postRequestScript pagingContext override, since the platform's built-in offset/token paging can't count rows in the API's keyed-object response body. Stops on any of: a short page (count !== limit), the total already covered (page * limit >= total, guarding the case where the real total is an exact multiple of the page size), or the API's own PAGE_NO_NOT_FOUND error past the last page. No longer silently caps out at 1,100 ships if Wargaming's catalog grows. Verified against a real import: 983/983 ships received and written, no overshoot, no stray objects. Co-Authored-By: Claude Sonnet 5 --- .../dataStreams/scripts/shipsEncyclopedia.js | 37 +++++- .../v1/dataStreams/shipsEncyclopedia.json | 11 +- .../v1/indexDefinitions/default.json | 114 +----------------- 3 files changed, 43 insertions(+), 119 deletions(-) diff --git a/plugins/Wargaming.net/v1/dataStreams/scripts/shipsEncyclopedia.js b/plugins/Wargaming.net/v1/dataStreams/scripts/shipsEncyclopedia.js index b7925a2..3dd70bc 100644 --- a/plugins/Wargaming.net/v1/dataStreams/scripts/shipsEncyclopedia.js +++ b/plugins/Wargaming.net/v1/dataStreams/scripts/shipsEncyclopedia.js @@ -1,2 +1,35 @@ -// wows/encyclopedia/ships returns `data` as an object keyed by ship_id — flatten to rows -result = Object.values(data.data || {}).filter(Boolean); +// wows/encyclopedia/ships returns `data` as an object keyed by ship_id — flatten to rows. +// The response body is a keyed object, not an array, so the platform's built-in +// offset/token paging can't count rows to know whether to fetch another page. +// Drive it manually via the postRequestScript pagingContext override. +// +// Wargaming returns HTTP 200 even for a page past the real end, with +// {"status":"error","error":{"message":"PAGE_NO_NOT_FOUND",...}} — that is the +// authoritative stop signal, checked explicitly rather than inferred from a +// short page (a full 100-row page could in principle coincide with the last +// page; the API's own error is unambiguous either way). +const isPageError = data && data.status === 'error'; +const rows = isPageError ? [] : Object.values(data.data || {}).filter(Boolean); +result = rows; + +const count = data.meta?.count; +const limit = data.meta?.limit; +const page = data.meta?.page; +const total = data.meta?.total; + +// A short page (count < limit) means this was the last page. But if the true +// total happens to be an exact multiple of the page size, the last page's +// count also equals limit — catch that case too by checking whether every +// page up to and including this one already covers the reported total, so we +// never overshoot into the PAGE_NO_NOT_FOUND page. +const isLastPage = count !== limit || page * limit >= total; + +if (isPageError) { + pagingContext = undefined; + + api.report.error(data.error?.message || 'Unknown error', data); +} else if (isLastPage) { + pagingContext = undefined; +} else { + pagingContext = page + 1; +} diff --git a/plugins/Wargaming.net/v1/dataStreams/shipsEncyclopedia.json b/plugins/Wargaming.net/v1/dataStreams/shipsEncyclopedia.json index 99f2159..5119b23 100644 --- a/plugins/Wargaming.net/v1/dataStreams/shipsEncyclopedia.json +++ b/plugins/Wargaming.net/v1/dataStreams/shipsEncyclopedia.json @@ -9,17 +9,18 @@ "endpointPath": "api.worldofwarships.{{dataSource.realm}}/wows/encyclopedia/ships/", "getArgs": [ { "key": "fields", "value": "ship_id,name,tier,nation,type,is_premium" }, - { "key": "limit", "value": "100" }, - { "key": "page_no", "value": "{{page || 1}}" } + { "key": "limit", "value": "100" } ], + "paging": { + "mode": "token", + "in": { "realm": "payload", "path": "meta.page" }, + "out": { "realm": "queryArg", "path": "page_no" } + }, "postRequestScript": "shipsEncyclopedia.js", "errorHandling": { "type": "path", "realm": "payload", "path": "error.message" } }, "matches": "none", "visibility": { "type": "hidden" }, - "ui": [ - { "type": "text", "name": "page", "label": "Page", "defaultValue": "1" } - ], "metadata": [ { "name": "ship_id", "displayName": "Ship ID", "shape": "string", "visible": false }, { "name": "name", "displayName": "Name", "shape": "string", "role": "label" }, diff --git a/plugins/Wargaming.net/v1/indexDefinitions/default.json b/plugins/Wargaming.net/v1/indexDefinitions/default.json index afff18b..c115afa 100644 --- a/plugins/Wargaming.net/v1/indexDefinitions/default.json +++ b/plugins/Wargaming.net/v1/indexDefinitions/default.json @@ -34,118 +34,8 @@ } }, { - "name": "ships_p1", - "dataStream": { "name": "shipsEncyclopedia", "config": { "page": "1" } }, - "timeframe": "none", - "objectMapping": { - "id": "ship_id", - "name": "name", - "type": { "value": "WoWs Ship" }, - "properties": ["tier", "nation", { "shipType": "type" }, "is_premium"] - } - }, - { - "name": "ships_p2", - "dataStream": { "name": "shipsEncyclopedia", "config": { "page": "2" } }, - "timeframe": "none", - "objectMapping": { - "id": "ship_id", - "name": "name", - "type": { "value": "WoWs Ship" }, - "properties": ["tier", "nation", { "shipType": "type" }, "is_premium"] - } - }, - { - "name": "ships_p3", - "dataStream": { "name": "shipsEncyclopedia", "config": { "page": "3" } }, - "timeframe": "none", - "objectMapping": { - "id": "ship_id", - "name": "name", - "type": { "value": "WoWs Ship" }, - "properties": ["tier", "nation", { "shipType": "type" }, "is_premium"] - } - }, - { - "name": "ships_p4", - "dataStream": { "name": "shipsEncyclopedia", "config": { "page": "4" } }, - "timeframe": "none", - "objectMapping": { - "id": "ship_id", - "name": "name", - "type": { "value": "WoWs Ship" }, - "properties": ["tier", "nation", { "shipType": "type" }, "is_premium"] - } - }, - { - "name": "ships_p5", - "dataStream": { "name": "shipsEncyclopedia", "config": { "page": "5" } }, - "timeframe": "none", - "objectMapping": { - "id": "ship_id", - "name": "name", - "type": { "value": "WoWs Ship" }, - "properties": ["tier", "nation", { "shipType": "type" }, "is_premium"] - } - }, - { - "name": "ships_p6", - "dataStream": { "name": "shipsEncyclopedia", "config": { "page": "6" } }, - "timeframe": "none", - "objectMapping": { - "id": "ship_id", - "name": "name", - "type": { "value": "WoWs Ship" }, - "properties": ["tier", "nation", { "shipType": "type" }, "is_premium"] - } - }, - { - "name": "ships_p7", - "dataStream": { "name": "shipsEncyclopedia", "config": { "page": "7" } }, - "timeframe": "none", - "objectMapping": { - "id": "ship_id", - "name": "name", - "type": { "value": "WoWs Ship" }, - "properties": ["tier", "nation", { "shipType": "type" }, "is_premium"] - } - }, - { - "name": "ships_p8", - "dataStream": { "name": "shipsEncyclopedia", "config": { "page": "8" } }, - "timeframe": "none", - "objectMapping": { - "id": "ship_id", - "name": "name", - "type": { "value": "WoWs Ship" }, - "properties": ["tier", "nation", { "shipType": "type" }, "is_premium"] - } - }, - { - "name": "ships_p9", - "dataStream": { "name": "shipsEncyclopedia", "config": { "page": "9" } }, - "timeframe": "none", - "objectMapping": { - "id": "ship_id", - "name": "name", - "type": { "value": "WoWs Ship" }, - "properties": ["tier", "nation", { "shipType": "type" }, "is_premium"] - } - }, - { - "name": "ships_p10", - "dataStream": { "name": "shipsEncyclopedia", "config": { "page": "10" } }, - "timeframe": "none", - "objectMapping": { - "id": "ship_id", - "name": "name", - "type": { "value": "WoWs Ship" }, - "properties": ["tier", "nation", { "shipType": "type" }, "is_premium"] - } - }, - { - "name": "ships_p11", - "dataStream": { "name": "shipsEncyclopedia", "config": { "page": "11" } }, + "name": "ships", + "dataStream": { "name": "shipsEncyclopedia" }, "timeframe": "none", "objectMapping": { "id": "ship_id", From ecde68e69047304534729a79c9e2462b81ab9b49 Mon Sep 17 00:00:00 2001 From: Dave Lewis Date: Fri, 10 Jul 2026 09:32:38 +0100 Subject: [PATCH 4/4] playerShipStats: surface last_battle_time as a lastBattle column The field was already requested from the API but never exposed, per CodeRabbit review feedback on #87. Co-Authored-By: Claude Sonnet 5 --- plugins/Wargaming.net/v1/dataStreams/playerShipStats.json | 3 ++- .../Wargaming.net/v1/dataStreams/scripts/playerShipStats.js | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/Wargaming.net/v1/dataStreams/playerShipStats.json b/plugins/Wargaming.net/v1/dataStreams/playerShipStats.json index 5cd8e92..68f5ccb 100644 --- a/plugins/Wargaming.net/v1/dataStreams/playerShipStats.json +++ b/plugins/Wargaming.net/v1/dataStreams/playerShipStats.json @@ -24,7 +24,8 @@ { "name": "battles", "displayName": "Battles", "shape": "number" }, { "name": "winRate", "displayName": "Win Rate", "shape": ["percent", { "decimalPlaces": 1 }] }, { "name": "avgDamage", "displayName": "Avg. Damage", "shape": ["number", { "decimalPlaces": 0 }] }, - { "name": "frags", "displayName": "Frags", "shape": "number" } + { "name": "frags", "displayName": "Frags", "shape": "number" }, + { "name": "lastBattle", "displayName": "Last Battle", "shape": "date" } ], "timeframes": false } diff --git a/plugins/Wargaming.net/v1/dataStreams/scripts/playerShipStats.js b/plugins/Wargaming.net/v1/dataStreams/scripts/playerShipStats.js index 7704a84..696a55a 100644 --- a/plugins/Wargaming.net/v1/dataStreams/scripts/playerShipStats.js +++ b/plugins/Wargaming.net/v1/dataStreams/scripts/playerShipStats.js @@ -11,6 +11,7 @@ result = arr.map((s) => { battles, winRate: battles ? (wins / battles) * 100 : 0, avgDamage: battles ? damageDealt / battles : 0, - frags: p.frags || 0 + frags: p.frags || 0, + lastBattle: s.last_battle_time ? new Date(s.last_battle_time * 1000).toISOString() : null }; });