Compare commits

...

18 Commits

Author SHA1 Message Date
739fe92eae v1.4.1 2020-04-24 23:34:17 +02:00
8b8c20308f v1.4.0 2020-03-25 15:52:36 +01:00
b1dcd5ae5e Fixed warning for translations
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2020-03-25 15:50:24 +01:00
e9d6ac12e1 Added a default Language setting for global lang
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2020-03-25 15:50:08 +01:00
5ac1a18f6f Updated sdk to 1.3.0
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2020-03-18 09:54:20 +01:00
624337467b v1.3.0 2020-03-18 09:54:05 +01:00
eb96cb971c v1.2.1 2020-03-14 20:08:22 +01:00
9902888304 Fix datas not in interface
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2020-03-14 20:08:00 +01:00
2f1a293e3d v1.2.0 2020-03-14 20:00:43 +01:00
04d13bd450 Updated DB to add items
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2020-03-14 19:56:59 +01:00
a886302e05 v1.2.0-beta.1 2020-03-11 23:08:33 +01:00
75bc7249f1 Updated DB
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2020-03-11 23:05:27 +01:00
00316364fa fix error
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2020-03-11 21:59:31 +01:00
3cdc149845 Add new functions
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2020-03-11 21:57:40 +01:00
d0088d62cb Fix translation not getting the correct file
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2020-03-11 11:45:20 +01:00
405cd8542a v1.0.8 2020-03-11 11:14:52 +01:00
53afc67b72 Updated Interfaces
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2020-03-11 11:02:24 +01:00
593b17b55f v1.0.7 2020-03-11 11:01:12 +01:00
12 changed files with 232 additions and 57 deletions

51
Request.ts Normal file
View File

@ -0,0 +1,51 @@
import fetch from 'isomorphic-unfetch'
export default class RequestWrapper {
private static cache: Array<Request<any>> = []
public static getRequest<T>(url: string) {
let req = this.cache.find((req) => req.url === url) as Request<T>|undefined
if (!req) {
req = new Request<T>(url)
this.cache.push(req)
}
return req
}
}
export class Request<T = any> {
public static ttl = 1000 * 60 * 60 // 1 hour
private response?: T
private fetched?: Date
public url: string // url is public for quick url test
public constructor(url: string) {
this.url = url
}
public async get(): Promise<T> {
const now = new Date()
if (
this.fetched &&
this.response &&
now.getTime() - this.fetched.getTime() < Request.ttl
) {
return this.response
}
// Fetch Response
try {
const resp = await fetch(this.url)
if (resp.status !== 200) {
throw new Error(`Error request ended with the code (${resp.status})`)
}
const response = await resp.json()
this.response = response
this.fetched = now
return response
} catch (e) {
console.error(e)
throw new Error('An error occured')
}
}
}

View File

@ -5,6 +5,12 @@ import Rarity from "./interfaces/Rarity";
import Tag from "./interfaces/Tag"; import Tag from "./interfaces/Tag";
import Type from "./interfaces/Type"; import Type from "./interfaces/Type";
import atTrans from './translations/abilityType'
import cTrans from './translations/category'
import rTrans from './translations/rarity'
import taTrans from './translations/tag'
import tyTrans from './translations/type'
type possibilities = "abilityType" | "category" | "rarity" | "tag" | "type" type possibilities = "abilityType" | "category" | "rarity" | "tag" | "type"
export default class TranslationUtil { export default class TranslationUtil {
@ -14,8 +20,31 @@ export default class TranslationUtil {
public static translate(master: "tag",a: Tag, lang: Langs): string|undefined; public static translate(master: "tag",a: Tag, lang: Langs): string|undefined;
public static translate(master: "type",a: Type, lang: Langs): string|undefined; public static translate(master: "type",a: Type, lang: Langs): string|undefined;
public static translate(master: possibilities,a: number, lang: Langs): string|undefined { public static translate(master: possibilities,a: number, lang: Langs): string|undefined {
const trans = require(`./${master}`).default as translations let langlist: LangList<Array<string>>|undefined
const tmp = trans[lang] switch (master) {
case 'abilityType':
langlist = atTrans
break
case 'category':
langlist = cTrans
break
case 'rarity':
langlist = rTrans
break
case 'tag':
langlist = taTrans
break
case 'type':
langlist = tyTrans
break
default:
break;
}
if (!langlist) return
const tmp = langlist[lang]
if (!tmp) return if (!tmp) return
return tmp[a] return tmp[a]
} }

View File

@ -3,6 +3,12 @@ export interface AbilityTypeSimple {
name: string name: string
} }
export type AbilityTypeSingle = {
id: AbilityType
name: string
cards: string
}
enum AbilityType { enum AbilityType {
POKEBODY, POKEBODY,
POKEPOWER, POKEPOWER,

View File

@ -11,6 +11,7 @@ import Set from "./Set";
export interface CardSimple { export interface CardSimple {
id: string id: string
localId: string|number
name: string name: string
image: string image: string
} }
@ -32,16 +33,19 @@ export interface CardSingle {
name: string name: string
code: string code: string
} }
cardTypes?: {
normal: boolean /**
reverse: boolean * Some Pokémons have item like a berry
holo: boolean */
firstEd: boolean item?: {
name: string
effect: string
} }
// Pokémon only // Pokémon only
hp?: number hp?: number
dexId?: number dexId?: number
lvl?: number
type?: Array<TypeSimple> type?: Array<TypeSimple>
evolveFrom?: string evolveFrom?: string
evolveTo?: Array<string> evolveTo?: Array<string>
@ -95,6 +99,11 @@ type Card = {
// If card is trainer or energy effect is here // If card is trainer or energy effect is here
effect?: LangList<string> effect?: LangList<string>
item?: {
name: LangList<string>
effect: LangList<string>
}
weaknesses?: Array<{ weaknesses?: Array<{
type: Type type: Type
value?: string value?: string

View File

@ -1,4 +1,5 @@
import { CardSimple } from "./Card"; import { CardSimple } from "./Card";
import { List } from "./General";
export type IllustratorSingle = { export type IllustratorSingle = {
id: number, id: number,
@ -11,10 +12,7 @@ export interface IllustratorSimple {
name: string name: string
} }
export interface IllustratorsList { export type IllustratorsList = List<IllustratorSimple>
count: number
list: Array<IllustratorSimple>
}
interface Illustrator { interface Illustrator {
id: number id: number

View File

@ -1,3 +1,6 @@
import { List } from "./General"
import { CardSimple } from "./Card"
export enum Rarity { export enum Rarity {
Common, Common,
Uncommon, Uncommon,
@ -30,3 +33,11 @@ export interface RaritySimple {
id: Rarity id: Rarity
name: string name: string
} }
export type RaritySingle = {
id: Rarity
name: string
cards: Array<CardSimple>
}
export type RarityList = List<RaritySimple>

View File

@ -1,4 +1,5 @@
import { CardSimple } from "./Card"; import { CardSimple } from "./Card";
import { List } from "./General";
export type RetreatSimple = number export type RetreatSimple = number
@ -7,7 +8,4 @@ export interface RetreatSingle {
cards: Array<CardSimple> cards: Array<CardSimple>
} }
export interface RetreatList { export type RetreatList = List<RetreatSimple>
count: number,
list: Array<RetreatSimple>
}

View File

@ -36,6 +36,8 @@ export type SetSingle = {
export type SetSimple = { export type SetSimple = {
code: string code: string
name: string name: string
logo?: string
symbol?: string
total: number total: number
} }

View File

@ -1,5 +1,19 @@
import { List } from "./General"
import { CardSimple } from "./Card"
/**
* Anum of "Tags" each card can contains
*
* @enum {number}
*/
enum Tag { enum Tag {
/**
* basic pokémon
*/
BASIC, BASIC,
/**
* Basic Energy
*/
BASICENERGY, BASICENERGY,
BREAK, BREAK,
EX, EX,
@ -13,14 +27,44 @@ enum Tag {
SP, SP,
SPECIAL, SPECIAL,
STADIUM, STADIUM,
/**
* Stage 1 pokémon
*/
STAGE1, STAGE1,
/**
* Stage 2 Pokémon
*/
STAGE2, STAGE2,
SUPPORTER, SUPPORTER,
TAGTEAM, TAGTEAM,
TECHNICALMACHINE, TECHNICALMACHINE,
TOOL, TOOL,
/**
* V Pokémon
*/
V, V,
/**
* VMAX Pokémon
*/
VMAX, VMAX,
/**
* The card is available with the holographic picture
*/
HASHOLO,
/**
* Card can have a 1st badge
*/
HAS1ST,
/**
* Card is full art (art is not in the frame)
*/
ISFULLART,
} }
export default Tag export default Tag
@ -29,3 +73,11 @@ export interface TagSimple {
id: Tag id: Tag
name: string name: string
} }
export type TagSingle = {
id: Tag
name: string
cards: Array<CardSimple>
}
export type TagList = List<TagSimple>

View File

@ -1,3 +1,6 @@
import { List } from "./General"
import { CardSimple } from "./Card"
enum Type { enum Type {
COLORLESS, COLORLESS,
DARKNESS, DARKNESS,
@ -17,4 +20,12 @@ export interface TypeSimple {
name: string name: string
} }
export type TypeSingle = {
id: Type
name: string
cards: Array<CardSimple>
}
export type TypeList = List<TypeSimple>
export default Type export default Type

View File

@ -1,8 +1,8 @@
{ {
"name": "@tcgdex/sdk", "name": "@tcgdex/sdk",
"version": "1.0.6", "version": "1.4.1",
"main": "./tcgdex.js", "main": "./tcgdex.js",
"types": "./types/tcgdex.d.ts", "types": "./tcgdex.d.ts",
"repository": "https://git.delta-wings.net/tcgdex/javascript-sdk.git", "repository": "https://git.delta-wings.net/tcgdex/javascript-sdk.git",
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {

View File

@ -1,18 +1,24 @@
import fetch from 'isomorphic-unfetch'
import { Langs } from './interfaces/Langs' import { Langs } from './interfaces/Langs'
import { SetSingle, SetRequest } from './interfaces/Set' import { SetSingle, SetSimple, SetList } from './interfaces/Set'
import { CardSingle } from './interfaces/Card' import { CardSingle, CardList, CardSimple } from './interfaces/Card'
import { ExpansionSingle } from './interfaces/Expansion' import { ExpansionSingle, ExpansionList } from './interfaces/Expansion'
import RequestWrapper from './Request'
export default class TCGdex { export default class TCGdex {
public lang: Langs = "en" public static defaultLang: Langs = "en"
public lang?: Langs
public constructor(lang?: Langs) { public constructor(lang?: Langs) {
if (lang) this.lang = lang if (lang) this.lang = lang
} }
public getLang() {
return this.lang || TCGdex.defaultLang
}
private getBaseUrl() { private getBaseUrl() {
return `https://api.tcgdex.net/${this.lang}` return `https://api.tcgdex.net/${this.getLang()}`
} }
private gbu() { private gbu() {
@ -22,47 +28,49 @@ export default class TCGdex {
public async getCard(id: string|number, set: string): Promise<CardSingle>; public async getCard(id: string|number, set: string): Promise<CardSingle>;
public async getCard(id: string): Promise<CardSingle>; public async getCard(id: string): Promise<CardSingle>;
public async getCard(id: string|number, set?: string): Promise<CardSingle> { public async getCard(id: string|number, set?: string): Promise<CardSingle> {
try { const txt = set ? `sets/${set}` : "cards"
const txt = set ? `sets/${set}` : "cards" const req = this.rwgr<CardSingle>(`${this.gbu()}/${txt}/${id}/`)
const resp = await fetch(`${this.gbu()}/${txt}/${id}`) return req.get()
if (resp.status !== 200) throw new Error("Card not found") }
try {
return await resp.json() public async getCards(set?: string): Promise<Array<CardSimple>> {
} catch (e) { if (set) {
throw e const setSingle = await this.getSet(set)
} return setSingle.list
} catch (e) {
throw e
} }
console.warn("note: while it's possible to fetch every cards at once it's not recommended as it take much more time than any other requests")
const req = this.rwgr<CardList>(`${this.gbu()}/cards/`)
const resp = await req.get()
return resp.list
} }
public async getSet(set: string): Promise<SetSingle> { public async getSet(set: string): Promise<SetSingle> {
try { const req = this.rwgr<SetSingle>(`${this.gbu()}/sets/${set}/`)
const resp = await fetch(`${this.gbu()}/sets/${set}`) const resp = await req.get()
console.log(resp.status) return Object.assign(resp, {releaseDate: new Date(resp.releaseDate)}) as SetSingle
if (resp.status !== 200) throw new Error("Set not found")
try {
const setTmp: SetRequest = await resp.json();
return Object.assign(setTmp, {releaseDate: new Date(setTmp.releaseDate)}) as SetSingle
} catch (e) {
throw e
}
} catch (e) {
throw e
}
} }
public async getExpansion(expansion: string): Promise<ExpansionSingle> { public async getExpansion(expansion: string): Promise<ExpansionSingle> {
try { const req = this.rwgr<ExpansionSingle>(`${this.gbu()}/expansions/${expansion}/`)
const resp = await fetch(`${this.gbu()}/expansions/${expansion}`) return req.get()
if (resp.status !== 200) throw new Error("Expansion not found") }
try {
return await resp.json() public async getExpansions(): Promise<ExpansionList> {
} catch (e) { const req = this.rwgr<ExpansionList>(`${this.gbu()}/expansions/`)
throw e return req.get()
} }
} catch (e) {
throw e public async getSets(expansion?: string): Promise<Array<SetSimple>> {
if (expansion) {
const expansionSingle = await this.getExpansion(expansion)
return expansionSingle.sets
} }
const req = this.rwgr<SetList>(`${this.gbu()}/sets/`)
const list = await req.get()
return list.list
}
private rwgr<T>(url: string) {
return RequestWrapper.getRequest<T>(url)
} }
} }