1
1
mirror of https://github.com/leon-ai/leon.git synced 2024-11-27 08:06:03 +03:00

chore: remove synchronization capability

This commit is contained in:
Divlo 2023-05-26 22:58:26 +02:00
parent b9dbc5012c
commit 99b5e7ab6d
No known key found for this signature in database
GPG Key ID: 8F9478F220CE65E9
5 changed files with 0 additions and 282 deletions

View File

@ -5,12 +5,6 @@
"errors": {
"not_found": "Sorry, it seems I cannot find that"
},
"synchronizer": {
"syncing_direct": "I will now synchronize the downloaded content on your current device. Don't worry, I will let you know once I'm done",
"synced_direct": "The new content has been synchronized on your device",
"syncing_google_drive": "I will now synchronize the downloaded content on Google Drive. Don't worry, I will let you know once I'm done",
"synced_google_drive": "The new content is now available on Google Drive"
},
"random_errors": [
"Sorry, there is a problem with my system. Please check my logs for further details",
"Sorry, I don't work correctly. Please look at my logs for more information",

View File

@ -6,12 +6,6 @@
"not_found": "Désolé, il semblerait que je n'arrive pas à trouver ça",
"nlu": "L'erreur semble provenir de ma compréhension de langage naturel. Voici plus de détails au sujet de cette dernière : \"%error%\""
},
"synchronizer": {
"syncing_direct": "Je vais maintenant synchroniser le contenu téléchargé sur votre appareil actuel. Ne vous inquiétez pas, je vous préviendrai lorsque j'aurai terminé",
"synced_direct": "Le nouveau contenu a été synchronisé sur votre appareil",
"syncing_google_drive": "Je vais maintenant synchroniser le contenu téléchargé sur Google Drive. Ne vous inquiétez pas, je vous préviendrai lorsque j'aurai terminé",
"synced_google_drive": "Le nouveau contenu est maintenant disponible sur Google Drive"
},
"random_errors": [
"Désolé, il y a un problème avec mon système. Veuillez consulter mes logs pour plus de détails",
"Désolé, je ne fonctionne pas correctement. Merci de regarder mes logs pour plus d'information",

View File

@ -32,7 +32,6 @@ import { LangHelper } from '@/helpers/lang-helper'
import { LogHelper } from '@/helpers/log-helper'
import { SkillDomainHelper } from '@/helpers/skill-domain-helper'
import { StringHelper } from '@/helpers/string-helper'
import Synchronizer from '@/core/synchronizer'
import type { AnswerOutput } from '@sdk/types'
import { DateHelper } from '@/helpers/date-helper'
@ -420,28 +419,6 @@ export default class Brain {
if (this.skillOutput !== '') {
try {
skillResult = JSON.parse(this.skillOutput)
// Synchronize the downloaded content if enabled
if (
skillResult &&
skillResult.output.options['synchronization'] &&
skillResult.output.options['synchronization'].enabled &&
skillResult.output.options['synchronization'].enabled === true
) {
const sync = new Synchronizer(
this,
nluResult.classification,
skillResult.output.options['synchronization']
)
// When the synchronization is finished
sync.synchronize((speech: string) => {
if (!this.isMuted) {
this.talk(speech)
}
speeches.push(speech)
})
}
} catch (e) {
LogHelper.title(`${this.skillFriendlyName} skill`)
LogHelper.error(

View File

@ -86,7 +86,6 @@ export interface SkillAnswerOutput extends IntentObject {
answer: SkillAnswerConfigSchema
core?: SkillAnswerCoreData
widget?: unknown // TODO
options: Record<string, string>
}
}

View File

@ -1,246 +0,0 @@
/* eslint-disable */
// TODO: remove the synchronization capability
import fs from 'node:fs'
import path from 'node:path'
import { google } from 'googleapis'
import { waterfall } from 'async'
import { LogHelper } from '@/helpers/log-helper'
class Synchronizer {
constructor(brain, classification, sync) {
this.brain = brain
this.classification = classification
this.sync = sync
this.downloadDir = `${__dirname}/../../../downloads/${this.classification.domain}/${this.classification.skill}`
LogHelper.title('Synchronizer')
LogHelper.success('New instance')
}
/**
* Choose the right method to synchronize
*/
async synchronize(cb) {
let code = 'synced_direct'
this.brain.talk(
`${this.brain.wernicke(
'synchronizer',
`syncing_${this.sync.method.toLowerCase().replace('-', '_')}`
)}.`
)
this.brain.socket.emit('is-typing', false)
if (this.sync.method === 'google-drive') {
code = 'synced_google_drive'
await this.googleDrive()
} else {
await this.direct()
}
return cb(`${this.brain.wernicke('synchronizer', code)}.`)
}
/**
* Direct synchronization method
*/
direct() {
return new Promise((resolve) => {
this.brain.socket.emit('download', {
domain: this.classification.domain,
skill: this.classification.skill,
action: this.classification.action
})
resolve()
})
}
/**
* Google Drive synchronization method
*/
googleDrive() {
return new Promise(async (resolve, reject) => {
const driveFolderName = `leon-${this.classification.domain}-${this.classification.skill}`
const folderMimeType = 'application/vnd.google-apps.folder'
const entities = await fs.promises.readdir(this.downloadDir)
const key = JSON.parse(
await fs.promises.readFile(
path.join(
process.cwd(),
'core/config/synchronizer/google-drive.json'
),
'utf8'
)
)
const authClient = new google.auth.JWT(
key.client_email,
key,
key.private_key,
// Available scopes: https://developers.google.com/identity/protocols/googlescopes
['https://www.googleapis.com/auth/drive'],
null
)
const drive = google.drive({
version: 'v3',
auth: authClient
})
let folderId = ''
waterfall(
[
(cb) => {
drive.files.list({}, (err, list) => {
if (err) {
LogHelper.error(`Error during listing: ${err}`)
return reject(err)
}
cb(null, list)
return true
})
},
(list, cb) => {
if (list.data.files.length === 0) {
return cb(null, false, folderId)
}
// Browse entities
for (let i = 0; i < list.data.files.length; i += 1) {
// In case the skill folder exists
if (
list.data.files[i].mimeType === folderMimeType &&
list.data.files[i].name === driveFolderName
) {
folderId = list.data.files[i].id
return cb(null, true, folderId)
} else if (i + 1 === list.data.files.length) {
return cb(null, false, folderId)
}
// TODO: UI toolbox to reach this scope
// Delete Drive files
/* setTimeout(() => {
drive.files.delete({ fileId: list.data.files[i].id })
LOG.title('Synchronizer'); LOG.success(`"${list.data.files[i].id}" deleted`)
}, 200 * i) */
}
return false
},
(folderExists, folderId, cb) => {
if (folderExists === false) {
// Create the skill folder if it does not exist
drive.files.create(
{
resource: {
name: driveFolderName,
mimeType: folderMimeType
},
fields: 'id'
},
(err, folder) => {
if (err) {
LogHelper.error(`Error during the folder creation: ${err}`)
return reject(err)
}
folderId = folder.data.id
LogHelper.title('Synchronizer')
LogHelper.success(
`"${driveFolderName}" folder created on Google Drive`
)
// Give ownership
return drive.permissions.create(
{
resource: {
type: 'user',
role: 'owner',
emailAddress: this.sync.email
},
emailMessage:
'Hey, I created a new folder to wrap your new content, cheers. Leon.',
transferOwnership: true,
fileId: folderId
},
(err) => {
if (err) {
LogHelper.error(
`Error during the folder permission creation: ${err}`
)
return reject(err)
}
LogHelper.success(
`"${driveFolderName}" ownership transferred`
)
cb(null, folderId)
return true
}
)
}
)
} else {
return cb(null, folderId)
}
return false
},
(folderId, cb) => {
let iEntities = 0
const upload = (i) => {
drive.files.create(
{
resource: {
name: entities[i],
parents: [folderId]
},
media: {
body: fs.createReadStream(
`${this.downloadDir}/${entities[i]}`
)
},
fields: 'id'
},
(err) => {
if (err) {
LogHelper.error(
`Error during the "${entities[i]}" file creation: ${err}`
)
return reject(err)
}
iEntities += 1
LogHelper.title('Synchronizer')
LogHelper.success(
`"${entities[i]}" file added to Google Drive`
)
if (iEntities === entities.length) {
cb(null)
}
return true
}
)
}
// Browse entities in Leon's memory
for (let i = 0; i < entities.length; i += 1) {
// Upload file to Drive
upload(i)
}
}
],
(err) => {
if (err) {
LogHelper.error(err)
return reject(err)
}
// Content available on Google Drive
resolve()
return true
}
)
})
}
}
export default Synchronizer