diff --git a/main.ts b/main.ts index 50b75f3..041d02e 100644 --- a/main.ts +++ b/main.ts @@ -1,4 +1,11 @@ import { App, Editor, MarkdownView, Modal, Notice, Plugin, PluginSettingTab, Setting } from 'obsidian'; +import { google, authenticate } from 'googleapis'; +// import { authenticate } from '@google-cloud/local-auth'; +const http = require('http'); +const url = require('url'); +const opn = require('open'); +const destroyer = require('server-destroy'); +const gmail = google.gmail('v1'); // Remember to rename these classes and interfaces! @@ -10,6 +17,74 @@ const DEFAULT_SETTINGS: MyPluginSettings = { mySetting: 'default' } +const oauth2Client = new google.auth.OAuth2( + '279747116549-fmun5sm7q8qvqd3qpk0onrhu464vjo0n.apps.googleusercontent.com', + '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', + 'http://localhost:9999/oauth2callback' +); +google.options({ auth: oauth2Client }); + +const scopes = [ + 'https://www.googleapis.com/auth/gmail.readonly' +]; +/** + * Open an http server to accept the oauth callback. In this simple example, the only request to our webserver is to /callback?code= + */ +async function authenticate() { + + return new Promise((resolve, reject) => { + // grab the url that will be used for authorization + const authorizeUrl = oauth2Client.generateAuthUrl({ + access_type: 'offline', + scope: scopes.join(' '), + }); + const server = http + .createServer(async (req, res) => { + try { + if (req.url.indexOf('/oauth2callback') > -1) { + const qs = new url.URL(req.url, 'http://localhost:9999') + .searchParams; + res.end('Authentication successful! Please return to the console.'); + server.destroy(); + const { tokens } = await oauth2Client.getToken(qs.get('code')); + oauth2Client.credentials = tokens; // eslint-disable-line require-atomic-updates + resolve(oauth2Client); + // return oauth2Client + } + } catch (e) { + reject(e); + } + }) + .listen(9999, () => { + // open the browser to the authorize url to start the workflow + opn(authorizeUrl, { wait: false }).then(cp => cp.unref()); + }); + destroyer(server); + }); +} + +async function authorize() { + if (!oauth2Client.credentials.refresh_token) + return authenticate() +} + +async function runSample() { + // retrieve user profile + console.log("runSample") + console.log(oauth2Client) + const res = await gmail.users.labels.list({ + userId: 'me' + }); + console.log(res.data); +} + + +async function gmailFetch() { + console.log(oauth2Client) + console.log('Trigger'); + authorize().then(runSample).catch(console.error) +} + export default class MyPlugin extends Plugin { settings: MyPluginSettings; @@ -17,10 +92,11 @@ export default class MyPlugin extends Plugin { await this.loadSettings(); // This creates an icon in the left ribbon. - const ribbonIconEl = this.addRibbonIcon('dice', 'Sample Plugin', (evt: MouseEvent) => { - // Called when the user clicks the icon. - new Notice('This is a notice!'); - }); + const ribbonIconEl = this.addRibbonIcon('dice', 'gmail fetch', + (evt: MouseEvent) => { + new Notice('GM'); + gmailFetch(); + }); // Perform additional things with the ribbon ribbonIconEl.addClass('my-plugin-ribbon-class'); @@ -30,10 +106,10 @@ export default class MyPlugin extends Plugin { // This adds a simple command that can be triggered anywhere this.addCommand({ - id: 'open-sample-modal-simple', - name: 'Open sample modal (simple)', + id: 'Gmail-Fetch', + name: 'Gmail-Fetch', callback: () => { - new SampleModal(this.app).open(); + gmailFetch() } }); // This adds an editor command that can perform some operation on the current editor instance @@ -97,12 +173,12 @@ class SampleModal extends Modal { } onOpen() { - const {contentEl} = this; + const { contentEl } = this; contentEl.setText('Woah!'); } onClose() { - const {contentEl} = this; + const { contentEl } = this; contentEl.empty(); } } @@ -116,11 +192,11 @@ class SampleSettingTab extends PluginSettingTab { } display(): void { - const {containerEl} = this; + const { containerEl } = this; containerEl.empty(); - containerEl.createEl('h2', {text: 'Settings for my awesome plugin.'}); + containerEl.createEl('h2', { text: 'Settings for my awesome plugin.' }); new Setting(containerEl) .setName('Setting #1') diff --git a/package-lock.json b/package-lock.json index 1f66d49..69dc28c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,9 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "googleapis": "^109.0.0" + "googleapis": "^109.0.0", + "open": "^8.4.0", + "server-destroy": "^1.0.1" }, "devDependencies": { "@types/node": "^16.11.6", @@ -635,6 +637,14 @@ "dev": true, "peer": true }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1684,6 +1694,20 @@ "dev": true, "peer": true }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1735,6 +1759,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1966,6 +2001,22 @@ "wrappy": "1" } }, + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -2239,6 +2290,11 @@ "node": ">=10" } }, + "node_modules/server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2934,6 +2990,11 @@ "dev": true, "peer": true }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -3641,6 +3702,11 @@ "dev": true, "peer": true }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3674,6 +3740,14 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -3857,6 +3931,16 @@ "wrappy": "1" } }, + "open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -4015,6 +4099,11 @@ "lru-cache": "^6.0.0" } }, + "server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==" + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", diff --git a/package.json b/package.json index a9a35e3..bb4f713 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,8 @@ "typescript": "4.7.4" }, "dependencies": { - "googleapis": "^109.0.0" + "googleapis": "^109.0.0", + "open": "^8.4.0", + "server-destroy": "^1.0.1" } } diff --git a/tsconfig.json b/tsconfig.json index 2d6fbdf..12a65f1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,7 +10,7 @@ "moduleResolution": "node", "importHelpers": true, "isolatedModules": true, - "strictNullChecks": true, + "strictNullChecks": true, "lib": [ "DOM", "ES5", @@ -21,4 +21,4 @@ "include": [ "**/*.ts" ] -} +} \ No newline at end of file