From 11fdf247bacdd1f6db9395bf0059cf7bf2865005 Mon Sep 17 00:00:00 2001 From: yuko1101 <68993883+yuko1101@users.noreply.github.com> Date: Thu, 1 Jun 2023 09:18:19 +0900 Subject: [PATCH] Throws MihomoError in StarRail#fetchUser --- .vscode/settings.json | 1 + CHANGELOG.md | 1 + src/client/StarRail.ts | 18 ++++++++++++++++++ src/errors/InvalidUidFormatError.ts | 22 ++++++++++++++++++++++ src/errors/MihomoError.ts | 14 ++++++++++++++ src/errors/RequestError.ts | 6 ++++-- src/errors/UserNotFoundError.ts | 22 ++++++++++++++++++++++ src/index.ts | 11 ++++++++++- src/models/User.ts | 1 - 9 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 src/errors/InvalidUidFormatError.ts create mode 100644 src/errors/MihomoError.ts create mode 100644 src/errors/UserNotFoundError.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index fe93a0f..e84b93c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,7 @@ { "cSpell.words": [ "autodrain", + "Mihomo", "starfaring", "starrail", "Trailblaze", diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a717fe..df5800f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # 0.3.1 - Added CharacterData#eidolons and Eidolon class. - Added CharacterData#skillTreeNodes. +- Throws MihomoError if an error occurs when requesting with StarRail#fetchUser. # 0.3.0 - Added StarRail#fetchUser. - Renamed RelicSubStat to RelicSubStatData. diff --git a/src/client/StarRail.ts b/src/client/StarRail.ts index eba3c36..597d7d1 100644 --- a/src/client/StarRail.ts +++ b/src/client/StarRail.ts @@ -7,6 +7,9 @@ import RelicData from "../models/relic/RelicData"; import { fetchJSON } from "../utils/axios_utils"; import RequestError from "../errors/RequestError"; import User from "../models/User"; +import InvalidUidFormatError from "../errors/InvalidUidFormatError"; +import UserNotFoundError from "../errors/UserNotFoundError"; +import MihomoError from "../errors/MihomoError"; const defaultImageBaseUrls: ImageBaseUrl[] = []; @@ -49,6 +52,7 @@ class StarRail { /** * @param uid + * @throws {MihomoError} */ async fetchUser(uid: number | string): Promise { if (isNaN(Number(uid))) throw new Error("Parameter `uid` must be a number or a string number."); @@ -60,6 +64,20 @@ class StarRail { if (response.status !== 200) { throw new RequestError(`Request failed with unknown status code ${response.status} - ${response.statusText}\nRequest url: ${url}`, response.status, response.statusText); + } else if (response.data["detail"]) { + switch (response.data["detail"]) { + case "Invalid uid": + throw new InvalidUidFormatError(Number(uid)); + default: + throw new MihomoError(`Unknown error occurred. Error: ${response.data["detail"]}`); + } + } else if (response.data["ErrCode"]) { + switch (response.data["ErrCode"]) { + case 3612: + throw new UserNotFoundError(Number(uid)); + default: + throw new MihomoError(`Unknown error occurred. ErrorCode: ${response.data["ErrCode"]}`); + } } return new User({ ...response.data }, this); diff --git a/src/errors/InvalidUidFormatError.ts b/src/errors/InvalidUidFormatError.ts new file mode 100644 index 0000000..2bba05b --- /dev/null +++ b/src/errors/InvalidUidFormatError.ts @@ -0,0 +1,22 @@ +import MihomoError from "./MihomoError"; + +/** + * @en InvalidUidFormatError + * @extends {MihomoError} + */ +class InvalidUidFormatError extends MihomoError { + /** */ + readonly uid: number; + + /** + * @param uid + */ + constructor(uid: number) { + super(`Invalid uid format. (${uid} provided.)`); + + this.name = "InvalidUidFormatError"; + this.uid = uid; + } +} + +export default InvalidUidFormatError; \ No newline at end of file diff --git a/src/errors/MihomoError.ts b/src/errors/MihomoError.ts new file mode 100644 index 0000000..fea66f3 --- /dev/null +++ b/src/errors/MihomoError.ts @@ -0,0 +1,14 @@ +/** + * @en MihomoError + * @extends {Error} + */ +class MihomoError extends Error { + /** + * @param message + */ + constructor(message: string) { + super(message); + } +} + +export default MihomoError; \ No newline at end of file diff --git a/src/errors/RequestError.ts b/src/errors/RequestError.ts index 026982e..61f998d 100644 --- a/src/errors/RequestError.ts +++ b/src/errors/RequestError.ts @@ -1,8 +1,10 @@ +import MihomoError from "./MihomoError"; + /** * @en RequestError - * @extends {Error} + * @extends {MihomoError} */ -class RequestError extends Error { +class RequestError extends MihomoError { /** HTTP response status code */ readonly statusCode: number; /** The message of the status code */ diff --git a/src/errors/UserNotFoundError.ts b/src/errors/UserNotFoundError.ts new file mode 100644 index 0000000..f639fdd --- /dev/null +++ b/src/errors/UserNotFoundError.ts @@ -0,0 +1,22 @@ +import MihomoError from "./MihomoError"; + +/** + * @en UserNotFoundError + * @extends {MihomoError} + */ +class UserNotFoundError extends MihomoError { + /** */ + readonly uid: number; + + /** + * @param uid + */ + constructor(uid: number) { + super(`The user with uid ${uid} was not found.`); + + this.name = "UserNotFoundError"; + this.uid = uid; + } +} + +export default UserNotFoundError; \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 6e70b93..3f555f7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,13 +2,17 @@ import CachedAssetsManager from "./client/CachedAssetsManager"; import ObjectKeysManager from "./client/ObjectKeysManager"; import StarRail from "./client/StarRail"; import AssetsNotFoundError from "./errors/AssetsNotFoundError"; +import InvalidUidFormatError from "./errors/InvalidUidFormatError"; +import MihomoError from "./errors/MihomoError"; import RequestError from "./errors/RequestError"; +import UserNotFoundError from "./errors/UserNotFoundError"; import ImageAssets from "./models/assets/ImageAssets"; import TextAssets from "./models/assets/TextAssets"; import LeveledSkill from "./models/character/skill/LeveledSkill"; import Skill from "./models/character/skill/Skill"; import Character from "./models/character/Character"; import CharacterData from "./models/character/CharacterData"; +import Eidolon from "./models/character/Eidolon"; import LightCone from "./models/light_cone/LightCone"; import LightConeData from "./models/light_cone/LightConeData"; import LightConeExpType from "./models/light_cone/LightConeExpType"; @@ -31,13 +35,17 @@ export { ObjectKeysManager, StarRail, AssetsNotFoundError, + InvalidUidFormatError, + MihomoError, RequestError, + UserNotFoundError, ImageAssets, TextAssets, LeveledSkill, Skill, Character, CharacterData, + Eidolon, LightCone, LightConeData, LightConeExpType, @@ -72,4 +80,5 @@ export { StatPropertyType } from "./models/StatProperty"; export { Birthday } from "./models/User"; // functions -export { fetchJSON } from "./utils/axios_utils"; \ No newline at end of file +export { fetchJSON } from "./utils/axios_utils"; +export { getStableHash } from "./utils/hash_utils"; \ No newline at end of file diff --git a/src/models/User.ts b/src/models/User.ts index 1e6a847..40a7641 100644 --- a/src/models/User.ts +++ b/src/models/User.ts @@ -65,7 +65,6 @@ class User { this._data = data; - // TODO: error handling (e.g. user does not exist) const json = new JsonReader(this._data); const playerDetailInfo = json.get("PlayerDetailInfo");