диалоговое окно, как играть в следующий раз доступны из календаря Google - PullRequest
0 голосов
/ 20 февраля 2020

как дела? Engli sh - мой родной язык, поэтому я сразу извиняюсь.

у меня есть бот в диалоговом потоке, который с некоторыми взаимодействиями помечает события в повестке дня.

пример:

Бот: привет, добро пожаловать в парикмахерскую, вы хотите назначить встречу?

Пользователь: Да

Бот: Как Вас зовут?

Пользователь : Велисон

Бот: Какой день вы хотели бы?

Пользователь: Завтра

Бот: Что время?

Пользователь: 15:00

  • Если у вас есть место в календаре Google

Бот: Хорошо, вы были запланированы на 21 февраля в 3 часа дня

- Если у вас нет места в календаре Google

Бот: Упс , похоже, что у нас нет вакансий на этот день или время, введите check , чтобы попробовать другой раз.

Где я получил код в качестве примера

Код ниже делает это:

 'use strict';

 const functions = require('firebase-functions');
 const {google} = require('googleapis');
 const {WebhookClient} = require('dialogflow-fulfillment');

 // Enter your calendar ID below and service account JSON below
 const calendarId = "id google agenda ";
 const serviceAccount = {json file}; // Starts with {"type": "service_account",...

 // Set up Google Calendar Service account credentials
 const serviceAccountAuth = new google.auth.JWT({
   email: serviceAccount.client_email,
   key: serviceAccount.private_key,
   scopes: 'https://www.googleapis.com/auth/calendar'
 });

 const calendar = google.calendar('v3');
 process.env.DEBUG = 'dialogflow:*'; // enables lib debugging statements

 const timeZoneOffset = '-03:00';

 exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
   const agent = new WebhookClient({ request, response });
   const appointment_nome = agent.parameters.nome;


   function makeAppointment (agent) {
     const dateTimeStart = new Date(Date.parse(agent.parameters.date.split('T')[0] + 'T' + agent.parameters.time.split('T')[1].split('-')[0] + timeZoneOffset));
     const dateTimeEnd = new Date(new Date(dateTimeStart).setHours(dateTimeStart.getHours() + 1));
     const agendamentoString = FormtData(new Date(agent.parameters.date.split('T')[0])) + " às " + agent.parameters.time.split('T')[1].split('-')[0]; 

     // Check the availibility of the time, and make an appointment if there is time on the calendar
     return createCalendarEvent(dateTimeStart, dateTimeEnd, appointment_nome).then(() => {
       let mensagem = `Okay, you were scheduled for *${agendamentoString}* ✅.`;
       response.json({"fulfillmentText": mensagem});
     }).catch(() => {
        let mensagem = `Oops, it appears that we have no vacancies for that day or time, type **check** to try another time.`;
       response.json({"fulfillmentText": mensagem});
     });
   }

   let intentMap = new Map();
   //intentMap.set('Schedule Appointment', makeAppointment);  
   intentMap.set('Default Welcome Intent - yes', makeAppointment);
   agent.handleRequest(intentMap);
 });



 function createCalendarEvent (dateTimeStart, dateTimeEnd, appointment_nome) {
   return new Promise((resolve, reject) => {
     calendar.events.list({
       auth: serviceAccountAuth, // List events for time period
       calendarId: calendarId,
       timeMin: dateTimeStart.toISOString(),
       timeMax: dateTimeEnd.toISOString()
     }, (err, calendarResponse) => {
       // Check if there is a event already on the Calendar
       if (err || calendarResponse.data.items.length > 0) {
         reject(err || new Error('Requested time conflicts with another appointment'));

       } else {
         // Create event for the requested time period
         calendar.events.insert({ auth: serviceAccountAuth,
           calendarId: calendarId,
           resource: {summary:"Cliente: " +  appointment_nome, description: "Cliente: " +  appointment_nome,
             start: {dateTime: dateTimeStart},
             end: {dateTime: dateTimeEnd}}
         }, (err, event) => {
           err ? reject(err) : resolve(event);
         }
         );
       }
     });
   });
 }

 function FormtData(date){
    var nomesMes = [
        "Janeiro", "Fevereiro", "Março", 
        "Abril", "Maio", "Junho","Julho", 
        "Agosto", "Setembro", "Outubro", 
        "Novembro", "Dezembro"
    ];

    var dia = date.getDate();
    var mesIndex = date.getMonth();
    var ano = date.getFullYear();

    return dia + ' ' + nomesMes[mesIndex];

 }

Но проблема в том, что если в моем расписании слишком много расписаний, расписание станет утомительным для пользователя!

Я подумал о чем-то, например,

Бот: Хотели бы вы запланировать стрижку?

Пользователь: да

Бот: Как насчет 21 февраля в 13:00?

-Если пользователь согласен время указано в повестке дня:

пользователь: Да

бот: Хорошо, вы были запланированы на 21 февраля в 13:00

- Если пользователь не согласен он переходит к следующему доступному времени:

Пользователь: Нет

Бот: Как насчет 21 февраля в 2 часа дня?

Я пытался что-то с CalDAV API прочитать Google Calendar, я не получил никакого прогресса Есть ли у кого-нибудь какие-либо идеи, как я буду делать это? является? Большое спасибо заранее

...