Cake Time: Construa uma Skill engajadora

Usando a API de configurações da Alexa

Nesta seção, você habilitará a skill Cake Time para calcular o número de dias até o próximo aniversário do usuário.

Use o Console do Portal dos Desenvolvedores de Alexa para este módulo. Faça login no console e abra a skill Cake Time.

Etapa 1: obter e passar o ID do dispositivo para a API

Para calcular o número de dias até o próximo aniversário do usuário, precisamos de informações adicionais. Felizmente, você pode usar a API de configurações da Alexa para obter essas informações. Para consultar a API, é necessário fornecer o ID do dispositivo habilitado para Alexa que solicitou a abertura da skill Cake Time.

O ID do dispositivo é fornecido em todas as solicitações que chegam ao código da skill. Obtenha o ID do dispositivo usando o requestEnvelope com o seguinte código:

handlerInput.requestEnvelope.context.System.device.deviceId

O SDK fornece uma função que simplifica a obtenção do ID do dispositivo. Sinta-se à vontade para usá-la: const deviceId = Alexa.getDeviceId (handlerInput.requestEnvelope).

Para informações adicionais, consulte ASK SDK Utilities.

a. No console do portal, clique na guia Code (Código).

b. Localize o HasBirthdayLaunchRequestHandler e, em seguida, a função handle () dentro do handler. Crie uma nova linha logo acima da linha que começa com const attributeManager. Copie e cole o seguinte código:

const deviceId = handlerInput.requestEnvelope.context.System.device.deviceId;

Agora, a skill Cake Time precisa passar o ID do dispositivo capturado para a API. Como você faz isso?

Você precisa de quatro coisas:

  • URL para a API
  • Token de autorização
  • ID de dispositivo
  • Biblioteca para fazer a ligação

 

Felizmente, o SDK tem o ServiceClient interno para obter essas coisas. Você só precisa configurar e usar o ServiceClient.

c. Role para baixo no código até encontrar a linha que inicia com export.handler. Crie uma nova linha logo abaixo e copie e cole o seguinte código:

.withApiClient(new Alexa.DefaultApiClient())

Agora que o ServiceClient foi criado, seu código possui as quatro partes necessárias para passar o ID do dispositivo para a API.

d. Clique em Save (Salvar)

save button

Etapa 2: criar a “fábrica” do ServiceClient

Para usar o ServiceClient, você criará o que é chamado de fábrica. O objetivo de uma fábrica é construir coisas. Você o usará para criar o ServiceClient.

a. Localize o HasBirthdayLaunchRequestHandler e, em seguida, a função handle () dentro do handler. Crie uma nova linha logo acima da linha que começa com const deviceId. Copie e cole o seguinte código:

const serviceClientFactory = handlerInput.serviceClientFactory;

Essa parte do código ficará assim:

code snippet

b.  Clique em Save (Salvar)

save button

Etapa 3: identificar o fuso horário

É possível que ocorra um erro quando o código fizer uma chamada para a API de configurações da Alexa. Por exemplo, se a API demorar muito para responder, o código poderá expirar. Portanto, você precisa agrupar o código em um bloco try/catch. Um bloco try/catch é uma maneira de garantir que o código da skill não falhe se encontrar um erro. Você quebrará o código que pode falhar em um bloco try. Se o código desse bloco travar, o bloco catch será executado para tratar dos erros.

Você deseja saber o fuso horário do dispositivo habilitado para Alexa do usuário. No bloco try, use serviceClientFactory para obter as configurações de serviço do cliente - upsServiceClient - e passe o ID do dispositivo para a função getSystemTimeZone para obter o fuso horário. O bloco catch registrará uma mensagem de erro usando o console.log e retornará uma resposta de mensagem de erro que a Alexa dirá ao usuário.

a. Localize o HasBirthdayLaunchRequestHandler e, em seguida, a função handle () dentro do handler. Crie uma nova linha logo abaixo da linha que começa com const day = sessionAttributes. Copie e cole o seguinte código:

let userTimeZone;
try {
const upsServiceClient = serviceClientFactory.getUpsServiceClient();
userTimeZone = await upsServiceClient.getSystemTimeZone(deviceId);
} catch (error) {
if (error.name !== 'ServiceError') {
return handlerInput.responseBuilder.speak("There was a problem connecting to the service.").getResponse();
}
console.log('error', error.message);
}

Como estamos usando a API para obter o fuso horário, pode demorar um pouco para obter uma resposta. Atualize o código para buscar essas informações de forma assíncrona.

Anteriormente, você usou as palavras-chave async e await. Você usará essas palavras-chave aqui para obter o fuso horário da API de forma assíncrona. A palavra-chave await é incluída no bloco try/catch que você acabou de adicionar. Agora, adicione a palavra-chave async à função handle ().

b. Dentro do HasBirthdayLaunchRequestHandler, localize a função handle (). Na frente da função, digite async seguido por um espaço.

Essa seção do código agora deve ficar assim:

async handle(handlerInput) {
const serviceClientFactory = handlerInput.serviceClientFactory;
const deviceId = handlerInput.requestEnvelope.context.System.device.deviceId;

c. Clique em Save (Salvar)

save button

Etapa 4: recuperar a data atual

O código usará o fuso horário para obter a data atual. Você pode usar a função currentDateTime para retornar a data correta de acordo com o fuso horário capturado no dispositivo do usuário. Você adicionará essa função abaixo do bloco try/catch adicionado na etapa anterior.

a. Dentro do HasBirthdayLaunchRequestHandler, na função handle (), encontre a linha que começa com const speechText = `Welcome Back. Crie uma nova linha logo acima dela. Copie e cole o seguinte código:

// getting the current date with the time
const currentDateTime = new Date(new Date().toLocaleString("en-US", {timeZone: userTimeZone}));

b. Clique em Save (Salvar)

save button

Etapa 5: Extraia o mês, dia e ano

Você gostaria que a skill Cake Time desejasse ao usuário feliz aniversário à meia-noite em seu fuso horário. Isso pode ser um problema porque o currentDateTime fornece a data e a hora para o segundo. A skill Cake Time não pede que o usuário forneça seu aniversário até o segundo. Portanto, o código precisa extrair apenas o mês, dia e ano de currentDateTime e, em seguida, recriar a data sem os segundos incluídos.

a. Dentro do HasBirthdayLaunchRequestHandler, na função handle (), crie uma nova linha logo abaixo do código que você acabou de adicionar (const currentDateTime). Copie e cole o seguinte código:

// removing the time from the date because it affects our difference calculation
const currentDate = new Date(currentDateTime.getFullYear(), currentDateTime.getMonth(), currentDateTime.getDate());
const currentYear = currentDate.getFullYear();

b. Clique em Save (Salvar)

save button

Etapa 6: Determinar o próximo aniversário do usuário

Agora o código precisa determinar o próximo aniversário do usuário. Primeiro, o código combina o ano e o mês de seu aniversário com o ano atual. Em segundo lugar, o código determinará se o aniversário do usuário já passou neste ano. Se tiver passado, o código adicionará um ano ao valor do próximo aniversário.

a. Dentro do HasBirthdayLaunchRequestHandler, na função handle (), crie uma nova linha logo abaixo das linhas que você acabou de adicionar (const currentDate e const currentYear). Copie e cole o seguinte código:

// getting the next birthday
let nextBirthday = Date.parse(`${month} ${day}, ${currentYear}`);

// adjust the nextBirthday by one year if the current date is after their birthday
if (currentDate.getTime() > nextBirthday) {
nextBirthday = Date.parse(`${month} ${day}, ${currentYear + 1}`);
}

b. Clique em Save (Salvar)

save button

Etapa 7: calcular a diferença entre a data atual e o próximo aniversário do usuário

Agora que o código tem a data atual e a data do próximo aniversário do usuário, é hora de calcular a diferença. Primeiro, o código precisa converter cada data em Unix epoch time (o número de segundos decorridos desde 00:00:00 de 1 de janeiro de 1970, UTC (Coordinated Universal Time), menos segundos bissextos).

Em segundo lugar, o código calculará a diferença em milissegundos entre as duas datas e obterá o valor absoluto da diferença.

Finalmente, o código converterá a diferença em milissegundos de volta para dias. Um dia em milissegundos = 24 horas x 60 minutos x 60 segundos x 1000 milissegundos.

Abaixo é como isso apareceria no código, mas ainda não o adicione ao código:

const oneDay = 24*60*60*1000;
const diffDays = Math.round(Math.abs((currentDate.getTime() - nextBirthday)/oneDay));

O código só precisa calcular a diferença quando não é o aniversário do usuário. Portanto, você envolverá esse código em uma condicional if (se) que verificará se a data atual é a data de nascimento do usuário.

Se é o aniversário do usuário, você quer que a skill lhe deseje um feliz aniversário. Você pode combinar o código para isso com a condicional if, para que quando não for a data de nascimento do usuário, o speechText esteja definido para informar ao usuário quantos dias até o próximo aniversário.

a. Dentro do HasBirthdayLaunchRequestHandler, na função handle (), encontre a linha que começa com const speechText = `Welcome back. Substitua essa linha pelo seguinte código:

const oneDay = 24*60*60*1000;

// setting the default speakOutput to Happy xth Birthday!
// Don't worry about when to use st, th, rd--Alexa will automatically correct the ordinal for you.
let speakOutput = `Happy ${currentYear - year}th birthday!`;
if (currentDate.getTime() !== nextBirthday) {
const diffDays = Math.round(Math.abs((currentDate.getTime() - nextBirthday)/oneDay));
speakOutput = `Welcome back. It looks like there are ${diffDays} days until your ${currentYear - year}th birthday.`
}

b. Clique em Save (Salvar).

save button

Etapa 8: salvar, implementar e testar

a. Clique em Deploy (Implementar) para criar a skill.

b. Vá para a guia Test (Teste), abra a skill e veja se a Alexa responde dizendo quantos dias até o seu próximo aniversário. Se ela o fizer, parabéns!

Código

Se sua skill não estiver funcionando ou se você estiver recebendo algum tipo de erro de sintaxe, faça o download da amostra de código de trabalho a seguir. Vá para a guia Code (Código) no Console do Portal dos Desenvolvedores de Alexa e copie e cole o código no arquivo index.js. Certifique-se de salvar e implantar o código antes de testá-lo.