From be93c0f29a888db26676347f7011b66dff3d7499 Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Sun, 13 Apr 2008 22:47:12 +0000 Subject: * Fix a bug in the friends module that causes a friend not to appear online when they were. * A few things for testing. * This makes a modification to the region registration with the grid server so that the region can send it a chosen password to identify itself. It will not cause any errors, if either one are not updated. --- OpenSim/Framework/RegionInfo.cs | 1 + OpenSim/Grid/GridServer/GridManager.cs | 17 +- .../Region/Communications/OGS1/OGS1GridServices.cs | 1 + .../Environment/Modules/BetaGridLikeMoneyModule.cs | 885 ++++++++++++++++++++- .../Region/Environment/Modules/FriendsModule.cs | 2 +- bin/OpenSim.ini.example | 9 +- 6 files changed, 898 insertions(+), 17 deletions(-) diff --git a/OpenSim/Framework/RegionInfo.cs b/OpenSim/Framework/RegionInfo.cs index da20edc..f19f1db 100644 --- a/OpenSim/Framework/RegionInfo.cs +++ b/OpenSim/Framework/RegionInfo.cs @@ -216,6 +216,7 @@ namespace OpenSim.Framework public string MasterAvatarFirstName = String.Empty; public string MasterAvatarLastName = String.Empty; public string MasterAvatarSandboxPassword = String.Empty; + public string regionSecret = LLUUID.Random().ToString(); public string proxyUrl = ""; public LLUUID originRegionID = LLUUID.Zero; diff --git a/OpenSim/Grid/GridServer/GridManager.cs b/OpenSim/Grid/GridServer/GridManager.cs index 7b41f6e..ba526c0 100644 --- a/OpenSim/Grid/GridServer/GridManager.cs +++ b/OpenSim/Grid/GridServer/GridManager.cs @@ -530,7 +530,22 @@ namespace OpenSim.Grid.GridServer sim.regionRecvKey = String.Empty; sim.regionSendKey = String.Empty; - sim.regionSecret = Config.SimRecvKey; + + if (requestData.ContainsKey("region_secret")) + { + string regionsecret = (string)requestData["region_secret"]; + if (regionsecret.Length > 0) + sim.regionSecret = regionsecret; + else + sim.regionSecret = Config.SimRecvKey; + + } + else + { + sim.regionSecret = Config.SimRecvKey; + } + + sim.regionDataURI = String.Empty; sim.regionAssetURI = Config.DefaultAssetServer; sim.regionAssetRecvKey = Config.AssetRecvKey; diff --git a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs index 22bb0f0..8c40d3e 100644 --- a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs +++ b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs @@ -112,6 +112,7 @@ namespace OpenSim.Region.Communications.OGS1 GridParams["map-image-id"] = regionInfo.EstateSettings.terrainImageID.ToString(); GridParams["originUUID"] = regionInfo.originRegionID.ToString(); GridParams["server_uri"] = regionInfo.ServerURI; + GridParams["region_secret"] = regionInfo.regionSecret; // part of an initial brutish effort to provide accurate information (as per the xml region spec) // wrt the ownership of a given region diff --git a/OpenSim/Region/Environment/Modules/BetaGridLikeMoneyModule.cs b/OpenSim/Region/Environment/Modules/BetaGridLikeMoneyModule.cs index 8d6e9fd..aabb2d1 100644 --- a/OpenSim/Region/Environment/Modules/BetaGridLikeMoneyModule.cs +++ b/OpenSim/Region/Environment/Modules/BetaGridLikeMoneyModule.cs @@ -26,20 +26,38 @@ */ using System; +using System.Collections; using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; +using System.Xml; using libsecondlife; using Nini.Config; using OpenSim.Framework; using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Scenes; +using Nwc.XmlRpc; + using MoneyTransferArgs = OpenSim.Region.Environment.Scenes.EventManager.MoneyTransferArgs; namespace OpenSim.Region.Environment.Modules -{ +{ + /// + /// Demo Economy/Money Module. This is not a production quality money/economy module! + /// This is a demo for you to use when making one that works for you. + /// public class BetaGridLikeMoneyModule: IRegionModule { private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); - + + /// + /// Region UUIDS indexed by AgentID + /// + Dictionary m_rootAgents = new Dictionary(); + + /// + /// Scenes by Region Handle + /// private Dictionary m_scenel = new Dictionary(); private IConfigSource m_gConfig; @@ -55,7 +73,7 @@ namespace OpenSim.Region.Environment.Modules private Dictionary m_KnownClientFunds = new Dictionary(); private bool gridmode = false; - + private Scene XMLRPCHandler; private float EnergyEfficiency = 0f; private int ObjectCapacity = 45000; private int ObjectCount = 0; @@ -73,11 +91,21 @@ namespace OpenSim.Region.Environment.Modules private int PriceUpload = 0; private int TeleportMinPrice = 0; private int UserLevelPaysFees = 2; + private string m_MoneyAddress = String.Empty; + private string m_LandAddress = String.Empty; float TeleportPriceExponent = 0f; + /// + /// Where Stipends come from and Fees go to. + /// LLUUID EconomyBaseAccount = LLUUID.Zero; + /// + /// Startup + /// + /// + /// public void Initialise(Scene scene, IConfigSource config) { m_gConfig = config; @@ -94,6 +122,31 @@ namespace OpenSim.Region.Environment.Modules { lock (m_scenel) { + if (m_scenel.Count == 0) + { + XMLRPCHandler = scene; + + // To use the following you need to add: + // -helperuri
+ // to the command line parameters you use to start up your client + // This commonly looks like -helperuri http://127.0.0.1:9000/ + + if (m_MoneyAddress.Length > 0) + { + // Centralized grid structure using OpenSimWi Redux revision 9+ + scene.AddXmlRPCHandler("dynamic_balance_update_request", GridMoneyUpdate); + } + else + { + // Local Server.. enables functionality only. + scene.AddXmlRPCHandler("getCurrencyQuote", quote_func); + scene.AddXmlRPCHandler("buyCurrency", buy_func); + scene.AddXmlRPCHandler("preflightBuyLandPrep", preflightBuyLandPrep_func); + scene.AddXmlRPCHandler("buyLandPrep", landBuy_func); + } + + + } if (m_scenel.ContainsKey(scene.RegionInfo.RegionHandle)) { @@ -109,10 +162,18 @@ namespace OpenSim.Region.Environment.Modules scene.EventManager.OnMoneyTransfer += MoneyTransferAction; scene.EventManager.OnClientClosed += ClientClosed; scene.EventManager.OnNewInventoryItemUploadComplete += NewInventoryItemEconomyHandler; + scene.EventManager.OnAvatarEnteringNewParcel += AvatarEnteringParcel; + scene.EventManager.OnMakeChildAgent += MakeChildAgent; + scene.EventManager.OnClientClosed += ClientLoggedOut; } } - + /// + /// Parse Configuration + /// + /// + /// + /// private void ReadConfigAndPopulate(Scene scene, IConfig startupConfig, string config) { if (config == "Startup" && startupConfig != null) @@ -145,12 +206,18 @@ namespace OpenSim.Region.Environment.Modules m_stipend = startupConfig.GetInt("UserStipend", 500); m_minFundsBeforeRefresh = startupConfig.GetInt("IssueStipendWhenClientIsBelowAmount", 10); m_keepMoneyAcrossLogins = startupConfig.GetBoolean("KeepMoneyAcrossLogins", true); + m_MoneyAddress = startupConfig.GetString("CurrencyServer", String.Empty); + m_LandAddress = startupConfig.GetString("LandServer", String.Empty); } // Send ObjectCapacity to Scene.. Which sends it to the SimStatsReporter. scene.SetObjectCapacity(ObjectCapacity); } + /// + /// New Client Event Handler + /// + /// private void OnNewClient(IClientAPI client) { // Here we check if we're in grid mode @@ -159,7 +226,58 @@ namespace OpenSim.Region.Environment.Modules if (gridmode) { - CheckExistAndRefreshFunds(client.AgentId); + if (m_MoneyAddress.Length == 0) + { + + CheckExistAndRefreshFunds(client.AgentId); + } + else + { + //client.SecureSessionId; + Scene s = GetRandomScene(); + if (s != null) + { + //s.RegionInfo.RegionHandle; + LLUUID agentID = LLUUID.Zero; + int funds = 0; + + Hashtable hbinfo = GetBalanceForUserFromMoneyServer(client.AgentId, client.SecureSessionId, s.RegionInfo.originRegionID.ToString(), s.RegionInfo.regionSecret); + if ((bool)hbinfo["success"] == true) + { + + Helpers.TryParse((string)hbinfo["agentId"], out agentID); + try + { + funds = (Int32)hbinfo["funds"]; + } + catch (ArgumentException) + { + } + catch (FormatException) + { + } + catch (OverflowException) + { + m_log.ErrorFormat("[MONEY]: While getting the Currency for user {0}, the return funds overflowed.", agentID); + client.SendAlertMessage("Unable to get your money balance, money operations will be unavailable"); + } + catch (InvalidCastException) + { + funds = 0; + } + + m_KnownClientFunds[agentID] = funds; + } + else + { + m_log.WarnFormat("[MONEY]: Getting Money for user {0} failed with the following message:{1}", agentID, (string)hbinfo["errorMessage"]); + client.SendAlertMessage((string)hbinfo["errorMessage"]); + } + SendMoneyBalance(client, agentID, client.SessionId, LLUUID.Zero); + + } + } + } else { @@ -170,19 +288,34 @@ namespace OpenSim.Region.Environment.Modules client.OnEconomyDataRequest += EconomyDataRequestHandler; client.OnMoneyBalanceRequest += SendMoneyBalance; client.OnLogout += ClientClosed; - + } + #region event Handlers + + /// + /// When the client closes the connection we remove their accounting info from memory to free up resources. + /// + /// public void ClientClosed(LLUUID AgentID) { lock (m_KnownClientFunds) { - if (!m_keepMoneyAcrossLogins) + if (m_keepMoneyAcrossLogins && m_MoneyAddress.Length == 0) + { + } + else + { m_KnownClientFunds.Remove(AgentID); + } } } + /// + /// Event called Economy Data Request handler. + /// + /// public void EconomyDataRequestHandler(LLUUID agentId) { IClientAPI user = LocateClientObject(agentId); @@ -196,6 +329,11 @@ namespace OpenSim.Region.Environment.Modules } } + /// + /// THis method gets called when someone pays someone else as a gift. + /// + /// + /// private void MoneyTransferAction (Object osender, MoneyTransferArgs e) { IClientAPI sender = null; @@ -228,6 +366,13 @@ namespace OpenSim.Region.Environment.Modules } } + /// + /// A new inventory item came in, so we must charge if we're configured to do so! + /// + /// + /// + /// + /// private void NewInventoryItemEconomyHandler(LLUUID Uploader, LLUUID AssetID, String AssetName, int userlevel) { // Presumably a normal grid would actually send this information to a server somewhere. @@ -244,6 +389,144 @@ namespace OpenSim.Region.Environment.Modules } + /// + /// Event Handler for when a root agent becomes a child agent + /// + /// + private void MakeChildAgent(ScenePresence avatar) + { + + lock (m_rootAgents) + { + if (m_rootAgents.ContainsKey(avatar.UUID)) + { + if (m_rootAgents[avatar.UUID] == avatar.Scene.RegionInfo.originRegionID) + { + m_rootAgents.Remove(avatar.UUID); + m_log.Info("[MONEY]: Removing " + avatar.Firstname + " " + avatar.Lastname + " as a root agent"); + } + + } + } + + } + + /// + /// Event Handler for when the client logs out. + /// + /// + private void ClientLoggedOut(LLUUID AgentId) + { + lock (m_rootAgents) + { + if (m_rootAgents.ContainsKey(AgentId)) + { + m_rootAgents.Remove(AgentId); + //m_log.Info("[MONEY]: Removing " + AgentId + ". Agent logged out."); + } + } + } + + /// + /// Call this when the client disconnects. + /// + /// + public void ClientClosed(IClientAPI client) + { + ClientClosed(client.AgentId); + } + + /// + /// Event Handler for when an Avatar enters one of the parcels in the simulator. + /// + /// + /// + /// + private void AvatarEnteringParcel(ScenePresence avatar, int localLandID, LLUUID regionID) + { + lock (m_rootAgents) + { + if (m_rootAgents.ContainsKey(avatar.UUID)) + { + if (avatar.Scene.RegionInfo.originRegionID != m_rootAgents[avatar.UUID]) + { + m_rootAgents[avatar.UUID] = avatar.Scene.RegionInfo.originRegionID; + //m_log.Info("[MONEY]: Claiming " + avatar.Firstname + " " + avatar.Lastname + " in region:" + avatar.RegionHandle + "."); + // Claim User! my user! Mine mine mine! + if (m_MoneyAddress.Length > 0) + { + Scene RegionItem = GetSceneByUUID(regionID); + if (RegionItem != null) + { + Hashtable hresult = claim_user(avatar.UUID, avatar.ControllingClient.SecureSessionId, regionID, RegionItem.RegionInfo.regionSecret); + if ((bool)hresult["success"] == true) + { + int funds = 0; + try + { + funds = (Int32)hresult["funds"]; + } + catch (InvalidCastException) + { + + } + SetLocalFundsForAgentID(avatar.UUID, funds); + } + else + { + avatar.ControllingClient.SendAgentAlertMessage((string)hresult["errorMessage"], true); + } + } + } + } + } + else + { + lock (m_rootAgents) + { + m_rootAgents.Add(avatar.UUID, avatar.Scene.RegionInfo.originRegionID); + } + if (m_MoneyAddress.Length > 0) + { + Scene RegionItem = GetSceneByUUID(regionID); + if (RegionItem != null) + { + Hashtable hresult = claim_user(avatar.UUID, avatar.ControllingClient.SecureSessionId, regionID, RegionItem.RegionInfo.regionSecret); + if ((bool)hresult["success"] == true) + { + int funds = 0; + try + { + funds = (Int32)hresult["funds"]; + } + catch (InvalidCastException) + { + + } + SetLocalFundsForAgentID(avatar.UUID, funds); + } + else + { + avatar.ControllingClient.SendAgentAlertMessage((string)hresult["errorMessage"], true); + } + } + } + + //m_log.Info("[MONEY]: Claiming " + avatar.Firstname + " " + avatar.Lastname + " in region:" + avatar.RegionHandle + "."); + } + } + //m_log.Info("[FRIEND]: " + avatar.Name + " status:" + (!avatar.IsChildAgent).ToString()); + } + + #endregion + + /// + /// Transfer money This currently does Gifts only. + /// + /// + /// + /// + /// private bool doMoneyTranfer(LLUUID Sender, LLUUID Receiver, int amount) { bool result = false; @@ -267,10 +550,20 @@ namespace OpenSim.Region.Environment.Modules // Make a record for them so they get the updated balance when they login CheckExistAndRefreshFunds(Receiver); } + if (m_enabled) + { + if (m_MoneyAddress.Length == 0) + { + //Add the amount to the Receiver's funds + m_KnownClientFunds[Receiver] += amount; + result = true; + } + else + { - //Add the amount to the Receiver's funds - m_KnownClientFunds[Receiver] += amount; - result = true; + result = TransferMoneyonMoneyServer(Sender, Receiver, amount); + } + } } else { @@ -286,7 +579,12 @@ namespace OpenSim.Region.Environment.Modules } return result; } - + #region Utility Helpers + /// + /// Locates a IClientAPI for the client specified + /// + /// + /// private IClientAPI LocateClientObject(LLUUID AgentID) { ScenePresence tPresence = null; @@ -314,11 +612,71 @@ namespace OpenSim.Region.Environment.Modules return null; } - public void ClientClosed(IClientAPI client) + private Scene LocateSceneClientIn(LLUUID AgentId) { - ClientClosed(client.AgentId); + lock (m_scenel) + { + foreach (Scene _scene in m_scenel.Values) + { + ScenePresence tPresence = _scene.GetScenePresence(AgentId); + if (tPresence != null) + { + if (!tPresence.IsChildAgent) + { + return _scene; + } + } + + } + + } + return null; } + /// + /// Utility function Gets a Random scene in the instance. For when which scene exactly you're doing something with doesn't matter + /// + /// + public Scene GetRandomScene() + { + lock (m_scenel) + { + foreach (Scene rs in m_scenel.Values) + return rs; + } + return null; + + } + /// + /// Utility function to get a Scene by RegionID in a module + /// + /// + /// + public Scene GetSceneByUUID(LLUUID RegionID) + { + lock (m_scenel) + { + foreach (Scene rs in m_scenel.Values) + { + if (rs.RegionInfo.originRegionID == RegionID) + { + return rs; + } + } + } + return null; + } + #endregion + + + + /// + /// Sends the the stored money balance to the client + /// + /// + /// + /// + /// public void SendMoneyBalance(IClientAPI client, LLUUID agentID, LLUUID SessionID, LLUUID TransactionID) { if (client.AgentId == agentID && client.SessionId == SessionID) @@ -342,6 +700,11 @@ namespace OpenSim.Region.Environment.Modules } } + #region local Fund Management + /// + /// Ensures that the agent accounting data is set up in this instance. + /// + /// private void CheckExistAndRefreshFunds(LLUUID agentID) { lock (m_KnownClientFunds) @@ -359,7 +722,11 @@ namespace OpenSim.Region.Environment.Modules } } } - + /// + /// Gets the amount of Funds for an agent + /// + /// + /// private int GetFundsForAgentID(LLUUID AgentID) { int returnfunds = 0; @@ -376,6 +743,488 @@ namespace OpenSim.Region.Environment.Modules } return returnfunds; } + private void SetLocalFundsForAgentID(LLUUID AgentID, int amount) + { + lock (m_KnownClientFunds) + { + if (m_KnownClientFunds.ContainsKey(AgentID)) + { + m_KnownClientFunds[AgentID] = amount; + } + else + { + m_KnownClientFunds.Add(AgentID, amount); + } + } + + } + + #endregion + + /// + /// Gets the current balance for the user from the Grid Money Server + /// + /// + /// + /// + /// + /// + public Hashtable GetBalanceForUserFromMoneyServer(LLUUID agentId, LLUUID secureSessionID, LLUUID regionId, string regionSecret) + { + + Hashtable MoneyBalanceRequestParams = new Hashtable(); + MoneyBalanceRequestParams["agentId"] = agentId.ToString(); + MoneyBalanceRequestParams["secureSessionId"] = secureSessionID.ToString(); + MoneyBalanceRequestParams["regionId"] = regionId.ToString(); + MoneyBalanceRequestParams["secret"] = regionSecret; + MoneyBalanceRequestParams["currencySecret"] = ""; // per - region/user currency secret gotten from the money system + + Hashtable MoneyRespData = genericCurrencyXMLRPCRequest(MoneyBalanceRequestParams, "simulator_user_balance_request"); + + return MoneyRespData; + } + + + + /// + /// Generic XMLRPC client abstraction + /// + /// Hashtable containing parameters to the method + /// Method to invoke + /// Hashtable with success=>bool and other values + public Hashtable genericCurrencyXMLRPCRequest(Hashtable ReqParams, string method) + { + ArrayList SendParams = new ArrayList(); + SendParams.Add(ReqParams); + // Send Request + XmlRpcResponse MoneyResp; + try + { + XmlRpcRequest BalanceRequestReq = new XmlRpcRequest(method, SendParams); + MoneyResp = BalanceRequestReq.Send(m_MoneyAddress, 30000); + } + catch (WebException ex) + { + + m_log.ErrorFormat( + "[MONEY]: Unable to connect to Money Server {0}. Exception {1}", + m_MoneyAddress, ex); + + Hashtable ErrorHash = new Hashtable(); + ErrorHash["success"] = false; + ErrorHash["errorMessage"] = "Unable to manage your money at this time. Purchases may be unavailable"; + ErrorHash["errorURI"] = ""; + + return ErrorHash; + //throw (ex); + } + catch (SocketException ex) + { + + m_log.ErrorFormat( + "[MONEY]: Unable to connect to Money Server {0}. Exception {1}", + m_MoneyAddress, ex); + + Hashtable ErrorHash = new Hashtable(); + ErrorHash["success"] = false; + ErrorHash["errorMessage"] = "Unable to manage your money at this time. Purchases may be unavailable"; + ErrorHash["errorURI"] = ""; + + return ErrorHash; + //throw (ex); + } + catch (XmlException ex) + { + m_log.ErrorFormat( + "[MONEY]: Unable to connect to Money Server {0}. Exception {1}", + m_MoneyAddress, ex); + + Hashtable ErrorHash = new Hashtable(); + ErrorHash["success"] = false; + ErrorHash["errorMessage"] = "Unable to manage your money at this time. Purchases may be unavailable"; + ErrorHash["errorURI"] = ""; + + return ErrorHash; + + } + if (MoneyResp.IsFault) + { + Hashtable ErrorHash = new Hashtable(); + ErrorHash["success"] = false; + ErrorHash["errorMessage"] = "Unable to manage your money at this time. Purchases may be unavailable"; + ErrorHash["errorURI"] = ""; + + return ErrorHash; + + } + Hashtable MoneyRespData = (Hashtable)MoneyResp.Value; + + return MoneyRespData; + } + /// + /// This informs the Money Grid Server that the avatar is in this simulator + /// + /// + /// + /// + /// + /// + public Hashtable claim_user(LLUUID agentId, LLUUID secureSessionID, LLUUID regionId, string regionSecret) + { + + Hashtable MoneyBalanceRequestParams = new Hashtable(); + MoneyBalanceRequestParams["agentId"] = agentId.ToString(); + MoneyBalanceRequestParams["secureSessionId"] = secureSessionID.ToString(); + MoneyBalanceRequestParams["regionId"] = regionId.ToString(); + MoneyBalanceRequestParams["secret"] = regionSecret; + + Hashtable MoneyRespData = genericCurrencyXMLRPCRequest(MoneyBalanceRequestParams, "simulator_claim_user_request"); + IClientAPI sendMoneyBal = LocateClientObject(agentId); + if (sendMoneyBal != null) + { + SendMoneyBalance(sendMoneyBal, agentId, sendMoneyBal.SessionId, LLUUID.Zero); + } + return MoneyRespData; + } + + /// + /// Informs the Money Grid Server of a transfer. + /// + /// + /// + /// + /// + public bool TransferMoneyonMoneyServer(LLUUID sourceId, LLUUID destId, int amount) + { + string description = "Gift"; + int aggregatePermInventory = 0; + int aggregatePermNextOwner = 0; + int flags = 0; + int transactiontype = 0; + bool rvalue = false; + + IClientAPI cli = LocateClientObject(sourceId); + if (cli != null) + { + + Scene userScene = null; + lock (m_rootAgents) + { + userScene = GetSceneByUUID(m_rootAgents[sourceId]); + } + if (userScene != null) + { + Hashtable ht = new Hashtable(); + ht["agentId"] = sourceId.ToString(); + ht["secureSessionId"] = cli.SecureSessionId.ToString(); + ht["regionId"] = userScene.RegionInfo.originRegionID.ToString(); + ht["secret"] = userScene.RegionInfo.regionSecret; + ht["currencySecret"] = " "; + ht["destId"] = destId.ToString(); + ht["cash"] = amount; + ht["aggregatePermInventory"] = aggregatePermInventory; + ht["aggregatePermNextOwner"] = aggregatePermNextOwner; + ht["flags"] = flags; + ht["transactionType"] = transactiontype; + ht["description"] = description; + + Hashtable hresult = genericCurrencyXMLRPCRequest(ht, "region_move_money"); + + if ((bool)hresult["success"] == true) + { + int funds1 = 0; + int funds2 = 0; + try + { + funds1 = (Int32)hresult["funds"]; + } + catch(InvalidCastException) + { + funds1 = 0; + } + SetLocalFundsForAgentID(sourceId, funds1); + if (m_KnownClientFunds.ContainsKey(destId)) + { + try + { + funds2 = (Int32)hresult["funds2"]; + } + catch (InvalidCastException) + { + funds2 = 0; + } + SetLocalFundsForAgentID(destId, funds2); + } + + + rvalue = true; + } + else + { + cli.SendAgentAlertMessage((string)hresult["errorMessage"], true); + } + + } + } + else + { + m_log.ErrorFormat("[MONEY]: Client {0} not found", sourceId.ToString()); + } + + return rvalue; + + } + + + public XmlRpcResponse GridMoneyUpdate(XmlRpcRequest request) + { + m_log.Debug("[MONEY]: Dynamic balance update called."); + Hashtable requestData = (Hashtable)request.Params[0]; + + if (requestData.ContainsKey("agentId")) + { + LLUUID agentId = LLUUID.Zero; + + Helpers.TryParse((string)requestData["agentId"], out agentId); + if (agentId != LLUUID.Zero) + { + IClientAPI aClient = LocateClientObject(agentId); + if (aClient != null) + { + Scene s = LocateSceneClientIn(agentId); + if (s != null) + { + if (m_MoneyAddress.Length > 0) + { + Hashtable hbinfo = GetBalanceForUserFromMoneyServer(aClient.AgentId, aClient.SecureSessionId, s.RegionInfo.originRegionID.ToString(), s.RegionInfo.regionSecret); + if ((bool)hbinfo["success"] == true) + { + int funds = 0; + Helpers.TryParse((string)hbinfo["agentId"], out agentId); + try + { + funds = (Int32)hbinfo["funds"]; + } + catch (ArgumentException) + { + } + catch (FormatException) + { + } + catch (OverflowException) + { + m_log.ErrorFormat("[MONEY]: While getting the Currency for user {0}, the return funds overflowed.", agentId); + aClient.SendAlertMessage("Unable to get your money balance, money operations will be unavailable"); + } + catch (InvalidCastException) + { + funds = 0; + } + + SetLocalFundsForAgentID(agentId, funds); + } + else + { + m_log.WarnFormat("[MONEY]: Getting Money for user {0} failed with the following message:{1}", agentId, (string)hbinfo["errorMessage"]); + aClient.SendAlertMessage((string)hbinfo["errorMessage"]); + } + } + SendMoneyBalance(aClient, agentId, aClient.SessionId, LLUUID.Zero); + } + else + { + m_log.Debug("[MONEY]: Got balance request update for agent that is here, but couldn't find which scene."); + } + } + else + { + m_log.Debug("[MONEY]: Got balance request update for agent that isn't here."); + } + + } + else + { + m_log.Debug("[MONEY]: invalid agentId specified, dropping."); + } + } + else + { + m_log.Debug("[MONEY]: no agentId specified, dropping."); + } + XmlRpcResponse r = new XmlRpcResponse(); + Hashtable rparms = new Hashtable(); + rparms["success"] = true; + + r.Value = rparms; + return r; + } + +# region Standalone box enablers only + + public XmlRpcResponse quote_func(XmlRpcRequest request) + { + Hashtable requestData = (Hashtable)request.Params[0]; + LLUUID agentId = LLUUID.Zero; + int amount = 0; + Hashtable quoteResponse = new Hashtable(); + XmlRpcResponse returnval = new XmlRpcResponse(); + + if (requestData.ContainsKey("agentId") && requestData.ContainsKey("currencyBuy")) + { + Helpers.TryParse((string)requestData["agentId"], out agentId); + try + { + amount = (Int32)requestData["currencyBuy"]; + } + catch (InvalidCastException) + { + + } + Hashtable currencyResponse = new Hashtable(); + currencyResponse.Add("estimatedCost", 0); + currencyResponse.Add("currencyBuy", amount); + + quoteResponse.Add("success", true); + quoteResponse.Add("currency", currencyResponse); + quoteResponse.Add("confirm", "asdfad9fj39ma9fj"); + + returnval.Value = quoteResponse; + return returnval; + } + + + + quoteResponse.Add("success", false); + quoteResponse.Add("errorMessage", "Invalid parameters passed to the quote box"); + quoteResponse.Add("errorURI", "http://www.opensimulator.org/wiki"); + returnval.Value = quoteResponse; + return returnval; + } + public XmlRpcResponse buy_func(XmlRpcRequest request) + { + + Hashtable requestData = (Hashtable)request.Params[0]; + LLUUID agentId = LLUUID.Zero; + int amount = 0; + if (requestData.ContainsKey("agentId") && requestData.ContainsKey("currencyBuy")) + { + Helpers.TryParse((string)requestData["agentId"], out agentId); + try + { + amount = (Int32)requestData["currencyBuy"]; + } + catch (InvalidCastException) + { + + } + if (agentId != LLUUID.Zero) + { + lock (m_KnownClientFunds) + { + if (m_KnownClientFunds.ContainsKey(agentId)) + { + m_KnownClientFunds[agentId] += amount; + } + else + { + m_KnownClientFunds.Add(agentId, amount); + } + } + IClientAPI client = LocateClientObject(agentId); + if (client != null) + { + SendMoneyBalance(client, agentId, client.SessionId, LLUUID.Zero); + } + } + } + XmlRpcResponse returnval = new XmlRpcResponse(); + Hashtable returnresp = new Hashtable(); + returnresp.Add("success", true); + returnval.Value = returnresp; + return returnval; + } + + public XmlRpcResponse preflightBuyLandPrep_func(XmlRpcRequest request) + { + XmlRpcResponse ret = new XmlRpcResponse(); + Hashtable retparam = new Hashtable(); + Hashtable membershiplevels = new Hashtable(); + ArrayList levels = new ArrayList(); + Hashtable level = new Hashtable(); + level.Add("id", "00000000-0000-0000-0000-000000000000"); + level.Add("description", "some level"); + levels.Add(level); + //membershiplevels.Add("levels",levels); + + Hashtable landuse = new Hashtable(); + landuse.Add("upgrade", false); + landuse.Add("action", "http://invaliddomaininvalid.com/"); + + Hashtable currency = new Hashtable(); + currency.Add("estimatedCost", 0); + + Hashtable membership = new Hashtable(); + membershiplevels.Add("upgrade", false); + membershiplevels.Add("action", "http://invaliddomaininvalid.com/"); + membershiplevels.Add("levels", membershiplevels); + + retparam.Add("success", true); + retparam.Add("currency", currency); + retparam.Add("membership", membership); + retparam.Add("landuse", landuse); + retparam.Add("confirm", "asdfajsdkfjasdkfjalsdfjasdf"); + + ret.Value = retparam; + + return ret; + + } + public XmlRpcResponse landBuy_func(XmlRpcRequest request) + { + XmlRpcResponse ret = new XmlRpcResponse(); + Hashtable retparam = new Hashtable(); + Hashtable requestData = (Hashtable)request.Params[0]; + + LLUUID agentId = LLUUID.Zero; + int amount = 0; + if (requestData.ContainsKey("agentId") && requestData.ContainsKey("currencyBuy")) + { + Helpers.TryParse((string)requestData["agentId"], out agentId); + try + { + amount = (Int32)requestData["currencyBuy"]; + } + catch (InvalidCastException) + { + + } + if (agentId != LLUUID.Zero) + { + lock (m_KnownClientFunds) + { + if (m_KnownClientFunds.ContainsKey(agentId)) + { + m_KnownClientFunds[agentId] += amount; + } + else + { + m_KnownClientFunds.Add(agentId, amount); + } + } + IClientAPI client = LocateClientObject(agentId); + if (client != null) + { + SendMoneyBalance(client, agentId, client.SessionId, LLUUID.Zero); + } + } + } + retparam.Add("success", true); + ret.Value = retparam; + + return ret; + + } +#endregion public void PostInitialise() { @@ -395,4 +1244,12 @@ namespace OpenSim.Region.Environment.Modules get { return true; } } } + public enum TransactionType : int + { + SystemGenerated=0, + RegionMoneyRequest=1, + Gift=2, + Purchase=3 + + } } diff --git a/OpenSim/Region/Environment/Modules/FriendsModule.cs b/OpenSim/Region/Environment/Modules/FriendsModule.cs index fc14df7..fad297e 100644 --- a/OpenSim/Region/Environment/Modules/FriendsModule.cs +++ b/OpenSim/Region/Environment/Modules/FriendsModule.cs @@ -190,7 +190,7 @@ namespace OpenSim.Region.Environment.Modules List updateUsers = new List(); foreach (FriendListItem fli in lfli) { - if (fli.onlinestatus = true) + if (fli.onlinestatus == true) { updateUsers.Add(fli.Friend); } diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 85a24e6..1cca2b5 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -306,7 +306,14 @@ snapshot_cache_directory = "DataSnapshot" data_services="http://metaverseink.com/cgi-bin/register.py" [Economy] -; These economy values get used in the BetaGridLikeMoneyModule +; These economy values get used in the BetaGridLikeMoneyModule. - This module is for demonstration only - +; In grid mode, use this currency XMLRPC server. Leave blank for normal functionality +CurrencyServer = "" +; "http://192.168.1.127/currency.php" + +; In grid mode, this is the land XMLRPC server. Leave blank for normal functionality +LandServer = "" +;"http://192.168.1.127/landtool.php" ; 45000 is the highest value that the sim could possibly report because of protocol constraints ObjectCapacity = 45000 -- cgit v1.1