From 92317b02536ada68a546792bb3e4d103cc66ca1e Mon Sep 17 00:00:00 2001 From: danhuiZ Date: Sat, 22 Jul 2017 17:13:19 -0700 Subject: [PATCH 1/3] meeting partially work --- app.js | 13 +--- bot.js | 158 ++++++++++++++++++++++++++++++++---------------- functions.js | 54 ++++++++++++++--- getConObject.js | 2 +- npm-debug.log | 14 ++--- validate.js | 22 +++++-- 6 files changed, 177 insertions(+), 86 deletions(-) diff --git a/app.js b/app.js index af24efc..6af0ee4 100644 --- a/app.js +++ b/app.js @@ -1,10 +1,9 @@ 'use strict'; - var mongoose = require('mongoose'); mongoose.connect(process.env.MONGODB_URI); var {web, rtm} = require('./bot'); -var {User, Reminder, Meeting} = require('./models'); +var {User, Reminder, Meeting} = require('./models'); //extras @@ -25,18 +24,10 @@ app.use(bodyParser.urlencoded({extended: false})); //google var google = require('googleapis'); -var OAuth2 = google.auth.OAuth2; -function getGoogleAuth() { - return new OAuth2( - process.env.GOOGLE_CLIENT_ID, - process.env.GOOGLE_CLIENT_SECRET, - process.env.DOMAIN + '/connect/callback' - ); -} // functions -var {clearState, taskPath} = require('./functions.js'); +var {clearState, taskPath, meetingPath, getGoogleAuth} = require('./functions.js'); app.get('/connect', function(req, res){ var userId = req.query.auth_id; diff --git a/bot.js b/bot.js index 88cc317..474322f 100644 --- a/bot.js +++ b/bot.js @@ -1,9 +1,9 @@ -var {RtmClient, RTM_EVENTS, WebClient} = require('@slack/client'); +var { RtmClient, RTM_EVENTS, WebClient } = require('@slack/client'); var token = process.env.SLACK_SECRET || ''; var web = new WebClient(token); var rtm = new RtmClient(token); -var {User, Reminder, Meeting} = require('./models'); +var { User, Reminder, Meeting } = require('./models'); var axios = require('axios'); var moment = require('moment'); @@ -36,13 +36,15 @@ var obj = { ] } -var {validate} = require('./validate') +var { checkAccessToken } = require('./functions') +var { validate } = require('./validate') + +var taskHandler = function( { result }, message, state ){ -var taskHandler = function({result}, message, state){ if(result.parameters.date && result.parameters.subject){ state.date = result.parameters.date; state.subject = result.parameters.subject; - obj.attachments[0].text = `Create task to ${state.subject} on ${state.date}`; - web.chat.postMessage(message.channel, "Scheduler Bot", obj,function(err, res) { + obj.attachments[0].text = `Create reminder for Task: ${state.subject} on ${state.date}`; + web.chat.postMessage(message.channel, "Scheduler Bot", obj, function(err, res) { if (err) { console.log('Error:', err); } else { @@ -70,25 +72,39 @@ var taskFunction = function(data, message, user){ } else { state = taskHandler(data, message, state); } - user.pendingState = state ; - user.save(); + var promise = Promise.resolve(user); + promise.then((user) => { + user.pendingState = state; + return user; + }) + .then((user) => (user.save())) + .catch((err) => { + console.log("Error in tashFunction!!", err); + }) } var setTask = function(user, message){ - var temp = encodeURIComponent(message.text); - - axios.get(`https://api.api.ai/api/query?v=20150910&query=${temp}&lang=en&sessionId=${message.user}`, { - "headers": { - "Authorization":"Bearer 678861ee7c0d455287f791fd46d1b344" + axios.get('https://api.api.ai/api/query', { + params: { + v: 20150910, + lang: 'en', + query: message.text, + sessionId: message.user }, + headers: { + Authorization: `Bearer ${process.env.API_AI_TOKEN}` + } }) - .then(function({data}){ + .then(({ data }) => { taskFunction(data, message, user); }) + .catch((err) => { + console.log("Error in setTask function!!", err); + }) } -var meetingHandler = function(data, message, user){ +var meetingHandler = function( { result }, message, user){ var state = user.pendingState; if(result.parameters.date && result.parameters.time && result.parameters.invitees[0]){ @@ -96,8 +112,7 @@ var meetingHandler = function(data, message, user){ state.time = result.parameters.time; state.invitees = result.parameters.invitees; return {state: state, status: true} - } - else{ + } else { if(result.parameters.subject){ state.subject = result.parameters.subject; } @@ -111,38 +126,60 @@ var meetingHandler = function(data, message, user){ state.invitees = result.parameters.invitees; } rtm.sendMessage(result.fulfillment.speech, message.channel); - return {state: state, status: false}; + return { state: state, status: false}; } } var meetingFunction = function(data, message, user){ var state = user.pendingState; - if(!state.date || !state.invitees[0] || !state.time){ - state = meetingHandler(data, message, user).state; - status = meetingHandler(data, message, user).status; - } else if(state.date && state.time && state.invitees[0]){ + var status; + if(state.date && state.time && state.invitees[0]){ // all required sys.params are present rtm.sendMessage("Reply to previous task status", message.channel); return; } else { state = meetingHandler(data, message, user).state; status = meetingHandler(data, message, user).status; } - user.pendingState = state; - user.save(function(user){ + + + // if(!state.date || !state.invitees[0] || !state.time){ + // state = meetingHandler(data, message, user).state; + // status = meetingHandler(data, message, user).status; + // } else if(state.date && state.time && state.invitees[0]){ + // rtm.sendMessage("Reply to previous task status", message.channel); + // return; + // } else { //REPETITION???? *********************************************************** + // state = meetingHandler(data, message, user).state; //no async involved in meetingHandler + // status = meetingHandler(data, message, user).status; //true if all required sys.parameters are present; false if else + // } + + var promise = Promise.resolve(user); + promise.then((user) => { + console.log("USER 1", user); + user.pendingState = state; + return user; + }) + .then((user) => (user.save())) + .then((user) => { + console.log("USER 2", user); if(!status){ console.log("status is false and asking user for more info"); return; } else{ console.log("status is true and entering validation"); + console.log("USER 3", user); validate(user, message); } - }); + }) + .catch((err) => { + console.log("Error in meetingFunction!!", err); + }) } var setString = function(myString, state){ var myArray = myString.split(' '); - myArray.forEach(function(item,index){ + myArray.forEach(function(item, index){ if(item[0]==='<'){ item = item.substring(2,item.length-1); state.inviteesBySlackid.push(item); @@ -159,37 +196,50 @@ var setMeeting = function(user, message){ if(message.text.indexOf('with') !== -1){ console.log("invitees have been provided, setting state and reqString"); - reqString = setString(message.text , user.pendingState); + reqString = setString(message.text, user.pendingState); promise = user.save(); } promise .then(function(user){ - var temp = encodeURIComponent(reqString); - axios.get(`https://api.api.ai/api/query?v=20150910&query=${temp}&lang=en&sessionId=${message.user}`, { - "headers": { - "Authorization":"Bearer 678861ee7c0d455287f791fd46d1b344" + axios.get('https://api.api.ai/api/query', { + params: { + v: 20150910, + lang: 'en', + query: message.text, + sessionId: message.user }, + headers: { + Authorization: `Bearer ${process.env.API_AI_TOKEN}` + } }) .then(function({data}){ + console.log("DATA from API.AI for SETMEETING, invitees", data.result.parameters.invitees); meetingFunction(data, message, user); }) + .catch((err) => { + console.log("Error in setMeeting function", err); + }); }) } +//see what the user wants to do; +//user.active === 0 => created user for requester, not sure what requester wants to do (not reminder/meeting) +//user.active === 1 => requester wants to set reminder +//user.active === 2 => requester wants to schedule a meeting var mainResponseFunction = function(user, message){ console.log("reached main response function"); - if(user.active===0){ + if(user.active === 0){ console.log("user was not active checking if reminder or meeting"); if(message.text.indexOf('remind') !== -1){ - console.log("user wants task setting active=1"); + console.log("user wants reminder setting active=1"); user.active = 1; }else if(message.text.indexOf('meeting') !== -1){ console.log("user wants meeting setting active=2"); user.active = 2; }else { console.log("user is wasting time"); - sendNormalResponse(message); + // sendNormalResponse(message); return; } } @@ -197,9 +247,11 @@ var mainResponseFunction = function(user, message){ if(user.active===1){ console.log("sending to setTask"); setTask(user, message); - }else { + //setTask => taskFunction => taskhandler + } else { console.log("sending to setMeeting"); setMeeting(user, message); + //setMeeting => meetingFunction => meetinghandler } } @@ -208,10 +260,7 @@ var mainResponseFunction = function(user, message){ rtm.on(RTM_EVENTS.MESSAGE, function handleRtmMessage(message){ var dm = rtm.dataStore.getDMByUserId(message.user); - - if (!dm || dm.id !== message.channel || message.type !== 'message') { - return; - } + if (!dm || dm.id !== message.channel || message.type !== 'message') return; var slackUser = rtm.dataStore.getUserById(message.user); @@ -220,25 +269,26 @@ rtm.on(RTM_EVENTS.MESSAGE, function handleRtmMessage(message){ if(!user){ console.log("did not find user creating one"); var user = new User({ - default_meeting_len: 30, slack_ID: message.user, slack_Username: slackUser.profile.real_name, slack_Email: slackUser.profile.email, slack_DM_ID: message.channel, active: 0 - }) - return user.save(); + }).save(); + return user; } else{ - console.log("did find user checking if active or not."); + console.log("USER IS", user); + console.log("USER ACCESS TOKEN EXPIRY DATE", new Date(user.googleAccount.expiry_date)); + console.log("FOUND USER in handleRtmMessage checking if active or not."); if(user.active !== 0){ - console.log("user was active sending to mainResponseFunction"); + console.log("user.active !== 0, sending to mainResponseFunction to handle user requests"); mainResponseFunction(user, message); - return; + return; //Skip the next .then } else{ - console.log("user was not active"); - return user; + console.log("user.active === 0, user was not active"); + return user; //enter the next .then } } }) @@ -246,16 +296,18 @@ rtm.on(RTM_EVENTS.MESSAGE, function handleRtmMessage(message){ console.log("user was not active checking if has google auth or not."); if(user){ if(!user.googleAccount.access_token){ - console.log("user does not have google auth"); + console.log("user has not granted Google calendar access"); + rtm.sendMessage("Hello This is Scheduler bot. In order to schedule reminders for you, I need access to you Google calendar", message.channel); web.chat.postMessage(message.channel, 'Use this link to give access to your google cal account ' + process.env.DOMAIN + '/connect?auth_id=' + user._id); return; - } - else { - console.log("user was not active but has google auth now sending to mainResponseFunction"); - if(user)mainResponseFunction(user, message); - else return; + } else { //user has access_token in MongoDB, check if expired + checkAccessToken(user); + mainResponseFunction(user, message); + // console.log("user was not active but has google auth now sending to mainResponseFunction"); + // if(user) mainResponseFunction(user, message); + // else return; } } }) diff --git a/functions.js b/functions.js index 50ddd88..41107ec 100644 --- a/functions.js +++ b/functions.js @@ -1,10 +1,44 @@ -var {User, Reminder, Meeting} = require('./models'); +var { RtmClient, RTM_EVENTS, WebClient } = require('@slack/client'); +var token = process.env.SLACK_SECRET || ''; +var rtm = new RtmClient(token); +var {User, Reminder, Meeting} = require('./models'); var axios = require('axios'); var moment = require('moment'); var _ = require('underscore'); moment().format(); +var google = require('googleapis'); +var OAuth2 = google.auth.OAuth2; +function getGoogleAuth() { + return new OAuth2( + process.env.GOOGLE_CLIENT_ID, + process.env.GOOGLE_CLIENT_SECRET, + process.env.DOMAIN + '/connect/callback' + ); +} + +// var googleSetCreds = bluebird.promisify() + +var checkAccessToken = ( user ) => { + var curTime = Date.now(); + if ( curTime > user.googleAccount.expiry_date ) { + console.log("EXPIRED ACCESS TOKEN"); + var googleAuth = getGoogleAuth(); + googleAuth.setCredentials(user.googleAccount); + return googleAuth.refreshAccessToken(function(err, tokens) { + rtm.sendMessage('Refreshing user access_token', user.slack_DM_ID); + console.log("REFRESH ACTOKEN PROCESS, TOKENS:", tokens); + user.googleAccount = Object.assign({}, user.googleAccount, tokens); + return user.save(function() { + return user; + }) + }) + } else { + console.log('token still good homie'); + return user; + } +} -var clearState = function(user){ +var clearState = (user) => { user.pendingState = { subject: "", date: "", @@ -18,7 +52,7 @@ var clearState = function(user){ }); } -var taskPath = function (user) { +var taskPath = (user) => { if(user){ var state = user.pendingState; @@ -64,7 +98,7 @@ var taskPath = function (user) { } -function findAttendees(state){ +var findAttendees = (state) => { return User.find({}) .then(function(users){ @@ -73,7 +107,7 @@ function findAttendees(state){ var id = item.slack_ID; console.log(item); if(state.inviteesBySlackid.indexOf(id) !== -1){ - attendees.push({"email": item.googleAccount.email); + attendees.push({"email": item.googleAccount.email}); } }) return attendees; @@ -81,7 +115,7 @@ function findAttendees(state){ } -function calculateEndTimeString(state){ +var calculateEndTimeString = (state) => { //set up for default 30 minute meetings until api.ai is trained better var meetingLength = 60; var end = state.date + 'T' + state.time; @@ -90,13 +124,13 @@ function calculateEndTimeString(state){ return endMoment; } -function calculateStartTimeString(state){ +var calculateStartTimeString = (state) => { var start = state.date + 'T' + state.time; var startMoment = moment(start); return startMoment; } -var meetingPath = function(user){ +var meetingPath = (user) => { var state = user.pendingState; var start = calculateStartTimeString(state); @@ -158,5 +192,7 @@ var meetingPath = function(user){ module.exports = { clearState, taskPath, - meetingPath + meetingPath, + getGoogleAuth, + checkAccessToken } diff --git a/getConObject.js b/getConObject.js index 129a118..5c3eda1 100644 --- a/getConObject.js +++ b/getConObject.js @@ -34,5 +34,5 @@ var getConObject = function(array){ } module.exports = { - getConObject; + getConObject } diff --git a/npm-debug.log b/npm-debug.log index 421dfbd..fdcc011 100644 --- a/npm-debug.log +++ b/npm-debug.log @@ -1,14 +1,14 @@ 0 info it worked if it ends with ok 1 verbose cli [ '/usr/local/bin/node', '/usr/local/bin/npm', 'start' ] 2 info using npm@3.10.10 -3 info using node@v6.10.0 +3 info using node@v6.11.0 4 verbose run-script [ 'prestart', 'start', 'poststart' ] 5 info lifecycle NewBot@0.0.0~prestart: NewBot@0.0.0 6 silly lifecycle NewBot@0.0.0~prestart: no script for prestart, continuing 7 info lifecycle NewBot@0.0.0~start: NewBot@0.0.0 8 verbose lifecycle NewBot@0.0.0~start: unsafe-perm in lifecycle true -9 verbose lifecycle NewBot@0.0.0~start: PATH: /usr/local/lib/node_modules/npm/bin/node-gyp-bin:/Users/yashvardhannevatia/horizons/NewBot/node_modules/.bin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin -10 verbose lifecycle NewBot@0.0.0~start: CWD: /Users/yashvardhannevatia/horizons/NewBot +9 verbose lifecycle NewBot@0.0.0~start: PATH: /usr/local/lib/node_modules/npm/bin/node-gyp-bin:/Users/zhangdanhui/horizons/NewBot/node_modules/.bin:/Applications/anaconda/bin:/Library/Frameworks/Python.framework/Versions/3.6/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin +10 verbose lifecycle NewBot@0.0.0~start: CWD: /Users/zhangdanhui/horizons/NewBot 11 silly lifecycle NewBot@0.0.0~start: Args: [ '-c', 'node app.js' ] 12 silly lifecycle NewBot@0.0.0~start: Returned: code: 1 signal: null 13 info lifecycle NewBot@0.0.0~start: Failed to exec start script @@ -20,13 +20,13 @@ 14 verbose stack at ChildProcess. (/usr/local/lib/node_modules/npm/lib/utils/spawn.js:40:14) 14 verbose stack at emitTwo (events.js:106:13) 14 verbose stack at ChildProcess.emit (events.js:191:7) -14 verbose stack at maybeClose (internal/child_process.js:877:16) +14 verbose stack at maybeClose (internal/child_process.js:891:16) 14 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5) 15 verbose pkgid NewBot@0.0.0 -16 verbose cwd /Users/yashvardhannevatia/horizons/NewBot -17 error Darwin 16.6.0 +16 verbose cwd /Users/zhangdanhui/horizons/NewBot +17 error Darwin 15.4.0 18 error argv "/usr/local/bin/node" "/usr/local/bin/npm" "start" -19 error node v6.10.0 +19 error node v6.11.0 20 error npm v3.10.10 21 error code ELIFECYCLE 22 error NewBot@0.0.0 start: `node app.js` diff --git a/validate.js b/validate.js index c806a1f..6cd7a2f 100644 --- a/validate.js +++ b/validate.js @@ -92,12 +92,24 @@ var findAttendeesHere = function(user){ .then(function(people){ people.forEach(function(item, index){ if(!item){ - attendees.push({"slack_ID": array[index], "email":"", "access_token":""}); + attendees.push({ + "slack_ID": array[index], + "email":"", + "access_token":"" + }); rtm.sendMessage("say hi",rtm.getDmById(array[index])) // ask jay - }else if(!item.googleAccount){ - attendees.push({"slack_ID": item.id, "email":"", "access_token":""}); - }else { - attendees.push({"slack_ID": item.slack_ID, "email": item.googleAccount.email, "access_token": item.googleAccount.access_token}); + } else if (!item.googleAccount) { + attendees.push({ + "slack_ID": item.id, + "email":"", + "access_token":"" + }); + } else { + attendees.push({ + "slack_ID": item.slack_ID, + "email": item.googleAccount.email, + "access_token": item.googleAccount.access_token + }); } }) return attendees; From 80565e3d17973b43ed38c2bb7e7f3086d04ea387 Mon Sep 17 00:00:00 2001 From: danhuiZ Date: Sun, 23 Jul 2017 01:10:47 -0700 Subject: [PATCH 2/3] Need to solve Promise issues in validate.js line 165 and 255 --- app.js | 2 ++ bot.js | 91 +++++++++++++++++++++++++++++++--------------------- functions.js | 2 ++ validate.js | 90 ++++++++++++++++++++++++++++++++++----------------- 4 files changed, 119 insertions(+), 66 deletions(-) diff --git a/app.js b/app.js index 6af0ee4..89846a6 100644 --- a/app.js +++ b/app.js @@ -81,7 +81,9 @@ app.get('/connect/callback', function(req, res){ return User.findById(req.query.state); }) .then(function(mongoUser) { + console.log("CHECK googleUser IN APP.JS", googleUser); mongoUser.googleAccount = tokens; + mongoUser.googleAccount.email = googleUser.emails[0].value; mongoUser.googleAccount.profile_ID = googleUser.id; mongoUser.googleAccount.profile_name = googleUser.displayName; return mongoUser.save(); diff --git a/bot.js b/bot.js index 474322f..45b5c21 100644 --- a/bot.js +++ b/bot.js @@ -51,15 +51,20 @@ var taskHandler = function( { result }, message, state ){ console.log('Message sent: ', res); } }); - } else if(result.parameters.subject){ - state.subject = result.parameters.subject; - rtm.sendMessage(result.fulfillment.speech, message.channel); - } else if(result.parameters.date){ - state.date = result.parameters.date; - rtm.sendMessage(result.fulfillment.speech, message.channel); - }else{ - rtm.sendMessage(result.fulfillment.speech, message.channel); - } + // } else if(result.parameters.subject){ + // state.subject = result.parameters.subject; + // rtm.sendMessage(result.fulfillment.speech, message.channel); + // } else if(result.parameters.date){ + // state.date = result.parameters.date; + // rtm.sendMessage(result.fulfillment.speech, message.channel); + // }else{ + // rtm.sendMessage(result.fulfillment.speech, message.channel); + // } +} else { + state.subject = result.parameters.subject; + state.date = result.parameters.date; + rtm.sendMessage(result.fulfillment.speech, message.channel); +} return state; } @@ -113,18 +118,22 @@ var meetingHandler = function( { result }, message, user){ state.invitees = result.parameters.invitees; return {state: state, status: true} } else { - if(result.parameters.subject){ - state.subject = result.parameters.subject; - } - if(result.parameters.date){ - state.date = result.parameters.date; - } - if(result.parameters.time){ - state.time = result.parameters.time; - } - if(result.parameters.invitees[0]){ - state.invitees = result.parameters.invitees; - } + // if(result.parameters.subject){ + // state.subject = result.parameters.subject; + // } + // if(result.parameters.date){ + // state.date = result.parameters.date; + // } + // if(result.parameters.time){ + // state.time = result.parameters.time; + // } + // if(result.parameters.invitees[0]){ + // state.invitees = result.parameters.invitees; + // } + state.subject = result.parameters.subject; + state.date = result.parameters.date; + state.time = result.parameters.time; + state.invitees = result.parameters.invitees; rtm.sendMessage(result.fulfillment.speech, message.channel); return { state: state, status: false}; } @@ -140,8 +149,6 @@ var meetingFunction = function(data, message, user){ state = meetingHandler(data, message, user).state; status = meetingHandler(data, message, user).status; } - - // if(!state.date || !state.invitees[0] || !state.time){ // state = meetingHandler(data, message, user).state; // status = meetingHandler(data, message, user).status; @@ -161,14 +168,14 @@ var meetingFunction = function(data, message, user){ }) .then((user) => (user.save())) .then((user) => { - console.log("USER 2", user); + // console.log("USER 2", user); if(!status){ console.log("status is false and asking user for more info"); return; } else{ console.log("status is true and entering validation"); - console.log("USER 3", user); + // console.log("USER 3", user); validate(user, message); } }) @@ -177,17 +184,18 @@ var meetingFunction = function(data, message, user){ }) } -var setString = function(myString, state){ - var myArray = myString.split(' '); - myArray.forEach(function(item, index){ - if(item[0]==='<'){ - item = item.substring(2,item.length-1); - state.inviteesBySlackid.push(item); - myArray[index] = rtm.dataStore.getUserById(item).real_name; - } - }); - return myArray.join(' '); -} +// var setString = function(myString, state){ + // var myArray = myString.split(' '); + // myArray.forEach(function(item, index){ + // if(item[0]==='<'){ + // item = item.substring(2,item.length-1); + // state.inviteesBySlackid.push(item); + // myArray[index] = rtm.dataStore.getUserById(item).real_name; + // } + // }); + // return myArray.join(' '); + // var regex = /<@\w+>/g; +// } var setMeeting = function(user, message){ console.log("entered setMeeting function"); @@ -196,7 +204,16 @@ var setMeeting = function(user, message){ if(message.text.indexOf('with') !== -1){ console.log("invitees have been provided, setting state and reqString"); - reqString = setString(message.text, user.pendingState); + var regex = /<@\w+>/g; + message.text = message.text.replace(regex, function(match) { + var userId = match.slice(2, -1); + user.pendingState.inviteesBySlackid.push(userId); + var invitee = rtm.dataStore.getUserById(userId); + console.log("SLACK USERS", userId, invitee); + return invitee.profile.first_name || invitee.profile.real_name; + }) + + // reqString = setString(message.text, user.pendingState); promise = user.save(); } diff --git a/functions.js b/functions.js index 41107ec..f0af074 100644 --- a/functions.js +++ b/functions.js @@ -28,6 +28,7 @@ var checkAccessToken = ( user ) => { rtm.sendMessage('Refreshing user access_token', user.slack_DM_ID); console.log("REFRESH ACTOKEN PROCESS, TOKENS:", tokens); user.googleAccount = Object.assign({}, user.googleAccount, tokens); + console.log("CHECK GOOGLEACCOUNT in checkAccessToken (functions.js)", user.googleAccount); return user.save(function() { return user; }) @@ -110,6 +111,7 @@ var findAttendees = (state) => { attendees.push({"email": item.googleAccount.email}); } }) + console.log("CHECK ATTENDEES Array in findAttendees (functions.js)", attendees); return attendees; }) diff --git a/validate.js b/validate.js index 6cd7a2f..db2eadc 100644 --- a/validate.js +++ b/validate.js @@ -6,6 +6,7 @@ var rtm = new RtmClient(token); var {User, Reminder, Meeting} = require('./models'); var {getSlots} = require('./getSlots'); var {getConObject} = require('./getConObject'); +var {calculateStartTimeString} = require('./functions') var axios = require('axios'); var moment = require('moment'); var _ = require('underscore'); @@ -39,10 +40,18 @@ var obj = { var timeCheck = function(user, message){ console.log("entered time check"); - var date = new Date(); - var hourNow = date.getHours(); - var meetingHour = parseInt(user.pendingState.time.substring(0,2)); - if(meetingHour - hourNow < 4 ){ + console.log("MESSAGE", message); + var dateNow = new Date(); + var dateArr = user.pendingState.date.split('-'); + var timeArr = user.pendingState.time.split('-'); + var dateMeet = new Date(Date.UTC(dateArr[0], dateArr[1]-1, dateArr[2], timeArr[0]+7, timeArr[1], timeArr[2])); + //note changes for month, and GMT-700 timezone + var hoursDiff = Math.abs(dateNow - dateMeet) / 36e5; + + // var date = new Date(); + // var hourNow = date.getHours(); + // var meetingHour = parseInt(user.pendingState.time.substring(0,2)); + if(hoursDiff < 4 ){ obj.attachments[0].text = `Too soon to schedule a meeting bro`; obj.attachments.actions = [{ "name": "cancel", @@ -112,9 +121,16 @@ var findAttendeesHere = function(user){ }); } }) - return attendees; + console.log("ATTENDEES ARRAY in findAttendeesHere", attendees); + return new Promise(function(resolve, reject) { + resolve(attendees); + // reject(err); + }) + // return attendees; + }) + .catch(function(err) { + console.log("Error in findAttendeesHere", err); }) - } var pendingFunction = function(user, attendees){ @@ -141,12 +157,15 @@ var pendingFunction = function(user, attendees){ }) } +// var bluebird = require('bluebird') + var checkConflict = function(user){ console.log("entered check conflict"); - - return findAttendeesHere(user) - .then(attendees => { - console.log("attendees recieved proceeding to check calendars"); + var attendees = findAttendeesHere(user) + attendees = Promise.resolve(attendees); + attendees + .then((attendees) => { + console.log("attendees received, proceeding to check calendars"); var calendarPromises = []; var attendeeCalendars; var busyArray = []; @@ -198,27 +217,30 @@ var checkConflict = function(user){ console.log("there is no conflict"); return "NoConflict"; // no conflict; } - - return getSlots(busyArray, user); + return new Promise(function(resolve, reject) { + var gotSlots = getSlots(busyArray, user); + resolve(gotSlots); + // reject(); + }) + // return getSlots(busyArray, user); }) .catch(function(err){ console.log(err) }); - }) } -var setString = function(myString){ - var myArray = myString.split(' '); - myArray.forEach(function(item,index){ - if(item[0]==='<'){ - item = item.substring(2,item.length-1); - myArray[index] = rtm.dataStore.getUserById(item).real_name; - } - }); - return myArray.join(' '); -} +// var setString = function(myString){ +// var myArray = myString.split(' '); +// myArray.forEach(function(item,index){ +// if(item[0]==='<'){ +// item = item.substring(2,item.length-1); +// myArray[index] = rtm.dataStore.getUserById(item).real_name; +// } +// }); +// return myArray.join(' '); +// } var validate = function(user, message){ @@ -229,20 +251,30 @@ var validate = function(user, message){ } else{ console.log("time check returned true proceeding to conflict check"); - checkConflict(user) - .then( response => { - if (response === "People are unavailable"){ + var response = checkConflict(user); + response = Promise.resolve(response) + response + .then((response) => { + if (response === "People are unavailable") { rtm.sendMessage("People are unavailable, the request has been sent to them, meeting will be scheduled once they accept it.", user.slack_DM_ID); - } else if (response === 'NoConflict'){ + } else if (response === 'NoConflict') { console.log("there was no conflict"); - var inviteString = setString(message.text); - obj.attachments[0].text = `Schedule meeting with ${inviteString} on ${user.pendingState.date} ${user.pendingState.time} about ${user.pendingState.subject}`; + var regex = /<@\w+>/g; + message.text = message.text.replace(regex, function(match) { + var userId = match.slice(2, -1); + var invitee = rtm.dataStore.getUserById(userId); + console.log("Inside Validate, SLACK USERS", userId, invitee); + return invitee.profile.first_name || invitee.profile.real_name; + }) + // var inviteString = setString(message.text); + obj.attachments[0].text = `Schedule meeting with ${message.text} on ${user.pendingState.date} ${user.pendingState.time} about ${user.pendingState.subject}`; web.chat.postMessage(message.channel, "Scheduler Bot", obj,function(err, res) { if (err) console.log('Error:', err); else console.log('Message sent: ', res); }); } else { console.log("entered conflict"); + console.log("RESPONSE", response); var targetObj = getConObject(response); web.chat.postMessage(message.channel, "Scheduler Bot", targetObj,function(err, res) { if (err) console.log('Error:', err); From 13395562aabe70eab54e81bbde872632ba78fa19 Mon Sep 17 00:00:00 2001 From: danhuiZ Date: Mon, 24 Jul 2017 09:57:32 -0700 Subject: [PATCH 3/3] changes to validate.js --- validate.js | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/validate.js b/validate.js index db2eadc..e9569c1 100644 --- a/validate.js +++ b/validate.js @@ -97,7 +97,7 @@ var findAttendeesHere = function(user){ attendeesPromises.push(User.findOne({slack_ID:item})); }) - Promise.all(attendeesPromises) + return Promise.all(attendeesPromises) .then(function(people){ people.forEach(function(item, index){ if(!item){ @@ -124,7 +124,6 @@ var findAttendeesHere = function(user){ console.log("ATTENDEES ARRAY in findAttendeesHere", attendees); return new Promise(function(resolve, reject) { resolve(attendees); - // reject(err); }) // return attendees; }) @@ -162,10 +161,9 @@ var pendingFunction = function(user, attendees){ var checkConflict = function(user){ console.log("entered check conflict"); var attendees = findAttendeesHere(user) - attendees = Promise.resolve(attendees); - attendees + return attendees .then((attendees) => { - console.log("attendees received, proceeding to check calendars"); + console.log("ATTENDEES received,", attendees, " proceeding to check calendars"); var calendarPromises = []; var attendeeCalendars; var busyArray = []; @@ -217,11 +215,7 @@ var checkConflict = function(user){ console.log("there is no conflict"); return "NoConflict"; // no conflict; } - return new Promise(function(resolve, reject) { - var gotSlots = getSlots(busyArray, user); - resolve(gotSlots); - // reject(); - }) + return Promise.resolve(getSlots(busyArray, user)); // return getSlots(busyArray, user); }) .catch(function(err){ @@ -251,8 +245,12 @@ var validate = function(user, message){ } else{ console.log("time check returned true proceeding to conflict check"); - var response = checkConflict(user); - response = Promise.resolve(response) + // var response = checkConflict(user); + var response; + response = Promise.resolve(checkConflict(user)); + + console.log("IS RESPONSE A PROMISE", response); + // response = Promise.resolve(response) response .then((response) => { if (response === "People are unavailable") {