J'ai ce code, où je suis obligé de garder la fonction checkIfMember dans le contexte pour la passer comme argument à une autre fonction. Parce que sinon, je ne peux pas appeler ctx. Cela fonctionne de cette façon, mais j'aimerais que la fonction checkIfMember soit séparée, mais le problème est que ctx ne sera pas défini. Comment pourrais-je passer le contexte ou quelque chose qui me permettra de séparer la fonction?

bot.command('raintest', async (ctx) => {
//check if an user has a member rank in the group
function checkIfMember(uid, cid){
    return ctx.getChatMember(uid, cid).then(data =>{
        if(data.status == "member"){
            return true;
        }else{
            return false;
        }
    }).catch(err =>{
        console.log(err)
    })
  }

let chatid = ctx.message.chat.id
let myId = ctx.update.message.from.id
let message = ctx.message.text.toString()
message = message.split(" ")
let numberOfUsers = message[1]
let tipAmount = message[2]
let totalAmountToTip = numberOfUsers * tipAmount

if (tipAmount != undefined && numberOfUsers != undefined) {
    if (tipAmount == 0 || numberOfUsers == 0) {
        ctx.reply("Users or Balances can't be 0 ⛔️!!")
    } else {
        if (Number(numberOfUsers) > 10) {
            ctx.reply("You cant rain for more than 10 users ⛔️!!")
        } else {
            userCommon.userHasEnoughtBalance(myId,chatid, totalAmountToTip).then(res => {
                if (res) { //THERE I PASS CHECKIFMEMBER AS A FUNCTION
                    userCommon.returnMembers(chatid, checkIfMember,numberOfUsers).then(res => {
                        if (res[0] == false) {
                            ctx.reply("⛔️⛔️ There are only " + res[1] + " users in the system.")
                        } else if (res[0] == true) {
                            let tipedUsers = []
                            var userArray = res[1]
1
mouchin777 18 juin 2020 à 10:22

3 réponses

Meilleure réponse

Injectez ctx dans votre fonction:

function checkIfMember(ctx) {
    return function (uid, cid){
        return ctx.getChatMember(uid, cid).then(data =>{
            if(data.status == "member"){
                return true;
            }else{
                return false;
            }
        }).catch(err =>{
            console.log(err)
        })
    };
};

Maintenant, checkIfMenber est une fonction qui renvoie une fonction.

Ensuite, lorsque vous devez l'utiliser comme rappel:


userCommon.returnMembers(chatid, checkIfMember(ctx),numberOfUsers).then...
1
OLIVIER 18 juin 2020 à 08:03

Vous pouvez passer ctx comme argument à une fonction:

function checkIfMember(uid, cid, ctx){
    return ctx.getChatMember(uid, cid).then(data =>{
        if(data.status == "member"){
            return true;
        }else{
            return false;
        }
    }).catch(err =>{
        console.log(err)
    })
}

Ou, vous pouvez bind le contexte d'une fonction et utiliser this:

function checkIfMember(uid, cid) {
    return this.getChatMember(uid, cid).then(data => {
        if (data.status == "member") {
            return true;
        } else {
            return false;
        }
    }).catch(err =>{
        console.log(err)
    });
}

const checkIfMemberWithCtx = checkIfMember.bind(ctx);
// Next you need to use it like this: userCommon.returnMembers(chatid, checkIfMemberWithCtx, numberOfUsers)

Ou vous pouvez utiliser le décorateur:

function checkIfMember(ctx) {
    return (uid, cid) => {
        return ctx.getChatMember(uid, cid).then(data => {
            if (data.status == "member") {
                return true;
            } else {
                return false;
            }
        }).catch(err =>{
            console.log(err)
        });
    };
}

const checkIfMemberWithCtx = checkIfMember(ctx);
// Next you need to use it like this: userCommon.returnMembers(chatid, checkIfMemberWithCtx, numberOfUsers)
1
Rustam D9RS 18 juin 2020 à 08:17

Que diriez-vous de prendre ctx comme un autre argument de la fonction checkIfMember.

Exemple: function checkIfMember(uid, cid, ctx) { ... }

Je pense que cela devrait fonctionner.

1
Shihab 18 juin 2020 à 08:02