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); }
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(); }
/// <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; }
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); }
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(); }
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); }