UNPKG

@yuna0x0/anilist-node

Version:

A lightweight Node.js wrapper for the AniList API

156 lines (141 loc) 5.03 kB
const { TextActivityQuery, MessageActivityQuery, ListActivityQuery } = require("./consts"); /** * Access activities on AniList * @since 1.7.0 * @memberof AniList */ class Activity { /** * @description This constructor is meant for internal use and is apart of initializing. You cannot access this * through the AniList class and are not expect to. * @param { Utilities } utilities - The AniList Utilities class. * @hideconstructor */ constructor(utilities) { this.util = utilities; } /** * Get a specific AniList activity by its ID. * @param {Number} activityID The AniList activity ID * @returns { ListActivity | TextActivity | MessageActivity } Returns the activity information. Activity will either appear as: * {@link ListActivity}, {@link TextActivity}, {@link MessageActivity}. All of which are identifiable by the type key. * @since 1.7.0 */ get(activityID) { const queryVars = this.util.generateQueryHeaders("Activity", activityID); return this.util .send( queryVars[1] + `... on ListActivity { ${ListActivityQuery} } ... on TextActivity { ${TextActivityQuery} } ... on MessageActivity { ${MessageActivityQuery} }}}`, queryVars[0] ) .then((data) => { return data.Activity; }); } /** * Fetch activities from a user. * @param {Number} user - Required. Needs to be the user's AniList ID. * @param {Number} page - The page number to display * @param {Number} perPage - How many entries to display on one page. (Max is 25 per AniList limit) * @returns { Object[] } Returns a list of user activities based on the page & perPage values Contains any number of * {@link ListActivity}, {@link TextActivity}, {@link MessageActivity}. All of which are identifiable by the type key. * * @since 1.7.0 */ getUserActivity(user, page = 1, perPage = 25) { if (typeof user !== "number" || typeof page !== "number" || typeof perPage !== "number") { throw new Error("Term does not match the required type!"); } return this.util .send( `query ($page: Int, $perPage: Int, $user: Int) { Page (page: $page, perPage: $perPage) { pageInfo { total currentPage lastPage hasNextPage perPage } activities(userId: $user, sort:ID_DESC) { ... on ListActivity { ${ListActivityQuery} } ... on TextActivity { ${TextActivityQuery} } ... on MessageActivity { ${MessageActivityQuery} } } } }`, { user: user, page: page, perPage: perPage } ) .then((data) => { return data; }); } /** * [Require Login] Post a new text activity or update the activity with its ID * @param {String} text - The content of the activity. * @param {Number?} id - The AniList activity ID. Null to create, number for update * * @returns {TextActivity} * @since 1.11.0 */ async postText(text, id) { if (typeof text !== "string") { throw new Error("Text is not a string type."); } if (id && typeof id !== "number") { throw new Error("Provided ID is not a number type."); } const data = await this.util.send( `mutation ($id: Int, $text: String) { SaveTextActivity(id: $id, text: $text) { ${TextActivityQuery} } }`, { id: id, text: text } ); return data.SaveTextActivity; } /** * [Require Login] Post a new message activity or update the activity with its ID * @param {String} text - The activity message text * @param {Number} recipientId - The target user to send the message to * @param {Boolean} isPrivate - Set to true if it is a private message * @param {Number?} id - AniList Activity ID. Null to create, number to update. * * @returns {MessageActivity} * @since 1.11.0 */ async postMessage(text, recipientId, isPrivate = false, id) { if (typeof text !== "string") { throw new Error("Text is not a string type."); } if (typeof recipientId !== "number") { throw new Error("Recipient ID is not a number type."); } if (id && typeof id !== "number") { throw new Error("Provided ID is not a number type."); } const data = await this.util.send( `mutation ($id: Int, $text: String, $recipientId: Int, $private: Boolean) { SaveMessageActivity(message: $text, id: $id, recipientId: $recipientId, private: $private) { ${MessageActivityQuery} } }`, { id: id, text: text, recipientId: recipientId, private: isPrivate } ); return data.SaveMessageActivity; } /** * [Require Login] Delete the current authorized user's activity post * @param {Number} id - The AniList activity ID to delete * * @returns {Boolean} Returns true if successful * @since 1.11.0 */ async delete(id) { if (typeof id !== "number") { throw new Error("ID is not a number type."); } const data = await this.util.send(`mutation ($id: Int) { DeleteActivity(id: $id) { deleted } }`, { id: id }); return data.DeleteActivity.deleted; } } module.exports = Activity;