jalter
Version:
A NodeJS wrapper for Discord Selfbot
348 lines • 23 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
const utils_1 = require("./src/utils");
const const_1 = __importDefault(require("./src/const"));
class Jalter {
base;
auth;
static default;
constructor(token) {
if (!token)
throw new Error(const_1.default.error.missingToken);
this.base = const_1.default.endpoint.baseurl;
this.auth = { "authorization": token };
/*
get(`${this.base}/users/@me`, this.auth).then(res => {
if (res.statusCode !== 200) throw new Error(c.error.invalidToken);
});
*/
}
/**
* Returns the user object of the requester's account.
* @returns the current user object
* @example
* ```js
* jalter.getMe().then((res) => { console.log("getMe", res); });
* ```
* https://discord.com/developers/docs/resources/user#get-current-user
*/
async getMe() {
const endpoint = `${this.base}/users/@me`;
return await (0, utils_1.request)(endpoint, this.auth, "GET").then(res => {
return res.body;
});
}
/**
* Returns a user object for a given user ID.
* @param {string} userId the user id
* @returns the user object
* @example
* ```js
* jalter.getUser("317255788324454400").then((res) => { console.log("getUser", res); });
* ```
* https://discord.com/developers/docs/resources/user#get-user
*/
async getUser(userId) {
const endpoint = `${this.base}/users/${userId}`;
return await (0, utils_1.request)(endpoint, this.auth, "GET").then(res => {
return res.body;
});
}
/**
* Post a message to a guild text or DM channel. Returns a message object
* @param {string} channelId the channel id
* @param {string} text the message text
* @returns the message object send
* @example
* ```js
* jalter.sendMessage("974918359500075041", "hey").then((res) => { console.log("sendMessage", res); });
* ```
* https://discord.com/developers/docs/resources/channel#create-message
*/
async sendMessage(channelId, text) {
const endpoint = `${this.base}/channels/${channelId}/messages`;
return await (0, utils_1.request)(endpoint, this.auth, "POST", { content: text }).then(res => {
return res.body;
});
}
/**
* Returns the messages for a channel.
* @param {string} channelId
* @param {number} limit
* @return the messages that were received
* @example
* ```js
* jalter.getMessages("974918359500075041", 10).then((res) => { console.log("getMessages", res); });
* ```
* https://discord.com/developers/docs/resources/channel#get-channel-messages
*/
async getMessage(channelId, limit) {
const endpoint = `${this.base}/channels/${channelId}/messages?limit=${limit}`;
return await (0, utils_1.request)(endpoint, this.auth, "GET").then(res => {
return res.body;
});
}
/**
* Returns an audit log object for the guild
* @param {string} guildId the guild id
* return the audit logs from related guild
* @example
* ```js
* jalter.getAuditLogs("974918359500075041").then((res) => { console.log("getAuditLogs", res); });
* ```
* https://discord.com/developers/docs/resources/audit-log#get-guild-audit-log
*/
async getAuditLogs(guildId) {
const endpoint = `${this.base}/guilds/${guildId}/audit-logs`;
return await (0, utils_1.request)(endpoint, this.auth, "GET").then(res => {
return res.body;
});
}
/**
* Returns a list of role objects for the guild.
* @param {string} guildId the guild id
* @returns the list of roles from related guild
* @example
* ```js
* jalter.getRoles("974918359500075041").then((res) => { console.log("getRoles", res); });
* ```
* https://discord.com/developers/docs/resources/guild#get-guild-roles
*/
async getRoles(guildId) {
const endpoint = `${this.base}/guilds/${guildId}/roles`;
return await (0, utils_1.request)(endpoint, this.auth, "GET").then(res => {
return res.body;
});
}
/**
* Kick a member from a guild
* @param {string} guildId the guild id
* @param {string} userId the user id
* @returns 204 empty response on success
* @example
* ```js
* jalter.kickUser("974918359500075041", "317255788324454400").then((res) => { console.log("kickUser", res); });
* ```
* https://discord.com/developers/docs/resources/guild#remove-guild-member
*/
async kickUser(guildId, userId) {
const endpoint = `${this.base}/guilds/${guildId}/members/${userId}`;
return await (0, utils_1.request)(endpoint, this.auth, "DELETE").then(res => {
return res.body;
});
}
/**
* Ban a member from a guild
* @param {string} guildId the guild id
* @param {string} userId the user id
* @param {string} reason the reason for banning
* @returns 204 empty response on success
* @example
* ```js
* jalter.banUser("974918359500075041", "974918359500075041", "I don't like you").then((res) => { console.log("banUser", res); });
* ```
* https://discord.com/developers/docs/resources/guild#remove-guild-member
*/
async banUser(guildId, userId, reason = "") {
const endpoint = `${this.base}/guilds/${guildId}/bans/${userId}`;
return await (0, utils_1.request)(endpoint, this.auth, "PUT", { delete_message_days: "7", reason }).then(res => {
return res.body;
});
}
/**
* Unban a member from a guild
* @param {string} guildId the guild id
* @param {string} userId the user id
* @returns the user object that was unbanned
* @example
* ```js
* jalter.unBanUser("974918359500075041", "974918359500075041").then((res) => { console.log("unBanUser", res); });
* ```
* https://discord.com/developers/docs/resources/guild#remove-guild-member
*/
async unBanUser(guildId, userId) {
const endpoint = `${this.base}/guilds/${guildId}/bans/${userId}`;
await (0, utils_1.request)(endpoint, this.auth, "DELETE").then(res => {
return res.body;
});
}
/**
* Join a guild
* @param {string} inviteUrl the code invites
* @returns the guild object that was joined
* @example
* ```js
* jalter.joinGuild("ApHu666E").then((res) => { console.log("joinGuild", res); });
* ```
* https://discord.com/developers/docs/resources/invite#get-invite
*/
async joinGuild(inviteUrl) {
if (inviteUrl.startsWith("https"))
throw new Error(const_1.default.error.notValidCode);
const endpoint = `${this.base}/invites/${inviteUrl}`;
return await (0, utils_1.request)(endpoint, this.auth, "POST", { content: "" }).then(res => {
return res.body;
});
}
/**
* Leave a guild. Returns a 204 empty response on success.
* @param {string} guildId the guild id
* @returns 204 empty response on success
* @example
* ```js
* jalter.leaveGuild("974918359500075041").then((res) => { console.log("leaveGuild", res); });
* ```
* https://discord.com/developers/docs/resources/user#leave-guild
*/
async leaveGuild(guildId) {
const endpoint = `${this.base}/users/@me/guilds/${guildId}`;
return await (0, utils_1.request)(endpoint, this.auth, "DELETE").then(res => {
return res.body;
});
}
/**
* Trigger Typing Indicator
* @param {string} channelId the channel id
* @returns 204 empty response on success
* @example
* ```js
* jalter.startTyping("974918359500075041").then((res) => { console.log("startTyping", res); });
* ```
* https://discord.com/developers/docs/resources/channel#trigger-typing-indicator
*/
async typingMessage(channelId, timeout = 3000) {
const endpoint = `${this.base}/channels/${channelId}/typing`;
await (0, utils_1.request)(endpoint, this.auth, "POST").then(res => {
return res.body;
});
await (0, utils_1.rateLimit)(timeout);
}
/**
* Reply to a message
* @param {string} channelId the channel id
* @param {string} messageId the message id
* @param {string} text the desired reply text
* @returns the message object that was replied
* @example
* ```js
* jalter.replyMessage("974918359500075041", "974963134144069662", "uh?").then((res) => { console.log("replyMessage", res); });
* ```
* https://discord.com/developers/docs/resources/channel#create-message
*/
async replyMessage(channelId, messageId, text) {
const endpoint = `${this.base}/channels/${channelId}/messages`;
return await (0, utils_1.request)(endpoint, this.auth, "POST", {
content: text,
message_reference: { message_id: messageId }
}).then(res => {
return res.body;
});
}
/**
* Delete a message
* @param {string} channelId the channel id
* @param {string} messageId the message id
* @returns the message object that was deleted or null
* @example
* ```js
* jalter.deleteMessage("974918359500075041", "974963134144069662").then((res) => { console.log("deleteMessage", res); });
* ```
* https://discord.com/developers/docs/resources/channel#get-channel-message
*/
async deleteMessage(channelId, messageId) {
const endpoint = `${this.base}/channels/${channelId}/messages/${messageId}`;
return await (0, utils_1.request)(endpoint, this.auth, "DELETE").then(res => {
return res.body;
});
}
/**
* Create a new channel object for the guild
* @param {string} guildId the guild id
* @param {string} name the desired name
* @param {string} type the channel TYPE
* @returns the channel object that was created
* @example
* ```js
* jalter.createChannel("974918359500075041", "general", 0).then((res) => { console.log("createChannel", res); });
* ```
* https://discord.com/developers/docs/resources/channel#create-guild-channel
*/
async createChannel(guildId, name, type) {
if (!const_1.default.channelType.includes(type))
throw Error("Invalid channel type, please use one of the following: " + const_1.default.channelType.join(", "));
const endpoint = `${this.base}/guilds/${guildId}/channels`;
return await (0, utils_1.request)(endpoint, this.auth, "POST", { name, type }).then(res => {
return res.body;
});
}
/**
* Returns a list of guild channel objects. Does not include threads.
* @param {string} guildId the guild id
* @returns the list of channels from related guild
* @example
* ```js
* jalter.getChannels("974918359500075041").then((res) => { console.log("getChannels", res); });
* ```
* https://discord.com/developers/docs/resources/guild#get-guild-channels
*/
async getChannels(guildId) {
const endpoint = `${this.base}/guilds/${guildId}/channels`;
return await (0, utils_1.request)(endpoint, this.auth, "GET").then(res => {
return res.body;
});
}
/**
* For farming stuff, fill the array with your custom message, just dont greedy
* @param {number} channelId The destination channel ID
* @param {number} interval The interval time per ms
* @param {string[]} textList The array of messages
* @returns the message object send
* @example
* send random hey, ho, or let's go
* ```js
* jalter.sendInterval("974918359500075041", 2000, ["hey", "ho", "let's go"]).then((res) => { console.log("sendInterval", res); });
* ```
*
* @example
* will send a random hello world in different 72 languages if array is not specified
* ```js
* jalter.sendInterval("974918359500075041", 2000).then((res) => { console.log("sendInterval", res); });
* ```
* Non standard stuff, there is no external links except [channel#create-message](https://discord.com/developers/docs/resources/channel#create-message)
*/
async sendInterval(channelId, interval, textList = const_1.default.endpoint.hello) {
if (!Array.isArray(textList))
throw new Error(const_1.default.error.notArray);
if (interval < 1000)
throw new Error(const_1.default.error.invalidDelay);
return (0, utils_1.loopInterval)(async () => {
this.sendMessage(channelId, textList[Math.floor(Math.random() * textList.length)]).then(console.log);
}, interval);
}
/**
* Send a message on the channel and will stop once the count is reached
* @param {string} channelId the channel id
* @param {number} interval the interval delay time
* @param {string} text the message text
* @param {number} count the number of messages to send
* @returns the message object send
* @example
* send a message with a delay of 2 seconds and will stop after reaching 5 messages
* ```js
* jalter.sendCount("974918359500075041", 2000, "hey", 5).then((res) => { console.log("sendCount", res); });
* ```
* Non standard stuff, there is no external links except [channel#create-message](https://discord.com/developers/docs/resources/channel#create-message)
*/
async sendCount(channelId, interval, text, count) {
if (interval < 1000)
throw new Error(const_1.default.error.invalidDelay);
return (0, utils_1.loopCount)(async () => {
this.sendMessage(channelId, text).then(console.log);
}, interval, count);
}
}
Jalter.default = Jalter;
module.exports = Jalter;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsdUNBQTBFO0FBQzFFLHdEQUE0QjtBQUU1QixNQUFNLE1BQU07SUFFRixJQUFJLENBQVE7SUFDWixJQUFJLENBQVE7SUFFcEIsTUFBTSxDQUFDLE9BQU8sQ0FBZ0I7SUFFOUIsWUFBWSxLQUFhO1FBQ3ZCLElBQUksQ0FBQyxLQUFLO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxJQUFJLEdBQUcsZUFBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7UUFDL0IsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUV2Qzs7OztVQUlFO0lBQ0osQ0FBQztJQUVEOzs7Ozs7OztNQVFFO0lBQ0YsS0FBSyxDQUFDLEtBQUs7UUFDVCxNQUFNLFFBQVEsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLFlBQVksQ0FBQztRQUMxQyxPQUFPLE1BQU0sSUFBQSxlQUFPLEVBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzFELE9BQU8sR0FBRyxDQUFDLElBQWMsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQWM7UUFDMUIsTUFBTSxRQUFRLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxVQUFVLE1BQU0sRUFBRSxDQUFDO1FBQ2hELE9BQU8sTUFBTSxJQUFBLGVBQU8sRUFBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDMUQsT0FB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