ScriptManager.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package me.hammerle.snuviscript.code;
  2. import me.hammerle.snuviscript.inputprovider.InputProvider;
  3. import java.util.Collection;
  4. import java.util.Collections;
  5. import java.util.Set;
  6. import java.util.concurrent.ConcurrentHashMap;
  7. import java.util.function.Consumer;
  8. import me.hammerle.snuviscript.exceptions.PreScriptException;
  9. import me.hammerle.snuviscript.exceptions.StackTrace;
  10. public class ScriptManager {
  11. private final ISnuviLogger logger;
  12. private final ISnuviScheduler scheduler;
  13. private final ConcurrentHashMap<Integer, Script> scripts = new ConcurrentHashMap<>();
  14. private final ConcurrentHashMap<String, Set<Script>> loadedEvents = new ConcurrentHashMap<>();
  15. public ScriptManager(ISnuviLogger logger, ISnuviScheduler scheduler) {
  16. this.logger = logger;
  17. this.scheduler = scheduler;
  18. }
  19. public ISnuviLogger getLogger() {
  20. return logger;
  21. }
  22. public ISnuviScheduler getScheduler() {
  23. return scheduler;
  24. }
  25. // -------------------------------------------------------------------------
  26. // function registry
  27. // -------------------------------------------------------------------------
  28. public void registerFunction(String s, ExceptionBiFunction<Script, InputProvider[], Object> f) {
  29. FunctionRegistry.registerFunction(s, f);
  30. }
  31. public void registerConsumer(String s, ExceptionBiConsumer<Script, InputProvider[]> f) {
  32. FunctionRegistry.registerConsumer(s, f);
  33. }
  34. public void registerAlias(String original, String alias) {
  35. FunctionRegistry.registerAlias(original, alias);
  36. }
  37. // -------------------------------------------------------------------------
  38. // script controller
  39. // -------------------------------------------------------------------------
  40. public Script getScript(int id) {
  41. return scripts.get(id);
  42. }
  43. public void removeScript(Script sc) {
  44. sc.term();
  45. sc.onTerm();
  46. scripts.remove(sc.getId());
  47. loadedEvents.values().forEach(list -> list.remove(sc));
  48. }
  49. private void addScript(Script sc) {
  50. scripts.put(sc.getId(), sc);
  51. sc.onStart();
  52. sc.run();
  53. if(sc.shouldTerm()) {
  54. removeScript(sc);
  55. }
  56. }
  57. public void removeScripts() {
  58. scripts.values().forEach(sc -> {
  59. sc.term();
  60. sc.onTerm();
  61. });
  62. scripts.clear();
  63. loadedEvents.values().forEach(list -> list.clear());
  64. }
  65. public Collection<Script> getScripts() {
  66. return scripts.values();
  67. }
  68. public Script startScript(boolean rEventBroadcast, Consumer<Script> onStart, Consumer<Script> onTerm, String name, String... paths) {
  69. if(paths.length == 0) {
  70. return null;
  71. }
  72. try {
  73. Script sc = new Script(this, onStart, onTerm, name, paths);
  74. sc.setEventBroadcast(rEventBroadcast);
  75. addScript(sc);
  76. return sc;
  77. } catch(PreScriptException ex) {
  78. logger.print(null, ex, null, paths[0], null, new StackTrace(ex.getLine()));
  79. return null;
  80. }
  81. }
  82. public Script startScript(boolean rEventBroadcast, String name, String... paths) {
  83. return startScript(rEventBroadcast, null, null, name, paths);
  84. }
  85. public void loadEvent(String event, Script sc) {
  86. Set<Script> set = loadedEvents.get(event);
  87. if(set == null) {
  88. set = Collections.newSetFromMap(new ConcurrentHashMap<>());
  89. loadedEvents.put(event, set);
  90. }
  91. set.add(sc);
  92. }
  93. public void unloadEvent(String event, Script sc) {
  94. Set<Script> set = loadedEvents.get(event);
  95. if(set != null) {
  96. set.remove(sc);
  97. }
  98. }
  99. public void callEvent(String name, Consumer<Script> before, Consumer<Script> after) {
  100. Set<Script> set = loadedEvents.get(name);
  101. if(set == null) {
  102. return;
  103. }
  104. try {
  105. set.stream()
  106. .filter(sc -> sc.shouldReceiveEventBroadcast() && !sc.isHolded() && sc.isWaiting())
  107. .forEach(sc -> runEvent(name, sc, before, after));
  108. } catch(Exception ex) {
  109. ex.printStackTrace();
  110. }
  111. }
  112. public boolean callEvent(String name, Script sc, Consumer<Script> before, Consumer<Script> after) {
  113. if(sc.isEventLoaded(name) && !sc.isHolded() && sc.isWaiting()) {
  114. runEvent(name, sc, before, after);
  115. return true;
  116. }
  117. return false;
  118. }
  119. private void runEvent(String name, Script sc, Consumer<Script> before, Consumer<Script> after) {
  120. sc.setVar("event", name);
  121. if(before != null) {
  122. before.accept(sc);
  123. }
  124. sc.run();
  125. if(after != null) {
  126. after.accept(sc);
  127. }
  128. if(sc.shouldTerm()) {
  129. removeScript(sc);
  130. }
  131. }
  132. }