lifeto-shop/src/lib/lifeto/lifeto.ts
2022-07-07 02:54:36 -05:00

100 lines
2.8 KiB
TypeScript

import { Axios, AxiosResponse } from "axios"
import log from "loglevel"
import { bank_endpoint, Session } from "../session"
import { dummyChar, TricksterAccount, TricksterInventory, TricksterItem, TricksterWallet } from "../trickster"
import { BankEndpoint, LTOApi } from "./api"
export const pathIsBank = (path:string):boolean => {
if(!path.includes("/")) {
return true
}
return false
}
export const splitPath = (path:string):[string,string]=>{
const spl = path.split("/")
switch(spl.length) {
case 1:
return [spl[0], ""]
case 2:
return [spl[0],spl[1]]
}
return ["",""]
}
export class LTOApiv0 implements LTOApi {
s: Session
constructor(s:Session) {
this.s = s
}
BankAction = async <T,D>(e: BankEndpoint, t: T):Promise<D> => {
return this.s.request("POST",e,t,bank_endpoint).then((x)=>{
return x.data
})
}
GetInventory = async (char_path: string):Promise<TricksterInventory> =>{
if(char_path.startsWith(":")) {
char_path = char_path.replace(":","")
}
return this.s.request("GET", `item-manager/items/account/${char_path}`,undefined).then((ans:AxiosResponse)=>{
const o = ans.data
log.debug("GetInventory", o)
let name = "bank"
let id = 0
let galders = 0
if(pathIsBank("char_path")){
let [char, val] = Object.entries(o.characters)[0] as [string,any]
name = val.name
id = Number(char)
galders = val.galders as number
}else {
id = o.id
name = o.name
galders = o.galders
}
let out = {
name,
id,
path: char_path,
galders,
items: Object.fromEntries((Object.entries(o.items) as any).map(([k, v]: [string, TricksterItem]):[string, TricksterItem]=>{
v.unique_id = Number(k)
return [k, v]
})),
} as TricksterInventory
return out
})
}
GetAccounts = async ():Promise<TricksterAccount[]> => {
return this.s.request("GET", "characters/list",undefined).then((ans:AxiosResponse)=>{
log.debug("GetAccounts", ans.data)
return ans.data.map((x:any)=>{
return {
name: x.name,
characters: [{id: x.id, path:x.name, name: x.name+'/bank', class:-8, base_job: -8, current_job: -8},...Object.values(x.characters).map((z:any)=>{
return {
id: z.id,
name: z.name,
path: x.name+"/"+z.name,
class: z.class,
base_job: z.base_job,
current_job: z.current_job,
}
})],
} as TricksterAccount
})
})
}
GetLoggedin = async ():Promise<boolean> => {
return this.s.request("POST", "accounts/list",undefined).then((ans:AxiosResponse)=>{
if(ans.status == 401) {
return false
}
if(ans.status == 200) {
return true
}
return false
})
}
}