aboutsummaryrefslogtreecommitdiff
path: root/featureClass/featureManager.js
diff options
context:
space:
mode:
Diffstat (limited to 'featureClass/featureManager.js')
-rw-r--r--featureClass/featureManager.js103
1 files changed, 99 insertions, 4 deletions
diff --git a/featureClass/featureManager.js b/featureClass/featureManager.js
index af539c4..8937043 100644
--- a/featureClass/featureManager.js
+++ b/featureClass/featureManager.js
@@ -1,8 +1,10 @@
/// <reference types="../../CTAutocomplete" />
/// <reference lib="es2015" />
+const Instant = Java.type("java.time.Instant");
import logger from "../logger";
const File = Java.type("java.io.File")
import metadata from "../metadata.js"
+import soopyV2Server from "../socketConnection";
import { registerForge as registerForgeBase, unregisterForge as unregisterForgeBase} from "./forgeEvents.js"
class FeatureManager {
@@ -32,6 +34,11 @@ class FeatureManager {
this.featureSettingsDataLastUpdated = false
+ //PERFORMANCE RECORDING
+ this.recordingPerformanceUsage = false
+ this.performanceUsage = {} //{moduleName: {event: {time: 0, count: 0}}}
+
+
this.featureMetas = {}
this.featureSettingsData = {}
@@ -77,6 +84,48 @@ class FeatureManager {
this.loadFeature(args)
}).start()
}, this)
+ this.registerCommand("soopylaginformation", (args)=>{
+ new Thread(()=>{
+ this.recordingPerformanceUsage = true
+ this.performanceUsage = {}
+ ChatLib.chat(this.messagePrefix + "Recording performance impact, this will take 10 seconds to complete!")
+
+ Thread.sleep(10000)
+
+ let totalMsGlobal = 0
+ this.recordingPerformanceUsage = false
+ ChatLib.chat(this.messagePrefix + "Performance impact:")
+ Object.keys(this.performanceUsage).sort((a, b)=>{
+ let totalMsA = 0
+ Object.keys(this.performanceUsage[a]).forEach((event)=>{
+ totalMsA += this.performanceUsage[a][event].time
+ })
+ let totalMsB = 0
+ Object.keys(this.performanceUsage[b]).forEach((event)=>{
+ totalMsB += this.performanceUsage[b][event].time
+ })
+
+ return totalMsA-totalMsB
+ }).forEach((moduleName)=>{
+ let totalMs = 0
+ let totalCalls = 0
+ Object.keys(this.performanceUsage[moduleName]).forEach((event)=>{
+ totalMs += this.performanceUsage[moduleName][event].time
+ totalCalls += this.performanceUsage[moduleName][event].count
+ })
+
+ totalMsGlobal += totalMs
+
+ ChatLib.chat("&eModule: &7" + moduleName)
+ ChatLib.chat("&eTotal: &7" + totalMs.toFixed(2) + "ms (" + totalCalls + " calls)")
+ Object.keys(this.performanceUsage[moduleName]).sort((a, b)=>{return this.performanceUsage[moduleName][a].time-this.performanceUsage[moduleName][b].time}).forEach((event)=>{
+ ChatLib.chat(" &eEvent:&7 " + event + " - " + this.performanceUsage[moduleName][event].time.toFixed(2) + "ms (" + this.performanceUsage[moduleName][event].count + " calls)")
+ })
+ })
+
+ ChatLib.chat("&eTotal: &7" + totalMsGlobal.toFixed(2) + "ms")
+ }).start()
+ }, this)
}
loadFeatureSettings(){
@@ -160,20 +209,31 @@ class FeatureManager {
if(this.events[event])
try{
for(Event of Object.values(this.events[event])){
- if(Event.context.enabled) Event.func.call(Event.context, ...args)
+ if(Event.context.enabled){
+ this.startRecordingPerformance(Event.context.constructor.name, event)
+ Event.func.call(Event.context, ...args)
+ this.stopRecordingPerformance(Event.context.constructor.name, event)
+ }
}
}catch(e){
logger.logMessage("Error in " + event + " event: " + JSON.stringify(e, undefined, 2), 2)
+
+ soopyV2Server.reportError(e, "Error in " + event + " event.")
}
}
triggerSoopy(event, args){
if(this.soopyEventHandlers[event])
try{
for(Event of Object.values(this.soopyEventHandlers[event])){
- if(Event.context.enabled) Event.func.call(Event.context, ...args)
+ if(Event.context.enabled){
+ this.startRecordingPerformance(Event.context.constructor.name, event)
+ Event.func.call(Event.context, ...args)
+ this.stopRecordingPerformance(Event.context.constructor.name, event)
+ }
}
}catch(e){
logger.logMessage("Error in soopy " + event + " event: " + JSON.stringify(e, undefined, 2), 2)
+ soopyV2Server.reportError(e, "Error in soopy " + event + " event.")
}
}
@@ -258,9 +318,15 @@ class FeatureManager {
context: context,
trigger: register(type, (...args)=>{
try{
- if(context.enabled) func.call(context, ...(args || []))
+ if(context.enabled){
+ this.startRecordingPerformance(context.constructor.name, type)
+ func.call(context, ...(args || []))
+ this.stopRecordingPerformance(context.constructor.name, type)
+ }
}catch(e){
logger.logMessage("Error in " + type + " event: " + JSON.stringify(e, undefined, 2), 2)
+
+ soopyV2Server.reportError(e, "Error in " + type + " event.")
}
}),
id: id
@@ -277,9 +343,15 @@ class FeatureManager {
context: context,
trigger: registerForgeBase(event, (...args)=>{
try{
- if(context.enabled) func.call(context, ...args)
+ if(context.enabled){
+ this.startRecordingPerformance(context.constructor.name, event.class.name)
+ func.call(context, ...(args || []))
+ this.stopRecordingPerformance(context.constructor.name, event.class.name)
+ }
}catch(e){
logger.logMessage("Error in " + event.class.toString() + " (forge) event: " + JSON.stringify(e, undefined, 2), 2)
+
+ soopyV2Server.reportError(e, "Error in " + event.class.toString() + " (forge) event.")
}
}),
id: id
@@ -358,6 +430,8 @@ class FeatureManager {
logger.logMessage("Error loading feature " + feature, 1)
console.log(JSON.stringify(e, undefined, 2))
ChatLib.chat(this.messagePrefix + "Error loading feature " + feature)
+
+ soopyV2Server.reportError(e, "Error loading feature " + feature)
}
return this
@@ -398,6 +472,27 @@ class FeatureManager {
}
}
}
+
+ startRecordingPerformance(feature, event){
+ if(!this.recordingPerformanceUsage) return
+
+ if(!this.performanceUsage[feature]) this.performanceUsage[feature] = {}
+ if(!this.performanceUsage[feature][event]) this.performanceUsage[feature][event] = {time: 0,count: 0}
+
+ let instant = Instant.now()
+ let time = (instant.getEpochSecond() + (instant.getNano() / 1000000000))*1000;
+
+ this.performanceUsage[feature][event].startTime = time
+ }
+ stopRecordingPerformance(feature, event){
+ if(!this.recordingPerformanceUsage) return
+
+ let instant = Instant.now()
+ let time = (instant.getEpochSecond() + (instant.getNano() / 1000000000))*1000;
+
+ this.performanceUsage[feature][event].time += time - this.performanceUsage[feature][event].startTime
+ this.performanceUsage[feature][event].count++
+ }
}
const featureManager = new FeatureManager();