skip to Main Content

I am developing a Steam bot (but the question is only about JS). I have the following code:

const steam = new SteamUser(); // from steam-user library

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function steamAddFriend(user_steam_id) {
    // 3 attempts
    for (let i = 0; i < 3; i++) {
        try {
            await steam.addFriend(user_steam_id);
            console.log('Friend request is sent');
            // everything is ok
        } catch (err) {
            if (err.eresult === SteamUser.EResult.DuplicateName) {
                if (steam.myFriends[user_steam_id] === SteamUser.EFriendRelationship.Friend) {
                    console.log('This user is already in the friends list');
                } else if (steam.myFriends[user_steam_id] === SteamUser.EFriendRelationship.RequestInitiator) {
                    console.log('The friend request has already been sent earlier');
                }
                // non-critical error, but there is no point to continue trying
            } else if ((err.eresult === SteamUser.EResult.ServiceUnavailable || err.message === 'Request timed out') && i < 2) {
                // problem with Steam servers, wait 10 seconds and try again
                await sleep(10000);
                continue;
            } else {
                // critical error. for example, user_steam_id is invalid
                // sendNotification is fetch based function to send notification to me
                await sendNotification();
            }
        }
        break; // break the loop if there is no need to continue trying
    }
    try {
        // fetch based function to send updates to backend
        await sendUpdate1(user_steam_id);
    } catch (err) {
        // handle error
    }
}

// fired when relationship with user is changed (for example, a user accepted a friend request)
steam.on('friendRelationship', async (sid, relationship) => {
    if (relationship === SteamUser.EFriendRelationship.Friend) {
        const user_steam_id = sid.getSteamID64();
        console.log('User is added to friends');
        // here I need to wait until sendUpdate1 resolves
        // sendUpdate2 is fetch based function to send updates to backend
        await sendUpdate2(user_steam_id);
    }
});

steamAddFriend('71111111111111111');

I need friendRelationship callback to wait for the sendUpdate1 promise to resolve before calling sendUpdate2. How can I do this? Keep in mind that the bot can work with several users at the same time.

2

Answers


  1. I’m not sure why you are awaiting in the event handler of friendRelationship. If it’s not a requirement to await, this is how I would write it:

    // fired when relationship with user is changed (for example, a user accepted a friend request)
    steam.on('friendRelationship', (sid, relationship) => {
        if (relationship === SteamUser.EFriendRelationship.Friend) {
            const user_steam_id = sid.getSteamID64();
            console.log('User is added to friends');
            sendUpdate1(user_steam_id).then(() => sendUpdate2(user_steam_id));
        }
    });
    

    The handler of steam.on finishes immediately, but the sendUpdate1 will execute async, and once it’s done, execute sendUpdate2, also async.

    Login or Signup to reply.
  2. Sounds like you want to store the promise returned by steamAddFriend in a lookup map keyed by user id:

    const openFriendRequests = new Map();
    
    steam.on('friendRelationship', async (sid, relationship) => {
        if (relationship === SteamUser.EFriendRelationship.Friend) {
            const userSteamId = sid.getSteamID64();
            console.log(`User is added to friends of ${userSteamId}`);
            const request = openFriendRequests.get(userSteamId);
            if (request) {
                openFriendRequests.delete(userSteamId);
                await request; // wait until sendUpdate1 resolves
                await sendUpdate2(userSteamId);
            } else {
                console.log('not a response to a friend request created by this code');
            }
        }
    });
    
    openFriendRequest.set('71111111111111111', steamAddFriend('71111111111111111'));
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search