ScriptManager.java 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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. public void registerFunction(String s, ExceptionBiFunction<Script, InputProvider[], Object> f) {
  26. FunctionRegistry.registerFunction(s, f);
  27. }
  28. public void registerConsumer(String s, ExceptionBiConsumer<Script, InputProvider[]> f) {
  29. FunctionRegistry.registerConsumer(s, f);
  30. }
  31. public void registerAlias(String original, String alias) {
  32. FunctionRegistry.registerAlias(original, alias);
  33. }
  34. public Script getScript(int id) {
  35. return scripts.get(id);
  36. }
  37. public void removeScript(Script sc) {
  38. sc.term();
  39. sc.onTerm();
  40. scripts.remove(sc.getId());
  41. loadedEvents.values().forEach(list -> list.remove(sc));
  42. }
  43. private void addScript(Script sc) {
  44. scripts.put(sc.getId(), sc);
  45. sc.run();
  46. if(sc.shouldTerm()) {
  47. removeScript(sc);
  48. }
  49. }
  50. public void removeScripts() {
  51. scripts.values().forEach(sc -> {
  52. sc.term();
  53. sc.onTerm();
  54. });
  55. scripts.clear();
  56. loadedEvents.values().forEach(list -> list.clear());
  57. }
  58. public Collection<Script> getScripts() {
  59. return scripts.values();
  60. }
  61. public Script startScript(Consumer<Script> onTerm, String name, String... paths) {
  62. if(paths.length == 0) {
  63. return null;
  64. }
  65. try {
  66. Script sc = new Script(this, onTerm, name, paths);
  67. addScript(sc);
  68. return sc;
  69. } catch(PreScriptException ex) {
  70. logger.print(null, ex, null, paths[0], null, new StackTrace(ex.getLine()));
  71. return null;
  72. }
  73. }
  74. public Script startScript(String name, String... paths) {
  75. return startScript(sc -> {
  76. }, name, paths);
  77. }
  78. public void loadEvent(String event, Script sc) {
  79. Set<Script> set = loadedEvents.get(event);
  80. if(set == null) {
  81. set = Collections.newSetFromMap(new ConcurrentHashMap<>());
  82. loadedEvents.put(event, set);
  83. }
  84. set.add(sc);
  85. }
  86. public void unloadEvent(String event, Script sc) {
  87. Set<Script> set = loadedEvents.get(event);
  88. if(set != null) {
  89. set.remove(sc);
  90. }
  91. }
  92. public void callEvent(String name, Consumer<Script> before, Consumer<Script> after) {
  93. Set<Script> set = loadedEvents.get(name);
  94. if(set == null) {
  95. return;
  96. }
  97. try {
  98. set.stream().filter(sc -> !sc.isHolded() && sc.isWaiting())
  99. .forEach(sc -> runEvent(name, sc, before, after));
  100. } catch(Exception ex) {
  101. ex.printStackTrace();
  102. }
  103. }
  104. public boolean callEvent(String name, Script sc, Consumer<Script> before,
  105. Consumer<Script> after) {
  106. if(sc.isEventLoaded(name) && !sc.isHolded() && sc.isWaiting()) {
  107. runEvent(name, sc, before, after);
  108. return true;
  109. }
  110. return false;
  111. }
  112. private void runEvent(String name, Script sc, Consumer<Script> before, Consumer<Script> after) {
  113. sc.setVar("event", name);
  114. before.accept(sc);
  115. sc.run();
  116. after.accept(sc);
  117. if(sc.shouldTerm()) {
  118. removeScript(sc);
  119. }
  120. }
  121. }