moved ty python
This commit is contained in:
parent
339ff200ef
commit
29401d6bea
|
@ -0,0 +1,3 @@
|
|||
.env
|
||||
*.pyc
|
||||
*.json
|
|
@ -0,0 +1,3 @@
|
|||
# One Piece TCG Notion Importer
|
||||
|
||||
Simple python script to import One Piece's TCG data from onepiece-card.dev to a notion database for collection tracking.
|
7
const.go
7
const.go
|
@ -1,7 +0,0 @@
|
|||
package main
|
||||
|
||||
const (
|
||||
sourcesURL = "https://onepiece-cardgame.dev/sources.json"
|
||||
metaURL = "https://onepiece-cardgame.dev/meta.json"
|
||||
cardsURL = "https://onepiece-cardgame.dev/cards.json"
|
||||
)
|
25
download.go
25
download.go
|
@ -1,25 +0,0 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
func downloadURL(u string) ([]byte, error) {
|
||||
log.Printf("Downloading %s\n", u)
|
||||
|
||||
response, err := http.Get(u)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
defer response.Body.Close()
|
||||
|
||||
body, err := io.ReadAll(response.Body)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return body, nil
|
||||
}
|
5
go.mod
5
go.mod
|
@ -1,5 +0,0 @@
|
|||
module code.fmartingr.dev/fmartingr/onepiece-tcg-notion-importer
|
||||
|
||||
go 1.18
|
||||
|
||||
require github.com/dstotijn/go-notion v0.6.1
|
5
go.sum
5
go.sum
|
@ -1,5 +0,0 @@
|
|||
github.com/dstotijn/go-notion v0.6.1 h1:gmwU/JCdLC5szMasfysDOm8UG6/3P0bTUe0+CeW2fmI=
|
||||
github.com/dstotijn/go-notion v0.6.1/go.mod h1:oxd+T9Wxduj5ZN7MRiHWtyGhGZLUFsUpZHMLS4uI1Qc=
|
||||
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
45
main.go
45
main.go
|
@ -1,45 +0,0 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"log"
|
||||
|
||||
"github.com/dstotijn/go-notion"
|
||||
)
|
||||
|
||||
const (
|
||||
collectionsDatabaseID = "32fc86afa91e4718b17cb79ab8794265"
|
||||
)
|
||||
|
||||
func main() {
|
||||
content, err := downloadURL(sourcesURL)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
log.Println(string(content))
|
||||
|
||||
var sources []source
|
||||
if err := json.Unmarshal(content, &sources); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
dbSources := make(map[string]notion.Page)
|
||||
|
||||
client := notion.NewClient("secret_135hSjxx1xcFWcrjcS1eejjp120T86V8sIGzVeW21X4")
|
||||
|
||||
result, err := client.QueryDatabase(ctx, collectionsDatabaseID, ¬ion.DatabaseQuery{})
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
for _, s := range result.Results {
|
||||
dbSources[s.Properties.(notion.DatabasePageProperties)["SourceID"].Value().(string)] = s
|
||||
}
|
||||
|
||||
// for _, s := range sources {
|
||||
|
||||
// }
|
||||
}
|
|
@ -0,0 +1,80 @@
|
|||
import logging
|
||||
import os
|
||||
import sys
|
||||
from .notion import NotionClient
|
||||
from .download import get_dict_from_url_response_body
|
||||
from .models import Database
|
||||
|
||||
if __name__ == "__main__":
|
||||
logging.getLogger().setLevel(logging.INFO)
|
||||
|
||||
try:
|
||||
token = os.environ["NOTION_TOKEN"]
|
||||
database_id = os.environ["NOTION_DATABASE_ID"]
|
||||
card_id_property = "Card ID"
|
||||
except KeyError as e:
|
||||
logging.error("NOTION_TOKEN and NOTION_DATABASE_ID are required")
|
||||
sys.exit(1)
|
||||
|
||||
database = Database()
|
||||
|
||||
# Download and build Meta database
|
||||
logging.info("Downloading meta...")
|
||||
meta = get_dict_from_url_response_body("https://onepiece-cardgame.dev/meta.json")
|
||||
|
||||
# for attack in meta["a"]:
|
||||
# database.register_attack(attack["atk_id"], **attack)
|
||||
|
||||
for color in meta["c"]:
|
||||
database.register_color(color["color_id"], **color)
|
||||
|
||||
# for source in meta["s"]:
|
||||
# database.register_source(source["src_id"], **source)
|
||||
|
||||
for _type in meta["t"]:
|
||||
database.register_type(_type["type_id"], **_type)
|
||||
|
||||
for card_type in meta["ct"]:
|
||||
database.register_card_type(card_type["type_id"], **card_type)
|
||||
|
||||
for rarity in meta["r"]:
|
||||
database.register_rarity(rarity["rarity_id"], **rarity)
|
||||
|
||||
# for key in meta['key']:
|
||||
# database.register_key(key['id'], **key)
|
||||
|
||||
# Download and build Sources database
|
||||
logging.info("Downloading sources...")
|
||||
sources = get_dict_from_url_response_body(
|
||||
"https://onepiece-cardgame.dev/sources.json"
|
||||
)
|
||||
|
||||
for source in sources:
|
||||
database.register_source(source["src_id"], **source)
|
||||
|
||||
# Donwload and build Cards database
|
||||
logging.info("Downloading cards...")
|
||||
cards = get_dict_from_url_response_body("https://onepiece-cardgame.dev/cards.json")
|
||||
|
||||
for card in cards:
|
||||
database.register_card(card["cid"], **card)
|
||||
|
||||
# Fetch current data from Notion
|
||||
notion_cli = NotionClient(token)
|
||||
notion_state = dict()
|
||||
|
||||
try:
|
||||
logging.info("Retrieving notion state...")
|
||||
notion_db = notion_cli.get_database_state(database_id)
|
||||
for card in notion_db["results"]:
|
||||
notion_state[card[card_id_property]] = card
|
||||
except Exception as e:
|
||||
logging.error(e)
|
||||
sys.exit(2)
|
||||
|
||||
logging.info("Merging databases...")
|
||||
for card in database.iter_cards():
|
||||
if card.card_id in notion_state:
|
||||
notion_cli.update_card(notion_state[card.card_id], **{})
|
||||
else:
|
||||
notion_cli.create_card(database_id, **card.to_notion())
|
|
@ -0,0 +1,20 @@
|
|||
import json
|
||||
from urllib.request import urlopen, Request
|
||||
from urllib.error import URLError
|
||||
|
||||
|
||||
def get_dict_from_url_response_body(url: str) -> str:
|
||||
try:
|
||||
request = Request(
|
||||
url,
|
||||
headers={
|
||||
"User-Agent": "onepiece-tcg-notion-importer",
|
||||
},
|
||||
)
|
||||
with urlopen(request) as response:
|
||||
data = response.read()
|
||||
return json.loads(data)
|
||||
except URLError as e:
|
||||
raise e
|
||||
except json.JSONDecodeError as e:
|
||||
raise e
|
|
@ -0,0 +1,133 @@
|
|||
import json
|
||||
import logging
|
||||
from typing import Dict, Iterator
|
||||
|
||||
|
||||
class Card(object):
|
||||
global_id: str
|
||||
card_id: str
|
||||
name: str
|
||||
type: str
|
||||
color: str
|
||||
source: str
|
||||
rarity: str
|
||||
image_url: str
|
||||
alternate_art: str
|
||||
|
||||
# gid: str # GlobalID: "47",
|
||||
# cid: str # CardID: "OP01-047",
|
||||
# n: str # Name: "Trafalgar Law",
|
||||
# t: str # Type: "2",
|
||||
# col: str # Color: "7",
|
||||
# cs: str # Source: "5",
|
||||
# tr: str # "Supernovas\/ Heart Pirates",
|
||||
# a: str # AttackType: "1",
|
||||
# p: str # Power: "6000",
|
||||
# cp: str # null,
|
||||
# l: dict # null,
|
||||
# r: str # Rarity: "5",
|
||||
# ar: str # null,
|
||||
# iu: str # ImageURL: "https:\/\/onepiece-cardgame.dev\/images\/cards\/OP01-047_616aca_jp.jpg",
|
||||
# e: str # Effect: "<Blocker>\r\n[On Play] You may return one of your Characters to your hand: Play 1 Cost 3 or lower Character Card from your hand.",
|
||||
# al: dict # Alternate Art: "P1",
|
||||
# intl: str # International: "0",
|
||||
# srcN: str # SourceName: "Romance Dawn [OP-01]",
|
||||
# srcD: dict # null
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
global_id,
|
||||
card_id,
|
||||
name,
|
||||
type,
|
||||
color,
|
||||
source,
|
||||
rarity,
|
||||
image_url,
|
||||
alternate_art,
|
||||
):
|
||||
self.global_id = global_id
|
||||
self.card_id = card_id
|
||||
self.name = name
|
||||
self.type = type
|
||||
self.color = color
|
||||
self.source = source
|
||||
self.rarity = rarity
|
||||
self.image_url = image_url
|
||||
self.alternate_art = alternate_art
|
||||
|
||||
def __repr__(self):
|
||||
return json.dumps(self.__dict__)
|
||||
|
||||
def to_notion(self):
|
||||
result = {
|
||||
"Name": {"title": [{"text": {"content": self.name}}]},
|
||||
"Rarity": {"type": "select", "select": {"name": self.rarity}},
|
||||
"Card ID": {
|
||||
"type": "rich_text",
|
||||
"rich_text": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": {"content": self.card_id},
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
|
||||
if self.source:
|
||||
result["Source"] = {"type": "select", "select": {"name": self.source}}
|
||||
return result
|
||||
|
||||
|
||||
class Database:
|
||||
data: Dict[str, Dict[str, Dict]]
|
||||
|
||||
def __init__(self):
|
||||
self.data = dict()
|
||||
|
||||
def _retrieve_property(self, _type, _id, _property="name"):
|
||||
try:
|
||||
return self.data[_type][_id][_property]
|
||||
except KeyError as e:
|
||||
logging.error(f"Error trying to retrieve <{_type}.{_id}.{_property}>: {e} ")
|
||||
return None
|
||||
|
||||
def _register(self, _type: str, _id: str, **kwargs):
|
||||
if _type not in self.data:
|
||||
self.data[_type] = dict()
|
||||
self.data[_type][_id] = kwargs
|
||||
|
||||
def register_card(self, _id: str, **kwargs):
|
||||
self._register("card", _id, **kwargs)
|
||||
|
||||
def register_card_type(self, _id: str, **kwargs):
|
||||
self._register("card_type", _id, **kwargs)
|
||||
|
||||
def register_type(self, _id: str, **kwargs):
|
||||
self._register("type", _id, **kwargs)
|
||||
|
||||
def register_rarity(self, _id: str, **kwargs):
|
||||
self._register("rarity", _id, **kwargs)
|
||||
|
||||
def register_source(self, _id: str, **kwargs):
|
||||
self._register("source", _id, **kwargs)
|
||||
|
||||
def register_color(self, _id: str, **kwargs):
|
||||
self._register("color", _id, **kwargs)
|
||||
|
||||
def register_card(self, _id: str, **kwargs):
|
||||
self._register("card", _id, **kwargs)
|
||||
|
||||
def iter_cards(self) -> Iterator:
|
||||
for cid, card in self.data["card"].items():
|
||||
yield Card(
|
||||
global_id=card["gid"],
|
||||
card_id=cid,
|
||||
name=card["n"],
|
||||
type=self._retrieve_property("type", card["t"]),
|
||||
color=self._retrieve_property("color", card["col"]),
|
||||
source=self._retrieve_property("source", card["cs"]),
|
||||
rarity=self._retrieve_property("rarity", card["r"]),
|
||||
image_url=card["iu"],
|
||||
alternate_art=card["al"],
|
||||
)
|
|
@ -0,0 +1,20 @@
|
|||
from notion_client import Client
|
||||
|
||||
|
||||
class NotionClient:
|
||||
client: Client
|
||||
|
||||
def __init__(self, token: str):
|
||||
self.client = Client(auth=token)
|
||||
|
||||
def get_database_state(self, database_id: str):
|
||||
return self.client.databases.query(database_id=database_id)
|
||||
|
||||
def update_card(self, page_id: str, **kwargs):
|
||||
pass
|
||||
# return self.client.databases.update(page_id, **kwargs)
|
||||
|
||||
def create_card(self, database_id: str, **kwargs):
|
||||
return self.client.pages.create(
|
||||
parent={"database_id": database_id}, properties=kwargs
|
||||
)
|
|
@ -0,0 +1,154 @@
|
|||
[[package]]
|
||||
name = "anyio"
|
||||
version = "3.6.1"
|
||||
description = "High level compatibility layer for multiple asynchronous event loop implementations"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6.2"
|
||||
|
||||
[package.dependencies]
|
||||
idna = ">=2.8"
|
||||
sniffio = ">=1.1"
|
||||
|
||||
[package.extras]
|
||||
trio = ["trio (>=0.16)"]
|
||||
test = ["uvloop (>=0.15)", "mock (>=4)", "uvloop (<0.15)", "contextlib2", "trustme", "pytest-mock (>=3.6.1)", "pytest (>=7.0)", "hypothesis (>=4.0)", "coverage[toml] (>=4.5)"]
|
||||
doc = ["sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme", "packaging"]
|
||||
|
||||
[[package]]
|
||||
name = "certifi"
|
||||
version = "2022.6.15"
|
||||
description = "Python package for providing Mozilla's CA Bundle."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[[package]]
|
||||
name = "h11"
|
||||
version = "0.12.0"
|
||||
description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[[package]]
|
||||
name = "httpcore"
|
||||
version = "0.15.0"
|
||||
description = "A minimal low-level HTTP client."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
|
||||
[package.dependencies]
|
||||
anyio = ">=3.0.0,<4.0.0"
|
||||
certifi = "*"
|
||||
h11 = ">=0.11,<0.13"
|
||||
sniffio = ">=1.0.0,<2.0.0"
|
||||
|
||||
[package.extras]
|
||||
socks = ["socksio (>=1.0.0,<2.0.0)"]
|
||||
http2 = ["h2 (>=3,<5)"]
|
||||
|
||||
[[package]]
|
||||
name = "httpx"
|
||||
version = "0.23.0"
|
||||
description = "The next generation HTTP client."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
|
||||
[package.dependencies]
|
||||
certifi = "*"
|
||||
httpcore = ">=0.15.0,<0.16.0"
|
||||
rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]}
|
||||
sniffio = "*"
|
||||
|
||||
[package.extras]
|
||||
socks = ["socksio (>=1.0.0,<2.0.0)"]
|
||||
http2 = ["h2 (>=3,<5)"]
|
||||
cli = ["pygments (>=2.0.0,<3.0.0)", "rich (>=10,<13)", "click (>=8.0.0,<9.0.0)"]
|
||||
brotli = ["brotli", "brotlicffi"]
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "3.3"
|
||||
description = "Internationalized Domain Names in Applications (IDNA)"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.5"
|
||||
|
||||
[[package]]
|
||||
name = "notion-client"
|
||||
version = "1.0.0"
|
||||
description = "Python client for the official Notion API"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7, <4"
|
||||
|
||||
[package.dependencies]
|
||||
httpx = ">=0.15.0"
|
||||
|
||||
[[package]]
|
||||
name = "rfc3986"
|
||||
version = "1.5.0"
|
||||
description = "Validating URI References per RFC 3986"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
|
||||
[package.dependencies]
|
||||
idna = {version = "*", optional = true, markers = "extra == \"idna2008\""}
|
||||
|
||||
[package.extras]
|
||||
idna2008 = ["idna"]
|
||||
|
||||
[[package]]
|
||||
name = "sniffio"
|
||||
version = "1.2.0"
|
||||
description = "Sniff out which async library your code is running under"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.5"
|
||||
|
||||
[metadata]
|
||||
lock-version = "1.1"
|
||||
python-versions = "^3.10"
|
||||
content-hash = "53b08cfaa30a0b0ae66def96123c4fe2df15f759bf72130c56ff94fb7d0fbb00"
|
||||
|
||||
[metadata.files]
|
||||
anyio = [
|
||||
{file = "anyio-3.6.1-py3-none-any.whl", hash = "sha256:cb29b9c70620506a9a8f87a309591713446953302d7d995344d0d7c6c0c9a7be"},
|
||||
{file = "anyio-3.6.1.tar.gz", hash = "sha256:413adf95f93886e442aea925f3ee43baa5a765a64a0f52c6081894f9992fdd0b"},
|
||||
]
|
||||
certifi = [
|
||||
{file = "certifi-2022.6.15-py3-none-any.whl", hash = "sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412"},
|
||||
{file = "certifi-2022.6.15.tar.gz", hash = "sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d"},
|
||||
]
|
||||
h11 = [
|
||||
{file = "h11-0.12.0-py3-none-any.whl", hash = "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6"},
|
||||
{file = "h11-0.12.0.tar.gz", hash = "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042"},
|
||||
]
|
||||
httpcore = [
|
||||
{file = "httpcore-0.15.0-py3-none-any.whl", hash = "sha256:1105b8b73c025f23ff7c36468e4432226cbb959176eab66864b8e31c4ee27fa6"},
|
||||
{file = "httpcore-0.15.0.tar.gz", hash = "sha256:18b68ab86a3ccf3e7dc0f43598eaddcf472b602aba29f9aa6ab85fe2ada3980b"},
|
||||
]
|
||||
httpx = [
|
||||
{file = "httpx-0.23.0-py3-none-any.whl", hash = "sha256:42974f577483e1e932c3cdc3cd2303e883cbfba17fe228b0f63589764d7b9c4b"},
|
||||
{file = "httpx-0.23.0.tar.gz", hash = "sha256:f28eac771ec9eb4866d3fb4ab65abd42d38c424739e80c08d8d20570de60b0ef"},
|
||||
]
|
||||
idna = [
|
||||
{file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"},
|
||||
{file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"},
|
||||
]
|
||||
notion-client = [
|
||||
{file = "notion-client-1.0.0.tar.gz", hash = "sha256:281b37a1512abeccb81377d4a3461833f1c1fbd0ceb6e681e38b7cd446bf1bce"},
|
||||
{file = "notion_client-1.0.0-py2.py3-none-any.whl", hash = "sha256:01b3dfba071b5d09b6bdef2950624b7f000da2ece851c133ccf40815c4db167b"},
|
||||
]
|
||||
rfc3986 = [
|
||||
{file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"},
|
||||
{file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"},
|
||||
]
|
||||
sniffio = [
|
||||
{file = "sniffio-1.2.0-py3-none-any.whl", hash = "sha256:471b71698eac1c2112a40ce2752bb2f4a4814c22a54a3eed3676bc0f5ca9f663"},
|
||||
{file = "sniffio-1.2.0.tar.gz", hash = "sha256:c4666eecec1d3f50960c6bdf61ab7bc350648da6c126e3cf6898d8cd4ddcd3de"},
|
||||
]
|
|
@ -0,0 +1,15 @@
|
|||
[tool.poetry]
|
||||
name = "onepiece-tcg-notion-importer"
|
||||
version = "0.1.0"
|
||||
description = "Python script to update a notion database with the information from onepiece-cardgame.dev"
|
||||
authors = ["Felipe Martin <me@fmartingr.com>"]
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.10"
|
||||
notion-client = "^1.0.0"
|
||||
|
||||
[tool.poetry.dev-dependencies]
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core>=1.0.0"]
|
||||
build-backend = "poetry.core.masonry.api"
|
77
types.go
77
types.go
|
@ -1,77 +0,0 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"time"
|
||||
)
|
||||
|
||||
type isoDate struct {
|
||||
time.Time
|
||||
}
|
||||
|
||||
func (d *isoDate) UnmarshalJSON(b []byte) error {
|
||||
var s string
|
||||
if err := json.Unmarshal(b, &s); err != nil {
|
||||
return err
|
||||
}
|
||||
t, _ := time.Parse("2006-01-02", s)
|
||||
d.Time = t
|
||||
return nil
|
||||
}
|
||||
func (d isoDate) MarshalJSON() ([]byte, error) {
|
||||
return json.Marshal(d.Format("2006-01-02"))
|
||||
}
|
||||
|
||||
// {"src_id":"0","name":"TBD","intl":"0","release_date":null,"imageURL":"","t":"0","filter":""}
|
||||
type source struct {
|
||||
SourceID string `json:"src_id"`
|
||||
Name string `json:"name"`
|
||||
International string `json:"intl"`
|
||||
ReleaseDate isoDate `json:"release_date"`
|
||||
ImageURL string `json:"image_url"`
|
||||
T string `json:"t"`
|
||||
Filter string `json:"filter"`
|
||||
}
|
||||
|
||||
/* {
|
||||
"gid": "47",
|
||||
"cid": "OP01-047",
|
||||
"n": "Trafalgar Law",
|
||||
"t": "2",
|
||||
"col": "7",
|
||||
"cs": "5",
|
||||
"tr": "Supernovas\/ Heart Pirates",
|
||||
"a": "1",
|
||||
"p": "6000",
|
||||
"cp": null,
|
||||
"l": null,
|
||||
"r": "5",
|
||||
"ar": null,
|
||||
"iu": "https:\/\/onepiece-cardgame.dev\/images\/cards\/OP01-047_616aca_jp.jpg",
|
||||
"e": "<Blocker>\r\n[On Play] You may return one of your Characters to your hand: Play 1 Cost 3 or lower Character Card from your hand.",
|
||||
"al": null,
|
||||
"intl": "0",
|
||||
"srcN": "Romance Dawn [OP-01]",
|
||||
"srcD": null
|
||||
} */
|
||||
type card struct {
|
||||
GlobalID string `json:"gid"`
|
||||
CardID string `json:"cid"`
|
||||
Name string `json:"n"`
|
||||
Type string `json:"t"`
|
||||
Color string `json:"col"`
|
||||
Source string `json:"cs"`
|
||||
Tr string `json:"tr"`
|
||||
AttackType string `json:"a"`
|
||||
P string `json:"p"`
|
||||
Cp string `json:"cp"`
|
||||
L interface{} `json:"l"`
|
||||
Rarity string `json:"r"`
|
||||
Ar string `json:"ar"`
|
||||
ImageURL string `json:"iu"`
|
||||
E string `json:"e"`
|
||||
Al interface{} `json:"al"`
|
||||
International string `json:"intl"`
|
||||
SourceName string `json:"srcN"`
|
||||
SrcD interface{} `json:"srcD"`
|
||||
}
|
Loading…
Reference in New Issue