Files
Superalgos/Projects/Social-Trading/NT/Modules/Queries/Events.js
T

276 lines
12 KiB
JavaScript

exports.newSocialTradingModulesQueriesEvents = function newSocialTradingModulesQueriesEvents() {
/*
This is the query executed to fill the timeline of a certain User or Bot Profile.
*/
let thisObject = {
profile: undefined,
initialIndex: undefined,
amountRequested: undefined,
direction: undefined,
execute: execute,
initialize: initialize,
finalize: finalize
}
return thisObject
function finalize() {
thisObject.profile = undefined
}
function initialize(queryReceived) {
NT.projects.socialTrading.utilities.queriesValidations.profilesValidations(queryReceived, thisObject)
NT.projects.socialTrading.utilities.queriesValidations.arrayValidations(queryReceived, thisObject, NT.memory.arrays.EVENTS)
}
function execute() {
let response = []
switch (thisObject.direction) {
case NT.projects.socialTrading.globals.queryConstants.DIRECTION_FUTURE: {
for (let i = thisObject.initialIndex; i < thisObject.initialIndex + thisObject.amountRequested; i++) {
let event = NT.memory.arrays.EVENTS[i]
if (event === undefined) { break }
checkEventContext(event)
}
break
}
case NT.projects.socialTrading.globals.queryConstants.DIRECTION_PAST: {
for (let i = thisObject.initialIndex; i > thisObject.initialIndex - thisObject.amountRequested; i--) {
let event = NT.memory.arrays.EVENTS[i]
if (event === undefined) { break }
checkEventContext(event)
}
break
}
}
return response
function checkEventContext(event) {
/*
For an event to be returned at the response of this query, it needs to be related
to the profile making the query. How it can be related?
1. The Emitter or Target profile must be the same as the Context Profile.
2. The Emitter or Traget profile must be at the Following map of the Context Profile.
3. The Emmiter or Target post must be belong to any profile at the Following of the Context Profile.
Any of the above happening, means that indeed it is related.
*/
let emitterUserProfile = NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_ID.get(eventReceived.emitterUserProfileId)
let emitterBotProfile = emitterUserProfile.bots.get(eventReceived.emitterBotProfileId)
let emitterPost = emitterUserProfile.posts.get(eventReceived.emitterPostHash)
let targetUserProfile = NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_ID.get(eventReceived.targetUserProfileId)
let targetBotProfile
let targetPost
if (targetUserProfile !== undefined) {
targetBotProfile = targetUserProfile.bots.get(eventReceived.targetBotProfileId)
targetPost = targetUserProfile.posts.get(eventReceived.targetPostHash)
}
/*
Test #1 : The Emitter or Target profile must be the same as the Context Profile.
*/
if (thisObject.profile.botProfileId === undefined) {
/*
The context is a User Profile
*/
if (emitterUserProfile.userProfileId === thisObject.profile.userProfileId) {
addToResponse(event)
return
}
if (targetUserProfile !== undefined) {
if (targetUserProfile.userProfileId === thisObject.profile.userProfileId) {
addToResponse(event)
return
}
}
} else {
/*
The context is a Bot Profile
*/
if (emitterBotProfile !== undefined) {
if (emitterBotProfile.botProfileId === thisObject.profile.botProfileId) {
addToResponse(event)
return
}
}
if (targetBotProfile !== undefined) {
if (targetBotProfile.botProfileId === thisObject.profile.botProfileId) {
addToResponse(event)
return
}
}
}
/*
Test #2 : The Emitter or Traget profile must be at the Following map of the Context Profile.
*/
if (thisObject.profile.botProfileId === undefined) {
/*
The context is a User Profile
*/
if (thisObject.profile.following.get(emitterUserProfile.userProfileId) !== undefined) {
addToResponse(event)
return
}
if (targetUserProfile !== undefined) {
if (thisObject.profile.following.get(targetUserProfile.userProfileId) !== undefined) {
addToResponse(event)
return
}
}
} else {
/*
The context is a Bot Profile
*/
if (emitterBotProfile !== undefined) {
if (thisObject.profile.following.get(emitterBotProfile.botProfileId) !== undefined) {
addToResponse(event)
return
}
}
if (targetBotProfile !== undefined) {
if (thisObject.profile.following.get(targetBotProfile.botProfileId) !== undefined) {
addToResponse(event)
return
}
}
}
/*
Test #3 : The Emmiter or Target post must be belong to any profile at the Following of the Context Profile.
*/
if (thisObject.profile.botProfileId === undefined) {
/*
The context is a User Profile
*/
if (emitterPost !== undefined) {
if (thisObject.profile.following.get(emitterPost.emitterUserProfileId) !== undefined) {
addToResponse(event)
return
}
}
if (emitterPost !== undefined) {
if (thisObject.profile.following.get(emitterPost.targetUserProfileId) !== undefined) {
addToResponse(event)
return
}
}
if (targetPost !== undefined) {
if (thisObject.profile.following.get(targetPost.emitterUserProfileId) !== undefined) {
addToResponse(event)
return
}
}
if (targetPost !== undefined) {
if (thisObject.profile.following.get(targetPost.targetUserProfileId) !== undefined) {
addToResponse(event)
return
}
}
} else {
/*
The context is a Bot Profile
*/
if (emitterPost !== undefined) {
if (thisObject.profile.following.get(emitterPost.emitterBotProfileId) !== undefined) {
addToResponse(event)
return
}
}
if (emitterPost !== undefined) {
if (thisObject.profile.following.get(emitterPost.targetBotProfileId) !== undefined) {
addToResponse(event)
return
}
}
if (targetPost !== undefined) {
if (thisObject.profile.following.get(targetPost.emitterBotProfileId) !== undefined) {
addToResponse(event)
return
}
}
if (targetPost !== undefined) {
if (thisObject.profile.following.get(targetPost.targetBotProfileId) !== undefined) {
addToResponse(event)
return
}
}
}
function addToResponse(event) {
let eventResponse = {
eventId: event.eventId,
eventType: event.eventType,
emitterUserProfileId: event.emitterUserProfileId,
targetUserProfileId: event.targetUserProfileId,
emitterBotProfileId: event.emitterBotProfileId,
targetBotProfileId: event.targetBotProfileId,
emitterPostHash: event.emitterPostHash,
targetPostHash: event.targetPostHash,
timestamp: event.timestamp,
botAsset: event.botAsset,
botExchange: event.botExchange,
botEnabled: event.botEnabled
}
if (emitterUserProfile !== undefined) {
let query = NT.projects.socialTrading.modules.queriesUserProfileStats.newSocialTradingModulesQueriesUserProfileStats()
query.initialize({ targetUserProfileId: event.emitterUserProfileId })
eventResponse.emitterUserProfile = query.execute()
query.finalize()
}
if (targetUserProfile !== undefined) {
let query = NT.projects.socialTrading.modules.queriesUserProfileStats.newSocialTradingModulesQueriesUserProfileStats()
query.initialize({ targetUserProfileId: event.targetUserProfileId })
eventResponse.targetUserProfile = query.execute()
query.finalize()
}
if (emitterBotProfile !== undefined) {
let query = NT.projects.socialTrading.modules.queriesBotProfileStats.newSocialTradingModulesQueriesBotProfileStats()
query.initialize({ targetUserProfileId: event.emitterUserProfileId, targetBotProfileId: emitterBotProfileId })
eventResponse.emitterBotProfile = query.execute()
query.finalize()
}
if (targetBotProfile !== undefined) {
let query = NT.projects.socialTrading.modules.queriesBotProfileStats.newSocialTradingModulesQueriesBotProfileStats()
query.initialize({ targetUserProfileId: event.targetUserProfileId, targetBotProfileId: targetBotProfileId })
eventResponse.targetBotProfile = query.execute()
query.finalize()
}
if (emitterPost !== undefined) {
eventResponse.emitterPost = addPost(emitterPost)
}
if (targetPost !== undefined) {
eventResponse.targetPost = addPost(targetPost)
}
response.push(eventResponse)
function addPost(post) {
let postResponse = {
emitterUserProfileId: post.emitterUserProfileId,
targetUserProfileId: post.targetUserProfileId,
emitterBotProfileId: post.emitterBotProfileId,
targetBotProfileId: post.targetBotProfileId,
emitterPostHash: post.emitterPostHash,
targetPostHash: post.targetPostHash,
postType: post.postType,
timestamp: post.timestamp,
repliesCount: post.replies.size,
reactions: Array.from(post.reactions)
}
return postResponse
}
}
}
}
}