Jump to content
McKay Development

need help with client.getPersonas()


Recommended Posts

Posted

I am trying to create a program, which every specified ammount of time sends a message to my steam friends, if conditions are met. The thing is that I call messaging function after setting bot status to Online, but at the first run client.getPersonas() returns all the users data, like the bot`s persona is offline (most parameters are null or 0). Everything works fine at second and subsequent runs of checkOnline(). Please, I am almost sure this is because of some stupid mistake, but I cannot find this mistake for two days already. Please tell me, where I messed up. Simplified code below.

steam-user v4.25.0

import SteamUser from "steam-user";
import SteamTotp from "steam-totp";

const receivers = [
  '11111111111111111', //IDs for example
  '22222222222222222',
]

function main() {
  const client = new SteamUser();
  function steamLogin() {
    client.logOn({
      "accountName": process.env.accountName,
      "password": process.env.password,
      twoFactorCode: SteamTotp.generateAuthCode(process.env.twoFactorCode)
    });
    client.on('loggedOn', function () {
      console.log("Logged into Steam as " + client.steamID.getSteam3RenderedID());
      client.setPersona(SteamUser.EPersonaState.Online)
      checkOnline() //calling the second function
    });
  }

  function checkOnline() {
    for (let i = 0; i < receivers.length; i++) {
      client.getPersonas([receivers[i]], function (personas, err) {
        if (err) {
          console.log(err)
        } else {
          let data = personas[receivers[i]].persona_state
          if (data === 1 || data === 2 || data === 3) {
            client.chat.sendFriendMessage(receivers[i], `It works!`);
            console.log('Message sent!', receivers[i])
          }
        }
      })
    }
    setTimeout(checkOnline, 10000);
  }
  steamLogin()
}
main()

 

Posted
  1. The order of parameters to the getPersonas callback is err, personas. You have it backwards.
  2. The getPersonas function accepts multiple IDs. Why are you calling it individually for each ID?
  3. You might need to delay some time after calling setPersona to set yourself online, as you're currently sending the getPersonas requests synchronously at the same time as setPersona, without giving Steam enough time to process that you're now online.
Posted

1. That`s the funny thing, I don`t understand why, but when personas is before err, it is just logging into console all the data instead of errors, like:

{
  '22222222222222222': {
    rich_presence: [],
    persona_state: 3,
    game_played_app_id: 0,
...etc
  }
}

The only way it works correctly in this order is like this, the problem still persists :

client.getPersonas([receivers[i]], function (personas, err) {
  if (personas) {
    console.log(personas)
  } else {
    let data = err[receivers[i]].persona_state

 

2. Actually in the real code I am fetching data row by row from sqlite database, checking for each row a column wasMessagedToday, if it is false, then calling getPersonas() and if messaged successfully, updating wasMessagedToday value in database to true. Maybe there is a better way, but I am an absolute newbie in database stuff.

3. Thank you, thank you!!! I`ve tried already few ways to delay time including setTimeout(checkOnline, 2000) after setting persona to Online, but it wasn`t working. Tried now to increase the delay to 10 seconds and now data from getPersonas() is correct at every run! I guess Steam is really slow with status updates. So the fix looks like this:

    client.on('loggedOn', function () {
      console.log("Logged into Steam as " + client.steamID.getSteam3RenderedID());
      client.setPersona(SteamUser.EPersonaState.Online)
      setTimeout(checkOnline, 10000);
    });

 

 

 

Posted
  1. Sounds like you might not be up to date.
  2. I'd fetch all rows upfront, then request all personas at the same time.
  3. Seems good, I think Steam might send you a persona update via the user event for yourself when you set yourself to online; if it does, then waiting to see yourself as online might be all you need.
Posted

1. I am using the latest version of "steam-user", 4.25.0

2. Yes, this is a better implementation, thank you :)

3. Tried to do this, but now every time at the first run of checkOnline() instead of nonexisting data I receive timeouts, one per every receiver, at the second run everything is fine again. So, I guess, I`ll stuck with setTimeout().  Example of code:

    client.on('loggedOn', function () {
      console.log("Logged into Steam as " + client.steamID.getSteam3RenderedID());
      client.setPersona(SteamUser.EPersonaState.Online)
      client.on('user', function (sid, user) {
        // should be enough because Steam emits it only if this client instance's persona state is online
        if (Object.values(user).includes('link-to-bot-profile-picture.jpg')) {
          checkOnline()
        }
      })
    });

Example of timeout:

Error: Request timed out
    at Timeout._onTimeout (C:\Users\Andrew\WebstormProjects\Notif-steam-bot\node_modules\@doctormckay\stdlib\components\promises.js:17:12)
    at listOnTimeout (node:internal/timers:559:17)
    at processTimers (node:internal/timers:502:7)

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...