UNPKG

maplestory-openapi

Version:

This JavaScript library enables the use of the MapleStory OpenAPI of Nexon.

112 lines (109 loc) 3.8 kB
import axios, { AxiosError } from 'axios'; import dayjs from 'dayjs'; import timezone from '../../../node_modules/dayjs/plugin/timezone.js'; import utc from '../../../node_modules/dayjs/plugin/utc.js'; import { MapleStoryApiError } from './mapleStoryApiError.js'; dayjs.extend(timezone); dayjs.extend(utc); /** * MapleStory Friends API client. */ class MapleStoryFriendsApi { accessToken; client; static BASE_URL = 'https://open.api.nexon.com/'; static DEFAULT_TIMEOUT = 5000; get timeout() { return this.client.defaults.timeout; } set timeout(value) { this.client.defaults.timeout = value; } constructor(accessToken) { this.accessToken = accessToken; this.client = axios.create({ baseURL: MapleStoryFriendsApi.BASE_URL, timeout: MapleStoryFriendsApi.DEFAULT_TIMEOUT, headers: { 'Authorization': `Bearer ${this.accessToken}`, }, }); this.client.interceptors.response.use((response) => response, (error) => { if (error instanceof AxiosError) { const errorBody = error.response .data; throw new MapleStoryApiError(errorBody); } throw error; }); } /** * API 서버의 데이터 갱신 시간에 따라 데이터가 조회 가능한 최신 날짜를 반환합니다. * * @param options */ getProperDefaultDateOptions(options) { const { hour, minute, dateOffset } = options; const nowInTimezone = dayjs().utcOffset(this.timezoneOffset); const updateDate = dayjs().utcOffset(this.timezoneOffset).hour(hour).minute(minute); let adjustedDate; if (nowInTimezone.isAfter(updateDate)) { adjustedDate = nowInTimezone; } else { adjustedDate = nowInTimezone.subtract(1, 'day'); } adjustedDate = adjustedDate.subtract(dateOffset ?? 0, 'day'); return { year: adjustedDate.year(), month: adjustedDate.month() + 1, day: adjustedDate.date(), }; } ; /** * 날짜 정보를 API 서버에서 요구하는 포맷으로 변환합니다. * * @param dateOptions 조회 하려는 날짜 * @param minDateOptions API 호출 가능한 최소 날짜 */ toDateString(dateOptions, minDateOptions) { const convert = (dateOptions) => { let year; let month; let day; let d; if (dateOptions instanceof Date) { d = dayjs(dateOptions).utcOffset(this.timezoneOffset); year = d.year(); month = d.month() + 1; day = d.date(); } else { year = dateOptions.year; month = dateOptions.month; day = dateOptions.day; d = dayjs(`${year}-${month}-${day}`).utcOffset(this.timezoneOffset); } return { year, month, day, d, }; }; const { year, month, day, d } = convert(dateOptions); const str = d.format('YYYY-MM-DD'); if (minDateOptions) { const { year: minYear, month: minMonth, day: minDay, } = convert(minDateOptions); if (year < minYear || (year === minYear && month < minMonth) || (year === minYear && month === minMonth && day < minDay)) { throw new Error(`You can only retrieve data after ${dayjs(`${minYear}-${minMonth}-${minDay}`).format('YYYY-MM-DD')}.`); } } return str; } ; } export { MapleStoryFriendsApi };