简体   繁体   中英

alexa Steam custom skill api integration

currently trying to develop one of my first alexa skills. trying to build a skill that updates the user on who out of their Steam friends, are online.

Curerntly it's pretty messy and not in the format i hope it to be in the end, but for testing purposes, I'm not yet using intents, im just testing using the launchrequest.

So far I've managed to get a users (mine) friends list from steam and put all the friends ids in a url that should be able to grab the details for these users. The issue I'm having is performing the second API call to grab the players details using the steamIds. i keep getting an 'undefined' return and am stumped on what i'm doing wrong. I'm very much new to JS so there's bound to be mistakes in here, but i can work on tidying up later once i've got it working.

This works fine

/**
* Called when the user invokes the skill without specifying what they want.
*/
function onLaunch(launchRequest, session, callback) {

console.log("onLaunch requestId=" + launchRequest.requestId
    + ", sessionId=" + session.sessionId);
var cardTitle = "Hello, World!"


testGet(function (response) {

    var speechOutput = "Here is the result of your query: " + response;
    var shouldEndSession = true;

    callback(session.attributes,
    buildSpeechletResponse(cardTitle, speechOutput, "", true));
});



//var speechOutput = "You can tell Hello, World! to say Hello, World!"

//callback(session.attributes,
   // buildSpeechletResponse(cardTitle, speechOutput, "", true));
}

This is the function that is grabbing the details from my friendlist

function testGet(response) {

var http = require('http')
var url = " http://api.steampowered.com/ISteamUser/GetFriendList/v0001/?key=XXXXXXXXXX&steamid=76561198068311091&relationship=friend"


http.get(url, function (res) {

    // data is streamed in chunks from the server
    // so we have to handle the "data" event    
    var buffer = "", 
        data,
        friendsList,
        i,
        address,
        textResponse,
        route;

    res.on("data", function (chunk) {
        buffer += chunk;
    }); 

    res.on("end", function (err) {
        // finished transferring data
        // dump the raw data
        console.log(buffer);
        console.log("\n");
        data = JSON.parse(buffer);
        friendsList = data.friendslist.friends;

       textResponse = isOnline(friendsList);


        response("Friends online: " + textResponse);

}).on('error', function (e) {
    console.log("Error message: " + e.message);
});

})
}

and this is the final function which i'm having difficulties with.

function isOnline(friendsList){
var http = require('http'),
i,
comma,
friendsIDs = "";

// for loop to get all friends ids in string
        for (i = 0; i < friendsList.length; i++) { 
            // if i equals 0 then it is the start of the loop so no 
            //comma needed, otherwise add a comma to seperate the ids. 
            if(i === 0) {comma = ""}
            else{comma = ","}
            //place the ids in a comma seperate string
            friendsIDs += comma + friendsList[i].steamid;
        }

 var playerurl = "http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=xxxxx&steamids=" + friendsIDs;

// works fine up to this point

// run the api call to get player details
 http.get(playerurl, function (response) {

    // data is streamed in chunks from the server
    // so we have to handle the "data" event    
    var buffer = "", 
        playerdata,
        returnText,
        textResponse,
        friendsInformation,
        route;

    response.on("playerdata", function (chunk) {
        buffer += chunk;
    }); 

    response.on("end", function (err) {
        // finished transferring data
        // dump the raw data
        console.log(buffer);
        console.log("\n");
        playerdata = JSON.parse(buffer);

        friendsInformation = playerdata.response.players;

        for (i = 0; i < friendsInformation.length; i++) { 

            if(friendsInformation[i].personastate == 1) {
                returnText += friendsInformation[i].personaname + " chicken";
            }
    }

    return returnText;

    }).on('error', function (e) {
    console.log("Error message: " + e.message);
    });


});


}

Been going round in circles for hours and feel so close to doing this but have no idea where I'm going wrong?! thanks

I have managed to solve my problem by using javascript promises. I'm completely new to promises so took some trial and error but have managed to get it to work. here is the simplest video i could find to explain the concept, it definately helped me understand how to rearrange my code.

If you wish to do two API calls in an Alexa skill, using the data from the first api call to construct and inform the second call, you will need to use promises to do them sequentially.

it took the code from the isOnline() and testGet() functions and moved them into a promise, which allowed me to complete 1 api call (the original call to get friends list info) before executing the second call (the second api to get player details based on the results of the friendslist api call)

I can now check with alexa to see which of my steam friends are online! Hopefully i'll be able to build in some more functionality (eg what they are playing, if they are offline or just away/busy/snoozing)

thanks for contributing

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM