diff --git a/app.js b/app.js index af24efc..89846a6 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; @@ -90,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 88cc317..45b5c21 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,28 +36,35 @@ 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 { 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; } @@ -70,25 +77,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,61 +117,85 @@ var meetingHandler = function(data, message, user){ state.time = result.parameters.time; 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; - } + } 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; + // } + 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}; + 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){ - 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"); @@ -159,37 +204,59 @@ 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(); } 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 +264,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 +277,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 +286,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 +313,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..f0af074 100644 --- a/functions.js +++ b/functions.js @@ -1,10 +1,45 @@ -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); + console.log("CHECK GOOGLEACCOUNT in checkAccessToken (functions.js)", user.googleAccount); + 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 +53,7 @@ var clearState = function(user){ }); } -var taskPath = function (user) { +var taskPath = (user) => { if(user){ var state = user.pendingState; @@ -64,7 +99,7 @@ var taskPath = function (user) { } -function findAttendees(state){ +var findAttendees = (state) => { return User.find({}) .then(function(users){ @@ -73,15 +108,16 @@ 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}); } }) + console.log("CHECK ATTENDEES Array in findAttendees (functions.js)", attendees); return attendees; }) } -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 +126,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 +194,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..e9569c1 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", @@ -88,21 +97,39 @@ 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){ - 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; + console.log("ATTENDEES ARRAY in findAttendeesHere", attendees); + return new Promise(function(resolve, reject) { + resolve(attendees); + }) + // return attendees; + }) + .catch(function(err) { + console.log("Error in findAttendeesHere", err); }) - } var pendingFunction = function(user, attendees){ @@ -129,12 +156,14 @@ 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) + return attendees + .then((attendees) => { + console.log("ATTENDEES received,", attendees, " proceeding to check calendars"); var calendarPromises = []; var attendeeCalendars; var busyArray = []; @@ -186,27 +215,26 @@ var checkConflict = function(user){ console.log("there is no conflict"); return "NoConflict"; // no conflict; } - - return getSlots(busyArray, user); + return Promise.resolve(getSlots(busyArray, user)); + // 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){ @@ -217,20 +245,34 @@ 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); + 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") { 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);