UNPKG

@ztiknl/sara

Version:

Sentient Artificial Responsive Agent

332 lines (297 loc) 11.7 kB
// include dav module var dav = require('dav'); // include vcf module var vcardparser = require('vcard-parser'); // starting vars var carddav_config = require('./addressbook/connection.json'); var server = carddav_config.host;; var xhr = new dav.transport.Basic( new dav.Credentials({ username: carddav_config.username, password: carddav_config.password }) ); module.exports = { listaddressbooks: listaddrbooks, searchcontact: searchcontact } async function searchcontact(searchstring) { return new Promise(async (resolve) => { await dav.createAccount({ server: server, xhr: xhr, accountType: 'carddav', loadObjects: true }) .then(function(account) { var result = []; var abcount = 0; var addressbookname; var regex = new RegExp(searchstring[1], "i"); while (abcount < account.addressBooks.length) { addressbookname = account.addressBooks[abcount].displayName; var vcrdcount = 0; while (vcrdcount < account.addressBooks[abcount].objects.length) { var accountmatch = false; var vcardraw = account.addressBooks[abcount].objects[vcrdcount].addressData; var vcardobj = vcardparser.parse(vcardraw); var cardarray = []; var titles = []; var fullnames = []; var names = []; var nicknames = []; var orgs = []; var tels = []; var emails = []; var urls = []; var socials = []; var addresses = []; var genders = []; var dob = []; var dod = []; var cats = []; var notes = []; cardarray.push('\tAddressbook:\t'+addressbookname); if (vcardobj.categories && vcardobj.categories.length > 0) { var categoriescount = 0; while (categoriescount < vcardobj.categories.length) { var carddata = vcardobj.categories[categoriescount]; cats[categoriescount] = carddata.value; categoriescount++; if (regex.test(carddata.value)) { accountmatch = true; } }; cardarray.push('Categories:\t'+cats.join(' & ')); } if (vcardobj.gender && vcardobj.gender.length > 0) { var gendercount = 0; while (gendercount < vcardobj.gender.length) { var carddata = vcardobj.gender[gendercount]; genders[gendercount] = carddata.value; gendercount++; if (regex.test(carddata.value)) { accountmatch = true; } }; cardarray.push('Gender:\t\t'+genders.join(', ')); } if (vcardobj.bday && vcardobj.bday.length > 0) { var dobcount = 0; while (dobcount < vcardobj.bday.length) { var carddata = vcardobj.bday[dobcount]; dob[dobcount] = carddata.value; dobcount++; if (regex.test(carddata.value)) { accountmatch = true; } }; cardarray.push('Date of birth:\t'+dob.join(', ')); } if (vcardobj.deathdate && vcardobj.deathdate.length > 0) { var dodcount = 0; while (dodcount < vcardobj.deathdate.length) { var carddata = vcardobj.deathdate[dodcount]; dod[dodcount] = carddata.value; dodcount++; if (regex.test(carddata.value)) { accountmatch = true; } }; cardarray.push('Date of death:\t'+dod.join(', ')); } if (vcardobj.note && vcardobj.note.length > 0) { var notescount = 0; while (notescount < vcardobj.note.length) { var carddata = vcardobj.note[notescount]; notes[notescount] = carddata.value; notescount++; if (regex.test(carddata.value)) { accountmatch = true; } }; cardarray.push('Notes:\t\t'+notes.join('\n\n')); } if (vcardobj.title && vcardobj.title.length > 0) { var titlecount = 0; while (titlecount < vcardobj.title.length) { var carddata = vcardobj.title[titlecount]; titles[titlecount] = carddata.value; titlecount++; if (regex.test(carddata.value)) { accountmatch = true; } }; cardarray.push('Title:\t\t'+titles.join(' & ')); } if (vcardobj.fn && vcardobj.fn.length > 0) { var fncount = 0; while (fncount < vcardobj.fn.length) { var carddata = vcardobj.fn[fncount]; fullnames[fncount] = carddata.value; fncount++; if (regex.test(carddata.value)) { accountmatch = true; } }; cardarray.push('Full name:\t'+fullnames.join(' & ')); } if (vcardobj.n && vcardobj.n.length > 0) { var ncount = 0; while (ncount < vcardobj.n.length) { var carddata = vcardobj.n[ncount]; names[ncount] = carddata.value; ncount++; if (regex.test(carddata.value)) { accountmatch = true; } }; cardarray.push('Names:\t\t'+names.join(' & ')); } if (vcardobj.nickname && vcardobj.nickname.length > 0) { var nncount = 0; while (nncount < vcardobj.nickname.length) { var carddata = vcardobj.nickname[nncount]; nicknames[nncount] = carddata.value; nncount++; if (regex.test(carddata.value)) { accountmatch = true; } }; cardarray.push('Nickname:\t'+nicknames.join(' & ')); } if (vcardobj.org && vcardobj.org.length > 0) { var orgcount = 0; while (orgcount < vcardobj.org.length) { var carddata = vcardobj.org[orgcount]; orgs[orgcount] = carddata.value; orgcount++; if (regex.test(carddata.value)) { accountmatch = true; } }; cardarray.push('Organisation:\t'+orgs.join(' & ')); } if (vcardobj.tel && vcardobj.tel.length > 0) { var telcount = 0; while (telcount < vcardobj.tel.length) { var carddata = vcardobj.tel[telcount]; var teltype = carddata.meta.type[0].replace(/\"/g, '').toLowerCase(); if (teltype.length < 8) { var tabs = '\t\t'; } else { var tabs = '\t'; } tels[telcount] = '('+teltype+')'+tabs+carddata.value; telcount++; if (regex.test(carddata.value)) { accountmatch = true; } }; cardarray.push('Phone nr:\n\t\t'+tels.join('\n\t\t')); } if (vcardobj.email && vcardobj.email.length > 0) { var emailcount = 0; while (emailcount < vcardobj.email.length) { var carddata = vcardobj.email[emailcount]; var emailtype = carddata.meta.type[0].replace(/\"/g, '').toLowerCase(); if (emailtype.length < 8) { var tabs = '\t\t'; } else { var tabs = '\t'; } emails[emailcount] = '('+emailtype+')'+tabs+carddata.value; emailcount++; if (regex.test(carddata.value)) { accountmatch = true; } }; cardarray.push('Email:\n\t\t'+emails.join('\n\t\t')); } if (vcardobj.url && vcardobj.url.length > 0) { var urlcount = 0; while (urlcount < vcardobj.url.length) { var carddata = vcardobj.url[urlcount]; urls[urlcount] = carddata.value; urlcount++; if (regex.test(carddata.value)) { accountmatch = true; } }; cardarray.push('URLs:\n\t\t\t'+urls.join('\n\t\t\t')); } if (vcardobj['X-SOCIALPROFILE'] && vcardobj['X-SOCIALPROFILE'].length > 0) { var socialcount = 0; while (socialcount < vcardobj['X-SOCIALPROFILE'].length) { var carddata = vcardobj['X-SOCIALPROFILE'][socialcount]; var socialtype = carddata.meta.type[0].replace(/\"/g, '').toLowerCase(); if (socialtype.length < 6) { var tabs = '\t\t'; } else { var tabs = '\t'; } socials[socialcount] = '('+socialtype+')'+tabs+carddata.value; socialcount++; if (regex.test(carddata.value)) { accountmatch = true; } }; cardarray.push('Social media:\n\t\t'+socials.join('\n\t\t')); } if (vcardobj.adr && vcardobj.adr.length > 0) { var addresscount = 0; while (addresscount < vcardobj.adr.length) { var carddata = vcardobj.adr[addresscount]; var addresstype = carddata.meta.type[0].replace(/\"/g, '').toLowerCase(); if (addresstype.length < 8) { var tabs = '\t\t'; } else { var tabs = '\t'; } addresses[addresscount] = '('+addresstype+')'+tabs+String(carddata.value).replace(/\,/g, '\n\t\t\t\t'); addresscount++; if (regex.test(carddata.value)) { accountmatch = true; } }; cardarray.push('Address:\n\t\t'+addresses.join('\n\t\t')); } if (accountmatch) { result.push(cardarray.join('\n\t')) } // console.log(cardarray); vcrdcount++; }; abcount++; }; if (result.length > 0) { if (result.length < 2) { result = 'I found '+result.length+' contact using the term \''+searchstring[1]+'\': \n'+result.join(''); } else { result = 'I found '+result.length+' contacts using the term \''+searchstring[1]+'\': \n'+result.join('\n\n'); } } else { result = 'I found no addressbooks in the supplied CardDAV server'; } resolve(result); }); }) } async function listaddrbooks() { return new Promise(async (resolve) => { await dav.createAccount({ server: server, xhr: xhr, accountType: 'carddav' }) .then(function(account) { var result = []; var i = 0; account.addressBooks.forEach(function(addressbook) { result[i] = addressbook.displayName; i++; }); if (result.length > 0) { if (result.length < 2) { result = 'I found '+result.length+' addressbook: \n\t'+result.join(''); } else { result = 'I found '+result.length+' addressbooks: \n\t'+result.join('\n\t'); } } else { result = 'I found no addressbooks in the supplied CardDAV server'; } resolve(result); }); }) }