Ejemplo n.º 1
0
    public async Task <LoginResponse> Connect(string uri, Credential credential, Slurl slurl = null, bool getInventoryLibrary = true, bool godMode = false)
    {
        if (slurl == null)
        {
            slurl = new Slurl(Slurl.SIM_LOCATION_LAST);
        }
        Logger.LogDebug($"INFO Login.Connect: Connecting {credential.First} {credential.Last} using {uri}.");

        XmlRpcParameterArray parameters = CreateLoginParameters(credential, slurl, getInventoryLibrary, godMode);

        XmlRpcResponse response = await XmlRpcClient.Call(uri, "login_to_simulator", parameters);

        LoginResponse loginResponse = new LoginResponse();

        if (response.FaultCode != 0)
        {
            loginResponse.LoginSucceeded  = false;
            loginResponse.LoginFailReason = response.FaultCode.ToString();
            loginResponse.Message         = response.FaultString;
            loginResponse.MessageId       = "XmlRpcError";
            return(loginResponse);
        }

        if (response.Parameters.Count != 1 || (response.Parameters[0] is XmlRpcStruct == false))
        {
            loginResponse.LoginSucceeded  = false;
            loginResponse.LoginFailReason = "500";
            loginResponse.Message         = "Login response contained incorrect parameters.";
            loginResponse.MessageId       = "XmlRpcError";
            return(loginResponse);
        }

        XmlRpcStruct responseData = (XmlRpcStruct)response.Parameters[0];

        if (responseData.Has("login") == false ||
            (responseData["login"] is XmlRpcString == false) ||
            ((XmlRpcString)responseData["login"]).Value != "true")
        {
            loginResponse.LoginSucceeded  = false;
            loginResponse.LoginFailReason = responseData["reason"]?.AsString;
            loginResponse.Message         = responseData["message"]?.AsString;
            loginResponse.MessageId       = responseData["message_id"]?.AsString;
            return(loginResponse);
        }

        Logger.LogInfo("Login.Connect: Connection was successful.");

        if (ProcessLoginSuccessResponse(responseData, loginResponse))
        {
            loginResponse.LoginSucceeded = true;
            return(loginResponse);
        }
        else
        {
            // Yet another error
        }

        return(loginResponse);
    }
Ejemplo n.º 2
0
    public async void OnLogin()
    {
        Logger.LogDebug("LoginScreen.OnLogin", $"{NameText.text} ****");

        // TODO: Make it possible to select grid

        string        location        = LocationText.text.Trim();
        List <string> recentLocations = Settings.Instance.login.recentLocations;

        if (location != "" && location != LastLocation && location != HomeLocation && recentLocations.Contains(location) == false)
        {
            recentLocations.Add(location);
            Settings.Instance.Save();
        }

        Credential credential = new Credential(NameText.text, PasswordText.text);

        if (location == HomeLocation)
        {
            location = Slurl.SIM_LOCATION_HOME;
        }
        else if (location == LastLocation || location == "")
        {
            location = Slurl.SIM_LOCATION_LAST;
        }
        Slurl slurl = Slurl.FromLocationString(location);
        //Logger.LogDebug($"LoginScreen.OnLogin", $"slurl={slurl.ToString()}");

        await Session.Instance.Start(credential, slurl);

        // TODO: Saving name and password should only be done if the login is successful

        if (SaveNameToggle.isOn == false)
        {
            return;
        }

        CredentialStorage.Instance.Store(NameText.text, SavePasswordToggle.isOn ? PasswordText.text : "");

        UpdateNames();
    }
Ejemplo n.º 3
0
    /// <summary>
    /// Constructs a Slurl from user friendly region string
    /// </summary>
    /// <param name="location"></param>
    /// <returns></returns>
    public static Slurl FromLocationString(string location)
    {
        if (location == SIM_LOCATION_LAST || location == SIM_LOCATION_HOME)
        {
            return new Slurl(location);
        }

        Match match = Regex.Match(location, "(?<region>.*)(?:/(?<x>\\d+)/(?<y>\\d+))(?:/(?<z>\\d+))");
        if (match.Success == false)
        {
            return null;
        }

        Slurl slurl = new Slurl();
        string region = "";
        int x = 128;
        int y = 128;
        int z = 25;
        if (match.Groups["region"].Success)
        {
            region = match.Groups["region"].Value;
        }

        if (match.Groups["x"].Success)
        {
            x = int.Parse(match.Groups["x"].Value);
        }
        if (match.Groups["y"].Success)
        {
            y = int.Parse(match.Groups["y"].Value);
        }
        if (match.Groups["z"].Success)
        {
            z = int.Parse(match.Groups["z"].Value);
        }

        slurl.SlurlType = SlUrlType.Location;
        slurl.Region = region;
        slurl.Position = new Vector3(x, y, z);
        return slurl;
    }
Ejemplo n.º 4
0
    protected XmlRpcParameterArray CreateLoginParameters(Credential credential, Slurl slurl, bool getInventoryLibrary, bool godMode)
    {
        XmlRpcArray options = new XmlRpcArray();

        options.Append(new XmlRpcString("inventory-root"));
        options.Append(new XmlRpcString("inventory-skeleton"));
        //options.Append(new XmlRpcString("inventory-meat"));
        //options.Append(new XmlRpcString("inventory-skel-targets"));
        if (getInventoryLibrary == true)
        {
            options.Append(new XmlRpcString("inventory-lib-root"));
            options.Append(new XmlRpcString("inventory-lib-owner"));
            options.Append(new XmlRpcString("inventory-skel-lib"));
            //options.Append(new XmlRpcString("inventory-meat-lib"));
        }
        options.Append(new XmlRpcString("initial-outfit"));
        options.Append(new XmlRpcString("gestures"));
        options.Append(new XmlRpcString("display_names"));
        options.Append(new XmlRpcString("event_categories"));
        options.Append(new XmlRpcString("event_notifications"));
        options.Append(new XmlRpcString("classified_categories"));
        options.Append(new XmlRpcString("adult_compliant"));
        options.Append(new XmlRpcString("buddy-list"));
        options.Append(new XmlRpcString("newuser-config"));
        options.Append(new XmlRpcString("ui-config"));

        //send this info to login.cgi for stats gathering
        //since viewerstats isn't reliable enough
        options.Append(new XmlRpcString("advanced-mode"));

        options.Append(new XmlRpcString("max-agent-groups"));
        options.Append(new XmlRpcString("map-server-url"));
        options.Append(new XmlRpcString("voice-config"));
        options.Append(new XmlRpcString("tutorial_setting"));
        options.Append(new XmlRpcString("login-flags"));
        options.Append(new XmlRpcString("global-textures"));

        if (godMode == true)
        {
            options.Append(new XmlRpcString("UseDebugMenus"));
            options.Append(new XmlRpcString("god-connect"));
        }

        XmlRpcStruct data = new XmlRpcStruct();

        data["start"]              = new XmlRpcString(slurl.GetLoginString());
        data["agree_to_tos"]       = new XmlRpcBoolean(false);
        data["read_critical"]      = new XmlRpcBoolean(false);
        data["last_exec_event"]    = new XmlRpcInteger(LastExecEvent);
        data["last_exec_duration"] = new XmlRpcInteger(LastExecDuration);
        data["mac"]              = new XmlRpcString(MachineId);
        data["version"]          = new XmlRpcString(ViewerVersion);
        data["channel"]          = new XmlRpcString(ViewerChannel);
        data["platform"]         = new XmlRpcString(Platform);
        data["address_size"]     = new XmlRpcInteger(ADDRESS_SIZE);
        data["platform_version"] = new XmlRpcString(PlatformVersion);
        data["platform_string"]  = new XmlRpcString(PlatformVersionName);
        data["id0"]              = new XmlRpcString(SerialNumber);
        data["host_id"]          = new XmlRpcString(HostId);
        data["extended_errors"]  = new XmlRpcBoolean(true);

        data["passwd"] = new XmlRpcString(credential.Secret);
        data["first"]  = new XmlRpcString(credential.First);
        data["last"]   = new XmlRpcString(credential.Last);

        data["options"] = options;

        XmlRpcParameterArray parameters = new XmlRpcParameterArray();

        parameters.Append(data);
        return(parameters);
    }
Ejemplo n.º 5
0
    public async Task Start(string uri, Credential credential, Slurl slurl = null, bool getInventoryLibrary = true, bool godMode = false)
    {
        List <Task> awaitables = new List <Task>();

        IsLoggedIn      = false;
        IsLogoutPending = false;

        #region Login
        Logger.LogDebug("Session.Start", "LOGIN------------------------------");
        EventManager.Instance.RaiseOnProgressUpdate("Login", "Logging in...", 0.2f);

        Login         login         = new Login();
        LoginResponse loginResponse = await login.Connect(uri, credential, slurl, getInventoryLibrary, godMode);

        if (loginResponse.LoginSucceeded == false)
        {
            EventManager.Instance.RaiseOnProgressUpdate("Login", "Login failed.", 0.29f, true);

            switch (loginResponse.LoginFailReason)
            {
            case "key":
                break;

            case "update":
                break;

            case "tos":
                break;
            }
            Logger.LogWarning("Session.Start", $"Login.Connect returned {loginResponse.MessageId} {loginResponse.Message}");
            return;
        }

        SessionId = loginResponse.SessionId;
        #endregion Login

        #region WorldInit
        Logger.LogDebug("Session.Start", "WORLD_INIT-------------------------");
        EventManager.Instance.RaiseOnProgressUpdate("Login", "Initializing world...", 0.3f);

        AgentId = loginResponse.AgentId;
        Agent agent = new Agent(loginResponse.AgentId)
        {
            DisplayName = loginResponse.DisplayName,
            FirstName   = loginResponse.FirstName,
            LastName    = loginResponse.LastName
        };
        Agent.SetCurrentPlayer(agent);
        EventManager.Instance.RaiseOnAgentDataChanged(agent);

        // Before we create the first region, we need to set the agent's OriginGlobal
        // This is necessary because creating objects before this is set will result in a
        // bad PositionAgent cache.
        agent.InitOriginGlobal(loginResponse.RegionHandle.ToVector3Double());

        FirstSimHost = new Host(loginResponse.SimIp, loginResponse.SimPort);
        Region region = World.Instance.AddRegion(loginResponse.RegionHandle, FirstSimHost);

        EventManager.Instance.RaiseOnProgressUpdate("Login", "Requesting capability grants...", 0.32f);

        Task seedCapabilitiesTask = region.SetSeedCapability(loginResponse.SeedCapability);

        agent.Region = region;
        #endregion WorldInit

        #region MultimediaInit
        Logger.LogDebug("Session.Start", "MULTIMEDIA_INIT--------------------");
        EventManager.Instance.RaiseOnProgressUpdate("Login", "Initializing multimedia...", 0.42f);

        #endregion MultimediaInit

        #region FontInit
        Logger.LogDebug("Session.Start", "FONT_INIT--------------------------");
        EventManager.Instance.RaiseOnProgressUpdate("Login", "Initializing fonts...", 0.45f);

        #endregion FontInit

        #region SeedGrantedWait
        Logger.LogDebug("Session.Start", "SEED_GRANTED_WAIT------------------");
        EventManager.Instance.RaiseOnProgressUpdate("Login", "Waiting for region capabilities...", 0.47f);

        await seedCapabilitiesTask;
        #endregion SeedGrantedWait

        #region SeedCapabilitiesGranted
        Logger.LogDebug("Session.Start", "SEED_CAPABILITIES_GRANTED----------");

        RegisterEventListeners();

        CircuitCode    = loginResponse.CircuitCode;
        region.Circuit = SlMessageSystem.Instance.EnableCircuit(new Host(loginResponse.SimIp, loginResponse.SimPort));

        EventManager.Instance.RaiseOnProgressUpdate("Login", "Waiting for region handshake...", 0.59f);
        await region.Circuit.SendUseCircuitCode(loginResponse.CircuitCode, SessionId, loginResponse.AgentId);

        AvatarNameCache.Instance.Start();
        #endregion SeedCapabilitiesGranted

        #region AgentSend
        Logger.LogDebug("Session.Start", "AGENT_SEND-------------------------");

        EventManager.Instance.RaiseOnProgressUpdate("Login", "Connecting to region...", 0.6f);
        await region.Circuit.SendCompleteAgentMovement(loginResponse.AgentId, SessionId, loginResponse.CircuitCode);

        #endregion AgentSend

        #region InventorySend
        Logger.LogDebug("Session.Start", "INVENTORY_SEND---------------------");

        //TODO: Fill in inventory skeleton and request details

        //Fill in buddy list skeleton and request names:
        AvatarTracker.Instance.AddBuddyList(loginResponse.BuddyList);

        // Set up callbacks:
        AvatarTracker.Instance.RegisterCallbacks();

        //TODO: Request mute list
        //TODO: Request money balance

        awaitables.Add(region.Circuit.SendAgentDataUpdateRequest(agent.Id, SessionId));

        #endregion InventorySend

        #region Misc
        Logger.LogDebug("Session.Start", "MISC-------------------------------");

        //TODO: Calculate max bandwidth
        awaitables.Add(region.Circuit.SendAgentThrottle());

        //TODO: Download audio
        //TODO: Download active gestures

        awaitables.Add(region.Circuit.SendAgentHeightWidth(1080, 1920)); // TODO: This should take the title and status bars into account.

        #endregion Misc

        #region Precache
        Logger.LogDebug("Session.Start", "PRECACHE---------------------------");
        EventManager.Instance.RaiseOnProgressUpdate("Login", "Loading world...", 0.9f);

        //TODO: Send AgentIsNowWearing

        await Task.WhenAll(awaitables.ToArray());

        awaitables.Clear();
        #endregion Precache

        #region Cleanup
        Logger.LogDebug("Session.Start", "CLEANUP----------------------------");

        //TODO: Make map view observe inventory
        //TODO: Make map view observe friends
        //TODO: Stop Away animation
        //TODO: Clear control flag Away

        // Observe friends
        Agent.CurrentPlayer.ObserveFriends();

        //TODO: Retrieve land description
        //TODO: Send hover height to capability "AgentPreferences"

        EventManager.Instance.RaiseOnProgressUpdate("Login", "Complete", 1f);
        await Task.Delay(1000); // Wait to let player see the "Complete" message.

        EventManager.Instance.RaiseOnProgressUpdate("Login", "", 1f, true);
        #endregion Cleanup

        IsLoggedIn = true;

        await Task.Delay(3000);

        Logger.LogDebug("Session.Start", "POST----------------");

        // TODO: This is in the application loop in Indra:
        VolumeLayerManager.UnpackLayerData();
    }
Ejemplo n.º 6
0
    public async Task Start(Credential credential, Slurl slurl = null, bool getInventoryLibrary = true, bool godMode = false)
    {
        string uri = GridManager.Instance.CurrentGrid.LoginUri;

        await Start(uri, credential, slurl, getInventoryLibrary, godMode);
    }