diff --git a/src/commands/claim.js b/src/commands/claim.js index 5ba8202..e50f548 100644 --- a/src/commands/claim.js +++ b/src/commands/claim.js @@ -1,6 +1,6 @@ import { mountCommandHelpEmbed } from './help' import { getArgumentsAndOptions, removeOrUpdateReaction } from '../utils/message' -import { getDatabaseTokenByCode, updateDatabaseToken, mountTokenEmbed } from '../utils/token' +import { getDatabaseTokenByCode, updateDatabaseToken, mountTokenEmbed, hasTokenAllowedRole } from '../utils/token' import { getDatabaseUserById, updateDatabaseUser } from '../utils/user' import gifs from '../../data/gifs' import Discord from 'discord.js' @@ -97,6 +97,11 @@ export async function claimToken (message) { return message.channel.send('Você já resgatou esse token :eyes:') } + const hasAllowedRole = await hasTokenAllowedRole(token, message) + if (!hasAllowedRole) { + return message.channel.send('Esse token é exclusivo para participantes de workshop, malz :s') + } + const timesClaimed = claimedBy.length let scoreAcquired = value - (timesClaimed * decreaseValue) if (scoreAcquired < minimumValue) { diff --git a/src/models/token.js b/src/models/token.js index f90bbb0..e036242 100644 --- a/src/models/token.js +++ b/src/models/token.js @@ -49,6 +49,9 @@ const TokenSchema = new mongoose.Schema({ }, expireAt: { type: Date + }, + allowedRole: { + type: String } }) diff --git a/src/utils/token.js b/src/utils/token.js index 82f63b7..7096d97 100644 --- a/src/utils/token.js +++ b/src/utils/token.js @@ -1,5 +1,7 @@ import { createOrUpdateToken, getTokenFromMongo, getTokensFromMongo } from './mongoose' -import { truncateFieldValue } from './message' +import { truncateFieldValue, isDMChannel } from './message' +import { Message } from 'discord.js' +import config from '../config' /** * @typedef UserClaim @@ -17,6 +19,7 @@ import { truncateFieldValue } from './message' * @property {number} minimumValue * @property {number} totalClaims * @property {number} remainingClaims + * @property {string} allowedRole * @property {UserClaim[]} claimedBy * @property {string} createdBy ISO Date String. * @property {string} createdAt ISO Date String. @@ -230,3 +233,35 @@ export function mountTokenEmbed (token) { } } } + +/** + * Check if the user has the token allowed role. + * + * @param { Token } token + * @param { Message } message + * @returns { Promise } + */ +export async function hasTokenAllowedRole (token, message) { + if (!token.allowedRole) { + return true + } + + let member = message.member + + const isDirectMessage = isDMChannel(message) + if (isDirectMessage) { + const userId = message.author.id + const guild = message.client.guilds.cache.get(config.guildId) + const members = await guild.members.fetch() + member = members.get(userId) + } + + if (!member) { + return false + } + + const allowedRole = token.allowedRole + const hasRole = member.roles.cache.some(memberRole => memberRole.name === allowedRole) + console.log(hasRole) + return hasRole +} diff --git a/tests/claim.test.js b/tests/claim.test.js index 110abe4..dac5824 100644 --- a/tests/claim.test.js +++ b/tests/claim.test.js @@ -5,7 +5,8 @@ import { getDatabaseUserById, updateDatabaseUser } from '../src/utils/user' jest.mock('../src/utils/token', () => ({ getDatabaseTokenByCode: jest.fn(), - updateDatabaseToken: jest.fn() + updateDatabaseToken: jest.fn(), + hasTokenAllowedRole: jest.fn().mockResolvedValue(true) })) jest.mock('../src/utils/user', () => ({