diff options
author | Johan Berntsson | 2008-03-18 01:38:07 +0000 |
---|---|---|
committer | Johan Berntsson | 2008-03-18 01:38:07 +0000 |
commit | 040a887b9c5f22a79de3fdff3947b69d87221379 (patch) | |
tree | 401793a60499cd010ed360b6fbf991d42eb87798 | |
parent | * Move missing texture request forward so that we don't actually ask the Asse... (diff) | |
download | opensim-SC-040a887b9c5f22a79de3fdff3947b69d87221379.zip opensim-SC-040a887b9c5f22a79de3fdff3947b69d87221379.tar.gz opensim-SC-040a887b9c5f22a79de3fdff3947b69d87221379.tar.bz2 opensim-SC-040a887b9c5f22a79de3fdff3947b69d87221379.tar.xz |
Last position will be stored in the DB on logout, and the avatar can continue from the same position in the next login (only with MySQL at the moment)
-rw-r--r-- | OpenSim/Framework/Communications/LoginService.cs | 4 | ||||
-rw-r--r-- | OpenSim/Framework/Communications/UserManagerBase.cs | 57 | ||||
-rw-r--r-- | OpenSim/Framework/Data.MySQL/MySQLManager.cs | 52 | ||||
-rw-r--r-- | OpenSim/Framework/Data.MySQL/MySQLUserData.cs | 13 |
4 files changed, 115 insertions, 11 deletions
diff --git a/OpenSim/Framework/Communications/LoginService.cs b/OpenSim/Framework/Communications/LoginService.cs index 3bf6096..fc02ff6 100644 --- a/OpenSim/Framework/Communications/LoginService.cs +++ b/OpenSim/Framework/Communications/LoginService.cs | |||
@@ -154,6 +154,10 @@ namespace OpenSim.Framework.UserManagement | |||
154 | 154 | ||
155 | if (userProfile.currentAgent != null && userProfile.currentAgent.agentOnline) | 155 | if (userProfile.currentAgent != null && userProfile.currentAgent.agentOnline) |
156 | { | 156 | { |
157 | //TODO: The following statements can cause trouble: | ||
158 | // If agentOnline could not turn from true back to false normally | ||
159 | // because of some problem, for instance, the crashment of server or client, | ||
160 | // the user cannot log in any longer. | ||
157 | userProfile.currentAgent = null; | 161 | userProfile.currentAgent = null; |
158 | m_userManager.CommitAgent(ref userProfile); | 162 | m_userManager.CommitAgent(ref userProfile); |
159 | 163 | ||
diff --git a/OpenSim/Framework/Communications/UserManagerBase.cs b/OpenSim/Framework/Communications/UserManagerBase.cs index 3380e90..b8e3114 100644 --- a/OpenSim/Framework/Communications/UserManagerBase.cs +++ b/OpenSim/Framework/Communications/UserManagerBase.cs | |||
@@ -27,6 +27,7 @@ | |||
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections; | ||
30 | using System.Collections.Generic; | 31 | using System.Collections.Generic; |
31 | using System.Reflection; | 32 | using System.Reflection; |
32 | using System.Security.Cryptography; | 33 | using System.Security.Cryptography; |
@@ -337,7 +338,7 @@ namespace OpenSim.Framework.UserManagement | |||
337 | /// <param name="request">The users loginrequest</param> | 338 | /// <param name="request">The users loginrequest</param> |
338 | public void CreateAgent(UserProfileData profile, XmlRpcRequest request) | 339 | public void CreateAgent(UserProfileData profile, XmlRpcRequest request) |
339 | { | 340 | { |
340 | //Hashtable requestData = (Hashtable) request.Params[0]; | 341 | Hashtable requestData = (Hashtable) request.Params[0]; |
341 | 342 | ||
342 | UserAgentData agent = new UserAgentData(); | 343 | UserAgentData agent = new UserAgentData(); |
343 | 344 | ||
@@ -362,9 +363,24 @@ namespace OpenSim.Framework.UserManagement | |||
362 | agent.currentPos = profile.homeLocation; | 363 | agent.currentPos = profile.homeLocation; |
363 | 364 | ||
364 | // If user specified additional start, use that | 365 | // If user specified additional start, use that |
365 | // if (requestData.ContainsKey("start")) | 366 | if (requestData.ContainsKey("start")) |
366 | // { | 367 | { |
367 | // string startLoc = ((string) requestData["start"]).Trim(); | 368 | string startLoc = ((string)requestData["start"]).Trim(); |
369 | if (("last" == startLoc) && (profile.currentAgent != null)) | ||
370 | { | ||
371 | if ((profile.currentAgent.currentPos.X > 0) | ||
372 | && (profile.currentAgent.currentPos.Y > 0) | ||
373 | && (profile.currentAgent.currentPos.Z > 0) | ||
374 | ) | ||
375 | { | ||
376 | // TODO: Right now, currentRegion has not been used in GridServer for requesting region. | ||
377 | // TODO: It is only using currentHandle. | ||
378 | agent.currentRegion = profile.currentAgent.currentRegion; | ||
379 | agent.currentHandle = profile.currentAgent.currentHandle; | ||
380 | agent.currentPos = profile.currentAgent.currentPos; | ||
381 | } | ||
382 | } | ||
383 | |||
368 | // if (!(startLoc == "last" || startLoc == "home")) | 384 | // if (!(startLoc == "last" || startLoc == "home")) |
369 | // { | 385 | // { |
370 | // // Format: uri:Ahern&162&213&34 | 386 | // // Format: uri:Ahern&162&213&34 |
@@ -381,7 +397,7 @@ namespace OpenSim.Framework.UserManagement | |||
381 | // { | 397 | // { |
382 | // } | 398 | // } |
383 | // } | 399 | // } |
384 | // } | 400 | } |
385 | 401 | ||
386 | // What time did the user login? | 402 | // What time did the user login? |
387 | agent.loginTime = Util.UnixTimeSinceEpoch(); | 403 | agent.loginTime = Util.UnixTimeSinceEpoch(); |
@@ -424,7 +440,7 @@ namespace OpenSim.Framework.UserManagement | |||
424 | { | 440 | { |
425 | userAgent.agentOnline = false; | 441 | userAgent.agentOnline = false; |
426 | userAgent.logoutTime = Util.UnixTimeSinceEpoch(); | 442 | userAgent.logoutTime = Util.UnixTimeSinceEpoch(); |
427 | userAgent.sessionID = LLUUID.Zero; | 443 | //userAgent.sessionID = LLUUID.Zero; |
428 | if (regionid != null) | 444 | if (regionid != null) |
429 | { | 445 | { |
430 | userAgent.currentRegion = regionid; | 446 | userAgent.currentRegion = regionid; |
@@ -493,8 +509,12 @@ namespace OpenSim.Framework.UserManagement | |||
493 | /// <returns>Successful?</returns> | 509 | /// <returns>Successful?</returns> |
494 | public bool CommitAgent(ref UserProfileData profile) | 510 | public bool CommitAgent(ref UserProfileData profile) |
495 | { | 511 | { |
496 | // TODO: how is this function different from setUserProfile? | 512 | // TODO: how is this function different from setUserProfile? -> Add AddUserAgent() here and commit both tables "users" and "agents" |
497 | return setUserProfile(profile); | 513 | // TODO: what is the logic should be? |
514 | bool ret = false; | ||
515 | ret = AddUserAgent(profile.currentAgent); | ||
516 | ret = ret & setUserProfile(profile); | ||
517 | return ret; | ||
498 | } | 518 | } |
499 | 519 | ||
500 | #endregion | 520 | #endregion |
@@ -558,5 +578,26 @@ namespace OpenSim.Framework.UserManagement | |||
558 | public abstract UserProfileData SetupMasterUser(string firstName, string lastName); | 578 | public abstract UserProfileData SetupMasterUser(string firstName, string lastName); |
559 | public abstract UserProfileData SetupMasterUser(string firstName, string lastName, string password); | 579 | public abstract UserProfileData SetupMasterUser(string firstName, string lastName, string password); |
560 | public abstract UserProfileData SetupMasterUser(LLUUID uuid); | 580 | public abstract UserProfileData SetupMasterUser(LLUUID uuid); |
581 | |||
582 | /// <summary> | ||
583 | /// Add agent to DB | ||
584 | /// </summary> | ||
585 | /// <param name="agentdata">The agent data to be added</param> | ||
586 | public bool AddUserAgent(UserAgentData agentdata) | ||
587 | { | ||
588 | foreach (KeyValuePair<string, IUserData> plugin in _plugins) | ||
589 | { | ||
590 | try | ||
591 | { | ||
592 | plugin.Value.AddNewUserAgent(agentdata); | ||
593 | return true; | ||
594 | } | ||
595 | catch (Exception e) | ||
596 | { | ||
597 | m_log.Info("[USERSTORAGE]: Unable to add agent via " + plugin.Key + "(" + e.ToString() + ")"); | ||
598 | } | ||
599 | } | ||
600 | return false; | ||
601 | } | ||
561 | } | 602 | } |
562 | } | 603 | } |
diff --git a/OpenSim/Framework/Data.MySQL/MySQLManager.cs b/OpenSim/Framework/Data.MySQL/MySQLManager.cs index 0410643..46fd1bc 100644 --- a/OpenSim/Framework/Data.MySQL/MySQLManager.cs +++ b/OpenSim/Framework/Data.MySQL/MySQLManager.cs | |||
@@ -397,14 +397,14 @@ namespace OpenSim.Framework.Data.MySQL | |||
397 | // Agent Who? | 397 | // Agent Who? |
398 | retval.agentIP = (string) reader["agentIP"]; | 398 | retval.agentIP = (string) reader["agentIP"]; |
399 | retval.agentPort = Convert.ToUInt32(reader["agentPort"].ToString()); | 399 | retval.agentPort = Convert.ToUInt32(reader["agentPort"].ToString()); |
400 | retval.agentOnline = Convert.ToBoolean(reader["agentOnline"].ToString()); | 400 | retval.agentOnline = Convert.ToBoolean(Convert.ToInt16(reader["agentOnline"].ToString())); |
401 | 401 | ||
402 | // Login/Logout times (UNIX Epoch) | 402 | // Login/Logout times (UNIX Epoch) |
403 | retval.loginTime = Convert.ToInt32(reader["loginTime"].ToString()); | 403 | retval.loginTime = Convert.ToInt32(reader["loginTime"].ToString()); |
404 | retval.logoutTime = Convert.ToInt32(reader["logoutTime"].ToString()); | 404 | retval.logoutTime = Convert.ToInt32(reader["logoutTime"].ToString()); |
405 | 405 | ||
406 | // Current position | 406 | // Current position |
407 | retval.currentRegion = (string) reader["currentRegion"]; | 407 | retval.currentRegion = new LLUUID((string)reader["currentRegion"]); |
408 | retval.currentHandle = Convert.ToUInt64(reader["currentHandle"].ToString()); | 408 | retval.currentHandle = Convert.ToUInt64(reader["currentHandle"].ToString()); |
409 | LLVector3.TryParse((string) reader["currentPos"], out retval.currentPos); | 409 | LLVector3.TryParse((string) reader["currentPos"], out retval.currentPos); |
410 | } | 410 | } |
@@ -859,5 +859,53 @@ namespace OpenSim.Framework.Data.MySQL | |||
859 | 859 | ||
860 | return returnval; | 860 | return returnval; |
861 | } | 861 | } |
862 | |||
863 | /// <summary> | ||
864 | /// Creates a new agent and inserts it into the database | ||
865 | /// </summary> | ||
866 | /// <param name="agentdata">The agent data to be inserted</param> | ||
867 | /// <returns>Success?</returns> | ||
868 | public bool insertAgentRow(UserAgentData agentdata) | ||
869 | { | ||
870 | string sql = String.Empty; | ||
871 | sql += "REPLACE INTO "; | ||
872 | sql += "agents (UUID, sessionID, secureSessionID, agentIP, agentPort, agentOnline, loginTime, logoutTime, currentRegion, currentHandle, currentPos) VALUES "; | ||
873 | sql += "(?UUID, ?sessionID, ?secureSessionID, ?agentIP, ?agentPort, ?agentOnline, ?loginTime, ?logoutTime, ?currentRegion, ?currentHandle, ?currentPos);"; | ||
874 | Dictionary<string, string> parameters = new Dictionary<string, string>(); | ||
875 | |||
876 | parameters["?UUID"] = agentdata.UUID.ToString(); | ||
877 | parameters["?sessionID"] = agentdata.sessionID.ToString(); | ||
878 | parameters["?secureSessionID"] = agentdata.secureSessionID.ToString(); | ||
879 | parameters["?agentIP"] = agentdata.agentIP.ToString(); | ||
880 | parameters["?agentPort"] = agentdata.agentPort.ToString(); | ||
881 | parameters["?agentOnline"] = (agentdata.agentOnline == true) ? "1" : "0"; | ||
882 | parameters["?loginTime"] = agentdata.loginTime.ToString(); | ||
883 | parameters["?logoutTime"] = agentdata.logoutTime.ToString(); | ||
884 | parameters["?currentRegion"] = agentdata.currentRegion.ToString(); | ||
885 | parameters["?currentHandle"] = agentdata.currentHandle.ToString(); | ||
886 | parameters["?currentPos"] = "<" + ((int)agentdata.currentPos.X).ToString() + "," + ((int)agentdata.currentPos.Y).ToString() + "," + ((int)agentdata.currentPos.Z).ToString() + ">"; | ||
887 | |||
888 | bool returnval = false; | ||
889 | |||
890 | try | ||
891 | { | ||
892 | IDbCommand result = Query(sql, parameters); | ||
893 | |||
894 | //Console.WriteLine(result.CommandText); | ||
895 | int x; | ||
896 | if ((x = result.ExecuteNonQuery()) > 0) | ||
897 | { | ||
898 | returnval = true; | ||
899 | } | ||
900 | result.Dispose(); | ||
901 | } | ||
902 | catch (Exception e) | ||
903 | { | ||
904 | m_log.Error(e.ToString()); | ||
905 | return false; | ||
906 | } | ||
907 | |||
908 | return returnval; | ||
909 | } | ||
862 | } | 910 | } |
863 | } | 911 | } |
diff --git a/OpenSim/Framework/Data.MySQL/MySQLUserData.cs b/OpenSim/Framework/Data.MySQL/MySQLUserData.cs index 2bba6ce..4c76461 100644 --- a/OpenSim/Framework/Data.MySQL/MySQLUserData.cs +++ b/OpenSim/Framework/Data.MySQL/MySQLUserData.cs | |||
@@ -585,7 +585,18 @@ namespace OpenSim.Framework.Data.MySQL | |||
585 | /// <param name="agent">The agent to create</param> | 585 | /// <param name="agent">The agent to create</param> |
586 | public void AddNewUserAgent(UserAgentData agent) | 586 | public void AddNewUserAgent(UserAgentData agent) |
587 | { | 587 | { |
588 | // Do nothing. | 588 | try |
589 | { | ||
590 | lock (database) | ||
591 | { | ||
592 | database.insertAgentRow(agent); | ||
593 | } | ||
594 | } | ||
595 | catch (Exception e) | ||
596 | { | ||
597 | database.Reconnect(); | ||
598 | m_log.Error(e.ToString()); | ||
599 | } | ||
589 | } | 600 | } |
590 | 601 | ||
591 | /// <summary> | 602 | /// <summary> |