|
|
|
const { Client } = require(`@androz2091/insta.js`),
|
|
|
|
Collection = require(`@discordjs/collection`)
|
|
|
|
path = require(`path`);
|
|
|
|
|
|
|
|
class InstaBot extends Client {
|
|
|
|
constructor(options) {
|
|
|
|
super(options);
|
|
|
|
[`commands`, `aliases`, `cooldowns`].forEach(x => this[x] = new Collection());
|
|
|
|
this.config = require(`../config`);
|
|
|
|
this.logger = require(`../Helpers/logger`);
|
|
|
|
this.usersData = require(`../Models/Users`);
|
|
|
|
this.groupsData = require(`../Models/Groups`)
|
|
|
|
this.groupMembersData = require(`../Models/GroupMembers`)
|
|
|
|
this.databaseCache = {};
|
|
|
|
this.databaseCache.users = new Collection();
|
|
|
|
this.databaseCache.groups = new Collection();
|
|
|
|
this.databaseCache.groupMembers = new Collection();
|
|
|
|
}
|
|
|
|
|
|
|
|
loadCommand(commandPath, commandName) {
|
|
|
|
try {
|
|
|
|
const props = new (require(`.${commandPath}${path.sep}${commandName}`))(this);
|
|
|
|
props.conf.location = commandPath;
|
|
|
|
if (props.init) {
|
|
|
|
props.init(this);
|
|
|
|
}
|
|
|
|
this.commands.set(props.help.name, props);
|
|
|
|
props.conf.aliases.forEach((alias) => {
|
|
|
|
this.aliases.set(alias, props.help.name);
|
|
|
|
});
|
|
|
|
return false;
|
|
|
|
} catch (e) {
|
|
|
|
return `Unable to load command ${commandName}: ${e}`;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async unloadCommand(commandPath, commandName) {
|
|
|
|
let command;
|
|
|
|
if (this.commands.has(commandName)) {
|
|
|
|
command = this.commands.get(commandName);
|
|
|
|
} else if (this.aliases.has(commandName)) {
|
|
|
|
command = this.commands.get(this.aliases.get(commandName));
|
|
|
|
}
|
|
|
|
if (!command) {
|
|
|
|
return `The command \`${commandName}\` doesn't seem to exist, nor is it an alias. Try again!`;
|
|
|
|
}
|
|
|
|
if (command.shutdown) {
|
|
|
|
await command.shutdown(this);
|
|
|
|
}
|
|
|
|
delete require.cache[require.resolve(`.${commandPath}${path.sep}${commandName}.js`)];
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
async findOrCreateUser({ id: userID }, isLean) {
|
|
|
|
if (this.databaseCache.users.get(userID)) {
|
|
|
|
return isLean ? this.databaseCache.users.get(userID).toJSON() : this.databaseCache.users.get(userID);
|
|
|
|
} else {
|
|
|
|
let userData = (isLean ? await this.usersData.findOne({ id: userID }).populate(`users`).lean() : await this.usersData.findOne({ id: userID }).populate(`users`));
|
|
|
|
if (userData) {
|
|
|
|
if (!isLean) this.databaseCache.users.set(userID, userData);
|
|
|
|
return userData;
|
|
|
|
} else {
|
|
|
|
userData = new this.usersData({ id: userID });
|
|
|
|
await userData.save();
|
|
|
|
this.databaseCache.users.set(userID, userData);
|
|
|
|
return isLean ? userData.toJSON() : userData;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async findOrCreateGroupMember({ id: userID, groupID: groupID }, isLean) {
|
|
|
|
if (this.databaseCache.groupMembers.get(`${userID}-${groupID}`)) {
|
|
|
|
return isLean ? this.databaseCache.groupMembers.get(`${userID}-${groupID}`).toJSON() : this.databaseCache.groupMembers.get(`${userID}-${groupID}`);
|
|
|
|
} else {
|
|
|
|
let groupMemberData = (isLean ? await this.groupMembersData.findOne({ id: userID, groupID: groupID }).populate(`members`).lean() : await this.groupMembersData.findOne({ id: userID, groupID: groupID }).populate(`members`));
|
|
|
|
if (groupMemberData) {
|
|
|
|
if (!isLean) this.databaseCache.groupMembers.set(`${userID}-${groupID}`, groupMemberData);
|
|
|
|
return groupMemberData;
|
|
|
|
} else {
|
|
|
|
groupMemberData = new this.groupMembersData({ id: userID, groupID: groupID });
|
|
|
|
await groupMemberData.save();
|
|
|
|
this.databaseCache.groupMembers.set(`${userID}-${groupID}`, groupMemberData);
|
|
|
|
return isLean ? groupMemberData.toJSON() : groupMemberData;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async findOrCreateGroup({ groupID: groupID }, isLean) {
|
|
|
|
if (this.databaseCache.groups.get(groupID)) {
|
|
|
|
return isLean ? this.databaseCache.groups.get(groupID).toJSON() : this.databaseCache.groups.get(groupID);
|
|
|
|
} else {
|
|
|
|
let groupData = (isLean ? await this.groupsData.findOne({ groupID: groupID }).populate(`groups`).lean() : await this.groupsData.findOne({ groupID: groupID }).populate(`groups`));
|
|
|
|
if (groupData) {
|
|
|
|
if (!isLean) this.databaseCache.groups.set(groupID, groupData);
|
|
|
|
return groupData;
|
|
|
|
} else {
|
|
|
|
groupData = new this.groupsData({ groupID: groupID });
|
|
|
|
await groupData.save();
|
|
|
|
this.databaseCache.groups.set(groupID, groupData);
|
|
|
|
return isLean ? groupData.toJSON() : groupData;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = InstaBot;
|