commands/peek.js

const Command = require('../core/command');
const Communication = require('../core/communication');


/**
 * Peeks into the queue to check the next-x members in line.
 * 
 * @author Maksim Sandybekov
 * @date 25.05.2020
 * @version 1.0
 * 
 * @extends Command
 */
class Peek extends Command {

    /**
     * @constructor 
     * @param {string} fileName 
     */
    constructor(fileName) {
        super(fileName);
        
    }

    
    execute(message, args) {

        // Stop direct messages, check if channel is configured for communication
        let com = new Communication(message);
        let userId = com.getUserId();
        if (com.isDirect()) {
            return message.channel.send(com.getDefaults("directMessage", userId));
        }

        // Communication on channel is not allowed
        let asAdmin = true;
        if (!com.isAllowed(asAdmin)) {
            return message.channel.send(com.getReason());
        }

        // To many arguments passed
        if (args.length > 1) {
            return message.channel.send(this.getResponse("tooManyArgs", userId));
        }


        let guildId = com.getGuildId();
        let queue = this.storage.get("queue." + guildId);
        let responseMessage = this.getResponse("emptyQueue", userId); 
        // Queue is empty or not existent
        if ((queue && queue.count == 0) || !queue) {
         return message.channel.send(responseMessage);           
        }

        // Peek for specific number of queue members
        let peekForNumber = 5;
        if (args.length == 1) {

            let number = parseInt(args[0]);
            if (!number && !(number <= 0)) {
                return message.channel.send(this.getResponse("argNotNumber"));

            } else if (number <= 0) {
                return message.channel.send(this.getResponse("argTooSmall", number));

            }

            peekForNumber = number;
        }

        responseMessage = this.getNMembers(peekForNumber, queue);
        return message.channel.send(responseMessage);
    }



    /**
     * Aggregates n-members of the queue into a response messsage.
     * Returns an adequat messge if not enough members are in queue.
     * 
     * @param {number} numberOfMembers Number of members to peek into to queue from the head
     * @param {Object} queue The queue itself.
     */
    getNMembers(numberOfMembers, queue) {

        let messageType = "numMembers";
        if (queue.count < numberOfMembers) {
            messageType = "lessMembers";
            numberOfMembers = queue.count;
        }

        if (queue.count == 1) {
            messageType = "singlePerson";
            
            return this.getResponse(messageType, queue.member[0].id);
        }

        let members = "";
        for (let i = 0; i < numberOfMembers; i++) {

            members += (i+1) + ". <@" + queue.member[i].id + ">\n";
        }


        return this.getResponse(messageType, members);
    }

}


module.exports = Peek;