From fc6495c51ebecfffe6489d09cf7f55d2e14fc139 Mon Sep 17 00:00:00 2001 From: NicN11 Date: Thu, 4 Nov 2021 06:54:15 +0100 Subject: [PATCH 01/20] User Profile NicN11 --- .../Plugins/User-Profiles/NicN11.json | 619 ++++++++++++++++++ 1 file changed, 619 insertions(+) create mode 100644 Projects/Governance/Plugins/User-Profiles/NicN11.json diff --git a/Projects/Governance/Plugins/User-Profiles/NicN11.json b/Projects/Governance/Plugins/User-Profiles/NicN11.json new file mode 100644 index 000000000..e13f05e99 --- /dev/null +++ b/Projects/Governance/Plugins/User-Profiles/NicN11.json @@ -0,0 +1,619 @@ +{ + "type": "User Profile", + "name": "NicN11", + "config": "{\n \"signature\": {\n \"message\": \"NicN11\",\n \"messageHash\": \"0xbe81c46b57813a4af2ef951d99fd2ffdd6ab837969858823e9b6a435c47a2b80\",\n \"v\": \"0x1c\",\n \"r\": \"0xacb71eb8660969cd5780e643dd2cb7ad487f02310cf74c0d846458fa50db08ad\",\n \"s\": \"0x48bc5b861a9cf201b71783c6e733b79e891ae7ddccab517ce847b0bb6dba1ff7\",\n \"signature\": \"0xacb71eb8660969cd5780e643dd2cb7ad487f02310cf74c0d846458fa50db08ad48bc5b861a9cf201b71783c6e733b79e891ae7ddccab517ce847b0bb6dba1ff71c\"\n }\n}", + "project": "Governance", + "tokenPowerSwitch": { + "type": "Token Power Switch", + "name": "New Token Power Switch", + "config": "{}", + "project": "Governance", + "tokenPowerSwitch": [], + "onboardingPrograms": { + "type": "Onboarding Programs", + "name": "New Onboarding Programs", + "config": "{\n \"percentage\": 0\n }", + "project": "Governance", + "airdropProgram": { + "type": "Airdrop Program", + "name": "New Airdrop Program", + "config": "{}", + "project": "Governance", + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "f4759d7d-623b-473f-a13c-816c12da6cab", + "savedPayload": { + "position": { + "x": 13849.000000000002, + "y": 4980.635444127544 + }, + "targetPosition": { + "x": 13999.000000000002, + "y": 5240.443065262876 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "1ec894c7-711b-4403-b2c0-8484f1409908", + "savedPayload": { + "position": { + "x": 13999.000000000002, + "y": 5240.443065262876 + }, + "targetPosition": { + "x": 14149.000000000002, + "y": 5500.250686398208 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "githubProgram": { + "type": "Github Program", + "name": "New Github Program", + "config": "{}", + "project": "Governance", + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "e47b6ce4-d49e-40ad-8f90-c030c66b4fae", + "savedPayload": { + "position": { + "x": 14749.000000000002, + "y": 5500.250686398208 + }, + "targetPosition": { + "x": 14449.000000000002, + "y": 5500.250686398208 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "9faf08f2-9e5b-43d9-a4f0-f6fd75e8fd23", + "savedPayload": { + "position": { + "x": 14449.000000000002, + "y": 5500.250686398208 + }, + "targetPosition": { + "x": 14149.000000000002, + "y": 5500.250686398208 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "6824ec14-68ad-40c6-90b3-d29d0f5a9d17", + "savedPayload": { + "position": { + "x": 14149.000000000002, + "y": 5500.250686398208 + }, + "targetPosition": { + "x": 13999.000000000002, + "y": 5760.05830753354 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "communityBuildingPrograms": { + "type": "Community Building Programs", + "name": "New Community Building Programs", + "config": "{\n \"percentage\": 100\n }", + "project": "Governance", + "referralProgram": { + "type": "Referral Program", + "name": "New Referral Program", + "config": "{}", + "project": "Governance", + "userReferrers": [ + { + "type": "User Referrer", + "name": "Julian-Molina", + "config": "{}", + "project": "Governance", + "id": "3ef87fef-4090-4a05-95bf-4e7f0a75df5e", + "savedPayload": { + "position": { + "x": 14258.807621135333, + "y": 5610.05830753354 + }, + "targetPosition": { + "x": 14408.807621135333, + "y": 5869.865928668872 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "User Profile", + "name": "Julian-Molina", + "id": "b85aaac1-0708-4aec-97f9-bc3cc70e530a" + }, + "referenceParentCombinedNodePath": [ + [ + "Julian-Molina", + "User Profile" + ] + ] + } + } + ], + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "6e420922-482e-4e86-be7e-ca5ea9766b2e", + "savedPayload": { + "position": { + "x": 14668.615242270664, + "y": 5719.865928668872 + }, + "targetPosition": { + "x": 14408.807621135333, + "y": 5869.865928668872 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "tokensBonus": { + "type": "Tokens Bonus", + "name": "New Tokens Bonus", + "project": "Governance", + "id": "8e2bf5f7-8028-4ca5-97ac-c781d84703d2", + "savedPayload": { + "position": { + "x": 14558.807621135333, + "y": 6129.6735498042035 + }, + "targetPosition": { + "x": 14408.807621135333, + "y": 5869.865928668872 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "b325c52b-f905-439d-b0b9-ea3077c9723e", + "savedPayload": { + "position": { + "x": 14408.807621135333, + "y": 5869.865928668872 + }, + "targetPosition": { + "x": 14149.000000000002, + "y": 6019.865928668872 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "supportProgram": { + "type": "Support Program", + "name": "New Support Program", + "config": "{}", + "project": "Governance", + "userSupporters": [ + { + "type": "User Supporter", + "name": "superharoun", + "config": "{}", + "project": "Governance", + "id": "ba86447f-73c2-4c79-a436-75db25aec088", + "savedPayload": { + "position": { + "x": 14558.807621135333, + "y": 6129.6735498042035 + }, + "targetPosition": { + "x": 14299.000000000002, + "y": 6279.6735498042035 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "User Profile", + "name": "superharoun", + "id": "47c64eac-831d-4277-b9ce-4bd3d7e803c1" + }, + "referenceParentCombinedNodePath": [ + [ + "superharoun", + "User Profile" + ] + ] + } + } + ], + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "4751c55b-18ef-42d9-bff4-d2b431b3d6f4", + "savedPayload": { + "position": { + "x": 14449.000000000002, + "y": 6539.481170939535 + }, + "targetPosition": { + "x": 14299.000000000002, + "y": 6279.6735498042035 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "tokensBonus": { + "type": "Tokens Bonus", + "name": "New Tokens Bonus", + "project": "Governance", + "id": "e77dcdd8-f3e0-48dd-8a98-58123ca82956", + "savedPayload": { + "position": { + "x": 14039.19237886467, + "y": 6429.6735498042035 + }, + "targetPosition": { + "x": 14299.000000000002, + "y": 6279.6735498042035 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "1d566e0c-97f7-4f13-bf42-a443ed4c6d5b", + "savedPayload": { + "position": { + "x": 14299.000000000002, + "y": 6279.6735498042035 + }, + "targetPosition": { + "x": 14149.000000000002, + "y": 6019.865928668872 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "mentorshipProgram": { + "type": "Mentorship Program", + "name": "New Mentorship Program", + "config": "{}", + "project": "Governance", + "userMentors": [ + { + "type": "User Mentor", + "name": "PLuv", + "config": "{}", + "project": "Governance", + "id": "9aea636c-0631-4503-a672-5d3dbed2b72f", + "savedPayload": { + "position": { + "x": 14039.19237886467, + "y": 6429.6735498042035 + }, + "targetPosition": { + "x": 13889.19237886467, + "y": 6169.865928668872 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "User Profile", + "name": "PLuv", + "id": "142f5de2-3762-4f55-a839-22eac5c03c8f" + }, + "referenceParentCombinedNodePath": [ + [ + "PLuv", + "User Profile" + ] + ] + } + } + ], + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "9cbfca12-3709-4142-bf8a-60d84eed4cb0", + "savedPayload": { + "position": { + "x": 13629.38475772934, + "y": 6319.865928668872 + }, + "targetPosition": { + "x": 13889.19237886467, + "y": 6169.865928668872 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "tokensBonus": { + "type": "Tokens Bonus", + "name": "New Tokens Bonus", + "project": "Governance", + "id": "6ab334c1-a43a-43a5-afb4-020ebb8d0440", + "savedPayload": { + "position": { + "x": 13739.19237886467, + "y": 5910.05830753354 + }, + "targetPosition": { + "x": 13889.19237886467, + "y": 6169.865928668872 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "69f4697d-30b2-4ee5-b249-231861808465", + "savedPayload": { + "position": { + "x": 13889.19237886467, + "y": 6169.865928668872 + }, + "targetPosition": { + "x": 14149.000000000002, + "y": 6019.865928668872 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "b728c0b7-7c85-4231-9aef-85d9935a31f0", + "savedPayload": { + "position": { + "x": 14149.000000000002, + "y": 6019.865928668872 + }, + "targetPosition": { + "x": 13999.000000000002, + "y": 5760.05830753354 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "61c1d6e1-6a04-44ed-9ffd-eec1c0c05627", + "savedPayload": { + "position": { + "x": 13999.000000000002, + "y": 5760.05830753354 + }, + "targetPosition": { + "x": 13699.000000000002, + "y": 5760.05830753354 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "tokensMined": { + "type": "Tokens Mined", + "name": "New Tokens Mined", + "project": "Governance", + "id": "05c466c2-ab8f-4186-94d7-1e35d5755e71", + "savedPayload": { + "position": { + "x": 13399.000000000002, + "y": 5760.05830753354 + }, + "targetPosition": { + "x": 13699.000000000002, + "y": 5760.05830753354 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "a884f5c0-2ffb-4a31-8edc-349430071fbe", + "savedPayload": { + "position": { + "x": 13699.000000000002, + "y": 5760.05830753354 + }, + "targetPosition": { + "x": 13699.000000000002, + "y": 5760.05830753354 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } +} \ No newline at end of file From 57a23234e4ba84e0fcfb639dbdff77bd8600573b Mon Sep 17 00:00:00 2001 From: NicN11 Date: Thu, 4 Nov 2021 07:23:50 +0100 Subject: [PATCH 02/20] User Profile NicN11 --- .../Governance/Plugins/User-Profiles/NicN11.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Projects/Governance/Plugins/User-Profiles/NicN11.json b/Projects/Governance/Plugins/User-Profiles/NicN11.json index e13f05e99..e5c4599c2 100644 --- a/Projects/Governance/Plugins/User-Profiles/NicN11.json +++ b/Projects/Governance/Plugins/User-Profiles/NicN11.json @@ -597,17 +597,17 @@ "id": "a884f5c0-2ffb-4a31-8edc-349430071fbe", "savedPayload": { "position": { - "x": 13699.000000000002, - "y": 5760.05830753354 + "x": 48529.647058823524, + "y": 38002 }, "targetPosition": { - "x": 13699.000000000002, - "y": 5760.05830753354 + "x": 48529.647058823524, + "y": 38002 }, "floatingObject": { - "isPinned": false, + "isPinned": true, "isFrozen": false, - "isCollapsed": false, + "isCollapsed": true, "angleToParent": 1, "distanceToParent": 3, "arrangementStyle": 0 From ea5c24cd6c03f5c086f2a00d94576893b4aabc4a Mon Sep 17 00:00:00 2001 From: prepheadrus <83468174+prepheadrus@users.noreply.github.com> Date: Thu, 4 Nov 2021 12:06:22 +0300 Subject: [PATCH 03/20] Welcome To Superalgos 025-032 --- ...25-tutorial-step-hungry-for-more-info.json | 38 +++++++++++++++++- ...gos-026-tutorial-step-broke-something.json | 32 +++++++++++++-- ...gos-027-tutorial-step-more-workspaces.json | 32 +++++++++++++-- ...os-028-tutorial-step-ok.-back-to-work.json | 40 ++++++++++++++++--- ...tutorial-step-the-magic-of-data-mines.json | 24 +++++++++-- ...orial-step-at-the-core-of-data-mining.json | 32 +++++++++++++-- ...s-031-tutorial-step-are-we-up-to-date.json | 32 +++++++++++++-- ...ralgos-032-tutorial-step-time-to-stop.json | 25 ++++++++++++ 8 files changed, 230 insertions(+), 25 deletions(-) diff --git a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-025-tutorial-step-hungry-for-more-info.json b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-025-tutorial-step-hungry-for-more-info.json index 0af311ba2..ad3a39efa 100644 --- a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-025-tutorial-step-hungry-for-more-info.json +++ b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-025-tutorial-step-hungry-for-more-info.json @@ -38,6 +38,11 @@ "text": "Я не буду вдаваться в подробности по мере продвижения, но если Вам нужна дополнительная информауия об узле, кнопка Help в меню приведет Вас прямо к его документации.", "updated": 1635613175051, "style": "Definition" + }, + { + "language": "TR", + "text": "Devam ederken her ayrıntıya girmeyeceğim, ancak bir düğüm hakkında daha fazla bilgiye ihtiyacınız varsa, menüdeki yardım düğmesi (Düğümü geniletiğinizde görebilirsiniz) sizi doğrudan belgelerine götürür.", + "updated": 1636012819082 } ] }, @@ -75,6 +80,11 @@ "text": "Документация узла модет включать один или несколько из следующих разделов:", "updated": 1635613205233, "style": "Text" + }, + { + "language": "TR", + "text": "Bir düğümün dokümantasyonu aşağıdaki bölümlerden bir veya daha fazlasını içerebilir:", + "updated": 1636012836829 } ] }, @@ -111,6 +121,11 @@ "text": "Difinition: описывает, что представляет собой узел и его функции.", "updated": 1635613299355, "style": "List" + }, + { + "language": "TR", + "text": "Tanım (Definition): düğümün ne olduğunu veya ne yaptığını açıklar.", + "updated": 1636012877511 } ] }, @@ -147,6 +162,11 @@ "text": "Content: описывает, как работает узел.", "updated": 1635613497534, "style": "List" + }, + { + "language": "TR", + "text": "İçerik (Content): düğümün nasıl çalıştığını açıklar.", + "updated": 1636012909187 } ] }, @@ -184,6 +204,11 @@ "text": "Configuration: некоторые узлы могут иметь один узел.", "updated": 1635613523569, "style": "List" + }, + { + "language": "TR", + "text": "Yapılandırma (Configuration): bazı düğümlerde bir tane olabilir.", + "updated": 1636012944710 } ] }, @@ -221,6 +246,11 @@ "text": "Technical: основная информация обычно носит технический характер и ориентирована на разработчиков.", "updated": 1635613576536, "style": "List" + }, + { + "language": "TR", + "text": "Teknik (Technical): Bilginin geri kalanı genellikle geliştiricilere yönelik teknik niteliktedir.", + "updated": 1636012987852 } ] }, @@ -255,7 +285,13 @@ { "language": "RU", "text": "Нажмите кнопку на узле Data Tasks!", - "updated": 1635627454333 + "updated": 1635627454333, + "style": "Callout" + }, + { + "language": "TR", + "text": "Veri Görevleri ( Data Tasks ) düğümündeki yardım düğmesine tıklayın!", + "updated": 1636013020909 } ] } diff --git a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-026-tutorial-step-broke-something.json b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-026-tutorial-step-broke-something.json index e03c98c3f..09623d317 100644 --- a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-026-tutorial-step-broke-something.json +++ b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-026-tutorial-step-broke-something.json @@ -36,7 +36,13 @@ { "language": "RU", "text": "Если Вы когда-нибудь что-то нарушили, например, удалили узел или изменили конфигурацию и не знаете, как дальше действовать...", - "updated": 1635627557596 + "updated": 1635627557596, + "style": "Definition" + }, + { + "language": "TR", + "text": "Bir düğümü silmek veya bir konfigürasyonu değiştirmek gibi bir şeyi bozarsanız ve sonuçla nasıl başa çıkacağınızı bilmiyorsanız...", + "updated": 1636013094366 } ] }, @@ -72,7 +78,13 @@ { "language": "RU", "text": "... Вы можете легко начать все сначала с исходного рабочего пространства Getting Started Tutorials Plugin Workspace!", - "updated": 1635628049167 + "updated": 1635628049167, + "style": "Callout" + }, + { + "language": "TR", + "text": "... orijinal Getting Started Tutorials Plugin Workspace! ile kolayca baştan başlayabilirsiniz!...", + "updated": 1636013152834 } ], "updated": 1622196973760 @@ -108,7 +120,13 @@ { "language": "RU", "text": "В таком случае просто потяните вкладку с левой стороны, прокрутите, найдите плагин Getting Started Tutorials и нажмите на него! Загрузится исходный Plugin Workspace и учебное пособие появится снова, с самого начала!", - "updated": 1635629001422 + "updated": 1635629001422, + "style": "Text" + }, + { + "language": "TR", + "text": "Böyle bir durumda, sol taraftaki sekmeyi çekin, kaydırın, Getting Started Tutorials Plugin'i bulun ve tıklayın! Orijinal Eklenti Çalışma Alanı ( Plugin Workspace ) yüklenecek ve öğretici, baştan yeni bir şekilde yeniden görünecek!", + "updated": 1636013239148 } ], "updated": 1622634394712 @@ -133,7 +151,13 @@ { "language": "RU", "text": "Plugin Workspaces поставляются вместе с системой. Давайте посмотрим, как вы можете сделать их своими собственными или создать новые рабочие пространства!", - "updated": 1635629610043 + "updated": 1635629610043, + "style": "Success" + }, + { + "language": "TR", + "text": "Eklenti Çalışma Alanları ( Plugin Workspaces ) sistemle birlikte gönderilir. Şimdi bunları nasıl kendinize ait hale getirebileceğinizi veya yeni çalışma alanları oluşturabileceğinizi görelim!", + "updated": 1636013279897 } ] } diff --git a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-027-tutorial-step-more-workspaces.json b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-027-tutorial-step-more-workspaces.json index cb9b86faa..0f9b9c7f1 100644 --- a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-027-tutorial-step-more-workspaces.json +++ b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-027-tutorial-step-more-workspaces.json @@ -30,7 +30,13 @@ { "language": "DE", "text": "Plugin Workspaces, die mit dem System ausgeliefert werden, haben einen schwarzen Hintergrund in der Registerkarte Workspaces auf der linken Seite.", - "updated": 1634167337552 + "updated": 1634167337552, + "style": "Definition" + }, + { + "language": "TR", + "text": "Sistemle birlikte gönderilen Eklenti Çalışma Alanları ( Plugin Workspaces ), soldaki Çalışma Alanları (Workspaces) Sekmesinde siyah bir arka plana sahiptir. ", + "updated": 1636013396906 } ], "updated": 1629803469668 @@ -62,7 +68,13 @@ { "language": "DE", "text": "Workspaces speichern alle Informationen zu den Datenstrukturen, die im Arbeitsbereich enthalten sind.", - "updated": 1634167346842 + "updated": 1634167346842, + "style": "Text" + }, + { + "language": "TR", + "text": "Çalışma alanları ( Workspaces ), çalışma alanına dahil edilen veri yapılarına ilişkin tüm bilgileri kaydeder.", + "updated": 1636013436668 } ] }, @@ -80,7 +92,13 @@ { "language": "DE", "text": "Erstellen Sie eine Kopie dieses Plugin Workspace um ihn zu Ihrem eigenen zu machen! Drücken Sie dazu: Ctrl + Shift + Key-S", - "updated": 1634167512053 + "updated": 1634167512053, + "style": "Callout" + }, + { + "language": "TR", + "text": "Gelin bu Plugin Workspace'in bir kopyasını oluşturalım ve sizin için yapalım! Aşağıdaki tuş kombinasyonuna basın: Ctrl + Shift + Key-S", + "updated": 1636013459404 } ] }, @@ -109,7 +127,13 @@ { "language": "DE", "text": "Öffnen Sie nun die Registerkarte Workspaces auf der linken Seite, scrollen Sie ganz nach unten und suchen Sie den einzigen Workspace mit einem lila Hintergrund! Das ist Ihr Arbeitsbereich! Sie brauchen ihn aber nicht anzuklicken!", - "updated": 1634167411161 + "updated": 1634167411161, + "style": "Important" + }, + { + "language": "TR", + "text": "Şimdi soldaki Çalışma Alanları Sekmesini açın, aşağı kaydırın ve mor arka plana sahip tek çalışma alanını bulun! Bu sizin çalışma alanınız! Ama üzerine tıklamanıza gerek yok!", + "updated": 1636013495006 } ], "updated": 1629803460646 diff --git a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-028-tutorial-step-ok.-back-to-work.json b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-028-tutorial-step-ok.-back-to-work.json index 8270eb531..956c81e30 100644 --- a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-028-tutorial-step-ok.-back-to-work.json +++ b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-028-tutorial-step-ok.-back-to-work.json @@ -36,7 +36,13 @@ { "language": "RU", "text": "Теперь, когда Вам удобно передвигаться, я хочу, чтобы Вы отправились в небольшую экскурсию по Network Node раздела Data Tasks.", - "updated": 1635630043831 + "updated": 1635630043831, + "style": "Definition" + }, + { + "language": "TR", + "text": "Artık rahatça dolaşabildiğinize göre, Ağ Düğümü'nün ( Network Node ) Veri Görevleri ( Data Tasks ) bölümünü keşfetmek için küçük bir tura çıkmanızı istiyorum.", + "updated": 1636014280941 } ], "updated": 1622194034630 @@ -73,7 +79,13 @@ { "language": "RU", "text": "Обратите внимание на следующее:", - "updated": 1635630070775 + "updated": 1635630070775, + "style": "Text" + }, + { + "language": "TR", + "text": "Aşağıdakilere dikkat edin:", + "updated": 1636014296432 } ] }, @@ -108,7 +120,13 @@ { "language": "RU", "text": "Раздел делится, в первую очередь, на проекты, биржи и рынки. Он поможет Вам организованно работать со множеством бирж и рынков.", - "updated": 1635630220075 + "updated": 1635630220075, + "style": "List" + }, + { + "language": "TR", + "text": "Bölüm, her şeyden önce proje, borsa ve pazara göre düzenlenmiştir. Bu, birden fazla borsa ve birden fazla pazarla düzenli bir şekilde çalışmanıza yardımcı olacaktır.", + "updated": 1636014356317 } ] }, @@ -143,7 +161,13 @@ { "language": "RU", "text": "Узлы Exchange Data Tasks и Мarket Data Tasks могут управлять всеми задачами на бирже и рынке соответственно.", - "updated": 1635630313880 + "updated": 1635630313880, + "style": "List" + }, + { + "language": "TR", + "text": "Borsa Veri Görevleri ( Exchance Data Tasks ) ve Piyasa Veri Görevleri ( Market Data Tasks ) düğümleri, sırasıyla borsadaki ve pazardaki tüm görevleri kontrol edebilir.", + "updated": 1636014775744 } ] }, @@ -178,7 +202,13 @@ { "language": "RU", "text": "Выйдите и проверьте эти узлы и их меню!", - "updated": 1635630414259 + "updated": 1635630414259, + "style": "Callout" + }, + { + "language": "TR", + "text": "Şimdi bu düğümleri ve menülerini kontrol edin!", + "updated": 1636014827396 } ] } diff --git a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-029-tutorial-step-the-magic-of-data-mines.json b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-029-tutorial-step-the-magic-of-data-mines.json index ff08a47e0..46bb617b5 100644 --- a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-029-tutorial-step-the-magic-of-data-mines.json +++ b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-029-tutorial-step-the-magic-of-data-mines.json @@ -30,7 +30,13 @@ { "language": "DE", "text": "Innerhalb jedes Marktes ist die Operation nach Data Mine organisiert. Superalgos wird mit mehreren quelloffenen Data Mines ausgeliefert, die jeweils mehrere Indikatoren enthalten.", - "updated": 1634168232166 + "updated": 1634168232166, + "style": "Definition" + }, + { + "language": "TR", + "text": "Her pazarda, operasyon Data Mine tarafından organize edilir. Superalgos, her biri birden fazla göstergeye sahip birkaç açık kaynaklı veri madeni ile birlikte gelir.", + "updated": 1636014963314 } ] }, @@ -60,7 +66,13 @@ { "language": "DE", "text": "Betrachten Sie Data Mines als Plugins, die Entwickler erstellen können, um die Datenanalysekapazität des Systems zu erweitern. Ein Indicator Bot kann Daten verarbeiten, die von anderen Indikatoren erzeugt werden, und so einen Mehrwert und eine tiefere und reichhaltigere Analyse liefern.", - "updated": 1634168218271 + "updated": 1634168218271, + "style": "Text" + }, + { + "language": "TR", + "text": "Veri madenlerini, geliştiricilerin sistemin veri analiz kapasitesini genişletmek için oluşturabilecekleri eklentiler olarak düşünün. Bir Gösterge Botu ( Indicator Bot ), diğer göstergelerin ürettiği verileri işleyebilir, dolayısıyla değer katabilir ve daha derin ve daha zengin analizler üretebilir.", + "updated": 1636015012141 } ] }, @@ -89,7 +101,13 @@ { "language": "DE", "text": "Wenn Sie ein Grundverständnis von JavaScript haben, können Sie auch Indikatoren erstellen! Wenn Sie eine Data Mine beitragen, verdienen Sie Superalgos SA Tokens!", - "updated": 1634168241958 + "updated": 1634168241958, + "style": "Callout" + }, + { + "language": "TR", + "text": "Temel bir JavaScript bilginiz varsa, göstergeler de oluşturabilirsiniz! Bir Veri Madenine ( Data Mine ) katkıda bulunursanız, Superalgos SA Jetonları kazanırsınız!", + "updated": 1636015059999 } ], "updated": 1622196189467 diff --git a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-030-tutorial-step-at-the-core-of-data-mining.json b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-030-tutorial-step-at-the-core-of-data-mining.json index e7f38a7b9..7a392b158 100644 --- a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-030-tutorial-step-at-the-core-of-data-mining.json +++ b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-030-tutorial-step-at-the-core-of-data-mining.json @@ -30,7 +30,13 @@ { "language": "DE", "text": "Das Herzstück einer Data-Mining-Operation sind Tasks, die Bots ausführen. Ein Task steuert einen Bot, und ein Task Manager kann mehrere Tasks steuern.", - "updated": 1634168469674 + "updated": 1634168469674, + "style": "Definition" + }, + { + "language": "TR", + "text": "Bir veri madenciliği operasyonunun özü, bot çalıştıran görevlerdir. Bir Görev, bir botu kontrol eder ve bir Görev Yöneticisi ( Tasks Manager ) birden fazla görevi kontrol edebilir.", + "updated": 1636015403690 } ] }, @@ -61,7 +67,13 @@ { "language": "DE", "text": "Inzwischen haben Sie sechs verschiedene Geräte kennengelernt, die Sie zur Steuerung der einzelnen Bots in Ihrem Data Mining-Vorgang verwenden können. Auf der höchsten Ebene steuert der Knoten Data Tasks alle Data-Mining-Bots im Netzwerkknoten.", - "updated": 1634168489908 + "updated": 1634168489908, + "style": "Text" + }, + { + "language": "TR", + "text": "Şimdiye kadar, veri madenciliği operasyonunuzdaki her bir botu kontrol etmek için kullanabileceğiniz altı farklı cihaz hakkında bilgi edindiniz. En üst düzeyde, Veri Görevleri (Data Tasks) düğümü, Ağ Düğümü'ndeki (Network Node) tüm veri madenciliği botlarını kontrol eder.", + "updated": 1636015350802 } ] }, @@ -90,7 +102,13 @@ { "language": "DE", "text": "Wir werden in einer Minute über Netzwerkknoten sprechen...", - "updated": 1634168496945 + "updated": 1634168496945, + "style": "Callout" + }, + { + "language": "TR", + "text": "Ağ düğümleri hakkında birazdan konuşacağız...", + "updated": 1636015240381 } ] }, @@ -120,7 +138,13 @@ { "language": "DE", "text": "Auf der untersten Ebene steuert ein einzelner Task einen einzelnen Bot. Die Knoten dazwischen sind Organisationsknoten, die für Ordnung sorgen und eine detaillierte Kontrolle über die verschiedenen Bereiche ermöglichen.", - "updated": 1634168505425 + "updated": 1634168505425, + "style": "Text" + }, + { + "language": "TR", + "text": "En alt düzeyde, tek bir Görev (Task), tek bir botu kontrol eder. Aradaki düğümler, işlemi düzenli tutmaya yardımcı olan ve farklı bölümler üzerinde ayrıntılı kontrole izin veren organizasyon düğümleridir.", + "updated": 1636015306156 } ] } diff --git a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-031-tutorial-step-are-we-up-to-date.json b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-031-tutorial-step-are-we-up-to-date.json index f1677ea83..b700454ef 100644 --- a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-031-tutorial-step-are-we-up-to-date.json +++ b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-031-tutorial-step-are-we-up-to-date.json @@ -30,7 +30,13 @@ { "language": "DE", "text": "Inzwischen sollten alle Prozesse zu 100 % laufen. Wenn dies der Fall ist, bezeichnen wir die Data-Mining-Operation als \"up to date\".", - "updated": 1634170269450 + "updated": 1634170269450, + "style": "Definition" + }, + { + "language": "TR", + "text": "Şu anda , tüm işlemler %100 olmalıdır. Bu olduğunda, veri madenciliği operasyonuna \"güncel\" diyoruz.", + "updated": 1636015455848 } ], "updated": 1616415623576 @@ -61,7 +67,13 @@ { "language": "DE", "text": "Wenn alle Prozesse auf dem neuesten Stand sind, laufen die Bots weiter und verarbeiten Informationen in Echtzeit, während sie an der Börse produziert werden. Das heißt, die Data-Mining-Operation stoppt nur, wenn Sie sie stoppen!", - "updated": 1634170281567 + "updated": 1634170281567, + "style": "Text" + }, + { + "language": "TR", + "text": "Tüm süreçler güncel olduğunda, botlar çalışmaya devam eder ve bilgiyi borsada üretildiği gibi gerçek zamanlı olarak işler. Yani, siz durdurmadığınız sürece veri madenciliği işlemi durmaz!", + "updated": 1636015476681 } ] }, @@ -90,7 +102,13 @@ { "language": "DE", "text": "Schauen Sie sich um und prüfen Sie, ob alle Prozesse zu 100% laufen.", - "updated": 1634170288448 + "updated": 1634170288448, + "style": "Callout" + }, + { + "language": "TR", + "text": "Etrafınıza bakın ve tüm işlemlerin %100 olup olmadığını görün", + "updated": 1636015521214 } ] }, @@ -119,7 +137,13 @@ { "language": "DE", "text": "Um eine Live Trading Session durchzuführen, benötigen Sie eine ständige Zufuhr von Informationen von der Börse, die in Echtzeit verarbeitet werden, damit der Trading Bot die Regeln Ihres Trading System anwenden kann, um Live-Handelsentscheidungen zu treffen.", - "updated": 1634170296952 + "updated": 1634170296952, + "style": "Text" + }, + { + "language": "TR", + "text": "Canlı Alım Satım Oturumu ( Live Trading Session ) yürütmek için, Alım Satım Botunun ( Trading Bot ) canlı alım satım kararları vermek üzere Alım Satım Sisteminizin ( Trading System ) kurallarını uygulayabilmesi için, gerçek zamanlı olarak işlenen borsadan sürekli bir bilgi akışına ihtiyacınız vardır.", + "updated": 1636016072081 } ], "updated": 1616415667438 diff --git a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-032-tutorial-step-time-to-stop.json b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-032-tutorial-step-time-to-stop.json index 2af510240..e04da82b4 100644 --- a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-032-tutorial-step-time-to-stop.json +++ b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-032-tutorial-step-time-to-stop.json @@ -32,6 +32,11 @@ "text": "Da wir keine Live Trading Session durchführen, macht es grade keinen Sinn, das Data Mining zu diesem Zeitpunkt laufen zu lassen.", "updated": 1634170784986, "style": "Definition" + }, + { + "language": "TR", + "text": "Henüz bir Canlı İşlem Oturumu ( Live Trading Session ) düzenlemeyeceğiz, bu nedenle veri madenciliğimizi bu noktada çalışır durumda tutmanın bir anlamı yok.", + "updated": 1636016140799 } ] }, @@ -64,6 +69,11 @@ "text": "Es gibt zwei Anwendungsfälle für die Data Tasks:", "updated": 1634170835236, "style": "Text" + }, + { + "language": "TR", + "text": "Veri Görevlerini çalıştırmanın iki ana kullanım durumu vardır:", + "updated": 1636016174401 } ] }, @@ -95,6 +105,11 @@ "text": "Zur Verarbeitung historischer Daten: Sie möchten für einen bestimmten Zeitraum einen bestimmten Market verarbeiten, um eine Backtesting Session durchzuführen oder Indikatoren testen.", "updated": 1634208005120, "style": "List" + }, + { + "language": "TR", + "text": "Geçmiş verileri işlemek için: Bir Geriye Dönük Test Oturumu (Backtesting Sesion ) yürütmek veya yeni göstergeleri işlemek için belirli bir Piyasanın ( Market ) bir tarih saat aralığını işlemek isteyebilirsiniz.", + "updated": 1636016235514 } ] }, @@ -126,6 +141,11 @@ "text": "Eine Live-Sitzung durchführen: Die verschiedenen Arten von Live-Sitzungen, wie Paper Trading Session, Forward Testing Session und Live Trading Session, benötigen alle einen Live-Markt-Feed.", "updated": 1634208020007, "style": "List" + }, + { + "language": "TR", + "text": "Canlı bir oturum yürütmek için: Kağıt Alım Satım Oturumu (Paper Trading Session ), İleriye Yönelik Test Oturumu (Forward Testing Session ) ve Canlı Alım Satım Oturumu ( Live Trading Session ) gibi farklı türlerdeki oturumların tümü canlı bir piyasa akışına ihtiyaç duyar.", + "updated": 1636016605221 } ] }, @@ -156,6 +176,11 @@ "text": "Wenn alle Prozesse auf dem neuesten Stand sind, wählen Sie \"Stop All Tasks\" im Knoten Market Data Tasks. Beachten Sie, dass die Tasks auch von einem anderen Knoten aus gestoppt werden können als von dem aus, mit dem sie gestartet wurden!", "updated": 1634172843262, "style": "Callout" + }, + { + "language": "TR", + "text": "Tüm işlemler güncel olduğunda (%100), Piyasa Veri Görevleri ( Market Data Tasks ) düğümünde \"Stop All Tasks\" seçeneğini seçin. Ek bilgi olarak, görevleri başlattığımız düğümden farklı bir düğümden durdurabileceğimizi de unutmayın.", + "updated": 1636016732706 } ], "updated": 1622197433719 From 80f7ffaa8e17280ce68c906b112b155f9a726ff7 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 4 Nov 2021 12:03:58 +0100 Subject: [PATCH 04/20] p2p Network Node implemented --- Network/NetwokNode.js | 6 ++++ .../Network/NT/Modules/WebSocketsInterface.js | 2 +- Projects/Network/SA/Globals/Memory.js | 3 +- Projects/Network/SA/Modules/P2PNetwork.js | 35 +++++++++++++++++++ Projects/Network/SA/Modules/P2PNetworkNode.js | 29 +++++++++++++++ Projects/Network/SA/Modules/UserProfiles.js | 12 +++++-- Projects/ProjectsSchema.json | 12 +++++++ 7 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 Projects/Network/SA/Modules/P2PNetwork.js create mode 100644 Projects/Network/SA/Modules/P2PNetworkNode.js diff --git a/Network/NetwokNode.js b/Network/NetwokNode.js index 22a04fbdb..74ffc6326 100644 --- a/Network/NetwokNode.js +++ b/Network/NetwokNode.js @@ -3,6 +3,7 @@ exports.newNetworkNode = function newNetworkNode() { let thisObject = { socialGraphService: undefined, storage: undefined, + p2pMetwork: undefined, run: run } @@ -24,5 +25,10 @@ exports.newNetworkNode = function newNetworkNode() { */ thisObject.storage = NT.projects.socialTrading.modules.storage.newSocialTradingModulesStorage() thisObject.storage.initialize() + /* + We can join now the P2P Network as a new peer there. + */ + thisObject.p2pMetwork = SA.projects.network.modules.p2pMetwork.newNetworkModulesP2PNetwork() + await thisObject.p2pMetwork.initialize() } } diff --git a/Projects/Network/NT/Modules/WebSocketsInterface.js b/Projects/Network/NT/Modules/WebSocketsInterface.js index ebad1b2cc..4efcaef16 100644 --- a/Projects/Network/NT/Modules/WebSocketsInterface.js +++ b/Projects/Network/NT/Modules/WebSocketsInterface.js @@ -304,7 +304,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock /* The signature gives us the blockchain account, and the account the user profile. */ - let witnessUserProfile = SA.projects.network.globals.memory.maps.USER_PROFILES_BY_BLOCHAIN_ACCOUNT.get(caller.blockchainAccount) + let witnessUserProfile = SA.projects.network.globals.memory.maps.USER_PROFILES_BY_BLOKCHAIN_ACCOUNT.get(caller.blockchainAccount) if (witnessUserProfile === undefined) { let response = { diff --git a/Projects/Network/SA/Globals/Memory.js b/Projects/Network/SA/Globals/Memory.js index 7c86e1224..38cb701f4 100644 --- a/Projects/Network/SA/Globals/Memory.js +++ b/Projects/Network/SA/Globals/Memory.js @@ -6,9 +6,10 @@ exports.newNetworkGlobalsMemory = function () { maps: { USER_PROFILES_BY_ID: new Map(), // Here we will store the user profiles by User Profile Id. USER_PROFILES_BY_HANDLE: new Map(), // Here we will store the user profiles by User Profile Handle. - USER_PROFILES_BY_BLOCHAIN_ACCOUNT: new Map() // Here we will store the user profiles by Blockchain Account. + USER_PROFILES_BY_BLOKCHAIN_ACCOUNT: new Map() // Here we will store the user profiles by Blockchain Account. }, arrays: { + P2P_NETWORK_NODES: [] // Here we will store the p2p nodes deined under Signing Account node types. } } diff --git a/Projects/Network/SA/Modules/P2PNetwork.js b/Projects/Network/SA/Modules/P2PNetwork.js new file mode 100644 index 000000000..8006a6925 --- /dev/null +++ b/Projects/Network/SA/Modules/P2PNetwork.js @@ -0,0 +1,35 @@ +exports.newNetworkModulesP2PNetwork = function newNetworkModulesP2PNetwork() { + /* + This module represents the P2P Network and it is needed to enable the connection + of this current node to other peers. + */ + let thisObject = { + joinTheNetworkAsPeer: joinTheNetworkAsPeer, + /* Framework Functions */ + initialize: initialize, + finalize: finalize + } + + return thisObject + + function finalize() { + + } + + async function initialize() { + /* + We will setup here the maps and arryas we will need to operate within the P2P Network. + */ + let thisP2PNodeId = SA.secrets.map.get(global.env.P2P_NETWORK_NODE_SIGNING_ACCOUNT).signingAccountNodeId + for (let i = 0; i < SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES.length; i++) { + let p2pNetworkNode = SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES[i] + + } + } + + function joinTheNetworkAsPeer() { + /* + To join the network we will need to thorugh the list of Network Nodes and pick one to connect to. + */ + } +} \ No newline at end of file diff --git a/Projects/Network/SA/Modules/P2PNetworkNode.js b/Projects/Network/SA/Modules/P2PNetworkNode.js new file mode 100644 index 000000000..a3a821653 --- /dev/null +++ b/Projects/Network/SA/Modules/P2PNetworkNode.js @@ -0,0 +1,29 @@ +exports.newNetworkModulesP2PNetworkNode = function newNetworkModulesP2PNetworkNode() { + /* + This module represents the P2P Network Node. + */ + let thisObject = { + + node: undefined, + userPofile: undefined, + + /* Framework Functions */ + initialize: initialize, + finalize: finalize + } + + return thisObject + + function finalize() { + thisObject.node = undefined + thisObject.userPofile = undefined + } + + async function initialize(node, userPofile) { + /* + We will setup here the maps and arryas we will need to operate within the P2P Network. + */ + thisObject.node = node + thisObject.userPofile = userPofile + } +} \ No newline at end of file diff --git a/Projects/Network/SA/Modules/UserProfiles.js b/Projects/Network/SA/Modules/UserProfiles.js index 346b0b604..746912e69 100644 --- a/Projects/Network/SA/Modules/UserProfiles.js +++ b/Projects/Network/SA/Modules/UserProfiles.js @@ -53,7 +53,7 @@ exports.newNetworkModulesUserProfiles = function newNetworkModulesUserProfiles() 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_BLOCHAIN_ACCOUNT.set(blockchainAccount, userProfile) + SA.projects.network.globals.memory.maps.USER_PROFILES_BY_BLOKCHAIN_ACCOUNT.set(blockchainAccount, userProfile) /* Each User Profile might have Signing Accounts, meaning accounts that can be siging on behalf of the User Profile. @@ -65,7 +65,15 @@ exports.newNetworkModulesUserProfiles = function newNetworkModulesUserProfiles() 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_BLOCHAIN_ACCOUNT.set(blockchainAccount, userProfile) + 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 (signingAccount.signingAccountChild.type === "P2P Network Node") { + p2pNetworkNode = SA.projects.network.modules.p2pMetworkNode.newNetworkModulesP2PNetworkNode() + p2pMetworkNode.initialize(signingAccount.signingAccountChild, userPofile) + SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES.push(p2pNetworkNode) + } } } } diff --git a/Projects/ProjectsSchema.json b/Projects/ProjectsSchema.json index 8952ce848..b281f405f 100644 --- a/Projects/ProjectsSchema.json +++ b/Projects/ProjectsSchema.json @@ -1407,6 +1407,18 @@ "propertyName": "userProfiles", "functionName": "newNetworkModulesUserProfiles", "fileName": "UserProfiles.js" + }, + { + "name": "P2P Network", + "propertyName": "p2pNetwork", + "functionName": "newSocialTradingModulesP2PNetwork", + "fileName": "P2PNetwork.js" + }, + { + "name": "P2P Network Node", + "propertyName": "p2pNetworkNode", + "functionName": "newSocialTradingModulesP2PNetworkNode", + "fileName": "P2PNetworkNode.js" } ], "utilities": [ From 5ec3217e7ab4a5156ccb43d0e0b3f7a4c6dcc5ef Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 4 Nov 2021 12:21:08 +0100 Subject: [PATCH 05/20] User Profile fixed --- .../User-Profiles/Luis-Fernando-Molina.json | 416 +++++++++--------- .../Function-Libraries/ProfileConstructor.js | 1 + Projects/Network/SA/Modules/P2PNetwork.js | 7 +- 3 files changed, 214 insertions(+), 210 deletions(-) diff --git a/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json b/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json index fef469c82..8b9800284 100644 --- a/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json +++ b/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json @@ -127,12 +127,12 @@ "id": "f4d39b02-4324-438d-9f74-2bea2b7272ef", "savedPayload": { "position": { - "x": 4797.826086956522, - "y": 23340.192378864667 + "x": 33783.333333333336, + "y": 18540.192378864667 }, "targetPosition": { - "x": 4647.826086956522, - "y": 23600 + "x": 33633.333333333336, + "y": 18800 }, "floatingObject": { "isPinned": false, @@ -516,12 +516,12 @@ "id": "b6e3c87d-a11b-4b2a-b6a6-edc96375f5da", "savedPayload": { "position": { - "x": 4907.633708091854, - "y": 23450 + "x": 33893.14095446867, + "y": 18650 }, "targetPosition": { - "x": 4647.826086956522, - "y": 23600 + "x": 33633.333333333336, + "y": 18800 }, "floatingObject": { "isPinned": false, @@ -565,12 +565,12 @@ "id": "2571cea1-2b6d-40f5-9331-8786bf57c184", "savedPayload": { "position": { - "x": 5575.05716950933, - "y": 23082.57653858252 + "x": 34560.56441588615, + "y": 18282.57653858252 }, "targetPosition": { - "x": 5497.411455978574, - "y": 23372.354286469243 + "x": 34482.91870235539, + "y": 18572.354286469243 }, "floatingObject": { "isPinned": false, @@ -614,7 +614,7 @@ "positionClaimVotes": [ { "type": "Position Claim Vote", - "name": "Tentacule23 Project Contributor Smidy13 Tentacule23 Governance Project", + "name": "", "config": "{}", "project": "Governance", "id": "ab341408-2073-46aa-9390-2396bdebf79b", @@ -685,7 +685,7 @@ }, { "type": "Position Claim Vote", - "name": "Tentacule23 1 Project Contributor Tentacle23 Visual Scripting Project", + "name": "", "config": "{}", "project": "Governance", "id": "ac17837f-37f5-4c27-a1c4-c667afb5153c", @@ -859,7 +859,7 @@ "positionClaimVotes": [ { "type": "Position Claim Vote", - "name": "NAmorim Team Creator Nuno Distribution Team", + "name": "", "config": "{}", "project": "Governance", "id": "db023ba8-610f-44d8-a72d-62ea45610ef0", @@ -930,7 +930,7 @@ }, { "type": "Position Claim Vote", - "name": "NAmorim Team Member Superalgos Blog Team", + "name": "", "config": "{}", "project": "Governance", "id": "d584524b-e869-4ab1-92cc-5778e98220e2", @@ -1159,7 +1159,7 @@ "positionClaimVotes": [ { "type": "Position Claim Vote", - "name": "alexandrustefan Team Creator Alexandru Forum Team", + "name": "", "config": "{}", "project": "Governance", "id": "122bea90-803d-4d2b-9af0-46197571b24d", @@ -1300,7 +1300,7 @@ "positionClaimVotes": [ { "type": "Position Claim Vote", - "name": "alexandrustefan 3 Project Contributors Alexandru cozed-gh(Carl) Quantum8 PLuv Data Mining Project", + "name": "", "config": "{}", "project": "Governance", "id": "bf243dfe-b8f5-4d74-83a1-c54ec50fe5b9", @@ -1507,7 +1507,7 @@ "positionClaimVotes": [ { "type": "Position Claim Vote", - "name": "harrellbm Project Leader Harrell harrellbm Education Project", + "name": "", "config": "{}", "project": "Governance", "id": "e481a337-45e6-4107-8c0b-14f9d5210fe6", @@ -1666,7 +1666,7 @@ "positionClaimVotes": [ { "type": "Position Claim Vote", - "name": "harrellbm Team Creator Harrell harrellbm Docs Teams", + "name": "", "config": "{}", "project": "Governance", "id": "610fcdec-93ef-4451-a037-f3d4249a2a9e", @@ -1831,7 +1831,7 @@ "positionClaimVotes": [ { "type": "Position Claim Vote", - "name": "harrellbm Team Creator Harrell harrellbm Tutorials Team", + "name": "", "config": "{}", "project": "Governance", "id": "3d923532-2d84-457e-875b-ed0ad9bcd2f6", @@ -1996,7 +1996,7 @@ "positionClaimVotes": [ { "type": "Position Claim Vote", - "name": "harrellbm Team Creator Harrell harrellbm Translations Team", + "name": "", "config": "{}", "project": "Governance", "id": "4320a3b2-a698-426c-af85-fdb9e7e772df", @@ -2161,7 +2161,7 @@ "positionClaimVotes": [ { "type": "Position Claim Vote", - "name": "harrellbm Team Creator Harrell harrellbm Workspaces Team", + "name": "", "config": "{}", "project": "Governance", "id": "faa321ab-73a1-434d-bbec-f6d648d0b7a9", @@ -2396,7 +2396,7 @@ "positionClaimVotes": [ { "type": "Position Claim Vote", - "name": "harrellbm Team Creator Harrell harrellbm Setup Team", + "name": "", "config": "{}", "project": "Governance", "id": "58fb3da1-002b-4574-8155-4949dc269b9b", @@ -2549,7 +2549,7 @@ "positionClaimVotes": [ { "type": "Position Claim Vote", - "name": "harrellbm Team Member Superalgos Blog Team", + "name": "", "config": "{}", "project": "Governance", "id": "333f1c9a-1d3f-43f6-95af-7f8bacc4fb28", @@ -2784,7 +2784,7 @@ "positionClaimVotes": [ { "type": "Position Claim Vote", - "name": "ssplatt Project Leader Brett Ssplatt Social Bots Project", + "name": "", "config": "{}", "project": "Governance", "id": "5d6f2c60-849d-4d5e-b697-a1cbe47dccc7", @@ -3119,7 +3119,7 @@ "positionClaimVotes": [ { "type": "Position Claim Vote", - "name": "ssplatt Team Member Twitter Team", + "name": "", "config": "{}", "project": "Governance", "id": "36950249-4ad4-4f09-9580-7988cb60f1a1", @@ -3296,7 +3296,7 @@ "positionClaimVotes": [ { "type": "Position Claim Vote", - "name": "ssplatt Team Leader Brett Reddit Team", + "name": "", "config": "{}", "project": "Governance", "id": "0228c2bf-557e-4512-87b9-36318e534b4c", @@ -3555,7 +3555,7 @@ "positionClaimVotes": [ { "type": "Position Claim Vote", - "name": "ssplatt Team Creator Brett Brett Live Streaming and Videos Team", + "name": "", "config": "{}", "project": "Governance", "id": "9ffbaebf-d903-4985-b009-4e8f854e9606", @@ -3644,7 +3644,7 @@ }, { "type": "Position Claim Vote", - "name": "ssplatt Team Leader Brett Live Streaming and Videos Team", + "name": "", "config": "{}", "project": "Governance", "id": "12cf50a8-2f36-4068-a771-d8eb04a9270d", @@ -3733,7 +3733,7 @@ }, { "type": "Position Claim Vote", - "name": "ssplatt Team Member Brett Live Streaming and Videos Team", + "name": "", "config": "{}", "project": "Governance", "id": "3ecebb3b-c21b-4141-baed-2ce0d03cf3b2", @@ -4062,7 +4062,7 @@ "positionClaimVotes": [ { "type": "Position Claim Vote", - "name": "ssplatt Team Creator Brett Sys Admins Team", + "name": "", "config": "{}", "project": "Governance", "id": "96e4d32a-4e19-489b-82b9-f55ae19e4c21", @@ -4227,7 +4227,7 @@ "positionClaimVotes": [ { "type": "Position Claim Vote", - "name": "ssplatt Team Creator Brett Docker Team", + "name": "", "config": "{}", "project": "Governance", "id": "816e142a-a1e1-4a6a-8520-5fd143448a5b", @@ -4392,7 +4392,7 @@ "positionClaimVotes": [ { "type": "Position Claim Vote", - "name": "ssplatt Team Leader Brett Github Team", + "name": "", "config": "{}", "project": "Governance", "id": "5f54dfe8-51af-4356-92a3-f6cb3de62736", @@ -4691,7 +4691,7 @@ "positionClaimVotes": [ { "type": "Position Claim Vote", - "name": "Smidy13 Team Member Icons Team", + "name": "", "config": "{}", "project": "Governance", "id": "9c58e925-9027-4e87-bb74-d48fb1bc6640", @@ -4762,7 +4762,7 @@ }, { "type": "Position Claim Vote", - "name": "Smidy13 Project Contributor Smidy13 Tentacule23 Governance Project", + "name": "", "config": "{}", "project": "Governance", "id": "42afa59d-a9a1-4bac-8ff0-d005a97ee3a1", @@ -4972,7 +4972,7 @@ "positionClaimVotes": [ { "type": "Position Claim Vote", - "name": "Raplh2502 Team Member Superalgos Blog Team", + "name": "", "config": "{}", "project": "Governance", "id": "3fee7769-885c-47e3-b091-436499e09d3e", @@ -5043,7 +5043,7 @@ }, { "type": "Position Claim Vote", - "name": "Raplh2502 ", + "name": "", "config": "{}", "project": "Governance", "id": "26d27773-1c71-4363-a6b2-446d3d4e7495", @@ -5114,7 +5114,7 @@ }, { "type": "Position Claim Vote", - "name": "Raplh2502 Project Leader Thomas-Raplh2502 Data Mining Project", + "name": "", "config": "{}", "project": "Governance", "id": "5fee6b1e-3fe5-409b-806c-ecb1fa0cf7e2", @@ -5185,7 +5185,7 @@ }, { "type": "Position Claim Vote", - "name": "Raplh2502 1 Team Member Thomas-Raplh2502 Forum Team", + "name": "", "config": "{}", "project": "Governance", "id": "1267b7f2-aed2-4d4f-a69e-29ca5ad50a9f", @@ -5326,7 +5326,7 @@ "positionClaimVotes": [ { "type": "Position Claim Vote", - "name": "cozed-gh 3 Project Contributors Alexandru cozed-gh(Carl) Quantum8 PLuv Data Mining Project", + "name": "", "config": "{}", "project": "Governance", "id": "758285b2-8324-41f0-907a-3c45ad86fada", @@ -5462,7 +5462,7 @@ "positionClaimVotes": [ { "type": "Position Claim Vote", - "name": "PLuv 3 Project Contributors Alexandru cozed-gh(Carl) Quantum8 PLuv Data Mining Project", + "name": "", "config": "{}", "project": "Governance", "id": "b30458ee-4426-42db-a066-20755146ba49", @@ -5592,12 +5592,12 @@ "id": "75487f1d-1ec0-4431-8693-ce9653018e81", "savedPayload": { "position": { - "x": 5757.219077113906, - "y": 23222.354286469243 + "x": 34742.72632349072, + "y": 18422.354286469243 }, "targetPosition": { - "x": 5497.411455978574, - "y": 23372.354286469243 + "x": 34482.91870235539, + "y": 18572.354286469243 }, "floatingObject": { "isPinned": false, @@ -7689,12 +7689,12 @@ "id": "800e3388-1ea6-40ee-ace5-1811a3373e39", "savedPayload": { "position": { - "x": 5982.87542724873, - "y": 23222.608483056363 + "x": 34968.38267362554, + "y": 18422.608483056363 }, "targetPosition": { - "x": 5787.189203865294, - "y": 23450 + "x": 34772.69645024211, + "y": 18650 }, "floatingObject": { "isPinned": false, @@ -14945,12 +14945,12 @@ "id": "aa848510-1260-46ed-a855-6c0fb9dca9eb", "savedPayload": { "position": { - "x": 6062.157880626287, - "y": 23330.032392704077 + "x": 35047.66512700311, + "y": 18530.032392704077 }, "targetPosition": { - "x": 5787.189203865294, - "y": 23450 + "x": 34772.69645024211, + "y": 18650 }, "floatingObject": { "isPinned": false, @@ -15252,12 +15252,12 @@ "id": "12a12abf-c6f9-4a62-a21e-4442b2fbbada", "savedPayload": { "position": { - "x": 6086.979415301814, - "y": 23461.2173582829 + "x": 35072.48666167863, + "y": 18661.2173582829 }, "targetPosition": { - "x": 5787.189203865294, - "y": 23450 + "x": 34772.69645024211, + "y": 18650 }, "floatingObject": { "isPinned": false, @@ -15370,12 +15370,12 @@ "id": "f1ef36d6-3284-408b-9601-aa1bf4875c0a", "savedPayload": { "position": { - "x": 6052.423821916677, - "y": 23590.18058848192 + "x": 35037.931068293496, + "y": 18790.18058848192 }, "targetPosition": { - "x": 5787.189203865294, - "y": 23450 + "x": 34772.69645024211, + "y": 18650 }, "floatingObject": { "isPinned": false, @@ -15939,12 +15939,12 @@ "id": "4ece8c41-7a25-4514-9ff5-de3f609c7a00", "savedPayload": { "position": { - "x": 5965.335259537344, - "y": 23691.37933393 + "x": 34950.84250591416, + "y": 18891.37933393 }, "targetPosition": { - "x": 5787.189203865294, - "y": 23450 + "x": 34772.69645024211, + "y": 18650 }, "floatingObject": { "isPinned": false, @@ -16103,12 +16103,12 @@ "id": "37988155-ac7c-4eb2-937b-6d3b64842a3a", "savedPayload": { "position": { - "x": 5842.962686014169, - "y": 23744.769941969986 + "x": 34828.46993239099, + "y": 18944.769941969986 }, "targetPosition": { - "x": 5787.189203865294, - "y": 23450 + "x": 34772.69645024211, + "y": 18650 }, "floatingObject": { "isPinned": false, @@ -16162,12 +16162,12 @@ "id": "1d398124-3f36-40a1-8b3b-6c77ad489b92", "savedPayload": { "position": { - "x": 5787.189203865294, - "y": 23450 + "x": 34772.69645024211, + "y": 18650 }, "targetPosition": { - "x": 5497.411455978574, - "y": 23372.354286469243 + "x": 34482.91870235539, + "y": 18572.354286469243 }, "floatingObject": { "isPinned": false, @@ -16188,12 +16188,12 @@ "id": "2b8d3ce7-515c-44ad-8d80-3c2be6d7736f", "savedPayload": { "position": { - "x": 5497.411455978574, - "y": 23372.354286469243 + "x": 34482.91870235539, + "y": 18572.354286469243 }, "targetPosition": { - "x": 5237.603834843242, - "y": 23522.354286469243 + "x": 34223.11108122006, + "y": 18722.354286469243 }, "floatingObject": { "isPinned": false, @@ -16216,12 +16216,12 @@ "id": "e9c0e495-7985-4381-bf75-865d87289038", "savedPayload": { "position": { - "x": 5537.603834843242, - "y": 23522.354286469243 + "x": 34523.11108122006, + "y": 18722.354286469243 }, "targetPosition": { - "x": 5237.603834843242, - "y": 23522.354286469243 + "x": 34223.11108122006, + "y": 18722.354286469243 }, "floatingObject": { "isPinned": false, @@ -16239,12 +16239,12 @@ "id": "d5ed432e-78bf-432e-be3b-8649932f7a65", "savedPayload": { "position": { - "x": 5237.603834843242, - "y": 23522.354286469243 + "x": 34223.11108122006, + "y": 18722.354286469243 }, "targetPosition": { - "x": 4947.826086956522, - "y": 23600 + "x": 33933.333333333336, + "y": 18800 }, "floatingObject": { "isPinned": false, @@ -16400,12 +16400,12 @@ "id": "796dd30f-c90d-4b8d-a63d-89867347407b", "savedPayload": { "position": { - "x": 5237.603834843242, - "y": 23677.645713530757 + "x": 34223.11108122006, + "y": 18877.645713530757 }, "targetPosition": { - "x": 4947.826086956522, - "y": 23600 + "x": 33933.333333333336, + "y": 18800 }, "floatingObject": { "isPinned": false, @@ -16423,12 +16423,12 @@ "id": "bb390957-b8a2-4a8a-9fbf-963ea20f6eaf", "savedPayload": { "position": { - "x": 4947.826086956522, - "y": 23600 + "x": 33933.333333333336, + "y": 18800 }, "targetPosition": { - "x": 4647.826086956522, - "y": 23600 + "x": 33633.333333333336, + "y": 18800 }, "floatingObject": { "isPinned": false, @@ -16463,7 +16463,7 @@ "userDelegates": [ { "type": "User Delegate", - "name": "Tentacule23", + "name": "", "config": "{}", "project": "Governance", "id": "7afae430-9aae-4321-949c-0faf68b156f6", @@ -16504,7 +16504,7 @@ }, { "type": "User Delegate", - "name": "alexandrustefan", + "name": "", "config": "{}", "project": "Governance", "id": "da1969ba-e1fc-40f6-a246-41b0102b8e22", @@ -16545,7 +16545,7 @@ }, { "type": "User Delegate", - "name": "NAmorim", + "name": "", "config": "{\n \"percentage\": 50\n}", "project": "Governance", "id": "d8d3a46a-bcc6-4fdc-88e0-f9a37a5ebaef", @@ -16617,7 +16617,7 @@ "userDelegates": [ { "type": "User Delegate", - "name": "harrellbm", + "name": "", "config": "{}", "project": "Governance", "id": "af0bdf1a-acf9-4621-ba01-8cbf7e1be56d", @@ -16711,12 +16711,12 @@ "id": "4246052a-0eab-43a6-bdc4-d9a42a9bd694", "savedPayload": { "position": { - "x": 5167.441329227186, - "y": 23900 + "x": 34152.948575604, + "y": 19100 }, "targetPosition": { - "x": 4907.633708091854, - "y": 23750 + "x": 33893.14095446867, + "y": 18950 }, "floatingObject": { "isPinned": false, @@ -16734,12 +16734,12 @@ "id": "ed112539-01ea-4937-85cf-69612ee6115d", "savedPayload": { "position": { - "x": 4907.633708091854, - "y": 23750 + "x": 33893.14095446867, + "y": 18950 }, "targetPosition": { - "x": 4647.826086956522, - "y": 23600 + "x": 33633.333333333336, + "y": 18800 }, "floatingObject": { "isPinned": false, @@ -16929,12 +16929,12 @@ "id": "ba3bc469-3c94-444d-a5d0-8ed851aa3778", "savedPayload": { "position": { - "x": 4797.826086956522, - "y": 23859.807621135333 + "x": 33783.333333333336, + "y": 19059.807621135333 }, "targetPosition": { - "x": 4647.826086956522, - "y": 23600 + "x": 33633.333333333336, + "y": 18800 }, "floatingObject": { "isPinned": false, @@ -16952,12 +16952,12 @@ "id": "f8182a9c-f830-4ec1-a238-ac3a5efd69e6", "savedPayload": { "position": { - "x": 4647.826086956522, - "y": 23600 + "x": 33633.333333333336, + "y": 18800 }, "targetPosition": { - "x": 4347.826086956522, - "y": 23600 + "x": 33333.333333333336, + "y": 18800 }, "floatingObject": { "isPinned": false, @@ -16979,12 +16979,12 @@ "id": "9870ca2a-cefc-484b-b7fc-206d62782ebc", "savedPayload": { "position": { - "x": 4197.826086956522, - "y": 23859.807621135333 + "x": 33183.333333333336, + "y": 19059.807621135333 }, "targetPosition": { - "x": 4347.826086956522, - "y": 23600 + "x": 33333.333333333336, + "y": 18800 }, "floatingObject": { "isPinned": false, @@ -17007,22 +17007,22 @@ { "type": "Signing Account", "name": "New Signing Account", - "config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x4f5c0d007a1315fba2eabbab3c1fb4e3f2f457b3a64a263453b5a17a9f4978f6\",\n \"s\": \"0x6d92b391e9382ea649c7d88f1536e545554cf59b925fa23beb78e1695efd5b6e\",\n \"signature\": \"0x4f5c0d007a1315fba2eabbab3c1fb4e3f2f457b3a64a263453b5a17a9f4978f66d92b391e9382ea649c7d88f1536e545554cf59b925fa23beb78e1695efd5b6e1b\"\n }\n}", + "config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0xc321c45055b32456d938c214e00cbfb035efe8bda6fa20268be4683b3b89f64b\",\n \"s\": \"0x053be15689ecf8a29369814c9d6d6be0c1238497d56f6edb6be045d07df4dfea\",\n \"signature\": \"0xc321c45055b32456d938c214e00cbfb035efe8bda6fa20268be4683b3b89f64b053be15689ecf8a29369814c9d6d6be0c1238497d56f6edb6be045d07df4dfea1c\"\n }\n}", "project": "Governance", "signingAccountChild": { "type": "Social Trading Desktop App", "name": "Social Trading Desktop App # 1", "config": "{\n \"codeName\": \"Social-Trading-Desktop-App-1\"\n}", "project": "Governance", - "id": "33df9686-6aa8-4d0d-90b6-d86b9be4f97f", + "id": "012c74dd-1a61-4784-bc8a-e18555b4974e", "savedPayload": { "position": { - "x": 3666.8977890580672, - "y": 23418.508094196695 + "x": 32588.466416509047, + "y": 18618.508094196695 }, "targetPosition": { - "x": 3964.33124747021, - "y": 23379.35023653068 + "x": 32885.89987492119, + "y": 18579.35023653068 }, "floatingObject": { "isPinned": false, @@ -17037,15 +17037,15 @@ } } }, - "id": "d1fa780c-673a-442d-af85-6f1e03179a0e", + "id": "3863ebb9-c69f-40b2-8bbd-eb8f2b60a49c", "savedPayload": { "position": { - "x": 3964.33124747021, - "y": 23379.35023653068 + "x": 32885.89987492119, + "y": 18579.35023653068 }, "targetPosition": { - "x": 4261.764705882353, - "y": 23340.192378864667 + "x": 33183.333333333336, + "y": 18540.192378864667 }, "floatingObject": { "isPinned": false, @@ -17063,22 +17063,22 @@ { "type": "Signing Account", "name": "New Signing Account", - "config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xb6529251f39c0b1bd87bfb46e12bd266a27ac5217a932f07587a3a306367fc80\",\n \"s\": \"0x3bfd826e7bbc9b15e6a824e54284ce3f4a39d1d480091973953d0bf63c152f46\",\n \"signature\": \"0xb6529251f39c0b1bd87bfb46e12bd266a27ac5217a932f07587a3a306367fc803bfd826e7bbc9b15e6a824e54284ce3f4a39d1d480091973953d0bf63c152f461b\"\n }\n}", + "config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x4a48ecc069047c7e29af18652948ca7054c7e1bcf66b7bf657f82a7883631262\",\n \"s\": \"0x3cfef2f134a36a8879d64195e96fd2e22627c0363a05a1b4efb6101699b1a669\",\n \"signature\": \"0x4a48ecc069047c7e29af18652948ca7054c7e1bcf66b7bf657f82a78836312623cfef2f134a36a8879d64195e96fd2e22627c0363a05a1b4efb6101699b1a6691b\"\n }\n}", "project": "Governance", "signingAccountChild": { "type": "Social Trading Mobile App", "name": "Social Trading Mobile App # 1", "config": "{\n \"codeName\": \"Social-Trading-Mobile-App-1\"\n}", "project": "Governance", - "id": "da524b16-839a-40cd-b90f-4ed40e745594", + "id": "2d03d11f-b553-4b01-9291-9e13da15dd54", "savedPayload": { "position": { - "x": 3682.209210108912, - "y": 23184.900951803153 + "x": 32603.777837559894, + "y": 18384.900951803153 }, "targetPosition": { - "x": 3971.9869579956326, - "y": 23262.54666533391 + "x": 32893.555585446615, + "y": 18462.54666533391 }, "floatingObject": { "isPinned": false, @@ -17093,15 +17093,15 @@ } } }, - "id": "d57afbcc-f711-4e92-9b5e-8fbf86c12acb", + "id": "c84e9e64-7527-4dec-ac58-93696e19a756", "savedPayload": { "position": { - "x": 3971.9869579956326, - "y": 23262.54666533391 + "x": 32893.555585446615, + "y": 18462.54666533391 }, "targetPosition": { - "x": 4261.764705882353, - "y": 23340.192378864667 + "x": 33183.333333333336, + "y": 18540.192378864667 }, "floatingObject": { "isPinned": false, @@ -17119,22 +17119,22 @@ { "type": "Signing Account", "name": "New Signing Account", - "config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0xd5cb851afd167250a1735e96c03e7e5a4ebe2829b3e45e545f9a6e53c56360a6\",\n \"s\": \"0x4dcf855cd4fe4d711e8d18fc95ec587343457d985b93bdc7560079f3a42a424c\",\n \"signature\": \"0xd5cb851afd167250a1735e96c03e7e5a4ebe2829b3e45e545f9a6e53c56360a64dcf855cd4fe4d711e8d18fc95ec587343457d985b93bdc7560079f3a42a424c1c\"\n }\n}", + "config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x3d3791843477eb85b7896ccbc55bfb41189c3fa67f5a098f40e2ddf9a2331ffa\",\n \"s\": \"0x09114da1c09e2d064fb07accf58310f2e13400ae564eb52e471d18d955ea9569\",\n \"signature\": \"0x3d3791843477eb85b7896ccbc55bfb41189c3fa67f5a098f40e2ddf9a2331ffa09114da1c09e2d064fb07accf58310f2e13400ae564eb52e471d18d955ea95691b\"\n }\n}", "project": "Governance", "signingAccountChild": { "type": "Social Trading Server App", "name": "Social Trading Server App # 1", "config": "{\n \"codeName\": \"Social-Trading-Server-App-1\"\n}", "project": "Governance", - "id": "0609495c-0248-4f9b-9006-02f0e02c76aa", + "id": "c3d218ee-119f-4bd9-9349-8a194844ecd9", "savedPayload": { "position": { - "x": 3785.752701707612, - "y": 22974.935521459432 + "x": 32707.321329158593, + "y": 18174.935521459432 }, "targetPosition": { - "x": 4023.7587037949825, - "y": 23157.56395016205 + "x": 32945.327331245964, + "y": 18357.56395016205 }, "floatingObject": { "isPinned": false, @@ -17149,15 +17149,15 @@ } } }, - "id": "42cb9bd7-bfc6-47fe-98f5-f56670f53c5d", + "id": "75f17a55-bf33-4e69-b842-b424a6f517e8", "savedPayload": { "position": { - "x": 4023.7587037949825, - "y": 23157.56395016205 + "x": 32945.327331245964, + "y": 18357.56395016205 }, "targetPosition": { - "x": 4261.764705882353, - "y": 23340.192378864667 + "x": 33183.333333333336, + "y": 18540.192378864667 }, "floatingObject": { "isPinned": false, @@ -17175,22 +17175,22 @@ { "type": "Signing Account", "name": "New Signing Account", - "config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x171d95f1ff727916737828707fe408d656454598480c1c5793df392ba0be288c\",\n \"s\": \"0x7eb1242017caa74ff48251ea4a5d51345b31758f5054c961fd19199a9fb2eab7\",\n \"signature\": \"0x171d95f1ff727916737828707fe408d656454598480c1c5793df392ba0be288c7eb1242017caa74ff48251ea4a5d51345b31758f5054c961fd19199a9fb2eab71b\"\n }\n}", + "config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0x0098b881f17a46a940d6dbb11121217c29330ea1a357ad72ed921448539ceeab\",\n \"s\": \"0x28c9f7cf445ab86caaa01f86d4456f4bdf0a81757dc0a0c80351d481b7df5ad3\",\n \"signature\": \"0x0098b881f17a46a940d6dbb11121217c29330ea1a357ad72ed921448539ceeab28c9f7cf445ab86caaa01f86d4456f4bdf0a81757dc0a0c80351d481b7df5ad31c\"\n }\n}", "project": "Governance", "signingAccountChild": { "type": "Algo Traders Platform", "name": "Algo Traders Platform # 1", "config": "{\n \"codeName\": \"Algo-Traders-Platform-1\"\n}", "project": "Governance", - "id": "baa7d72c-b576-480f-b160-2cc46ce47815", + "id": "bcffb701-754d-4685-ad09-8bf3f09265d9", "savedPayload": { "position": { - "x": 3961.764705882353, - "y": 22820.577136594 + "x": 32883.333333333336, + "y": 18020.577136594 }, "targetPosition": { - "x": 4111.764705882353, - "y": 23080.384757729335 + "x": 33033.333333333336, + "y": 18280.384757729335 }, "floatingObject": { "isPinned": false, @@ -17205,15 +17205,15 @@ } } }, - "id": "47f2db6d-7fe6-456d-aeb0-7128524aaa36", + "id": "377ee3ed-49e4-415d-87b3-946024f0a1ef", "savedPayload": { "position": { - "x": 4111.764705882353, - "y": 23080.384757729335 + "x": 33033.333333333336, + "y": 18280.384757729335 }, "targetPosition": { - "x": 4261.764705882353, - "y": 23340.192378864667 + "x": 33183.333333333336, + "y": 18540.192378864667 }, "floatingObject": { "isPinned": false, @@ -17231,22 +17231,22 @@ { "type": "Signing Account", "name": "New Signing Account", - "config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0x278999b03f16b7be639bf28e414bb6620f09504fbd5bfe2aa0283044036cdf0c\",\n \"s\": \"0x377237529c066739a79e545d300b911be9c525c0961f8f1edaa7df5e6322d65e\",\n \"signature\": \"0x278999b03f16b7be639bf28e414bb6620f09504fbd5bfe2aa0283044036cdf0c377237529c066739a79e545d300b911be9c525c0961f8f1edaa7df5e6322d65e1c\"\n }\n}", + "config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xfd5dfc5b7d84dac898c43880c6234c041142dccc5bf6b57e7eb671497e0cafcf\",\n \"s\": \"0x0bc0cc01159b307fa6d5fa46dbd3a1e71e4fbeca349969177014e1e9d204f9f3\",\n \"signature\": \"0xfd5dfc5b7d84dac898c43880c6234c041142dccc5bf6b57e7eb671497e0cafcf0bc0cc01159b307fa6d5fa46dbd3a1e71e4fbeca349969177014e1e9d204f9f31b\"\n }\n}", "project": "Governance", "signingAccountChild": { "type": "P2P Network Node", "name": "P2P Network Node # 1", "config": "{\n \"codeName\": \"P2P-Network-Node-1\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"18042\"\n}", "project": "Governance", - "id": "7c917c18-f13f-41ca-a739-a440421c7bc4", + "id": "bb0f0417-9dfb-47a3-941f-dcfa82fbaea1", "savedPayload": { "position": { - "x": 4183.4489905503215, - "y": 22745.325462040382 + "x": 33105.0176180013, + "y": 17945.325462040382 }, "targetPosition": { - "x": 4222.606848216337, - "y": 23042.758920452525 + "x": 33144.17547566732, + "y": 18242.758920452525 }, "floatingObject": { "isPinned": false, @@ -17261,15 +17261,15 @@ } } }, - "id": "2a499940-eb6f-4328-9f67-7c915b01b3db", + "id": "7c5f14f9-63c2-42fa-98ee-1d4a36590cf4", "savedPayload": { "position": { - "x": 4222.606848216337, - "y": 23042.758920452525 + "x": 33144.17547566732, + "y": 18242.758920452525 }, "targetPosition": { - "x": 4261.764705882353, - "y": 23340.192378864667 + "x": 33183.333333333336, + "y": 18540.192378864667 }, "floatingObject": { "isPinned": false, @@ -17287,22 +17287,22 @@ { "type": "Signing Account", "name": "New Signing Account", - "config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x901e04cbe4cfd2bdba2429349d74181b953e3c048a9260a9fc27389430de80e2\",\n \"s\": \"0x22f448e151aec1e5cc1c96177fd10e8fea47f3c7a2f001412348b379685728ea\",\n \"signature\": \"0x901e04cbe4cfd2bdba2429349d74181b953e3c048a9260a9fc27389430de80e222f448e151aec1e5cc1c96177fd10e8fea47f3c7a2f001412348b379685728ea1b\"\n }\n}", + "config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0xa4b34d7c9e7644f4fddf7aa2d969eb7dac3b8dbcc36c559b99fa93bc5ea3c6d3\",\n \"s\": \"0x7a5087de3f5470cb173d73949c05c00438bc16138f43c7aebbe2b80d7d45122b\",\n \"signature\": \"0xa4b34d7c9e7644f4fddf7aa2d969eb7dac3b8dbcc36c559b99fa93bc5ea3c6d37a5087de3f5470cb173d73949c05c00438bc16138f43c7aebbe2b80d7d45122b1c\"\n }\n}", "project": "Governance", "signingAccountChild": { "type": "P2P Network Node", "name": "P2P Network Node # 2", - "config": "{\n \"codeName\": \"P2P-Network-Node-2\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"18042\"\n}", + "config": "{\n \"codeName\": \"P2P-Network-Node-2\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"18043\"\n}", "project": "Governance", - "id": "b7b14ba1-da1a-4f8b-8fd0-0929bfb9afdf", + "id": "76fa8a24-9ab4-4eaf-82f2-458ba557b204", "savedPayload": { "position": { - "x": 4417.056132943866, - "y": 22760.636883091225 + "x": 33338.62476039485, + "y": 17960.636883091225 }, "targetPosition": { - "x": 4339.41041941311, - "y": 23050.414630977946 + "x": 33260.97904686409, + "y": 18250.414630977946 }, "floatingObject": { "isPinned": false, @@ -17317,15 +17317,15 @@ } } }, - "id": "93fcdc33-1f94-4a07-8838-50205e305a21", + "id": "48544424-5b62-417b-897d-9164b26fcd56", "savedPayload": { "position": { - "x": 4339.41041941311, - "y": 23050.414630977946 + "x": 33260.97904686409, + "y": 18250.414630977946 }, "targetPosition": { - "x": 4261.764705882353, - "y": 23340.192378864667 + "x": 33183.333333333336, + "y": 18540.192378864667 }, "floatingObject": { "isPinned": false, @@ -17343,22 +17343,22 @@ { "type": "Signing Account", "name": "New Signing Account", - "config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0xc938ab3cadd77fdca413d882b04f0171a46dac0c0e55c72f3c7a84a9552d94ed\",\n \"s\": \"0x1d42a148e5c1380395e79ec66649515b4220baff0d662bbaebbba90e3b71142f\",\n \"signature\": \"0xc938ab3cadd77fdca413d882b04f0171a46dac0c0e55c72f3c7a84a9552d94ed1d42a148e5c1380395e79ec66649515b4220baff0d662bbaebbba90e3b71142f1c\"\n }\n}", + "config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0x700e273467c374fda2062fbaf42fadfd74a0c3995498f75ffd1a66c7376e7c60\",\n \"s\": \"0x3531a0c135fcdd578b5069799b3fc246c9cf1cee325a258f6d2960d20f2a98e6\",\n \"signature\": \"0x700e273467c374fda2062fbaf42fadfd74a0c3995498f75ffd1a66c7376e7c603531a0c135fcdd578b5069799b3fc246c9cf1cee325a258f6d2960d20f2a98e61c\"\n }\n}", "project": "Governance", "signingAccountChild": { "type": "P2P Network Node", "name": "P2P Network Node # 3", - "config": "{\n \"codeName\": \"P2P-Network-Node-3\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"18042\"\n}", + "config": "{\n \"codeName\": \"P2P-Network-Node-3\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"18044\"\n}", "project": "Governance", - "id": "47a35fc3-5968-494b-89db-dcbc53d993ea", + "id": "297e57c2-3c1a-4170-b710-d2705804205b", "savedPayload": { "position": { - "x": 4627.021563287586, - "y": 22864.180374689924 + "x": 33548.59019073856, + "y": 18064.180374689924 }, "targetPosition": { - "x": 4444.39313458497, - "y": 23102.186376777296 + "x": 33365.96176203595, + "y": 18302.186376777296 }, "floatingObject": { "isPinned": false, @@ -17373,15 +17373,15 @@ } } }, - "id": "5322bfda-90ae-4f5d-9bd1-3cf2ba67b854", + "id": "b39e1c4d-4170-4134-ae85-fc9fa7f3eb47", "savedPayload": { "position": { - "x": 4444.39313458497, - "y": 23102.186376777296 + "x": 33365.96176203595, + "y": 18302.186376777296 }, "targetPosition": { - "x": 4261.764705882353, - "y": 23340.192378864667 + "x": 33183.333333333336, + "y": 18540.192378864667 }, "floatingObject": { "isPinned": false, @@ -17397,20 +17397,20 @@ } } ], - "id": "1aae1fa4-e5cf-48de-a25e-20001523da70", + "id": "ecf6aa0a-bf05-48e4-a7ee-7a714fbdbce2", "savedPayload": { "position": { - "x": 4197.826086956522, - "y": 23340.192378864667 + "x": 33183.333333333336, + "y": 18540.192378864667 }, "targetPosition": { - "x": 4347.826086956522, - "y": 23600 + "x": 33333.333333333336, + "y": 18800 }, "floatingObject": { "isPinned": false, "isFrozen": false, - "isCollapsed": true, + "isCollapsed": false, "angleToParent": 1, "distanceToParent": 3, "arrangementStyle": 0 @@ -17423,17 +17423,17 @@ "id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", "savedPayload": { "position": { - "x": 4347.826086956522, - "y": 23600 + "x": 33333.333333333336, + "y": 18800 }, "targetPosition": { - "x": 4347.826086956522, - "y": 23600 + "x": 33333.333333333336, + "y": 18800 }, "floatingObject": { "isPinned": false, "isFrozen": false, - "isCollapsed": true, + "isCollapsed": false, "angleToParent": 1, "distanceToParent": 3, "arrangementStyle": 0 diff --git a/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js b/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js index 8592bc2da..285c171e5 100644 --- a/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js +++ b/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js @@ -330,6 +330,7 @@ function newGovernanceFunctionLibraryProfileConstructor() { } let secret = { + signingAccountChildId: signingAccountChild.id, signingAccountChildName: signingAccountChild.name, signingAccountChildType: targetNodeType, signingAccountChildCodeName: codeName, diff --git a/Projects/Network/SA/Modules/P2PNetwork.js b/Projects/Network/SA/Modules/P2PNetwork.js index 8006a6925..890e03bbc 100644 --- a/Projects/Network/SA/Modules/P2PNetwork.js +++ b/Projects/Network/SA/Modules/P2PNetwork.js @@ -17,13 +17,16 @@ exports.newNetworkModulesP2PNetwork = function newNetworkModulesP2PNetwork() { } async function initialize() { + p2pNodesToConnect = [] /* We will setup here the maps and arryas we will need to operate within the P2P Network. */ - let thisP2PNodeId = SA.secrets.map.get(global.env.P2P_NETWORK_NODE_SIGNING_ACCOUNT).signingAccountNodeId + let thisP2PNodeId = SA.secrets.map.get(global.env.P2P_NETWORK_NODE_SIGNING_ACCOUNT).signingAccountChildId for (let i = 0; i < SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES.length; i++) { let p2pNetworkNode = SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES[i] - + if (thisP2PNodeId !== p2pNetworkNode.node.id) { + p2pNodesToConnect.push(p2pNetworkNode) + } } } From 6ef1d036b22f95a4666b713c961e91bf3b5d1d41 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 4 Nov 2021 12:53:30 +0100 Subject: [PATCH 06/20] DK.running refactored --- Desktop/DesktopApp.js | 136 +++++------------- Network/NetwokNode.js | 2 +- Projects/Network/SA/Modules/P2PNetwork.js | 18 ++- .../Network/SA/Modules/WebSocketsAppClient.js | 30 ++-- .../DK/modules/WebAppInterface.js | 6 +- 5 files changed, 59 insertions(+), 133 deletions(-) diff --git a/Desktop/DesktopApp.js b/Desktop/DesktopApp.js index 02e44aa7a..fc5396f93 100644 --- a/Desktop/DesktopApp.js +++ b/Desktop/DesktopApp.js @@ -1,126 +1,56 @@ exports.newDesktopApp = function newDesktopApp() { let thisObject = { + socialGraph: undefined, + p2pMetwork: undefined, + webSocketsClient: undefined, + webSocketsInterface: undefined, run: run } + DK.desktopApp = thisObject + return thisObject async function run() { - /* - Here we will store our running objects: - */ - DK.running = {} /* This is the Personal Social Graph for the user running this App. */ - DK.running.socialGraph = DK.projects.socialTrading.modules.socialGraph.newSocialTradingModulesSocialGraph() - await DK.running.socialGraph.initialize() + thisObject.socialGraph = DK.projects.socialTrading.modules.socialGraph.newSocialTradingModulesSocialGraph() + await thisObject.socialGraph.initialize() + /* + We can join now the P2P Network as a client app. + */ + thisObject.p2pMetwork = SA.projects.network.modules.p2pMetwork.newNetworkModulesP2PNetwork() + await thisObject.p2pMetwork.initialize('Network Client') + /* + Here we will pick a Network Node from all users profiles available that do have a Network Node running. // TODO + In the meantime, we will assume that we have chosen the following Network Node to connect to. + */ + selectedNetworkNode = { + userProfileHandle: "Luis-Fernando-Molina", + blockchainAccount: "0xeBDCB7a73c4796ca9F025d005630eCe773dd9e54", + ranking: 0, + host: "localhost", + port: global.env.NETWORK_WEB_SOCKETS_INTERFACE_PORT + } /* This is the Web Sockets client that interacts with the Superalgos Network. */ - DK.running.webSocketsClient = SA.projects.network.modules.webSocketsAppClient.newNetworkModulesWebSocketsAppClient() - await DK.running.webSocketsClient.initialize() + thisObject.webSocketsClient = SA.projects.network.modules.webSocketsAppClient.newNetworkModulesWebSocketsAppClient() + await thisObject.webSocketsClient.initialize('Network Client', selectedNetworkNode) console.log('Desktop Client Connected to Network Node via Web Sockets ................... Connected to port ' + global.env.NETWORK_WEB_SOCKETS_INTERFACE_PORT) - - /* These are the Network Interfaces by which the Web App interacts with this Desktop Client.*/ - - DK.running.webSocketsInterface = DK.projects.socialTrading.modules.webSocketsInterface.newDesktopModulesWebSocketsInterface() - DK.running.webSocketsInterface.initialize() + /* + These are the Network Interfaces by which the Web App interacts with this Desktop Client. + */ + thisObject.webSocketsInterface = DK.projects.socialTrading.modules.webSocketsInterface.newDesktopModulesWebSocketsInterface() + thisObject.webSocketsInterface.initialize() console.log('Desktop Client Web Sockets Interface ....................................... Listening at port ' + global.env.DESKTOP_WEB_SOCKETS_INTERFACE_PORT) - DK.running.httpInterface = DK.projects.socialTrading.modules.httpInterface.newDesktopModulesHttpInterface() - DK.running.httpInterface.initialize() + thisObject.webSocketsClient = DK.projects.socialTrading.modules.httpInterface.newDesktopModulesHttpInterface() + thisObject.httpInterface.initialize() console.log('Desktop Client Http Interface .............................................. Listening at port ' + global.env.DESKTOP_HTTP_INTERFACE_PORT) - return - - let queryMessage - let query - /* - Test Query User Profiles. - */ - queryMessage = { - queryType: SA.projects.socialTrading.globals.queryTypes.USER_PROFILES, - emitterUserProfileId: SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileId, - initialIndex: 'Last', - amountRequested: 10, - direction: 'Past' - } - - query = { - requestType: 'Query', - queryMessage: JSON.stringify(queryMessage) - } - - await DK.webSocketsClient.sendMessage( - JSON.stringify(query) - ) - .then(showProfiles) - .catch(onError) - - 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: SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileId, - 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. - */ - queryMessage = { - queryType: SA.projects.socialTrading.globals.queryTypes.USER_PROFILE_STATS, - emitterUserProfileId: SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileId, - targetUserProfileId: SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileId - } - - query = { - requestType: 'Query', - queryMessage: JSON.stringify(queryMessage) - } - - await DK.webSocketsClient.sendMessage( - JSON.stringify(query) - ) - .then(showProfilesStats) - .catch(onError) - - function showProfilesStats(profile) { - console.log(profile) - } - - /* - Error Handling - */ - function onError(errorMessage) { - console.log('[ERROR] Query not executed. ' + errorMessage) - } } } diff --git a/Network/NetwokNode.js b/Network/NetwokNode.js index 74ffc6326..5aa0f2eb9 100644 --- a/Network/NetwokNode.js +++ b/Network/NetwokNode.js @@ -29,6 +29,6 @@ exports.newNetworkNode = function newNetworkNode() { We can join now the P2P Network as a new peer there. */ thisObject.p2pMetwork = SA.projects.network.modules.p2pMetwork.newNetworkModulesP2PNetwork() - await thisObject.p2pMetwork.initialize() + await thisObject.p2pMetwork.initialize('Network Peer') } } diff --git a/Projects/Network/SA/Modules/P2PNetwork.js b/Projects/Network/SA/Modules/P2PNetwork.js index 890e03bbc..5f6a90bc2 100644 --- a/Projects/Network/SA/Modules/P2PNetwork.js +++ b/Projects/Network/SA/Modules/P2PNetwork.js @@ -4,7 +4,7 @@ exports.newNetworkModulesP2PNetwork = function newNetworkModulesP2PNetwork() { of this current node to other peers. */ let thisObject = { - joinTheNetworkAsPeer: joinTheNetworkAsPeer, + joinTheNetworkAsNetworkPeer: joinTheNetworkAsNetworkPeer, /* Framework Functions */ initialize: initialize, finalize: finalize @@ -16,8 +16,9 @@ exports.newNetworkModulesP2PNetwork = function newNetworkModulesP2PNetwork() { } - async function initialize() { - p2pNodesToConnect = [] + async function initialize(callerRole) { + + let p2pNodesToConnect = [] /* We will setup here the maps and arryas we will need to operate within the P2P Network. */ @@ -28,9 +29,18 @@ exports.newNetworkModulesP2PNetwork = function newNetworkModulesP2PNetwork() { p2pNodesToConnect.push(p2pNetworkNode) } } + + switch (callerRole) { + case 'Network Client': { + break + } + case 'Network Peer': { + break + } + } } - function joinTheNetworkAsPeer() { + function joinTheNetworkAsNetworkPeer() { /* To join the network we will need to thorugh the list of Network Nodes and pick one to connect to. */ diff --git a/Projects/Network/SA/Modules/WebSocketsAppClient.js b/Projects/Network/SA/Modules/WebSocketsAppClient.js index 2fe199596..9d08ed187 100644 --- a/Projects/Network/SA/Modules/WebSocketsAppClient.js +++ b/Projects/Network/SA/Modules/WebSocketsAppClient.js @@ -10,7 +10,6 @@ exports.newNetworkModulesWebSocketsAppClient = function newNetworkModulesWebSock let web3 let called = {} - let selectedNetworkNode // This is a Network Node we pick to try to connect to. let onMessageFunctionsMap = new Map() return thisObject @@ -26,27 +25,14 @@ exports.newNetworkModulesWebSocketsAppClient = function newNetworkModulesWebSock onMessageFunctionsMap = undefined } - async function initialize() { - /* - Here we will pick a Network Node from all users profiles available that do have a Network Node running. // TODO - In the meantime, we will assume that we have chosen the following Network Node to connect to. - */ + async function initialize(callerRole, p2pNetworkNode) { + web3 = new SA.nodeModules.web3() - - selectedNetworkNode = { - userProfileHandle: "Luis-Fernando-Molina", - blockchainAccount: "0xeBDCB7a73c4796ca9F025d005630eCe773dd9e54", - ranking: 0, - host: "localhost", - port: global.env.NETWORK_WEB_SOCKETS_INTERFACE_PORT - } - - socketClient = new SA.nodeModules.ws('ws://' + selectedNetworkNode.host + ':' + selectedNetworkNode.port) - - await setUpWebsocketClient() + socketClient = new SA.nodeModules.ws('ws://' + p2pNetworkNode.host + ':' + p2pNetworkNode.port) + await setUpWebsocketClient(callerRole, p2pNetworkNode) } - async function setUpWebsocketClient() { + async function setUpWebsocketClient(callerRole) { return new Promise(connectToNewtwork) @@ -85,7 +71,7 @@ exports.newNetworkModulesWebSocketsAppClient = function newNetworkModulesWebSock let message = { messageType: 'Handshake', - callerRole: 'Network Client', + callerRole: callerRole, callerProfileHandle: SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileHandle, callerTimestamp: callerTimestamp, step: 'One' @@ -116,7 +102,7 @@ exports.newNetworkModulesWebSocketsAppClient = function newNetworkModulesWebSock We will check that the blockchain account taken from the signature matches the one we have on record for the user profile of the Network Node we are calling. */ - if (called.blockchainAccount !== selectedNetworkNode.blockchainAccount) { + if (called.blockchainAccount !== p2pNetworkNode.blockchainAccount) { console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node called does not have the expected Profile Handle.') reject() return @@ -138,7 +124,7 @@ exports.newNetworkModulesWebSocketsAppClient = function newNetworkModulesWebSock We will check that the Network Node that responded has the same User Profile Handle that we have on record, otherwise something is wrong and we should not proceed. */ - if (signedMessage.calledProfileHandle !== selectedNetworkNode.userProfileHandle) { + if (signedMessage.calledProfileHandle !== p2pNetworkNode.userProfileHandle) { console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node called does not have the expected Profile Handle.') reject() return diff --git a/Projects/Social-Trading/DK/modules/WebAppInterface.js b/Projects/Social-Trading/DK/modules/WebAppInterface.js index 2eedc20bd..e9b7c75f5 100644 --- a/Projects/Social-Trading/DK/modules/WebAppInterface.js +++ b/Projects/Social-Trading/DK/modules/WebAppInterface.js @@ -58,11 +58,11 @@ exports.newSocialTradingModulesWebAppInterface = function newSocialTradingModule response = { result: 'Ok', message: 'Web App Interface Query Processed.', - data: await DK.running.webSocketsClient.sendMessage(JSON.stringify(messageHeader)) + data: await DK.desktopApp.webSocketsClient.sendMessage(JSON.stringify(messageHeader)) } } else { - let events = await DK.running.webSocketsClient.sendMessage(JSON.stringify(messageHeader)) + let events = await DK.desktopApp.webSocketsClient.sendMessage(JSON.stringify(messageHeader)) for (let i = 0; i < events.length; i++) { let event = events[i] if (event.eventType === SA.projects.socialTrading.globals.eventTypes.NEW_USER_POST) { @@ -132,7 +132,7 @@ exports.newSocialTradingModulesWebAppInterface = function newSocialTradingModule let response = { result: 'Ok', message: 'Web App Interface Event Processed.', - data: await DK.running.webSocketsClient.sendMessage(JSON.stringify(messageHeader)) + data: await DK.desktopApp.webSocketsClient.sendMessage(JSON.stringify(messageHeader)) } return response } From 28ac81cc70c7a3d52f372cd9d37ab7f95217d9f5 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 4 Nov 2021 13:52:58 +0100 Subject: [PATCH 07/20] Ready to debug changes --- Desktop/DesktopApp.js | 13 +- Projects/Network/SA/Modules/P2PNetwork.js | 30 ++- Projects/Network/SA/Modules/UserProfiles.js | 21 +- .../Network/SA/Modules/WebSocketsAppClient.js | 255 ------------------ .../Modules/WebSocketsNetworkClient.js | 36 +-- Projects/ProjectsSchema.json | 16 +- 6 files changed, 57 insertions(+), 314 deletions(-) delete mode 100644 Projects/Network/SA/Modules/WebSocketsAppClient.js rename Projects/Network/{NT => SA}/Modules/WebSocketsNetworkClient.js (89%) diff --git a/Desktop/DesktopApp.js b/Desktop/DesktopApp.js index fc5396f93..329542347 100644 --- a/Desktop/DesktopApp.js +++ b/Desktop/DesktopApp.js @@ -24,20 +24,13 @@ exports.newDesktopApp = function newDesktopApp() { thisObject.p2pMetwork = SA.projects.network.modules.p2pMetwork.newNetworkModulesP2PNetwork() await thisObject.p2pMetwork.initialize('Network Client') /* - Here we will pick a Network Node from all users profiles available that do have a Network Node running. // TODO - In the meantime, we will assume that we have chosen the following Network Node to connect to. + Here we will pick a Network Node from all users profiles available that do have a Network Node running. */ - selectedNetworkNode = { - userProfileHandle: "Luis-Fernando-Molina", - blockchainAccount: "0xeBDCB7a73c4796ca9F025d005630eCe773dd9e54", - ranking: 0, - host: "localhost", - port: global.env.NETWORK_WEB_SOCKETS_INTERFACE_PORT - } + let selectedNetworkNode = thisObject.p2pMetwork.p2pNodesToConnect[0] /* This is the Web Sockets client that interacts with the Superalgos Network. */ - thisObject.webSocketsClient = SA.projects.network.modules.webSocketsAppClient.newNetworkModulesWebSocketsAppClient() + thisObject.webSocketsClient = SA.projects.network.modules.webSocketsNetworkClient.newNetworkModulesWebSocketsNetworkClient() await thisObject.webSocketsClient.initialize('Network Client', selectedNetworkNode) console.log('Desktop Client Connected to Network Node via Web Sockets ................... Connected to port ' + global.env.NETWORK_WEB_SOCKETS_INTERFACE_PORT) /* diff --git a/Projects/Network/SA/Modules/P2PNetwork.js b/Projects/Network/SA/Modules/P2PNetwork.js index 5f6a90bc2..61ae16c87 100644 --- a/Projects/Network/SA/Modules/P2PNetwork.js +++ b/Projects/Network/SA/Modules/P2PNetwork.js @@ -5,6 +5,7 @@ exports.newNetworkModulesP2PNetwork = function newNetworkModulesP2PNetwork() { */ let thisObject = { joinTheNetworkAsNetworkPeer: joinTheNetworkAsNetworkPeer, + p2pNodesToConnect: undefined, /* Framework Functions */ initialize: initialize, finalize: finalize @@ -13,28 +14,31 @@ exports.newNetworkModulesP2PNetwork = function newNetworkModulesP2PNetwork() { return thisObject function finalize() { - + thisObject.p2pNodesToConnect = undefined } async function initialize(callerRole) { - let p2pNodesToConnect = [] - /* - We will setup here the maps and arryas we will need to operate within the P2P Network. - */ - let thisP2PNodeId = SA.secrets.map.get(global.env.P2P_NETWORK_NODE_SIGNING_ACCOUNT).signingAccountChildId - for (let i = 0; i < SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES.length; i++) { - let p2pNetworkNode = SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES[i] - if (thisP2PNodeId !== p2pNetworkNode.node.id) { - p2pNodesToConnect.push(p2pNetworkNode) - } - } - switch (callerRole) { case 'Network Client': { + thisObject.p2pNodesToConnect = [] + + for (let i = 0; i < SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES.length; i++) { + let p2pNetworkNode = SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES[i] + thisObject.p2pNodesToConnect.push(p2pNetworkNode) + } break } case 'Network Peer': { + thisObject.p2pNodesToConnect = [] + + let thisP2PNodeId = SA.secrets.map.get(global.env.P2P_NETWORK_NODE_SIGNING_ACCOUNT).signingAccountChildId + for (let i = 0; i < SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES.length; i++) { + let p2pNetworkNode = SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES[i] + if (thisP2PNodeId !== p2pNetworkNode.node.id) { + thisObject.p2pNodesToConnect.push(p2pNetworkNode) + } + } break } } diff --git a/Projects/Network/SA/Modules/UserProfiles.js b/Projects/Network/SA/Modules/UserProfiles.js index 746912e69..8e473c7d6 100644 --- a/Projects/Network/SA/Modules/UserProfiles.js +++ b/Projects/Network/SA/Modules/UserProfiles.js @@ -69,9 +69,26 @@ exports.newNetworkModulesUserProfiles = function newNetworkModulesUserProfiles() /* 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 (signingAccount.signingAccountChild.type === "P2P Network Node") { + if ( + signingAccount.signingAccountChild.type === "P2P Network Node" && + signingAccount.signingAccountChild.config === undefined + ) { + let condig + try { + condig = JSON.parse(signingAccount.signingAccountChild.config) + } catch (err) { + console.log('P2P Network Node Config not in JSON format. userProfileHandle = ' + userHandle + ' NodeId = ' + signingAccount.signingAccountChild.id) + continue + } + if (config.host === undefined) { + continue + } + if (config.webSocketsPort === undefined) { + continue + } + p2pNetworkNode = SA.projects.network.modules.p2pMetworkNode.newNetworkModulesP2PNetworkNode() - p2pMetworkNode.initialize(signingAccount.signingAccountChild, userPofile) + p2pMetworkNode.initialize(signingAccount.signingAccountChild, userPofile) SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES.push(p2pNetworkNode) } } diff --git a/Projects/Network/SA/Modules/WebSocketsAppClient.js b/Projects/Network/SA/Modules/WebSocketsAppClient.js deleted file mode 100644 index 9d08ed187..000000000 --- a/Projects/Network/SA/Modules/WebSocketsAppClient.js +++ /dev/null @@ -1,255 +0,0 @@ -exports.newNetworkModulesWebSocketsAppClient = function newNetworkModulesWebSocketsAppClient() { - - let thisObject = { - sendMessage: sendMessage, - initialize: initialize, - finalize: finalize - } - - let socketClient - - let web3 - let called = {} - let onMessageFunctionsMap = new Map() - - return thisObject - - function finalize() { - socketClient.close() - socketClient = undefined - networkInterface = undefined - peerInterface = undefined - - web3 = undefined - called = undefined - onMessageFunctionsMap = undefined - } - - async function initialize(callerRole, p2pNetworkNode) { - - web3 = new SA.nodeModules.web3() - socketClient = new SA.nodeModules.ws('ws://' + p2pNetworkNode.host + ':' + p2pNetworkNode.port) - await setUpWebsocketClient(callerRole, p2pNetworkNode) - } - - async function setUpWebsocketClient(callerRole) { - - return new Promise(connectToNewtwork) - - function connectToNewtwork(resolve, reject) { - - try { - - socketClient.onopen = () => { onConnection() } - socketClient.onerror = err => { onError(err) } - - function onConnection() { - - handshakeProcedure() - - function handshakeProcedure() { - - let callerTimestamp - - stepOneRequest() - - function stepOneRequest() { - /* - Send Handshake Message Step One: - - At Step One we will just say hello, identify ourselves - as a Network Client, and send the Network Node our - User Profile Handle. - - This Handle will be signed by the Network Node to prove - it's ouwn identity, and later we will sign it's own handle - to prove ours. - */ - socketClient.onmessage = socketMessage => { stepOneResponse(socketMessage) } - - callerTimestamp = (new Date()).valueOf() - - let message = { - messageType: 'Handshake', - callerRole: callerRole, - callerProfileHandle: SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileHandle, - callerTimestamp: callerTimestamp, - step: 'One' - } - socketClient.send(JSON.stringify(message)) - } - - function stepOneResponse(socketMessage) { - let response = JSON.parse(socketMessage.data) - - if (response.result !== 'Ok') { - console.log('[ERROR] Web Sockets Client -> stepOneResponse -> response.message = ' + response.message) - reject() - return - } - - let signature = JSON.parse(response.signature) - called.blockchainAccount = web3.eth.accounts.recover(signature) - /* - We will check that the signature received produces a valid Blockchain Account. - */ - if (called.blockchainAccount === undefined) { - console.log('[ERROR] Web Sockets Client -> stepOneResponse -> Signature does not produce a valid Blockchain Account.') - reject() - return - } - /* - We will check that the blockchain account taken from the signature matches - the one we have on record for the user profile of the Network Node we are calling. - */ - if (called.blockchainAccount !== p2pNetworkNode.blockchainAccount) { - console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node called does not have the expected Profile Handle.') - reject() - return - } - - let signedMessage = JSON.parse(signature.message) - /* - We will verify that the signature belongs to the signature.message. - To do this we will hash the signature.message and see if we get - the same hash of the signature. - */ - let hash = web3.eth.accounts.hashMessage(signature.message) - if (hash !== signature.messageHash) { - console.log('[ERROR] Web Sockets Client -> stepOneResponse -> signature.message Hashed Does Not Match signature.messageHash.') - reject() - return - } - /* - We will check that the Network Node that responded has the same User Profile Handle - that we have on record, otherwise something is wrong and we should not proceed. - */ - if (signedMessage.calledProfileHandle !== p2pNetworkNode.userProfileHandle) { - console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node called does not have the expected Profile Handle.') - reject() - return - } - /* - We will check that the profile handle we sent to the Network Node, is returned at the - signed message, to avoid man in the middle attackts. - */ - if (signedMessage.callerProfileHandle !== SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileHandle) { - console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node callerProfileHandle does not match my own userProfileHandle.') - reject() - return - } - /* - We will also check that the callerTimestamp we sent to the Network Node, is returned at the - signed message, also to avoid man in the middle attackts. - */ - if (signedMessage.callerTimestamp !== callerTimestamp) { - console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node callerTimestamp does not match my own callerTimestamp.') - reject() - return - } - - /* - All validations passed, it seems we can continue with Step Two. - */ - stepTwoRequest(signedMessage) - } - - function stepTwoRequest(signedMessage) { - /* - Send Handshake Message Step Two: - - Here we will sign a message with the Network Node profile - handle and timestamp to prove our own identity. - */ - socketClient.onmessage = socketMessage => { stepTwoResponse(socketMessage) } - - let signature = web3.eth.accounts.sign(JSON.stringify(signedMessage), SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileHandle) - - let message = { - messageType: 'Handshake', - signature: JSON.stringify(signature), - step: 'Two' - } - socketClient.send(JSON.stringify(message)) - } - - function stepTwoResponse(socketMessage) { - let response = JSON.parse(socketMessage.data) - - if (response.result !== 'Ok') { - console.log('[ERROR] Web Sockets Client -> stepOneResponse -> response.message = ' + response.message) - reject() - return - } - /* - This was the end of the Handshake producere. We are connected to the - Network Node and from now on, all response messages will be received - at this following function. - */ - socketClient.onmessage = socketMessage => { onMenssage(socketMessage) } - resolve() - } - } - } - - function onError(err) { - console.log('[ERROR] Web Sockets Client -> onError -> err.message = ' + err.message) - console.log('[ERROR] Web Sockets Client -> onError -> err.stack = ' + err.stack) - } - - } catch (err) { - console.log('[ERROR] Web Sockets Client -> setUpWebsocketClient -> err.stack = ' + err.stack) - } - - } - } - - function sendMessage(message) { - - return new Promise(sendSocketMessage) - - function sendSocketMessage(resolve, reject) { - - if (socketClient.readyState !== 1) { // 1 means connected and ready. - console.log('[ERROR] Web Sockets Client -> sendMessage -> Cannot send message while connection is closed.') - reject('Websockets Connection Not Ready.') - return - } - - let socketMessage = { - messageId: SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId(), - messageType: 'Request', - payload: message - } - onMessageFunctionsMap.set(socketMessage.messageId, onMenssageFunction) - socketClient.send( - JSON.stringify(socketMessage) - ) - - function onMenssageFunction(response) { - try { - if (response.result === 'Ok') { - resolve(response.data) - } else { - console.log('[ERROR] Web Sockets Client -> onMenssageFunction -> response.message = ' + response.message) - reject(response.message) - } - } catch (err) { - callbackFunction = undefined - console.log('[ERROR] Web Sockets Client -> err.stack = ' + err.stack) - } - } - } - } - - function onMenssage(socketMessage) { - - let response = JSON.parse(socketMessage.data) - /* - We get the functioin that is going to resolve or reject the promise given. - */ - onMenssageFunction = onMessageFunctionsMap.get(response.messageId) - onMessageFunctionsMap.delete(response.messageId) - onMenssageFunction(response) - } -} \ No newline at end of file diff --git a/Projects/Network/NT/Modules/WebSocketsNetworkClient.js b/Projects/Network/SA/Modules/WebSocketsNetworkClient.js similarity index 89% rename from Projects/Network/NT/Modules/WebSocketsNetworkClient.js rename to Projects/Network/SA/Modules/WebSocketsNetworkClient.js index 89742008c..a41ef6eae 100644 --- a/Projects/Network/NT/Modules/WebSocketsNetworkClient.js +++ b/Projects/Network/SA/Modules/WebSocketsNetworkClient.js @@ -10,7 +10,6 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb let web3 let called = {} - let selectedNetworkNode // This is a Network Node we pick to try to connect to. let onMessageFunctionsMap = new Map() return thisObject @@ -26,27 +25,18 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb onMessageFunctionsMap = undefined } - async function initialize() { - /* - Here we will pick a Network Node from all users profiles available that do have a Network Node running. // TODO - In the meantime, we will assume that we have chosen the following Network Node to connect to. - */ + async function initialize(callerRole, p2pNetworkNode) { + web3 = new SA.nodeModules.web3() - selectedNetworkNode = { - userProfileHandle: "Luis-Fernando-Molina", - blockchainAccount: "0xeBDCB7a73c4796ca9F025d005630eCe773dd9e54", - ranking: 0, - host: "localhost", - port: global.env.NETWORK_WEB_SOCKETS_INTERFACE_PORT - } + let host = JSON.parse(p2pNetworkNode.node.config).host + let port = JSON.parse(p2pNetworkNode.node.config).webSocketsPort - socketClient = new SA.nodeModules.ws('ws://' + selectedNetworkNode.host + ':' + selectedNetworkNode.port) - - await setUpWebsocketClient() + socketClient = new SA.nodeModules.ws('ws://' + host + ':' + port) + await setUpWebsocketClient(callerRole, p2pNetworkNode) } - async function setUpWebsocketClient() { + async function setUpWebsocketClient(callerRole) { return new Promise(connectToNewtwork) @@ -85,8 +75,8 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb let message = { messageType: 'Handshake', - callerRole: 'Network Node', - callerProfileHandle: SA.secrets.map.get(global.env.P2P_NETWORK_NODE_SIGNING_ACCOUNT).userProfileHandle, + callerRole: callerRole, + callerProfileHandle: SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileHandle, callerTimestamp: callerTimestamp, step: 'One' } @@ -116,7 +106,7 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb We will check that the blockchain account taken from the signature matches the one we have on record for the user profile of the Network Node we are calling. */ - if (called.blockchainAccount !== selectedNetworkNode.blockchainAccount) { + if (called.blockchainAccount !== p2pNetworkNode.userProfile.blockchainAccount) { console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node called does not have the expected Profile Handle.') reject() return @@ -138,7 +128,7 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb We will check that the Network Node that responded has the same User Profile Handle that we have on record, otherwise something is wrong and we should not proceed. */ - if (signedMessage.calledProfileHandle !== selectedNetworkNode.userProfileHandle) { + if (signedMessage.calledProfileHandle !== p2pNetworkNode.userProfile.userProfileHandle) { console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node called does not have the expected Profile Handle.') reject() return @@ -147,7 +137,7 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb We will check that the profile handle we sent to the Network Node, is returned at the signed message, to avoid man in the middle attackts. */ - if (signedMessage.callerProfileHandle !== SA.secrets.map.get(global.env.P2P_NETWORK_NODE_SIGNING_ACCOUNT).userProfileHandle) { + if (signedMessage.callerProfileHandle !== SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileHandle) { console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node callerProfileHandle does not match my own userProfileHandle.') reject() return @@ -177,7 +167,7 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb */ socketClient.onmessage = socketMessage => { stepTwoResponse(socketMessage) } - let signature = web3.eth.accounts.sign(JSON.stringify(signedMessage), SA.secrets.map.get(global.env.P2P_NETWORK_NODE_SIGNING_ACCOUNT).privateKey) + let signature = web3.eth.accounts.sign(JSON.stringify(signedMessage), SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileHandle) let message = { messageType: 'Handshake', diff --git a/Projects/ProjectsSchema.json b/Projects/ProjectsSchema.json index b281f405f..7417a6826 100644 --- a/Projects/ProjectsSchema.json +++ b/Projects/ProjectsSchema.json @@ -1376,12 +1376,6 @@ "propertyName": "webSocketsInterface", "functionName": "newNetworkModulesWebSocketsInterface", "fileName": "WebSocketsInterface.js" - }, - { - "name": "Web Sockets Network Client", - "propertyName": "webSocketsNetworkClient", - "functionName": "newNetworkModulesWebSocketsNetworkClient", - "fileName": "WebSocketsNetworkClient.js" } ], "utilities": [] @@ -1397,11 +1391,11 @@ ], "modules": [ { - "name": "Web Sockets App Client", - "propertyName": "webSocketsAppClient", - "functionName": "newNetworkModulesWebSocketsAppClient", - "fileName": "WebSocketsAppClient.js" - }, + "name": "Web Sockets Network Client", + "propertyName": "webSocketsNetworkClient", + "functionName": "newNetworkModulesWebSocketsNetworkClient", + "fileName": "WebSocketsNetworkClient.js" + } { "name": "User Profiles", "propertyName": "userProfiles", From 198a2690cd36b44deabfae6a14b6e3fe8a2ccec1 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 4 Nov 2021 14:07:50 +0100 Subject: [PATCH 08/20] Network is running with the changes --- Network/NetwokNode.js | 2 +- Projects/Network/SA/Modules/UserProfiles.js | 10 +++++----- Projects/ProjectsSchema.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Network/NetwokNode.js b/Network/NetwokNode.js index 5aa0f2eb9..f70c5a100 100644 --- a/Network/NetwokNode.js +++ b/Network/NetwokNode.js @@ -28,7 +28,7 @@ exports.newNetworkNode = function newNetworkNode() { /* We can join now the P2P Network as a new peer there. */ - thisObject.p2pMetwork = SA.projects.network.modules.p2pMetwork.newNetworkModulesP2PNetwork() + thisObject.p2pMetwork = SA.projects.network.modules.p2pNetwork.newNetworkModulesP2PNetwork() await thisObject.p2pMetwork.initialize('Network Peer') } } diff --git a/Projects/Network/SA/Modules/UserProfiles.js b/Projects/Network/SA/Modules/UserProfiles.js index 8e473c7d6..63a6d2d61 100644 --- a/Projects/Network/SA/Modules/UserProfiles.js +++ b/Projects/Network/SA/Modules/UserProfiles.js @@ -71,11 +71,11 @@ exports.newNetworkModulesUserProfiles = function newNetworkModulesUserProfiles() */ if ( signingAccount.signingAccountChild.type === "P2P Network Node" && - signingAccount.signingAccountChild.config === undefined + signingAccount.signingAccountChild.config !== undefined ) { - let condig + let config try { - condig = JSON.parse(signingAccount.signingAccountChild.config) + config = JSON.parse(signingAccount.signingAccountChild.config) } catch (err) { console.log('P2P Network Node Config not in JSON format. userProfileHandle = ' + userHandle + ' NodeId = ' + signingAccount.signingAccountChild.id) continue @@ -87,8 +87,8 @@ exports.newNetworkModulesUserProfiles = function newNetworkModulesUserProfiles() continue } - p2pNetworkNode = SA.projects.network.modules.p2pMetworkNode.newNetworkModulesP2PNetworkNode() - p2pMetworkNode.initialize(signingAccount.signingAccountChild, userPofile) + p2pNetworkNode = SA.projects.network.modules.p2pNetworkNode.newNetworkModulesP2PNetworkNode() + p2pNetworkNode.initialize(signingAccount.signingAccountChild, userProfile) SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES.push(p2pNetworkNode) } } diff --git a/Projects/ProjectsSchema.json b/Projects/ProjectsSchema.json index 7417a6826..49ec0b489 100644 --- a/Projects/ProjectsSchema.json +++ b/Projects/ProjectsSchema.json @@ -1395,7 +1395,7 @@ "propertyName": "webSocketsNetworkClient", "functionName": "newNetworkModulesWebSocketsNetworkClient", "fileName": "WebSocketsNetworkClient.js" - } + }, { "name": "User Profiles", "propertyName": "userProfiles", From 7e0b5cdb5e0cd0c96f51b7218c77986fed8b134b Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 4 Nov 2021 14:37:29 +0100 Subject: [PATCH 09/20] Bug Fixes --- Desktop/DesktopApp.js | 2 +- Projects/Network/SA/Modules/P2PNetworkNode.js | 11 +++++++---- Projects/Network/SA/Modules/UserProfiles.js | 5 ++--- .../Network/SA/Modules/WebSocketsNetworkClient.js | 2 +- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Desktop/DesktopApp.js b/Desktop/DesktopApp.js index 329542347..78a592757 100644 --- a/Desktop/DesktopApp.js +++ b/Desktop/DesktopApp.js @@ -21,7 +21,7 @@ exports.newDesktopApp = function newDesktopApp() { /* We can join now the P2P Network as a client app. */ - thisObject.p2pMetwork = SA.projects.network.modules.p2pMetwork.newNetworkModulesP2PNetwork() + thisObject.p2pMetwork = SA.projects.network.modules.p2pNetwork.newNetworkModulesP2PNetwork() await thisObject.p2pMetwork.initialize('Network Client') /* Here we will pick a Network Node from all users profiles available that do have a Network Node running. diff --git a/Projects/Network/SA/Modules/P2PNetworkNode.js b/Projects/Network/SA/Modules/P2PNetworkNode.js index a3a821653..1fc44ec94 100644 --- a/Projects/Network/SA/Modules/P2PNetworkNode.js +++ b/Projects/Network/SA/Modules/P2PNetworkNode.js @@ -5,7 +5,8 @@ exports.newNetworkModulesP2PNetworkNode = function newNetworkModulesP2PNetworkNo let thisObject = { node: undefined, - userPofile: undefined, + blockchainAccount: undefined, + userProfile: undefined, /* Framework Functions */ initialize: initialize, @@ -16,14 +17,16 @@ exports.newNetworkModulesP2PNetworkNode = function newNetworkModulesP2PNetworkNo function finalize() { thisObject.node = undefined - thisObject.userPofile = undefined + thisObject.blockchainAccount = undefined + thisObject.userProfile = undefined } - async function initialize(node, userPofile) { + async function initialize(node, userProfile, blockchainAccount) { /* We will setup here the maps and arryas we will need to operate within the P2P Network. */ thisObject.node = node - thisObject.userPofile = userPofile + thisObject.userProfile = userProfile + thisObject.blockchainAccount = blockchainAccount } } \ No newline at end of file diff --git a/Projects/Network/SA/Modules/UserProfiles.js b/Projects/Network/SA/Modules/UserProfiles.js index 63a6d2d61..c9493dc31 100644 --- a/Projects/Network/SA/Modules/UserProfiles.js +++ b/Projects/Network/SA/Modules/UserProfiles.js @@ -64,8 +64,7 @@ exports.newNetworkModulesUserProfiles = function newNetworkModulesUserProfiles() 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) + let blockchainAccount = web3.eth.accounts.recover(signatureObject) /* If the Signing Account is for a P2P node, we will add the node to the array of available nodes at the p2p network. */ @@ -88,7 +87,7 @@ exports.newNetworkModulesUserProfiles = function newNetworkModulesUserProfiles() } p2pNetworkNode = SA.projects.network.modules.p2pNetworkNode.newNetworkModulesP2PNetworkNode() - p2pNetworkNode.initialize(signingAccount.signingAccountChild, userProfile) + p2pNetworkNode.initialize(signingAccount.signingAccountChild, userProfile, blockchainAccount) SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES.push(p2pNetworkNode) } } diff --git a/Projects/Network/SA/Modules/WebSocketsNetworkClient.js b/Projects/Network/SA/Modules/WebSocketsNetworkClient.js index a41ef6eae..15b34ecba 100644 --- a/Projects/Network/SA/Modules/WebSocketsNetworkClient.js +++ b/Projects/Network/SA/Modules/WebSocketsNetworkClient.js @@ -106,7 +106,7 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb We will check that the blockchain account taken from the signature matches the one we have on record for the user profile of the Network Node we are calling. */ - if (called.blockchainAccount !== p2pNetworkNode.userProfile.blockchainAccount) { + if (called.blockchainAccount !== p2pNetworkNode.blockchainAccount) { console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node called does not have the expected Profile Handle.') reject() return From 386ead6907154baf9c45cb13daa4848eb17c1421 Mon Sep 17 00:00:00 2001 From: prepheadrus <83468174+prepheadrus@users.noreply.github.com> Date: Thu, 4 Nov 2021 17:45:35 +0300 Subject: [PATCH 10/20] Welcome To Superalgos 033-042 --- ...-tutorial-step-careful-with-your-data.json | 56 ++++++++++++++++--- ...gos-034-tutorial-step-the-bright-side.json | 24 +++++++- ...os-035-tutorial-step-break-on-through.json | 24 +++++++- ...torial-step-navigating-the-white-room.json | 24 +++++++- ...-037-tutorial-step-talkin-time-travel.json | 32 +++++++++-- ...ralgos-038-tutorial-step-bending-time.json | 32 +++++++++-- ...ralgos-039-tutorial-step-size-matters.json | 32 +++++++++-- ...tutorial-step-putting-things-in-order.json | 32 +++++++++-- ...041-tutorial-step-get-in-the-wormhole.json | 32 +++++++++-- ...os-042-tutorial-step-the-elegant-way..json | 40 +++++++++++-- 10 files changed, 287 insertions(+), 41 deletions(-) diff --git a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-033-tutorial-step-careful-with-your-data.json b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-033-tutorial-step-careful-with-your-data.json index a95f88feb..0fa0facd9 100644 --- a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-033-tutorial-step-careful-with-your-data.json +++ b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-033-tutorial-step-careful-with-your-data.json @@ -30,7 +30,13 @@ { "language": "DE", "text": "Es kann Minuten dauern, bis alle Aufgaben zum getoppt sind. Sie sollten das System niemals schließen, bevor alle Aufgaben beendet sind.", - "updated": 1634173343328 + "updated": 1634173343328, + "style": "Definition" + }, + { + "language": "TR", + "text": "Tüm görevlerin durması bir dakika kadar sürebilir. Tüm görevler durmadan sistemi asla kapatmamalısınız.", + "updated": 1636033722512 } ] }, @@ -60,7 +66,13 @@ { "language": "DE", "text": "Überprüfen Sie die Kommandozeile Ihres Systems, um zu sehen, ob die Aufgaben gestoppt wurden!", - "updated": 1634173091261 + "updated": 1634173091261, + "style": "Callout" + }, + { + "language": "TR", + "text": "Görevlerin durduğunu görmek için konsol uygulamasını kontrol edin! Görevler çalışırken düğümlerin altında 1/1, 1/2 gibi kaç görev olduğu ve kaçının çalıştığına dair bir gösterge görürsünüz.", + "updated": 1636033793821 } ], "updated": 1616416021973 @@ -84,7 +96,13 @@ { "language": "DE", "text": "Der richtige Weg, Superalgos zu schließen, ist:", - "updated": 1634173103809 + "updated": 1634173103809, + "style": "Text" + }, + { + "language": "TR", + "text": "Superalgos'u kapatmanın doğru yolu şudur:", + "updated": 1636033807278 } ] }, @@ -108,7 +126,13 @@ { "language": "DE", "text": "Alle Aufgaben beenden, ein paar Minuten warten.", - "updated": 1634173410210 + "updated": 1634173410210, + "style": "List" + }, + { + "language": "TR", + "text": "Tüm görevleri durdurun ve birkaç dakika bekleyin.", + "updated": 1636033819254 } ] }, @@ -132,7 +156,13 @@ { "language": "DE", "text": "Wenn alle Aufgaben beendet sind, können Sie die Konsolenanwendung schließen oder den Prozess mit Ctrl + Key-C beenden.", - "updated": 1634173253123 + "updated": 1634173253123, + "style": "List" + }, + { + "language": "TR", + "text": "Tüm görevler durduğunda konsol uygulamasını kapatabilir veya Ctrl + Key-C ile işlemi durdurabilirsiniz", + "updated": 1636033864602 } ] }, @@ -155,7 +185,13 @@ { "language": "DE", "text": "Sie können den Browser jederzeit schließen und die Aufgaben im Hintergrund weiterlaufen lassen.", - "updated": 1634173156784 + "updated": 1634173156784, + "style": "List" + }, + { + "language": "TR", + "text": "Tarayıcıyı istediğiniz zaman kapatabilir ve görevlerin arka planda işlenmesini bırakabilirsiniz.", + "updated": 1636033884326 } ] }, @@ -179,7 +215,13 @@ { "language": "DE", "text": "Wenn Sie den Client schließen, bevor die Tasks beendet sind, können Ihre Daten beschädigt werden!", - "updated": 1634173172953 + "updated": 1634173172953, + "style": "Warning" + }, + { + "language": "TR", + "text": "Görevler durmadan İstemciyi ( Client ) kapatmak, verilerinizin bozulmasına neden olabilir!", + "updated": 1636033906258 } ] } diff --git a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-034-tutorial-step-the-bright-side.json b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-034-tutorial-step-the-bright-side.json index 038b221f4..67277fc2d 100644 --- a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-034-tutorial-step-the-bright-side.json +++ b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-034-tutorial-step-the-bright-side.json @@ -30,7 +30,13 @@ { "language": "DE", "text": "Bislang waren Sie auf die dunkle Seite von Superalgos beschränkt. Machen Sie sich bereit, die helle Seite kennenzulernen: den Charting Space.", - "updated": 1634174936126 + "updated": 1634174936126, + "style": "Definition" + }, + { + "language": "TR", + "text": "Şimdiye kadar Superalgos'un karanlık tarafıyla sınırlı kaldınız. Parlak tarafa maruz kalmaya hazır olun: Grafik Alanı ( Charting Space )", + "updated": 1636034022706 } ] }, @@ -61,7 +67,13 @@ { "language": "DE", "text": "Der Charting-Bereich befindet sich über dem Design-Bereich, getrennt durch einen türkisfarbenen Schieberegler. Wie Sie es von Superalgos gewohnt sind, ist der Charting Space konfigurierbar und hochflexibel. Alles, was dort geschieht, wird in der Charting Space Hierarchie definiert.", - "updated": 1634174969494 + "updated": 1634174969494, + "style": "Text" + }, + { + "language": "TR", + "text": "Grafik alanı, turkuaz bir kaydırıcı ile ayrılmış tasarım alanının üstünde bulunur. Superalgos'tan beklendiği gibi, grafik alanı yapılandırılabilir ve oldukça esnektir. Orada olan her şey Grafik Alanı ( Charting Space ) hiyerarşisinde tanımlanır.", + "updated": 1636034080988 } ] }, @@ -90,7 +102,13 @@ { "language": "DE", "text": "Der Charting Space ist dafür bekannt, dass er die Leute umhaut. Bitte fahren Sie mit diesem Tutorial nicht fort, wenn Sie unter dem Einfluss von psychoaktiven Substanzen stehen.", - "updated": 1634174978126 + "updated": 1634174978126, + "style": "Warning" + }, + { + "language": "TR", + "text": "Grafik alanı, insanların aklını başından almasıyla bilinir. Lütfen şu anda psikoaktif maddelerin etkisi altındaysanız bu eğitime devam etmekten kaçının :)", + "updated": 1636034105076 } ], "updated": 1616416552336 diff --git a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-035-tutorial-step-break-on-through.json b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-035-tutorial-step-break-on-through.json index c3cf9f025..9715c5b87 100644 --- a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-035-tutorial-step-break-on-through.json +++ b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-035-tutorial-step-break-on-through.json @@ -30,7 +30,13 @@ { "language": "DE", "text": "Ich bringe Sie in kürzester Zeit dazu, sich im Charting Space zu bewegen und zu blättern... Kümmern wir uns zuerst um den Schieberegler!", - "updated": 1634205702474 + "updated": 1634205702474, + "style": "Definition" + }, + { + "language": "TR", + "text": "Hiç vakit kaybetmeden dolaşarak ve çizelge alanına göz atarak sizi hızlandıracağım... Önce kaydırıcıyı ele alalım!", + "updated": 1636034139286 } ] }, @@ -60,7 +66,13 @@ { "language": "DE", "text": "Klicken Sie ihn an und ziehen Sie ihn nach unten, um den Design Space zu schließen und den Charting Space zu öffnen. Um den umgekehrten Effekt zu erzielen, machen Sie das Gegenteil. Drücken Sie Ctrl + Shift + ↓. um dies mit der Tastatur zu tun. Versuchen Sie auch ↑ ← →", - "updated": 1634205728640 + "updated": 1634205728640, + "style": "Callout" + }, + { + "language": "TR", + "text": "Tasarım alanını kapatmak ve grafik alanını açmak için turkuaz bölgeyi tıklayarak aşağıya çekin. Kapatmak için tersini yapabilirsiniz. Bunu klavyeyle yapmak için Ctrl + Shift + ↓ tuşlarına basın. ↑ ← →.. Diğer yön tuşlarını da deneyin!", + "updated": 1636034296397 } ] }, @@ -89,7 +101,13 @@ { "language": "DE", "text": "Es ist eine gute Idee, einen der beiden Bereiche vollständig zu schließen, um Ressourcen zu sparen, es sei denn, Sie brauchen beide Bereiche nur teilweise geöffnet zu haben.", - "updated": 1634205372068 + "updated": 1634205372068, + "style": "Success" + }, + { + "language": "TR", + "text": "Her iki alanın da kısmen açık olmasına ihtiyacınız yoksa, makinenizdeki bilgi işlem kaynaklarından tasarruf etmek için her ikisini de tamamen kapatmak her zaman iyi bir fikirdir.", + "updated": 1636034332675 } ] } diff --git a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-036-tutorial-step-navigating-the-white-room.json b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-036-tutorial-step-navigating-the-white-room.json index 9eadd92c9..f6e70f3e2 100644 --- a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-036-tutorial-step-navigating-the-white-room.json +++ b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-036-tutorial-step-navigating-the-white-room.json @@ -30,7 +30,13 @@ { "language": "DE", "text": "Genau wie der Design Space bietet auch der Charting Space einen riesigen Bereich, in dem Sie Diagramme einrichten können... so viele, wie Ihre Hardware verkraften kann!", - "updated": 1634205591674 + "updated": 1634205591674, + "style": "Definition" + }, + { + "language": "TR", + "text": "Tasarım alanı gibi, çizelge alanı da çizelgeler oluşturabileceğiniz devasa bir alana sahiptir... donanımınızın üstesinden gelebileceği kadar!", + "updated": 1636034379426 } ] }, @@ -61,7 +67,13 @@ { "language": "DE", "text": "Um die Dinge für Neulinge einfach zu halten, gibt es in diesem Workspace des Getting Started Tutorials nur zwei Charts. Fortgeschrittene Benutzer überwachen Charts von mehreren Börsen und Märkten.", - "updated": 1634205603337 + "updated": 1634205603337, + "style": "Text" + }, + { + "language": "TR", + "text": "Yeni başlayanlar için işleri basit tutmak gerektiğinden bu ( Getting Started Tutorial ) alanında yalnızca iki çizelge vardır. İleri düzey kullanıcılar, birden çok borsadan ve birden çok pazardan gelen tabloları izleyebilirler.", + "updated": 1636034464247 } ] }, @@ -90,7 +102,13 @@ { "language": "DE", "text": "Um sich im Viewport zu bewegen, klicken Sie auf einen leeren Bereich und ziehen Sie mit der Maus. Die Tastaturkombination ist Shift plus die Pfeiltasten ↑ ← → ↓", - "updated": 1634205660486 + "updated": 1634205660486, + "style": "Callout" + }, + { + "language": "TR", + "text": "Görünüm Alanında (Viewport) gezinmek için farenizi kullanarak boş alana tıklayın ve sürükleyin. Klavye ile şu tuş kombinasyonunu kullanarakta gezinebilirsin. Shift artı ok tuşları ↑ ← → ↓", + "updated": 1636034607617 } ], "updated": 1622198195729 diff --git a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-037-tutorial-step-talkin-time-travel.json b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-037-tutorial-step-talkin-time-travel.json index 5e36775f5..648ca3a1f 100644 --- a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-037-tutorial-step-talkin-time-travel.json +++ b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-037-tutorial-step-talkin-time-travel.json @@ -30,7 +30,13 @@ { "language": "DE", "text": "Ich habe bereits erwähnt, dass es in diesem Workspace zwei Diagramme gibt. In Superalgos nennen wir jedes dieser Diagramme eine Time Machine.", - "updated": 1634205940397 + "updated": 1634205940397, + "style": "Definition" + }, + { + "language": "TR", + "text": "Daha önce bahsetmiştim, bu çalışma alanında iki çizelge var. Superalgos'ta bu çizelgelerin her birine bir Zaman Makinesi ( Time Machine ) diyoruz.", + "updated": 1636035055393 } ] }, @@ -60,7 +66,13 @@ { "language": "DE", "text": "Eine Time Machine kann einen oder mehere Timeline Charts enthalten. Wir nennen sie Time Machines, weil alle Timeline Charts innerhalb einer Time Machine zeitlich synchronisiert sind. Diese Eigenschaft der Time Machines ermöglicht es, verschiedene Datenebenen auf derselben Time Scale zu überlagern.", - "updated": 1634206096721 + "updated": 1634206096721, + "style": "Text" + }, + { + "language": "TR", + "text": "Bir zaman makinesi, bir veya daha fazla Zaman Çizelgesi Grafiği tutabilir. Onlara zaman makineleri diyoruz çünkü bir zaman makinesindeki tüm zaman çizelgeleri zamanla senkronize edilir. Zaman makinelerinin bu özelliği, aynı Zaman Ölçeğini paylaşan farklı veri katmanlarının üst üste binmesine izin verir.", + "updated": 1636035067580 } ] }, @@ -89,7 +101,13 @@ { "language": "DE", "text": "Fahren Sie mit dem Mauszeiger über die Time Machines!", - "updated": 1634206006623 + "updated": 1634206006623, + "style": "Callout" + }, + { + "language": "TR", + "text": "Fare imlecinizi zaman makinelerinin üzerine getirin!", + "updated": 1636035197351 } ] }, @@ -119,7 +137,13 @@ { "language": "DE", "text": "Beachten Sie die Beschriftung auf der linken Seite, aus der hervorgeht, mit welchen Börsen und Märkten die Daten verbunden sind. Eine einzige Time Machine kann Daten von mehreren Märkten und mehreren Börsen enthalten!", - "updated": 1634206050433 + "updated": 1634206050433, + "style": "Text" + }, + { + "language": "TR", + "text": "Sol tarafta beliren ve verilerin hangi borsalar ve pazarlarla ilişkili olduğunu gösteren etikete dikkat edin. Tek bir zaman makinesi birden fazla pazardan ve birden fazla borsadan veri tutabilir!", + "updated": 1636035233840 } ] } diff --git a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-038-tutorial-step-bending-time.json b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-038-tutorial-step-bending-time.json index 348346ca9..08dc282de 100644 --- a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-038-tutorial-step-bending-time.json +++ b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-038-tutorial-step-bending-time.json @@ -30,7 +30,13 @@ { "language": "DE", "text": "Ok... vielleicht ist es nicht wirklich wie Raumkrümmung, aber habt Nachsicht mit mir... Du wirst begeistert sein, wie du Zeitmaschinen in jedes beliebige Format bringen kannst.", - "updated": 1634206247154 + "updated": 1634206247154, + "style": "Definition" + }, + { + "language": "TR", + "text": "Tamam,belki zamanı bükmek gibi değil, ama inan bana bu harika birşey... Zaman makinelerini istediğin formatta şekillendirebiliyor olmana bayılacaksın.", + "updated": 1636035360393 } ] }, @@ -60,7 +66,13 @@ { "language": "DE", "text": "Bewegen Sie Ihren Mauszeiger über einen der Ränder des türkisfarbenen Rahmens, der die Time Machine definiert, und sehen Sie, was passiert. Sehen Sie, wie der Rand gelb hervorgehoben wird?", - "updated": 1634206251264 + "updated": 1634206251264, + "style": "Text" + }, + { + "language": "TR", + "text": "Fare imlecinizi zaman makinesini tanımlayan turkuaz çerçevenin herhangi bir kenarının üzerine getirin ve ne olduğunu görün. Kenarın sarı ile nasıl vurgulandığını gördünüz mü?", + "updated": 1636035384197 } ] }, @@ -89,7 +101,13 @@ { "language": "DE", "text": "Sehr gut! Klicken Sie nun mit der linken Maustaste auf den Rahmen und ziehen Sie!", - "updated": 1634206263662 + "updated": 1634206263662, + "style": "Callout" + }, + { + "language": "TR", + "text": "Güzel! Şimdi çerçeveye tıklayın ve çekin!", + "updated": 1636035404981 } ] }, @@ -118,7 +136,13 @@ { "language": "DE", "text": "Auf diese Weise können Sie die Time Machines nach Ihren Wünschen gestalten.", - "updated": 1634206284213 + "updated": 1634206284213, + "style": "Note" + }, + { + "language": "TR", + "text": "Böylece zaman makinelerini kendi zevkinize veya ihtiyacınıza göre şekillendirebilirsiniz.", + "updated": 1636035425014 } ] } diff --git a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-039-tutorial-step-size-matters.json b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-039-tutorial-step-size-matters.json index 358a6a04d..70bf5d4f6 100644 --- a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-039-tutorial-step-size-matters.json +++ b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-039-tutorial-step-size-matters.json @@ -30,7 +30,13 @@ { "language": "DE", "text": "Zusammenfassung: Wie wäre es, die Time Machine genau an das Seitenverhältnis Ihres Bildschirms anzupassen?", - "updated": 1634206350448 + "updated": 1634206350448, + "style": "Definition" + }, + { + "language": "TR", + "text": "Zaman makinesini ekranınızın tam en boy oranına göre şekillendirmeye ne dersiniz?", + "updated": 1636035470271 } ] }, @@ -60,7 +66,13 @@ { "language": "DE", "text": "Die Anpassung des Seitenverhältnisses Ihrer Zeitmaschinen an das Seitenverhältnis Ihres Bildschirms ist entscheidend dafür, dass die Diagramme beim Heranzoomen genau auf Ihren Bildschirm passen!", - "updated": 1634206368643 + "updated": 1634206368643, + "style": "Text" + }, + { + "language": "TR", + "text": "Zaman makinelerinizin en boy oranını ekranınızın en boy oranıyla eşleştirmek, yakınlaştırırken grafiklerin ekranınıza sığabilmesi için çok önemlidir!", + "updated": 1636035504803 } ], "updated": 1622198491208 @@ -91,7 +103,13 @@ { "language": "DE", "text": "Richten Sie Ihre Maus auf eine der Time Machines und drücken Sie Ctrl + Shift + Alt + Key-A. Machen Sie dasselbe mit der anderen Maschine!", - "updated": 1634206401027 + "updated": 1634206401027, + "style": "Callout" + }, + { + "language": "TR", + "text": "Farenizi zaman makinelerinden birine yönlendirin ve Ctrl + Shift + Alt + Key-A tuşlarına basın. Aynısını diğeriyle yapın!", + "updated": 1636035527567 } ] }, @@ -121,7 +139,13 @@ { "language": "DE", "text": "Lassen Sie die beiden Time Machines von nun an auf das Seitenverhältnis Ihres Bildschirms abgestimmt!", - "updated": 1634206411265 + "updated": 1634206411265, + "style": "Success" + }, + { + "language": "TR", + "text": "Şu andan itibaren ekranınızın en boy oranıyla eşleşen iki zaman makinesini görmen lazım.", + "updated": 1636035706936 } ] } diff --git a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-040-tutorial-step-putting-things-in-order.json b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-040-tutorial-step-putting-things-in-order.json index 4ab71e3d0..658581e37 100644 --- a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-040-tutorial-step-putting-things-in-order.json +++ b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-040-tutorial-step-putting-things-in-order.json @@ -30,7 +30,13 @@ { "language": "DE", "text": "Bevor wir in die Tabellen eintauchen, noch eine Sache. Sie müssen wissen, wie Sie das Haus in Ordnung bringen können!", - "updated": 1634206589741 + "updated": 1634206589741, + "style": "Definition" + }, + { + "language": "TR", + "text": "Tablolara girmeden önce bir şey daha var. Bu alanı nasıl düzene sokacağını bilmelisin!", + "updated": 1636035747714 } ] }, @@ -60,7 +66,13 @@ { "language": "DE", "text": "Es wird die Zeit kommen, in der Sie vielleicht mit Dutzenden von Diagrammen arbeiten werden. Sie wissen bereits, wie Sie deren Format ändern können. Jetzt müssen Sie lernen, wie Sie die Diagramme verschieben können, damit Sie die gewünschten Arrangements erstellen können. Das ist ganz einfach:", - "updated": 1634206671224 + "updated": 1634206671224, + "style": "Text" + }, + { + "language": "TR", + "text": "Onlarca çizelge ile çalışmanız gereken zamanar gelecek. Biçimlerini nasıl değiştireceğinizi öğrenmiştik. Şimdi, ihtiyaç duyduğunuz düzenlemeleri oluşturabilmeniz için onları nasıl hareket ettireceğinizi öğrenmeniz gerekiyor. Oldukça kolay:", + "updated": 1636035803888 } ], "updated": 1616416902513 @@ -91,7 +103,13 @@ { "language": "DE", "text": "Drücken Sie die Shift, klicken Sie mit der linken Maustaste, und ziehen Sie!", - "updated": 1634206723517 + "updated": 1634206723517, + "style": "Callout" + }, + { + "language": "TR", + "text": "Shift 'e basın, sol tıklayın ve sürükleyin!", + "updated": 1636035874767 } ] }, @@ -120,7 +138,13 @@ { "language": "DE", "text": "Ich glaube, wir haben jetzt alles über die Verwaltung des Charting Space gesagt. Jetzt ist es Zeit, in die Diagramme einzutauchen!", - "updated": 1634206736658 + "updated": 1634206736658, + "style": "Success" + }, + { + "language": "TR", + "text": "Grafik alanını nasıl yöneteceğimizle ilgili her şeyi ele aldığımıza inanıyorum. Grafiklere dalmanın zamanı geldi!", + "updated": 1636035867318 } ] } diff --git a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-041-tutorial-step-get-in-the-wormhole.json b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-041-tutorial-step-get-in-the-wormhole.json index 1af9a5537..796a44aeb 100644 --- a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-041-tutorial-step-get-in-the-wormhole.json +++ b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-041-tutorial-step-get-in-the-wormhole.json @@ -30,7 +30,13 @@ { "language": "DE", "text": " Es ist an der Zeit, in eine Time Machine einzutauchen und zu sehen, was passiert! Sind Sie bereit für ein umfassendes, immersives Erlebnis?", - "updated": 1634207146163 + "updated": 1634207146163, + "style": "Definition" + }, + { + "language": "TR", + "text": "Bir Zaman Makinesine ( Time Machine ) dalıp ne olduğunu görmenin zamanı geldi! Tamamen sürükleyici bir deneyime hazır mısınız?", + "updated": 1636036023943 } ] }, @@ -60,7 +66,13 @@ { "language": "DE", "text": "Der Charting Space ist so etwas wie das Google Maps der Marktcharts. Wie Sie bereits wissen, können Sie mit der linken Maustaste klicken und ziehen, um sich in der im Charting Space zu bewegen... aber wie zoomen Sie hinein, um die Details zu sehen?", - "updated": 1634207179395 + "updated": 1634207179395, + "style": "Text" + }, + { + "language": "TR", + "text": "Grafik alanı, piyasa verilerinin Google Haritaları gibidir. Bildiğiniz gibi, haritalarda gezinmek için sol tıklayıp sürüklersiniz... ama detayları görmek için nasıl yakınlaştırıyorsunuz?", + "updated": 1636036084427 } ] }, @@ -89,7 +101,13 @@ { "language": "DE", "text": "Mit dem Rad der Maus! Probieren Sie es aus!", - "updated": 1634207215883 + "updated": 1634207215883, + "style": "Callout" + }, + { + "language": "TR", + "text": "Farenin tekerleği ile! Dene!", + "updated": 1636036095610 } ] }, @@ -119,7 +137,13 @@ { "language": "DE", "text": "Ganz genau! Genau wie in Google Maps! Zeigen Sie mit der Maus auf den Bereich, der Sie interessiert, und drehen Sie dann das Mausrad nach vorne, um hineinzuzoomen, und nach hinten, um herauszuzoomen! ", - "updated": 1634207338450 + "updated": 1634207338450, + "style": "Text" + }, + { + "language": "TR", + "text": "Aynen öyle! Tıpkı Google Haritalar'daki gibi! Fareyi ilgilenilen alana doğrultun, ardından yakınlaştırmak için farenin tekerleğini ileri, uzaklaştırmak için geri çevirin!", + "updated": 1636036116439 } ] } diff --git a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-042-tutorial-step-the-elegant-way..json b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-042-tutorial-step-the-elegant-way..json index 76e7fa684..a12599183 100644 --- a/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-042-tutorial-step-the-elegant-way..json +++ b/Projects/Foundations/Schemas/Docs-Tutorials/W/Welcome/Welcome-to-Superalgos/welcome-to-superalgos-042-tutorial-step-the-elegant-way..json @@ -30,7 +30,13 @@ { "language": "DE", "text": "Ich weiß! Wenn Sie auf eine beliebige Stelle zoomen, ist es unwahrscheinlich, dass Sie die Karte im rechten Winkel zu Ihrem Bildschirm positionieren, oder? Keine Sorge... versuchen Sie diesen Trick!", - "updated": 1634207830054 + "updated": 1634207830054, + "style": "Definition" + }, + { + "language": "TR", + "text": "Biliyorum! Rastgele bir noktaya zum yapmak, grafiği ekranınızla kare şeklinde konumlandırmak pek mümkün değil, değil mi? Endişelenme... bu numarayı dene!", + "updated": 1636036151336 } ], "updated": 1616417516192 @@ -56,7 +62,13 @@ { "language": "DE", "text": "Stellen Sie das Seitenverhältnis ein: Zeigen Sie mit der Maus auf den Chart der Backtesting Session (den oberen) und drücken Sie Ctrl + Shift + Alt + Key-A", - "updated": 1634207859976 + "updated": 1634207859976, + "style": "List" + }, + { + "language": "TR", + "text": "En-boy oranını ayarlayın: Farenizi Backtesting Session grafiğine (üstteki) getirin ve Ctrl + Shift + Alt + Key-A tuşlarına basın", + "updated": 1636036205725 } ] }, @@ -79,7 +91,13 @@ { "language": "DE", "text": "Verkleinern: Benutzen Sie das Mausrad, um zur äußersten Verkleinerungsposition zu gelangen; nur von dieser Position aus funktioniert der nächste Befehl!", - "updated": 1634207868032 + "updated": 1634207868032, + "style": "List" + }, + { + "language": "TR", + "text": "Uzaklaştır: en uzak uzaklaştırma konumuna gitmek için fare tekerleğini kullanın; sadece bu konumdan sonraki komut çalışacaktır!", + "updated": 1636036274866 } ] }, @@ -108,7 +126,13 @@ { "language": "DE", "text": "Doppelklicken Sie einmal: Dies zentriert das Diagramm und bringt Sie zu einer bestimmten Zoomstufe; es wird ein Rand gelassen, damit der Name und die Registerkarte des Diagramms in die obere linke Ecke passen.", - "updated": 1634207894965 + "updated": 1634207894965, + "style": "List" + }, + { + "language": "TR", + "text": "Bir kez çift tıklayın: bu, grafiği ortalar ve sizi belirli bir yakınlaştırma düzeyine götürür; sol üst köşede grafiğin adına ve sekmesine uyacak şekilde bir kenar boşluğu bırakılır.", + "updated": 1636037063264 } ], "updated": 1616418234728 @@ -138,7 +162,13 @@ { "language": "DE", "text": "Ein weiterer Doppelklick: bringt Sie weiter in das Diagramm, bis zu einer Zoomstufe, in der das Diagramm perfekt auf den Bildschirm passt und die Layer Manager erscheinen.", - "updated": 1634207914480 + "updated": 1634207914480, + "style": "List" + }, + { + "language": "TR", + "text": "Tekrar çift tıklayın: bu sizi grafikte daha ileri götürür, grafiğin ekrana tam olarak oturduğu ve Katman Yöneticilerinin ortaya çıktığı yakınlaştırma düzeyine gidersiniz.", + "updated": 1636037090275 } ], "updated": 1622198926988 From bd628dde718dc79db289d2658e415230ebb0c1aa Mon Sep 17 00:00:00 2001 From: harrellbm Date: Thu, 4 Nov 2021 14:08:13 -0500 Subject: [PATCH 11/20] Add Arabic Language to docs --- Platform/WebServer/Images/Languages/AR.png | Bin 0 -> 12554 bytes .../WebServer/Images}/Languages/ZA.png | Bin .../Education/UI/Spaces/Docs-Space/Footer.js | 6 ++++++ Projects/Education/UI/Utilities/Languages.js | 4 ++++ Projects/Foundations/Icons/Languages/DE.png | Bin 7190 -> 0 bytes Projects/Foundations/Icons/Languages/EN.png | Bin 9889 -> 0 bytes Projects/Foundations/Icons/Languages/zar.png | Bin 14640 -> 0 bytes 7 files changed, 10 insertions(+) create mode 100644 Platform/WebServer/Images/Languages/AR.png rename {Projects/Foundations/Icons => Platform/WebServer/Images}/Languages/ZA.png (100%) delete mode 100644 Projects/Foundations/Icons/Languages/DE.png delete mode 100644 Projects/Foundations/Icons/Languages/EN.png delete mode 100644 Projects/Foundations/Icons/Languages/zar.png diff --git a/Platform/WebServer/Images/Languages/AR.png b/Platform/WebServer/Images/Languages/AR.png new file mode 100644 index 0000000000000000000000000000000000000000..be757caa6716c2d2aeeed63bf9e9216c5d36441f GIT binary patch literal 12554 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� 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' + HTML = HTML + '' + HTML = HTML + '' HTML = HTML + '