/// <summary> /// Only called by the MainLoop. Takes the message from a user sent to the channel and executes the proper command. /// </summary> public void SimChat(CMModel model, CMView view, OSChatMessage e, int channel) { if (e.Channel != channel) { return; } if (e.Sender == null) { return; } m_log.Debug("[CONTENT MANAGEMENT] Message received: " + e.Message); IClientAPI client = e.Sender; Scene scene = (Scene)e.Scene; string message = e.Message; string[] args = e.Message.Split(new char[] { ' ' }); ScenePresence avatar = scene.GetScenePresence(client.AgentId); if (!(m_estateModule.IsManager(avatar.UUID))) { m_log.Debug("[CONTENT MANAGEMENT] Message sent from non Estate Manager ... ignoring."); view.SendSimChatMessage(scene, "You must be an estate manager to perform that action."); return; } switch (args[0]) { case "ci": case "commit": commit(message, scene, model, view); break; case "dm": case "diff-mode": diffmode(scene, model, view); break; case "rb": case "rollback": rollback(scene, model, view); break; case "help": m_view.DisplayHelpMenu(scene); break; default: view.SendSimChatMessage(scene, "Command not found: " + args[0]); break; } }
/// <summary> /// Only called from within the SimChat method. /// </summary> protected void commit(string message, Scene scene, CMModel model, CMView view) { System.Collections.Generic.List <Scene> proximitySceneList = ScenesInOrderOfProximity(m_sceneList, scene); string[] args = message.Split(new char[] { ' ' }); char[] logMessage = { ' ' }; if (args.Length > 1) { logMessage = new char[message.Length - (args[0].Length)]; message.CopyTo(args[0].Length, logMessage, 0, message.Length - (args[0].Length)); } m_log.Debug("[CONTENT MANAGEMENT] Saving terrain and objects of region."); foreach (Scene currScene in proximitySceneList) { model.CommitRegion(currScene, new String(logMessage)); view.SendSimChatMessage(scene, "Region Saved Successfully: " + currScene.RegionInfo.RegionName); } view.SendSimChatMessage(scene, "Successfully saved all regions."); m_state |= State.DIRTY; if ((m_state & State.SHOWING_CHANGES) > 0) //DISPLAY NEW CHANGES INSTEAD OF OLD CHANGES { view.SendSimChatMessage(scene, "Updating differences between new revision and current environment."); //Hide objects from users and Forget about them view.HideAllMetaEntities(); view.HideAllAuras(); model.DeleteAllMetaObjects(); //Recreate them from backend files foreach (Scene currScene in proximitySceneList) { model.UpdateCMEntities(currScene); view.SendSimChatMessage(scene, "Finished updating differences between current scene and last revision: " + currScene.RegionInfo.RegionName); } //Display new objects to users1 view.DisplayRecentChanges(); view.SendSimChatMessage(scene, "Finished updating for DIFF-MODE."); m_state &= ~(State.DIRTY); m_state |= State.SHOWING_CHANGES; } }
/// <summary> /// Only called from within the SimChat method. /// </summary> protected void diffmode(Scene scene, CMModel model, CMView view) { System.Collections.Generic.List <Scene> proximitySceneList = ScenesInOrderOfProximity(m_sceneList, scene); if ((m_state & State.SHOWING_CHANGES) > 0) // TURN OFF { view.SendSimChatMessage(scene, "Hiding all meta objects."); view.HideAllMetaEntities(); view.HideAllAuras(); view.SendSimChatMessage(scene, "Diff-mode = OFF"); m_state &= ~State.SHOWING_CHANGES; return; } else // TURN ON { if ((m_state & State.DIRTY) != 0 || m_state == State.NONE) { view.SendSimChatMessage(scene, "Hiding meta objects and replacing with latest revision"); //Hide objects from users and Forget about them view.HideAllMetaEntities(); view.HideAllAuras(); model.DeleteAllMetaObjects(); //Recreate them from backend files foreach (Object currScene in m_sceneList.Values) { model.UpdateCMEntities((Scene)currScene); } } else if ((m_state & State.DIRTY) != 0) { view.SendSimChatMessage(scene, "Forming list of meta entities with latest revision"); foreach (Scene currScene in proximitySceneList) { model.UpdateCMEntities(currScene); } } view.SendSimChatMessage(scene, "Displaying differences between last revision and current environment"); foreach (Scene currScene in proximitySceneList) { model.CheckForNewEntitiesMissingAuras(currScene); } view.DisplayRecentChanges(); view.SendSimChatMessage(scene, "Diff-mode = ON"); m_state |= State.SHOWING_CHANGES; m_state &= ~State.DIRTY; } }
/// <summary> /// Only called by the MainLoop. Takes the message from a user sent to the channel and executes the proper command. /// </summary> public void SimChat(CMModel model, CMView view, OSChatMessage e, int channel) { if (e.Channel != channel) return; if (e.Sender == null) return; m_log.Debug("[CONTENT MANAGEMENT] Message received: " + e.Message); IClientAPI client = e.Sender; Scene scene = (Scene) e.Scene; string message = e.Message; string[] args = e.Message.Split(new char[] {' '}); ScenePresence avatar = scene.GetScenePresence(client.AgentId); if (!(m_estateModule.IsManager(avatar.UUID))) { m_log.Debug("[CONTENT MANAGEMENT] Message sent from non Estate Manager ... ignoring."); view.SendSimChatMessage(scene, "You must be an estate manager to perform that action."); return; } switch (args[0]) { case "ci": case "commit": commit(message, scene, model, view); break; case "dm": case "diff-mode": diffmode(scene, model, view); break; case "rb": case "rollback": rollback(scene, model, view); break; case "help": m_view.DisplayHelpMenu(scene); break; default: view.SendSimChatMessage(scene, "Command not found: " + args[0]); break; } }
/// <summary> /// Only called from within the SimChat method. /// </summary> protected void diffmode(Scene scene, CMModel model, CMView view) { System.Collections.Generic.List<Scene> proximitySceneList = ScenesInOrderOfProximity(m_sceneList, scene); if ((m_state & State.SHOWING_CHANGES) > 0) // TURN OFF { view.SendSimChatMessage(scene, "Hiding all meta objects."); view.HideAllMetaEntities(); view.HideAllAuras(); view.SendSimChatMessage(scene, "Diff-mode = OFF"); m_state &= ~State.SHOWING_CHANGES; return; } else // TURN ON { if ((m_state & State.DIRTY) != 0 || m_state == State.NONE) { view.SendSimChatMessage(scene, "Hiding meta objects and replacing with latest revision"); //Hide objects from users and Forget about them view.HideAllMetaEntities(); view.HideAllAuras(); model.DeleteAllMetaObjects(); //Recreate them from backend files foreach (Object currScene in m_sceneList.Values) model.UpdateCMEntities((Scene) currScene); } else if ((m_state & State.DIRTY) != 0) { view.SendSimChatMessage(scene, "Forming list of meta entities with latest revision"); foreach (Scene currScene in proximitySceneList) model.UpdateCMEntities(currScene); } view.SendSimChatMessage(scene, "Displaying differences between last revision and current environment"); foreach (Scene currScene in proximitySceneList) model.CheckForNewEntitiesMissingAuras(currScene); view.DisplayRecentChanges(); view.SendSimChatMessage(scene, "Diff-mode = ON"); m_state |= State.SHOWING_CHANGES; m_state &= ~State.DIRTY; } }
/// <summary> /// Only called from within the SimChat method. /// </summary> protected void commit(string message, Scene scene, CMModel model, CMView view) { System.Collections.Generic.List<Scene> proximitySceneList = ScenesInOrderOfProximity(m_sceneList, scene); string[] args = message.Split(new char[] {' '}); char[] logMessage = {' '}; if (args.Length > 1) { logMessage = new char[message.Length - (args[0].Length)]; message.CopyTo(args[0].Length, logMessage, 0, message.Length - (args[0].Length)); } m_log.Debug("[CONTENT MANAGEMENT] Saving terrain and objects of region."); foreach (Scene currScene in proximitySceneList) { model.CommitRegion(currScene, new String(logMessage)); view.SendSimChatMessage(scene, "Region Saved Successfully: " + currScene.RegionInfo.RegionName); } view.SendSimChatMessage(scene, "Successfully saved all regions."); m_state |= State.DIRTY; if ((m_state & State.SHOWING_CHANGES) > 0) //DISPLAY NEW CHANGES INSTEAD OF OLD CHANGES { view.SendSimChatMessage(scene, "Updating differences between new revision and current environment."); //Hide objects from users and Forget about them view.HideAllMetaEntities(); view.HideAllAuras(); model.DeleteAllMetaObjects(); //Recreate them from backend files foreach (Scene currScene in proximitySceneList) { model.UpdateCMEntities(currScene); view.SendSimChatMessage(scene, "Finished updating differences between current scene and last revision: " + currScene.RegionInfo.RegionName); } //Display new objects to users1 view.DisplayRecentChanges(); view.SendSimChatMessage(scene, "Finished updating for DIFF-MODE."); m_state &= ~(State.DIRTY); m_state |= State.SHOWING_CHANGES; } }