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..7235f12
--- /dev/null
+++ b/plugins/Wargaming.net/v1/dataStreams/clanInfo.json
@@ -0,0 +1,32 @@
+{
+ "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" }
+ ],
+ "errorHandling": { "type": "path", "realm": "payload", "path": "error.message" },
+ "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..68f5ccb
--- /dev/null
+++ b/plugins/Wargaming.net/v1/dataStreams/playerShipStats.json
@@ -0,0 +1,31 @@
+{
+ "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" },
+ { "name": "lastBattle", "displayName": "Last Battle", "shape": "date" }
+ ],
+ "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..696a55a
--- /dev/null
+++ b/plugins/Wargaming.net/v1/dataStreams/scripts/playerShipStats.js
@@ -0,0 +1,17 @@
+// 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;
+ const wins = p.wins || 0;
+ const damageDealt = p.damage_dealt || 0;
+ return {
+ shipId: String(s.ship_id),
+ battles,
+ winRate: battles ? (wins / battles) * 100 : 0,
+ avgDamage: battles ? damageDealt / battles : 0,
+ frags: p.frags || 0,
+ lastBattle: s.last_battle_time ? new Date(s.last_battle_time * 1000).toISOString() : null
+ };
+});
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..e5db9bc
--- /dev/null
+++ b/plugins/Wargaming.net/v1/dataStreams/scripts/playerVehicleStats.js
@@ -0,0 +1,18 @@
+// 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;
+ const wins = s.wins || 0;
+ const damageDealt = s.damage_dealt || 0;
+ return {
+ tankId: String(t.tank_id),
+ battles,
+ 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/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..3dd70bc
--- /dev/null
+++ b/plugins/Wargaming.net/v1/dataStreams/scripts/shipsEncyclopedia.js
@@ -0,0 +1,35 @@
+// 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
new file mode 100644
index 0000000..5119b23
--- /dev/null
+++ b/plugins/Wargaming.net/v1/dataStreams/shipsEncyclopedia.json
@@ -0,0 +1,33 @@
+{
+ "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" }
+ ],
+ "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" },
+ "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..c115afa
--- /dev/null
+++ b/plugins/Wargaming.net/v1/indexDefinitions/default.json
@@ -0,0 +1,59 @@
+{
+ "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",
+ "dataStream": { "name": "shipsEncyclopedia" },
+ "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..f22914b
--- /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 [developers.wargaming.net](https://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": []
+ }
+ }
+]