< Summary

Class:DCL.DCLWebSocketService
Assembly:WSSController
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/Debugging/WSS/WSSController.cs
Covered lines:0
Uncovered lines:21
Coverable lines:21
Total lines:560
Line coverage:0% (0 of 21)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
SendMessageToWeb(...)0%2100%
ToString()0%2100%
OnMessage(...)0%6200%
OnError(...)0%2100%
OnClose(...)0%2100%
OnOpen()0%6200%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/Debugging/WSS/WSSController.cs

#LineLine coverage
 1using DCL.Components;
 2using DCL.Interface;
 3using System.Collections.Generic;
 4using DCL.Camera;
 5using UnityEditor;
 6using UnityEngine;
 7using WebSocketSharp;
 8using WebSocketSharp.Server;
 9
 10namespace DCL
 11{
 12    public class DCLWebSocketService : WebSocketBehavior
 13    {
 14        public static bool enterAsAGuest = false; // TODO(Mateo): Refactor https://github.com/decentraland/unity-rendere
 15        static bool VERBOSE = false;
 16
 17        private void SendMessageToWeb(string type, string message)
 18        {
 19#if (UNITY_EDITOR || UNITY_STANDALONE)
 020            var x = new Message()
 21            {
 22                type = type,
 23                payload = message
 24            };
 025            Send(Newtonsoft.Json.JsonConvert.SerializeObject(x));
 26#endif
 027        }
 28
 29        public class Message
 30        {
 31            public string type;
 32            public string payload;
 33
 034            public override string ToString() { return string.Format("type = {0}... payload = {1}...", type, payload); }
 35        }
 36
 37        protected override void OnMessage(MessageEventArgs e)
 38        {
 039            base.OnMessage(e);
 40
 041            lock (WSSController.queuedMessages)
 42            {
 43                Message finalMessage;
 044                finalMessage = JsonUtility.FromJson<Message>(e.Data);
 45
 046                WSSController.queuedMessages.Enqueue(finalMessage);
 047                WSSController.queuedMessagesDirty = true;
 048            }
 049        }
 50
 051        protected override void OnError(ErrorEventArgs e) { base.OnError(e); }
 52
 53        protected override void OnClose(CloseEventArgs e)
 54        {
 055            base.OnClose(e);
 056            WebInterface.OnMessageFromEngine -= SendMessageToWeb;
 057        }
 58
 59        protected override void OnOpen()
 60        {
 061            base.OnOpen();
 062            WebInterface.OnMessageFromEngine += SendMessageToWeb;
 063            Send("{\"welcome\": true}");
 064            if (enterAsAGuest)
 065                WebInterface.SendAuthentication(WebInterface.RendererAuthenticationType.Guest);
 066        }
 67    }
 68
 69    public class WSSController : MonoBehaviour
 70    {
 71        public enum DebugPanel
 72        {
 73            Off,
 74            Scene,
 75            Engine
 76        }
 77
 78        public enum BaseUrl
 79        {
 80            LOCAL_HOST,
 81            CUSTOM,
 82        }
 83
 84        public enum Environment
 85        {
 86            USE_DEFAULT_FROM_URL,
 87            LOCAL,
 88            ZONE,
 89            TODAY,
 90            ORG
 91        }
 92
 93        private const string ENGINE_DEBUG_PANEL = "ENGINE_DEBUG_PANEL";
 94        private const string SCENE_DEBUG_PANEL = "SCENE_DEBUG_PANEL";
 95        public static WSSController i { get; private set; }
 96        static bool VERBOSE = false;
 97        WebSocketServer ws;
 98        public RenderingController renderingController;
 99        public DCLCharacterController characterController;
 100        private Builder.DCLBuilderBridge builderBridge = null;
 101        private BuilderInWorldBridge builderInWorldBridge = null;
 102        private HUDBridge hudBridge = null;
 103        public CameraController cameraController;
 104        public GameObject bridgesGameObject;
 105
 106        [System.NonSerialized]
 107        public static Queue<DCLWebSocketService.Message> queuedMessages = new Queue<DCLWebSocketService.Message>();
 108
 109        [System.NonSerialized]
 110        public static volatile bool queuedMessagesDirty;
 111
 112        public bool isServerReady { get { return ws.IsListening; } }
 113
 114        public string wssServerUrl = "ws://localhost:5000/";
 115        public bool openBrowserWhenStart;
 116
 117        [Header("Kernel General Settings")]
 118        public bool useCustomContentServer = false;
 119
 120        public string customContentServerUrl = "http://localhost:1338/";
 121
 122        [Space(10)]
 123        public BaseUrl baseUrlMode;
 124
 125        public string baseUrlCustom;
 126
 127        [Space(10)]
 128        public Environment environment;
 129
 130        public Vector2 startInCoords = new Vector2(-99, 109);
 131
 132        [Header("Kernel Misc Settings")]
 133        public bool forceLocalComms = true;
 134
 135        public bool allWearables = false;
 136        public bool testWearables = false;
 137        public bool enableTutorial = false;
 138        public bool builderInWorld = false;
 139        public bool soloScene = true;
 140        public DebugPanel debugPanelMode = DebugPanel.Off;
 141
 142        private void Awake() { i = this; }
 143
 144        private void Start()
 145        {
 146            if (useCustomContentServer)
 147            {
 148                RendereableAssetLoadHelper.useCustomContentServerUrl = true;
 149                RendereableAssetLoadHelper.customContentServerUrl = customContentServerUrl;
 150            }
 151
 152#if (UNITY_EDITOR || UNITY_STANDALONE)
 153            DCL.DataStore.i.debugConfig.isWssDebugMode = true;
 154
 155            string wssUrl = this.wssServerUrl;
 156            string wssServiceId = "dcl";
 157            ws = new WebSocketServer(wssUrl);
 158            ws.AddWebSocketService<DCLWebSocketService>("/" + wssServiceId);
 159            ws.Start();
 160
 161            if (openBrowserWhenStart)
 162            {
 163                string baseUrl = "";
 164                string debugString = "";
 165
 166                if (baseUrlMode == BaseUrl.CUSTOM)
 167                    baseUrl = baseUrlCustom;
 168                else
 169                    baseUrl = "http://localhost:3000/?";
 170
 171                switch (environment)
 172                {
 173                    case Environment.USE_DEFAULT_FROM_URL:
 174                        break;
 175                    case Environment.LOCAL:
 176                        debugString = "DEBUG_MODE&";
 177                        break;
 178                    case Environment.ZONE:
 179                        debugString = "ENV=zone&";
 180                        break;
 181                    case Environment.TODAY:
 182                        debugString = "ENV=today&";
 183                        break;
 184                    case Environment.ORG:
 185                        debugString = "ENV=org&";
 186                        break;
 187                }
 188
 189                if (forceLocalComms)
 190                {
 191                    debugString += "LOCAL_COMMS&";
 192                }
 193
 194                if (allWearables)
 195                {
 196                    debugString += "ALL_WEARABLES&";
 197                }
 198
 199                if (testWearables)
 200                {
 201                    debugString += "TEST_WEARABLES&";
 202                }
 203
 204                if (enableTutorial)
 205                {
 206                    debugString += "RESET_TUTORIAL&";
 207                }
 208
 209                if (soloScene)
 210                {
 211                    debugString += "LOS=0&";
 212                }
 213
 214                if (builderInWorld)
 215                {
 216                    debugString += "ENABLE_BUILDER_IN_WORLD&";
 217                }
 218
 219                string debugPanelString = "";
 220
 221                if (debugPanelMode == DebugPanel.Engine)
 222                {
 223                    debugPanelString = ENGINE_DEBUG_PANEL + "&";
 224                }
 225                else if (debugPanelMode == DebugPanel.Scene)
 226                {
 227                    debugPanelString = SCENE_DEBUG_PANEL + "&";
 228                }
 229
 230                Application.OpenURL(
 231                    $"{baseUrl}{debugString}{debugPanelString}position={startInCoords.x}%2C{startInCoords.y}&ws=" + wssU
 232            }
 233#endif
 234        }
 235
 236        private void OnDestroy()
 237        {
 238#if (UNITY_EDITOR || UNITY_STANDALONE)
 239            if (ws != null)
 240            {
 241                ws.Stop();
 242                ws = null;
 243            }
 244#endif
 245        }
 246
 247        void Update()
 248        {
 249#if (UNITY_EDITOR || UNITY_STANDALONE)
 250            lock (WSSController.queuedMessages)
 251            {
 252                if (queuedMessagesDirty)
 253                {
 254                    while (queuedMessages.Count > 0)
 255                    {
 256                        DCLWebSocketService.Message msg = queuedMessages.Dequeue();
 257
 258                        if (VERBOSE)
 259                        {
 260                            Debug.Log(
 261                                "<b><color=#0000FF>WSSController</color></b> >>> Got it! passing message of type " +
 262                                msg.type);
 263                        }
 264
 265                        switch (msg.type)
 266                        {
 267                            case "SetDebug":
 268                                DCL.Environment.i.platform.debugController.SetDebug();
 269                                break;
 270                            case "SetSceneDebugPanel":
 271                                DCL.Environment.i.platform.debugController.SetSceneDebugPanel();
 272                                break;
 273                            case "ShowFPSPanel":
 274                                DCL.Environment.i.platform.debugController.ShowFPSPanel();
 275                                break;
 276                            case "HideFPSPanel":
 277                                DCL.Environment.i.platform.debugController.HideFPSPanel();
 278                                break;
 279                            case "SetEngineDebugPanel":
 280                                DCL.Environment.i.platform.debugController.SetEngineDebugPanel();
 281                                break;
 282                            case "SendSceneMessage":
 283                                DCL.Environment.i.world.sceneController.SendSceneMessage(msg.payload);
 284                                break;
 285                            case "LoadParcelScenes":
 286                                DCL.Environment.i.world.sceneController.LoadParcelScenes(msg.payload);
 287                                break;
 288                            case "UnloadScene":
 289                                DCL.Environment.i.world.sceneController.UnloadScene(msg.payload);
 290                                break;
 291                            case "Reset":
 292                                DCL.Environment.i.world.sceneController.UnloadAllScenesQueued();
 293                                break;
 294                            case "CreateGlobalScene":
 295                                DCL.Environment.i.world.sceneController.CreateGlobalScene(msg.payload);
 296                                break;
 297                            case "BuilderReady":
 298                                Main.i.BuilderReady();
 299                                break;
 300                            case "UpdateParcelScenes":
 301                                DCL.Environment.i.world.sceneController.UpdateParcelScenes(msg.payload);
 302                                break;
 303                            case "Teleport":
 304                                characterController.Teleport(msg.payload);
 305                                break;
 306                            case "SetRotation":
 307                                cameraController.SetRotation(msg.payload);
 308                                break;
 309                            case "LoadProfile":
 310                                UserProfileController.i?.LoadProfile(msg.payload);
 311                                break;
 312                            case "AddUserProfileToCatalog":
 313                                UserProfileController.i.AddUserProfileToCatalog(msg.payload);
 314                                break;
 315                            case "AddUserProfilesToCatalog":
 316                                UserProfileController.i.AddUserProfilesToCatalog(msg.payload);
 317                                break;
 318                            case "RemoveUserProfilesFromCatalog":
 319                                UserProfileController.i.RemoveUserProfilesFromCatalog(msg.payload);
 320                                break;
 321                            case "ActivateRendering":
 322                                renderingController.ActivateRendering();
 323                                break;
 324                            case "DeactivateRendering":
 325                                renderingController.DeactivateRendering();
 326                                break;
 327                            case "ReportFocusOn":
 328                                bridgesGameObject.SendMessage(msg.type, msg.payload);
 329                                break;
 330                            case "ReportFocusOff":
 331                                bridgesGameObject.SendMessage(msg.type, msg.payload);
 332                                break;
 333                            case "ForceActivateRendering":
 334                                renderingController.ForceActivateRendering();
 335                                break;
 336                            case "ShowNotificationFromJson":
 337                                NotificationsController.i.ShowNotificationFromJson(msg.payload);
 338                                break;
 339                            case "GetMousePosition":
 340                                GetBuilderBridge()?.GetMousePosition(msg.payload);
 341                                break;
 342                            case "SelectGizmo":
 343                                GetBuilderBridge()?.SelectGizmo(msg.payload);
 344                                break;
 345                            case "ResetObject":
 346                                GetBuilderBridge()?.ResetObject();
 347                                break;
 348                            case "ZoomDelta":
 349                                GetBuilderBridge()?.ZoomDelta(msg.payload);
 350                                break;
 351                            case "SetPlayMode":
 352                                GetBuilderBridge()?.SetPlayMode(msg.payload);
 353                                break;
 354                            case "TakeScreenshot":
 355                                GetBuilderBridge()?.TakeScreenshot(msg.payload);
 356                                break;
 357                            case "ResetBuilderScene":
 358                                GetBuilderBridge()?.ResetBuilderScene();
 359                                break;
 360                            case "SetBuilderCameraPosition":
 361                                GetBuilderBridge()?.SetBuilderCameraPosition(msg.payload);
 362                                break;
 363                            case "SetBuilderCameraRotation":
 364                                GetBuilderBridge()?.SetBuilderCameraRotation(msg.payload);
 365                                break;
 366                            case "ResetBuilderCameraZoom":
 367                                GetBuilderBridge()?.ResetBuilderCameraZoom();
 368                                break;
 369                            case "SetGridResolution":
 370                                GetBuilderBridge()?.SetGridResolution(msg.payload);
 371                                break;
 372                            case "OnBuilderKeyDown":
 373                                GetBuilderBridge()?.OnBuilderKeyDown(msg.payload);
 374                                break;
 375                            case "UnloadBuilderScene":
 376                                GetBuilderBridge()?.UnloadBuilderScene(msg.payload);
 377                                break;
 378                            case "SetSelectedEntities":
 379                                GetBuilderBridge()?.SetSelectedEntities(msg.payload);
 380                                break;
 381                            case "GetCameraTargetBuilder":
 382                                GetBuilderBridge()?.GetCameraTargetBuilder(msg.payload);
 383                                break;
 384                            case "PreloadFile":
 385                                GetBuilderBridge()?.PreloadFile(msg.payload);
 386                                break;
 387                            case "SetBuilderConfiguration":
 388                                GetBuilderBridge()?.SetBuilderConfiguration(msg.payload);
 389                                break;
 390                            case "AddWearablesToCatalog":
 391                                CatalogController.i?.AddWearablesToCatalog(msg.payload);
 392                                break;
 393                            case "WearablesRequestFailed":
 394                                CatalogController.i?.WearablesRequestFailed(msg.payload);
 395                                break;
 396                            case "RemoveWearablesFromCatalog":
 397                                CatalogController.i?.RemoveWearablesFromCatalog(msg.payload);
 398                                break;
 399                            case "ClearWearableCatalog":
 400                                CatalogController.i?.ClearWearableCatalog();
 401                                break;
 402                            case "ConfigureHUDElement":
 403                                GetHUDBridge()?.ConfigureHUDElement(msg.payload);
 404                                break;
 405                            case "InitializeFriends":
 406                                FriendsController.i?.InitializeFriends(msg.payload);
 407                                break;
 408                            case "UpdateFriendshipStatus":
 409                                FriendsController.i?.UpdateFriendshipStatus(msg.payload);
 410                                break;
 411                            case "UpdateUserPresence":
 412                                FriendsController.i?.UpdateUserPresence(msg.payload);
 413                                break;
 414                            case "FriendNotFound":
 415                                FriendsController.i?.FriendNotFound(msg.payload);
 416                                break;
 417                            case "AddMessageToChatWindow":
 418                                ChatController.i?.AddMessageToChatWindow(msg.payload);
 419                                break;
 420                            case "UpdateMinimapSceneInformation":
 421                                MinimapMetadataController.i?.UpdateMinimapSceneInformation(msg.payload);
 422                                break;
 423                            case "SetTutorialEnabled":
 424                                DCL.Tutorial.TutorialController.i?.SetTutorialEnabled(msg.payload);
 425                                break;
 426                            case "SetTutorialEnabledForUsersThatAlreadyDidTheTutorial":
 427                                DCL.Tutorial.TutorialController.i?.SetTutorialEnabledForUsersThatAlreadyDidTheTutorial(m
 428                                break;
 429                            case "TriggerSelfUserExpression":
 430                                GetHUDBridge().TriggerSelfUserExpression(msg.payload);
 431                                break;
 432                            case "AirdroppingRequest":
 433                                GetHUDBridge().AirdroppingRequest(msg.payload);
 434                                break;
 435                            case "ShowWelcomeNotification":
 436                                NotificationsController.i.ShowWelcomeNotification();
 437                                break;
 438                            case "ShowTermsOfServices":
 439                                GetHUDBridge().ShowTermsOfServices(msg.payload);
 440                                break;
 441                            case "RequestTeleport":
 442                                GetHUDBridge().RequestTeleport(msg.payload);
 443                                break;
 444                            case "UpdateHotScenesList":
 445                                HotScenesController.i.UpdateHotScenesList(msg.payload);
 446                                break;
 447                            case "UpdateBalanceOfMANA":
 448                                GetHUDBridge().UpdateBalanceOfMANA(msg.payload);
 449                                break;
 450                            case "SetPlayerTalking":
 451                                GetHUDBridge().SetPlayerTalking(msg.payload);
 452                                break;
 453                            case "SetVoiceChatEnabledByScene":
 454                                if (int.TryParse(msg.payload, out int value))
 455                                {
 456                                    GetHUDBridge().SetVoiceChatEnabledByScene(value);
 457                                }
 458
 459                                break;
 460                            case "SetRenderProfile":
 461                                RenderProfileBridge.i.SetRenderProfile(msg.payload);
 462                                break;
 463                            case "ShowAvatarEditorInSignUp":
 464                                GetHUDBridge().ShowAvatarEditorInSignUp();
 465                                break;
 466                            case "SetUserTalking":
 467                                GetHUDBridge().SetUserTalking(msg.payload);
 468                                break;
 469                            case "SetUsersMuted":
 470                                GetHUDBridge().SetUsersMuted(msg.payload);
 471                                break;
 472                            case "SetKernelConfiguration":
 473                            case "UpdateRealmsInfo":
 474                            case "ConnectionToRealmSuccess":
 475                            case "ConnectionToRealmFailed":
 476                            case "InitializeQuests":
 477                            case "UpdateQuestProgress":
 478                            case "SetENSOwnerQueryResult":
 479                            case "UnpublishSceneResult":
 480                                bridgesGameObject.SendMessage(msg.type, msg.payload);
 481                                break;
 482                            case "CrashPayloadRequest":
 483                            case "SetDisableAssetBundles":
 484                            case "DumpRendererLockersInfo":
 485                                //TODO(Brian): Move this to bridges
 486                                Main.i.SendMessage(msg.type);
 487                                break;
 488                            case "PublishSceneResult":
 489                                GetBuilderInWorldBridge()?.PublishSceneResult(msg.payload);
 490                                break;
 491                            case "BuilderProjectInfo":
 492                                GetBuilderInWorldBridge()?.BuilderProjectInfo(msg.payload);
 493                                break;
 494                            case "BuilderInWorldCatalogHeaders":
 495                                GetBuilderInWorldBridge()?.BuilderInWorldCatalogHeaders(msg.payload);
 496                                break;
 497                            case "RunPerformanceMeterTool":
 498                                if (float.TryParse(msg.payload, out float durationInSeconds))
 499                                {
 500                                    DCL.Environment.i.platform.debugController.RunPerformanceMeterTool(durationInSeconds
 501                                }
 502
 503                                break;
 504                            case "InstantiateBotsAtWorldPos":
 505                                DCL.Environment.i.platform.debugController.InstantiateBotsAtWorldPos(msg.payload);
 506                                break;
 507                            case "InstantiateBotsAtCoords":
 508                                DCL.Environment.i.platform.debugController.InstantiateBotsAtCoords(msg.payload);
 509                                break;
 510                            case "RemoveBot":
 511                                DCL.Environment.i.platform.debugController.RemoveBot(msg.payload);
 512                                break;
 513                            case "ClearBots":
 514                                DCL.Environment.i.platform.debugController.ClearBots();
 515                                break;
 516                            default:
 517                                Debug.Log(
 518                                    "<b><color=#FF0000>WSSController:</color></b> received an unknown message from kerne
 519                                    msg.type);
 520                                break;
 521                        }
 522                    }
 523
 524                    queuedMessagesDirty = false;
 525                }
 526            }
 527#endif
 528        }
 529
 530        private Builder.DCLBuilderBridge GetBuilderBridge()
 531        {
 532            if (builderBridge == null)
 533            {
 534                builderBridge = FindObjectOfType<Builder.DCLBuilderBridge>();
 535            }
 536
 537            return builderBridge;
 538        }
 539
 540        private BuilderInWorldBridge GetBuilderInWorldBridge()
 541        {
 542            if (builderInWorldBridge == null)
 543            {
 544                builderInWorldBridge = FindObjectOfType<BuilderInWorldBridge>();
 545            }
 546
 547            return builderInWorldBridge;
 548        }
 549
 550        private HUDBridge GetHUDBridge()
 551        {
 552            if (hudBridge == null)
 553            {
 554                hudBridge = FindObjectOfType<HUDBridge>();
 555            }
 556
 557            return hudBridge;
 558        }
 559    }
 560}