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
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:The handler of
steam.on
finishes immediately, but thesendUpdate1
will execute async, and once it’s done, executesendUpdate2
, also async.Sounds like you want to store the promise returned by
steamAddFriend
in a lookup map keyed by user id: