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 /OpenSim | |
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)
Diffstat (limited to 'OpenSim')
-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> |