1
0
forked from a/lifeto-shop
lifeto-shop/src/lib/lifeto/lifeto.ts

135 lines
3.8 KiB
TypeScript
Raw Normal View History

2025-06-20 05:41:10 +00:00
import { AxiosResponse, Method } from 'axios'
import log from 'loglevel'
import { bank_endpoint, EndpointCreator, market_endpoint, Session } from '../session'
import { TricksterAccount, TricksterInventory, TricksterItem } from '../trickster'
import { BankEndpoint, LTOApi } from './api'
2022-07-06 07:48:11 +00:00
2025-06-20 05:41:10 +00:00
export const pathIsBank = (path: string): boolean => {
if (path.includes('/')) {
2022-08-10 01:39:44 +00:00
return false
2022-07-07 07:54:36 +00:00
}
2022-08-10 01:39:44 +00:00
return true
2022-07-07 07:54:36 +00:00
}
2025-06-20 05:41:10 +00:00
export const splitPath = (path: string): [string, string] => {
const spl = path.split('/')
switch (spl.length) {
2022-07-07 07:54:36 +00:00
case 1:
2025-06-20 05:41:10 +00:00
return [spl[0], '']
2022-07-07 07:54:36 +00:00
case 2:
2025-06-20 05:41:10 +00:00
return [spl[0], spl[1]]
2022-07-07 07:54:36 +00:00
}
2025-06-20 05:41:10 +00:00
return ['', '']
2022-07-07 07:54:36 +00:00
}
2022-07-06 07:48:11 +00:00
export class LTOApiv0 implements LTOApi {
s: Session
2025-06-20 05:41:10 +00:00
constructor(s: Session) {
2022-07-06 07:48:11 +00:00
this.s = s
}
2022-07-07 07:54:36 +00:00
2025-06-20 05:41:10 +00:00
BankAction = async <T, D>(e: BankEndpoint, t: T): Promise<D> => {
let VERB: Method | 'POSTFORM' = 'POST'
let endpoint: EndpointCreator = bank_endpoint
switch (e) {
case 'buy-from-order':
case 'cancel-order':
2022-08-10 01:39:44 +00:00
endpoint = market_endpoint
2025-06-20 05:41:10 +00:00
case 'sell-item':
VERB = 'POSTFORM'
2022-08-10 01:39:44 +00:00
default:
}
2025-06-20 05:41:10 +00:00
return this.s.request(VERB as any, e, t, endpoint).then(x => {
return x.data
})
2022-07-07 07:54:36 +00:00
}
2025-06-20 05:41:10 +00:00
GetInventory = async (char_path: string): Promise<TricksterInventory> => {
if (char_path.startsWith(':')) {
char_path = char_path.replace(':', '')
2022-07-06 07:48:11 +00:00
}
2025-06-20 05:41:10 +00:00
const type = char_path.includes('/') ? 'char' : 'account'
return this.s
.request('GET', `v3/item-manager/items/${type}/${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)) {
const [char, val] = Object.entries(o.characters)[0] as [string, any]
name = val.name
id = Number(char)
galders = 0
} else {
const [char, val] = Object.entries(o.characters)[0] as [string, any]
name = val.name
id = Number(char)
galders = val.galders
}
const out: TricksterInventory = {
account_name: o.account.account_gid,
account_id: o.account.account_code,
name,
id,
path: char_path,
galders,
items: new Map(
(Object.entries(o.items) as any).map(
([k, v]: [string, TricksterItem]): [string, TricksterItem] => {
v.unique_id = Number(k)
v.id = k
return [k, v]
},
),
),
}
return out
})
2022-07-06 07:48:11 +00:00
}
2025-06-20 05:41:10 +00:00
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): TricksterAccount => {
2022-07-06 07:48:11 +00:00
return {
name: x.name,
2024-08-12 01:13:42 +00:00
characters: [
2025-06-20 05:41:10 +00:00
{
account_name: x.name,
id: x.id,
account_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) => {
2024-08-12 01:13:42 +00:00
return {
2025-06-20 05:41:10 +00:00
account_name: x.name,
2024-08-12 01:13:42 +00:00
account_id: x.id,
id: z.id,
name: z.name,
2025-06-20 05:41:10 +00:00
path: `${x.name}/${z.name}`,
2024-08-12 01:13:42 +00:00
class: z.class,
base_job: z.base_job,
current_job: z.current_job,
}
2025-06-20 05:41:10 +00:00
}),
],
2024-08-12 01:13:42 +00:00
}
2022-07-06 07:48:11 +00:00
})
})
}
2025-06-20 05:41:10 +00:00
GetLoggedin = async (): Promise<boolean> => {
return this.s.request('POST', 'accounts/list', undefined).then((ans: AxiosResponse) => {
if (ans.status === 401) {
2022-07-06 07:48:11 +00:00
return false
}
2025-06-20 05:41:10 +00:00
if (ans.status === 200) {
2022-07-06 07:48:11 +00:00
return true
}
return false
})
}
}