-
-The trading engine hierarchy is the data structure used by the trading bot to keep runtime information highly accessible and exposed to others.
-
-
-
-
You will use this hierarchy for two main purposes:
-
-
The hierarchy exposes—literally—all the information processed by the trading bot, providing a comprehensive feedback loop to trading systems and analysis capabilities to users. The hierarchy exposes—literally—all the information processed by the trading bot, providing a comprehensive feedback loop to trading systems and analysis capabilities to users.
-
-
-
-
To let your trading systems: This allows strategies to keep track of and react to current and past events—including those involving the exchange, such as orders placed or filled—as the bot is running.
-
-
-
To keep track of the actions: By analyzing runtime information, you may gain a detailed understanding of what happens, when, and why, throughout a trading session.
-
-
-
-
The hierarchy exposes—literally—all the information processed by the trading bot, providing a comprehensive feedback loop to trading systems and analysis capabilities to users.
-
-
Este callout se usa para resaltar una idea particularmente importante. Algo se sobresale, como una conclusion, o algo por el estilo.
-
-
The hierarchy exposes all the information processed by the trading bot, providing a comprehensive feedback loop to trading systems and analysis capabilities to users. The hierarchy exposes all the information processed by the trading bot, providing a comprehensive feedback loop to trading systems and analysis capabilities to users.
-
-
Note: Esto es una nota, algo noteworthy.
-
-
Tip: Esto es un tip.
-
-
Important: Esto es algo importante.
-
-
Warning: Esto es una aviso de alerta.
-
-
Adding a Trading Engine Node
-
-
Calculo que con este segundo nivel de titulo alcanza.
-
-
Este es otro formato tipico de la doc: Trading Engine
-
-
-
-
-
-
-
-The trading engine hierarchy is the data structure used by the trading bot to keep runtime information highly accessible and exposed to others.
-
-
diff --git a/Client/httpInterface.js b/Client/httpInterface.js
deleted file mode 100644
index f18721f62..000000000
--- a/Client/httpInterface.js
+++ /dev/null
@@ -1,2123 +0,0 @@
-exports.newHttpInterface = function newHttpInterface() {
-
- /*
- IMPORTANT: If you are reviewing the code of the project please note
- that this file is the single file in the whole system that accumulated
- more technical debt by far. I did not have the time yet to pay the
- technical debt, and therefore there is a lot to reorganize in here.
- I will remove this note once this job is done.
- */
- let thisObject = {
- initialize: initialize,
- finalize: finalize,
- run: run
- }
-
- const open = require('open')
-
- let port = global.env.HTTP_INTERFACE_PORT
-
- let http = require('http')
- let isHttpServerStarted = false
-
- let webhook = new Map()
-
- return thisObject
-
- function finalize() {
-
- }
-
- function initialize() {
-
- }
-
- function run() {
- startHtttpServer()
- }
-
- function startHtttpServer() {
-
- try {
- if (isHttpServerStarted === false) {
- gWebServer = http.createServer(onBrowserRequest).listen(port)
- isHttpServerStarted = true
- /* Starting the browser now is optional */
- if (process.argv.includes("noBrowser")) {
- //Running Client only with no UI.
- } else {
- open('http://localhost:' + port)
- }
-
- }
- } catch (err) {
- console.log('[ERROR] httpInterface -> startHtttpServer -> Error = ' + err.stack)
- }
- }
-
- function onBrowserRequest(httpRequest, httpResponse) {
-
- function getBody(callback) { // Gets the de body from a POST httpRequest to the web server
- try {
-
- let body = ''
-
- httpRequest.on('data', function (data) {
- body += data
- // Too much POST data
- //if (body.length > 1e6) {
- // httpRequest.connection.destroy()
- //}
- })
-
- httpRequest.on('end', function () {
- callback(body)
- })
-
- httpRequest.on('error', function (err) {
- console.log('[INFO] httpInterface -> onBrowserRequest -> getBody -> err = ' + err.stack)
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- })
- } catch (err) {
- console.log('[INFO] httpInterface -> onBrowserRequest -> getBody -> err = ' + err.stack)
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- }
- }
-
- let requestParameters = httpRequest.url.split('/')
-
- requestParameters = httpRequest.url.split('?') // Remove version information
- requestParameters = requestParameters[0].split('/')
-
- switch (requestParameters[1]) {
-
- case 'WEB3':
- {
- getBody(processRequest)
-
- async function processRequest(body) {
- try {
- let params = JSON.parse(body)
-
- switch (params.method) {
- case 'getNetworkClientStatus': {
-
- let serverResponse = await CL.servers.WEB3_SERVER.getNetworkClientStatus(
- params.host,
- params.port,
- params.interface
- )
-
- respondWithContent(JSON.stringify(serverResponse), httpResponse)
- return
- }
- case 'createWalletAccount': {
-
- let serverResponse = await CL.servers.WEB3_SERVER.createWalletAccount(
- params.entropy
- )
-
- respondWithContent(JSON.stringify(serverResponse), httpResponse)
- return
- }
- case 'getWalletBalances': {
-
- let serverResponse = await CL.servers.WEB3_SERVER.getWalletBalances(
- params.host,
- params.port,
- params.interface,
- params.walletDefinition
- )
-
- respondWithContent(JSON.stringify(serverResponse), httpResponse)
- return
- }
- case 'signData': {
-
- let serverResponse = await CL.servers.WEB3_SERVER.signData(
- params.privateKey,
- params.data
- )
-
- respondWithContent(JSON.stringify(serverResponse), httpResponse)
- return
- }
- case 'recoverAddress': {
-
- let serverResponse = await CL.servers.WEB3_SERVER.recoverAddress(
- params.signature
- )
-
- respondWithContent(JSON.stringify(serverResponse), httpResponse)
- return
- }
- case 'mnemonicToPrivateKey': {
-
- let serverResponse = await CL.servers.WEB3_SERVER.mnemonicToPrivateKey(
- params.mnemonic
- )
-
- respondWithContent(JSON.stringify(serverResponse), httpResponse)
- return
- }
- default: {
- respondWithContent(JSON.stringify({ error: 'Method ' + params.method + ' is invalid.' }), httpResponse)
- }
- }
- } catch (err) {
- console.log('[ERROR] httpInterface -> WEB3s -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> WEB3s -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> WEB3s -> Params Received = ' + body)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
- }
-
- case 'CCXT':
- {
- getBody(processRequest)
-
- async function processRequest(body) {
- try {
- let params = JSON.parse(body)
-
- const ccxt = require('ccxt')
-
- switch (params.method) {
- case 'fetchMarkets': {
-
- const exchangeClass = ccxt[params.exchangeId]
- const exchangeConstructorParams = {
- 'timeout': 30000,
- 'enableRateLimit': true,
- verbose: false
- }
-
- let ccxtExchange = new exchangeClass(exchangeConstructorParams)
- let ccxtMarkets = []
-
- if (ccxtExchange.has.fetchMarkets === true) {
- ccxtMarkets = await ccxtExchange.fetchMarkets()
- }
- respondWithContent(JSON.stringify(ccxtMarkets), httpResponse)
- return
- }
- case 'listExchanges': {
- let exchanges = []
- for (let i = 0; i < ccxt.exchanges.length; i++) {
- let exchangeId = ccxt.exchanges[i]
-
- const exchangeClass = ccxt[exchangeId]
- const exchangeConstructorParams = {
- 'timeout': 30000,
- 'enableRateLimit': true,
- verbose: false
- }
- let ccxtExchange
- try { ccxtExchange = new exchangeClass(exchangeConstructorParams) }
- catch (err) { }
- if (ccxtExchange === undefined) { continue }
-
-
- if (ccxtExchange.has.fetchOHLCV === params.has.fetchOHLCV) {
- if (ccxtExchange.has.fetchMarkets === params.has.fetchMarkets) {
- if (ccxtExchange.timeframes['1m'] !== undefined) {
- let exchange = {
- name: ccxtExchange.name,
- id: ccxtExchange.id
- }
- exchanges.push(exchange)
- }
- }
- }
- }
- respondWithContent(JSON.stringify(exchanges), httpResponse)
- return
- }
- }
-
- let content = {
- err: global.DEFAULT_FAIL_RESPONSE // method not supported
- }
- } catch (err) {
- console.log('[INFO] httpInterface -> CCXT FetchMarkets -> Could not fetch markets.')
- let error = {
- result: 'Fail Because',
- message: err.message
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
- }
- break
-
- case 'Webhook':
- {
- switch (requestParameters[2]) { // switch by command
- case 'Fetch-Messages': {
- let exchange = requestParameters[3]
- let market = requestParameters[4]
-
- /* Some validations */
- if (exchange === undefined) {
- console.log('[WARN] httpInterface -> Webhook -> Fetch-Messages -> Message with no Exchange received -> messageReceived = ' + messageReceived)
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- return
- }
- if (market === undefined) {
- console.log('[WARN] httpInterface -> Webhook -> Fetch-Messages -> Message with no market received -> messageReceived = ' + messageReceived)
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- return
- }
-
- let key = exchange + '-' + market
-
- let webhookMessages = webhook.get(key)
- if (webhookMessages === undefined) {
- webhookMessages = []
- }
-
- console.log('[INFO] httpInterface -> Webhook -> Fetch-Messages -> Exchange-Market = ' + exchange + '-' + market)
- console.log('[INFO] httpInterface -> Webhook -> Fetch-Messages -> Messeges Fetched by Webhooks Sensor Bot = ' + webhookMessages.length)
-
- respondWithContent(JSON.stringify(webhookMessages), httpResponse)
- webhookMessages = []
-
- webhook.set(key, webhookMessages)
- break
- }
- case 'New-Message': {
- getBody(processRequest)
-
- function processRequest(messageReceived) {
- let timestamp = (new Date()).valueOf()
- let source = requestParameters[3]
- let exchange = requestParameters[4]
- let market = requestParameters[5]
-
- /* Some validations */
- if (source === undefined) {
- console.log('[WARN] httpInterface -> Webhook -> New-Message -> Message with no Source received -> messageReceived = ' + messageReceived)
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- return
- }
- if (exchange === undefined) {
- console.log('[WARN] httpInterface -> Webhook -> New-Message -> Message with no Exchange received -> messageReceived = ' + messageReceived)
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- return
- }
- if (market === undefined) {
- console.log('[WARN] httpInterface -> Webhook -> New-Message -> Message with no market received -> messageReceived = ' + messageReceived)
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- return
- }
-
- let key = exchange + '-' + market
-
- let webhookMessages = webhook.get(key)
- if (webhookMessages === undefined) {
- webhookMessages = []
- }
-
- webhookMessages.push([timestamp, source, messageReceived])
- webhook.set(key, webhookMessages)
-
- console.log('[INFO] httpInterface -> Webhook -> New-Message -> Exchange-Market = ' + exchange + '-' + market)
- console.log('[INFO] httpInterface -> Webhook -> New-Message -> messageReceived = ' + messageReceived)
- console.log('[INFO] httpInterface -> Webhook -> New-Message -> Messeges waiting to be Fetched by Webhooks Sensor Bot = ' + webhookMessages.length)
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- }
- break
- }
- }
- break
- }
- break
-
- case 'Docs':
- {
- switch (requestParameters[2]) { // switch by command
- case 'Save-Node-Schema': {
- getBody(processRequest)
-
- async function processRequest(body) {
- try {
- let docsSchema = JSON.parse(body)
- let project = requestParameters[3]
- let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Nodes'
-
- if (checkAllSchmemaDocuments('Node', docsSchema, filePath) === true) {
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- } else {
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- }
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> Docs -> Save-Node-Schema -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> Docs -> Save-Node-Schema -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> Docs -> Save-Node-Schema -> Params Received = ' + body)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
- }
-
- case 'Save-Concept-Schema': {
- getBody(processRequest)
-
- async function processRequest(body) {
- try {
- let docsSchema = JSON.parse(body)
- let project = requestParameters[3]
- let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Concepts'
-
- if (checkAllSchmemaDocuments('Concept', docsSchema, filePath) === true) {
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- } else {
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- }
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> Docs -> Save-Concept-Schema -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> Docs -> Save-Concept-Schema -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> Docs -> Save-Concept-Schema -> Params Received = ' + body)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
- }
-
- case 'Save-Topic-Schema': {
- getBody(processRequest)
-
- async function processRequest(body) {
- try {
- let docsSchema = JSON.parse(body)
- let project = requestParameters[3]
- let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Topics'
-
- if (checkAllSchmemaDocuments('Topic', docsSchema, filePath) === true) {
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- } else {
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- }
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> Docs -> Save-Topic-Schema -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> Docs -> Save-Topic-Schema -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> Docs -> Save-Topic-Schema -> Params Received = ' + body)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
- }
-
- case 'Save-Tutorial-Schema': {
- getBody(processRequest)
-
- async function processRequest(body) {
- try {
- let docsSchema = JSON.parse(body)
- let project = requestParameters[3]
- let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Tutorials'
-
- if (checkAllSchmemaDocuments('Tutorial', docsSchema, filePath) === true) {
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- } else {
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- }
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> Docs -> Save-Tutorial-Schema -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> Docs -> Save-Tutorial-Schema -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> Docs -> Save-Tutorial-Schema -> Params Received = ' + body)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
- }
-
- case 'Save-Review-Schema': {
- getBody(processRequest)
-
- async function processRequest(body) {
- try {
- let docsSchema = JSON.parse(body)
- let project = requestParameters[3]
- let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Reviews'
-
- if (checkAllSchmemaDocuments('Review', docsSchema, filePath) === true) {
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- } else {
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- }
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> Docs -> Save-Review-Schema -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> Docs -> Save-Review-Schema -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> Docs -> Save-Review-Schema -> Params Received = ' + body)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
- }
-
- case 'Save-Book-Schema': {
- getBody(processRequest)
-
- async function processRequest(body) {
- try {
- let docsSchema = JSON.parse(body)
- let project = requestParameters[3]
- let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Books'
-
- if (checkAllSchmemaDocuments('Book', docsSchema, filePath) === true) {
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- } else {
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- }
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> Docs -> Save-Book-Schema -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> Docs -> Save-Book-Schema -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> Docs -> Save-Book-Schema -> Params Received = ' + body)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
- }
- }
-
- function checkAllSchmemaDocuments(category, docsSchema, filePath) {
- const fs = require('fs')
- let noErrorsDuringSaving = true
-
- for (let i = 0; i < docsSchema.length; i++) {
- let schemaDocument = docsSchema[i]
- /*
- For some type of schemas we will save the file at an extra
- folder derived from the document's type.
- */
- let fileName = schemaDocument.type.toLowerCase()
- for (let j = 0; j < 10; j++) {
- fileName = cleanFileName(fileName)
- }
- let pageNumber = '00' + schemaDocument.pageNumber
- let newFilepath = filePath
- switch (category) {
- case 'Topic': {
- fileName = schemaDocument.topic.toLowerCase() + '-' + pageNumber.substring(pageNumber.length - 3, pageNumber.length) + '-' + schemaDocument.type.toLowerCase()
- fileName = cleanFileName(fileName)
- newFilepath = createPrefixDirectories(filePath, schemaDocument.topic)
- break
- }
- case 'Tutorial': {
- fileName = schemaDocument.tutorial.toLowerCase() + '-' + pageNumber.substring(pageNumber.length - 3, pageNumber.length) + '-' + schemaDocument.type.toLowerCase()
- fileName = cleanFileName(fileName)
- newFilepath = createPrefixDirectories(filePath, schemaDocument.tutorial)
- break
- }
- case 'Review': {
- fileName = schemaDocument.review.toLowerCase() + '-' + pageNumber.substring(pageNumber.length - 3, pageNumber.length) + '-' + schemaDocument.type.toLowerCase()
- fileName = cleanFileName(fileName)
- newFilepath = createPrefixDirectories(filePath, schemaDocument.review)
- break
- }
- case 'Node': {
- newFilepath = createPrefixDirectories(filePath, schemaDocument.type)
- break
- }
- case 'Concept': {
- newFilepath = createPrefixDirectories(filePath, schemaDocument.type)
- break
- }
- }
-
- function createPrefixDirectories(filePath, schemaTextToUse) {
- let firstLetter = schemaTextToUse.substring(0, 1)
- createNewDir(filePath + '/' + firstLetter)
- let extraWord = schemaTextToUse.split(' ')[0]
- createNewDir(filePath + '/' + firstLetter + '/' + extraWord)
- return filePath + '/' + firstLetter + '/' + extraWord + '/' + cleanFileName(schemaTextToUse)
- }
-
- fileName = fileName + '.json'
-
- if (schemaDocument.deleted === true) {
- try {
- fs.unlinkSync(newFilepath + '/' + fileName)
- console.log('[SUCCESS] ' + newFilepath + '/' + fileName + ' deleted.')
- } catch (err) {
- noErrorsDuringSaving = false
- console.log('[ERROR] httpInterface -> Docs -> Delete -> ' + newFilepath + '/' + fileName + ' could not be deleted.')
- console.log('[ERROR] httpInterface -> Docs -> Delete -> Resolve the issue that is preventing the Client to delete this file. Look at the error message below as a guide. At the UI you will need to delete this page again in order for the Client to retry next time you execute the docs.save command.')
- console.log('[ERROR] httpInterface -> Docs -> Delete -> err.stack = ' + err.stack)
- }
- } else {
- if (schemaDocument.updated === true || schemaDocument.created === true) {
- try {
- let created = schemaDocument.created
- let updated = schemaDocument.updated
- schemaDocument.updated = undefined
- schemaDocument.created = undefined
- let fileContent = JSON.stringify(schemaDocument, undefined, 4)
- createNewDir(newFilepath)
- fs.writeFileSync(newFilepath + '/' + fileName, fileContent)
- if (created === true) {
- console.log('[SUCCESS] ' + newFilepath + '/' + fileName + ' created.')
- } else {
- if (updated === true) {
- console.log('[SUCCESS] ' + newFilepath + '/' + fileName + ' updated.')
- }
- }
- } catch (err) {
- noErrorsDuringSaving = false
- console.log('[ERROR] httpInterface -> Docs -> Save -> ' + newFilepath + '/' + fileName + ' could not be created / updated.')
- console.log('[ERROR] httpInterface -> Docs -> Save -> err.stack = ' + err.stack)
- }
- }
- }
-
- function createNewDir(path) {
- try {
- fs.mkdirSync(path)
- } catch (err) {
- if (err.message.indexOf('file already exists') < 0) {
- throw (err)
- }
- }
- }
- }
-
- return noErrorsDuringSaving
- }
-
- function cleanFileName(fileName) {
- for (let i = 0; i < 100; i++) {
- fileName = fileName
- .replace(' ', '-')
- .replace('--', '-')
- .replace('?', '')
- .replace('#', '')
- .replace('$', '')
- .replace('%', '')
- .replace('^', '')
- .replace('&', '')
- .replace('*', '')
- .replace('(', '')
- .replace(')', '')
- .replace('!', '')
- .replace('..', '.')
- .replace(',', '')
- .replace('\'', '')
- }
- return fileName
- }
- }
- break
-
- case 'App': {
- switch (requestParameters[2]) { // switch by command
- case 'Contribute': {
- try {
- let commitMessage = unescape(requestParameters[3])
- const username = unescape(requestParameters[4])
- const token = unescape(requestParameters[5])
- const currentBranch = unescape(requestParameters[6])
- const contributionsBranch = unescape(requestParameters[7])
- let error
-
- /* Unsavping # */
- for (let i = 0; i < 10; i++) {
- commitMessage = commitMessage.replace('_SLASH_', '/')
- commitMessage = commitMessage.replace('_HASHTAG_', '#')
- }
-
- contribute()
-
- async function contribute() {
- const { lookpath } = require('lookpath');
- const gitpath = await lookpath('git');
- if (gitpath === undefined) {
- console.log('[ERROR] `git` not installed.')
- } else {
- await doGit()
- if (error !== undefined) {
-
- let docs = {
- project: 'Foundations',
- category: 'Topic',
- type: 'App Error - Contribution Not Sent',
- anchor: undefined,
- placeholder: {}
- }
-
- respondWithDocsObject(docs, error)
- return
- }
-
- await doGithub()
- if (error !== undefined) {
-
- let docs = {
- project: 'Foundations',
- category: 'Topic',
- type: 'App Error - Contribution Not Sent',
- anchor: undefined,
- placeholder: {}
- }
- console.log('respond with docs ')
-
- respondWithDocsObject(docs, error)
- return
- }
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- }
- }
-
- async function doGit() {
- const simpleGit = require('simple-git');
- const options = {
- baseDir: process.cwd(),
- binary: 'git',
- maxConcurrentProcesses: 6,
- }
- const git = simpleGit(options)
-
- try {
- await git.add('./*')
- await git.commit(commitMessage)
- await git.push('origin', currentBranch)
- } catch (err) {
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> commitMessage = ' + commitMessage)
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> currentBranch = ' + currentBranch)
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> contributionsBranch = ' + contributionsBranch)
- console.log('')
- console.log('Torubleshooting Tips:')
- console.log('')
- console.log('1. Make sure that you have set up your Github Username and Token at the APIs -> Github API node at the workspace.')
- console.log('2. Make sure you are running the latest version of Git available for your OS.')
- console.log('3. Make sure that you have cloned your Superalgos repository fork, and not the main Superalgos repository.')
- console.log('4. If your fork is old, you might need to do an app.update and also a node setup at every branch. If you just reforked all is good.')
- error = err
- }
- }
-
- async function doGithub() {
-
- const { Octokit } = require("@octokit/rest")
-
- const octokit = new Octokit({
- auth: token,
- userAgent: 'Superalgos Beta 11'
- })
-
- const repo = 'Superalgos'
- const owner = 'Superalgos'
- const head = username + ':' + contributionsBranch
- const base = currentBranch
- const title = 'Contribution: ' + commitMessage
-
- try {
- await octokit.pulls.create({
- owner,
- repo,
- title,
- head,
- base,
- });
- } catch (err) {
- if (err.stack.indexOf('A pull request already exists') >= 0) {
- return
- } else {
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> commitMessage = ' + commitMessage)
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> username = ' + username)
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> token starts with = ' + token.substring(0, 10) + '...')
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> token ends with = ' + '...' + token.substring(token.length - 10))
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> currentBranch = ' + currentBranch)
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> contributionsBranch = ' + contributionsBranch)
- error = err
- }
- }
- }
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> App -> Contribute -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> App -> Contribute -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> App -> Contribute -> commitMessage = ' + commitMessage)
- console.log('[ERROR] httpInterface -> App -> Contribute -> username = ' + username)
- console.log('[ERROR] httpInterface -> App -> Contribute -> token starts with = ' + token.substring(0, 10) + '...')
- console.log('[ERROR] httpInterface -> App -> Contribute -> token ends with = ' + '...' + token.substring(token.length - 10))
- console.log('[ERROR] httpInterface -> App -> Contribute -> currentBranch = ' + currentBranch)
- console.log('[ERROR] httpInterface -> App -> Contribute -> contributionsBranch = ' + contributionsBranch)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- break
- }
-
- case 'Update': {
- try {
- const currentBranch = unescape(requestParameters[3])
- update()
-
- async function update() {
- const { lookpath } = require('lookpath');
- const gitpath = await lookpath('git');
- if (gitpath === undefined) {
- console.log('[ERROR] `git` not installed.')
- } else {
- let result = await doGit()
-
- if (result.error === undefined) {
- let customResponse = {
- result: global.CUSTOM_OK_RESPONSE.result,
- message: result.message
- }
- respondWithContent(JSON.stringify(customResponse), httpResponse)
- } else {
-
- let docs = {
- project: 'Foundations',
- category: 'Topic',
- type: 'App Error - Update Failed',
- anchor: undefined,
- placeholder: {}
- }
-
- respondWithDocsObject(docs, result.error)
-
- }
- }
- }
-
- async function doGit() {
- const simpleGit = require('simple-git');
- const options = {
- baseDir: process.cwd(),
- binary: 'git',
- maxConcurrentProcesses: 6,
- }
- const git = simpleGit(options)
-
- let message
- try {
- message = await git.pull('https://github.com/Superalgos/Superalgos', currentBranch)
- return { message: message }
- } catch (err) {
- console.log('[ERROR] Error updating ' + currentBranch)
- console.log(err.stack)
- return { error: err }
- }
- }
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> App -> Update -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> App -> Update -> err.stack = ' + err.stack)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- break
- }
-
- case 'Checkout': {
- try {
- const currentBranch = unescape(requestParameters[3])
- let error
-
- checkout()
-
- async function checkout() {
- const { lookpath } = require('lookpath');
- const gitpath = await lookpath('git');
- if (gitpath === undefined) {
- console.log('[ERROR] `git` not installed.')
- } else {
- await doGit()
-
- if (error === undefined) {
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- } else {
- let docs = {
- project: 'Foundations',
- category: 'Topic',
- type: 'Switching Branches - Current Branch Not Changed',
- anchor: undefined,
- placeholder: {}
- }
-
- respondWithDocsObject(docs, error)
- }
- }
- }
-
- async function doGit() {
- const simpleGit = require('simple-git');
- const options = {
- baseDir: process.cwd(),
- binary: 'git',
- maxConcurrentProcesses: 6,
- }
- const git = simpleGit(options)
- try {
- await git.checkout(currentBranch)
- } catch (err) {
- console.log('[ERROR] Error changing current branch to ' + currentBranch)
- console.log(err.stack)
- error = err
- }
- }
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> App -> Update -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> App -> Update -> err.stack = ' + err.stack)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- break
- }
-
- case 'Branch': {
- try {
- branch()
-
- async function branch() {
- const { lookpath } = require('lookpath');
- const gitpath = await lookpath('git');
- if (gitpath === undefined) {
- console.log('[ERROR] `git` not installed.')
- } else {
- let result = await doGit()
-
- if (result.error === undefined) {
- let customResponse = {
- result: global.CUSTOM_OK_RESPONSE.result,
- message: result
- }
- respondWithContent(JSON.stringify(customResponse), httpResponse)
- } else {
- let docs = {
- project: 'Foundations',
- category: 'Topic',
- type: 'App Error - Could Not Get Current Branch',
- anchor: undefined,
- placeholder: {}
- }
-
- respondWithDocsObject(docs, error)
- }
- }
- }
-
- async function doGit() {
- const simpleGit = require('simple-git');
- const options = {
- baseDir: process.cwd(),
- binary: 'git',
- maxConcurrentProcesses: 6,
- }
- const git = simpleGit(options)
- try {
- return await git.branch()
- } catch (err) {
- console.log('[ERROR] Error reading current branch.')
- console.log(err.stack)
- }
- }
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> App -> Update -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> App -> Update -> err.stack = ' + err.stack)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- break
- }
- }
-
- function respondWithDocsObject(docs, error) {
-
- if (error.message !== undefined) {
- docs.placeholder.errorMessage = {
- style: 'Error',
- text: error.message
- }
- }
- if (error.stack !== undefined) {
- docs.placeholder.errorStack = {
- style: 'Javascript',
- text: error.stack
- }
- }
- if (error.code !== undefined) {
- docs.placeholder.errorCode = {
- style: 'Json',
- text: error.code
- }
- }
-
- docs.placeholder.errorDetails = {
- style: 'Json',
- text: JSON.stringify(error, undefined, 4)
- }
-
- let customResponse = {
- result: global.CUSTOM_FAIL_RESPONSE.result,
- docs: docs
- }
-
- respondWithContent(JSON.stringify(customResponse), httpResponse)
-
- }
- }
- break
-
- case 'GOV': {
- /*
- This is the Governance endpoint at the Http Interface. All methods
- related to the Governance System are implemented here and routed
- to the backend Servers that can process them.
- */
- getBody(processRequest)
-
- async function processRequest(body) {
- try {
- let params = JSON.parse(body)
-
- switch (params.method) {
- case 'getGithubStars': {
-
- let serverResponse = await CL.servers.GITHUB_SERVER.getGithubStars(
- params.repository,
- params.username,
- params.token
- )
-
- respondWithContent(JSON.stringify(serverResponse), httpResponse)
- return
- }
- case 'getGithubWatchers': {
-
- let serverResponse = await CL.servers.GITHUB_SERVER.getGithubWatchers(
- params.repository,
- params.username,
- params.token
- )
-
- respondWithContent(JSON.stringify(serverResponse), httpResponse)
- return
- }
- case 'getGithubForks': {
-
- let serverResponse = await CL.servers.GITHUB_SERVER.getGithubForks(
- params.repository,
- params.username,
- params.token
- )
-
- respondWithContent(JSON.stringify(serverResponse), httpResponse)
- return
- }
- case 'mergePullRequests': {
-
- let serverResponse = await CL.servers.GITHUB_SERVER.mergePullRequests(
- params.commitMessage,
- params.username,
- params.token
- )
-
- respondWithContent(JSON.stringify(serverResponse), httpResponse)
- return
- }
- case 'payContributors': {
-
- let serverResponse = await CL.servers.WEB3_SERVER.payContributors(
- params.contractAddress,
- params.contractAbi,
- params.paymentsArray,
- params.mnemonic
- )
-
- respondWithContent(JSON.stringify(serverResponse), httpResponse)
- return
- }
- default: {
- respondWithContent(JSON.stringify({ error: 'Method ' + params.method + ' is invalid.' }), httpResponse)
- }
- }
- } catch (err) {
- console.log('[ERROR] httpInterface -> GOV -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> GOV -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> GOV -> Params Received = ' + body)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
- }
-
- case 'LegacyPlotter.js':
- {
- respondWithFile(global.env.PATH_TO_CLIENT + 'WebServer/LegacyPlotter.js', httpResponse)
- }
- break
-
- case 'PlotterPanel.js':
- {
- respondWithFile(global.env.PATH_TO_CLIENT + 'WebServer/PlotterPanel.js', httpResponse)
- }
- break
-
- case 'Images': // This means the Images folder.
- {
- let path = global.env.PATH_TO_CLIENT + 'WebServer/Images/' + requestParameters[2]
-
- if (requestParameters[3] !== undefined) {
- path = path + '/' + requestParameters[3]
- }
-
- if (requestParameters[4] !== undefined) {
- path = path + '/' + requestParameters[4]
- }
-
- if (requestParameters[5] !== undefined) {
- path = path + '/' + requestParameters[5]
- }
-
- path = unescape(path)
-
- respondWithImage(path, httpResponse)
- }
- break
-
- case 'Icons': // This means the Icons folder under Projects.
- {
- let path = global.env.PATH_TO_PROJECTS + '/' + requestParameters[2] + '/Icons'
-
- if (requestParameters[3] !== undefined) {
- path = path + '/' + requestParameters[3]
- }
-
- if (requestParameters[4] !== undefined) {
- path = path + '/' + requestParameters[4]
- }
-
- if (requestParameters[5] !== undefined) {
- path = path + '/' + requestParameters[5]
- }
-
- path = unescape(path)
-
- respondWithImage(path, httpResponse)
- }
- break
-
- case 'GIFs': // This means the GIFs folder under Projects.
- {
- let path = global.env.PATH_TO_PROJECTS + '/' + requestParameters[2] + '/GIFs'
-
- if (requestParameters[3] !== undefined) {
- path = path + '/' + requestParameters[3]
- }
-
- if (requestParameters[4] !== undefined) {
- path = path + '/' + requestParameters[4]
- }
-
- if (requestParameters[5] !== undefined) {
- path = path + '/' + requestParameters[5]
- }
-
- path = unescape(path)
- respondWithImage(path, httpResponse)
- }
- break
-
- case 'PNGs': // This means the PNGs folder under Projects.
- {
- let path = global.env.PATH_TO_PROJECTS + '/' + requestParameters[2] + '/PNGs'
-
- if (requestParameters[3] !== undefined) {
- path = path + '/' + requestParameters[3]
- }
-
- if (requestParameters[4] !== undefined) {
- path = path + '/' + requestParameters[4]
- }
-
- if (requestParameters[5] !== undefined) {
- path = path + '/' + requestParameters[5]
- }
-
- path = unescape(path)
- respondWithImage(path, httpResponse)
- }
- break
-
- case 'favicon.ico': // This means the Scripts folder.
- {
- respondWithImage(global.env.PATH_TO_CLIENT + 'WebServer/Images/' + 'favicon.ico', httpResponse)
- }
- break
-
- case 'WebServer': // This means the WebServer folder.
- {
- respondWithFile(global.env.PATH_TO_CLIENT + 'WebServer/' + requestParameters[2], httpResponse)
- }
- break
-
- case 'externalScripts': // This means the WebServer folder.
- {
- respondWithFile(global.env.PATH_TO_CLIENT + 'WebServer/externalScripts/' + requestParameters[2], httpResponse)
- }
- break
-
- case 'Plotters': // This means the plotter folder, not to be confused with the Plotters script!
- {
- let project = requestParameters[2]
- let dataMine = requestParameters[3]
- let codeName = requestParameters[4]
- let moduleName = requestParameters[5]
- let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/' + 'Bots-Plotters-Code' + '/' + dataMine + '/plotters/' + codeName + '/' + moduleName
- respondWithFile(filePath, httpResponse)
- }
- break
-
- case 'ChartLayers':
- {
- respondWithFile(global.env.PATH_TO_UI + '/' + requestParameters[1] + '/' + requestParameters[2], httpResponse)
- }
- break
-
- case 'Files':
- {
- respondWithFile(global.env.PATH_TO_DATA_FILES + '/' + requestParameters[2], httpResponse)
- }
- break
-
- case 'Fonts':
- {
- respondWithFont(global.env.PATH_TO_FONTS + '/' + requestParameters[2], httpResponse)
- }
- break
-
- case 'Schema':
- {
- sendSchema(global.env.PATH_TO_PROJECTS + '/' + requestParameters[2] + '/Schemas/', requestParameters[3])
- }
- break
-
- case 'DirContent':
- {
- let folderPath = unescape(requestParameters[2])
- if (requestParameters[3] !== undefined) {
- folderPath = folderPath + '/' + requestParameters[3]
- }
-
- if (requestParameters[4] !== undefined) {
- folderPath = folderPath + '/' + requestParameters[4]
- }
-
- if (requestParameters[5] !== undefined) {
- folderPath = folderPath + '/' + requestParameters[5]
- }
- let folder
- if (requestParameters[2] === 'Root') {
- folder = folderPath.replace('Root', '../Superalgos/')
- } else {
- folder = global.env.PATH_TO_PROJECTS + '/' + folderPath
- }
-
- getAllFilesInDirectoryAndSubdirectories(folder, onFilesReady)
-
- function onFilesReady(files) {
- respondWithContent(JSON.stringify(files), httpResponse)
- }
- }
- break
-
- case 'IconNames':
- {
- let projects = getDirectories(global.env.PATH_TO_PROJECTS)
- let icons = []
- let totalProjects = projects.length
- let projectCounter = 0
-
- for (let i = 0; i < projects.length; i++) {
- let project = projects[i]
-
- const folder = global.env.PATH_TO_PROJECTS + '/' + project + '/Icons/'
-
- getAllFilesInDirectoryAndSubdirectories(folder, onFilesReady)
-
- function onFilesReady(files) {
- for (let j = 0; j < files.length; j++) {
- let file = files[j]
- for (let i = 0; i < 10; i++) {
- file = file.replace('/', '\\')
- }
- icons.push([project, file])
- }
-
- projectCounter++
- if (projectCounter === totalProjects) {
- respondWithContent(JSON.stringify(icons), httpResponse)
- }
- }
- }
- }
- break
-
- case 'PluginFileNames':
- {
- processRequest()
-
- async function processRequest(body) {
- try {
- let project = unescape(requestParameters[2])
- let folder = unescape(requestParameters[3])
-
- let response = await SA.projects.foundations.utilities.plugins.getPluginFileNames(
- project,
- folder
- )
-
- respondWithContent(JSON.stringify(response), httpResponse)
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> PluginFileNames -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> PluginFileNames -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> PluginFileNames -> Params Received = ' + body)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
- }
-
- case 'LoadPlugin':
-
- {
- processRequest()
-
- async function processRequest(body) {
- try {
- let project = unescape(requestParameters[2])
- let folder = unescape(requestParameters[3])
- let fileName = unescape(requestParameters[4])
-
- let response = await SA.projects.foundations.utilities.plugins.getPluginFileContent(
- project,
- folder,
- fileName
- ).catch(err => {
- let error = {
- result: 'Fail Because',
- message: err
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- return
- })
-
- respondWithContent(response, httpResponse)
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> LoadPlugin -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> LoadPlugin -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> LoadPlugin -> Params Received = ' + body)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
- }
-
- case 'SavePlugin':
- getBody(processRequest)
-
- async function processRequest(body) {
- try {
- let plugin = JSON.parse(body)
- let project = requestParameters[2]
- let folder = requestParameters[3]
- let fileName = requestParameters[4]
- let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Plugins/' + folder
- let fileContent = JSON.stringify(plugin, undefined, 4)
- const fs = require('fs')
- fs.writeFileSync(filePath + '/' + fileName + '.json', fileContent)
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- } catch (err) {
- console.log('[ERROR] httpInterface -> SavePlugin -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> SavePlugin -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> SavePlugin -> Params Received = ' + body)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
-
- case 'Workspace.js':
- {
- let fs = require('fs')
-
- try {
- let filePath = global.env.PATH_TO_DEFAULT_WORKSPACE + '/Getting-Started-Tutorials.json'
- fs.readFile(filePath, onFileRead)
- } catch (e) {
- console.log('[ERROR] Error reading the Workspace.', e)
- }
-
- function onFileRead(err, workspace) {
- if (err) {
- respondWithContent(undefined, httpResponse)
- } else {
- let responseContent = 'function getWorkspace(){ return ' + workspace + '}'
- respondWithContent(responseContent, httpResponse)
- }
- }
- }
- break
-
- case 'ListWorkspaces':
- {
- let allWorkspaces = []
- let projects = getDirectories(global.env.PATH_TO_PROJECTS)
- let projectsCount = 0
-
- for (let i = 0; i < projects.length; i++) {
- let project = projects[i]
- readPluginWorkspaces()
- function readPluginWorkspaces() {
- let dirPath = global.env.PATH_TO_PROJECTS + '/' + project + '/Plugins/Workspaces'
- try {
- let fs = require('fs')
- fs.readdir(dirPath, onDirRead)
-
- function onDirRead(err, fileList) {
- let updatedFileList = []
-
- if (err) {
- /*
- If we have a problem reading this folder we will assume that it is
- because this project does not need this folder and that's it.
- */
- //console.log('[WARN] Error reading a directory content. filePath = ' + dirPath)
- } else {
- for (let i = 0; i < fileList.length; i++) {
- let name = 'Plugin \u2192 ' + fileList[i]
- updatedFileList.push([project, name])
- }
- }
- allWorkspaces = allWorkspaces.concat(updatedFileList)
- projectsCount++
- if (projectsCount === projects.length) {
- readMyWorkspaces()
- }
- }
- } catch (err) {
- console.log('[ERROR] Error reading a directory content. filePath = ' + dirPath)
- console.log('[ERROR] err.stack = ' + err.stack)
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- return
- }
- }
- }
-
- function readMyWorkspaces() {
- let dirPath = global.env.PATH_TO_MY_WORKSPACES
- try {
- let fs = require('fs')
- fs.readdir(dirPath, onDirRead)
-
- function onDirRead(err, fileList) {
- if (err) {
- // This happens the first time you run the software.
- respondWithContent(JSON.stringify(allWorkspaces), httpResponse)
- return
- } else {
- let updatedFileList = []
- for (let i = 0; i < fileList.length; i++) {
- let name = fileList[i]
- updatedFileList.push(['', name])
- }
- allWorkspaces = allWorkspaces.concat(updatedFileList)
- respondWithContent(JSON.stringify(allWorkspaces), httpResponse)
- return
- }
- }
- } catch (err) {
- console.log('[ERROR] Error reading a directory content. filePath = ' + dirPath)
- console.log('[ERROR] err.stack = ' + err.stack)
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- return
- }
- }
- }
- break
-
- case 'LoadMyWorkspace':
- {
- let fileName = unescape(requestParameters[2])
- let filePath = global.env.PATH_TO_MY_WORKSPACES + '/' + fileName + '.json'
- respondWithFile(filePath, httpResponse)
- }
- break
-
- case 'SaveWorkspace':
- {
- getBody(processRequest)
-
- async function processRequest(body) {
-
- let fileContent = body
- let fileName = unescape(requestParameters[2])
- let filePath = global.env.PATH_TO_MY_WORKSPACES + '/' + fileName + '.json'
-
- try {
- let fs = require('fs')
- let dir = global.env.PATH_TO_MY_WORKSPACES;
-
- /* Create Dir if it does not exist */
- if (!fs.existsSync(dir)) {
- fs.mkdirSync(dir);
- }
-
- fs.writeFile(filePath, fileContent, onFileWritten)
-
- function onFileWritten(err) {
- if (err) {
- console.log('[ERROR] SaveWorkspace -> onFileWritten -> Error writing the Workspace file. fileName = ' + fileName)
- console.log('[ERROR] SaveWorkspace -> onFileWritten -> err.stack = ' + err.stack)
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- } else {
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- }
- }
-
- } catch (err) {
- console.log('[ERROR] SaveWorkspace -> Error writing the Workspace file. fileName = ' + fileName)
- console.log('[ERROR] SaveWorkspace -> err.stack = ' + err.stack)
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- }
- break
-
- case 'ListFunctionLibraries':
- {
- returnProjectFolderFileList('Function-Libraries')
- }
- break
-
- case 'ProjectsSchema':
- {
- let path = global.env.PATH_TO_PROJECTS + '/' + 'ProjectsSchema.json'
- respondWithFile(path, httpResponse)
- }
- break
-
- case 'ListSpaceFiles':
- {
- let fs = require('fs')
- let allFiles = []
- let projects = getDirectories(global.env.PATH_TO_PROJECTS)
- let dirCount = 0
- let totalDirs = 0
-
- for (let i = 0; i < projects.length; i++) {
- let project = projects[i]
-
- let dirPath = project + '/UI/Spaces'
- let spaces = getDirectories(global.env.PATH_TO_PROJECTS + '/' + dirPath)
-
- for (let j = 0; j < spaces.length; j++) {
- let space = spaces[j]
- readDirectory(dirPath + '/' + space)
- }
-
- function readDirectory(path) {
- try {
-
- totalDirs++
- fs.readdir(global.env.PATH_TO_PROJECTS + '/' + path, onDirRead)
-
- let otherDirs = getDirectories(global.env.PATH_TO_PROJECTS + '/' + path)
- for (let m = 0; m < otherDirs.length; m++) {
- let otherDir = otherDirs[m]
- readDirectory(path + '/' + otherDir)
- }
-
- function onDirRead(err, fileList) {
- if (err) {
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- } else {
- let updatedFileList = []
- for (let k = 0; k < fileList.length; k++) {
- let name = fileList[k]
- if (name.indexOf('.js') < 0) { continue }
- updatedFileList.push(path + '/' + name)
- }
- allFiles = allFiles.concat(updatedFileList)
- dirCount++
- if (dirCount === totalDirs) {
- respondWithContent(JSON.stringify(allFiles), httpResponse)
- }
- }
- }
- } catch (err) {
- console.log('[ERROR] Error reading a directory content. filePath = ' + path)
- console.log('[ERROR] err.stack = ' + err.stack)
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- return
- }
- }
- }
- }
- break
-
- case 'ListUtilitiesFiles':
- {
- returnProjectFolderFileList('Utilities')
- }
- break
-
- case 'ListGlobalFiles':
- {
- returnProjectFolderFileList('Globals')
- }
- break
-
- case 'Projects':
- {
- let path = ''
- for (let i = 2; i < 10; i++) {
- if (requestParameters[i] !== undefined) {
- let parameter = unescape(requestParameters[i])
- path = path + '/' + parameter
- }
-
- }
- let filePath = global.env.PATH_TO_PROJECTS + path
- respondWithFile(filePath, httpResponse)
- }
- break
-
- case 'Storage':
- {
- let pathToFile = httpRequest.url.substring(9)
- /* Unsavping # */
- for (let i = 0; i < 10; i++) {
- pathToFile = pathToFile.replace('_HASHTAG_', '#')
- }
- respondWithFile(global.env.PATH_TO_DATA_STORAGE + '/' + pathToFile, httpResponse)
- }
- break
-
- case 'main.css':
- {
- sendStyleSheet('main.css')
- }
- break
-
- case 'tutorial.css':
- {
- sendStyleSheet('tutorial.css')
- }
- break
-
- case 'docs.css':
- {
- sendStyleSheet('docs.css')
- }
- break
-
- case 'governance.css':
- {
- sendStyleSheet('governance.css')
- }
- break
-
- case 'context-menu.css':
- {
- sendStyleSheet('context-menu.css')
- }
- break
-
- case 'credits.css':
- {
- sendStyleSheet('credits.css')
- }
- break
-
- case 'docs.css':
- {
- sendStyleSheet('docs.css')
- }
- break
-
- case 'font-awasome.css':
- {
- sendStyleSheet('font-awasome.css')
- }
- break
-
- case 'prism.css':
- {
- sendStyleSheet('prism.css')
- }
- break
-
- case 'ExecuteTerminalCommand':
- {
- let command = unescape(requestParameters[2])
- executeTerminalCommand(command)
- }
- break
- default:
- {
- homePage()
- }
- }
-
- function returnProjectFolderFileList(projectFolderName) {
- {
- let allLibraries = []
- let projects = getDirectories(global.env.PATH_TO_PROJECTS)
- let projectsCount = 0
-
- for (let i = 0; i < projects.length; i++) {
- let project = projects[i]
-
- let dirPath = global.env.PATH_TO_PROJECTS + '/' + project + '/' + 'UI' + '/' + projectFolderName
- try {
- let fs = require('fs')
- fs.readdir(dirPath, onDirRead)
-
- function onDirRead(err, fileList) {
- let updatedFileList = []
- if (err) {
- /*
- If we have a problem reading this folder we will assume that it is
- because this project does not need this folder and that's it.
- */
- // console.log('[WARN] Error reading a directory content. filePath = ' + dirPath)
- } else {
- for (let i = 0; i < fileList.length; i++) {
- let name = fileList[i]
- updatedFileList.push([project, name])
- }
- }
- allLibraries = allLibraries.concat(updatedFileList)
- projectsCount++
- if (projectsCount === projects.length) {
- respondWithContent(JSON.stringify(allLibraries), httpResponse)
- }
- }
- } catch (err) {
- console.log('[ERROR] Error reading a directory content. filePath = ' + dirPath)
- console.log('[ERROR] err.stack = ' + err.stack)
-
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- return
- }
- }
- }
- }
-
- function executeTerminalCommand(command) {
- const util = require('util');
- const exec = util.promisify(require('child_process').exec);
- async function lsWithGrep() {
- try {
- const { stdout, stderr } = await exec(command);
- console.log('stdout:', stdout);
- console.log('stderr:', stderr);
- } catch (err) {
- console.error(err.stack);
- };
- };
- lsWithGrep();
- }
-
- function sendSchema(filePath, schemaType) {
- let fs = require('fs')
- try {
- let folder = ''
- switch (schemaType) {
- case 'AppSchema': {
- folder = 'App-Schema'
- break
- }
- case 'DocsNodeSchema': {
- folder = 'Docs-Nodes'
- break
- }
- case 'DocsConceptSchema': {
- folder = 'Docs-Concepts'
- break
- }
- case 'DocsTopicSchema': {
- folder = 'Docs-Topics'
- break
- }
- case 'DocsTutorialSchema': {
- folder = 'Docs-Tutorials'
- break
- }
- case 'DocsReviewSchema': {
- folder = 'Docs-Reviews'
- break
- }
- case 'DocsBookSchema': {
- folder = 'Docs-Books'
- break
- }
- }
- getAllFilesInDirectoryAndSubdirectories(filePath + folder, onFilesReady)
- function onFilesReady(files) {
-
- let schemaArray = []
- for (let k = 0; k < files.length; k++) {
- let name = files[k]
- let nameSplitted = name.split(folder)
- let fileName = nameSplitted[1]
- for (let i = 0; i < 10; i++) {
- fileName = fileName.replace('\\', '/')
- }
- let fileToRead = filePath + folder + fileName
-
- let fileContent = fs.readFileSync(fileToRead)
- let schemaDocument
- try {
- schemaDocument = JSON.parse(fileContent)
- } catch (err) {
- console.log('[ERROR] httpInterface -> sendSchema -> Error Parsing JSON File: ' + fileToRead + ' .Error = ' + err.stack)
- respondWithContent("[]", httpResponse)
- return
- }
- schemaArray.push(schemaDocument)
- }
- let schema = JSON.stringify(schemaArray)
- respondWithContent(schema, httpResponse)
- }
- } catch (err) {
- if (err.message.indexOf('no such file or directory') < 0) {
- console.log('Could not send Schema:', filePath, schemaType)
- console.log(err.stack)
- }
- respondWithContent("[]", httpResponse)
- }
-
- }
-
- function sendStyleSheet(fileName) {
- let fs = require('fs')
- try {
- let filePath = global.env.PATH_TO_CLIENT + 'WebServer/css/' + fileName
- fs.readFile(filePath, onFileRead)
-
- function onFileRead(err, file) {
- try {
- let fileContent = file.toString()
-
- fileContent = fileContent.replace('HTTP_INTERFACE_PORT', global.env.HTTP_INTERFACE_PORT)
- fileContent = fileContent.replace('HTTP_INTERFACE_PORT', global.env.HTTP_INTERFACE_PORT)
- fileContent = fileContent.replace('HTTP_INTERFACE_PORT', global.env.HTTP_INTERFACE_PORT)
- respondWithContent(fileContent, httpResponse, 'text/css')
- } catch (err) {
- console.log('[ERROR] httpInterface -> mainCSS -> File Not Found: ' + fileName + ' or Error = ' + err.stack)
- }
- }
- } catch (err) {
- console.log(err)
- }
- }
-
- function homePage() {
- if (requestParameters[1] === '') {
- let fs = require('fs')
- try {
- let fileName = global.env.PATH_TO_CLIENT + 'WebServer/index.html'
- fs.readFile(fileName, onFileRead)
-
- function onFileRead(err, file) {
- try {
- let fileContent = file.toString()
-
- fileContent = fileContent.replace('HTTP_INTERFACE_PORT', global.env.HTTP_INTERFACE_PORT)
- respondWithContent(fileContent, httpResponse)
- } catch (err) {
- console.log('[ERROR] httpInterface -> homePage -> File Not Found: ' + fileName + ' or Error = ' + err.stack)
- }
- }
- } catch (err) {
- console.log(err)
- }
- } else {
- respondWithFile(global.env.PATH_TO_UI + '/' + requestParameters[1], httpResponse)
- }
- }
- }
-
- function respondWithFile(fileName, httpResponse) {
- let fs = require('fs')
- if (fileName.indexOf('undefined') > 0) {
- console.log('[WRN] httpInterface -> respondWithFile -> Received httpRequest for undefined file. ')
- respondWithContent(undefined, httpResponse)
- } else {
- try {
- fs.readFile(fileName, onFileRead)
-
- function onFileRead(err, file) {
- if (!err) {
- respondWithContent(file.toString(), httpResponse)
- } else {
- //console.log('File requested not found: ' + fileName)
- respondWithContent(undefined, httpResponse)
- }
- }
- } catch (err) {
- returnEmptyArray()
- }
- }
- }
-
- function respondWithContent(content, httpResponse, contentType) {
- try {
- httpResponse.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate') // HTTP 1.1.
- httpResponse.setHeader('Pragma', 'no-cache') // HTTP 1.0.
- httpResponse.setHeader('Expires', '0') // Proxies.
- httpResponse.setHeader('Access-Control-Allow-Origin', '*') // Allows to access data from other domains.
-
- if (content !== undefined) {
- if (contentType !== undefined) {
- httpResponse.writeHead(200, { 'Content-Type': contentType })
- } else {
- httpResponse.writeHead(200, { 'Content-Type': 'text/html' })
- }
- httpResponse.write(content)
- } else {
- httpResponse.writeHead(404, { 'Content-Type': 'text/html' })
- httpResponse.write('The specified key does not exist.')
- }
- httpResponse.end('\n')
- } catch (err) {
- returnEmptyArray(httpResponse)
- }
- }
-
- function respondWithImage(fileName, httpResponse) {
- let fs = require('fs')
- try {
- fs.readFile(fileName, onFileRead)
-
- function onFileRead(err, file) {
- if (err) {
- console.log('[ERROR] httpInterface -> respondWithImage -> onFileRead -> File Not Found: ' + fileName + ' or Error = ' + err.stack)
- return
- }
- try {
- httpResponse.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate') // HTTP 1.1.
- httpResponse.setHeader('Pragma', 'no-cache') // HTTP 1.0.
- httpResponse.setHeader('Expires', '0') // Proxies.
- httpResponse.setHeader('Access-Control-Allow-Origin', '*') // Allows to access data from other domains.
-
- httpResponse.writeHead(200, { 'Content-Type': 'image/png' })
- httpResponse.end(file, 'binary')
- } catch (err) {
- console.log('[ERROR] httpInterface -> respondWithImage -> onFileRead -> File Not Found: ' + fileName + ' or Error = ' + err.stack)
- }
- }
- } catch (err) {
- console.log('[ERROR] httpInterface -> respondWithImage -> err = ' + err.stack)
- }
- }
-
- function respondWithFont(fileName, httpResponse) {
- let fs = require('fs')
- try {
- fs.readFile(fileName, onFileRead)
-
- function onFileRead(err, file) {
- try {
- if (err) {
- console.log('[ERROR] httpInterface -> respondWithBinary -> onFileRead -> File Not Found: ' + fileName + ' or Error = ' + err.stack)
- return
- }
- httpResponse.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate') // HTTP 1.1.
- httpResponse.setHeader('Pragma', 'no-cache') // HTTP 1.0.
- httpResponse.setHeader('Expires', '0') // Proxies.
- httpResponse.setHeader('Access-Control-Allow-Origin', '*') // Allows to access data from other domains.
-
- if (fileName.indexOf('2') < 0) {
- httpResponse.writeHead(200, { 'Content-Type': 'font/woff' })
- } else {
- httpResponse.writeHead(200, { 'Content-Type': 'font/woff2' })
- }
- httpResponse.end(file, 'binary')
- } catch (err) {
- console.log('[ERROR] httpInterface -> respondWithBinary -> onFileRead -> File Not Found: ' + fileName + ' or Error = ' + err.stack)
- }
- }
- } catch (err) {
- console.log('[ERROR] httpInterface -> respondWithBinary -> err = ' + err.stack)
- }
- }
-
- function returnEmptyArray(httpResponse) {
- try {
- httpResponse.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate') // HTTP 1.1.
- httpResponse.setHeader('Pragma', 'no-cache') // HTTP 1.0.
- httpResponse.setHeader('Expires', '0') // Proxies.
-
- httpResponse.writeHead(200, { 'Content-Type': 'text/html' })
- httpResponse.write('[]')
- httpResponse.end('\n')
- } catch (err) {
- console.log('[ERROR] httpInterface -> returnEmptyArray -> err.stack ' + err.stack)
- }
- }
-
- function getDirectories(path) {
- try {
- const fs = require('fs')
- return fs.readdirSync(path).filter(function (file) {
- return fs.statSync(path + '/' + file).isDirectory();
- });
- } catch (err) {
- return []
- }
- }
-
- function getAllFilesInDirectoryAndSubdirectories(dir, callback) {
- const { promisify } = require('util');
- const { resolve } = require('path');
- const fs = require('fs');
- const readdir = promisify(fs.readdir);
- const stat = promisify(fs.stat);
-
- getFiles(dir)
- .then(files => {
- let splittedDir = dir.split('/')
- let lastFolder = splittedDir[splittedDir.length - 2]
- let pathAndNames = []
- for (let i = 0; i < files.length; i++) {
- let file = files[i]
- let pathName = file.substring(file.indexOf(lastFolder) + lastFolder.length, file.length)
- pathName = pathName.substring(1, pathName.length)
- pathAndNames.push(pathName)
- }
- callback(pathAndNames)
- })
- .catch(e => {
- callback([])
- });
-
- async function getFiles(dir) {
- const subdirs = await readdir(dir);
- const files = await Promise.all(subdirs.map(async (subdir) => {
- const res = resolve(dir, subdir);
- return (await stat(res)).isDirectory() ? getFiles(res) : res;
- }));
- return files.reduce((a, f) => a.concat(f), []);
- }
- }
-}
diff --git a/Desktop/DesktopApp.js b/Desktop/DesktopApp.js
index 8e0b948fb..d2bb686db 100644
--- a/Desktop/DesktopApp.js
+++ b/Desktop/DesktopApp.js
@@ -11,11 +11,29 @@ exports.newDesktopApp = function newDesktopApp() {
let socialGraphService = NT.projects.network.modules.socialGraph.newSocialGraph()
await socialGraphService.initialize()
*/
+
/*
- Let's start the Network Interfaces
+ This is the Web Sockets client that interacts with the Superalgos Network.
*/
- DK.webSocketsClient = SA.projects.network.modules.webSocketsClient.newNetworkModulesWebSocketsClient()
- await DK.webSocketsClient.initialize()
+ //DK.webSocketsClient = SA.projects.network.modules.webSocketsClient.newNetworkModulesWebSocketsClient()
+ //await DK.webSocketsClient.initialize()
+
+ /* These are the Network Interfaces by which the UI interacts with the Desktop App.*/
+ //let WEB_SOCKETS_INTERFACE = require('./webSocketsInterface.js')
+ let HTTP_INTERFACE = require('./httpInterface.js')
+
+ /*
+ WEB_SOCKETS_INTERFACE = WEB_SOCKETS_INTERFACE.newWebSocketsInterface()
+ WEB_SOCKETS_INTERFACE.initialize()
+ console.log('Web Sockets Interface ....................................... Listening at port ' + global.env.CLIENT_WEB_SOCKETS_INTERFACE_PORT)
+ */
+
+ HTTP_INTERFACE = HTTP_INTERFACE.newHttpInterface()
+ HTTP_INTERFACE.initialize()
+ console.log('Http Interface .............................................. Listening at port ' + global.env.DESKTOP_HTTP_INTERFACE_PORT)
+
+ return
+
let queryMessage
let query
@@ -41,8 +59,37 @@ exports.newDesktopApp = function newDesktopApp() {
.then(showProfiles)
.catch(onError)
- function showProfiles(profiles) {
+ async function showProfiles(profiles) {
console.log(profiles)
+
+ for (let i = 0; i < profiles.length; i++) {
+ let profile = profiles[i]
+
+ /*
+ Test Following Profiles.
+ */
+ let eventMessage = {
+ eventId: SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId(),
+ eventType: SA.projects.socialTrading.globals.eventTypes.FOLLOW_USER_PROFILE,
+ emitterUserProfileId: DK.TEST_NETWORK_CLIENT_USER_PROFILE_ID,
+ targetUserProfileId: profile.userProfileId
+ }
+
+ let event = {
+ requestType: 'Event',
+ eventMessage: JSON.stringify(eventMessage)
+ }
+
+ await DK.webSocketsClient.sendMessage(
+ JSON.stringify(event)
+ )
+ .then(followAdded)
+ .catch(onError)
+
+ function followAdded() {
+ console.log("User Profile " + profile.userProfileHandle + " followed.")
+ }
+ }
}
/*
Test Query User Profile Stats.
diff --git a/UI/AppLoader.js b/Desktop/UI/AppLoader.js
similarity index 100%
rename from UI/AppLoader.js
rename to Desktop/UI/AppLoader.js
diff --git a/Client/WebServer/Fonts/Saira-Condensed.woff2 b/Desktop/WebServer/Fonts/Saira-Condensed.woff2
similarity index 100%
rename from Client/WebServer/Fonts/Saira-Condensed.woff2
rename to Desktop/WebServer/Fonts/Saira-Condensed.woff2
diff --git a/Client/WebServer/Fonts/Saira.woff2 b/Desktop/WebServer/Fonts/Saira.woff2
similarity index 100%
rename from Client/WebServer/Fonts/Saira.woff2
rename to Desktop/WebServer/Fonts/Saira.woff2
diff --git a/Client/WebServer/Fonts/segoeui.woff b/Desktop/WebServer/Fonts/segoeui.woff
similarity index 100%
rename from Client/WebServer/Fonts/segoeui.woff
rename to Desktop/WebServer/Fonts/segoeui.woff
diff --git a/Client/WebServer/Images/favicon.ico b/Desktop/WebServer/Images/favicon.ico
similarity index 100%
rename from Client/WebServer/Images/favicon.ico
rename to Desktop/WebServer/Images/favicon.ico
diff --git a/Desktop/WebServer/css/main.css b/Desktop/WebServer/css/main.css
new file mode 100644
index 000000000..5e3eedde8
--- /dev/null
+++ b/Desktop/WebServer/css/main.css
@@ -0,0 +1,34 @@
+/* latin */
+@font-face {
+ font-family: 'Saira';
+ font-style: normal;
+ font-weight: 300;
+ src: local('Saira Light'), local('Saira-Light'), url(Fonts/Saira.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+ }
+ /* latin */
+ @font-face {
+ font-family: 'Saira Condensed';
+ font-style: normal;
+ font-weight: 300;
+ src: local('Saira Condensed Light'), local('SairaCondensed-Light'), url(Fonts/Saira-Condensed.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+ }
+
+ @font-face {
+ font-family: segoeui;
+ src: url(Fonts/segoeui.woff) format('woff');
+ font-weight: normal;
+ font-style: normal;
+ }
+
+ kbd {
+ padding: 2px 8px;
+ font-size: 125%;
+ font-weight: 500;
+ color: #000;
+ background-color: #bcd643;
+ border-radius: 5px;
+ border-style: outset;
+ border-width: 1px;
+ }
\ No newline at end of file
diff --git a/Desktop/WebServer/index.html b/Desktop/WebServer/index.html
new file mode 100644
index 000000000..afeb95d14
--- /dev/null
+++ b/Desktop/WebServer/index.html
@@ -0,0 +1,52 @@
+
+
+
+
+ Superalgos Desktop
+
+
+
+
+
+
+
+
+
+
+ Hello World!
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Client/WebServer/require.js b/Desktop/WebServer/require.js
similarity index 100%
rename from Client/WebServer/require.js
rename to Desktop/WebServer/require.js
diff --git a/Desktop/httpInterface.js b/Desktop/httpInterface.js
new file mode 100644
index 000000000..ddbddda7e
--- /dev/null
+++ b/Desktop/httpInterface.js
@@ -0,0 +1,68 @@
+exports.newHttpInterface = function newHttpInterface() {
+
+ /*
+ This module represent the HTTP API of the
+ Desktop App. All HTTP request are processed
+ by this module.
+ */
+ let thisObject = {
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ return thisObject
+
+ function finalize() {
+ }
+
+ function initialize() {
+ /*
+ We will create an HTTP Server and leave it running forever.
+ */
+ SA.nodeModules.http.createServer(onHttpRequest).listen(global.env.DESKTOP_HTTP_INTERFACE_PORT)
+ /* Starting the browser now is optional */
+ if (process.argv.includes("noBrowser")) {
+ //Running Client only with no UI.
+ } else {
+ SA.nodeModules.open('http://localhost:' + global.env.DESKTOP_HTTP_INTERFACE_PORT)
+ }
+ }
+
+ function onHttpRequest(httpRequest, httpResponse) {
+ try {
+ let requestPathAndParameters = httpRequest.url.split('?') // Remove version information
+ let requestPath = requestPathAndParameters[0].split('/')
+ let endpointOrFile = requestPath[1]
+
+ switch (endpointOrFile) {
+ case 'Images': // This means the Images folder.
+ {
+ let path = global.env.PATH_TO_CLIENT + '/WebServer/Images/' + requestPath[2]
+
+ if (requestPath[3] !== undefined) {
+ path = path + '/' + requestPath[3]
+ }
+
+ if (requestPath[4] !== undefined) {
+ path = path + '/' + requestPath[4]
+ }
+
+ if (requestPath[5] !== undefined) {
+ path = path + '/' + requestPath[5]
+ }
+
+ path = unescape(path)
+
+ SA.projects.foundations.utilities.httpResponses.respondWithImage(path, httpResponse)
+ }
+ break
+ default:
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithWebFile(httpResponse, endpointOrFile, global.env.PATH_TO_DESKTOP)
+ }
+ }
+ } catch (err) {
+ console.log(err.stack)
+ }
+ }
+}
diff --git a/Environment.js b/Environment.js
index 76276e22a..212d54e6e 100644
--- a/Environment.js
+++ b/Environment.js
@@ -3,19 +3,17 @@ exports.newEnvironment = function () {
let thisObject = {
WEB_SERVER_URL: 'localhost',
CLIENT_WEB_SOCKETS_INTERFACE_PORT: 18041,
- HTTP_INTERFACE_PORT: 34248,
+ CLIENT_HTTP_INTERFACE_PORT: 34248,
PATH_TO_TASK_SERVER: './TaskServer',
PATH_TO_DATA_STORAGE: './Data-Storage',
PATH_TO_PROJECTS: './Projects',
PATH_TO_LOG_FILES: './Log-Files',
PATH_TO_PROJECTS_REQUIRED: './Projects',
PATH_TO_PROJECT_SCHEMA: '../Projects/ProjectsSchema.json',
- PATH_TO_UI: './UI',
- PATH_TO_DATA_FILES: './UI/Data-Files/src',
- PATH_TO_CLIENT: './Client/',
+ PATH_TO_CLIENT: './Platform',
PATH_TO_DEFAULT_WORKSPACE: './Projects/Foundations/Plugins/Workspaces',
PATH_TO_MY_WORKSPACES: './My-Workspaces',
- PATH_TO_FONTS: './Client/WebServer/Fonts'
+ PATH_TO_FONTS: './Platform/WebServer/Fonts'
}
return thisObject
diff --git a/EnvironmentForDebug.js b/EnvironmentForDebug.js
index 5e88fb9da..932ed022b 100644
--- a/EnvironmentForDebug.js
+++ b/EnvironmentForDebug.js
@@ -4,19 +4,19 @@ exports.newEnvironment = function () {
WEB_SERVER_URL: 'localhost',
CLIENT_WEB_SOCKETS_INTERFACE_PORT: 18041,
NETWORK_WEB_SOCKETS_INTERFACE_PORT: 18042,
- HTTP_INTERFACE_PORT: 34248,
+ CLIENT_HTTP_INTERFACE_PORT: 34248,
+ DESKTOP_HTTP_INTERFACE_PORT: 34249,
PATH_TO_TASK_SERVER: './TaskServer',
PATH_TO_DATA_STORAGE: './Data-Storage',
PATH_TO_PROJECTS: './Projects',
PATH_TO_LOG_FILES: './Log-Files',
PATH_TO_PROJECTS_REQUIRED: './Projects',
PATH_TO_PROJECT_SCHEMA: './Projects/ProjectsSchema.json',
- PATH_TO_UI: './UI',
- PATH_TO_DATA_FILES: './UI/Data-Files/src',
- PATH_TO_CLIENT: './Client/',
+ PATH_TO_CLIENT: './Platform',
+ PATH_TO_DESKTOP: './Desktop',
PATH_TO_DEFAULT_WORKSPACE: './Projects/Foundations/Plugins/Workspaces',
PATH_TO_MY_WORKSPACES: './My-Workspaces',
- PATH_TO_FONTS: './Client/WebServer/Fonts'
+ PATH_TO_FONTS: './Platform/WebServer/Fonts'
}
return thisObject
diff --git a/Network/.vscode/settings.json b/Network/.vscode/settings.json
index 0bf7da203..e94f27f6f 100644
--- a/Network/.vscode/settings.json
+++ b/Network/.vscode/settings.json
@@ -10,6 +10,7 @@
"**/Data-Storage": true,
"**/Documentation": true,
"**/Log-Files": true,
+ "**/node_modules": true,
"**/Deprecated-Code": true
},
"search.maintainFileSearchCache": true
diff --git a/Client/ccxtServer.js b/Platform/Client/ccxtServer.js
similarity index 100%
rename from Client/ccxtServer.js
rename to Platform/Client/ccxtServer.js
diff --git a/Client/dataFileServer.js b/Platform/Client/dataFileServer.js
similarity index 100%
rename from Client/dataFileServer.js
rename to Platform/Client/dataFileServer.js
diff --git a/Client/eventServer.js b/Platform/Client/eventServer.js
similarity index 100%
rename from Client/eventServer.js
rename to Platform/Client/eventServer.js
diff --git a/Client/githubServer.js b/Platform/Client/githubServer.js
similarity index 100%
rename from Client/githubServer.js
rename to Platform/Client/githubServer.js
diff --git a/Platform/Client/httpInterface.js b/Platform/Client/httpInterface.js
new file mode 100644
index 000000000..5b3368fb8
--- /dev/null
+++ b/Platform/Client/httpInterface.js
@@ -0,0 +1,1703 @@
+exports.newHttpInterface = function newHttpInterface() {
+
+ /*
+ IMPORTANT: If you are reviewing the code of the project please note
+ that this file is the single file in the whole system that accumulated
+ more technical debt by far. I did not have the time yet to pay the
+ technical debt, and therefore there is a lot to reorganize in here.
+ I will remove this note once this job is done.
+ */
+ let thisObject = {
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ let webhook = new Map()
+
+ return thisObject
+
+ function finalize() {
+ webhook = undefined
+ }
+
+ function initialize() {
+ /*
+ We will create an HTTP Server and leave it running forever.
+ */
+ SA.nodeModules.http.createServer(onHttpRequest).listen(global.env.CLIENT_HTTP_INTERFACE_PORT)
+ /* Starting the browser now is optional */
+ if (process.argv.includes("noBrowser")) {
+ //Running Client only with no UI.
+ } else {
+ SA.nodeModules.open('http://localhost:' + global.env.CLIENT_HTTP_INTERFACE_PORT)
+ }
+ }
+
+ function onHttpRequest(httpRequest, httpResponse) {
+ try {
+ let requestPathAndParameters = httpRequest.url.split('?') // Remove version information
+ let requestPath = requestPathAndParameters[0].split('/')
+ let endpointOrFile = requestPath[1]
+
+ switch (endpointOrFile) {
+
+ case 'WEB3':
+ {
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ async function processRequest(body) {
+ try {
+ let params = JSON.parse(body)
+
+ switch (params.method) {
+ case 'getNetworkClientStatus': {
+
+ let serverResponse = await CL.servers.WEB3_SERVER.getNetworkClientStatus(
+ params.host,
+ params.port,
+ params.interface
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse)
+ return
+ }
+ case 'createWalletAccount': {
+
+ let serverResponse = await CL.servers.WEB3_SERVER.createWalletAccount(
+ params.entropy
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse)
+ return
+ }
+ case 'getWalletBalances': {
+
+ let serverResponse = await CL.servers.WEB3_SERVER.getWalletBalances(
+ params.host,
+ params.port,
+ params.interface,
+ params.walletDefinition
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse)
+ return
+ }
+ case 'signData': {
+
+ let serverResponse = await CL.servers.WEB3_SERVER.signData(
+ params.privateKey,
+ params.data
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse)
+ return
+ }
+ case 'recoverAddress': {
+
+ let serverResponse = await CL.servers.WEB3_SERVER.recoverAddress(
+ params.signature
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse)
+ return
+ }
+ case 'mnemonicToPrivateKey': {
+
+ let serverResponse = await CL.servers.WEB3_SERVER.mnemonicToPrivateKey(
+ params.mnemonic
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse)
+ return
+ }
+ default: {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify({ error: 'Method ' + params.method + ' is invalid.' }), httpResponse)
+ }
+ }
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> WEB3s -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> WEB3s -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> WEB3s -> Params Received = ' + body)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ }
+ break
+ case 'CCXT':
+ {
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ async function processRequest(body) {
+ try {
+ let params = JSON.parse(body)
+
+ switch (params.method) {
+ case 'fetchMarkets': {
+
+ const exchangeClass = SA.nodeModules.ccxt[params.exchangeId]
+ const exchangeConstructorParams = {
+ 'timeout': 30000,
+ 'enableRateLimit': true,
+ verbose: false
+ }
+
+ let ccxtExchange = new exchangeClass(exchangeConstructorParams)
+ let ccxtMarkets = []
+
+ if (ccxtExchange.has.fetchMarkets === true) {
+ ccxtMarkets = await ccxtExchange.fetchMarkets()
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(ccxtMarkets), httpResponse)
+ return
+ }
+ case 'listExchanges': {
+ let exchanges = []
+ for (let i = 0; i < SA.nodeModules.ccxt.exchanges.length; i++) {
+ let exchangeId = SA.nodeModules.ccxt.exchanges[i]
+
+ const exchangeClass = SA.nodeModules.ccxt[exchangeId]
+ const exchangeConstructorParams = {
+ 'timeout': 30000,
+ 'enableRateLimit': true,
+ verbose: false
+ }
+ let ccxtExchange
+ try { ccxtExchange = new exchangeClass(exchangeConstructorParams) }
+ catch (err) { }
+ if (ccxtExchange === undefined) { continue }
+
+
+ if (ccxtExchange.has.fetchOHLCV === params.has.fetchOHLCV) {
+ if (ccxtExchange.has.fetchMarkets === params.has.fetchMarkets) {
+ if (ccxtExchange.timeframes['1m'] !== undefined) {
+ let exchange = {
+ name: ccxtExchange.name,
+ id: ccxtExchange.id
+ }
+ exchanges.push(exchange)
+ }
+ }
+ }
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(exchanges), httpResponse)
+ return
+ }
+ }
+
+ let content = {
+ err: global.DEFAULT_FAIL_RESPONSE // method not supported
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(content), httpResponse)
+
+ } catch (err) {
+ console.log('[INFO] httpInterface -> CCXT FetchMarkets -> Could not fetch markets.')
+ let error = {
+ result: 'Fail Because',
+ message: err.message
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ }
+ break
+ case 'Webhook':
+ {
+ switch (requestPath[2]) { // switch by command
+ case 'Fetch-Messages': {
+ let exchange = requestPath[3]
+ let market = requestPath[4]
+
+ /* Some validations */
+ if (exchange === undefined) {
+ console.log('[WARN] httpInterface -> Webhook -> Fetch-Messages -> Message with no Exchange received -> messageReceived = ' + messageReceived)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ return
+ }
+ if (market === undefined) {
+ console.log('[WARN] httpInterface -> Webhook -> Fetch-Messages -> Message with no market received -> messageReceived = ' + messageReceived)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ return
+ }
+
+ let key = exchange + '-' + market
+
+ let webhookMessages = webhook.get(key)
+ if (webhookMessages === undefined) {
+ webhookMessages = []
+ }
+
+ console.log('[INFO] httpInterface -> Webhook -> Fetch-Messages -> Exchange-Market = ' + exchange + '-' + market)
+ console.log('[INFO] httpInterface -> Webhook -> Fetch-Messages -> Messeges Fetched by Webhooks Sensor Bot = ' + webhookMessages.length)
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(webhookMessages), httpResponse)
+ webhookMessages = []
+
+ webhook.set(key, webhookMessages)
+ break
+ }
+ case 'New-Message': {
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ function processRequest(messageReceived) {
+ let timestamp = (new Date()).valueOf()
+ let source = requestPath[3]
+ let exchange = requestPath[4]
+ let market = requestPath[5]
+
+ /* Some validations */
+ if (source === undefined) {
+ console.log('[WARN] httpInterface -> Webhook -> New-Message -> Message with no Source received -> messageReceived = ' + messageReceived)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ return
+ }
+ if (exchange === undefined) {
+ console.log('[WARN] httpInterface -> Webhook -> New-Message -> Message with no Exchange received -> messageReceived = ' + messageReceived)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ return
+ }
+ if (market === undefined) {
+ console.log('[WARN] httpInterface -> Webhook -> New-Message -> Message with no market received -> messageReceived = ' + messageReceived)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ return
+ }
+
+ let key = exchange + '-' + market
+
+ let webhookMessages = webhook.get(key)
+ if (webhookMessages === undefined) {
+ webhookMessages = []
+ }
+
+ webhookMessages.push([timestamp, source, messageReceived])
+ webhook.set(key, webhookMessages)
+
+ console.log('[INFO] httpInterface -> Webhook -> New-Message -> Exchange-Market = ' + exchange + '-' + market)
+ console.log('[INFO] httpInterface -> Webhook -> New-Message -> messageReceived = ' + messageReceived)
+ console.log('[INFO] httpInterface -> Webhook -> New-Message -> Messeges waiting to be Fetched by Webhooks Sensor Bot = ' + webhookMessages.length)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
+ }
+ break
+ }
+ }
+ }
+ break
+ case 'Docs':
+ {
+ switch (requestPath[2]) { // switch by command
+ case 'Save-Node-Schema': {
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ async function processRequest(body) {
+ try {
+ let docsSchema = JSON.parse(body)
+ let project = requestPath[3]
+ let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Nodes'
+
+ if (checkAllSchmemaDocuments('Node', docsSchema, filePath) === true) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
+ } else {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ }
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> Docs -> Save-Node-Schema -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> Docs -> Save-Node-Schema -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> Docs -> Save-Node-Schema -> Params Received = ' + body)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ break
+ }
+
+ case 'Save-Concept-Schema': {
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ async function processRequest(body) {
+ try {
+ let docsSchema = JSON.parse(body)
+ let project = requestPath[3]
+ let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Concepts'
+
+ if (checkAllSchmemaDocuments('Concept', docsSchema, filePath) === true) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
+ } else {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ }
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> Docs -> Save-Concept-Schema -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> Docs -> Save-Concept-Schema -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> Docs -> Save-Concept-Schema -> Params Received = ' + body)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ break
+ }
+
+ case 'Save-Topic-Schema': {
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ async function processRequest(body) {
+ try {
+ let docsSchema = JSON.parse(body)
+ let project = requestPath[3]
+ let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Topics'
+
+ if (checkAllSchmemaDocuments('Topic', docsSchema, filePath) === true) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
+ } else {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ }
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> Docs -> Save-Topic-Schema -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> Docs -> Save-Topic-Schema -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> Docs -> Save-Topic-Schema -> Params Received = ' + body)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ break
+ }
+
+ case 'Save-Tutorial-Schema': {
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ async function processRequest(body) {
+ try {
+ let docsSchema = JSON.parse(body)
+ let project = requestPath[3]
+ let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Tutorials'
+
+ if (checkAllSchmemaDocuments('Tutorial', docsSchema, filePath) === true) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
+ } else {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ }
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> Docs -> Save-Tutorial-Schema -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> Docs -> Save-Tutorial-Schema -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> Docs -> Save-Tutorial-Schema -> Params Received = ' + body)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ break
+ }
+
+ case 'Save-Review-Schema': {
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ async function processRequest(body) {
+ try {
+ let docsSchema = JSON.parse(body)
+ let project = requestPath[3]
+ let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Reviews'
+
+ if (checkAllSchmemaDocuments('Review', docsSchema, filePath) === true) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
+ } else {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ }
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> Docs -> Save-Review-Schema -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> Docs -> Save-Review-Schema -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> Docs -> Save-Review-Schema -> Params Received = ' + body)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ break
+ }
+
+ case 'Save-Book-Schema': {
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ async function processRequest(body) {
+ try {
+ let docsSchema = JSON.parse(body)
+ let project = requestPath[3]
+ let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Books'
+
+ if (checkAllSchmemaDocuments('Book', docsSchema, filePath) === true) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
+ } else {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ }
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> Docs -> Save-Book-Schema -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> Docs -> Save-Book-Schema -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> Docs -> Save-Book-Schema -> Params Received = ' + body)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ break
+ }
+ }
+
+ function checkAllSchmemaDocuments(category, docsSchema, filePath) {
+ const fs = SA.nodeModules.fs
+ let noErrorsDuringSaving = true
+
+ for (let i = 0; i < docsSchema.length; i++) {
+ let schemaDocument = docsSchema[i]
+ /*
+ For some type of schemas we will save the file at an extra
+ folder derived from the document's type.
+ */
+ let fileName = schemaDocument.type.toLowerCase()
+ for (let j = 0; j < 10; j++) {
+ fileName = cleanFileName(fileName)
+ }
+ let pageNumber = '00' + schemaDocument.pageNumber
+ let newFilepath = filePath
+ switch (category) {
+ case 'Topic': {
+ fileName = schemaDocument.topic.toLowerCase() + '-' + pageNumber.substring(pageNumber.length - 3, pageNumber.length) + '-' + schemaDocument.type.toLowerCase()
+ fileName = cleanFileName(fileName)
+ newFilepath = createPrefixDirectories(filePath, schemaDocument.topic)
+ break
+ }
+ case 'Tutorial': {
+ fileName = schemaDocument.tutorial.toLowerCase() + '-' + pageNumber.substring(pageNumber.length - 3, pageNumber.length) + '-' + schemaDocument.type.toLowerCase()
+ fileName = cleanFileName(fileName)
+ newFilepath = createPrefixDirectories(filePath, schemaDocument.tutorial)
+ break
+ }
+ case 'Review': {
+ fileName = schemaDocument.review.toLowerCase() + '-' + pageNumber.substring(pageNumber.length - 3, pageNumber.length) + '-' + schemaDocument.type.toLowerCase()
+ fileName = cleanFileName(fileName)
+ newFilepath = createPrefixDirectories(filePath, schemaDocument.review)
+ break
+ }
+ case 'Node': {
+ newFilepath = createPrefixDirectories(filePath, schemaDocument.type)
+ break
+ }
+ case 'Concept': {
+ newFilepath = createPrefixDirectories(filePath, schemaDocument.type)
+ break
+ }
+ }
+
+ function createPrefixDirectories(filePath, schemaTextToUse) {
+ let firstLetter = schemaTextToUse.substring(0, 1)
+ createNewDir(filePath + '/' + firstLetter)
+ let extraWord = schemaTextToUse.split(' ')[0]
+ createNewDir(filePath + '/' + firstLetter + '/' + extraWord)
+ return filePath + '/' + firstLetter + '/' + extraWord + '/' + cleanFileName(schemaTextToUse)
+ }
+
+ fileName = fileName + '.json'
+
+ if (schemaDocument.deleted === true) {
+ try {
+ fs.unlinkSync(newFilepath + '/' + fileName)
+ console.log('[SUCCESS] ' + newFilepath + '/' + fileName + ' deleted.')
+ } catch (err) {
+ noErrorsDuringSaving = false
+ console.log('[ERROR] httpInterface -> Docs -> Delete -> ' + newFilepath + '/' + fileName + ' could not be deleted.')
+ console.log('[ERROR] httpInterface -> Docs -> Delete -> Resolve the issue that is preventing the Client to delete this file. Look at the error message below as a guide. At the UI you will need to delete this page again in order for the Client to retry next time you execute the docs.save command.')
+ console.log('[ERROR] httpInterface -> Docs -> Delete -> err.stack = ' + err.stack)
+ }
+ } else {
+ if (schemaDocument.updated === true || schemaDocument.created === true) {
+ try {
+ let created = schemaDocument.created
+ let updated = schemaDocument.updated
+ schemaDocument.updated = undefined
+ schemaDocument.created = undefined
+ let fileContent = JSON.stringify(schemaDocument, undefined, 4)
+ createNewDir(newFilepath)
+ fs.writeFileSync(newFilepath + '/' + fileName, fileContent)
+ if (created === true) {
+ console.log('[SUCCESS] ' + newFilepath + '/' + fileName + ' created.')
+ } else {
+ if (updated === true) {
+ console.log('[SUCCESS] ' + newFilepath + '/' + fileName + ' updated.')
+ }
+ }
+ } catch (err) {
+ noErrorsDuringSaving = false
+ console.log('[ERROR] httpInterface -> Docs -> Save -> ' + newFilepath + '/' + fileName + ' could not be created / updated.')
+ console.log('[ERROR] httpInterface -> Docs -> Save -> err.stack = ' + err.stack)
+ }
+ }
+ }
+
+ function createNewDir(path) {
+ try {
+ fs.mkdirSync(path)
+ } catch (err) {
+ if (err.message.indexOf('file already exists') < 0) {
+ throw (err)
+ }
+ }
+ }
+ }
+
+ return noErrorsDuringSaving
+ }
+
+ function cleanFileName(fileName) {
+ for (let i = 0; i < 100; i++) {
+ fileName = fileName
+ .replace(' ', '-')
+ .replace('--', '-')
+ .replace('?', '')
+ .replace('#', '')
+ .replace('$', '')
+ .replace('%', '')
+ .replace('^', '')
+ .replace('&', '')
+ .replace('*', '')
+ .replace('(', '')
+ .replace(')', '')
+ .replace('!', '')
+ .replace('..', '.')
+ .replace(',', '')
+ .replace('\'', '')
+ }
+ return fileName
+ }
+ }
+ break
+ case 'App':
+ {
+ switch (requestPath[2]) { // switch by command
+ case 'Contribute': {
+ try {
+ let commitMessage = unescape(requestPath[3])
+ const username = unescape(requestPath[4])
+ const token = unescape(requestPath[5])
+ const currentBranch = unescape(requestPath[6])
+ const contributionsBranch = unescape(requestPath[7])
+ let error
+
+ /* Unsavping # */
+ for (let i = 0; i < 10; i++) {
+ commitMessage = commitMessage.replace('_SLASH_', '/')
+ commitMessage = commitMessage.replace('_HASHTAG_', '#')
+ }
+
+ contribute()
+
+ async function contribute() {
+ const { lookpath } = require('lookpath');
+ const gitpath = await lookpath('git');
+ if (gitpath === undefined) {
+ console.log('[ERROR] `git` not installed.')
+ } else {
+ await doGit()
+ if (error !== undefined) {
+
+ let docs = {
+ project: 'Foundations',
+ category: 'Topic',
+ type: 'App Error - Contribution Not Sent',
+ anchor: undefined,
+ placeholder: {}
+ }
+
+ respondWithDocsObject(docs, error)
+ return
+ }
+
+ await doGithub()
+ if (error !== undefined) {
+
+ let docs = {
+ project: 'Foundations',
+ category: 'Topic',
+ type: 'App Error - Contribution Not Sent',
+ anchor: undefined,
+ placeholder: {}
+ }
+ console.log('respond with docs ')
+
+ respondWithDocsObject(docs, error)
+ return
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
+ }
+ }
+
+ async function doGit() {
+ const simpleGit = require('simple-git');
+ const options = {
+ baseDir: process.cwd(),
+ binary: 'git',
+ maxConcurrentProcesses: 6,
+ }
+ const git = simpleGit(options)
+
+ try {
+ await git.add('./*')
+ await git.commit(commitMessage)
+ await git.push('origin', currentBranch)
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> commitMessage = ' + commitMessage)
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> currentBranch = ' + currentBranch)
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> contributionsBranch = ' + contributionsBranch)
+ console.log('')
+ console.log('Torubleshooting Tips:')
+ console.log('')
+ console.log('1. Make sure that you have set up your Github Username and Token at the APIs -> Github API node at the workspace.')
+ console.log('2. Make sure you are running the latest version of Git available for your OS.')
+ console.log('3. Make sure that you have cloned your Superalgos repository fork, and not the main Superalgos repository.')
+ console.log('4. If your fork is old, you might need to do an app.update and also a node setup at every branch. If you just reforked all is good.')
+ error = err
+ }
+ }
+
+ async function doGithub() {
+
+ const { Octokit } = require("@octokit/rest")
+
+ const octokit = new Octokit({
+ auth: token,
+ userAgent: 'Superalgos Beta 11'
+ })
+
+ const repo = 'Superalgos'
+ const owner = 'Superalgos'
+ const head = username + ':' + contributionsBranch
+ const base = currentBranch
+ const title = 'Contribution: ' + commitMessage
+
+ try {
+ await octokit.pulls.create({
+ owner,
+ repo,
+ title,
+ head,
+ base,
+ });
+ } catch (err) {
+ if (err.stack.indexOf('A pull request already exists') >= 0) {
+ return
+ } else {
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> commitMessage = ' + commitMessage)
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> username = ' + username)
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> token starts with = ' + token.substring(0, 10) + '...')
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> token ends with = ' + '...' + token.substring(token.length - 10))
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> currentBranch = ' + currentBranch)
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> contributionsBranch = ' + contributionsBranch)
+ error = err
+ }
+ }
+ }
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> App -> Contribute -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> App -> Contribute -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> App -> Contribute -> commitMessage = ' + commitMessage)
+ console.log('[ERROR] httpInterface -> App -> Contribute -> username = ' + username)
+ console.log('[ERROR] httpInterface -> App -> Contribute -> token starts with = ' + token.substring(0, 10) + '...')
+ console.log('[ERROR] httpInterface -> App -> Contribute -> token ends with = ' + '...' + token.substring(token.length - 10))
+ console.log('[ERROR] httpInterface -> App -> Contribute -> currentBranch = ' + currentBranch)
+ console.log('[ERROR] httpInterface -> App -> Contribute -> contributionsBranch = ' + contributionsBranch)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ break
+ }
+
+ case 'Update': {
+ try {
+ const currentBranch = unescape(requestPath[3])
+ update()
+
+ async function update() {
+ const { lookpath } = require('lookpath');
+ const gitpath = await lookpath('git');
+ if (gitpath === undefined) {
+ console.log('[ERROR] `git` not installed.')
+ } else {
+ let result = await doGit()
+
+ if (result.error === undefined) {
+ let customResponse = {
+ result: global.CUSTOM_OK_RESPONSE.result,
+ message: result.message
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(customResponse), httpResponse)
+ } else {
+
+ let docs = {
+ project: 'Foundations',
+ category: 'Topic',
+ type: 'App Error - Update Failed',
+ anchor: undefined,
+ placeholder: {}
+ }
+
+ respondWithDocsObject(docs, result.error)
+
+ }
+ }
+ }
+
+ async function doGit() {
+ const simpleGit = require('simple-git');
+ const options = {
+ baseDir: process.cwd(),
+ binary: 'git',
+ maxConcurrentProcesses: 6,
+ }
+ const git = simpleGit(options)
+
+ let message
+ try {
+ message = await git.pull('https://github.com/Superalgos/Superalgos', currentBranch)
+ return { message: message }
+ } catch (err) {
+ console.log('[ERROR] Error updating ' + currentBranch)
+ console.log(err.stack)
+ return { error: err }
+ }
+ }
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> App -> Update -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> App -> Update -> err.stack = ' + err.stack)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ break
+ }
+
+ case 'Checkout': {
+ try {
+ const currentBranch = unescape(requestPath[3])
+ let error
+
+ checkout()
+
+ async function checkout() {
+ const { lookpath } = require('lookpath');
+ const gitpath = await lookpath('git');
+ if (gitpath === undefined) {
+ console.log('[ERROR] `git` not installed.')
+ } else {
+ await doGit()
+
+ if (error === undefined) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
+ } else {
+ let docs = {
+ project: 'Foundations',
+ category: 'Topic',
+ type: 'Switching Branches - Current Branch Not Changed',
+ anchor: undefined,
+ placeholder: {}
+ }
+
+ respondWithDocsObject(docs, error)
+ }
+ }
+ }
+
+ async function doGit() {
+ const simpleGit = require('simple-git');
+ const options = {
+ baseDir: process.cwd(),
+ binary: 'git',
+ maxConcurrentProcesses: 6,
+ }
+ const git = simpleGit(options)
+ try {
+ await git.checkout(currentBranch)
+ } catch (err) {
+ console.log('[ERROR] Error changing current branch to ' + currentBranch)
+ console.log(err.stack)
+ error = err
+ }
+ }
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> App -> Update -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> App -> Update -> err.stack = ' + err.stack)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ break
+ }
+
+ case 'Branch': {
+ try {
+ branch()
+
+ async function branch() {
+ const { lookpath } = require('lookpath');
+ const gitpath = await lookpath('git');
+ if (gitpath === undefined) {
+ console.log('[ERROR] `git` not installed.')
+ } else {
+ let result = await doGit()
+
+ if (result.error === undefined) {
+ let customResponse = {
+ result: global.CUSTOM_OK_RESPONSE.result,
+ message: result
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(customResponse), httpResponse)
+ } else {
+ let docs = {
+ project: 'Foundations',
+ category: 'Topic',
+ type: 'App Error - Could Not Get Current Branch',
+ anchor: undefined,
+ placeholder: {}
+ }
+
+ respondWithDocsObject(docs, error)
+ }
+ }
+ }
+
+ async function doGit() {
+ const simpleGit = require('simple-git');
+ const options = {
+ baseDir: process.cwd(),
+ binary: 'git',
+ maxConcurrentProcesses: 6,
+ }
+ const git = simpleGit(options)
+ try {
+ return await git.branch()
+ } catch (err) {
+ console.log('[ERROR] Error reading current branch.')
+ console.log(err.stack)
+ }
+ }
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> App -> Update -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> App -> Update -> err.stack = ' + err.stack)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ break
+ }
+ }
+
+ function respondWithDocsObject(docs, error) {
+
+ if (error.message !== undefined) {
+ docs.placeholder.errorMessage = {
+ style: 'Error',
+ text: error.message
+ }
+ }
+ if (error.stack !== undefined) {
+ docs.placeholder.errorStack = {
+ style: 'Javascript',
+ text: error.stack
+ }
+ }
+ if (error.code !== undefined) {
+ docs.placeholder.errorCode = {
+ style: 'Json',
+ text: error.code
+ }
+ }
+
+ docs.placeholder.errorDetails = {
+ style: 'Json',
+ text: JSON.stringify(error, undefined, 4)
+ }
+
+ let customResponse = {
+ result: global.CUSTOM_FAIL_RESPONSE.result,
+ docs: docs
+ }
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(customResponse), httpResponse)
+
+ }
+ }
+ break
+ case 'GOV':
+ {
+ /*
+ This is the Governance endpoint at the Http Interface. All methods
+ related to the Governance System are implemented here and routed
+ to the backend Servers that can process them.
+ */
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ async function processRequest(body) {
+ try {
+ let params = JSON.parse(body)
+
+ switch (params.method) {
+ case 'getGithubStars': {
+
+ let serverResponse = await CL.servers.GITHUB_SERVER.getGithubStars(
+ params.repository,
+ params.username,
+ params.token
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse)
+ return
+ }
+ case 'getGithubWatchers': {
+
+ let serverResponse = await CL.servers.GITHUB_SERVER.getGithubWatchers(
+ params.repository,
+ params.username,
+ params.token
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse)
+ return
+ }
+ case 'getGithubForks': {
+
+ let serverResponse = await CL.servers.GITHUB_SERVER.getGithubForks(
+ params.repository,
+ params.username,
+ params.token
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse)
+ return
+ }
+ case 'mergePullRequests': {
+
+ let serverResponse = await CL.servers.GITHUB_SERVER.mergePullRequests(
+ params.commitMessage,
+ params.username,
+ params.token
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse)
+ return
+ }
+ case 'payContributors': {
+
+ let serverResponse = await CL.servers.WEB3_SERVER.payContributors(
+ params.contractAddress,
+ params.contractAbi,
+ params.paymentsArray,
+ params.mnemonic
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse)
+ return
+ }
+ default: {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify({ error: 'Method ' + params.method + ' is invalid.' }), httpResponse)
+ }
+ }
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> GOV -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> GOV -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> GOV -> Params Received = ' + body)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ }
+ break
+ case 'LegacyPlotter.js':
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(global.env.PATH_TO_CLIENT + '/WebServer/LegacyPlotter.js', httpResponse)
+ }
+ break
+ case 'PlotterPanel.js':
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(global.env.PATH_TO_CLIENT + '/WebServer/PlotterPanel.js', httpResponse)
+ }
+ break
+ case 'Images': // This means the Images folder.
+ {
+ let path = global.env.PATH_TO_CLIENT + '/WebServer/Images/' + requestPath[2]
+
+ if (requestPath[3] !== undefined) {
+ path = path + '/' + requestPath[3]
+ }
+
+ if (requestPath[4] !== undefined) {
+ path = path + '/' + requestPath[4]
+ }
+
+ if (requestPath[5] !== undefined) {
+ path = path + '/' + requestPath[5]
+ }
+
+ path = unescape(path)
+
+ SA.projects.foundations.utilities.httpResponses.respondWithImage(path, httpResponse)
+ }
+ break
+ case 'Icons': // This means the Icons folder under Projects.
+ {
+ let path = global.env.PATH_TO_PROJECTS + '/' + requestPath[2] + '/Icons'
+
+ if (requestPath[3] !== undefined) {
+ path = path + '/' + requestPath[3]
+ }
+
+ if (requestPath[4] !== undefined) {
+ path = path + '/' + requestPath[4]
+ }
+
+ if (requestPath[5] !== undefined) {
+ path = path + '/' + requestPath[5]
+ }
+
+ path = unescape(path)
+
+ SA.projects.foundations.utilities.httpResponses.respondWithImage(path, httpResponse)
+ }
+ break
+ case 'GIFs': // This means the GIFs folder under Projects.
+ {
+ let path = global.env.PATH_TO_PROJECTS + '/' + requestPath[2] + '/GIFs'
+
+ if (requestPath[3] !== undefined) {
+ path = path + '/' + requestPath[3]
+ }
+
+ if (requestPath[4] !== undefined) {
+ path = path + '/' + requestPath[4]
+ }
+
+ if (requestPath[5] !== undefined) {
+ path = path + '/' + requestPath[5]
+ }
+
+ path = unescape(path)
+ SA.projects.foundations.utilities.httpResponses.respondWithImage(path, httpResponse)
+ }
+ break
+ case 'PNGs': // This means the PNGs folder under Projects.
+ {
+ let path = global.env.PATH_TO_PROJECTS + '/' + requestPath[2] + '/PNGs'
+
+ if (requestPath[3] !== undefined) {
+ path = path + '/' + requestPath[3]
+ }
+
+ if (requestPath[4] !== undefined) {
+ path = path + '/' + requestPath[4]
+ }
+
+ if (requestPath[5] !== undefined) {
+ path = path + '/' + requestPath[5]
+ }
+
+ path = unescape(path)
+ SA.projects.foundations.utilities.httpResponses.respondWithImage(path, httpResponse)
+ }
+ break
+ case 'WebServer': // This means the WebServer folder.
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(global.env.PATH_TO_CLIENT + '/WebServer/' + requestPath[2], httpResponse)
+ }
+ break
+ case 'externalScripts': // This means the WebServer folder.
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(global.env.PATH_TO_CLIENT + '/WebServer/externalScripts/' + requestPath[2], httpResponse)
+ }
+ break
+ case 'Plotters': // This means the plotter folder, not to be confused with the Plotters script!
+ {
+ let project = requestPath[2]
+ let dataMine = requestPath[3]
+ let codeName = requestPath[4]
+ let moduleName = requestPath[5]
+ let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/' + 'Bots-Plotters-Code' + '/' + dataMine + '/plotters/' + codeName + '/' + moduleName
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(filePath, httpResponse)
+ }
+ break
+ case 'ChartLayers':
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(global.env.PATH_TO_CLIENT + '/UI/' + endpointOrFile + '/' + requestPath[2], httpResponse)
+ }
+ break
+ case 'Files':
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(global.env.PATH_TO_CLIENT + '/UI/Data-Files/' + requestPath[2], httpResponse)
+ }
+ break
+ case 'Fonts':
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithFont(global.env.PATH_TO_FONTS + '/' + requestPath[2], httpResponse)
+ }
+ break
+ case 'Schema':
+ {
+ sendSchema(global.env.PATH_TO_PROJECTS + '/' + requestPath[2] + '/Schemas/', requestPath[3])
+
+ function sendSchema(filePath, schemaType) {
+ let fs = SA.nodeModules.fs
+ try {
+ let folder = ''
+ switch (schemaType) {
+ case 'AppSchema': {
+ folder = 'App-Schema'
+ break
+ }
+ case 'DocsNodeSchema': {
+ folder = 'Docs-Nodes'
+ break
+ }
+ case 'DocsConceptSchema': {
+ folder = 'Docs-Concepts'
+ break
+ }
+ case 'DocsTopicSchema': {
+ folder = 'Docs-Topics'
+ break
+ }
+ case 'DocsTutorialSchema': {
+ folder = 'Docs-Tutorials'
+ break
+ }
+ case 'DocsReviewSchema': {
+ folder = 'Docs-Reviews'
+ break
+ }
+ case 'DocsBookSchema': {
+ folder = 'Docs-Books'
+ break
+ }
+ }
+ SA.projects.foundations.utilities.filesAndDirectories.getAllFilesInDirectoryAndSubdirectories(filePath + folder, onFilesReady)
+ function onFilesReady(files) {
+
+ let schemaArray = []
+ for (let k = 0; k < files.length; k++) {
+ let name = files[k]
+ let nameSplitted = name.split(folder)
+ let fileName = nameSplitted[1]
+ for (let i = 0; i < 10; i++) {
+ fileName = fileName.replace('\\', '/')
+ }
+ let fileToRead = filePath + folder + fileName
+
+ let fileContent = fs.readFileSync(fileToRead)
+ let schemaDocument
+ try {
+ schemaDocument = JSON.parse(fileContent)
+ } catch (err) {
+ console.log('[ERROR] sendSchema -> Error Parsing JSON File: ' + fileToRead + ' .Error = ' + err.stack)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent("[]", httpResponse)
+ return
+ }
+ schemaArray.push(schemaDocument)
+ }
+ let schema = JSON.stringify(schemaArray)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(schema, httpResponse)
+ }
+ } catch (err) {
+ if (err.message.indexOf('no such file or directory') < 0) {
+ console.log('Could not send Schema:', filePath, schemaType)
+ console.log(err.stack)
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent("[]", httpResponse)
+ }
+ }
+ }
+ break
+ case 'DirContent':
+ {
+ let folderPath = unescape(requestPath[2])
+ if (requestPath[3] !== undefined) {
+ folderPath = folderPath + '/' + requestPath[3]
+ }
+
+ if (requestPath[4] !== undefined) {
+ folderPath = folderPath + '/' + requestPath[4]
+ }
+
+ if (requestPath[5] !== undefined) {
+ folderPath = folderPath + '/' + requestPath[5]
+ }
+ let folder
+ if (requestPath[2] === 'Root') {
+ folder = folderPath.replace('Root', '../Superalgos/')
+ } else {
+ folder = global.env.PATH_TO_PROJECTS + '/' + folderPath
+ }
+
+ SA.projects.foundations.utilities.filesAndDirectories.getAllFilesInDirectoryAndSubdirectories(folder, onFilesReady)
+
+ function onFilesReady(files) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(files), httpResponse)
+ }
+ }
+ break
+ case 'IconNames':
+ {
+ let projects = SA.projects.foundations.utilities.filesAndDirectories.getDirectories(global.env.PATH_TO_PROJECTS)
+ let icons = []
+ let totalProjects = projects.length
+ let projectCounter = 0
+
+ for (let i = 0; i < projects.length; i++) {
+ let project = projects[i]
+
+ const folder = global.env.PATH_TO_PROJECTS + '/' + project + '/Icons/'
+
+ SA.projects.foundations.utilities.filesAndDirectories.getAllFilesInDirectoryAndSubdirectories(folder, onFilesReady)
+
+ function onFilesReady(files) {
+ for (let j = 0; j < files.length; j++) {
+ let file = files[j]
+ for (let i = 0; i < 10; i++) {
+ file = file.replace('/', '\\')
+ }
+ icons.push([project, file])
+ }
+
+ projectCounter++
+ if (projectCounter === totalProjects) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(icons), httpResponse)
+ }
+ }
+ }
+ }
+ break
+ case 'PluginFileNames':
+ {
+ processRequest()
+
+ async function processRequest(body) {
+ try {
+ let project = unescape(requestPath[2])
+ let folder = unescape(requestPath[3])
+
+ let response = await SA.projects.foundations.utilities.plugins.getPluginFileNames(
+ project,
+ folder
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(response), httpResponse)
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> PluginFileNames -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> PluginFileNames -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> PluginFileNames -> Params Received = ' + body)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ }
+ break
+ case 'LoadPlugin':
+ {
+ processRequest()
+
+ async function processRequest(body) {
+ try {
+ let project = unescape(requestPath[2])
+ let folder = unescape(requestPath[3])
+ let fileName = unescape(requestPath[4])
+
+ let response = await SA.projects.foundations.utilities.plugins.getPluginFileContent(
+ project,
+ folder,
+ fileName
+ ).catch(err => {
+ let error = {
+ result: 'Fail Because',
+ message: err
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ return
+ })
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(response, httpResponse)
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> LoadPlugin -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> LoadPlugin -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> LoadPlugin -> Params Received = ' + body)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ }
+ break
+ case 'SavePlugin':
+ {
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ async function processRequest(body) {
+ try {
+ let plugin = JSON.parse(body)
+ let project = requestPath[2]
+ let folder = requestPath[3]
+ let fileName = requestPath[4]
+ let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Plugins/' + folder
+ let fileContent = JSON.stringify(plugin, undefined, 4)
+ const fs = SA.nodeModules.fs
+ fs.writeFileSync(filePath + '/' + fileName + '.json', fileContent)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> SavePlugin -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> SavePlugin -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> SavePlugin -> Params Received = ' + body)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ }
+ break
+ case 'Workspace.js':
+ {
+ let fs = SA.nodeModules.fs
+
+ try {
+ let filePath = global.env.PATH_TO_DEFAULT_WORKSPACE + '/Getting-Started-Tutorials.json'
+ fs.readFile(filePath, onFileRead)
+ } catch (e) {
+ console.log('[ERROR] Error reading the Workspace.', e)
+ }
+
+ function onFileRead(err, workspace) {
+ if (err) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(undefined, httpResponse)
+ } else {
+ let responseContent = 'function getWorkspace(){ return ' + workspace + '}'
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(responseContent, httpResponse)
+ }
+ }
+ }
+ break
+ case 'ListWorkspaces':
+ {
+ let allWorkspaces = []
+ let projects = SA.projects.foundations.utilities.filesAndDirectories.getDirectories(global.env.PATH_TO_PROJECTS)
+ let projectsCount = 0
+
+ for (let i = 0; i < projects.length; i++) {
+ let project = projects[i]
+ readPluginWorkspaces()
+ function readPluginWorkspaces() {
+ let dirPath = global.env.PATH_TO_PROJECTS + '/' + project + '/Plugins/Workspaces'
+ try {
+ let fs = SA.nodeModules.fs
+ fs.readdir(dirPath, onDirRead)
+
+ function onDirRead(err, fileList) {
+ let updatedFileList = []
+
+ if (err) {
+ /*
+ If we have a problem reading this folder we will assume that it is
+ because this project does not need this folder and that's it.
+ */
+ //console.log('[WARN] Error reading a directory content. filePath = ' + dirPath)
+ } else {
+ for (let i = 0; i < fileList.length; i++) {
+ let name = 'Plugin \u2192 ' + fileList[i]
+ updatedFileList.push([project, name])
+ }
+ }
+ allWorkspaces = allWorkspaces.concat(updatedFileList)
+ projectsCount++
+ if (projectsCount === projects.length) {
+ readMyWorkspaces()
+ }
+ }
+ } catch (err) {
+ console.log('[ERROR] Error reading a directory content. filePath = ' + dirPath)
+ console.log('[ERROR] err.stack = ' + err.stack)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ return
+ }
+ }
+ }
+
+ function readMyWorkspaces() {
+ let dirPath = global.env.PATH_TO_MY_WORKSPACES
+ try {
+ let fs = SA.nodeModules.fs
+ fs.readdir(dirPath, onDirRead)
+
+ function onDirRead(err, fileList) {
+ if (err) {
+ // This happens the first time you run the software.
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(allWorkspaces), httpResponse)
+ return
+ } else {
+ let updatedFileList = []
+ for (let i = 0; i < fileList.length; i++) {
+ let name = fileList[i]
+ updatedFileList.push(['', name])
+ }
+ allWorkspaces = allWorkspaces.concat(updatedFileList)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(allWorkspaces), httpResponse)
+ return
+ }
+ }
+ } catch (err) {
+ console.log('[ERROR] Error reading a directory content. filePath = ' + dirPath)
+ console.log('[ERROR] err.stack = ' + err.stack)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ return
+ }
+ }
+ }
+ break
+ case 'LoadMyWorkspace':
+ {
+ let fileName = unescape(requestPath[2])
+ let filePath = global.env.PATH_TO_MY_WORKSPACES + '/' + fileName + '.json'
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(filePath, httpResponse)
+ }
+ break
+ case 'SaveWorkspace':
+ {
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ async function processRequest(body) {
+
+ let fileContent = body
+ let fileName = unescape(requestPath[2])
+ let filePath = global.env.PATH_TO_MY_WORKSPACES + '/' + fileName + '.json'
+
+ try {
+ let fs = SA.nodeModules.fs
+ let dir = global.env.PATH_TO_MY_WORKSPACES;
+
+ /* Create Dir if it does not exist */
+ if (!fs.existsSync(dir)) {
+ fs.mkdirSync(dir);
+ }
+
+ fs.writeFile(filePath, fileContent, onFileWritten)
+
+ function onFileWritten(err) {
+ if (err) {
+ console.log('[ERROR] SaveWorkspace -> onFileWritten -> Error writing the Workspace file. fileName = ' + fileName)
+ console.log('[ERROR] SaveWorkspace -> onFileWritten -> err.stack = ' + err.stack)
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ } else {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
+ }
+ }
+
+ } catch (err) {
+ console.log('[ERROR] SaveWorkspace -> Error writing the Workspace file. fileName = ' + fileName)
+ console.log('[ERROR] SaveWorkspace -> err.stack = ' + err.stack)
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ }
+ break
+ case 'ProjectsSchema':
+ {
+ let path = global.env.PATH_TO_PROJECTS + '/' + 'ProjectsSchema.json'
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(path, httpResponse)
+ }
+ break
+ case 'ListSpaceFiles':
+ {
+ let fs = SA.nodeModules.fs
+ let allFiles = []
+ let projects = SA.projects.foundations.utilities.filesAndDirectories.getDirectories(global.env.PATH_TO_PROJECTS)
+ let dirCount = 0
+ let totalDirs = 0
+
+ for (let i = 0; i < projects.length; i++) {
+ let project = projects[i]
+
+ let dirPath = project + '/UI/Spaces'
+ let spaces = SA.projects.foundations.utilities.filesAndDirectories.getDirectories(global.env.PATH_TO_PROJECTS + '/' + dirPath)
+
+ for (let j = 0; j < spaces.length; j++) {
+ let space = spaces[j]
+ readDirectory(dirPath + '/' + space)
+ }
+
+ function readDirectory(path) {
+ try {
+
+ totalDirs++
+ fs.readdir(global.env.PATH_TO_PROJECTS + '/' + path, onDirRead)
+
+ let otherDirs = SA.projects.foundations.utilities.filesAndDirectories.getDirectories(global.env.PATH_TO_PROJECTS + '/' + path)
+ for (let m = 0; m < otherDirs.length; m++) {
+ let otherDir = otherDirs[m]
+ readDirectory(path + '/' + otherDir)
+ }
+
+ function onDirRead(err, fileList) {
+ if (err) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ } else {
+ let updatedFileList = []
+ for (let k = 0; k < fileList.length; k++) {
+ let name = fileList[k]
+ if (name.indexOf('.js') < 0) { continue }
+ updatedFileList.push(path + '/' + name)
+ }
+ allFiles = allFiles.concat(updatedFileList)
+ dirCount++
+ if (dirCount === totalDirs) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(allFiles), httpResponse)
+ }
+ }
+ }
+ } catch (err) {
+ console.log('[ERROR] Error reading a directory content. filePath = ' + path)
+ console.log('[ERROR] err.stack = ' + err.stack)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ return
+ }
+ }
+ }
+ }
+ break
+ case 'ListFunctionLibraries':
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithProjectFolderFileList(httpResponse, 'Function-Libraries', 'UI')
+ }
+ break
+ case 'ListUtilitiesFiles':
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithProjectFolderFileList(httpResponse, 'Utilities', 'UI')
+ }
+ break
+ case 'ListGlobalFiles':
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithProjectFolderFileList(httpResponse, 'Globals', 'UI')
+ }
+ break
+ case 'Projects':
+ {
+ let path = ''
+ for (let i = 2; i < 10; i++) {
+ if (requestPath[i] !== undefined) {
+ let parameter = unescape(requestPath[i])
+ path = path + '/' + parameter
+ }
+
+ }
+ let filePath = global.env.PATH_TO_PROJECTS + path
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(filePath, httpResponse)
+ }
+ break
+ case 'Storage':
+ {
+ let pathToFile = httpRequest.url.substring(9)
+ /* Unsavping # */
+ for (let i = 0; i < 10; i++) {
+ pathToFile = pathToFile.replace('_HASHTAG_', '#')
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(global.env.PATH_TO_DATA_STORAGE + '/' + pathToFile, httpResponse)
+ }
+ break
+ default:
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithWebFile(httpResponse, endpointOrFile, global.env.PATH_TO_CLIENT)
+ }
+ }
+ } catch (err) {
+ console.log(err.stack)
+ }
+ }
+}
diff --git a/Client/pluginServer.js b/Platform/Client/pluginServer.js
similarity index 100%
rename from Client/pluginServer.js
rename to Platform/Client/pluginServer.js
diff --git a/Client/projectFileServer.js b/Platform/Client/projectFileServer.js
similarity index 100%
rename from Client/projectFileServer.js
rename to Platform/Client/projectFileServer.js
diff --git a/Client/taskManagerServer.js b/Platform/Client/taskManagerServer.js
similarity index 100%
rename from Client/taskManagerServer.js
rename to Platform/Client/taskManagerServer.js
diff --git a/Client/uiFileServer.js b/Platform/Client/uiFileServer.js
similarity index 100%
rename from Client/uiFileServer.js
rename to Platform/Client/uiFileServer.js
diff --git a/Client/web3Server.js b/Platform/Client/web3Server.js
similarity index 100%
rename from Client/web3Server.js
rename to Platform/Client/web3Server.js
diff --git a/Client/webServer.js b/Platform/Client/webServer.js
similarity index 100%
rename from Client/webServer.js
rename to Platform/Client/webServer.js
diff --git a/Client/webSocketsInterface.js b/Platform/Client/webSocketsInterface.js
similarity index 96%
rename from Client/webSocketsInterface.js
rename to Platform/Client/webSocketsInterface.js
index 36dfd2aef..aaabd15d2 100644
--- a/Client/webSocketsInterface.js
+++ b/Platform/Client/webSocketsInterface.js
@@ -4,8 +4,7 @@
let thisObject = {
initialize: initialize,
- finalize: finalize,
- run: run
+ finalize: finalize
}
const WEB_SOCKET = require('ws')
@@ -15,15 +14,11 @@
return thisObject
function finalize() {
-
+ socketServer = undefined
}
function initialize() {
-
- }
-
- function run() {
- setUpWebSocketServer()
+ setUpWebSocketServer()
}
function setUpWebSocketServer() {
@@ -47,8 +42,8 @@
if (LOG_INFO === true) {
console.log('Message Received: ' + message.substring(0, 1000))
}
-
- let messageArray = message.split('|*|')
+
+ let messageArray = message.toString().split('|*|')
let origin = messageArray[0]
let nonce = messageArray[1]
diff --git a/Client/client.js b/Platform/PlatformApp.js
similarity index 69%
rename from Client/client.js
rename to Platform/PlatformApp.js
index 07990149a..1ce43c411 100644
--- a/Client/client.js
+++ b/Platform/PlatformApp.js
@@ -6,71 +6,71 @@ global.env = ENVIRONMENT_MODULE
process.on('uncaughtException', function (err) {
if (err.message && err.message.indexOf("EADDRINUSE") > 0) {
- console.log("A Superalgos Client cannot be started. Reason: the port configured migth be being used by another application.")
+ console.log("The Superalgos Platform Client cannot be started. Reason: the port configured migth be being used by another application, or Superalgos Platform Client might be already running.")
return
}
- console.log('[ERROR] Client -> client-> uncaughtException -> err.message = ' + err.message)
- console.log('[ERROR] Client -> client-> uncaughtException -> err.stack = ' + err.stack)
- console.log('[ERROR] Client -> client-> uncaughtException -> err = ' + err)
+ console.log('[ERROR] Platform App -> uncaughtException -> err.message = ' + err.message)
+ console.log('[ERROR] Platform App -> uncaughtException -> err.stack = ' + err.stack)
+ console.log('[ERROR] Platform App -> uncaughtException -> err = ' + err)
process.exit(1)
})
process.on('unhandledRejection', (reason, p) => {
// Signal user that a necissary node module is missing
if (reason.code == 'MODULE_NOT_FOUND') {
- console.log("[ERROR] Dependency library not found. Please try running the 'node setup' command and then restart the Client.")
- console.log('[ERROR] Client -> client-> reason = ' + JSON.stringify(reason))
+ console.log("[ERROR] Dependency library not found. Please try running the 'node setup' command and then restart the Superalgos Platform Client.")
+ console.log('[ERROR] Platform App -> reason = ' + JSON.stringify(reason))
process.exit(1)
}
- console.log('[ERROR] Client -> client-> unhandledRejection -> reason = ' + JSON.stringify(reason))
- console.log('[ERROR] Client -> client-> unhandledRejection -> p = ' + JSON.stringify(p))
+ console.log('[ERROR] Platform App -> unhandledRejection -> reason = ' + JSON.stringify(reason))
+ console.log('[ERROR] Platform App -> unhandledRejection -> p = ' + JSON.stringify(p))
process.exit(1)
})
-
-/* Callbacks default responses. */
-
-global.DEFAULT_OK_RESPONSE = {
- result: "Ok",
- message: "Operation Succeeded"
-};
-
-global.DEFAULT_FAIL_RESPONSE = {
- result: "Fail",
- message: "Operation Failed"
-};
-
-global.DEFAULT_RETRY_RESPONSE = {
- result: 'Retry',
- message: 'Retry Later'
-}
-
-global.CUSTOM_OK_RESPONSE = {
- result: 'Ok, but check Message',
- message: 'Custom Message'
-}
-
-global.CUSTOM_FAIL_RESPONSE = {
- result: 'Fail Because',
- message: 'Custom Message'
-}
-
-/* Servers */
-let WEB_SERVER = require('./webServer.js')
-let DATA_FILE_SERVER = require('./dataFileServer.js')
-let PROJECT_FILE_SERVER = require('./projectFileServer.js')
-let UI_FILE_SERVER = require('./uiFileServer.js')
-let PLUGIN_SERVER = require('./pluginServer.js')
-let EVENT_SERVER = require('./eventServer.js')
-let TASK_MANAGER_SERVER = require('./taskManagerServer.js')
-let CCXT_SERVER = require('./ccxtServer.js')
-let WEB3_SERVER = require('./web3Server.js')
-let GITHUB_SERVER = require('./githubServer.js')
-
-/* Network Interfaces */
-let WEB_SOCKETS_INTERFACE = require('./webSocketsInterface.js')
-let HTTP_INTERFACE = require('./httpInterface.js')
-
try {
+ /* Callbacks default responses. */
+
+ global.DEFAULT_OK_RESPONSE = {
+ result: "Ok",
+ message: "Operation Succeeded"
+ };
+
+ global.DEFAULT_FAIL_RESPONSE = {
+ result: "Fail",
+ message: "Operation Failed"
+ };
+
+ global.DEFAULT_RETRY_RESPONSE = {
+ result: 'Retry',
+ message: 'Retry Later'
+ }
+
+ global.CUSTOM_OK_RESPONSE = {
+ result: 'Ok, but check Message',
+ message: 'Custom Message'
+ }
+
+ global.CUSTOM_FAIL_RESPONSE = {
+ result: 'Fail Because',
+ message: 'Custom Message'
+ }
+
+ /* Servers */
+ let WEB_SERVER = require('./Client/webServer.js')
+ let DATA_FILE_SERVER = require('./Client/dataFileServer.js')
+ let PROJECT_FILE_SERVER = require('./Client/projectFileServer.js')
+ let UI_FILE_SERVER = require('./Client/uiFileServer.js')
+ let PLUGIN_SERVER = require('./Client/pluginServer.js')
+ let EVENT_SERVER = require('./Client/eventServer.js')
+ let TASK_MANAGER_SERVER = require('./Client/taskManagerServer.js')
+ let CCXT_SERVER = require('./Client/ccxtServer.js')
+ let WEB3_SERVER = require('./Client/web3Server.js')
+ let GITHUB_SERVER = require('./Client/githubServer.js')
+
+ /* Network Interfaces */
+ let WEB_SOCKETS_INTERFACE = require('./Client/webSocketsInterface.js')
+ let HTTP_INTERFACE = require('./Client/httpInterface.js')
+
+
/*
The CL object is accesible everywhere at the Superalgos Client.
It provides access to all modules built for this Client.
@@ -97,13 +97,16 @@ try {
*/
SA.nodeModules = {
fs: require('fs'),
- nodeFetch: require('node-fetch')
+ nodeFetch: require('node-fetch'),
+ open: require('open'),
+ http: require('http'),
+ ccxt: require('ccxt')
}
/*
Setting up servers running inside this Client.
*/
CL.servers = {}
- console.log('CLIENT SERVERS:')
+ console.log('SUPERALGOS PLATFORM CLIENT SERVERS:')
console.log('')
CL.servers.WEB_SERVER = WEB_SERVER.newWebServer()
@@ -157,18 +160,16 @@ try {
console.log('Github Server ............................................... Started')
console.log('')
- console.log('CLIENT INTERFACES:')
+ console.log('SUPERALGOS PLATFORM CLIENT INTERFACES:')
console.log('')
WEB_SOCKETS_INTERFACE = WEB_SOCKETS_INTERFACE.newWebSocketsInterface()
WEB_SOCKETS_INTERFACE.initialize()
- WEB_SOCKETS_INTERFACE.run()
console.log('Web Sockets Interface ....................................... Listening at port ' + global.env.CLIENT_WEB_SOCKETS_INTERFACE_PORT)
HTTP_INTERFACE = HTTP_INTERFACE.newHttpInterface()
HTTP_INTERFACE.initialize()
- HTTP_INTERFACE.run()
- console.log('Http Interface .............................................. Listening at port ' + global.env.HTTP_INTERFACE_PORT)
+ console.log('Http Interface .............................................. Listening at port ' + global.env.CLIENT_HTTP_INTERFACE_PORT)
console.log('')
console.log("You are running Superalgos Beta 11")
@@ -188,6 +189,6 @@ try {
console.log('')
} catch (err) {
- console.log('[ERROR] Client -> Error = ' + err.stack)
+ console.log('[ERROR] Platform App -> Error = ' + err.stack)
}
diff --git a/UI/.vscode/settings.json b/Platform/UI/.vscode/settings.json
similarity index 100%
rename from UI/.vscode/settings.json
rename to Platform/UI/.vscode/settings.json
diff --git a/UI/Animation.js b/Platform/UI/Animation.js
similarity index 100%
rename from UI/Animation.js
rename to Platform/UI/Animation.js
diff --git a/Platform/UI/AppLoader.js b/Platform/UI/AppLoader.js
new file mode 100644
index 000000000..b17587624
--- /dev/null
+++ b/Platform/UI/AppLoader.js
@@ -0,0 +1,190 @@
+let postLoader
+
+function newAppLoader() {
+ const MODULE_NAME = 'App Loader'
+ const INFO_LOG = false
+ const ERROR_LOG = true
+ const logger = newWebDebugLog()
+
+
+ let thisObject = {
+ loadModules: loadModules
+ }
+
+ return thisObject
+
+ async function loadModules() {
+ try {
+ if (INFO_LOG === true) { logger.write('[INFO] loadModules -> Entering function.') }
+
+ let plotters
+ let modulesArray = []
+
+ plotters = defaultPlotters()
+
+ modulesArray = modulesArray.concat([
+
+ 'Globals.js',
+ 'Workspace.js',
+
+ 'Files/SingleFile.js',
+ 'Files/FileCloud.js',
+ 'Files/MarketFiles.js',
+ 'Files/DailyFiles.js',
+ 'Files/FileCursor.js',
+ 'Files/FileSequence.js',
+ 'Files/FileStorage.js',
+
+ 'EventsServerClient.js',
+
+ 'LegacyPlotter.js',
+ 'PlotterPanel.js',
+
+ 'VideoRecorder.js',
+ 'ProductStorage.js',
+ 'Canvas.js',
+ 'EventHandler.js',
+ 'Frame.js',
+ 'Animation.js',
+ 'Container.js',
+ 'Utilities.js',
+ 'AppPostLoader.js'
+ ])
+
+ modulesArray = modulesArray.concat(plotters)
+
+ functionLibraries()
+
+ function functionLibraries() {
+ let url = 'ListFunctionLibraries'
+ httpRequest(undefined, url, onResponse)
+
+ function onResponse(err, fileList) {
+ let urlArray = []
+ let fileArray = JSON.parse(fileList)
+ for (let i = 0; i < fileArray.length; i++) {
+ let item = fileArray[i]
+
+ project = item[0]
+ fileName = item[1]
+ urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Function-Libraries' + '/' + fileName)
+ }
+
+ modulesArray = modulesArray.concat(urlArray)
+ utilities()
+ }
+ }
+
+ function utilities() {
+ let url = 'ListUtilitiesFiles'
+ httpRequest(undefined, url, onResponse)
+
+ function onResponse(err, fileList) {
+ let urlArray = []
+ let fileArray = JSON.parse(fileList)
+ for (let i = 0; i < fileArray.length; i++) {
+ let item = fileArray[i]
+
+ project = item[0]
+ fileName = item[1]
+ urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Utilities' + '/' + fileName)
+ }
+
+ modulesArray = modulesArray.concat(urlArray)
+ globals()
+ }
+ }
+
+ function globals() {
+ let url = 'ListGlobalFiles'
+ httpRequest(undefined, url, onResponse)
+
+ function onResponse(err, fileList) {
+ let urlArray = []
+ let fileArray = JSON.parse(fileList)
+ for (let i = 0; i < fileArray.length; i++) {
+ let item = fileArray[i]
+
+ project = item[0]
+ fileName = item[1]
+ urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Globals' + '/' + fileName)
+ }
+
+ modulesArray = modulesArray.concat(urlArray)
+ spaces()
+ }
+ }
+
+ function spaces() {
+ let url = 'ListSpaceFiles'
+ httpRequest(undefined, url, onResponse)
+
+ function onResponse(err, fileList) {
+ let urlArray = []
+ let fileArray = JSON.parse(fileList)
+ for (let i = 0; i < fileArray.length; i++) {
+ let path = fileArray[i]
+ urlArray.push('Projects' + '/' + path)
+ }
+
+ modulesArray = modulesArray.concat(urlArray)
+ downloadIncludedFiles()
+ }
+ }
+
+ function downloadIncludedFiles() {
+
+ let downloadedCounter = 0
+
+ for (let i = 0; i < modulesArray.length; i++) {
+ let path = modulesArray[i]
+
+ REQUIREJS([path], onRequired)
+
+ if (INFO_LOG === true) { logger.write('[INFO] loadModules -> Module Requested.') }
+ if (INFO_LOG === true) { logger.write('[INFO] loadModules -> path = ' + path) }
+ if (INFO_LOG === true) { logger.write('[INFO] loadModules -> total requested = ' + (i + 1)) }
+
+ function onRequired(pModule) {
+ try {
+ if (INFO_LOG === true) { logger.write('[INFO] loadModules -> onRequired -> Entering function.') }
+ if (INFO_LOG === true) { logger.write('[INFO] loadModules -> onRequired -> Module Downloaded.') }
+ if (INFO_LOG === true) { logger.write('[INFO] loadModules -> onRequired -> path = ' + path) }
+
+ downloadedCounter++
+
+ if (INFO_LOG === true) { logger.write('[INFO] loadModules -> onRequired -> downloadedCounter = ' + downloadedCounter) }
+
+ if (downloadedCounter === modulesArray.length) {
+ if (INFO_LOG === true) { logger.write('[INFO] loadModules -> onRequired -> Starting Advanced Algos Platform.') }
+ setTimeout(() => {
+ postLoader = newAppPostLoader()
+ postLoader.start()
+ }, 500)
+
+ }
+ } catch (err) {
+ if (ERROR_LOG === true) { logger.write('[ERROR] loadModules -> onRequired -> err = ' + err.stack) }
+ }
+ }
+ }
+ }
+
+ } catch (err) {
+ if (ERROR_LOG === true) { logger.write('[ERROR] loadModules -> err = ' + err.stack) }
+ }
+ }
+
+ function defaultPlotters() {
+ return [
+ 'Plotters/Foundations/Candles/Plotters-Candles-Volumes/Candles.js',
+ 'Plotters/Foundations/Candles/Plotters-Candles-Volumes/CandlePanel.js',
+ 'Plotters/Foundations/Candles/Plotters-Candles-Volumes/Volumes.js',
+ 'Plotters/Foundations/Candles/Plotters-Candles-Volumes/VolumePanel.js',
+ 'Plotters/Foundations/Bollinger/Plotters-Bollinger-Bands/BollingerBands.js',
+ 'Plotters/Foundations/Bollinger/Plotters-Bollinger-Bands/BollingerBandsPanel.js',
+ 'Plotters/Foundations/Bollinger/Plotters-Bollinger-Bands/PercentageBandwidth.js'
+ ]
+ }
+}
+
diff --git a/UI/AppPostLoader.js b/Platform/UI/AppPostLoader.js
similarity index 100%
rename from UI/AppPostLoader.js
rename to Platform/UI/AppPostLoader.js
diff --git a/UI/AppPreLoader.js b/Platform/UI/AppPreLoader.js
similarity index 100%
rename from UI/AppPreLoader.js
rename to Platform/UI/AppPreLoader.js
diff --git a/UI/Canvas.js b/Platform/UI/Canvas.js
similarity index 100%
rename from UI/Canvas.js
rename to Platform/UI/Canvas.js
diff --git a/UI/Container.js b/Platform/UI/Container.js
similarity index 100%
rename from UI/Container.js
rename to Platform/UI/Container.js
diff --git a/UI/Data-Files/src/DailyFiles.js b/Platform/UI/Data-Files/DailyFiles.js
similarity index 100%
rename from UI/Data-Files/src/DailyFiles.js
rename to Platform/UI/Data-Files/DailyFiles.js
diff --git a/UI/Data-Files/src/FileCloud.js b/Platform/UI/Data-Files/FileCloud.js
similarity index 100%
rename from UI/Data-Files/src/FileCloud.js
rename to Platform/UI/Data-Files/FileCloud.js
diff --git a/UI/Data-Files/src/FileCursor.js b/Platform/UI/Data-Files/FileCursor.js
similarity index 100%
rename from UI/Data-Files/src/FileCursor.js
rename to Platform/UI/Data-Files/FileCursor.js
diff --git a/UI/Data-Files/src/FileSequence.js b/Platform/UI/Data-Files/FileSequence.js
similarity index 100%
rename from UI/Data-Files/src/FileSequence.js
rename to Platform/UI/Data-Files/FileSequence.js
diff --git a/UI/Data-Files/src/FileStorage.js b/Platform/UI/Data-Files/FileStorage.js
similarity index 100%
rename from UI/Data-Files/src/FileStorage.js
rename to Platform/UI/Data-Files/FileStorage.js
diff --git a/UI/Data-Files/src/MarketFiles.js b/Platform/UI/Data-Files/MarketFiles.js
similarity index 100%
rename from UI/Data-Files/src/MarketFiles.js
rename to Platform/UI/Data-Files/MarketFiles.js
diff --git a/UI/Data-Files/src/SingleFile.js b/Platform/UI/Data-Files/SingleFile.js
similarity index 100%
rename from UI/Data-Files/src/SingleFile.js
rename to Platform/UI/Data-Files/SingleFile.js
diff --git a/UI/EventHandler.js b/Platform/UI/EventHandler.js
similarity index 100%
rename from UI/EventHandler.js
rename to Platform/UI/EventHandler.js
diff --git a/UI/EventsServerClient.js b/Platform/UI/EventsServerClient.js
similarity index 100%
rename from UI/EventsServerClient.js
rename to Platform/UI/EventsServerClient.js
diff --git a/UI/Frame.js b/Platform/UI/Frame.js
similarity index 100%
rename from UI/Frame.js
rename to Platform/UI/Frame.js
diff --git a/UI/Globals.js b/Platform/UI/Globals.js
similarity index 100%
rename from UI/Globals.js
rename to Platform/UI/Globals.js
diff --git a/UI/ProductStorage.js b/Platform/UI/ProductStorage.js
similarity index 100%
rename from UI/ProductStorage.js
rename to Platform/UI/ProductStorage.js
diff --git a/UI/Utilities.js b/Platform/UI/Utilities.js
similarity index 100%
rename from UI/Utilities.js
rename to Platform/UI/Utilities.js
diff --git a/UI/VideoRecorder.js b/Platform/UI/VideoRecorder.js
similarity index 100%
rename from UI/VideoRecorder.js
rename to Platform/UI/VideoRecorder.js
diff --git a/UI/WebDebugLog.js b/Platform/UI/WebDebugLog.js
similarity index 100%
rename from UI/WebDebugLog.js
rename to Platform/UI/WebDebugLog.js
diff --git a/Platform/WebServer/Fonts/Saira-Condensed.woff2 b/Platform/WebServer/Fonts/Saira-Condensed.woff2
new file mode 100644
index 000000000..8a7ff57d0
Binary files /dev/null and b/Platform/WebServer/Fonts/Saira-Condensed.woff2 differ
diff --git a/Platform/WebServer/Fonts/Saira.woff2 b/Platform/WebServer/Fonts/Saira.woff2
new file mode 100644
index 000000000..5c1b242e1
Binary files /dev/null and b/Platform/WebServer/Fonts/Saira.woff2 differ
diff --git a/Client/WebServer/Fonts/fontawesome-webfont.ttf b/Platform/WebServer/Fonts/fontawesome-webfont.ttf
similarity index 100%
rename from Client/WebServer/Fonts/fontawesome-webfont.ttf
rename to Platform/WebServer/Fonts/fontawesome-webfont.ttf
diff --git a/Client/WebServer/Fonts/fontawesome-webfont.woff b/Platform/WebServer/Fonts/fontawesome-webfont.woff
similarity index 100%
rename from Client/WebServer/Fonts/fontawesome-webfont.woff
rename to Platform/WebServer/Fonts/fontawesome-webfont.woff
diff --git a/Client/WebServer/Fonts/fontawesome-webfont.woff2 b/Platform/WebServer/Fonts/fontawesome-webfont.woff2
similarity index 100%
rename from Client/WebServer/Fonts/fontawesome-webfont.woff2
rename to Platform/WebServer/Fonts/fontawesome-webfont.woff2
diff --git a/Platform/WebServer/Fonts/segoeui.woff b/Platform/WebServer/Fonts/segoeui.woff
new file mode 100644
index 000000000..afe528bc7
Binary files /dev/null and b/Platform/WebServer/Fonts/segoeui.woff differ
diff --git a/Client/WebServer/Images/Languages/CN.png b/Platform/WebServer/Images/Languages/CN.png
similarity index 100%
rename from Client/WebServer/Images/Languages/CN.png
rename to Platform/WebServer/Images/Languages/CN.png
diff --git a/Client/WebServer/Images/Languages/DE.png b/Platform/WebServer/Images/Languages/DE.png
similarity index 100%
rename from Client/WebServer/Images/Languages/DE.png
rename to Platform/WebServer/Images/Languages/DE.png
diff --git a/Client/WebServer/Images/Languages/EN.png b/Platform/WebServer/Images/Languages/EN.png
similarity index 100%
rename from Client/WebServer/Images/Languages/EN.png
rename to Platform/WebServer/Images/Languages/EN.png
diff --git a/Client/WebServer/Images/Languages/ES.png b/Platform/WebServer/Images/Languages/ES.png
similarity index 100%
rename from Client/WebServer/Images/Languages/ES.png
rename to Platform/WebServer/Images/Languages/ES.png
diff --git a/Client/WebServer/Images/Languages/FR.png b/Platform/WebServer/Images/Languages/FR.png
similarity index 100%
rename from Client/WebServer/Images/Languages/FR.png
rename to Platform/WebServer/Images/Languages/FR.png
diff --git a/Client/WebServer/Images/Languages/ID.png b/Platform/WebServer/Images/Languages/ID.png
similarity index 100%
rename from Client/WebServer/Images/Languages/ID.png
rename to Platform/WebServer/Images/Languages/ID.png
diff --git a/Client/WebServer/Images/Languages/IT.png b/Platform/WebServer/Images/Languages/IT.png
similarity index 100%
rename from Client/WebServer/Images/Languages/IT.png
rename to Platform/WebServer/Images/Languages/IT.png
diff --git a/Client/WebServer/Images/Languages/RU.png b/Platform/WebServer/Images/Languages/RU.png
similarity index 100%
rename from Client/WebServer/Images/Languages/RU.png
rename to Platform/WebServer/Images/Languages/RU.png
diff --git a/Client/WebServer/Images/Languages/TR.png b/Platform/WebServer/Images/Languages/TR.png
similarity index 100%
rename from Client/WebServer/Images/Languages/TR.png
rename to Platform/WebServer/Images/Languages/TR.png
diff --git a/Client/WebServer/Images/Tutorial/Gifs/welcome-binanceus.gif b/Platform/WebServer/Images/Tutorial/Gifs/welcome-binanceus.gif
similarity index 100%
rename from Client/WebServer/Images/Tutorial/Gifs/welcome-binanceus.gif
rename to Platform/WebServer/Images/Tutorial/Gifs/welcome-binanceus.gif
diff --git a/Platform/WebServer/Images/favicon.ico b/Platform/WebServer/Images/favicon.ico
new file mode 100644
index 000000000..cd2c5d6af
Binary files /dev/null and b/Platform/WebServer/Images/favicon.ico differ
diff --git a/Client/WebServer/Images/sa-beta10-logo-horiz-dark.png b/Platform/WebServer/Images/sa-beta10-logo-horiz-dark.png
similarity index 100%
rename from Client/WebServer/Images/sa-beta10-logo-horiz-dark.png
rename to Platform/WebServer/Images/sa-beta10-logo-horiz-dark.png
diff --git a/Client/WebServer/Images/sa-beta11-logo-horiz-dark.png b/Platform/WebServer/Images/sa-beta11-logo-horiz-dark.png
similarity index 100%
rename from Client/WebServer/Images/sa-beta11-logo-horiz-dark.png
rename to Platform/WebServer/Images/sa-beta11-logo-horiz-dark.png
diff --git a/Client/WebServer/Images/sa-beta6-logo-horiz-dark.png b/Platform/WebServer/Images/sa-beta6-logo-horiz-dark.png
similarity index 100%
rename from Client/WebServer/Images/sa-beta6-logo-horiz-dark.png
rename to Platform/WebServer/Images/sa-beta6-logo-horiz-dark.png
diff --git a/Client/WebServer/Images/sa-beta7-logo-horiz-dark.png b/Platform/WebServer/Images/sa-beta7-logo-horiz-dark.png
similarity index 100%
rename from Client/WebServer/Images/sa-beta7-logo-horiz-dark.png
rename to Platform/WebServer/Images/sa-beta7-logo-horiz-dark.png
diff --git a/Client/WebServer/Images/sa-beta8-logo-horiz-dark.png b/Platform/WebServer/Images/sa-beta8-logo-horiz-dark.png
similarity index 100%
rename from Client/WebServer/Images/sa-beta8-logo-horiz-dark.png
rename to Platform/WebServer/Images/sa-beta8-logo-horiz-dark.png
diff --git a/Client/WebServer/Images/sa-beta9-logo-horiz-dark.png b/Platform/WebServer/Images/sa-beta9-logo-horiz-dark.png
similarity index 100%
rename from Client/WebServer/Images/sa-beta9-logo-horiz-dark.png
rename to Platform/WebServer/Images/sa-beta9-logo-horiz-dark.png
diff --git a/Client/WebServer/Images/superalgos-header-background.png b/Platform/WebServer/Images/superalgos-header-background.png
similarity index 100%
rename from Client/WebServer/Images/superalgos-header-background.png
rename to Platform/WebServer/Images/superalgos-header-background.png
diff --git a/Client/WebServer/Images/superalgos-logo-for-color-background.png b/Platform/WebServer/Images/superalgos-logo-for-color-background.png
similarity index 100%
rename from Client/WebServer/Images/superalgos-logo-for-color-background.png
rename to Platform/WebServer/Images/superalgos-logo-for-color-background.png
diff --git a/Client/WebServer/Images/superalgos-logo-white.png b/Platform/WebServer/Images/superalgos-logo-white.png
similarity index 100%
rename from Client/WebServer/Images/superalgos-logo-white.png
rename to Platform/WebServer/Images/superalgos-logo-white.png
diff --git a/Client/WebServer/Images/superalgos-logo.png b/Platform/WebServer/Images/superalgos-logo.png
similarity index 100%
rename from Client/WebServer/Images/superalgos-logo.png
rename to Platform/WebServer/Images/superalgos-logo.png
diff --git a/Client/WebServer/Images/superalgos-platform.jpg b/Platform/WebServer/Images/superalgos-platform.jpg
similarity index 100%
rename from Client/WebServer/Images/superalgos-platform.jpg
rename to Platform/WebServer/Images/superalgos-platform.jpg
diff --git a/Client/WebServer/LegacyPlotter.js b/Platform/WebServer/LegacyPlotter.js
similarity index 100%
rename from Client/WebServer/LegacyPlotter.js
rename to Platform/WebServer/LegacyPlotter.js
diff --git a/Client/WebServer/PlotterPanel.js b/Platform/WebServer/PlotterPanel.js
similarity index 100%
rename from Client/WebServer/PlotterPanel.js
rename to Platform/WebServer/PlotterPanel.js
diff --git a/Client/WebServer/css/context-menu.css b/Platform/WebServer/css/context-menu.css
similarity index 100%
rename from Client/WebServer/css/context-menu.css
rename to Platform/WebServer/css/context-menu.css
diff --git a/Client/WebServer/css/credits.css b/Platform/WebServer/css/credits.css
similarity index 100%
rename from Client/WebServer/css/credits.css
rename to Platform/WebServer/css/credits.css
diff --git a/Client/WebServer/css/docs.css b/Platform/WebServer/css/docs.css
similarity index 100%
rename from Client/WebServer/css/docs.css
rename to Platform/WebServer/css/docs.css
diff --git a/Client/WebServer/css/font-awasome.css b/Platform/WebServer/css/font-awasome.css
similarity index 100%
rename from Client/WebServer/css/font-awasome.css
rename to Platform/WebServer/css/font-awasome.css
diff --git a/Client/WebServer/css/governance.css b/Platform/WebServer/css/governance.css
similarity index 100%
rename from Client/WebServer/css/governance.css
rename to Platform/WebServer/css/governance.css
diff --git a/Client/WebServer/css/main.css b/Platform/WebServer/css/main.css
similarity index 100%
rename from Client/WebServer/css/main.css
rename to Platform/WebServer/css/main.css
diff --git a/Client/WebServer/css/prism.css b/Platform/WebServer/css/prism.css
similarity index 100%
rename from Client/WebServer/css/prism.css
rename to Platform/WebServer/css/prism.css
diff --git a/Client/WebServer/css/tutorial.css b/Platform/WebServer/css/tutorial.css
similarity index 100%
rename from Client/WebServer/css/tutorial.css
rename to Platform/WebServer/css/tutorial.css
diff --git a/Client/WebServer/externalScripts/CCapture.all.min.js b/Platform/WebServer/externalScripts/CCapture.all.min.js
similarity index 100%
rename from Client/WebServer/externalScripts/CCapture.all.min.js
rename to Platform/WebServer/externalScripts/CCapture.all.min.js
diff --git a/Client/WebServer/externalScripts/gif.worker.js b/Platform/WebServer/externalScripts/gif.worker.js
similarity index 100%
rename from Client/WebServer/externalScripts/gif.worker.js
rename to Platform/WebServer/externalScripts/gif.worker.js
diff --git a/Client/WebServer/externalScripts/prism.js b/Platform/WebServer/externalScripts/prism.js
similarity index 100%
rename from Client/WebServer/externalScripts/prism.js
rename to Platform/WebServer/externalScripts/prism.js
diff --git a/Client/WebServer/index.html b/Platform/WebServer/index.html
similarity index 98%
rename from Client/WebServer/index.html
rename to Platform/WebServer/index.html
index c8e1dbf2e..663111b2f 100644
--- a/Client/WebServer/index.html
+++ b/Platform/WebServer/index.html
@@ -2,7 +2,7 @@
- Superalgos
+ Superalgos Platform
@@ -18,11 +18,8 @@
-
-
-
-
Once you're back, run the app.update command to get up to date with Develop, restart, and only then may you proceed with this tutorial!",
- "updated": 1630605450785
+ "text": "Go to the footer and switch both the Contributions Branch and the Current Branch to Develop.
Now run the app.update command to get up to date with Develop, restart the Client and UI, and only then may you proceed with this tutorial!",
+ "updated": 1630923957096,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Ve al pie de página y cambia la rama Contrubutions a la Develop. Luego cierra y reinicia la aplicación después del cambio. Una vez que estés de regreso, ejecuta el comando app.update para actualizarse con Develop, reiniciar, ¡y solo entonces podrá continuar con este tutorial!",
+ "updated": 1630870801873,
+ "style": "Callout"
+ }
+ ]
},
{
"style": "Text",
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-003-tutorial-step-are-you-ready.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-003-tutorial-step-are-you-ready.json
index b301bb511..2a2bcc4a9 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-003-tutorial-step-are-you-ready.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-003-tutorial-step-are-you-ready.json
@@ -8,23 +8,55 @@
"icon": {
"name": "Pool\\pools",
"project": "Governance"
- }
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Antes de pasar a la gobernanza, es importante que sepas cómo funciona Superalgos.",
+ "updated": 1630871065288,
+ "style": "Definition"
+ }
+ ]
},
"paragraphs": [
{
"style": "Text",
"text": "We've got a lot of exciting things to talk about, but I want to make sure you can follow along easily.",
- "updated": 1630657385662
+ "updated": 1630657385662,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Tenemos muchas cosas interesantes de las que hablar, pero quiero asegurarme de que pueda seguirlas fácilmente.",
+ "updated": 1630871195572,
+ "style": "Text"
+ }
+ ]
},
{
"style": "Callout",
"text": "Make sure you go through the tutorials in the Getting Started Tutorials Plugin Workspace before continuing if you haven't yet!",
- "updated": 1630598529991
+ "updated": 1630598529991,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Asegúrate de leer los tutoriales en el Getting Started Tutorials Plugin Workspace antes de continuar si aún no lo has hecho!",
+ "updated": 1630872016952,
+ "style": "Callout"
+ }
+ ]
},
{
"style": "Success",
"text": "No need to be an expert, but you will need some general knowledge of the system to understand what this is all about!",
- "updated": 1629720316727
+ "updated": 1629720316727,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "No es necesario ser un experto, pero necesitará algunos conocimientos generales del sistema para comprender de qué se trata.",
+ "updated": 1630872031627,
+ "style": "Success"
+ }
+ ]
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-004-tutorial-step-one-token-to-rule-them-all.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-004-tutorial-step-one-token-to-rule-them-all.json
index 91b07fe3b..619df1b31 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-004-tutorial-step-one-token-to-rule-them-all.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-004-tutorial-step-one-token-to-rule-them-all.json
@@ -8,22 +8,54 @@
"icon": {
"name": "Programs\\staking-program",
"project": "Governance"
- }
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "A diferencia de algunos tokens criptográficos, Superalgos SA Token realmente significa algo.",
+ "updated": 1630872083712,
+ "style": "Definition"
+ }
+ ]
},
"paragraphs": [
{
"style": "Text",
"text": "The SA Token is a BEP20 token on the Binance Smart Chain (BSC). Your token holdings embody your contributions to the Superalgos Project and Community, as the token is used to reward the user base and grow the development pool.",
- "updated": 1630657545503
+ "updated": 1630657545503,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "El SA Token es un token BEP20 en Binance Smart Chain (BSC). Sus existencias de tokens representan sus contribuciones al Superalgos Project y Community, ya que el token se utiliza para recompensar a la base de usuarios y hacer crecer el grupo de desarrollo.",
+ "updated": 1630872813106,
+ "style": "Text"
+ }
+ ]
},
{
"style": "Note",
- "text": "The project distributes tokens exclusively among contributors!"
+ "text": "The project distributes tokens exclusively among contributors!",
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡El proyecto distribuye tokens exclusivamente entre contribuyentes!",
+ "updated": 1630872830278,
+ "style": "Note"
+ }
+ ]
},
{
"style": "Success",
"text": "The more you contribute to the project and help others, the more tokens you will earn!",
- "updated": 1630657555715
+ "updated": 1630657555715,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Cuanto más contribuyas al proyecto y ayudes a otros, más tokens ganarás!",
+ "updated": 1630872874947,
+ "style": "Success"
+ }
+ ]
},
{
"style": "Text",
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-005-tutorial-step-with-tokens-comes-responsibility.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-005-tutorial-step-with-tokens-comes-responsibility.json
index 4de5e9ed6..34014fbc2 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-005-tutorial-step-with-tokens-comes-responsibility.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-005-tutorial-step-with-tokens-comes-responsibility.json
@@ -8,17 +8,41 @@
"icon": {
"name": "governance",
"project": "Governance"
- }
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Tener tokens hace más que mostrar compromiso. Los tokens SA también confieren Token Power!",
+ "updated": 1630873231890,
+ "style": "Definition"
+ }
+ ]
},
"paragraphs": [
{
"style": "Text",
"text": "The more tokens you hold the more influence you can have over the direction of the project. This means, by owning SA Tokens, you hold the power to use those tokens to exert influence over what parts of the system will be developed and how the community will evolve.",
- "updated": 1629165111109
+ "updated": 1629165111109,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Cuantas más fichas tengas, más influencia podrás tener sobre la dirección del proyecto. Esto significa que, al poseer SA Tokens, tienes el poder de usar esos tokens para ejercer influencia sobre qué partes del sistema se desarrollarán y cómo evolucionará la comunidad.",
+ "updated": 1630873381109,
+ "style": "Text"
+ }
+ ]
},
{
"style": "Note",
- "text": "This works in a cycle. The more you contribute, the more tokens you earn, the more say you have!"
+ "text": "This works in a cycle. The more you contribute, the more tokens you earn, the more say you have!",
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Esto funciona en un ciclo. Cuanto más contribuyas, más fichas ganarás, ¡más dirá que tienes!",
+ "updated": 1630873348182,
+ "style": "Note"
+ }
+ ]
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-006-tutorial-step-a-mighty-meritocracy.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-006-tutorial-step-a-mighty-meritocracy.json
index 000726f27..de8d5665a 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-006-tutorial-step-a-mighty-meritocracy.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-006-tutorial-step-a-mighty-meritocracy.json
@@ -8,18 +8,42 @@
"icon": {
"name": "Position\\positions",
"project": "Governance"
- }
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Superalgos no recompensa el aprovechamiento gratuito! Las contribuciones reales al proyecto y a la comunidad son las que se recompensan con tokens y Token Power.",
+ "updated": 1630873417226,
+ "style": "Definition"
+ }
+ ]
},
"paragraphs": [
{
"style": "Text",
"text": "The fancy word for this kind of project governance is meritocracy. In other words, the more you contribute to the improvement of Superalgos and to the support of our Community, the more Token Power and Reputation you earn to influence the future of the project.",
- "updated": 1630605980783
+ "updated": 1630605980783,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "La palabra elegante para este tipo de gobernanza de proyectos es meritocracia. En otras palabras, cuanto más contribuyas a la mejora de Superalgos y al apoyo de nuestra Community, cuanto mas Token Power y Reputation ganas para influir en el futuro del proyecto.",
+ "updated": 1630873470291,
+ "style": "Text"
+ }
+ ]
},
{
"style": "Note",
"text": "This is a collaboration! Only together can we continue to make Superalgos the game changer it is today no matter what the future may bring.",
- "updated": 1629165548280
+ "updated": 1629165548280,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Esta es una colaboración! Solo juntos podemos continuar haciendo de Superalgos el cambio de juego que es hoy, sin importar lo que depare el futuro.",
+ "updated": 1630873528737,
+ "style": "Note"
+ }
+ ]
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-008-tutorial-step-what’s-in-a-profile.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-008-tutorial-step-what’s-in-a-profile.json
index f813f4564..9a3c81213 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-008-tutorial-step-what’s-in-a-profile.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-008-tutorial-step-what’s-in-a-profile.json
@@ -8,18 +8,42 @@
"icon": {
"name": "User\\user-profile",
"project": "Governance"
- }
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Entonces que estamos esperando. ¡Empecemos! Para participar en la gobernanza, necesitarás un User Profile.",
+ "updated": 1630874855704,
+ "style": "Definition"
+ }
+ ]
},
"paragraphs": [
{
"style": "Text",
"text": "Your profile is set up just like the rest of the Superalgos system. It is a hierarchy of nodes. Only this hierarchy defines how you intend to use the Token Power you have earned or is delegated to you by other users. ",
- "updated": 1629165991225
+ "updated": 1629165991225,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Tu perfil está configurado como el resto del sistema Superalgos. Es una jerarquía de nodos. Solo esta jerarquía define cómo pretende utilizar el Token Power que has ganado o que otros usuarios te delegan.",
+ "updated": 1630875440411,
+ "style": "Text"
+ }
+ ]
},
{
"style": "Note",
"text": "By channelling your token power you help decide what parts of the system will be incentivised for further development and who will be rewarded for the community roles they have played.",
- "updated": 1629166027369
+ "updated": 1629166027369,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Al canalizar tu poder simbólico, ayudas a decidir qué partes del sistema se incentivarán para un mayor desarrollo y quiénes serán recompensados por los roles comunitarios que han desempeñado.",
+ "updated": 1630875625415,
+ "style": "Note"
+ }
+ ]
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-009-tutorial-step-program-participation.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-009-tutorial-step-program-participation.json
index 1010dff7c..296a8f616 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-009-tutorial-step-program-participation.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-009-tutorial-step-program-participation.json
@@ -8,22 +8,54 @@
"icon": {
"name": "User\\user-referrer",
"project": "Governance"
- }
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Cómo usas tu Token Power se define dentro de una serie de Governance Programs dentro de la jerarquía de su perfil.",
+ "updated": 1630875913309,
+ "style": "Definition"
+ }
+ ]
},
"paragraphs": [
{
"style": "Text",
"text": "These programs help organize the types of development and community relationships you want to reward.",
- "updated": 1630657777891
+ "updated": 1630657777891,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Estos programas ayudan a organizar los tipos de desarrollo y relaciones comunitarias que deseas recompensar.",
+ "updated": 1630877556436,
+ "style": "Text"
+ }
+ ]
},
{
"style": "Note",
"text": "For instance, the Claims Program lets you present claims for the work you’ve done. While the Support Program lets you thank other Superalgos users that have helped you with technical support. ",
- "updated": 1629166416422
+ "updated": 1629166416422,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Por ejemplo, el Claims Program le permite presentar reclamaciones por el trabajo que ha realizado. Mientras que la Support Program te permite agradecer a otros usuarios de Superalgos que te han ayudado con el soporte técnico.",
+ "updated": 1630878873256,
+ "style": "Note"
+ }
+ ]
},
{
"style": "Text",
- "text": "We’ll cover all these and other programs in detail once you have a working profile!"
+ "text": "We’ll cover all these and other programs in detail once you have a working profile!",
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Cubriremos todos estos y otros programas en detalle una vez que tengas un perfil funcional!",
+ "updated": 1630878930911,
+ "style": "Text"
+ }
+ ]
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-010-tutorial-step-where-it-all-begins.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-010-tutorial-step-where-it-all-begins.json
index d85b6921f..19371f55b 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-010-tutorial-step-where-it-all-begins.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-010-tutorial-step-where-it-all-begins.json
@@ -8,18 +8,42 @@
"icon": {
"name": "governance",
"project": "Governance"
- }
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Aquí estamos a la cabeza de la jerarquía Governance Project. ¡Vamos a crear ese perfil!",
+ "updated": 1630879023647,
+ "style": "Definition"
+ }
+ ]
},
"paragraphs": [
{
"style": "Callout",
"text": "Click the Add Profile Constructor button.",
- "updated": 1630657850442
+ "updated": 1630657850442,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Haz clic en el botón Add Profile Constructor.",
+ "updated": 1630879075072,
+ "style": "Callout"
+ }
+ ]
},
{
"style": "Text",
"text": "Now position the resulting Profile Constructor node where it is easy to see and work with.",
- "updated": 1630657866373
+ "updated": 1630657866373,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Ahora coloque el resultante nodo Profile Constructor donde es fácil de ver y trabajar.",
+ "updated": 1630879137256,
+ "style": "Text"
+ }
+ ]
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-011-tutorial-step-profile-in-a-heartbeat.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-011-tutorial-step-profile-in-a-heartbeat.json
index 84709af6b..ef7c81e5c 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-011-tutorial-step-profile-in-a-heartbeat.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-011-tutorial-step-profile-in-a-heartbeat.json
@@ -8,23 +8,55 @@
"icon": {
"name": "profile-constructor",
"project": "Governance"
- }
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "El Profile Constructor es el dispositivo que utilizarás para configurar tu perfil.",
+ "updated": 1630882802325,
+ "style": "Definition"
+ }
+ ]
},
"paragraphs": [
{
"style": "Text",
"text": "It will create a unique Binance Smart Chain wallet that is connected with your profile: your Governance Address.",
- "updated": 1630657968476
+ "updated": 1630657968476,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Crearás una billetera Binance Smart Chain única que está conectada con tu perfil: tu Governance Address.",
+ "updated": 1630886603829,
+ "style": "Text"
+ }
+ ]
},
{
"style": "Note",
"text": "However, if you already own a BSC wallet you will have the option to link that address instead of creating a new one.",
- "updated": 1629552662270
+ "updated": 1629552662270,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Sin embargo, si ya posees una billetera BSC, tendrás la opción de vincular esa dirección en lugar de crear una nueva.",
+ "updated": 1630886627305,
+ "style": "Note"
+ }
+ ]
},
{
"style": "Text",
"text": "Your Governance Address will allow you to receive the SA Tokens you earn. Superalgos will read the balance of this address to become aware of the number of SA Tokens you hold, and assign your profile an equivalent amount of Token Power.",
- "updated": 1630606362346
+ "updated": 1630606362346,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Tu Governance Address te permitirá recibir los tokens SA que ganes. Superalgos leerá el saldo de esta dirección para conocer la cantidad de Tokens SA que tiene y le asignará a tu perfil una cantidad equivalente de Token Power.",
+ "updated": 1630886677089,
+ "style": "Text"
+ }
+ ]
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-012-tutorial-step-pump-that-heartbeat.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-012-tutorial-step-pump-that-heartbeat.json
index 958154546..757426111 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-012-tutorial-step-pump-that-heartbeat.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-012-tutorial-step-pump-that-heartbeat.json
@@ -8,13 +8,29 @@
"icon": {
"name": "configuration",
"project": "Governance"
- }
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Ahora configuremos el Profile Constructor para que luego podamos construir el perfil.",
+ "updated": 1630887647502,
+ "style": "Definition"
+ }
+ ]
},
"paragraphs": [
{
"style": "Callout",
"text": "Click the configuration option and enter your GitHub username like this:",
- "updated": 1629553104003
+ "updated": 1629553104003,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Has clic en la opción de configuración e ingrese su nombre de usuario de GitHub así:",
+ "updated": 1630888170425,
+ "style": "Callout"
+ }
+ ]
},
{
"style": "Json",
@@ -24,7 +40,15 @@
{
"style": "Text",
"text": "If you want to link an address you already own, type the twelve word mnemonic associated with your address under the mnemonic property. If not, leave the property blank and the system will make a new one for you!",
- "updated": 1629706491511
+ "updated": 1629706491511,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Para vincular una dirección que ya posees, escribe el mnemónico de doce palabras asociado con tu dirección en la propiedad mnemónico. De lo contrario, deja la propiedad en blanco y el sistema creará una nueva.",
+ "updated": 1630888231106,
+ "style": "Text"
+ }
+ ]
},
{
"style": "Text",
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-013-tutorial-step-oh-so-shiny.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-013-tutorial-step-oh-so-shiny.json
index efbbf0908..509c3d408 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-013-tutorial-step-oh-so-shiny.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-013-tutorial-step-oh-so-shiny.json
@@ -8,18 +8,42 @@
"name": "User\\user-profile",
"project": "Governance"
},
- "updated": 1630658421560
+ "updated": 1630658421560,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Estamos casi alli. Ahora has clic enBuild Profile y ve cómo sucede la magia. Así es, ¡acabas de crear tu perfil!",
+ "updated": 1630888309658,
+ "style": "Definition"
+ }
+ ]
},
"paragraphs": [
{
"style": "Text",
"text": "While we didn’t have to break a sweat making your profile, some pretty amazing things happened behind the scenes. ",
- "updated": 1629553522636
+ "updated": 1629553522636,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Si bien no tuvimos que sudar mucho para crear tu perfil, sucedieron algunas cosas asombrosas detrás de escena.",
+ "updated": 1630888348614,
+ "style": "Text"
+ }
+ ]
},
{
"style": "Note",
"text": "The constructor just generated your user profile, and either linked your address or created a unique SA Token Governance Address.",
- "updated": 1630599816232
+ "updated": 1630599816232,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "TEl constructor acaba de generar su perfil de usuario y vinculó su dirección o creó un SA Token Governance Address.",
+ "updated": 1630888438347,
+ "style": "Note"
+ }
+ ]
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-014-tutorial-step-only-you.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-014-tutorial-step-only-you.json
index 8fcd677a2..3731d5394 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-014-tutorial-step-only-you.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-014-tutorial-step-only-you.json
@@ -8,18 +8,42 @@
"icon": {
"name": "User\\user-profile",
"project": "Governance"
- }
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "El Profile Constructor también hizo un trabajo para asegurarse de que solo usted pueda cambiar su perfil.",
+ "updated": 1630888591827,
+ "style": "Definition"
+ }
+ ]
},
"paragraphs": [
{
"style": "Text",
"text": "A cryptographic message with your GitHub.com username has been signed with the private key corresponding to your Governance Address. This message will be stored in your User Profile so that we may authenticate it comes from you once you submit your profile as a plugin to the Governance Project.",
- "updated": 1630658507981
+ "updated": 1630658507981,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Se ha firmado un mensaje criptográfico con tu usuario de GitHub.com con la clave privada correspondiente a tu Governance Address. Este mensaje se almacenará en tu User Profile para que podamos autenticar que proviene de ti una vez que envíes tu perfil como un complemento al Governance Project.",
+ "updated": 1630888665385,
+ "style": "Text"
+ }
+ ]
},
{
"style": "Success",
"text": "What this means is that your profile and its associated token address can only be accessed and changed by you!",
- "updated": 1630606585784
+ "updated": 1630606585784,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Lo que esto significa es que solo tu puedes acceder y modificar su perfil y tu dirección de token asociada.",
+ "updated": 1630888698997,
+ "style": "Success"
+ }
+ ]
},
{
"style": "Text",
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-015-tutorial-step-under-the-hood.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-015-tutorial-step-under-the-hood.json
index 8daf08a1f..cdb077f98 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-015-tutorial-step-under-the-hood.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-015-tutorial-step-under-the-hood.json
@@ -8,18 +8,42 @@
"icon": {
"name": "User\\user-profile",
"project": "Governance"
- }
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Echemos un vistazo más de cerca a la firma criptográfica en tu nuevo perfil.",
+ "updated": 1630888742337,
+ "style": "Definition"
+ }
+ ]
},
"paragraphs": [
{
"style": "Callout",
"text": "Click the configuration option on your User Profile node and take a look at what's inside.",
- "updated": 1629554250933
+ "updated": 1629554250933,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Haz clic en la opción de configuración en tu nodo User Profile y echa un vistazo a lo que hay dentro.",
+ "updated": 1630888787848,
+ "style": "Callout"
+ }
+ ]
},
{
"style": "Note",
"text": "Wow that’s a lot of numbers! Again, this is how the governance system will know that this User Profile belongs to the private key that signed the message, which in turn belongs to the address that will hold the tokens that confer your profile with Token Power.",
- "updated": 1629554289159
+ "updated": 1629554289159,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Vaya, son muchos números! Nuevamente, así es como el sistema de gobernanza sabrá que este User Profile pertenece a la clave privada que firmó el mensaje, que a su vez pertenece a la dirección que albergará los tokens que confieren tu perfil con Token Power.",
+ "updated": 1630888835905,
+ "style": "Note"
+ }
+ ]
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-016-tutorial-step-save-the-key.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-016-tutorial-step-save-the-key.json
deleted file mode 100644
index d871ced66..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-016-tutorial-step-save-the-key.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 16,
- "type": "Tutorial Step - Save the Key!",
- "definition": {
- "text": "Now that you have a new rocking User Profile, let’s talk some more about that private key.",
- "updated": 1630658607513,
- "icon": {
- "name": "Key\\key-reference",
- "project": "Foundations"
- }
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "You need the private key to add your governance address to a crypto wallet. Superalgos generates it locally on your computer. This means that there is no one else in the world that has access, or knowledge, of your key, as long as your machine is secure.",
- "updated": 1629980024465
- },
- {
- "style": "Warning",
- "text": "This is the most important part of this tutorial! You must backup your private key!",
- "updated": 1629578829982
- },
- {
- "style": "Note",
- "text": "If you linked a previously owned address you will not need to save the private key but should back up the contents of the constructor for safety."
- },
- {
- "style": "Text",
- "text": ""
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-017-tutorial-step-backup-the-key.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-017-tutorial-step-backup-the-key.json
new file mode 100644
index 000000000..de4755264
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-017-tutorial-step-backup-the-key.json
@@ -0,0 +1,65 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 17,
+ "type": "Tutorial Step - Backup the Key!",
+ "definition": {
+ "text": "You need the back up the private key so that you may later import your Governance Address in a crypto wallet.",
+ "updated": 1630932770708,
+ "icon": {
+ "name": "Key\\key-reference",
+ "project": "Foundations"
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Ahora que tienes un nuevo User Profile, hablemos un poco más sobre esa clave privada.",
+ "updated": 1630889083782,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "Superalgos generates the private key locally. No one else in the world has access or knowledge of your key, as long as your machine is secure.",
+ "updated": 1630933019771,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Necesitas la clave privada para agregar tu dirección de gobierno a una billetera criptográfica. Superalgos lo genera localmente en tu computadora. Esto significa que no hay nadie más que tenga acceso o conocimiento de su clave, siempre que su máquina sea segura.",
+ "updated": 1630889987656,
+ "style": "Text"
+ }
+ ]
+ },
+ {
+ "style": "Warning",
+ "text": "Some people print several copies of the private key to store each copy in different places. Remember that most cases of lost crypto involve people losing keys, not hacks!",
+ "updated": 1630932986220,
+ "translations": [
+ {
+ "language": "ES",
+ "text": " ¡Debes hacer una copia de seguridad de tu clave privada!",
+ "updated": 1630890021587,
+ "style": "Warning"
+ }
+ ]
+ },
+ {
+ "style": "Note",
+ "text": "If you linked a previously owned address you will not need to save the private key but should back up the contents of the constructor for safety.",
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Al vincular una dirección anterior, no necesitarás guardar la clave privada, pero debes hacer una copia de seguridad del contenido del constructor por seguridad.",
+ "updated": 1630890278006,
+ "style": "Note"
+ }
+ ]
+ },
+ {
+ "style": "Text",
+ "text": ""
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-017-tutorial-step-profile-backup.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-017-tutorial-step-profile-backup.json
deleted file mode 100644
index e64a81188..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-017-tutorial-step-profile-backup.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 17,
- "type": "Tutorial Step - Profile Backup",
- "definition": {
- "text": "Your Superalgos SA Token rewards will go to the address you just generated, so you should safely store the private key that you will use to access the address.",
- "updated": 1630658720175,
- "icon": {
- "name": "Exchange\\exchange-account-asset",
- "project": "Foundations"
- }
- },
- "paragraphs": [
- {
- "style": "Important",
- "text": "Superalgos doesn’t offer a built-in solution to securely back up your private keys. The system generates a BSC address / private key pair and delivers it in the configuration of the Profile Constructor. It is up to you to decide how you are going to handle this sensitive information.",
- "updated": 1630658807597
- },
- {
- "style": "Callout",
- "text": "Access the configuration of the Profile Constructor. Find the address and private key, and back up the information in whatever way you see fit.",
- "updated": 1630600071978
- },
- {
- "style": "Text",
- "text": ""
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-018-tutorial-step-delete-the-constructor.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-018-tutorial-step-delete-the-constructor.json
deleted file mode 100644
index 7cd1a75a1..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-018-tutorial-step-delete-the-constructor.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 18,
- "type": "Tutorial Step - Delete the Constructor",
- "definition": {
- "text": "After you have made sure to back up the contents of the Profile Constructor it's time to clean up shop.",
- "updated": 1629582388020,
- "icon": {
- "name": "Docs\\docs-action-delete-paragraph",
- "project": "Foundations"
- }
- },
- "paragraphs": [
- {
- "style": "Callout",
- "text": "Once you are satisfied with your backup of the private key, delete the Profile Constructor node! ",
- "updated": 1629582405899
- },
- {
- "style": "Warning",
- "text": "It is not safe to store your private key at the Workspace, as you may accidentally submit it to GitHub.com with one of your contributions. Also, remember that workspaces are saved on disk as unencrypted JSON files, with no security whatsoever."
- },
- {
- "style": "Text",
- "text": ""
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-018-tutorial-step-profile-backup.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-018-tutorial-step-profile-backup.json
new file mode 100644
index 000000000..07932b694
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-018-tutorial-step-profile-backup.json
@@ -0,0 +1,53 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 18,
+ "type": "Tutorial Step - Profile Backup",
+ "definition": {
+ "text": "Your Superalgos SA Token rewards will go to the address you just generated, so you should safely store the private key that you will use to access the address.",
+ "updated": 1630658720175,
+ "icon": {
+ "name": "Exchange\\exchange-account-asset",
+ "project": "Foundations"
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Tus Superalgos SA Token irán a la dirección que acabas de generar, debes almacenar de forma segura la clave privada que utilizará para acceder a la dirección.",
+ "updated": 1630891338657,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Important",
+ "text": "Superalgos doesn’t offer a built-in solution to securely back up your private keys. The system generates a BSC address / private key pair and delivers it in the configuration of the Profile Constructor. It is up to you to decide how you are going to handle this sensitive information.",
+ "updated": 1630658807597,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "No ofrecemos una solución integrada para realizar copias de seguridad de tus claves privadas de forma segura. El sistema genera un par de dirección BSC / clave privada y lo entrega en la configuración del Profile Constructor. Depende de ti decidir cómo manejar esta información confidencial.",
+ "updated": 1630890942338,
+ "style": "Important"
+ }
+ ]
+ },
+ {
+ "style": "Callout",
+ "text": "Access the configuration of the Profile Constructor. Find the address and private key, and back up the information in whatever way you see fit.",
+ "updated": 1630600071978,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Accede a la configuración del Profile Constructor. Busca la dirección y la clave privada, y has una copia de seguridad de la información de la forma que consideres conveniente.",
+ "updated": 1630890851074,
+ "style": "Callout"
+ }
+ ]
+ },
+ {
+ "style": "Text",
+ "text": ""
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-019-tutorial-step-delete-the-constructor.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-019-tutorial-step-delete-the-constructor.json
new file mode 100644
index 000000000..a3bb17909
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-019-tutorial-step-delete-the-constructor.json
@@ -0,0 +1,52 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 19,
+ "type": "Tutorial Step - Delete the Constructor",
+ "definition": {
+ "text": "After you have made sure to back up the contents of the Profile Constructor it's time to clean up shop.",
+ "updated": 1629582388020,
+ "icon": {
+ "name": "Docs\\docs-action-delete-paragraph",
+ "project": "Foundations"
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Una vez que te hayas asegurado de hacer una copia de seguridad del contenido del Profile Constructor es hora de limpiar el taller.",
+ "updated": 1630891469094,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Callout",
+ "text": "Once you are satisfied with your backup of the private key, delete the Profile Constructor node! ",
+ "updated": 1629582405899,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Una vez que estés satisfecho con tu copia de seguridad de la clave privada, elimina el nodo Profile Constructor.",
+ "updated": 1630891508439,
+ "style": "Callout"
+ }
+ ]
+ },
+ {
+ "style": "Warning",
+ "text": "It is not safe to store your private key at the Workspace, as you may accidentally submit it to GitHub.com with one of your contributions. Also, remember that workspaces are saved on disk as unencrypted JSON files, with no security whatsoever.",
+ "translations": [
+ {
+ "language": "ES",
+ "text": "No es seguro almacenar tu clave privada en el espacio de trabajo, ya que puedes enviarla accidentalmente a GitHub.com con una de tus contribuciones. Además, recuerda que los espacios de trabajo se guardan en el disco como archivos JSON sin cifrar, sin ningún tipo de seguridad.",
+ "updated": 1630891565910,
+ "style": "Warning"
+ }
+ ]
+ },
+ {
+ "style": "Text",
+ "text": ""
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-019-tutorial-step-program-partners.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-019-tutorial-step-program-partners.json
deleted file mode 100644
index e090b7385..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-019-tutorial-step-program-partners.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 19,
- "type": "Tutorial Step - Program Partners",
- "definition": {
- "text": "You have successfully created your profile! You are now set up to participate in all the various Governance Programs!",
- "updated": 1630606740196,
- "icon": {
- "name": "Programs\\onboarding-programs",
- "project": "Governance"
- }
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "The Onboarding Programs are your first stop into the world of Superalgos governance. So let’s add them to your profile!",
- "updated": 1630600253110
- },
- {
- "style": "Callout",
- "text": "Find the Token Power Switch node under the User Profile node and click Add Onboarding Programs on the menu.",
- "updated": 1630658978533
- },
- {
- "style": "Success",
- "text": "The Onboarding Programs node should pop up as an offspring of the Token Power Switch."
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-020-tutorial-step-drop-it-like-it’s-hot.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-020-tutorial-step-drop-it-like-it’s-hot.json
deleted file mode 100644
index e0643288b..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-020-tutorial-step-drop-it-like-it’s-hot.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 20,
- "type": "Tutorial Step - Drop it like it’s Hot",
- "definition": {
- "text": "Taking part in governance is a valuable contribution! As such the Airdrop Program rewards you with tokens on every release!",
- "updated": 1630606894763,
- "icon": {
- "name": "Programs\\airdrop-program",
- "project": "Governance"
- }
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "We are not a fan of mindless airdrops. However, since you took the time to learn Superalgos and create your User Profile, you deserve a reward!",
- "updated": 1630606981664
- },
- {
- "style": "Callout",
- "text": "On the Onboarding Programs node click Add Airdrop Program.",
- "updated": 1630607006405
- },
- {
- "style": "Success",
- "text": "Just by deploying the program, you are all set to get up to 1,000 SA Tokens at the next Distribution Event and on every other future release provided that you submit your User Profile!",
- "updated": 1630659363719
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-020-tutorial-step-program-partners.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-020-tutorial-step-program-partners.json
new file mode 100644
index 000000000..a7dc000d3
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-020-tutorial-step-program-partners.json
@@ -0,0 +1,61 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 20,
+ "type": "Tutorial Step - Program Partners",
+ "definition": {
+ "text": "You have successfully created your profile! You are now set up to participate in all the various Governance Programs!",
+ "updated": 1630606740196,
+ "icon": {
+ "name": "Programs\\onboarding-programs",
+ "project": "Governance"
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Has creado tu perfil con éxito! Ahora está configurado para participar en todos los Governance Programs.",
+ "updated": 1630891621231,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "The Onboarding Programs are your first stop into the world of Superalgos governance. So let’s add them to your profile!",
+ "updated": 1630600253110,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Los Onboarding Programs son tu primera parada en el mundo de la gobernanza de Superalgos. ¡Así que añádalos a su perfil!",
+ "updated": 1630891657478,
+ "style": "Text"
+ }
+ ]
+ },
+ {
+ "style": "Callout",
+ "text": "Find the Token Power Switch node under the User Profile node and click Add Onboarding Programs on the menu.",
+ "updated": 1630658978533,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Encuentra el nodo Token Power Switch bajo el nodo User Profile y haz clic en Add Onboarding Programs en el menú.",
+ "updated": 1630891743028,
+ "style": "Callout"
+ }
+ ]
+ },
+ {
+ "style": "Success",
+ "text": "The Onboarding Programs node should pop up as an offspring of the Token Power Switch.",
+ "translations": [
+ {
+ "language": "ES",
+ "text": "El nodo Onboarding Programs debería aparecer como una descendencia del Token Power Switch.",
+ "updated": 1630891780832,
+ "style": "Success"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-021-tutorial-step-drop-it-like-it’s-hot.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-021-tutorial-step-drop-it-like-it’s-hot.json
new file mode 100644
index 000000000..717801f01
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-021-tutorial-step-drop-it-like-it’s-hot.json
@@ -0,0 +1,62 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 21,
+ "type": "Tutorial Step - Drop it like it’s Hot",
+ "definition": {
+ "text": "Taking part in governance is a valuable contribution! As such the Airdrop Program rewards you with tokens on every release!",
+ "updated": 1630606894763,
+ "icon": {
+ "name": "Programs\\airdrop-program",
+ "project": "Governance"
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Participar en la gobernanza es una contribución valiosa! ¡El Airdrop Program te recompensa con tokens en cada lanzamiento!",
+ "updated": 1630892035941,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "We are not a fan of mindless airdrops. However, since you took the time to learn Superalgos and create your User Profile, you deserve a reward!",
+ "updated": 1630606981664,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "No somos fanáticos de los lanzamientos aéreos sin sentido. Sin embargo, dado que te tomaste el tiempo para aprender Superalgos y crear tu User Profile, te mereces una recompensa!",
+ "updated": 1630891887084,
+ "style": "Text"
+ }
+ ]
+ },
+ {
+ "style": "Callout",
+ "text": "On the Onboarding Programs node click Add Airdrop Program.",
+ "updated": 1630607006405,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "En el nodo Onboarding Programs has clic en Add Airdrop Program.",
+ "updated": 1630891925798,
+ "style": "Callout"
+ }
+ ]
+ },
+ {
+ "style": "Success",
+ "text": "Just by deploying the program, you are all set to get up to 1,000 SA Tokens at the next Distribution Event and on every other future release provided that you submit your User Profile!",
+ "updated": 1630659363719,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Con solo implementar el programa, estás listo para obtener hasta 1,000 SA Tokens en el próximo Distribution Event y en cualquier otra versión futura, siempre que envíes tu User Profile!",
+ "updated": 1630891979252,
+ "style": "Success"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-021-tutorial-step-github-glory.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-021-tutorial-step-github-glory.json
deleted file mode 100644
index 8bc315db9..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-021-tutorial-step-github-glory.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 21,
- "type": "Tutorial Step - GitHub Glory",
- "definition": {
- "text": "Now, the Github Program rewards you with more tokens for helping developers find Superalgos on Github.com search!",
- "updated": 1630601440266,
- "icon": {
- "name": "Programs\\github-program",
- "project": "Governance"
- }
- },
- "paragraphs": [
- {
- "style": "Callout",
- "text": "Add the Github Program from the menu of the Onboarding Programs node.",
- "updated": 1630601229528
- },
- {
- "style": "Text",
- "text": "There are three things you can help with! Doing all three may land you up to SA 3,000 more!"
- },
- {
- "style": "List",
- "text": "Give a star to the Superalgos repository."
- },
- {
- "style": "List",
- "text": "Fork the Superalgos repository to your Github account — you probably have already!",
- "updated": 1630600687531
- },
- {
- "style": "List",
- "text": "Click the Watch button too!",
- "updated": 1630601314552
- },
- {
- "style": "Link",
- "text": "Go to the Superalgos repo to click the Star and Watch buttons. Make sure you have a fork too!->github.com/Superalgos/Superalgos",
- "updated": 1630601392808
- },
- {
- "style": "Text",
- "text": ""
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-022-tutorial-step-github-glory.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-022-tutorial-step-github-glory.json
new file mode 100644
index 000000000..c66b2199d
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-022-tutorial-step-github-glory.json
@@ -0,0 +1,95 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 22,
+ "type": "Tutorial Step - GitHub Glory",
+ "definition": {
+ "text": "Now, the Github Program rewards you with more tokens for helping developers find Superalgos on Github.com search!",
+ "updated": 1630601440266,
+ "icon": {
+ "name": "Programs\\github-program",
+ "project": "Governance"
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Ahora el Github Program te recompensa con más tokens por ayudar a los desarrolladores a encontrar Superalgos en la búsqueda de Github.com!",
+ "updated": 1630892122507,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Callout",
+ "text": "Add the Github Program from the menu of the Onboarding Programs node.",
+ "updated": 1630601229528,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Añade el Github Program desde el menú de el nodo Onboarding Programs.",
+ "updated": 1630892163878,
+ "style": "Callout"
+ }
+ ]
+ },
+ {
+ "style": "Text",
+ "text": "There are three things you can help with! Doing all three may land you up to SA 3,000 more!",
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Hay tres cosas en las que puede ayudar! ¡Hacer los tres te puede llevar hasta 3000 SA más!",
+ "updated": 1630892190133,
+ "style": "Text"
+ }
+ ]
+ },
+ {
+ "style": "List",
+ "text": "Give a star to the Superalgos repository.",
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Dale una estrella al repositorio de Superalgos.",
+ "updated": 1630892205893,
+ "style": "List"
+ }
+ ]
+ },
+ {
+ "style": "List",
+ "text": "Fork the Superalgos repository to your Github account — you probably have already!",
+ "updated": 1630600687531,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Bifurca el repositorio de Superalgos a tu cuenta de Github, ¡probablemente ya lo hayas hecho!",
+ "updated": 1630892265394,
+ "style": "List"
+ }
+ ]
+ },
+ {
+ "style": "List",
+ "text": "Click the Watch button too!",
+ "updated": 1630601314552,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Haz clic en el botón Watch también!",
+ "updated": 1630892294669,
+ "style": "List"
+ }
+ ]
+ },
+ {
+ "style": "Link",
+ "text": "Go to the Superalgos repo to click the Star and Watch buttons. Make sure you have a fork too!->github.com/Superalgos/Superalgos",
+ "updated": 1630601392808
+ },
+ {
+ "style": "Text",
+ "text": ""
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-022-tutorial-step-how-github-works.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-022-tutorial-step-how-github-works.json
deleted file mode 100644
index 8c3ee0c46..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-022-tutorial-step-how-github-works.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 22,
- "type": "Tutorial Step - How Github Works",
- "definition": {
- "text": "Github.com bumps up the search ranking of projects when they have many stars, forks, and people watching the repository!",
- "updated": 1630659929485,
- "icon": {
- "name": "Programs\\github-program",
- "project": "Governance"
- }
- },
- "paragraphs": [
- {
- "style": "Note",
- "text": "That is why we ask you to help in this manner! By completing those three tasks, you are effectively helping more developers find Superalgos, which is a win for everyone, as the more developers, the faster the project advances!",
- "updated": 1630660356226
- },
- {
- "style": "Text",
- "text": "Now, this is how it works on the side of Superalgos:",
- "updated": 1630659982457
- },
- {
- "style": "List",
- "text": "The system checks the repository and verifies if your Github account has a star, a fork, and/or a watch.",
- "updated": 1630660104845
- },
- {
- "style": "List",
- "text": "There is a cap of SA 1,000 for each of these incentives. This means that you may get up to SA 3,000 if you maximize your participation.",
- "updated": 1630660329237
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-023-tutorial-step-how-github-works.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-023-tutorial-step-how-github-works.json
new file mode 100644
index 000000000..16673017f
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-023-tutorial-step-how-github-works.json
@@ -0,0 +1,75 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 23,
+ "type": "Tutorial Step - How Github Works",
+ "definition": {
+ "text": "Github.com bumps up the search ranking of projects when they have many stars, forks, and people watching the repository!",
+ "updated": 1630659929485,
+ "icon": {
+ "name": "Programs\\github-program",
+ "project": "Governance"
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Github.com aumenta la clasificación de búsqueda de proyectos cuando tienen muchas estrellas, bifurcaciones y personas observando el repositorio!",
+ "updated": 1630892401029,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Note",
+ "text": "That is why we ask you to help in this manner! By completing those three tasks, you are effectively helping more developers find Superalgos, which is a win for everyone, as the more developers, the faster the project advances!",
+ "updated": 1630660356226,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Por eso te pedimos que ayudes de esta manera! Al completar esas tres tareas, está ayudando de manera efectiva a más desarrolladores a encontrar Superalgos, lo cual es una ganancia para todos, ya que mientras más desarrolladores, más rápido avanza el proyecto.",
+ "updated": 1630892425121,
+ "style": "Note"
+ }
+ ]
+ },
+ {
+ "style": "Text",
+ "text": "Now, this is how it works on the side of Superalgos:",
+ "updated": 1630659982457,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Ahora, así es como funciona del lado de Superalgos:",
+ "updated": 1630892460301,
+ "style": "Text"
+ }
+ ]
+ },
+ {
+ "style": "List",
+ "text": "The system checks the repository and verifies if your Github account has a star, a fork, and/or a watch.",
+ "updated": 1630660104845,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Se verifica el repositorio y si tu cuenta de Github tiene una estrella, una bifurcación y/o un reloj.",
+ "updated": 1630892612043,
+ "style": "List"
+ }
+ ]
+ },
+ {
+ "style": "List",
+ "text": "There is a cap of SA 1,000 for each of these incentives. This means that you may get up to SA 3,000 if you maximize your participation.",
+ "updated": 1630660329237,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Hay un límite de 1.000 SA para cada uno de estos incentivos. Puedes obtener hasta SA 3.000.",
+ "updated": 1630892707618,
+ "style": "List"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-023-tutorial-step-save-your-profile.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-023-tutorial-step-save-your-profile.json
deleted file mode 100644
index 7265322fa..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-023-tutorial-step-save-your-profile.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 23,
- "type": "Tutorial Step - Save Your Profile!",
- "definition": {
- "text": "Cool! We've covered the basics! Now you have a working User Profile and are already participating in the first two Governance Programs!",
- "updated": 1630601962359,
- "icon": {
- "name": "backup-entity",
- "project": "Foundations"
- }
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "It's time to save your User Profile! ",
- "updated": 1630603392015
- },
- {
- "style": "Callout",
- "text": "Click Ctrl + Shift + Alt + Key-S to save the Current Workspace."
- },
- {
- "style": "Success",
- "text": "We set your profile to save as a Plugin every time you save the workspace! So that should save your User Profile too! ",
- "updated": 1630603485216
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-024-tutorial-step-low-hanging-fruit.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-024-tutorial-step-low-hanging-fruit.json
deleted file mode 100644
index cbac2e8a5..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-024-tutorial-step-low-hanging-fruit.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 24,
- "type": "Tutorial Step - Low Hanging Fruit",
- "definition": {
- "text": "Now I'll hook you up with the Community Building Programs, which are also quite easy to set up and will earn you more tokens!",
- "updated": 1630660957861,
- "icon": {
- "name": "Programs\\community-building-programs",
- "project": "Governance"
- }
- },
- "paragraphs": [
- {
- "style": "Callout",
- "text": "Go to the Token Power Switch node and select Add Comunity Building Programs from the menu.",
- "updated": 1630661290597
- },
- {
- "style": "Note",
- "text": "Superalgos thrives through contributions and collaboration. We designed these programs to foster a community in which members are always ready to help and give back!",
- "updated": 1630661420122
- },
- {
- "style": "Success",
- "text": "These programs are a bit more elaborate in their workings... you'll love them!",
- "updated": 1630661576265
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-024-tutorial-step-save-your-profile.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-024-tutorial-step-save-your-profile.json
new file mode 100644
index 000000000..1391a9632
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-024-tutorial-step-save-your-profile.json
@@ -0,0 +1,61 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 24,
+ "type": "Tutorial Step - Save Your Profile!",
+ "definition": {
+ "text": "Cool! We've covered the basics! Now you have a working User Profile and are already participating in the first two Governance Programs!",
+ "updated": 1630601962359,
+ "icon": {
+ "name": "backup-entity",
+ "project": "Foundations"
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": " ¡Hemos cubierto los conceptos básicos! ¡Ahora tiene un perfil de usuario en funcionamiento y ya está participando en los dos primeros programas de gobernanza!",
+ "updated": 1630892778890,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "It's time to save your User Profile! ",
+ "updated": 1630603392015,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Es hora de salvar tu User Profile!",
+ "updated": 1630892799650,
+ "style": "Text"
+ }
+ ]
+ },
+ {
+ "style": "Callout",
+ "text": "Click Ctrl + Shift + Alt + Key-S to save the Current Workspace.",
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Clic Ctrl + Shift + Alt + Key-S para salvar el Current Workspace.",
+ "updated": 1630892824874,
+ "style": "Callout"
+ }
+ ]
+ },
+ {
+ "style": "Success",
+ "text": "We set your profile to save as a Plugin every time you save the workspace! So that should save your User Profile too! ",
+ "updated": 1630603485216,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Configuramos tu perfil para que se guarde como un complemento cada vez que guardes el espacio de trabajo! Entonces eso debería salvar tu User Profile también!",
+ "updated": 1630892880261,
+ "style": "Success"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-025-tutorial-step-ill-lay-out-the-basics.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-025-tutorial-step-ill-lay-out-the-basics.json
deleted file mode 100644
index c1dda1c1c..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-025-tutorial-step-ill-lay-out-the-basics.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 25,
- "type": "Tutorial Step - I'll Lay Out the Basics",
- "definition": {
- "text": "All Community Building Programs have two built-in types of incentives: a Tokens Bonus, and Tokens Awarded by the program.",
- "icon": {
- "name": "Programs\\community-building-programs",
- "project": "Governance"
- },
- "updated": 1630664341967
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "In general terms, this is how it works:",
- "updated": 1630664598834
- },
- {
- "style": "List",
- "text": "Tokens Bonus: It's an incentive to participate in the program. You earn these tokens simply by fulfilling the participation rules."
- },
- {
- "style": "List",
- "text": "Tokens Awarded: These programs incentivize desirable behaviors. If you constructively participate in the Community, then you will earn more tokens!",
- "updated": 1630664896700
- },
- {
- "style": "Success",
- "text": "The interesting bit about these programs is that they reward chains of collaborations! Let's explore this concept within the Referral Program!",
- "updated": 1630664769086
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-025-tutorial-step-low-hanging-fruit.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-025-tutorial-step-low-hanging-fruit.json
new file mode 100644
index 000000000..e191558d6
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-025-tutorial-step-low-hanging-fruit.json
@@ -0,0 +1,62 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 25,
+ "type": "Tutorial Step - Low Hanging Fruit",
+ "definition": {
+ "text": "Now I'll hook you up with the Community Building Programs, which are also quite easy to set up and will earn you more tokens!",
+ "updated": 1630660957861,
+ "icon": {
+ "name": "Programs\\community-building-programs",
+ "project": "Governance"
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Ahora te conectaré con el Community Building Programs, que también son bastante fáciles de configurar y te harán ganar más tokens.",
+ "updated": 1630892980021,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Callout",
+ "text": "Go to the Token Power Switch node and select Add Comunity Building Programs from the menu.",
+ "updated": 1630661290597,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Ve a el nodo Token Power Switch y selecciona Add Comunity Building Programs del menú.",
+ "updated": 1630893046476,
+ "style": "Callout"
+ }
+ ]
+ },
+ {
+ "style": "Note",
+ "text": "Superalgos thrives through contributions and collaboration. We designed these programs to foster a community in which members are always ready to help and give back!",
+ "updated": 1630661420122,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Superalgos prospera a través de contribuciones y colaboración. ¡Diseñamos estos programas para fomentar una comunidad en la que los miembros siempre estén listos para ayudar!",
+ "updated": 1630893106465,
+ "style": "Note"
+ }
+ ]
+ },
+ {
+ "style": "Success",
+ "text": "These programs are a bit more elaborate in their workings... you'll love them!",
+ "updated": 1630661576265,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Estos programas son un poco más elaborados en su funcionamiento ... ¡te encantarán!",
+ "updated": 1630893135626,
+ "style": "Success"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-026-tutorial-step-ill-lay-out-the-basics.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-026-tutorial-step-ill-lay-out-the-basics.json
new file mode 100644
index 000000000..6775be41e
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-026-tutorial-step-ill-lay-out-the-basics.json
@@ -0,0 +1,74 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 26,
+ "type": "Tutorial Step - I'll Lay Out the Basics",
+ "definition": {
+ "text": "All Community Building Programs have two built-in types of incentives: a Tokens Bonus, and Tokens Awarded by the program.",
+ "icon": {
+ "name": "Programs\\community-building-programs",
+ "project": "Governance"
+ },
+ "updated": 1630664341967,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Community Building Programs tienen dos tipos de incentivos incorporados: un Tokens Bonus, y Tokens Awarded por el programa.",
+ "updated": 1630893270729,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "In general terms, this is how it works:",
+ "updated": 1630664598834,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "En términos generales, así es como funciona:",
+ "updated": 1630893389941,
+ "style": "Text"
+ }
+ ]
+ },
+ {
+ "style": "List",
+ "text": "Tokens Bonus: It's an incentive to participate in the program. You earn these tokens simply by fulfilling the participation rules.",
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Tokens Bonus: Es un incentivo para participar en el programa. Ganas estos tokens simplemente cumpliendo con las reglas de participación.",
+ "updated": 1630893419741,
+ "style": "List"
+ }
+ ]
+ },
+ {
+ "style": "List",
+ "text": "Tokens Awarded: These programs incentivize desirable behaviors. If you constructively participate in the Community, then you will earn more tokens!",
+ "updated": 1630664896700,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Tokens Awarded: Estos programas incentivan los comportamientos deseables. Si participas de manera constructiva en la comunidad, ¡ganarás más tokens!",
+ "updated": 1630893448980,
+ "style": "List"
+ }
+ ]
+ },
+ {
+ "style": "Success",
+ "text": "The interesting bit about these programs is that they reward chains of collaborations! Let's explore this concept within the Referral Program!",
+ "updated": 1630664769086,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Lo interesante de estos programas es que recompensan cadenas de colaboraciones! Exploremos este concepto dentro del Referral Program!",
+ "updated": 1630893469226,
+ "style": "Success"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-026-tutorial-step-the-referral-program.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-026-tutorial-step-the-referral-program.json
deleted file mode 100644
index 6bbe17202..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-026-tutorial-step-the-referral-program.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 26,
- "type": "Tutorial Step - The Referral Program",
- "definition": {
- "text": "The Referral Program incentivizes the promotion of the project, either by word-of-mouth or “en masse” through articles, social media posts, videos, and other forms of influencer marketing!",
- "updated": 1630665298091,
- "icon": {
- "name": "Programs\\referral-program",
- "project": "Governance"
- }
- },
- "paragraphs": [
- {
- "style": "Callout",
- "text": "Go to the Community Building Programs node and click Add Referral Program.",
- "updated": 1630665425190
- },
- {
- "style": "Text",
- "text": "First, let's clarify what rules you must fulfill to earn your Tokens Bonus!",
- "updated": 1630668604341
- },
- {
- "style": "List",
- "text": "You must deploy the program: Done!",
- "updated": 1630665468816
- },
- {
- "style": "List",
- "text": "You must declare your referrer: We'll do that next!",
- "updated": 1630665632799
- },
- {
- "style": "List",
- "text": "You must drive Token Power to the program: Wooh... token power... sounds neat? You bet!",
- "updated": 1630666285261
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-027-tutorial-step-declare-your-referrers.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-027-tutorial-step-declare-your-referrers.json
deleted file mode 100644
index d5e845b76..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-027-tutorial-step-declare-your-referrers.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 27,
- "type": "Tutorial Step - Declare Your Referrers",
- "definition": {
- "text": "The program is deployed! Now you have to declare your referrer to fulfill the second requirement!",
- "icon": {
- "name": "User\\user-referrer",
- "project": "Governance"
- },
- "updated": 1630669057039
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "Maybe you learned about Superalgos from an article, a video, a comment on Reddit, a tweet, the official website, or someone who told you about us!",
- "updated": 1630669214566
- },
- {
- "style": "Success",
- "text": "Declaring your referrers is the best way to thank the people that may have written that article or tweet, produced that video, maintained the website, or told you about Superalgos!",
- "updated": 1630669976768
- },
- {
- "style": "Text",
- "text": "To declare a referrer, you must establish a reference from the User Referrer node to the User Profile of your referrer! Does your referrer have a User Profile?",
- "updated": 1630681537614
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-027-tutorial-step-the-referral-program.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-027-tutorial-step-the-referral-program.json
new file mode 100644
index 000000000..eb45e1a68
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-027-tutorial-step-the-referral-program.json
@@ -0,0 +1,88 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 27,
+ "type": "Tutorial Step - The Referral Program",
+ "definition": {
+ "text": "The Referral Program incentivizes the promotion of the project, either by word-of-mouth or “en masse” through articles, social media posts, videos, and other forms of influencer marketing!",
+ "updated": 1630665298091,
+ "icon": {
+ "name": "Programs\\referral-program",
+ "project": "Governance"
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "The Referral Program incentiva la promoción del proyecto, ya sea de boca en boca o \"en masa\" a través de artículos, publicaciones en redes sociales, videos y otras formas de marketing de influencia.",
+ "updated": 1630895504666,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Callout",
+ "text": "Go to the Community Building Programs node and click Add Referral Program.",
+ "updated": 1630665425190,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Ve a el nodo Community Building Programs y has clic Add Referral Program.",
+ "updated": 1630895549783,
+ "style": "Callout"
+ }
+ ]
+ },
+ {
+ "style": "Text",
+ "text": "First, let's clarify what rules you must fulfill to earn your Tokens Bonus!",
+ "updated": 1630668604341,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Primero, aclaremos qué reglas debe cumplir para ganar su Tokens Bonus",
+ "updated": 1630895569223,
+ "style": "Text"
+ }
+ ]
+ },
+ {
+ "style": "List",
+ "text": "You must deploy the program: Done!",
+ "updated": 1630665468816,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "You must deploy the program: ¡Hecho!",
+ "updated": 1630895585097,
+ "style": "List"
+ }
+ ]
+ },
+ {
+ "style": "List",
+ "text": "You must declare your referrer: We'll do that next!",
+ "updated": 1630665632799,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "You must declare your referrer: A continuación.",
+ "updated": 1630895663229,
+ "style": "List"
+ }
+ ]
+ },
+ {
+ "style": "List",
+ "text": "You must drive Token Power to the program: Wooh... token power... sounds neat? You bet!",
+ "updated": 1630666285261,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "You must drive Token Power to the program: Wooh .. Token Power... ¿suena genial? ¡Apuesta!",
+ "updated": 1630895638750,
+ "style": "List"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-028-tutorial-step-declare-your-referrers.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-028-tutorial-step-declare-your-referrers.json
new file mode 100644
index 000000000..8945077ed
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-028-tutorial-step-declare-your-referrers.json
@@ -0,0 +1,62 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 28,
+ "type": "Tutorial Step - Declare Your Referrers",
+ "definition": {
+ "text": "The program is deployed! Now you have to declare your referrer to fulfill the second requirement!",
+ "icon": {
+ "name": "User\\user-referrer",
+ "project": "Governance"
+ },
+ "updated": 1630926980041,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡El programa está implementado! ¡Ahora tienes que declarar tu referente para cumplir con el segundo requisito!",
+ "updated": 1630895782489,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "Maybe you learned about Superalgos from an article, a video, a comment on Reddit, a tweet, the official website, or someone who told you about us!",
+ "updated": 1630669214566,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Tal vez aprendiste sobre Superalgos a través de un artículo, un video, un comentario en Reddit, un tweet, el sitio web oficial o alguien que te contó sobre nosotros!",
+ "updated": 1630895800095,
+ "style": "Text"
+ }
+ ]
+ },
+ {
+ "style": "Success",
+ "text": "Declaring your referrers is the best way to thank the people that may have written that article or tweet, produced that video, maintained the website, or told you about Superalgos!",
+ "updated": 1630669976768,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Declarar tus referencias es la mejor manera de agradecer a las personas que pueden haber escrito ese artículo o tweet, producido ese video, mantenido el sitio web o le han contado sobre Superalgos.",
+ "updated": 1630895822840,
+ "style": "Success"
+ }
+ ]
+ },
+ {
+ "style": "Note",
+ "text": "To declare a referrer, you must establish a reference from the User Referrer node to the User Profile of your referrer! This means that a User Profile name is also a referral code!",
+ "updated": 1630926253833,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Para declarar un referente, debe establecer una referencia del nodo User Referrer a el User Profile de tu referente! ¿Su referente tiene un User Profile?",
+ "updated": 1630895923926,
+ "style": "Note"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-028-tutorial-step-load-the-user-profile.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-028-tutorial-step-load-the-user-profile.json
deleted file mode 100644
index fb86ec33a..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-028-tutorial-step-load-the-user-profile.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 28,
- "type": "Tutorial Step - Load the User Profile",
- "definition": {
- "text": "Do you know who your referrer is? Does your referrer have a User Profile? How do you find and load the right profile? Those are all good questions!",
- "updated": 1630678332122,
- "icon": {
- "name": "User\\user-profile",
- "project": "Governance"
- }
- },
- "paragraphs": [
- {
- "style": "Callout",
- "text": "Follow the guide on the right to find the answers!",
- "updated": 1630678762493
- },
- {
- "style": "Note",
- "text": "I brought you to the Dummy profile mentioned in the guide to make it easier for you!",
- "updated": 1630678841266
- },
- {
- "style": "Success",
- "text": "If the question \"who is your referrer\" has no good answer then feel free to declare one of your friends in the Community! By the way, notice that the profiles of Community Mods and Core Team members are loaded already!",
- "updated": 1630679299290
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-029-tutorial-step-reference-the-user-profile.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-029-tutorial-step-reference-the-user-profile.json
deleted file mode 100644
index 72feb1802..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-029-tutorial-step-reference-the-user-profile.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 29,
- "type": "Tutorial Step - Reference the User Profile",
- "definition": {
- "text": "Now that you have the target User Profile on the workspace, all that is left is to establish the reference from your User Referrer node to the User Profile.",
- "icon": {
- "name": "delink-node",
- "project": "Foundations"
- },
- "updated": 1630679894593
- },
- "paragraphs": [
- {
- "style": "Callout",
- "text": "Just in case you're not proficient with references, here's a quick reminder of how references work!",
- "updated": 1630680014393
- },
- {
- "style": "Note",
- "text": "By the way, if you feel like you have more than one referrer, feel free to add User Referrer nodes and set up the references with their profiles!",
- "updated": 1630680189459
- },
- {
- "style": "Success",
- "text": "Once you're done declaring your referrers, keep going with the tutorial!",
- "updated": 1630680219618
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-029-tutorial-step-user-profile-=-referral-code.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-029-tutorial-step-user-profile-=-referral-code.json
new file mode 100644
index 000000000..63bfe7cc0
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-029-tutorial-step-user-profile-=-referral-code.json
@@ -0,0 +1,47 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 29,
+ "type": "Tutorial Step - User Profile = Referral Code",
+ "definition": {
+ "text": "This is important for when you go out there to promote Superalgos! Make sure you let people know how to find you!",
+ "icon": {
+ "name": "copy-type",
+ "project": "Foundations"
+ },
+ "updated": 1630927021542
+ },
+ "paragraphs": [
+ {
+ "style": "Success",
+ "text": "Let me say it again! Let people know your User Profile name so that they may easily find you!",
+ "updated": 1630927535381
+ },
+ {
+ "style": "Text",
+ "text": "What if no specific person referred you to Superalgos? Well... you found us somehow, right? These are a few common scenarios and the profile that referred you:",
+ "updated": 1630927760340
+ },
+ {
+ "style": "List",
+ "text": "The Superalgos.org Webiste: Julian-Molina",
+ "updated": 1630927577105
+ },
+ {
+ "style": "List",
+ "text": "The Github.com Repo: Luis-Fernando-Molina"
+ },
+ {
+ "style": "List",
+ "text": "Most YouTube Videos: Julian-Molina"
+ },
+ {
+ "style": "List",
+ "text": "Blog Articles: Some by Julian-Molina, Luis-Fernando-Molina,... please check the author!",
+ "updated": 1630927812445
+ },
+ {
+ "style": "List",
+ "text": "Official Social Media Posts: Julian-Molina"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-030-tutorial-step-load-the-user-profile.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-030-tutorial-step-load-the-user-profile.json
new file mode 100644
index 000000000..60964b802
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-030-tutorial-step-load-the-user-profile.json
@@ -0,0 +1,62 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 30,
+ "type": "Tutorial Step - Load the User Profile",
+ "definition": {
+ "text": "Do you know who your referrer is? Does your referrer have a User Profile? How do you find and load the right profile?",
+ "updated": 1630928366458,
+ "icon": {
+ "name": "User\\user-profile",
+ "project": "Governance"
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¿Sabes quién es tu referente? ¿Su referente tiene un perfil de usuario? ¿Cómo encuentra y carga el perfil correcto? ¡Todas esas son buenas preguntas!",
+ "updated": 1630896021100,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Callout",
+ "text": "Follow the guide on the right to find the answers!",
+ "updated": 1630678762493,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Siga la guía para encontrar las respuestas!",
+ "updated": 1630896102098,
+ "style": "Callout"
+ }
+ ]
+ },
+ {
+ "style": "Note",
+ "text": "I brought you to the Dummy profile mentioned in the guide to make it easier for you!",
+ "updated": 1630678841266,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Te traje al perfil ficticio mencionado en la guía para que te sea más fácil!",
+ "updated": 1630896053331,
+ "style": "Note"
+ }
+ ]
+ },
+ {
+ "style": "Success",
+ "text": "By the way, notice that the profiles of Community Mods and Core Team members are loaded already!",
+ "updated": 1630925877917,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Si la pregunta \"quién es tu referente\" no tiene una buena respuesta, ¡no dudes en declarar a uno de tus amigos en la comunidad! Por cierto, observa que los perfiles de los miembros de Community Mods y Core Team ya están cargados.",
+ "updated": 1630896089076,
+ "style": "Success"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-030-tutorial-step-referral-token-awards.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-030-tutorial-step-referral-token-awards.json
deleted file mode 100644
index e995bd0c5..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-030-tutorial-step-referral-token-awards.json
+++ /dev/null
@@ -1,39 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 30,
- "type": "Tutorial Step - Referral Token Awards",
- "definition": {
- "text": "Superalgos is a community-run project, not a VC-funded startup! We count on you helping with word-of-mouth marketing!",
- "icon": {
- "name": "tokens-awarded",
- "project": "Governance"
- },
- "updated": 1630681292714
- },
- "paragraphs": [
- {
- "style": "Important",
- "text": "The incentives to bring your friends, colleagues, or your following are significant! Find the short explanation below, and dive into the details on the right if so you wish!",
- "updated": 1630681312671
- },
- {
- "style": "Text",
- "text": "This is the short version of how these programs work:",
- "updated": 1630680801100
- },
- {
- "style": "List",
- "text": "The more people declare you as their referrers, the more tokens you earn on each and every release of the software, indefinitely!",
- "updated": 1630680974311
- },
- {
- "style": "List",
- "text": "If the people you bring to Superalgos bring people too, you earn for those as well, and for those the latter bring, you earn too!",
- "updated": 1630681200103
- },
- {
- "style": "Text",
- "text": ""
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-031-tutorial-step-reference-the-user-profile.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-031-tutorial-step-reference-the-user-profile.json
new file mode 100644
index 000000000..e2c2fbbdc
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-031-tutorial-step-reference-the-user-profile.json
@@ -0,0 +1,62 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 31,
+ "type": "Tutorial Step - Reference the User Profile",
+ "definition": {
+ "text": "Now that you have the target User Profile on the workspace, all that is left is to establish the reference from your User Referrer node to the User Profile.",
+ "icon": {
+ "name": "delink-node",
+ "project": "Foundations"
+ },
+ "updated": 1630679894593,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Ahora que tienes el objetivo User Profile en el espacio de trabajo, todo lo que queda es establecer la referencia de tu nodo User Referrer al User Profile.",
+ "updated": 1630896187960,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Callout",
+ "text": "Just in case you're not proficient with references, here's a quick reminder of how references work!",
+ "updated": 1630680014393,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "En caso de que no seas competente con las referencias, aquí tienes un recordatorio rápido de cómo funcionan las referencias.",
+ "updated": 1630896216270,
+ "style": "Callout"
+ }
+ ]
+ },
+ {
+ "style": "Note",
+ "text": "By the way, if you feel like you have more than one referrer, feel free to add User Referrer nodes and set up the references with their profiles!",
+ "updated": 1630680189459,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Si crees que tiene más de un referente, ¡no dude en agregar nodos de User Referrer y configurar las referencias con tus perfiles!",
+ "updated": 1630896311540,
+ "style": "Note"
+ }
+ ]
+ },
+ {
+ "style": "Success",
+ "text": "Once you're done declaring your referrers, keep going with the tutorial!",
+ "updated": 1630680219618,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Una vez que hayas terminado de declarar tus referencias, ¡continúa con el tutorial!",
+ "updated": 1630896289657,
+ "style": "Success"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-031-tutorial-step-token-power-requirement.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-031-tutorial-step-token-power-requirement.json
deleted file mode 100644
index 06abfbfa8..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-031-tutorial-step-token-power-requirement.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 31,
- "type": "Tutorial Step - Token Power Requirement",
- "definition": {
- "text": "Remember the third requirement to earn your Tokens Bonus? \"You must drive Token Power to the program\". What's that all about?",
- "updated": 1630686739254,
- "icon": {
- "name": "Exchange\\exchange-account-asset",
- "project": "Foundations"
- }
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "We're probably getting in the weeds here, but I'll try to keep it simple!",
- "updated": 1630683871001
- },
- {
- "style": "List",
- "text": "When your Governance Address has some tokens in its balance, then you get the same amount of Token Power in your User Profile."
- },
- {
- "style": "List",
- "text": "Token Power flows down the hierarchy like a river! The amount of Token Power you let into each Governance Program determines how strongly you wish to participate in the program and impacts the Token Rewards you may get from it.",
- "updated": 1630684153086
- },
- {
- "style": "List",
- "text": "By default, Token Power flows in equal amounts to all offspring nodes! You may change this tough!",
- "updated": 1630684072593
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-032-tutorial-step-controlling-flows.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-032-tutorial-step-controlling-flows.json
deleted file mode 100644
index 9354b89a9..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-032-tutorial-step-controlling-flows.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 32,
- "type": "Tutorial Step - Controlling Flows",
- "definition": {
- "text": "The configuration of each node where Token Power may go in acts as a floodgate! That's how you control Token Power Flows!",
- "icon": {
- "name": "Switches\\votes-switch",
- "project": "Governance"
- },
- "updated": 1630687488694
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "Go back to the Onboarding Programs node. Guess what? Those programs do not need Token Power, so we will close the floodgate!",
- "updated": 1630687366643
- },
- {
- "style": "Callout",
- "text": "Copy the below configuration and paste it into the Onboarding Programs node configuration!",
- "updated": 1630687477137
- },
- {
- "style": "Json",
- "text": "{\n \"percentage\": 0\n }",
- "updated": 1630687598132
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-032-tutorial-step-referral-token-awards.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-032-tutorial-step-referral-token-awards.json
new file mode 100644
index 000000000..5efd0a02b
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-032-tutorial-step-referral-token-awards.json
@@ -0,0 +1,79 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 32,
+ "type": "Tutorial Step - Referral Token Awards",
+ "definition": {
+ "text": "Superalgos is a community-run project, not a VC-funded startup! We count on you helping with word-of-mouth marketing!",
+ "icon": {
+ "name": "tokens-awarded",
+ "project": "Governance"
+ },
+ "updated": 1630681292714,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Superalgos es un proyecto administrado por la comunidad, no una startup financiada por VC! ¡Contamos con tu ayuda con el marketing de boca en boca!",
+ "updated": 1630896521389,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Important",
+ "text": "The incentives to bring your friends, colleagues, or your following are significant! Find the short explanation below, and dive into the details on the right if so you wish!",
+ "updated": 1630681312671,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Los incentivos para traer a sus amigos, colegas o sus seguidores son significativos! Encuentre la breve explicación a continuación y sumérjase en los detalles a la derecha si lo desea.",
+ "updated": 1630896616974,
+ "style": "Important"
+ }
+ ]
+ },
+ {
+ "style": "Text",
+ "text": "This is the short version of how these programs work:",
+ "updated": 1630680801100,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Esta es la versión corta de cómo funcionan:",
+ "updated": 1630896948284,
+ "style": "Text"
+ }
+ ]
+ },
+ {
+ "style": "List",
+ "text": "The more people declare you as their referrers, the more tokens you earn on each and every release of the software, indefinitely!",
+ "updated": 1630680974311,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Cuantas más personas te declaren como tus referentes, más tokens ganarás en todas y cada una de las versiones del software, ¡indefinidamente!",
+ "updated": 1630896831390,
+ "style": "List"
+ }
+ ]
+ },
+ {
+ "style": "List",
+ "text": "If the people you bring to Superalgos bring people too, you earn for those as well, and for those the latter bring, you earn too!",
+ "updated": 1630681200103,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Si la gente que traes a Superalgos también trae gente, tú también ganas por ellos, y por los que traen estos últimos, ¡tú también ganas!",
+ "updated": 1630896914087,
+ "style": "List"
+ }
+ ]
+ },
+ {
+ "style": "Text",
+ "text": ""
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-033-tutorial-step-token-power-requirement.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-033-tutorial-step-token-power-requirement.json
new file mode 100644
index 000000000..03c883f2d
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-033-tutorial-step-token-power-requirement.json
@@ -0,0 +1,74 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 33,
+ "type": "Tutorial Step - Token Power Requirement",
+ "definition": {
+ "text": "Remember the third requirement to earn your Tokens Bonus? \"You must drive Token Power to the program\". What's that all about?",
+ "updated": 1630686739254,
+ "icon": {
+ "name": "Exchange\\exchange-account-asset",
+ "project": "Foundations"
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Recuerda el tercer requisito para ganar tu Tokens Bonus, \"Debes llevar Token Power al programa \". ¿De qué se trata todo eso?",
+ "updated": 1630897032249,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "We're probably getting in the weeds here, but I'll try to keep it simple!",
+ "updated": 1630683871001,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Probablemente nos estemos metiendo en la maleza aquí, ¡pero intentaré que sea simple!",
+ "updated": 1630897050223,
+ "style": "Text"
+ }
+ ]
+ },
+ {
+ "style": "List",
+ "text": "When your Governance Address has some tokens in its balance, then you get the same amount of Token Power in your User Profile.",
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Cuando tu Governance Address tiene algunos tokens en su saldo, entonces obtienes la misma cantidad de Token Power en tu User Profile.",
+ "updated": 1630897088486,
+ "style": "List"
+ }
+ ]
+ },
+ {
+ "style": "List",
+ "text": "Token Power flows down the hierarchy like a river! The amount of Token Power you let into each Governance Program determines how strongly you wish to participate in the program and impacts the Token Rewards you may get from it.",
+ "updated": 1630684153086,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Token Power fluye por la jerarquía como un río. La cantidad de Token Power que ingresa en cada Programa de Gobernanza determina la intensidad con la que desea participar en el programa y afecta las Token Rewards que puedes obtener de él.",
+ "updated": 1630897159932,
+ "style": "List"
+ }
+ ]
+ },
+ {
+ "style": "List",
+ "text": "By default, Token Power flows in equal amounts to all offspring nodes! You may change this tough!",
+ "updated": 1630684072593,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Por defecto, Token Power fluye en cantidades iguales a todos los nodos descendientes! ¡Puedes cambiar esto difícil!",
+ "updated": 1630897224172,
+ "style": "List"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-033-tutorial-step-what-token-power.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-033-tutorial-step-what-token-power.json
deleted file mode 100644
index 791e3f167..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-033-tutorial-step-what-token-power.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 33,
- "type": "Tutorial Step - What Token Power?",
- "definition": {
- "text": "If you have no tokens in your Governance Address, then you have zero Token Power! But don't worry! We'll work something out!",
- "updated": 1630687902755,
- "icon": {
- "name": "Exchange\\exchange-account-asset",
- "project": "Foundations"
- }
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "Whether you have any Token Power or not, notice that there is now 0% of Token Power going into the Onboarding Programs and 100% going into the Community Building Programs! Floodgates closed, the flow goes elsewhere! You can play with percentages too!",
- "updated": 1630688907038
- },
- {
- "style": "Important",
- "text": "Now, here's the good news... Because chances are that you have no Token Power to fulfill the third requirement to participate in the Community Building Programs, we are going to delegate some power to all User Profiles in this release! Well take care of that, so forget about it! ",
- "updated": 1630689031351
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-034-tutorial-step-controlling-flows.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-034-tutorial-step-controlling-flows.json
new file mode 100644
index 000000000..8a618af36
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-034-tutorial-step-controlling-flows.json
@@ -0,0 +1,54 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 34,
+ "type": "Tutorial Step - Controlling Flows",
+ "definition": {
+ "text": "The configuration of each node where Token Power may go in acts as a floodgate! That's how you control Token Power Flows!",
+ "icon": {
+ "name": "Switches\\votes-switch",
+ "project": "Governance"
+ },
+ "updated": 1630687488694,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡La configuración de cada nodo donde pueda entrar Token Power actúa como una compuerta! Así es como controlas Token Power Flows!",
+ "updated": 1630897279661,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "Go back to the Onboarding Programs node. Guess what? Those programs do not need Token Power, so we will close the floodgate!",
+ "updated": 1630687366643,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Vuelve al nodo Onboarding Programs. ¿Adivina qué? Esos programas no necesitan Token Power, ¡así que cerraremos la compuerta!",
+ "updated": 1630897321614,
+ "style": "Text"
+ }
+ ]
+ },
+ {
+ "style": "Callout",
+ "text": "Copy the below configuration and paste it into the Onboarding Programs node configuration!",
+ "updated": 1630687477137,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Copie la siguiente configuración y péguela en la configuración del nodo Onboarding Programs.",
+ "updated": 1630897367644,
+ "style": "Callout"
+ }
+ ]
+ },
+ {
+ "style": "Json",
+ "text": "{\n \"percentage\": 0\n }",
+ "updated": 1630687598132
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-034-tutorial-step-support-your-supporters.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-034-tutorial-step-support-your-supporters.json
deleted file mode 100644
index c0f170fa2..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-034-tutorial-step-support-your-supporters.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 34,
- "type": "Tutorial Step - Support Your Supporters",
- "definition": {
- "text": "The Support Program works pretty much like the Referral Program, only that you declare who your favorite Community Mods are!",
- "updated": 1630689246772,
- "icon": {
- "name": "Programs\\support-program",
- "project": "Governance"
- }
- },
- "paragraphs": [
- {
- "style": "Callout",
- "text": "Add the Support Program and use User Supporter nodes to set up references to your favorite moderators! Their profiles are loaded already!",
- "updated": 1630689768928
- },
- {
- "style": "Success",
- "text": "While the Community is always ready to help with typical questions, it takes a certain level of experience and knowledge to provide effective support. This is why select Community Mods are in charge! Participating in this program is the best way to thank the people that selflessly help others!",
- "updated": 1630689962795
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-035-tutorial-step-thank-your-mentors.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-035-tutorial-step-thank-your-mentors.json
deleted file mode 100644
index f1777d3d2..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-035-tutorial-step-thank-your-mentors.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 35,
- "type": "Tutorial Step - Thank Your Mentors",
- "definition": {
- "text": "Mentors are crucial to developing Contributors. They are the people that go the extra mile to help you progress and master Superalgos!",
- "updated": 1630690393118,
- "icon": {
- "name": "Programs\\mentorship-program",
- "project": "Governance"
- }
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "The Mentorship Program is very similar the Support Program, only that your mentors don't need to be moderators. It may be your friend learning Superalgos with you, or any other Community member!",
- "updated": 1630690674482
- },
- {
- "style": "Callout",
- "text": "Deploy the program, and declare your mentors!",
- "updated": 1630690640463
- },
- {
- "style": "Text",
- "text": "Hit Ctrl + Shift + Alt + Key-S when you're done to save your profile! With this you've completed the setup of the main Governance Programs oriented to newcomers! Now it's time to contribute your User Profile to the Superalgos repository!",
- "updated": 1630690916860
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-035-tutorial-step-what-token-power.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-035-tutorial-step-what-token-power.json
new file mode 100644
index 000000000..6e797d2ff
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-035-tutorial-step-what-token-power.json
@@ -0,0 +1,49 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 35,
+ "type": "Tutorial Step - What Token Power?",
+ "definition": {
+ "text": "If you have no tokens in your Governance Address, then you have zero Token Power! But don't worry! We'll work something out!",
+ "updated": 1630687902755,
+ "icon": {
+ "name": "Exchange\\exchange-account-asset",
+ "project": "Foundations"
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Si no tiene tokens en tu Governance Address, entonces tienes cero Token Power!¡Pero no te preocupes! ¡Trabajaremos en algo!",
+ "updated": 1630897494092,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "Whether you have any Token Power or not, notice that there is now 0% of Token Power going into the Onboarding Programs and 100% going into the Community Building Programs! Floodgates closed, the flow goes elsewhere! You can play with percentages too!",
+ "updated": 1630688907038,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Si tienes algun Token Powero no, observe que ahora hay 0% de Token Power entrando en el Onboarding Programs y 100% entrando en el Community Building Programs! ¡Las compuertas cerradas, el flujo va a otra parte! ¡También puedes jugar con porcentajes!",
+ "updated": 1630897759311,
+ "style": "Text"
+ }
+ ]
+ },
+ {
+ "style": "Important",
+ "text": "Now, here's the good news... Because chances are that you have no Token Power to fulfill the third requirement to participate in the Community Building Programs, we are going to delegate some power to all User Profiles in this release! Well take care of that, so forget about it! ",
+ "updated": 1630689031351,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Es probable que no tengas Token Power para cumplir con el tercer requisito para participar en el Community Building Programs, ¡vamos a delegar algo de poder a todos los perfiles de usuario en esta versión!",
+ "updated": 1630897892512,
+ "style": "Important"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-036-tutorial-step-make-it-official.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-036-tutorial-step-make-it-official.json
deleted file mode 100644
index 06e7183b0..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-036-tutorial-step-make-it-official.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 36,
- "type": "Tutorial Step - Make it Official",
- "definition": {
- "text": "Now you're ready to push your new profile to the main Superalgos repository!",
- "updated": 1630607221921,
- "icon": {
- "name": "Programs\\github-program",
- "project": "Governance"
- }
- },
- "paragraphs": [
- {
- "style": "Callout",
- "text": "Hit Ctrl + Shift + Alt + Key-S to save your profile if you haven't yet.
Now, set up you Github API credentials to get ready to contribute your profile!",
- "updated": 1630691166021
- },
- {
- "style": "Warning",
- "text": "If you don't know what I'm talking about, you may need a refresher on how to submit a contribution to Superalgos. Read these few steps taken from the Beyond the Basics Tutorial to remind you what the GitHub authentication process is like. ",
- "updated": 1630691155123
- },
- {
- "style": "Text",
- "text": ""
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-036-tutorial-step-tokens-dont-move.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-036-tutorial-step-tokens-dont-move.json
new file mode 100644
index 000000000..dfa209cb2
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-036-tutorial-step-tokens-dont-move.json
@@ -0,0 +1,25 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 36,
+ "type": "Tutorial Step - Tokens Don't Move",
+ "definition": {
+ "text": "When we talk Token Power Flows, it's important to clarify that tokens don't go anywhere! It's Token Power that flows!",
+ "updated": 1630929455261,
+ "icon": {
+ "name": "stop",
+ "project": "Foundations"
+ }
+ },
+ "paragraphs": [
+ {
+ "style": "Important",
+ "text": "Tokens in your Governance Address never leave your address! There is zero cost for participating in governance! The balance in your address confers Token Power to your User Profile, and it is this abstraction that flows down the hierarchy, not actual tokens.",
+ "updated": 1630929379130
+ },
+ {
+ "style": "Callout",
+ "text": "Remind me to show you how to play with Token Power Flows before we wrap up the tutorial! But let's get back to Community Building Programs before we lose our way!",
+ "updated": 1630933419243
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-037-tutorial-step-support-your-supporters.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-037-tutorial-step-support-your-supporters.json
new file mode 100644
index 000000000..8623ae3b2
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-037-tutorial-step-support-your-supporters.json
@@ -0,0 +1,49 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 37,
+ "type": "Tutorial Step - Support Your Supporters",
+ "definition": {
+ "text": "The Support Program works pretty much like the Referral Program, only that you declare who your favorite Community Mods are!",
+ "updated": 1630689246772,
+ "icon": {
+ "name": "Programs\\support-program",
+ "project": "Governance"
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "El Support Program funciona bastante como el Referral Program, solo que declares quienes son tus favoritos Community Mods.",
+ "updated": 1630898004671,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Callout",
+ "text": "Add the Support Program and use User Supporter nodes to set up references to your favorite moderators! Their profiles are loaded already!",
+ "updated": 1630689768928,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Añade el Support Program and use los nodos User Supporter para configurar referencias a tus moderadores favoritos! ",
+ "updated": 1630898198979,
+ "style": "Callout"
+ }
+ ]
+ },
+ {
+ "style": "Success",
+ "text": "While the Community is always ready to help with typical questions, it takes a certain level of experience and knowledge to provide effective support. This is why select Community Mods are in charge! Participating in this program is the best way to thank the people that selflessly help others!",
+ "updated": 1630689962795,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "La comunidad está lista para ayudar con las preguntas típicas, pero se necesita un cierto nivel de experiencia y conocimiento para brindar un apoyo efectivo. ¡Por esta razón selectos Community Mods están a cargo! ¡Participar en este programa es la mejor manera de agradecer a las personas que ayudan desinteresadamente a los demás!",
+ "updated": 1630898255933,
+ "style": "Success"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-037-tutorial-step-to-infinity-and-beyond.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-037-tutorial-step-to-infinity-and-beyond.json
deleted file mode 100644
index 23366ef16..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-037-tutorial-step-to-infinity-and-beyond.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 37,
- "type": "Tutorial Step - To Infinity and Beyond",
- "definition": {
- "text": "Let's get rolling! We will be using the app.contribute command to submit your profile.",
- "updated": 1630604507310,
- "icon": {
- "name": "User\\user-profile",
- "project": "Governance"
- }
- },
- "paragraphs": [
- {
- "style": "Callout",
- "text": "Copy the command making sure you replace the placeholder with your Github username, paste it in the search box, and click Enter.",
- "updated": 1630604654229
- },
- {
- "style": "Json",
- "text": "app.contribute First submission of User Profile [add your name here]",
- "updated": 1630604551655
- },
- {
- "style": "Text",
- "text": "If everything is set up correctly, you should see a message stating that your pull request has been submitted. This means that your profile has been sent to the main Superalgos repository and will be automatically merged in just a few minutes!",
- "updated": 1630604694599
- },
- {
- "style": "Text",
- "text": ""
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-038-tutorial-step-save-it-once-more.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-038-tutorial-step-save-it-once-more.json
new file mode 100644
index 000000000..6c62a8522
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-038-tutorial-step-save-it-once-more.json
@@ -0,0 +1,54 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 38,
+ "type": "Tutorial Step - Save It Once More!",
+ "definition": {
+ "text": "We're done! This is as far as we'll go before submitting your profile. Now let's make sure you save it before we proceed.",
+ "updated": 1630754177369,
+ "icon": {
+ "name": "backup-entity",
+ "project": "Foundations"
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Terminamos! Hasta aquí llegaremos antes de enviar su perfil. Ahora asegurémonos de guardarlo antes de continuar.",
+ "updated": 1630898310138,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Callout",
+ "text": "Hit Ctrl + Shift + Alt + Key-S to save your User Profile one last time!",
+ "updated": 1630754322739,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Presiona Ctrl + Shift + Alt + Key-S para guardar tu User Profile por última vez!",
+ "updated": 1630898447158,
+ "style": "Callout"
+ }
+ ]
+ },
+ {
+ "style": "Success",
+ "text": "No harm in checking the file saved correctly, right? A file with your Github username and .json extension should exist in the below path!",
+ "updated": 1630754759392,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "No harm in checking the file saved correctly, right? A file with your Github username and.json extension should exist in the below path!",
+ "updated": 1630898402192,
+ "style": "Success"
+ }
+ ]
+ },
+ {
+ "style": "Json",
+ "text": "/Projects/Governance/Plugins/User-Profiles",
+ "updated": 1630754402770
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-038-tutorial-step-welcome-aboard.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-038-tutorial-step-welcome-aboard.json
deleted file mode 100644
index 89168c02c..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-038-tutorial-step-welcome-aboard.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 38,
- "type": "Tutorial Step - Welcome aboard!",
- "definition": {
- "text": "You did it! You are now officially a part of the Superalgos governance community! Now that you have a profile, there are a few important things to do.",
- "updated": 1629984755637,
- "icon": {
- "name": "Announcement\\announcement",
- "project": "Foundations"
- }
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "If you generated a Governance address using the profile constructor then you may want to connect that address to a wallet so that you have control of your tokens.",
- "updated": 1629984765258
- },
- {
- "style": "Note",
- "text": "You will find guides for how to do this under the Building Your Profile topic in the docs.",
- "updated": 1630009326066
- },
- {
- "style": "Text",
- "text": "Not only that, but you will want to begin participating in all of the exciting governance programs available! My friend here will take you through that next step in your governance journey.",
- "updated": 1629585212515
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-039-tutorial-step-thank-your-mentors.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-039-tutorial-step-thank-your-mentors.json
new file mode 100644
index 000000000..21f31e31f
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-039-tutorial-step-thank-your-mentors.json
@@ -0,0 +1,62 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 39,
+ "type": "Tutorial Step - Thank Your Mentors",
+ "definition": {
+ "text": "Mentors are crucial to developing Contributors. They are the people that go the extra mile to help you progress and master Superalgos!",
+ "updated": 1630690393118,
+ "icon": {
+ "name": "Programs\\mentorship-program",
+ "project": "Governance"
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Los mentores son cruciales para desarrollar colaboradores. ¡Son las personas que hacen un esfuerzo adicional para ayudarte a progresar y dominar Superalgos!",
+ "updated": 1630898636401,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "The Mentorship Program is very similar to the Support Program, only that your mentors don't need to be moderators. It may be your friend learning Superalgos with you, or any other Community member!",
+ "updated": 1630929989870,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "El Mentorship Programes muy similar al Support Program, solo que sus mentores no necesitan ser moderadores. ¡Puede ser tu amigo aprendiendo Superalgos contigo, o otro miembro de la comunidad!",
+ "updated": 1630898711625,
+ "style": "Text"
+ }
+ ]
+ },
+ {
+ "style": "Callout",
+ "text": "Deploy the program, and declare your mentors!",
+ "updated": 1630690640463,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Declara a tus mentores!",
+ "updated": 1630898761046,
+ "style": "Callout"
+ }
+ ]
+ },
+ {
+ "style": "Success",
+ "text": "With this you've completed the setup of the main Governance Programs oriented to newcomers! Now it's time to contribute your User Profile to the Superalgos repository!",
+ "updated": 1630754628606,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Con esto, has completado la configuración de la Governance Programs orientado a los recién llegados! ¡Ahora es el momento de contribuir con tu User Profile al repositorio de Superalgos!",
+ "updated": 1630898857914,
+ "style": "Success"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-040-tutorial-step-make-it-official.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-040-tutorial-step-make-it-official.json
new file mode 100644
index 000000000..326af05ab
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-040-tutorial-step-make-it-official.json
@@ -0,0 +1,53 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 40,
+ "type": "Tutorial Step - Make it Official",
+ "definition": {
+ "text": "Now you're ready to push your new profile to the main Superalgos repository!",
+ "updated": 1630607221921,
+ "icon": {
+ "name": "Programs\\github-program",
+ "project": "Governance"
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Ahora está listo para enviar tu nuevo perfil al repositorio principal de Superalgos!",
+ "updated": 1630898921155,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Callout",
+ "text": "Set up you Github API credentials to get ready to contribute your profile!",
+ "updated": 1630754823206,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Configure tus credenciales de API de Github para prepararte para contribuir con tu perfil!",
+ "updated": 1630898955283,
+ "style": "Callout"
+ }
+ ]
+ },
+ {
+ "style": "Warning",
+ "text": "If you don't know what I'm talking about, you may need a refresher on how to submit a contribution to Superalgos. Read these few steps taken from the Beyond the Basics Tutorial to remind you what the GitHub authentication process is like. ",
+ "updated": 1630691155123,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Si no sabe de lo que estoy hablando, es posible que necesites un repaso sobre cómo enviar una contribución a Superalgos. Lee estos pasos tomados del Tutorial Beyond the Basics para recordarte cómo es el proceso de autenticación de GitHub.",
+ "updated": 1630899010292,
+ "style": "Warning"
+ }
+ ]
+ },
+ {
+ "style": "Text",
+ "text": ""
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-041-tutorial-step-to-infinity-and-beyond.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-041-tutorial-step-to-infinity-and-beyond.json
new file mode 100644
index 000000000..7a47d95e1
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-041-tutorial-step-to-infinity-and-beyond.json
@@ -0,0 +1,58 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 41,
+ "type": "Tutorial Step - To Infinity and Beyond",
+ "definition": {
+ "text": "Let's get rolling! We will be using the app.contribute command to submit your profile.",
+ "updated": 1630604507310,
+ "icon": {
+ "name": "User\\user-profile",
+ "project": "Governance"
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Pongamos manos a la obra! Usaremos el comando app.contribute para enviar tu perfil.",
+ "updated": 1630899120379,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Callout",
+ "text": "Copy the command making sure you replace the placeholder with your Github username, paste it in the search box, and click Enter.",
+ "updated": 1630604654229,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Copia el comando reemplazando el marcador de posición con tu nombre de usuario de Github, pégualo en el cuadro de búsqueda y clic en Enter.",
+ "updated": 1630899305591,
+ "style": "Callout"
+ }
+ ]
+ },
+ {
+ "style": "Json",
+ "text": "app.contribute User Profile [add your name]",
+ "updated": 1630751329550
+ },
+ {
+ "style": "Text",
+ "text": "If everything is set up correctly, you should see a message stating that your pull request has been submitted. This means that your profile has been sent to the main Superalgos repository and will be automatically merged within a few hours!",
+ "updated": 1630925481560,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Si todo está configurado correctamente, deberías ver un mensaje que indica que se ha enviado tu solicitud de extracción. ¡Esto significa que su perfil ha sido enviado al repositorio principal de Superalgos y se fusionará automáticamente en solo unos minutos!",
+ "updated": 1630899224657,
+ "style": "Text"
+ }
+ ]
+ },
+ {
+ "style": "Text",
+ "text": ""
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-042-tutorial-step-welcome-aboard.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-042-tutorial-step-welcome-aboard.json
new file mode 100644
index 000000000..759752cee
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-042-tutorial-step-welcome-aboard.json
@@ -0,0 +1,62 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 42,
+ "type": "Tutorial Step - Welcome aboard!",
+ "definition": {
+ "text": "You did it! You are now officially taking part in the governance of Superalgos! So, what's next?",
+ "updated": 1630751721473,
+ "icon": {
+ "name": "Announcement\\announcement",
+ "project": "Foundations"
+ },
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Lo hiciste! ¡Ahora estás participando oficialmente en el gobierno de Superalgos! ¿Qué es lo siguiente?",
+ "updated": 1630899371726,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "If you generated a new Governance Address using the Profile Constructor, you may want to connect it to a software wallet so that you have control of your tokens.",
+ "updated": 1630751845529,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Si generaste un nuevo Governance Address utilizando el Profile Constructor, es posible que desees conectarlo a una billetera de software para que tengas el control de tus tokens.",
+ "updated": 1630899427730,
+ "style": "Text"
+ }
+ ]
+ },
+ {
+ "style": "Callout",
+ "text": "See the \"Import Private Key in a Wallet\" section of this Docs page on the right. It explains how to do that using Trust Wallet. Check it out!",
+ "updated": 1630756159921,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Ve el \"Import Private Key in a Wallet\" sección de esta página de Documentos a la derecha. Explica cómo hacerlo con Trust Wallet. ¡Echale un vistazo!",
+ "updated": 1630899460693,
+ "style": "Callout"
+ }
+ ]
+ },
+ {
+ "style": "Note",
+ "text": "Feel free to use any other wallet that supports BEP20 tokens in the Binance Smart Chain.",
+ "updated": 1630752335924,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Siéntate libre de usar cualquier otra billetera que admita tokens BEP20 en el Binance Smart Chain.",
+ "updated": 1630899484668,
+ "style": "Note"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-043-tutorial-step-deep-governance.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-043-tutorial-step-deep-governance.json
new file mode 100644
index 000000000..6334a7ce4
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-043-tutorial-step-deep-governance.json
@@ -0,0 +1,62 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 43,
+ "type": "Tutorial Step - Deep Governance",
+ "definition": {
+ "text": "Are you ready to go deeper into the Governance rabbit hole? If you're just starting with Superalgos, you don't need to go any further at this point!",
+ "icon": {
+ "name": "governance",
+ "project": "Governance"
+ },
+ "updated": 1630753677065,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¿Estás listo para adentrarte más en la madriguera de la gobernanza? Si recién está comenzando con Superalgos, ¡no necesita ir más lejos ahora!",
+ "updated": 1630899585481,
+ "style": "Definition"
+ }
+ ]
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "However, if you're invested in the project and wish to place some Contribution Claims or cast some votes, then you have some reading to do!",
+ "updated": 1630753559879,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Sin embargo, si has invertido en el proyecto y deseas realizar algunas reclamaciones de contribución o emitir algunos votos, ¡tienes que leer un poco!",
+ "updated": 1630899572852,
+ "style": "Text"
+ }
+ ]
+ },
+ {
+ "style": "Callout",
+ "text": "The Governance Project book on the right takes you deep into all Governance Programs, including those we haven't covered yet!",
+ "updated": 1630753327041,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "The Governance Project el libro de la derecha te lleva a lo más profundo de todo Governance Programs, ¡incluidos los que aún no hemos cubierto!",
+ "updated": 1630899611785,
+ "style": "Callout"
+ }
+ ]
+ },
+ {
+ "style": "Success",
+ "text": "You're on your own from here on! If you have any questions about governance or the token, please join the Token Group in Telegram!",
+ "updated": 1630753481035,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Si tiene alguna pregunta sobre la gobernanza o el token, ¡únte al Token Group en Telegram!",
+ "updated": 1630899662771,
+ "style": "Success"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-044-tutorial-step-playing-with-flows.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-044-tutorial-step-playing-with-flows.json
new file mode 100644
index 000000000..6af3e3190
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-044-tutorial-step-playing-with-flows.json
@@ -0,0 +1,38 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 44,
+ "type": "Tutorial Step - Playing With Flows",
+ "definition": {
+ "text": "Almost forgot! Before you go, I'm gonna give you a crash course so that you may play a bit with some real Token Power!",
+ "updated": 1630930285066,
+ "icon": {
+ "name": "Programs//delegation-program",
+ "project": "Governance"
+ }
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "We're sneaking into the lead developer's User Profile, particularly in his Delegation Program! Your mission: delegate yourself some Token Power so that you can play with the flows within your own profile!",
+ "updated": 1630931293437
+ },
+ {
+ "style": "Callout",
+ "text": "Use the User Delegate node on the right to reference your own User Profile!"
+ },
+ {
+ "style": "List",
+ "text": "You can freely play with other User Profiles.",
+ "updated": 1630931454654
+ },
+ {
+ "style": "List",
+ "text": "Those profiles don't save with the workspace.",
+ "updated": 1630931469032
+ },
+ {
+ "style": "List",
+ "text": "Even if you submitted them to the repo, they would be rejected by our bot controlling that profiles are uploaded by their owners only."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-002-tutorial-step-into-the-thick-of-it.json b/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-002-tutorial-step-into-the-thick-of-it.json
deleted file mode 100644
index 7fa7bc3dc..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-002-tutorial-step-into-the-thick-of-it.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "tutorial": "Governance Program Walk Through Tutorial",
- "pageNumber": 2,
- "type": "Tutorial Step - Into the Thick of It",
- "definition": {
- "text": "Now that you have a working profile, it's time to dive into the real governance of Superalgos!",
- "updated": 1630009993777,
- "icon": {
- "name": "Programs\\financial-programs",
- "project": "Governance"
- }
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "I will walk you through all the main programs and help you get aquainted with the way they work. ",
- "updated": 1630010162848
- },
- {
- "style": "Success",
- "text": "The Governance system is a living part of our collaboration so there will always be something new to check out! ",
- "updated": 1630010228910
- },
- {
- "style": "Text",
- "text": "Each program aims to foster valuable types of user interaction and contribution from mentoring new users to contributing code. So let's dive in!",
- "updated": 1630010267953
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-003-tutorial-step-refer-a-friend.json b/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-003-tutorial-step-refer-a-friend.json
deleted file mode 100644
index 6f89b75fa..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-003-tutorial-step-refer-a-friend.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "tutorial": "Governance Program Walk Through Tutorial",
- "pageNumber": 3,
- "type": "Tutorial Step - Refer a Friend",
- "definition": {
- "text": "Helping people you know find Superalgos is an important way to speed the mass adoption of Superalgos!",
- "icon": {
- "name": "Programs\\referral-program",
- "project": "Governance"
- },
- "updated": 1630011972702
- },
- "paragraphs": [
- {
- "style": "Callout",
- "text": "Read the following Docs page to get an idea of how this program works.",
- "updated": 1630011916068
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-004-tutorial-step-a-thank-you-for-support.json b/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-004-tutorial-step-a-thank-you-for-support.json
deleted file mode 100644
index b614965bd..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-004-tutorial-step-a-thank-you-for-support.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "tutorial": "Governance Program Walk Through Tutorial",
- "pageNumber": 4,
- "type": "Tutorial Step - A Thank You for Support",
- "definition": {
- "text": "Superalgos support is given by other Superalgos users just like you. This program lets you tell them Thank You!",
- "icon": {
- "name": "Programs\\support-program",
- "project": "Governance"
- },
- "updated": 1630012220466
- },
- "paragraphs": [
- {
- "style": "Callout",
- "text": "Read the following Docs page to get an idea of how this program works.",
- "updated": 1630011987218
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-005-tutorial-step-find-a-mentor.json b/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-005-tutorial-step-find-a-mentor.json
deleted file mode 100644
index 68eb2405d..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-005-tutorial-step-find-a-mentor.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "tutorial": "Governance Program Walk Through Tutorial",
- "pageNumber": 5,
- "type": "Tutorial Step - Find a Mentor",
- "definition": {
- "text": "Mentoring users is an important part of strengthening the community!",
- "icon": {
- "name": "Programs\\mentorship-program",
- "project": "Governance"
- },
- "updated": 1630012185029
- },
- "paragraphs": [
- {
- "style": "Callout",
- "text": "Read the following Docs page to get an idea of how this program works.",
- "updated": 1630011996028
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-006-tutorial-step-claim-some-contributions.json b/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-006-tutorial-step-claim-some-contributions.json
deleted file mode 100644
index 24b358eed..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-006-tutorial-step-claim-some-contributions.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "tutorial": "Governance Program Walk Through Tutorial",
- "pageNumber": 6,
- "type": "Tutorial Step - Claim some Contributions",
- "definition": {
- "text": "You are in charge of claiming the work you have put in to Superalgos.",
- "icon": {
- "name": "Programs\\claims-program",
- "project": "Governance"
- },
- "updated": 1630012157111
- },
- "paragraphs": [
- {
- "style": "Callout",
- "text": "Read the following Docs page to get an idea of how this program works.",
- "updated": 1630012004228
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-007-tutorial-step-lend-a-vote.json b/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-007-tutorial-step-lend-a-vote.json
deleted file mode 100644
index f039955f5..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-007-tutorial-step-lend-a-vote.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "tutorial": "Governance Program Walk Through Tutorial",
- "pageNumber": 7,
- "type": "Tutorial Step - Lend a Vote",
- "definition": {
- "text": "Each user helps decide how tokens will distributed.",
- "icon": {
- "name": "Programs\\voting-program",
- "project": "Governance"
- },
- "updated": 1630012134952
- },
- "paragraphs": [
- {
- "style": "Callout",
- "text": "Read the following Docs page to get an idea of how this program works.",
- "updated": 1630012013221
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-008-tutorial-step-delegate-some-power.json b/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-008-tutorial-step-delegate-some-power.json
deleted file mode 100644
index 5f89938e1..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-008-tutorial-step-delegate-some-power.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "tutorial": "Governance Program Walk Through Tutorial",
- "pageNumber": 8,
- "type": "Tutorial Step - Delegate some Power",
- "definition": {
- "text": "Helping new users join in governance is the ultimate act of open collaboration!",
- "icon": {
- "name": "Programs\\delegation-program",
- "project": "Governance"
- },
- "updated": 1630012095620
- },
- "paragraphs": [
- {
- "style": "Callout",
- "text": "Read the following Docs page to get an idea of how this program works.",
- "updated": 1630012020882
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-009-tutorial-step-stake-some-tokens.json b/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-009-tutorial-step-stake-some-tokens.json
deleted file mode 100644
index 620d1c307..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/G/Governance/Governance-Program-Walk-Through-Tutorial/governance-program-walk-through-tutorial-009-tutorial-step-stake-some-tokens.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "tutorial": "Governance Program Walk Through Tutorial",
- "pageNumber": 9,
- "type": "Tutorial Step - Stake some Tokens",
- "definition": {
- "text": "If you want to put some tokens to work without doing anything you can simply stake them.",
- "icon": {
- "name": "Programs\\staking-program",
- "project": "Governance"
- },
- "updated": 1630012064453
- },
- "paragraphs": [
- {
- "style": "Callout",
- "text": "Read the following Docs page to get an idea of how this program works.",
- "updated": 1630012030833
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/UI/Spaces/Reports-Space/Footer.js b/Projects/Governance/UI/Spaces/Reports-Space/Footer.js
index f6ec9335b..2c4cfae3b 100644
--- a/Projects/Governance/UI/Spaces/Reports-Space/Footer.js
+++ b/Projects/Governance/UI/Spaces/Reports-Space/Footer.js
@@ -24,131 +24,13 @@ function newGovernanceReportsFooter() {
// Buttons Section
HTML = HTML + ''
-
- // GitHub Section
-
- HTML = HTML + ''
-
- HTML = HTML + '' // Container Ends
diff --git a/Projects/ProjectsSchema.json b/Projects/ProjectsSchema.json
index 6cc52d73f..2b8ea0bb8 100644
--- a/Projects/ProjectsSchema.json
+++ b/Projects/ProjectsSchema.json
@@ -894,6 +894,30 @@
"propertyName": "plugins",
"functionName": "newFoundationsUtilitiesPlugins",
"fileName": "Plugins.js"
+ },
+ {
+ "name": "Miscellaneous Functions",
+ "propertyName": "miscellaneousFunctions",
+ "functionName": "newFoundationsUtilitiesMiscellaneousFunctions",
+ "fileName": "MiscellaneousFunctions.js"
+ },
+ {
+ "name": "Files And Directories",
+ "propertyName": "filesAndDirectories",
+ "functionName": "newFoundationsUtilitiesFilesAndDirectories",
+ "fileName": "FilesAndDirectories.js"
+ },
+ {
+ "name": "Http Responses",
+ "propertyName": "httpResponses",
+ "functionName": "newFoundationsUtilitiesHttpResponses",
+ "fileName": "HttpResponses.js"
+ },
+ {
+ "name": "Http Requests",
+ "propertyName": "httpRequests",
+ "functionName": "newFoundationsUtilitiesHttpRequests",
+ "fileName": "HttpRequests.js"
}
]
},
@@ -1439,6 +1463,12 @@
"propertyName": "queryTypes",
"functionName": "newSocialTradingGlobalsQueryTypes",
"fileName": "QueryTypes.js"
+ },
+ {
+ "name": "Event Types",
+ "propertyName": "eventTypes",
+ "functionName": "newSocialTradingGlobalsEventTypes",
+ "fileName": "EventTypes.js"
}
]
}
diff --git a/Projects/Social-Trading/NT/Modules/ClientInterface.js b/Projects/Social-Trading/NT/Modules/ClientInterface.js
index b74c0b675..16a1f1978 100644
--- a/Projects/Social-Trading/NT/Modules/ClientInterface.js
+++ b/Projects/Social-Trading/NT/Modules/ClientInterface.js
@@ -123,7 +123,7 @@ exports.newSocialTradingModulesClientInterface = function newSocialTradingModule
let response = {
result: 'Ok',
- message: 'Client Interface Event Processed.'
+ message: 'Client Interface Event Processed.'
}
return response
@@ -132,9 +132,11 @@ exports.newSocialTradingModulesClientInterface = function newSocialTradingModule
Any exception that happens while trying to change the state of the Social Graph,
will be returned to the caller without doing anything else here.
*/
+ let errorMessage = err.message
+ if (errorMessage === undefined) { errorMessage = err }
let response = {
result: 'Error',
- message: 'Client Interface ' + err.message
+ message: 'Client Interface ' + errorMessage
}
return response
}
@@ -191,21 +193,23 @@ exports.newSocialTradingModulesClientInterface = function newSocialTradingModule
try {
let query = NT.projects.socialTrading.modules.query.newSocialTradingModulesQuery()
query.initialize(queryReceived)
-
+
let response = {
result: 'Ok',
message: 'Client Interface Query Processed.',
data: query.execute()
}
return response
-
+
} catch (err) {
/*
Any exception that happens while trying to execute the query.
*/
+ let errorMessage = err.message
+ if (errorMessage === undefined) { errorMessage = err }
let response = {
result: 'Error',
- message: err.message
+ message: 'Client Interface ' + errorMessage
}
return response
}
diff --git a/Projects/Social-Trading/NT/Modules/Event.js b/Projects/Social-Trading/NT/Modules/Event.js
index bd39bcb81..7db74847a 100644
--- a/Projects/Social-Trading/NT/Modules/Event.js
+++ b/Projects/Social-Trading/NT/Modules/Event.js
@@ -29,46 +29,6 @@ exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() {
finalize: finalize
}
- const EVENT_TYPES = {
- /* Users Posts and Following Events */
- NEW_USER_POST: 10,
- REPLY_TO_USER_POST: 11,
- REPOST_USER_POST: 12,
- QUOTE_REPOST_USER_POST: 13,
- REMOVE_USER_POST: 14,
- FOLLOW_USER_PROFILE: 15,
- UNFOLLOW_USER_PROFILE: 16,
- /* Bots Posts and Following Events */
- NEW_BOT_POST: 20,
- REPLY_TO_BOT_POST: 21,
- REPOST_BOT_POST: 22,
- QUOTE_REPOST_BOT_POST: 23,
- REMOVE_BOT_POST: 24,
- FOLLOW_BOT_PROFILE: 25,
- UNFOLLOW_BOT_PROFILE: 26,
- /* Bots Management Events */
- ADD_BOT: 50,
- REMOVE_BOT: 51,
- ENABLE_BOT: 52,
- DISABLE_BOT: 53,
- /* Add Reaction to Posts Events */
- ADD_REACTION_LIKE: 100,
- ADD_REACTION_LOVE: 101,
- ADD_REACTION_HAHA: 102,
- ADD_REACTION_WOW: 103,
- ADD_REACTION_SAD: 104,
- ADD_REACTION_ANGRY: 105,
- ADD_REACTION_CARE: 106,
- /* Remove Reaction to Posts Events */
- REMOVE_REACTION_LIKE: 200,
- REMOVE_REACTION_LOVE: 201,
- REMOVE_REACTION_HAHA: 202,
- REMOVE_REACTION_WOW: 203,
- REMOVE_REACTION_SAD: 204,
- REMOVE_REACTION_ANGRY: 205,
- REMOVE_REACTION_CARE: 206
- }
-
return thisObject
function finalize() {
@@ -101,7 +61,7 @@ exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() {
/*
Validate Emitter User Profile.
*/
- if (emitterUserProfileId === undefined) {
+ if (thisObject.emitterUserProfileId === undefined) {
throw ('Emitter User Profile Id Not Provided.')
}
emitterUserProfile = NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_ID.get(thisObject.emitterUserProfileId)
@@ -120,8 +80,8 @@ exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() {
/*
Validate Emitter Bot Profile.
*/
- if (emitterBotProfileId !== undefined) {
- emitterBotProfile = emitterUserProfile.bots.get(emitterBotProfileId)
+ if (thisObject.emitterBotProfileId !== undefined) {
+ emitterBotProfile = emitterUserProfile.bots.get(thisObject.emitterBotProfileId)
if (emitterBotProfile === undefined) {
throw ('Emitter Bot Profile Not Found.')
}
@@ -129,41 +89,52 @@ exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() {
/*
Validate Target Bot Profile.
*/
- if (targetBotProfileId !== undefined) {
- targetBotProfile = emitterUserProfile.bots.get(targetBotProfileId)
+ if (thisObject.targetBotProfileId !== undefined) {
+ targetBotProfile = emitterUserProfile.bots.get(thisObject.targetBotProfileId)
if (targetBotProfile === undefined) {
throw ('Target Bot Profile Not Found.')
}
}
- postingEvents()
- followingEvents()
- reactionEvents()
- botEvents()
- eventCounters()
+ if (postingEvents()) {
+ eventCounters()
+ return
+ }
+ if (followingEvents()) {
+ eventCounters()
+ return
+ }
+ if (reactionEvents()) {
+ eventCounters()
+ return
+ }
+ if (botEvents()) {
+ eventCounters()
+ return
+ }
function postingEvents() {
/*
Is is related to Posting?
*/
if (
- thisObject.eventType === EVENT_TYPES.NEW_USER_POST ||
- thisObject.eventType === EVENT_TYPES.REPLY_TO_USER_POST ||
- thisObject.eventType === EVENT_TYPES.REPOST_USER_POST ||
- thisObject.eventType === EVENT_TYPES.QUOTE_REPOST_USER_POST ||
- thisObject.eventType === EVENT_TYPES.NEW_BOT_POST ||
- thisObject.eventType === EVENT_TYPES.REPLY_TO_BOT_POST ||
- thisObject.eventType === EVENT_TYPES.REPOST_BOT_POST ||
- thisObject.eventType === EVENT_TYPES.QUOTE_REPOST_BOT_POST
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.NEW_USER_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REPLY_TO_USER_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REPOST_USER_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.QUOTE_REPOST_USER_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.NEW_BOT_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REPLY_TO_BOT_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REPOST_BOT_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.QUOTE_REPOST_BOT_POST
) {
/*
New User Post
*/
if (
- thisObject.eventType === EVENT_TYPES.NEW_USER_POST ||
- thisObject.eventType === EVENT_TYPES.REPLY_TO_USER_POST ||
- thisObject.eventType === EVENT_TYPES.REPOST_USER_POST ||
- thisObject.eventType === EVENT_TYPES.QUOTE_REPOST_USER_POST
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.NEW_USER_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REPLY_TO_USER_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REPOST_USER_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.QUOTE_REPOST_USER_POST
) {
emitterUserProfile.addPost(
thisObject.emitterUserProfileId,
@@ -175,16 +146,16 @@ exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() {
thisObject.eventType - 10,
thisObject.timestamp
)
- return
+ return true
}
/*
New Bot Post
*/
if (
- thisObject.eventType === EVENT_TYPES.NEW_BOT_POST ||
- thisObject.eventType === EVENT_TYPES.REPLY_TO_BOT_POST ||
- thisObject.eventType === EVENT_TYPES.REPOST_BOT_POST ||
- thisObject.eventType === EVENT_TYPES.QUOTE_REPOST_BOT_POST
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.NEW_BOT_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REPLY_TO_BOT_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REPOST_BOT_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.QUOTE_REPOST_BOT_POST
) {
if (emitterBotProfile === undefined) {
throw ('Emitter Bot Profile Id Not Provided.')
@@ -200,24 +171,24 @@ exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() {
thisObject.eventType - 20,
thisObject.timestamp
)
- return
+ return true
}
/*
Remove User Post
*/
if (
- thisObject.eventType === EVENT_TYPES.REMOVE_USER_POST
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REMOVE_USER_POST
) {
emitterUserProfile.removePost(
thisObject.emitterPostHash
)
- return
+ return true
}
/*
Remove Bot Post
*/
if (
- thisObject.eventType === EVENT_TYPES.REMOVE_BOT_POST
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REMOVE_BOT_POST
) {
if (emitterBotProfile === undefined) {
throw ('Emitter Bot Profile Id Not Provided.')
@@ -226,7 +197,7 @@ exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() {
emitterBotProfile.removePost(
thisObject.emitterPostHash
)
- return
+ return true
}
}
}
@@ -236,13 +207,13 @@ exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() {
Is is a following?
*/
if (
- thisObject.eventType === EVENT_TYPES.FOLLOW_USER_PROFILE ||
- thisObject.eventType === EVENT_TYPES.UNFOLLOW_USER_PROFILE ||
- thisObject.eventType === EVENT_TYPES.FOLLOW_BOT_PROFILE ||
- thisObject.eventType === EVENT_TYPES.UNFOLLOW_BOT_PROFILE
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.FOLLOW_USER_PROFILE ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.UNFOLLOW_USER_PROFILE ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.FOLLOW_BOT_PROFILE ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.UNFOLLOW_BOT_PROFILE
) {
switch (thisObject.eventType) {
- case EVENT_TYPES.FOLLOW_USER_PROFILE: {
+ case SA.projects.socialTrading.globals.eventTypes.FOLLOW_USER_PROFILE: {
if (thisObject.emitterUserProfileId === undefined) {
throw ('Emitter User Profile Id Not Provided.')
@@ -253,14 +224,14 @@ exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() {
}
emitterUserProfile.addFollowing(
- targetUserProfileId
+ thisObject.targetUserProfileId
)
targetUserProfile.addFollower(
- emitterUserProfileId
+ thisObject.emitterUserProfileId
)
break
}
- case EVENT_TYPES.UNFOLLOW_USER_PROFILE: {
+ case SA.projects.socialTrading.globals.eventTypes.UNFOLLOW_USER_PROFILE: {
if (thisObject.emitterUserProfileId === undefined) {
throw ('Emitter User Profile Id Not Provided.')
@@ -271,14 +242,14 @@ exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() {
}
emitterUserProfile.removeFollowing(
- targetUserProfileId
+ thisObject.targetUserProfileId
)
targetUserProfile.removeFollower(
- emitterUserProfileId
+ thisObject.emitterUserProfileId
)
break
}
- case EVENT_TYPES.FOLLOW_BOT_PROFILE: {
+ case SA.projects.socialTrading.globals.eventTypes.FOLLOW_BOT_PROFILE: {
if (thisObject.emitterBotProfileId === undefined) {
throw ('Emitter Bot Profile Id Not Provided.')
@@ -289,16 +260,16 @@ exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() {
}
emitterBotProfile.addFollowing(
- targetUserProfileId,
- targetBotProfileId
+ thisObject.targetUserProfileId,
+ thisObject.targetBotProfileId
)
targetBotProfile.addFollower(
- emitterUserProfileId,
- emitterBotProfileId
+ thisObject.emitterUserProfileId,
+ thisObject.emitterBotProfileId
)
break
}
- case EVENT_TYPES.UNFOLLOW_BOT_PROFILE: {
+ case SA.projects.socialTrading.globals.eventTypes.UNFOLLOW_BOT_PROFILE: {
if (thisObject.emitterBotProfileId === undefined) {
throw ('Emitter Bot Profile Id Not Provided.')
@@ -309,15 +280,15 @@ exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() {
}
emitterBotProfile.removeFollowing(
- targetBotProfileId
+ thisObject.targetBotProfileId
)
targetBotProfile.removeFollower(
- emitterBotProfileId
+ thisObject.emitterBotProfileId
)
break
}
}
- return
+ return true
}
}
@@ -327,39 +298,51 @@ exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() {
*/
let targetPost
- if (targetBotProfile !== undefined) {
- targetPost = targetBotProfile.posts.get(thisObject.targetPostHash)
- } else {
- targetPost = targetUserProfile.posts.get(thisObject.targetPostHash)
- }
-
- if (targetPost === undefined) {
- throw ('Target Post Not Found')
- }
-
if (
- thisObject.eventType === EVENT_TYPES.ADD_REACTION_LIKE ||
- thisObject.eventType === EVENT_TYPES.ADD_REACTION_LOVE ||
- thisObject.eventType === EVENT_TYPES.ADD_REACTION_HAHA ||
- thisObject.eventType === EVENT_TYPES.ADD_REACTION_WOW ||
- thisObject.eventType === EVENT_TYPES.ADD_REACTION_SAD ||
- thisObject.eventType === EVENT_TYPES.ADD_REACTION_ANGRY ||
- thisObject.eventType === EVENT_TYPES.ADD_REACTION_CARE
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.ADD_REACTION_LIKE ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.ADD_REACTION_LOVE ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.ADD_REACTION_HAHA ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.ADD_REACTION_WOW ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.ADD_REACTION_SAD ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.ADD_REACTION_ANGRY ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.ADD_REACTION_CARE
) {
+
+ if (targetBotProfile !== undefined) {
+ targetPost = targetBotProfile.posts.get(thisObject.targetPostHash)
+ } else {
+ targetPost = targetUserProfile.posts.get(thisObject.targetPostHash)
+ }
+
+ if (targetPost === undefined) {
+ throw ('Target Post Not Found')
+ }
+
targetPost.addReaction(thisObject.eventType - 100)
- return
+ return true
}
if (
- thisObject.eventType === EVENT_TYPES.REMOVE_REACTION_LIKE ||
- thisObject.eventType === EVENT_TYPES.REMOVE_REACTION_LOVE ||
- thisObject.eventType === EVENT_TYPES.REMOVE_REACTION_HAHA ||
- thisObject.eventType === EVENT_TYPES.REMOVE_REACTION_WOW ||
- thisObject.eventType === EVENT_TYPES.REMOVE_REACTION_SAD ||
- thisObject.eventType === EVENT_TYPES.REMOVE_REACTION_ANGRY ||
- thisObject.eventType === EVENT_TYPES.REMOVE_REACTION_CARE
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REMOVE_REACTION_LIKE ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REMOVE_REACTION_LOVE ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REMOVE_REACTION_HAHA ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REMOVE_REACTION_WOW ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REMOVE_REACTION_SAD ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REMOVE_REACTION_ANGRY ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REMOVE_REACTION_CARE
) {
+
+ if (targetBotProfile !== undefined) {
+ targetPost = targetBotProfile.posts.get(thisObject.targetPostHash)
+ } else {
+ targetPost = targetUserProfile.posts.get(thisObject.targetPostHash)
+ }
+
+ if (targetPost === undefined) {
+ throw ('Target Post Not Found')
+ }
+
targetPost.removeReaction(thisObject.eventType - 200)
- return
+ return true
}
}
@@ -368,13 +351,13 @@ exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() {
Is is a Bot?
*/
if (
- thisObject.eventType === EVENT_TYPES.ADD_BOT ||
- thisObject.eventType === EVENT_TYPES.REMOVE_BOT ||
- thisObject.eventType === EVENT_TYPES.ENABLE_BOT ||
- thisObject.eventType === EVENT_TYPES.DISABLE_BOT
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.ADD_BOT ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REMOVE_BOT ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.ENABLE_BOT ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.DISABLE_BOT
) {
switch (thisObject.eventType) {
- case EVENT_TYPES.ADD_BOT: {
+ case SA.projects.socialTrading.globals.eventTypes.ADD_BOT: {
emitterUserProfile.addBot(
thisObject.emitterUserProfileId,
thisObject.emitterBotProfileId,
@@ -384,26 +367,26 @@ exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() {
)
break
}
- case EVENT_TYPES.REMOVE_BOT: {
+ case SA.projects.socialTrading.globals.eventTypes.REMOVE_BOT: {
emitterUserProfile.removeBot(
thisObject.emitterBotProfileId
)
break
}
- case EVENT_TYPES.ENABLE_BOT: {
+ case SA.projects.socialTrading.globals.eventTypes.ENABLE_BOT: {
emitterUserProfile.enableBot(
thisObject.emitterBotProfileId
)
break
}
- case EVENT_TYPES.DISABLE_BOT: {
+ case SA.projects.socialTrading.globals.eventTypes.DISABLE_BOT: {
emitterUserProfile.disableBot(
thisObject.emitterBotProfileId
)
break
}
}
- return
+ return true
}
}
diff --git a/Projects/Social-Trading/SA/Globals/EventTypes.js b/Projects/Social-Trading/SA/Globals/EventTypes.js
new file mode 100644
index 000000000..e5dc63d1f
--- /dev/null
+++ b/Projects/Social-Trading/SA/Globals/EventTypes.js
@@ -0,0 +1,44 @@
+exports.newSocialTradingGlobalsEventTypes = function () {
+
+ let thisObject = {
+ /* Users Posts and Following Events */
+ NEW_USER_POST: 10,
+ REPLY_TO_USER_POST: 11,
+ REPOST_USER_POST: 12,
+ QUOTE_REPOST_USER_POST: 13,
+ REMOVE_USER_POST: 14,
+ FOLLOW_USER_PROFILE: 15,
+ UNFOLLOW_USER_PROFILE: 16,
+ /* Bots Posts and Following Events */
+ NEW_BOT_POST: 20,
+ REPLY_TO_BOT_POST: 21,
+ REPOST_BOT_POST: 22,
+ QUOTE_REPOST_BOT_POST: 23,
+ REMOVE_BOT_POST: 24,
+ FOLLOW_BOT_PROFILE: 25,
+ UNFOLLOW_BOT_PROFILE: 26,
+ /* Bots Management Events */
+ ADD_BOT: 50,
+ REMOVE_BOT: 51,
+ ENABLE_BOT: 52,
+ DISABLE_BOT: 53,
+ /* Add Reaction to Posts Events */
+ ADD_REACTION_LIKE: 100,
+ ADD_REACTION_LOVE: 101,
+ ADD_REACTION_HAHA: 102,
+ ADD_REACTION_WOW: 103,
+ ADD_REACTION_SAD: 104,
+ ADD_REACTION_ANGRY: 105,
+ ADD_REACTION_CARE: 106,
+ /* Remove Reaction to Posts Events */
+ REMOVE_REACTION_LIKE: 200,
+ REMOVE_REACTION_LOVE: 201,
+ REMOVE_REACTION_HAHA: 202,
+ REMOVE_REACTION_WOW: 203,
+ REMOVE_REACTION_SAD: 204,
+ REMOVE_REACTION_ANGRY: 205,
+ REMOVE_REACTION_CARE: 206
+ }
+
+ return thisObject
+}
\ No newline at end of file
diff --git a/Projects/TensorFlow/Plugins/Workspaces/ML CrossCategoricalEntropy Demo.json b/Projects/TensorFlow/Plugins/Workspaces/ML CategoricalCrossEntropy Demo.json
similarity index 97%
rename from Projects/TensorFlow/Plugins/Workspaces/ML CrossCategoricalEntropy Demo.json
rename to Projects/TensorFlow/Plugins/Workspaces/ML CategoricalCrossEntropy Demo.json
index 18c688e6e..ac67e1456 100644
--- a/Projects/TensorFlow/Plugins/Workspaces/ML CrossCategoricalEntropy Demo.json
+++ b/Projects/TensorFlow/Plugins/Workspaces/ML CategoricalCrossEntropy Demo.json
@@ -1,6 +1,6 @@
{
"type": "Workspace",
- "name": "ML CrossCategoricalEntropy Demo",
+ "name": "ML CategoricalCrossEntropy Demo",
"config": "{\n \"docsLanguage\": \"EN\",\n \"contributionsBranch\": \"develop\"\n}",
"rootNodes": [
{
@@ -50,7 +50,7 @@
"bot": {
"type": "Sensor Bot Instance",
"name": "Exchange Raw Data",
- "config": "{\n \"startDate\": \"2021-02-01\"\n}",
+ "config": "{\n \"startDate\": \"2021-01-01\"\n}",
"project": "Foundations",
"processes": [
{
@@ -60,8 +60,8 @@
"id": "dcae622c-eeaf-4609-8947-1d544675994f",
"savedPayload": {
"position": {
- "x": 23669.74175100142,
- "y": 29687.688294073963
+ "x": 23713.67573382344,
+ "y": 29793.754311251945
},
"targetPosition": {
"x": 23819.74175100142,
@@ -303,7 +303,7 @@
"floatingObject": {
"isPinned": false,
"isFrozen": false,
- "isCollapsed": false,
+ "isCollapsed": true,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
@@ -317,12 +317,12 @@
"id": "3f70cf64-3714-4cc5-af78-ab87107f51d0",
"savedPayload": {
"position": {
- "x": 24119.74175100142,
- "y": 29687.688294073963
+ "x": 24297.66946314268,
+ "y": 31983.062756321295
},
"targetPosition": {
- "x": 24379.549372136753,
- "y": 29837.688294073963
+ "x": 24375.315176673437,
+ "y": 31693.285008434574
},
"floatingObject": {
"isPinned": false,
@@ -341,12 +341,12 @@
"id": "b4ca9161-c8f2-4f39-8a0c-271b1f7542ba",
"savedPayload": {
"position": {
- "x": 24379.549372136753,
- "y": 29837.688294073963
+ "x": 24375.315176673437,
+ "y": 31693.285008434574
},
"targetPosition": {
- "x": 24639.356993272086,
- "y": 29987.688294073963
+ "x": 24452.960890204195,
+ "y": 31403.507260547853
},
"floatingObject": {
"isPinned": false,
@@ -384,1616 +384,6 @@
"name": "Pluvtech",
"project": "Foundations",
"tasks": [
- {
- "type": "Task",
- "name": "Fisher Transform",
- "project": "Foundations",
- "bot": {
- "type": "Indicator Bot Instance",
- "name": "Fisher Transform",
- "config": "{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}",
- "project": "Foundations",
- "processes": [
- {
- "type": "Indicator Process Instance",
- "name": "Fisher Transform Multi-Time-Frame-Market",
- "project": "Foundations",
- "id": "08537bf4-20e0-4f73-ba8e-47ae0fb941e7",
- "savedPayload": {
- "position": {
- "x": 24985.356993272086,
- "y": 30688.11115747996
- },
- "targetPosition": {
- "x": 25021.356993272086,
- "y": 30688.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 3,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "referenceParent": {
- "type": "Process Definition",
- "name": "Multi-Time-Frame-Market",
- "id": "a92e1484-ed61-4518-a066-211baf9c25c7"
- },
- "referenceParentCombinedNodePath": [
- [
- "Pluvtech",
- "Data Mine",
- "Foundations",
- "0a5518d0-e6d5-4bdf-ac31-461fb2d40b3c"
- ],
- [
- "Fisher Transform",
- "Indicator Bot",
- "Foundations",
- "1cf45944-eac2-493d-b53a-da358c2a67c1"
- ],
- [
- "Multi-Time-Frame-Market",
- "Process Definition",
- "Foundations",
- "a92e1484-ed61-4518-a066-211baf9c25c7"
- ]
- ]
- }
- },
- {
- "type": "Indicator Process Instance",
- "name": "Fisher Transform Multi-Time-Frame-Daily",
- "project": "Foundations",
- "id": "14fb5836-7feb-4d9f-9a0f-015707c04c66",
- "savedPayload": {
- "position": {
- "x": 25051.356993272086,
- "y": 30664.11115747996
- },
- "targetPosition": {
- "x": 25021.356993272086,
- "y": 30688.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 3,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "referenceParent": {
- "type": "Process Definition",
- "name": "Multi-Time-Frame-Daily",
- "id": "b7de0201-cc18-45c3-8b54-24f37290122f"
- },
- "referenceParentCombinedNodePath": [
- [
- "Pluvtech",
- "Data Mine",
- "Foundations",
- "0a5518d0-e6d5-4bdf-ac31-461fb2d40b3c"
- ],
- [
- "Fisher Transform",
- "Indicator Bot",
- "Foundations",
- "1cf45944-eac2-493d-b53a-da358c2a67c1"
- ],
- [
- "Multi-Time-Frame-Daily",
- "Process Definition",
- "Foundations",
- "b7de0201-cc18-45c3-8b54-24f37290122f"
- ]
- ]
- }
- }
- ],
- "id": "ae1a5c10-e276-4acb-8ff6-6f745e0ba41d",
- "savedPayload": {
- "position": {
- "x": 25021.356993272086,
- "y": 30688.11115747996
- },
- "targetPosition": {
- "x": 24967.356993272086,
- "y": 30714.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- },
- "id": "bd26b1e5-37a7-4f37-953c-79e8f7dd5f20",
- "savedPayload": {
- "position": {
- "x": 24967.356993272086,
- "y": 30714.11115747996
- },
- "targetPosition": {
- "x": 25060.356993272086,
- "y": 30711.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- },
- {
- "type": "Task",
- "name": "Waddah Attar",
- "project": "Foundations",
- "bot": {
- "type": "Indicator Bot Instance",
- "name": "Waddah Attar",
- "config": "{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}",
- "project": "Foundations",
- "processes": [
- {
- "type": "Indicator Process Instance",
- "name": "Waddah Attar Multi-Time-Frame-Market",
- "project": "Foundations",
- "id": "ef8b65b2-5ba2-42fc-90b1-a933d9b0e35e",
- "savedPayload": {
- "position": {
- "x": 25119.356993272086,
- "y": 30754.11115747996
- },
- "targetPosition": {
- "x": 25068.356993272086,
- "y": 30827.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 3,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "referenceParent": {
- "type": "Process Definition",
- "name": "Multi-Time-Frame-Market",
- "id": "586f7c7a-3c58-494f-9f47-e328a7018b87"
- },
- "referenceParentCombinedNodePath": [
- [
- "Pluvtech",
- "Data Mine",
- "Foundations",
- "0a5518d0-e6d5-4bdf-ac31-461fb2d40b3c"
- ],
- [
- "Waddah Attar",
- "Indicator Bot",
- "Foundations",
- "771942e0-043e-41ce-8db2-a50729affc91"
- ],
- [
- "Multi-Time-Frame-Market",
- "Process Definition",
- "Foundations",
- "586f7c7a-3c58-494f-9f47-e328a7018b87"
- ]
- ]
- }
- },
- {
- "type": "Indicator Process Instance",
- "name": "Waddah Attar Multi-Time-Frame-Daily",
- "project": "Foundations",
- "id": "45d01662-8a7e-472f-af57-c3d3be3cf2e8",
- "savedPayload": {
- "position": {
- "x": 25142.356993272086,
- "y": 30839.11115747996
- },
- "targetPosition": {
- "x": 25068.356993272086,
- "y": 30827.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 3,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "referenceParent": {
- "type": "Process Definition",
- "name": "Multi-Time-Frame-Daily",
- "id": "a726a599-bbb4-4193-834b-9790b2bac74f"
- },
- "referenceParentCombinedNodePath": [
- [
- "Pluvtech",
- "Data Mine",
- "Foundations",
- "0a5518d0-e6d5-4bdf-ac31-461fb2d40b3c"
- ],
- [
- "Waddah Attar",
- "Indicator Bot",
- "Foundations",
- "771942e0-043e-41ce-8db2-a50729affc91"
- ],
- [
- "Multi-Time-Frame-Daily",
- "Process Definition",
- "Foundations",
- "a726a599-bbb4-4193-834b-9790b2bac74f"
- ]
- ]
- }
- }
- ],
- "id": "c0f29188-a277-4c48-9431-ed5601a2c96d",
- "savedPayload": {
- "position": {
- "x": 25068.356993272086,
- "y": 30827.11115747996
- },
- "targetPosition": {
- "x": 25034.356993272086,
- "y": 30770.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- },
- "id": "a6868e50-3188-4510-b2bb-e83185fcfb44",
- "savedPayload": {
- "position": {
- "x": 25034.356993272086,
- "y": 30770.11115747996
- },
- "targetPosition": {
- "x": 25060.356993272086,
- "y": 30711.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- },
- {
- "type": "Task",
- "name": "PLUVTECH MACD",
- "project": "Foundations",
- "bot": {
- "type": "Indicator Bot Instance",
- "name": "PLUVTECH MACD",
- "config": "{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}",
- "project": "Foundations",
- "processes": [
- {
- "type": "Indicator Process Instance",
- "name": "PLUVTECH MACD Multi-Time-Frame-Market",
- "project": "Foundations",
- "id": "c311b12c-0926-438f-b2f8-f8e641a5160f",
- "savedPayload": {
- "position": {
- "x": 25113.356993272086,
- "y": 30648.11115747996
- },
- "targetPosition": {
- "x": 25024.356993272086,
- "y": 30736.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 3,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "referenceParent": {
- "type": "Process Definition",
- "name": "Multi-Time-Frame-Market",
- "id": "1b761c78-c05c-4b76-bf8e-89e67696704b"
- },
- "referenceParentCombinedNodePath": [
- [
- "Pluvtech",
- "Data Mine",
- "Foundations",
- "0a5518d0-e6d5-4bdf-ac31-461fb2d40b3c"
- ],
- [
- "PLUVTECH MACD",
- "Indicator Bot",
- "Foundations",
- "8dffabdf-ec34-42db-9d61-c9ebbca2e8fe"
- ],
- [
- "Multi-Time-Frame-Market",
- "Process Definition",
- "Foundations",
- "1b761c78-c05c-4b76-bf8e-89e67696704b"
- ]
- ]
- }
- },
- {
- "type": "Indicator Process Instance",
- "name": "PLUVTECH MACD Multi-Time-Frame-Daily",
- "project": "Foundations",
- "id": "3f78a0a6-a58a-426b-8017-02228c6cfc33",
- "savedPayload": {
- "position": {
- "x": 25041.356993272086,
- "y": 30714.11115747996
- },
- "targetPosition": {
- "x": 25024.356993272086,
- "y": 30736.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 3,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "referenceParent": {
- "type": "Process Definition",
- "name": "Multi-Time-Frame-Daily",
- "id": "a03647a2-ff6a-45c9-805f-35a7a89568f1"
- },
- "referenceParentCombinedNodePath": [
- [
- "Pluvtech",
- "Data Mine",
- "Foundations",
- "0a5518d0-e6d5-4bdf-ac31-461fb2d40b3c"
- ],
- [
- "PLUVTECH MACD",
- "Indicator Bot",
- "Foundations",
- "8dffabdf-ec34-42db-9d61-c9ebbca2e8fe"
- ],
- [
- "Multi-Time-Frame-Daily",
- "Process Definition",
- "Foundations",
- "a03647a2-ff6a-45c9-805f-35a7a89568f1"
- ]
- ]
- }
- }
- ],
- "id": "18486e16-8faa-4a76-be99-2aaa5e1b37eb",
- "savedPayload": {
- "position": {
- "x": 25024.356993272086,
- "y": 30736.11115747996
- },
- "targetPosition": {
- "x": 25080.356993272086,
- "y": 30676.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- },
- "id": "df94da9b-a216-4074-b72f-05cb2f881680",
- "savedPayload": {
- "position": {
- "x": 25080.356993272086,
- "y": 30676.11115747996
- },
- "targetPosition": {
- "x": 25060.356993272086,
- "y": 30711.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- },
- {
- "type": "Task",
- "name": "HMA",
- "project": "Foundations",
- "bot": {
- "type": "Indicator Bot Instance",
- "name": "HMA",
- "config": "{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}",
- "project": "Foundations",
- "processes": [
- {
- "type": "Indicator Process Instance",
- "name": "HMA Multi-Time-Frame-Market",
- "project": "Foundations",
- "id": "4f67f54c-3559-48a7-8ec9-e1124ff4d8f3",
- "savedPayload": {
- "position": {
- "x": 25272.356993272086,
- "y": 30684.11115747996
- },
- "targetPosition": {
- "x": 25220.356993272086,
- "y": 30591.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 3,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "referenceParent": {
- "type": "Process Definition",
- "name": "Multi-Time-Frame-Market",
- "id": "31cf89d6-4bd2-4092-8776-271650dfde88"
- },
- "referenceParentCombinedNodePath": [
- [
- "Pluvtech",
- "Data Mine",
- "Foundations",
- "0a5518d0-e6d5-4bdf-ac31-461fb2d40b3c"
- ],
- [
- "HMA",
- "Indicator Bot",
- "Foundations",
- "ca8c02de-4c43-4345-85db-26186306a1d4"
- ],
- [
- "Multi-Time-Frame-Market",
- "Process Definition",
- "Foundations",
- "31cf89d6-4bd2-4092-8776-271650dfde88"
- ]
- ]
- }
- },
- {
- "type": "Indicator Process Instance",
- "name": "HMA Multi-Time-Frame-Daily",
- "project": "Foundations",
- "id": "f26f7564-3a93-4fe1-a381-a30bf1d75ff7",
- "savedPayload": {
- "position": {
- "x": 25302.356993272086,
- "y": 30690.11115747996
- },
- "targetPosition": {
- "x": 25220.356993272086,
- "y": 30591.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 3,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "referenceParent": {
- "type": "Process Definition",
- "name": "Multi-Time-Frame-Daily",
- "id": "1df426ed-e374-4721-a8b9-b6acb16693af"
- },
- "referenceParentCombinedNodePath": [
- [
- "Pluvtech",
- "Data Mine",
- "Foundations",
- "0a5518d0-e6d5-4bdf-ac31-461fb2d40b3c"
- ],
- [
- "HMA",
- "Indicator Bot",
- "Foundations",
- "ca8c02de-4c43-4345-85db-26186306a1d4"
- ],
- [
- "Multi-Time-Frame-Daily",
- "Process Definition",
- "Foundations",
- "1df426ed-e374-4721-a8b9-b6acb16693af"
- ]
- ]
- }
- }
- ],
- "id": "e13c8df8-c79d-4fa9-b98e-e5e40df6eac7",
- "savedPayload": {
- "position": {
- "x": 25220.356993272086,
- "y": 30591.11115747996
- },
- "targetPosition": {
- "x": 25131.356993272086,
- "y": 30680.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- },
- "id": "c55f745d-c0d7-4209-88b7-06bfa9a13773",
- "savedPayload": {
- "position": {
- "x": 25131.356993272086,
- "y": 30680.11115747996
- },
- "targetPosition": {
- "x": 25060.356993272086,
- "y": 30711.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- },
- {
- "type": "Task",
- "name": "EMA",
- "project": "Foundations",
- "bot": {
- "type": "Indicator Bot Instance",
- "name": "EMA",
- "config": "{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}",
- "project": "Foundations",
- "processes": [
- {
- "type": "Indicator Process Instance",
- "name": "EMA Multi-Time-Frame-Market",
- "project": "Foundations",
- "id": "1a30b360-2b41-4264-9c5f-510bcecb5215",
- "savedPayload": {
- "position": {
- "x": 24875.356993272086,
- "y": 30791.11115747996
- },
- "targetPosition": {
- "x": 24914.356993272086,
- "y": 30780.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 3,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "referenceParent": {
- "type": "Process Definition",
- "name": "Multi-Time-Frame-Market",
- "id": "d17dff7e-4380-45f0-81d2-150937d9cf16"
- },
- "referenceParentCombinedNodePath": [
- [
- "Pluvtech",
- "Data Mine",
- "Foundations",
- "0a5518d0-e6d5-4bdf-ac31-461fb2d40b3c"
- ],
- [
- "EMA",
- "Indicator Bot",
- "Foundations",
- "0702e945-c8e3-4af7-b597-37ee572b42e4"
- ],
- [
- "Multi-Time-Frame-Market",
- "Process Definition",
- "Foundations",
- "d17dff7e-4380-45f0-81d2-150937d9cf16"
- ]
- ]
- }
- },
- {
- "type": "Indicator Process Instance",
- "name": "EMA Multi-Time-Frame-Daily",
- "project": "Foundations",
- "id": "c08b1282-64fe-4bbf-91c7-b5a82e0f6636",
- "savedPayload": {
- "position": {
- "x": 24882.356993272086,
- "y": 30830.11115747996
- },
- "targetPosition": {
- "x": 24914.356993272086,
- "y": 30780.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 3,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "referenceParent": {
- "type": "Process Definition",
- "name": "Multi-Time-Frame-Daily",
- "id": "b4b30f4e-914b-4df6-b05d-b9e65b6736ce"
- },
- "referenceParentCombinedNodePath": [
- [
- "Pluvtech",
- "Data Mine",
- "Foundations",
- "0a5518d0-e6d5-4bdf-ac31-461fb2d40b3c"
- ],
- [
- "EMA",
- "Indicator Bot",
- "Foundations",
- "0702e945-c8e3-4af7-b597-37ee572b42e4"
- ],
- [
- "Multi-Time-Frame-Daily",
- "Process Definition",
- "Foundations",
- "b4b30f4e-914b-4df6-b05d-b9e65b6736ce"
- ]
- ]
- }
- }
- ],
- "id": "007ad0be-f32d-462d-832d-f2d5d19ee471",
- "savedPayload": {
- "position": {
- "x": 24914.356993272086,
- "y": 30780.11115747996
- },
- "targetPosition": {
- "x": 24962.356993272086,
- "y": 30738.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- },
- "id": "d380e1a2-4810-4205-b25d-3f0bfac0c416",
- "savedPayload": {
- "position": {
- "x": 24962.356993272086,
- "y": 30738.11115747996
- },
- "targetPosition": {
- "x": 25060.356993272086,
- "y": 30711.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- },
- {
- "type": "Task",
- "name": "McGinley",
- "project": "Foundations",
- "bot": {
- "type": "Indicator Bot Instance",
- "name": "McGinley",
- "config": "{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}",
- "project": "Foundations",
- "processes": [
- {
- "type": "Indicator Process Instance",
- "name": "McGinley Multi-Time-Frame-Market",
- "project": "Foundations",
- "id": "f1466349-1506-4c34-abc0-8612da63f733",
- "savedPayload": {
- "position": {
- "x": 25122.356993272086,
- "y": 30692.11115747996
- },
- "targetPosition": {
- "x": 25030.356993272086,
- "y": 30782.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 3,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "referenceParent": {
- "type": "Process Definition",
- "name": "Multi-Time-Frame-Market",
- "id": "67fbc9f7-f8da-46d9-9dbd-da0045b5b675"
- },
- "referenceParentCombinedNodePath": [
- [
- "Pluvtech",
- "Data Mine",
- "Foundations",
- "0a5518d0-e6d5-4bdf-ac31-461fb2d40b3c"
- ],
- [
- "McGinley",
- "Indicator Bot",
- "Foundations",
- "d07599e3-ce23-48f1-8b3b-6e594559cc41"
- ],
- [
- "Multi-Time-Frame-Market",
- "Process Definition",
- "Foundations",
- "67fbc9f7-f8da-46d9-9dbd-da0045b5b675"
- ]
- ]
- }
- },
- {
- "type": "Indicator Process Instance",
- "name": "McGinley Multi-Time-Frame-Daily",
- "project": "Foundations",
- "id": "d873d278-083a-4359-90d7-64c3f371f9c2",
- "savedPayload": {
- "position": {
- "x": 25039.356993272086,
- "y": 30710.11115747996
- },
- "targetPosition": {
- "x": 25030.356993272086,
- "y": 30782.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 3,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "referenceParent": {
- "type": "Process Definition",
- "name": "Multi-Time-Frame-Daily",
- "id": "fb06c6b5-4296-4333-8684-0427e40ec56d"
- },
- "referenceParentCombinedNodePath": [
- [
- "Pluvtech",
- "Data Mine",
- "Foundations",
- "0a5518d0-e6d5-4bdf-ac31-461fb2d40b3c"
- ],
- [
- "McGinley",
- "Indicator Bot",
- "Foundations",
- "d07599e3-ce23-48f1-8b3b-6e594559cc41"
- ],
- [
- "Multi-Time-Frame-Daily",
- "Process Definition",
- "Foundations",
- "fb06c6b5-4296-4333-8684-0427e40ec56d"
- ]
- ]
- }
- }
- ],
- "id": "b30bbbdb-0175-4fcf-875e-87c7b2401d9e",
- "savedPayload": {
- "position": {
- "x": 25030.356993272086,
- "y": 30782.11115747996
- },
- "targetPosition": {
- "x": 25023.356993272086,
- "y": 30715.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- },
- "id": "c896f147-9213-4a44-ab1e-027747242a9f",
- "savedPayload": {
- "position": {
- "x": 25023.356993272086,
- "y": 30715.11115747996
- },
- "targetPosition": {
- "x": 25060.356993272086,
- "y": 30711.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- },
- {
- "type": "Task",
- "name": "WMA",
- "project": "Foundations",
- "bot": {
- "type": "Indicator Bot Instance",
- "name": "WMA",
- "config": "{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}",
- "project": "Foundations",
- "processes": [
- {
- "type": "Indicator Process Instance",
- "name": "WMA Multi-Time-Frame-Market",
- "project": "Foundations",
- "id": "cf89ccbf-ca0e-4207-bb3d-774c3c5769fa",
- "savedPayload": {
- "position": {
- "x": 25123.356993272086,
- "y": 30710.11115747996
- },
- "targetPosition": {
- "x": 25093.356993272086,
- "y": 30655.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 3,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "referenceParent": {
- "type": "Process Definition",
- "name": "Multi-Time-Frame-Market",
- "id": "68472dc9-ab46-41f3-a00a-3b358ad2f290"
- },
- "referenceParentCombinedNodePath": [
- [
- "Pluvtech",
- "Data Mine",
- "Foundations",
- "0a5518d0-e6d5-4bdf-ac31-461fb2d40b3c"
- ],
- [
- "WMA",
- "Indicator Bot",
- "Foundations",
- "403b2817-ec8d-4b6a-8b66-72eab0b31961"
- ],
- [
- "Multi-Time-Frame-Market",
- "Process Definition",
- "Foundations",
- "68472dc9-ab46-41f3-a00a-3b358ad2f290"
- ]
- ]
- }
- },
- {
- "type": "Indicator Process Instance",
- "name": "WMA Multi-Time-Frame-Daily",
- "project": "Foundations",
- "id": "34ba4f8b-5693-4e30-999b-839cddf646e8",
- "savedPayload": {
- "position": {
- "x": 25011.356993272086,
- "y": 30725.11115747996
- },
- "targetPosition": {
- "x": 25093.356993272086,
- "y": 30655.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 3,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "referenceParent": {
- "type": "Process Definition",
- "name": "Multi-Time-Frame-Daily",
- "id": "7c07645b-4c36-40d4-9ee1-895fada4bd42"
- },
- "referenceParentCombinedNodePath": [
- [
- "Pluvtech",
- "Data Mine",
- "Foundations",
- "0a5518d0-e6d5-4bdf-ac31-461fb2d40b3c"
- ],
- [
- "WMA",
- "Indicator Bot",
- "Foundations",
- "403b2817-ec8d-4b6a-8b66-72eab0b31961"
- ],
- [
- "Multi-Time-Frame-Daily",
- "Process Definition",
- "Foundations",
- "7c07645b-4c36-40d4-9ee1-895fada4bd42"
- ]
- ]
- }
- }
- ],
- "id": "7f1fe3aa-a6c1-4cf2-b9ff-0f6bb021f543",
- "savedPayload": {
- "position": {
- "x": 25093.356993272086,
- "y": 30655.11115747996
- },
- "targetPosition": {
- "x": 25060.356993272086,
- "y": 30752.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- },
- "id": "92062504-db84-45c0-9115-5009bcfb703c",
- "savedPayload": {
- "position": {
- "x": 25060.356993272086,
- "y": 30752.11115747996
- },
- "targetPosition": {
- "x": 25060.356993272086,
- "y": 30711.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- },
- {
- "type": "Task",
- "name": "SMA",
- "project": "Foundations",
- "bot": {
- "type": "Indicator Bot Instance",
- "name": "SMA",
- "config": "{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}",
- "project": "Foundations",
- "processes": [
- {
- "type": "Indicator Process Instance",
- "name": "SMA Multi-Time-Frame-Market",
- "project": "Foundations",
- "id": "cba5adff-ed89-45c6-91af-3753c6c44c6d",
- "savedPayload": {
- "position": {
- "x": 24930.356993272086,
- "y": 30779.11115747996
- },
- "targetPosition": {
- "x": 24975.356993272086,
- "y": 30692.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 3,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "referenceParent": {
- "type": "Process Definition",
- "name": "Multi-Time-Frame-Market",
- "id": "6b1d24e9-f182-4425-b8b5-f938c371283e"
- },
- "referenceParentCombinedNodePath": [
- [
- "Pluvtech",
- "Data Mine",
- "Foundations",
- "0a5518d0-e6d5-4bdf-ac31-461fb2d40b3c"
- ],
- [
- "SMA",
- "Indicator Bot",
- "Foundations",
- "911bc848-881a-4d4d-9031-fca087856547"
- ],
- [
- "Multi-Time-Frame-Market",
- "Process Definition",
- "Foundations",
- "6b1d24e9-f182-4425-b8b5-f938c371283e"
- ]
- ]
- }
- },
- {
- "type": "Indicator Process Instance",
- "name": "SMA Multi-Time-Frame-Daily",
- "project": "Foundations",
- "id": "45a9335a-f269-4564-91bf-e34b2f654fb5",
- "savedPayload": {
- "position": {
- "x": 24880.356993272086,
- "y": 30787.11115747996
- },
- "targetPosition": {
- "x": 24975.356993272086,
- "y": 30692.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 3,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "referenceParent": {
- "type": "Process Definition",
- "name": "Multi-Time-Frame-Daily",
- "id": "be418ee4-e7ef-4e8d-880d-6e17c06db115"
- },
- "referenceParentCombinedNodePath": [
- [
- "Pluvtech",
- "Data Mine",
- "Foundations",
- "0a5518d0-e6d5-4bdf-ac31-461fb2d40b3c"
- ],
- [
- "SMA",
- "Indicator Bot",
- "Foundations",
- "911bc848-881a-4d4d-9031-fca087856547"
- ],
- [
- "Multi-Time-Frame-Daily",
- "Process Definition",
- "Foundations",
- "be418ee4-e7ef-4e8d-880d-6e17c06db115"
- ]
- ]
- }
- }
- ],
- "id": "672690a0-1ab8-4092-a240-47a5f9834ff0",
- "savedPayload": {
- "position": {
- "x": 24975.356993272086,
- "y": 30692.11115747996
- },
- "targetPosition": {
- "x": 25019.356993272086,
- "y": 30705.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- },
- "id": "575b2c85-868f-4890-859a-52593fb23810",
- "savedPayload": {
- "position": {
- "x": 25019.356993272086,
- "y": 30705.11115747996
- },
- "targetPosition": {
- "x": 25060.356993272086,
- "y": 30711.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- },
- {
- "type": "Task",
- "name": "Volume-WMA",
- "project": "Foundations",
- "bot": {
- "type": "Indicator Bot Instance",
- "name": "Volume-WMA",
- "config": "{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}",
- "project": "Foundations",
- "processes": [
- {
- "type": "Indicator Process Instance",
- "name": "Volume-WMA Multi-Time-Frame-Market",
- "project": "Foundations",
- "id": "f98a8174-d980-44e0-8b8a-eefb6d92e39b",
- "savedPayload": {
- "position": {
- "x": 25140.356993272086,
- "y": 30826.11115747996
- },
- "targetPosition": {
- "x": 25073.356993272086,
- "y": 30778.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 3,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "referenceParent": {
- "type": "Process Definition",
- "name": "Multi-Time-Frame-Market",
- "id": "3a1cfbed-8cde-4ecd-bbaa-ef20fa82d04c"
- },
- "referenceParentCombinedNodePath": [
- [
- "Pluvtech",
- "Data Mine",
- "Foundations",
- "0a5518d0-e6d5-4bdf-ac31-461fb2d40b3c"
- ],
- [
- "Volume-WMA",
- "Indicator Bot",
- "Foundations",
- "89d82732-d20e-4c9d-8143-a690929a6a26"
- ],
- [
- "Multi-Time-Frame-Market",
- "Process Definition",
- "Foundations",
- "3a1cfbed-8cde-4ecd-bbaa-ef20fa82d04c"
- ]
- ]
- }
- },
- {
- "type": "Indicator Process Instance",
- "name": "Volume-WMA Multi-Time-Frame-Daily",
- "project": "Foundations",
- "id": "f7d4d696-1c13-4c39-bde6-85d22146e163",
- "savedPayload": {
- "position": {
- "x": 25073.356993272086,
- "y": 30866.11115747996
- },
- "targetPosition": {
- "x": 25073.356993272086,
- "y": 30778.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 3,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "referenceParent": {
- "type": "Process Definition",
- "name": "Multi-Time-Frame-Daily",
- "id": "6bc86e49-42f7-4649-8813-1893a124f2be"
- },
- "referenceParentCombinedNodePath": [
- [
- "Pluvtech",
- "Data Mine",
- "Foundations",
- "0a5518d0-e6d5-4bdf-ac31-461fb2d40b3c"
- ],
- [
- "Volume-WMA",
- "Indicator Bot",
- "Foundations",
- "89d82732-d20e-4c9d-8143-a690929a6a26"
- ],
- [
- "Multi-Time-Frame-Daily",
- "Process Definition",
- "Foundations",
- "6bc86e49-42f7-4649-8813-1893a124f2be"
- ]
- ]
- }
- }
- ],
- "id": "1a288674-7b94-464b-a9ee-109ab6541197",
- "savedPayload": {
- "position": {
- "x": 25073.356993272086,
- "y": 30778.11115747996
- },
- "targetPosition": {
- "x": 25057.356993272086,
- "y": 30682.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- },
- "id": "12b33feb-1fe5-45a2-a87a-2d7db5dc786f",
- "savedPayload": {
- "position": {
- "x": 25057.356993272086,
- "y": 30682.11115747996
- },
- "targetPosition": {
- "x": 25060.356993272086,
- "y": 30711.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- },
- {
- "type": "Task",
- "name": "Fibonacci-Bollinger",
- "project": "Foundations",
- "bot": {
- "type": "Indicator Bot Instance",
- "name": "Fibonacci-Bollinger",
- "config": "{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}",
- "project": "Foundations",
- "processes": [
- {
- "type": "Indicator Process Instance",
- "name": "Fibonacci-Bollinger Multi-Time-Frame-Market",
- "project": "Foundations",
- "id": "331f4eb4-0748-427a-9b75-ab9b5b5fd85f",
- "savedPayload": {
- "position": {
- "x": 25122.356993272086,
- "y": 30827.11115747996
- },
- "targetPosition": {
- "x": 25196.356993272086,
- "y": 30818.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 3,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "referenceParent": {
- "type": "Process Definition",
- "name": "Multi-Time-Frame-Market",
- "id": "6e248f3a-e30f-45bc-a998-9553dd624192"
- },
- "referenceParentCombinedNodePath": [
- [
- "Pluvtech",
- "Data Mine",
- "Foundations",
- "0a5518d0-e6d5-4bdf-ac31-461fb2d40b3c"
- ],
- [
- "Fibonacci-Bollinger",
- "Indicator Bot",
- "Foundations",
- "d40999ec-12b6-4847-bfa3-26e12eb7276b"
- ],
- [
- "Multi-Time-Frame-Market",
- "Process Definition",
- "Foundations",
- "6e248f3a-e30f-45bc-a998-9553dd624192"
- ]
- ]
- }
- },
- {
- "type": "Indicator Process Instance",
- "name": "Fibonacci-Bollinger Multi-Time-Frame-Daily",
- "project": "Foundations",
- "id": "a329ed14-b7e5-4d4b-8fa1-3e25ad6b4402",
- "savedPayload": {
- "position": {
- "x": 25236.356993272086,
- "y": 30747.11115747996
- },
- "targetPosition": {
- "x": 25196.356993272086,
- "y": 30818.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 3,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "referenceParent": {
- "type": "Process Definition",
- "name": "Multi-Time-Frame-Daily",
- "id": "a31a39b0-d66c-4e16-ac5b-6f2e8d2809bf"
- },
- "referenceParentCombinedNodePath": [
- [
- "Pluvtech",
- "Data Mine",
- "Foundations",
- "0a5518d0-e6d5-4bdf-ac31-461fb2d40b3c"
- ],
- [
- "Fibonacci-Bollinger",
- "Indicator Bot",
- "Foundations",
- "d40999ec-12b6-4847-bfa3-26e12eb7276b"
- ],
- [
- "Multi-Time-Frame-Daily",
- "Process Definition",
- "Foundations",
- "a31a39b0-d66c-4e16-ac5b-6f2e8d2809bf"
- ]
- ]
- }
- }
- ],
- "id": "4bd78656-df77-4341-92af-d287cb4c71c4",
- "savedPayload": {
- "position": {
- "x": 25196.356993272086,
- "y": 30818.11115747996
- },
- "targetPosition": {
- "x": 25137.356993272086,
- "y": 30761.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- },
- "id": "aaa666ef-8392-428d-bf54-f0e4c246a711",
- "savedPayload": {
- "position": {
- "x": 25137.356993272086,
- "y": 30761.11115747996
- },
- "targetPosition": {
- "x": 25060.356993272086,
- "y": 30711.11115747996
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- },
{
"type": "Task",
"name": "TPSL Bands",
@@ -2011,12 +401,12 @@
"id": "83327fdd-6961-4fe7-b6f2-f363b6ed7b03",
"savedPayload": {
"position": {
- "x": 25153.356993272086,
- "y": 30691.11115747996
+ "x": 23873.87266869796,
+ "y": 28927.506757834886
},
"targetPosition": {
- "x": 25108.356993272086,
- "y": 30694.11115747996
+ "x": 24153.94679664712,
+ "y": 29035.017142698478
},
"floatingObject": {
"isPinned": false,
@@ -2063,12 +453,12 @@
"id": "84a14580-bd6a-4729-836f-0d5614303f93",
"savedPayload": {
"position": {
- "x": 25143.356993272086,
- "y": 30735.11115747996
+ "x": 23965.150679332168,
+ "y": 28801.873354261388
},
"targetPosition": {
- "x": 25108.356993272086,
- "y": 30694.11115747996
+ "x": 24153.94679664712,
+ "y": 29035.017142698478
},
"floatingObject": {
"isPinned": false,
@@ -2112,12 +502,12 @@
"id": "e3496a60-1b73-4a6d-8014-85f73ce04372",
"savedPayload": {
"position": {
- "x": 25108.356993272086,
- "y": 30694.11115747996
+ "x": 24153.94679664712,
+ "y": 29035.017142698478
},
"targetPosition": {
- "x": 25146.356993272086,
- "y": 30696.11115747996
+ "x": 24396.651894959603,
+ "y": 29211.35271838622
},
"floatingObject": {
"isPinned": false,
@@ -2135,12 +525,12 @@
"id": "31880567-022a-4155-9cfb-9adc706458b1",
"savedPayload": {
"position": {
- "x": 25146.356993272086,
- "y": 30696.11115747996
+ "x": 24396.651894959603,
+ "y": 29211.35271838622
},
"targetPosition": {
- "x": 25060.356993272086,
- "y": 30711.11115747996
+ "x": 24639.356993272086,
+ "y": 29387.688294073963
},
"floatingObject": {
"isPinned": false,
@@ -2172,12 +562,12 @@
"id": "292bc099-87a5-450f-adf9-a7fc32bf9ace",
"savedPayload": {
"position": {
- "x": 24821.356993272086,
- "y": 30714.11115747996
+ "x": 24290.555086142613,
+ "y": 28565.453213913246
},
"targetPosition": {
- "x": 24889.356993272086,
- "y": 30797.11115747996
+ "x": 24453.94679664712,
+ "y": 28817.054384296873
},
"floatingObject": {
"isPinned": false,
@@ -2224,12 +614,12 @@
"id": "c9ee9e6f-04b3-4532-8051-277a0608d1d2",
"savedPayload": {
"position": {
- "x": 24904.356993272086,
- "y": 30749.11115747996
+ "x": 24438.246009774237,
+ "y": 28517.4655238705
},
"targetPosition": {
- "x": 24889.356993272086,
- "y": 30797.11115747996
+ "x": 24453.94679664712,
+ "y": 28817.054384296873
},
"floatingObject": {
"isPinned": false,
@@ -2273,12 +663,12 @@
"id": "a1003f8a-5a1d-4a65-87c0-c22ded850808",
"savedPayload": {
"position": {
- "x": 24889.356993272086,
- "y": 30797.11115747996
+ "x": 24453.94679664712,
+ "y": 28817.054384296873
},
"targetPosition": {
- "x": 24970.356993272086,
- "y": 30743.11115747996
+ "x": 24546.651894959603,
+ "y": 29102.371339185418
},
"floatingObject": {
"isPinned": false,
@@ -2296,12 +686,12 @@
"id": "3b06d9ee-13aa-4183-8560-082ac689ce1b",
"savedPayload": {
"position": {
- "x": 24970.356993272086,
- "y": 30743.11115747996
+ "x": 24546.651894959603,
+ "y": 29102.371339185418
},
"targetPosition": {
- "x": 25060.356993272086,
- "y": 30711.11115747996
+ "x": 24639.356993272086,
+ "y": 29387.688294073963
},
"floatingObject": {
"isPinned": false,
@@ -2333,12 +723,12 @@
"id": "24b35145-ab81-42b8-b141-eaba6dd80781",
"savedPayload": {
"position": {
- "x": 25013.356993272086,
- "y": 30611.11115747996
+ "x": 24840.467976769934,
+ "y": 28517.4655238705
},
"targetPosition": {
- "x": 25090.356993272086,
- "y": 30656.11115747996
+ "x": 24824.76718989705,
+ "y": 28817.054384296873
},
"floatingObject": {
"isPinned": false,
@@ -2385,12 +775,12 @@
"id": "5b8cba70-6fbb-4b24-82ba-4f3cd7db6104",
"savedPayload": {
"position": {
- "x": 25093.356993272086,
- "y": 30686.11115747996
+ "x": 24988.15890040156,
+ "y": 28565.453213913246
},
"targetPosition": {
- "x": 25090.356993272086,
- "y": 30656.11115747996
+ "x": 24824.76718989705,
+ "y": 28817.054384296873
},
"floatingObject": {
"isPinned": false,
@@ -2434,12 +824,12 @@
"id": "05acdf66-7978-432f-88b0-5dfdb2184493",
"savedPayload": {
"position": {
- "x": 25090.356993272086,
- "y": 30656.11115747996
+ "x": 24824.76718989705,
+ "y": 28817.054384296873
},
"targetPosition": {
- "x": 24998.356993272086,
- "y": 30639.11115747996
+ "x": 24732.06209158457,
+ "y": 29102.371339185418
},
"floatingObject": {
"isPinned": false,
@@ -2457,12 +847,12 @@
"id": "dc4241b0-1f03-4a63-9bf9-af65f5e81723",
"savedPayload": {
"position": {
- "x": 24998.356993272086,
- "y": 30639.11115747996
+ "x": 24732.06209158457,
+ "y": 29102.371339185418
},
"targetPosition": {
- "x": 25060.356993272086,
- "y": 30711.11115747996
+ "x": 24639.356993272086,
+ "y": 29387.688294073963
},
"floatingObject": {
"isPinned": false,
@@ -2494,12 +884,12 @@
"id": "dc8ae5da-5c68-42b8-ad74-83bd3ba502df",
"savedPayload": {
"position": {
- "x": 25075.356993272086,
- "y": 30651.11115747996
+ "x": 25313.563307212004,
+ "y": 28801.873354261388
},
"targetPosition": {
- "x": 25005.356993272086,
- "y": 30708.11115747996
+ "x": 25124.76718989705,
+ "y": 29035.017142698478
},
"floatingObject": {
"isPinned": false,
@@ -2546,12 +936,12 @@
"id": "44c44375-2757-4b15-8df3-1a38105b83c7",
"savedPayload": {
"position": {
- "x": 24960.356993272086,
- "y": 30680.11115747996
+ "x": 25404.84131784621,
+ "y": 28927.506757834886
},
"targetPosition": {
- "x": 25005.356993272086,
- "y": 30708.11115747996
+ "x": 25124.76718989705,
+ "y": 29035.017142698478
},
"floatingObject": {
"isPinned": false,
@@ -2595,12 +985,12 @@
"id": "72f6b75e-e6f4-4ecc-862c-3612d95459cd",
"savedPayload": {
"position": {
- "x": 25005.356993272086,
- "y": 30708.11115747996
+ "x": 25124.76718989705,
+ "y": 29035.017142698478
},
"targetPosition": {
- "x": 25024.356993272086,
- "y": 30750.11115747996
+ "x": 24882.06209158457,
+ "y": 29211.35271838622
},
"floatingObject": {
"isPinned": false,
@@ -2618,12 +1008,12 @@
"id": "81641bb9-2a1b-464c-a6ef-a81331819090",
"savedPayload": {
"position": {
- "x": 25024.356993272086,
- "y": 30750.11115747996
+ "x": 24882.06209158457,
+ "y": 29211.35271838622
},
"targetPosition": {
- "x": 25060.356993272086,
- "y": 30711.11115747996
+ "x": 24639.356993272086,
+ "y": 29387.688294073963
},
"floatingObject": {
"isPinned": false,
@@ -2642,12 +1032,12 @@
"id": "5f0e89a6-47d8-42b0-b867-cb4e8127d3da",
"savedPayload": {
"position": {
- "x": 24639.356993272086,
- "y": 29387.688294073963
+ "x": 23873.405394430752,
+ "y": 31558.798687609367
},
"targetPosition": {
- "x": 24639.356993272086,
- "y": 29687.688294073963
+ "x": 24163.183142317474,
+ "y": 31481.15297407861
},
"floatingObject": {
"isPinned": false,
@@ -2666,12 +1056,12 @@
"id": "000c1326-6d81-4321-b120-138d8f8169aa",
"savedPayload": {
"position": {
- "x": 24639.356993272086,
- "y": 29687.688294073963
+ "x": 24163.183142317474,
+ "y": 31481.15297407861
},
"targetPosition": {
- "x": 24639.356993272086,
- "y": 29987.688294073963
+ "x": 24452.960890204195,
+ "y": 31403.507260547853
},
"floatingObject": {
"isPinned": false,
@@ -2703,12 +1093,12 @@
"id": "683a83b5-e6e2-4d2d-8019-8e08d4ce854e",
"savedPayload": {
"position": {
- "x": 24639.356993272086,
- "y": 29987.688294073963
+ "x": 24452.960890204195,
+ "y": 31403.507260547853
},
"targetPosition": {
- "x": 24789.356993272086,
- "y": 30247.495915209296
+ "x": 24665.09292456016,
+ "y": 31191.37522619189
},
"floatingObject": {
"isPinned": false,
@@ -2764,12 +1154,12 @@
"id": "e9c68608-35c6-4d9e-abfb-afa8923e8e76",
"savedPayload": {
"position": {
- "x": 24789.356993272086,
- "y": 30247.495915209296
+ "x": 24665.09292456016,
+ "y": 31191.37522619189
},
"targetPosition": {
- "x": 24939.356993272086,
- "y": 30507.30353634463
+ "x": 24877.224958916122,
+ "y": 30979.243191835925
},
"floatingObject": {
"isPinned": false,
@@ -2813,8 +1203,8 @@
"id": "10f95e66-36a6-48f0-ba05-79262db0f1db",
"savedPayload": {
"position": {
- "x": 24939.356993272086,
- "y": 30507.30353634463
+ "x": 24877.224958916122,
+ "y": 30979.243191835925
},
"targetPosition": {
"x": 25089.356993272086,
@@ -2937,12 +1327,12 @@
"id": "e5f59e02-b5bd-4f90-be9e-b0fc81e504f0",
"savedPayload": {
"position": {
- "x": 25637.4472110294,
- "y": 28133.58673097809
+ "x": 26187.032580051455,
+ "y": 28205.941017447334
},
"targetPosition": {
- "x": 25927.224958916122,
- "y": 28055.941017447334
+ "x": 26139.356993272086,
+ "y": 28568.073051803298
},
"floatingObject": {
"isPinned": false,
@@ -2960,17 +1350,17 @@
"timeRange": {
"type": "Time Range",
"name": "New Time Range",
- "config": "{\n \"initialDatetime\": \"2021-02-01\",\n \"finalDatetime\": \"2021-08-01\"\n}",
+ "config": "{\n \"initialDatetime\": \"2021-02-01\",\n \"finalDatetime\": \"2021-09-01\"\n}",
"project": "Foundations",
"id": "4dbf9300-4b51-4da7-87c8-0868330ed90a",
"savedPayload": {
"position": {
- "x": 25637.4472110294,
- "y": 27978.295303916577
+ "x": 26077.224958916122,
+ "y": 28315.748638582667
},
"targetPosition": {
- "x": 25927.224958916122,
- "y": 28055.941017447334
+ "x": 26139.356993272086,
+ "y": 28568.073051803298
},
"floatingObject": {
"isPinned": false,
@@ -2993,12 +1383,12 @@
"id": "924dfdbc-e555-4eef-87a2-848230d0a532",
"savedPayload": {
"position": {
- "x": 25715.09292456016,
- "y": 27843.80898309137
+ "x": 25927.224958916122,
+ "y": 28355.941017447334
},
"targetPosition": {
- "x": 25927.224958916122,
- "y": 28055.941017447334
+ "x": 26139.356993272086,
+ "y": 28568.073051803298
},
"floatingObject": {
"isPinned": false,
@@ -3021,12 +1411,12 @@
"id": "8226110d-a050-4858-8975-04c07e4282f1",
"savedPayload": {
"position": {
- "x": 25849.579245385365,
- "y": 27766.163269560613
+ "x": 25777.224958916122,
+ "y": 28315.748638582667
},
"targetPosition": {
- "x": 25927.224958916122,
- "y": 28055.941017447334
+ "x": 26139.356993272086,
+ "y": 28568.073051803298
},
"floatingObject": {
"isPinned": false,
@@ -3049,12 +1439,12 @@
"id": "8a64d2a7-ab3f-46aa-976e-93b257a2789d",
"savedPayload": {
"position": {
- "x": 26004.87067244688,
- "y": 27766.163269560613
+ "x": 25667.41733778079,
+ "y": 28205.941017447334
},
"targetPosition": {
- "x": 25927.224958916122,
- "y": 28055.941017447334
+ "x": 26139.356993272086,
+ "y": 28568.073051803298
},
"floatingObject": {
"isPinned": false,
@@ -3072,12 +1462,12 @@
"id": "a5906b01-27b5-4a09-8b36-f8aa3110cfe1",
"savedPayload": {
"position": {
- "x": 25927.224958916122,
- "y": 28055.941017447334
+ "x": 26139.356993272086,
+ "y": 28568.073051803298
},
"targetPosition": {
- "x": 26139.356993272086,
- "y": 28268.073051803298
+ "x": 25927.224958916122,
+ "y": 28780.20508615926
},
"floatingObject": {
"isPinned": false,
@@ -3099,12 +1489,12 @@
"id": "f3c821fc-fad5-458a-b6a1-e678aa7c639e",
"savedPayload": {
"position": {
- "x": 26139.356993272086,
- "y": 27968.073051803298
+ "x": 25502.960890204195,
+ "y": 29504.46915487119
},
"targetPosition": {
- "x": 26139.356993272086,
- "y": 28268.073051803298
+ "x": 25715.09292456016,
+ "y": 29292.337120515225
},
"floatingObject": {
"isPinned": false,
@@ -3139,12 +1529,12 @@
"id": "b28b503f-8381-4c36-9853-8d21e9c5b4ba",
"savedPayload": {
"position": {
- "x": 26351.48902762805,
- "y": 28055.941017447334
+ "x": 25415.09292456016,
+ "y": 29292.337120515225
},
"targetPosition": {
- "x": 26139.356993272086,
- "y": 28268.073051803298
+ "x": 25715.09292456016,
+ "y": 29292.337120515225
},
"floatingObject": {
"isPinned": false,
@@ -3175,12 +1565,12 @@
"id": "5fba5feb-2785-47dc-b7f0-38caf58a30d6",
"savedPayload": {
"position": {
- "x": 26139.356993272086,
- "y": 28268.073051803298
+ "x": 25715.09292456016,
+ "y": 29292.337120515225
},
"targetPosition": {
- "x": 26139.356993272086,
- "y": 28568.073051803298
+ "x": 25927.224958916122,
+ "y": 29080.20508615926
},
"floatingObject": {
"isPinned": false,
@@ -3198,8 +1588,8 @@
"id": "0b4d53ae-2465-4d95-a0fa-08bb61267dd6",
"savedPayload": {
"position": {
- "x": 26139.356993272086,
- "y": 28568.073051803298
+ "x": 25927.224958916122,
+ "y": 29080.20508615926
},
"targetPosition": {
"x": 26139.356993272086,
@@ -3678,12 +2068,12 @@
"id": "fb54fd74-29a2-4713-ad06-31460a9f5961",
"savedPayload": {
"position": {
- "x": 26139.356993272086,
- "y": 29468.073051803298
+ "x": 24328.696821492267,
+ "y": 31827.77132925978
},
"targetPosition": {
- "x": 25989.356993272086,
- "y": 29727.88067293863
+ "x": 24540.82885584823,
+ "y": 31615.639294903816
},
"floatingObject": {
"isPinned": false,
@@ -3702,12 +2092,12 @@
"id": "e7848996-3c00-4781-a902-79aec86ac34d",
"savedPayload": {
"position": {
- "x": 25989.356993272086,
- "y": 29727.88067293863
+ "x": 24540.82885584823,
+ "y": 31615.639294903816
},
"targetPosition": {
- "x": 25839.356993272086,
- "y": 29987.688294073963
+ "x": 24752.960890204195,
+ "y": 31403.507260547853
},
"floatingObject": {
"isPinned": false,
@@ -3739,12 +2129,12 @@
"id": "a2847923-c0ca-43c4-b3a3-bf366fae5fe3",
"savedPayload": {
"position": {
- "x": 25839.356993272086,
- "y": 29987.688294073963
+ "x": 24752.960890204195,
+ "y": 31403.507260547853
},
"targetPosition": {
- "x": 25689.356993272086,
- "y": 30247.495915209296
+ "x": 24965.09292456016,
+ "y": 31191.37522619189
},
"floatingObject": {
"isPinned": false,
@@ -3800,12 +2190,12 @@
"id": "af06dd3e-09e1-4b2b-b283-1c5fe828ebba",
"savedPayload": {
"position": {
- "x": 25689.356993272086,
- "y": 30247.495915209296
+ "x": 24965.09292456016,
+ "y": 31191.37522619189
},
"targetPosition": {
- "x": 25539.356993272086,
- "y": 30507.30353634463
+ "x": 25177.224958916122,
+ "y": 30979.243191835925
},
"floatingObject": {
"isPinned": false,
@@ -3849,8 +2239,8 @@
"id": "7bff45f1-0f5a-41c1-b2ea-b31f7e583a66",
"savedPayload": {
"position": {
- "x": 25539.356993272086,
- "y": 30507.30353634463
+ "x": 25177.224958916122,
+ "y": 30979.243191835925
},
"targetPosition": {
"x": 25389.356993272086,
@@ -17729,8 +16119,8 @@
"id": "1017b30d-de1b-4212-991e-9fd0a5b6c814",
"savedPayload": {
"position": {
- "x": 20635.079365950267,
- "y": 30898.589170884043
+ "x": 20133.169583707582,
+ "y": 31188.366918770764
},
"targetPosition": {
"x": 20345.301618063546,
@@ -17793,8 +16183,8 @@
"id": "705c4a67-787a-48cd-a3dc-3a557438bf0b",
"savedPayload": {
"position": {
- "x": 20635.079365950267,
- "y": 31053.880597945557
+ "x": 20045.301618063546,
+ "y": 30976.2348844148
},
"targetPosition": {
"x": 20345.301618063546,
@@ -17918,8 +16308,8 @@
"id": "ba6f3d5c-b36b-49d9-947f-392068109169",
"savedPayload": {
"position": {
- "x": 20749.121182548915,
- "y": 31400.498953126727
+ "x": 20459.343434662194,
+ "y": 31778.144666657485
},
"targetPosition": {
"x": 20459.343434662194,
@@ -17982,8 +16372,8 @@
"id": "c90be267-90f9-45ae-b225-0578adb4aad9",
"savedPayload": {
"position": {
- "x": 20671.475469018158,
- "y": 31690.27670101345
+ "x": 20159.343434662194,
+ "y": 31478.144666657485
},
"targetPosition": {
"x": 20459.343434662194,
@@ -86291,12 +84681,12 @@
"id": "a57649e1-b802-48f5-b541-29c228d1be14",
"savedPayload": {
"position": {
- "x": 14423.236922040076,
- "y": 31095.398317657367
+ "x": 14217.036675019499,
+ "y": 32207.95529180573
},
"targetPosition": {
- "x": 14315.726537176486,
- "y": 31375.472445606527
+ "x": 14139.390961488743,
+ "y": 31918.17754391901
},
"floatingObject": {
"isPinned": false,
@@ -86319,12 +84709,12 @@
"id": "f8177627-f054-4cd4-a8d4-98b58f9ad36f",
"savedPayload": {
"position": {
- "x": 14548.870325613578,
- "y": 31186.676328291574
+ "x": 14061.745247957988,
+ "y": 32207.95529180573
},
"targetPosition": {
- "x": 14315.726537176486,
- "y": 31375.472445606527
+ "x": 14139.390961488743,
+ "y": 31918.17754391901
},
"floatingObject": {
"isPinned": false,
@@ -86342,8 +84732,8 @@
"id": "66877ac2-3658-4a3d-8060-997348721ea6",
"savedPayload": {
"position": {
- "x": 14315.726537176486,
- "y": 31375.472445606527
+ "x": 14139.390961488743,
+ "y": 31918.17754391901
},
"targetPosition": {
"x": 14139.390961488743,
@@ -87290,12 +85680,12 @@
"id": "8512553a-fad6-4076-b8d5-81273e84a151",
"savedPayload": {
"position": {
- "x": 14444.443443795593,
- "y": 32303.336637150962
+ "x": 13698.55202226939,
+ "y": 31011.414798137805
},
"targetPosition": {
- "x": 14261.411954411484,
- "y": 31892.24118121179
+ "x": 13963.055385801003,
+ "y": 31375.472445606527
},
"floatingObject": {
"isPinned": false,
@@ -87313,8 +85703,8 @@
"id": "dea0ab59-7c68-4c49-936c-db8552ab013a",
"savedPayload": {
"position": {
- "x": 14261.411954411484,
- "y": 31892.24118121179
+ "x": 13963.055385801003,
+ "y": 31375.472445606527
},
"targetPosition": {
"x": 14139.390961488743,
diff --git a/Projects/TensorFlow/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/MLDataManager.js b/Projects/TensorFlow/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/MLDataManager.js
index 83b2a00db..1150b7d32 100644
--- a/Projects/TensorFlow/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/MLDataManager.js
+++ b/Projects/TensorFlow/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/MLDataManager.js
@@ -22,8 +22,6 @@ exports.newMLDataObj = function(featureLen, labelLen) {
/* Variables Section: */
var _features = {}; // Features Object
var _labels = {}; // Labels Object
- var feats = []
- var labs = []
//var _rank = []; // Future expansion placeholder variable. [Feature Tensor Rank, Label Tensor Rank]
/* stats{} : Statistics producer object:
diff --git a/README.md b/README.md
index 38b4a167a..41f58b20b 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@ Superalgos is not just another open-source project. We are an open and welcoming
You will notice the difference as soon as you join the [Telegram Community Group](https://t.me/superalgoscommunity) or the new [Discord Server](https://discord.gg/CGeKC6WQQb)!
-> Can't wait to contribute? Sstart by giving a star to this repository in the top-right corner of this page!
+> Can't wait to contribute? Start by giving a star to this repository in the top-right corner of this page!

@@ -135,7 +135,11 @@ After the Superalgos directory has been installed, the final step of installatio
cd Superalgos
```
-That should take you inside the Superalgos folder created by the `git clone` command earlier. Now, run the following command:
+That should take you inside the Superalgos folder created by the `git clone` command earlier.
+
+Now, you need to install dependencies, and there are two options:
+
+**A.** To install all basic dependencies run:
```
node setup
@@ -145,6 +149,19 @@ Then wait until you are able to type within the terminal again.
This command will install and configure all additional dependencies needed by Superalgos. It will also install desktop and start menu shortcuts.
+**B.** If you intend to use the experimental implementation of the TensorFlow Project within Superalgos, then run:
+
+```
+node setup tensorflow
+```
+
+This command will install all dependencies plus TensorFlow dependencies.
+
+**NOTE FOR WINDOWS USERS INSTALLING TENSORFLOW DEPENDENCIES:** You may get an error at the end of the set up process. If you do, please follow the instructions following the error message.
+
+
+
+
**NOTE FOR USERS INSTALLING MULTIPLE INSTANCES OF SUPERALGOS ON THE SAME MACHINE:** In order to avoid name conflicts between shortcuts, make sure to rename each Superalgos directory before running `node setup`.
Congratulations your installation is complete!
@@ -196,7 +213,7 @@ If you are having difficulty running the node setup command here are a few commo
**A.** To run Superalgos, go to the Superalgos directory/folder and run this command:
```
-node run
+node platform
```
The Client will run on your terminal and the GUI will launch on your default browser. If Chrome/Safari is not your default browser, copy the URL, close the browser, open Chrome/Safari, and paste the URL. Be patient... it takes a few seconds to fully load the GUI.
@@ -555,11 +572,6 @@ Or follow [Superalgos on Facebook](https://www.facebook.com/superalgos).
Superalgos is a Community Project built by users for users. Learn [how you may contribute](https://superalgos.org/community-contribute.shtml).
-
-## Top Contributors
-
-Luis Fernando Molina, Julian Molina, Andreja Cobeljic, Ira Miller, matbenitez, bearcanrun, nikolabjelo, 9808us, pmmax, suttridge, Basalt09, Mhnramin, 0xperez, infin1t3, benitezme, whtv, cozed-gh, Eduardo678-dotcom, Smidy13, teehanming, 64bittuning, joenij, apronotti, Noeljarillo, ssplatt, rico4dev, DougJCook, mane, Cordo-van-Saviour, CarnivalBen, Sil3ntLight, pisukesoramame, Edodi, harrellbm, CaptainJeff, Jeff Braun, Francisco J. Santillán, Norman, Viktoria B., Guillermo V., Daniel J., Javier A., Gustavo J., Romina GS, Pedro P., Thais M., Andrey M., Loui M., Natalia M., Bashar A., Carlos V., Diego M., Sebastian E., Bogdan P., Marko V., Igor S., Niksa K., Rodrigo M., Nicanor M., Mateo H., Lan T., Leon A., Uroš R., Filip M., Vladimir J. and Pavle B., brycey12, GENS-Tools, rjkilpatrick, superharoun, frysee, RalfWeiss
-
# License
Superalgos is open-source software released under [Apache License 2.0](LICENSE).
diff --git a/TaskServer/.vscode/settings.json b/TaskServer/.vscode/settings.json
index 0bf7da203..e94f27f6f 100644
--- a/TaskServer/.vscode/settings.json
+++ b/TaskServer/.vscode/settings.json
@@ -10,6 +10,7 @@
"**/Data-Storage": true,
"**/Documentation": true,
"**/Log-Files": true,
+ "**/node_modules": true,
"**/Deprecated-Code": true
},
"search.maintainFileSearchCache": true
diff --git a/runDesktop.js b/desktop.js
similarity index 96%
rename from runDesktop.js
rename to desktop.js
index f6e04a1d2..ced762c1a 100644
--- a/runDesktop.js
+++ b/desktop.js
@@ -42,7 +42,9 @@ Setting up external dependencies.
SA.nodeModules = {
fs: require('fs'),
web3: require('web3'),
- ws: require('ws')
+ ws: require('ws'),
+ open: require('open'),
+ http: require('http')
}
/*
diff --git a/runNetwork.js b/network.js
similarity index 100%
rename from runNetwork.js
rename to network.js
diff --git a/package-lock.json b/package-lock.json
index 11e53b3fd..469e05fe0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -784,6 +784,11 @@
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
"integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="
},
+ "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=="
+ },
"define-properties": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
@@ -1379,6 +1384,11 @@
"minimalistic-crypto-utils": "^1.0.1"
}
},
+ "http": {
+ "version": "0.0.1-security",
+ "resolved": "https://registry.npmjs.org/http/-/http-0.0.1-security.tgz",
+ "integrity": "sha512-RnDvP10Ty9FxqOtPZuxtebw1j4L/WiqNMDtuc1YMH1XQm5TgDRaR1G9u8upL6KD1bXHSp9eSXo/ED+8Q7FAr+g=="
+ },
"http-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
@@ -1505,6 +1515,11 @@
"has-tostringtag": "^1.0.0"
}
},
+ "is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="
+ },
"is-function": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz",
@@ -1598,6 +1613,14 @@
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
},
+ "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"
+ }
+ },
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
@@ -1948,6 +1971,16 @@
"wrappy": "1"
}
},
+ "open": {
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/open/-/open-8.2.1.tgz",
+ "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==",
+ "requires": {
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
+ }
+ },
"p-cancelable": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
diff --git a/package.json b/package.json
index 98b8d8879..d083084f8 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,8 @@
{
"dependencies": {
+ "http": "0.0.1-security",
"node-fetch": "^2.6.1",
+ "open": "^8.2.1",
"web3": "^1.5.2",
"ws": "^8.2.1"
}
diff --git a/platform.js b/platform.js
new file mode 100644
index 000000000..8b5771861
--- /dev/null
+++ b/platform.js
@@ -0,0 +1,110 @@
+
+if (
+ process.argv.includes("help") ||
+ process.argv.includes("-help") ||
+ process.argv.includes("--help") ||
+ process.argv.includes("h") ||
+ process.argv.includes("-h") ||
+ process.argv.includes("--h") ||
+ process.argv.includes("/h") ||
+ process.argv.includes("/help")) {
+
+ console.log('Superalgos')
+ console.log('')
+ console.log('VERSION: Beta 11')
+ console.log('')
+ console.log('WEB: https://www.superalgos.org')
+ console.log('')
+ console.log('GITHUB: https://www.github.com/Superalgos')
+ console.log('')
+ console.log('TELEGRAM COMMUNITY: https://t.me/superalgoscommunity')
+ console.log('')
+ console.log('USAGE: node runPlatform [help] [noBrowser] [minMemo]')
+ console.log('')
+ console.log('OPTIONS:')
+ console.log('')
+ console.log(' help: Optional. Use it to see this helping information.')
+ console.log(' noBrowser: Optional. Use it to launch Superalgos Platform Client only. The Superalgos Platform UI will not be loaded.')
+ console.log(' minMemo: Optional. Use it when your hardware has less than 8 Gb or memory.')
+ console.log('')
+ console.log('If you are having an error while trying to run the Superalgos Platform Client, consider this:')
+
+ fatalErrorHelp()
+ return
+}
+
+const OS = require("os")
+let totalRAM = OS.totalmem() // Get total ram installed
+totalRAM = totalRAM / 1024 / 1024
+let optimalRAM = totalRAM * 0.85 // Use 85% of installed RAM
+let maxOldSpaceSize = "--max-old-space-size=" + (optimalRAM.toFixed(0)).toString()
+let options
+
+console.log('')
+console.log("Total RAM istalled in this system is ........................ " + (totalRAM / 1024).toFixed(2) + " GB")
+if (process.argv.includes("minMemo")) {
+ options = {
+ stdio: 'inherit'
+ }
+ console.log("Total RAM available for Superalgos is ....................... 512 MB")
+} else {
+ options = {
+ execArgv: [maxOldSpaceSize],
+ stdio: 'inherit'
+ }
+ console.log("Total RAM available for Superalgos is ....................... " + (optimalRAM / 1024).toFixed(2) + " GB")
+ console.log('')
+ console.log('If you would like to enable less RAM than that, use the minMemo flag. Note: RAM will be allocated only if needed.')
+}
+console.log('')
+console.log('OPTIONS ACCEPTED:')
+console.log('')
+let optionsAccepted = 0
+
+
+if (process.argv.includes("minMemo")) {
+ optionsAccepted++
+ console.log('minMemo ..................................................... Running with Minimun Required Memory.')
+}
+
+if (process.argv.includes("noBrowser")) {
+ optionsAccepted++
+ console.log('noBrowser ................................................... Running without User Interface.')
+}
+
+if (optionsAccepted === 0) {
+ console.log('none ........................................................ Running without any command line options.')
+}
+console.log('')
+console.log('')
+
+const fs = require('fs')
+const path = './Platform/node_modules'
+if ( fs.existsSync(path) ) {
+
+ try {
+ const { fork } = require('child_process')
+ fork('./Platform/PlatformApp.js', process.argv, options)
+ } catch (err) {
+ console.log('')
+ console.log('Fail to create Superalgos Platform Client Process.')
+ console.log('')
+
+ fatalErrorHelp()
+ }
+} else {
+ console.log('')
+ console.log('ERROR: node_modules does not exist. Try running node setup to solve this issue. Then try again. You can finded detailed instructions for this in the ReadMe.')
+ console.log('')
+}
+
+
+function fatalErrorHelp() {
+ console.log('')
+ console.log('* If your device does not have MORE than 8GB of RAM then please use the minMemo option.')
+ console.log('* If your OS does not have a user interface, please use the noBrowser option.')
+ console.log('')
+ console.log('If you continue having trouble to start the Superalgos Platform Client try:')
+ console.log('')
+ console.log('node runPlatform minMemo noBrowser')
+}
diff --git a/run.js b/run.js
index d2af79959..0c9c4b52f 100644
--- a/run.js
+++ b/run.js
@@ -1,112 +1,7 @@
-
-if (
- process.argv.includes("help") ||
- process.argv.includes("-help") ||
- process.argv.includes("--help") ||
- process.argv.includes("h") ||
- process.argv.includes("-h") ||
- process.argv.includes("--h") ||
- process.argv.includes("/h") ||
- process.argv.includes("/help")) {
-
- console.log('Superalgos')
- console.log('')
- console.log('VERSION: Beta 11')
- console.log('')
- console.log('WEB: https://www.superalgos.org')
- console.log('')
- console.log('GITHUB: https://www.github.com/Superalgos')
- console.log('')
- console.log('DOCUMENTATION: https://docs.superalgos.org/')
- console.log('')
- console.log('TELEGRAM SUPPORT: https://t.me/superalgoscommunity')
- console.log('')
- console.log('USAGE: node run [help] [noBrowser] [minMemo]')
- console.log('')
- console.log('OPTIONS:')
- console.log('')
- console.log(' help: Optional. Use it to see this helping information.')
- console.log(' noBrowser: Optional. Use it to launch Superalgos Client only. The UI will not be loaded.')
- console.log(' minMemo: Optional. Use it when your hardware has less than 8 Gb or memory.')
- console.log('')
- console.log('If you are having an error while trying to run this Client, consider this:')
-
- fatalErrorHelp()
- return
-}
-
-const OS = require("os")
-let totalRAM = OS.totalmem() // Get total ram installed
-totalRAM = totalRAM / 1024 / 1024
-let optimalRAM = totalRAM * 0.85 // Use 85% of installed RAM
-let maxOldSpaceSize = "--max-old-space-size=" + (optimalRAM.toFixed(0)).toString()
-let options
-
+console.log('Superalgos is growing! In addition to the Platform for algo-traders, there is a P2P Network (under development) and a Social Trading Desktop App (under development).')
console.log('')
-console.log("Total RAM istalled in this system is ........................ " + (totalRAM / 1024).toFixed(2) + " GB")
-if (process.argv.includes("minMemo")) {
- options = {
- stdio: 'inherit'
- }
- console.log("Total RAM available for Superalgos is ....................... 512 MB")
-} else {
- options = {
- execArgv: [maxOldSpaceSize],
- stdio: 'inherit'
- }
- console.log("Total RAM available for Superalgos is ....................... " + (optimalRAM / 1024).toFixed(2) + " GB")
- console.log('')
- console.log('If you would like to enable less RAM than that, use the minMemo flag. Note: RAM will be allocated only if needed.')
-}
+console.log('For that reason, the "node run" command has been deprecated. Please, use one of these instead:')
console.log('')
-console.log('OPTIONS ACCEPTED:')
-console.log('')
-let optionsAccepted = 0
-
-
-if (process.argv.includes("minMemo")) {
- optionsAccepted++
- console.log('minMemo ..................................................... Running with Minimun Required Memory.')
-}
-
-if (process.argv.includes("noBrowser")) {
- optionsAccepted++
- console.log('noBrowser ................................................... Running without User Interface.')
-}
-
-if (optionsAccepted === 0) {
- console.log('none ........................................................ Running without any command line options.')
-}
-console.log('')
-console.log('')
-
-const fs = require('fs')
-const path = './Client/node_modules'
-if ( fs.existsSync(path) ) {
-
- try {
- const { fork } = require('child_process')
- fork('./Client/client.js', process.argv, options)
- } catch (err) {
- console.log('')
- console.log('Fail to create Client Process.')
- console.log('')
-
- fatalErrorHelp()
- }
-} else {
- console.log('')
- console.log('ERROR: node_modules does not exist. Try running node setup to solve this issue. Then try again. You can finded detailed instructions for this in the ReadMe.')
- console.log('')
-}
-
-
-function fatalErrorHelp() {
- console.log('')
- console.log('* If your device does not have MORE than 8GB of RAM then please use the minMemo option.')
- console.log('* If your OS does not have a user interface, please use the noBrowser option.')
- console.log('')
- console.log('If you continue having trouble to start the Client try:')
- console.log('')
- console.log('node run minMemo noBrowser')
-}
+console.log('node platform --------------- Runs the Superalgos Platform for algo-tarders.')
+console.log('node network --------------- Runs the P2P Network for social trading.')
+console.log('node desktop --------------- Runs the Desktop App for crypto users.')
\ No newline at end of file
diff --git a/setup.js b/setup.js
index 3651482fc..628d55230 100644
--- a/setup.js
+++ b/setup.js
@@ -28,15 +28,28 @@ if (process.argv.includes("noShortcuts")) {
// Create Operating System compatable paths to each node_modules directory.
let nodeModulesDirs = [
- path.join( process.cwd(), "Client"),
+ path.join( process.cwd(), "Platform"),
path.join( process.cwd(), "Projects", "Foundations", "TS", "Bot-Modules", "Sensor-Bot", "Exchange-Raw-Data"),
path.join( process.cwd(), "Projects", "Foundations", "TS", "Bot-Modules", "API-Data-Fetcher-Bot"),
path.join( process.cwd(), "Projects", "Foundations", "TS", "Bot-Modules", "Trading-Bot", "Announcements"),
path.join( process.cwd(), "Projects", "Foundations", "TS", "Bot-Modules", "Trading-Bot", "Low-Frequency-Trading", "APIs"),
- path.join( process.cwd(), "Projects", "Foundations", "TS", "Task-Modules"),
- path.join( process.cwd(), "Projects", "TensorFlow", "TS", "Bot-Modules", "Learning-Bot", "Low-Frequency-Learning")
+ path.join( process.cwd(), "Projects", "Foundations", "TS", "Task-Modules")
];
+if (
+ process.argv.includes("TensorFlow") ||
+ process.argv.includes("tensorflow") ||
+ process.argv.includes("--TensorFlow") ||
+ process.argv.includes("-TensorFlow") ||
+ process.argv.includes("--tensorflow") ||
+ process.argv.includes("--tensorflow")
+ ) {
+
+ nodeModulesDirs = [
+ path.join( process.cwd(), "Projects", "TensorFlow", "TS", "Bot-Modules", "Learning-Bot", "Low-Frequency-Learning")
+ ]
+}
+
// Check if WinOS because extra dependencies may be required for tfjs:
var tfjsWinInstallFlag = false;
if (platform === 'win32') { // *Note: win32 == win32 || win64