Files
Superalgos/Projects/Network/SA/Modules/UserProfiles.js
T

171 lines
8.7 KiB
JavaScript

exports.newNetworkModulesUserProfiles = function newNetworkModulesUserProfiles() {
/*
This module is useful for all Apps that needs to operate with all User Profiles loaded in
memory maps.
User Profiles are plugins of the Governance System. Besides the info they carry, we also
need to read the blockchain for each one in order to calculate their ranking.
*/
let thisObject = {
/* Framework Functions */
initialize: initialize,
finalize: finalize
}
return thisObject
function finalize() {
}
async function initialize(nodeCodeName, p2pNetworkClientIdentity) {
await loadAppSchemas()
await loadProfiles()
async function loadAppSchemas() {
let promise = new Promise((resolve, reject) => {
let project = 'Governance'
let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/'
let folder = 'App-Schema'
SA.projects.foundations.utilities.filesAndDirectories.getAllFilesInDirectoryAndSubdirectories(filePath + folder, onFilesReady)
function onFilesReady(files) {
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 = SA.nodeModules.fs.readFileSync(fileToRead)
let schemaDocument
try {
schemaDocument = JSON.parse(fileContent)
SA.projects.foundations.globals.schemas.APP_SCHEMA_MAP.set(project + '-' + schemaDocument.type, schemaDocument)
} catch (err) {
console.log('[WARN] loadAppSchemas -> Error Parsing JSON File: ' + fileToRead + '. Error = ' + err.stack)
return
}
}
resolve()
}
}
)
return promise
}
async function loadProfiles() {
let pluginFileNames = await SA.projects.communityPlugins.utilities.plugins.getPluginFileNames(
'Governance',
'User-Profiles'
)
for (let i = 0; i < pluginFileNames.length; i++) {
let pluginFileName = pluginFileNames[i]
let pluginFileContent = await SA.projects.communityPlugins.utilities.plugins.getPluginFileContent(
'Governance',
'User-Profiles',
pluginFileName
)
let userProfilePlugin = JSON.parse(pluginFileContent)
let config = JSON.parse(userProfilePlugin.config)
let signatureObject = config.signature
let web3 = new SA.nodeModules.web3()
let blockchainAccount = web3.eth.accounts.recover(signatureObject)
let ranking = 0 // TODO: read the blockchain balance and transactions from the Treasury Account to calculate the profile ranking.
let userProfileId = userProfilePlugin.id
let userHandle = config.signature.message
let userProfile = SA.projects.socialTrading.modules.socialGraphUserProfile.newSocialTradingModulesSocialGraphUserProfile()
userProfile.initialize(
userProfileId,
userHandle,
blockchainAccount,
ranking
)
SA.projects.network.globals.memory.maps.USER_PROFILES_BY_ID.set(userProfileId, userProfile)
SA.projects.network.globals.memory.maps.USER_PROFILES_BY_HANDLE.set(userHandle, userProfile)
SA.projects.network.globals.memory.maps.USER_PROFILES_BY_BLOKCHAIN_ACCOUNT.set(blockchainAccount, userProfile)
let algoTradersPlatform = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(userProfilePlugin.userApps, 'Algo Traders Platform')
let socialTradingDesktopApp = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(userProfilePlugin.userApps, 'Social Trading Desktop App')
let socialTradingMobileApp = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(userProfilePlugin.userApps, 'Social Trading Mobile App')
let socialTradingServerApp = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(userProfilePlugin.userApps, 'Social Trading Server App')
let taskServerApp = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(userProfilePlugin.userApps, 'Task Server App')
let socialTradingBots = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(userProfilePlugin.userBots, 'Social Trading Bot')
let socialPersonas = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(userProfilePlugin.socialPersonas, 'Social Persona')
let p2pNetworkNodes = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(userProfilePlugin.p2pNetworkNodes, 'P2P Network Node')
checkNwetworkClients(algoTradersPlatform)
checkNwetworkClients(socialTradingDesktopApp)
checkNwetworkClients(socialTradingMobileApp)
checkNwetworkClients(socialTradingServerApp)
checkNwetworkClients(taskServerApp)
checkNwetworkClients(socialTradingBots)
checkNwetworkClients(socialPersonas)
checkNwetworkClients(p2pNetworkNodes)
function checkNwetworkClients(netwokClients) {
for (let j = 0; j < netwokClients.length; j++) {
let networkClient = netwokClients[j]
let signingAccount = networkClient.signingAccount
if (signingAccount === undefined) { continue }
let config = JSON.parse(signingAccount.config)
let signatureObject = config.signature
let web3 = new SA.nodeModules.web3()
let blockchainAccount = web3.eth.accounts.recover(signatureObject)
SA.projects.network.globals.memory.maps.USER_PROFILES_BY_BLOKCHAIN_ACCOUNT.set(blockchainAccount, userProfile)
/*
If the Signing Account is for a P2P node, we will add the node to the array of available nodes at the p2p network.
*/
if (
networkClient.type === "P2P Network Node" &&
networkClient.config !== undefined
) {
let config
try {
config = JSON.parse(networkClient.config)
} catch (err) {
console.log('P2P Network Node Config not in JSON format. userProfileHandle = ' + userHandle + ' NodeId = ' + networkClient.id)
continue
}
if (config.host === undefined) {
continue
}
if (config.webSocketsPort === undefined) {
continue
}
let p2pNetworkNode = SA.projects.network.modules.p2pNetworkNode.newNetworkModulesP2PNetworkNode()
p2pNetworkNode.initialize(networkClient, userProfile, blockchainAccount)
SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES.push(p2pNetworkNode)
}
/*
Now, we will extract the information from the User Profile, specifically of our identity at the p2p network.
*/
if (
networkClient.id === SA.secrets.map.get(nodeCodeName).nodeId
) {
p2pNetworkClientIdentity.node = networkClient
p2pNetworkClientIdentity.blockchainAccount = blockchainAccount
p2pNetworkClientIdentity.userProfile = userProfile
}
}
}
}
}
}
}