/onlineguru/src/main/java/no/ntnu/online/onlineguru/OnlineGuru.java

https://github.com/dotKom/OnlineGuru · Java · 183 lines · 142 code · 36 blank · 5 comment · 11 complexity · 94edf5c419aa4aaab7eb186ac613cc32 MD5 · raw file

  1. package no.ntnu.online.onlineguru;
  2. import com.google.inject.Guice;
  3. import com.google.inject.Injector;
  4. import no.fictive.irclib.event.container.Event;
  5. import no.fictive.irclib.event.container.command.JoinEvent;
  6. import no.fictive.irclib.model.listener.IRCEventListener;
  7. import no.fictive.irclib.model.network.Network;
  8. import no.ntnu.online.onlineguru.exceptions.MissingSettingsException;
  9. import no.ntnu.online.onlineguru.plugin.control.EventDistributor;
  10. import no.ntnu.online.onlineguru.plugin.control.PluginManager;
  11. import no.ntnu.online.onlineguru.service.OnlineGuruServices;
  12. import org.apache.log4j.Logger;
  13. import java.util.*;
  14. import java.util.concurrent.ConcurrentHashMap;
  15. public class OnlineGuru implements IRCEventListener, Runnable {
  16. private static Logger logger = Logger.getLogger(OnlineGuru.class);
  17. public static Injector serviceLocator;
  18. private Queue<Event> eventQueue = new LinkedList<Event>();
  19. private ConcurrentHashMap<String, Network> networks = new ConcurrentHashMap<String, Network>();
  20. private Map<Network, ArrayList<String>> channelsOnConnect = new HashMap<Network, ArrayList<String>>();
  21. private EventDistributor eventDistributor;
  22. private Thread thread = null;
  23. List<ConnectionInformation> information;
  24. public OnlineGuru() {
  25. verifySettings();
  26. addShutdownHook();
  27. configureServiceLocator();
  28. eventDistributor = new EventDistributor();
  29. initiate();
  30. new PluginManager(eventDistributor, this);
  31. thread = new Thread(this);
  32. thread.setName("OnlineGuru");
  33. thread.start();
  34. }
  35. public void run() {
  36. //Keep the program rolling.
  37. while (true) {
  38. try {
  39. Thread.sleep(1);
  40. Event event = eventQueue.poll();
  41. if (event != null) {
  42. processEvent(event);
  43. }
  44. } catch (InterruptedException ie) {
  45. break;
  46. }
  47. }
  48. logger.info("[OnlineGuru] Stopped");
  49. }
  50. /**
  51. * Java version 1.2.3 or newer is required for this.
  52. */
  53. private void addShutdownHook() {
  54. try {
  55. Runtime.getRuntime().addShutdownHook(new ShutdownThread(this));
  56. logger.info("[Main thread] Shutdown hook added");
  57. } catch (Throwable t) {
  58. logger.warn("[Main thread] Could not add Shutdown hook. Update your Java version.");
  59. }
  60. }
  61. private void verifySettings() {
  62. information = VerifySettings.readSettings();
  63. }
  64. private void configureServiceLocator() {
  65. serviceLocator = Guice.createInjector(new OnlineGuruServices());
  66. }
  67. protected void stopThread() {
  68. rudeDisconnect();
  69. thread.interrupt();
  70. }
  71. protected void rudeDisconnect() {
  72. Enumeration<Network> networkEnumeration = getNetworks();
  73. while (networkEnumeration.hasMoreElements()) {
  74. Network network = networkEnumeration.nextElement();
  75. network.getProfile().setQuitMessage("Oops, someone killed my running process... ;-(");
  76. network.disconnect();
  77. }
  78. }
  79. private void initiate() {
  80. for (ConnectionInformation c : information) {
  81. Network network = new Network(c.getHostname(), Integer.parseInt(c.getPort()), c.getBindAddress(), c.getServeralias(), c.getProfile());
  82. network.addListener(this);
  83. channelsOnConnect.put(network, c.getChannels());
  84. network.connect();
  85. networks.put(c.getServeralias(), network);
  86. }
  87. }
  88. public void receiveEvent(Event event) {
  89. logger.info(String.format("<- %s: %s", event.getNetwork().getServerAlias(), event.getRawData()));
  90. eventQueue.offer(event);
  91. }
  92. private void processEvent(Event event) {
  93. switch (event.getEventType()) {
  94. case JOIN:
  95. handleJoin(event);
  96. break;
  97. case CONNECT:
  98. handleConnect(event);
  99. break;
  100. }
  101. eventDistributor.handleEvent(event);
  102. }
  103. private void handleJoin(Event event) {
  104. JoinEvent joinEvent = (JoinEvent) event;
  105. Network network = joinEvent.getNetwork();
  106. if (network.getProfile().equals(joinEvent.getNick())) {
  107. if (!network.getNetworkSettings().isNAMESX() && network.getNetworkSettings().isWHOX()) {
  108. sendWhoX(joinEvent.getChannel(), network);
  109. }
  110. else {
  111. sendWho(joinEvent.getChannel(), network);
  112. }
  113. }
  114. }
  115. private void handleConnect(Event event) {
  116. Network network = event.getNetwork();
  117. List<String> channels = channelsOnConnect.get(network);
  118. for (String channel : channels) {
  119. sendToServer(network, "JOIN " + channel);
  120. }
  121. }
  122. private void sendWho(String channelname, Network network) {
  123. sendToServer(network, "WHO " + channelname);
  124. }
  125. private void sendWhoX(String channelname, Network network) {
  126. sendToServer(network, "WHOX " + channelname);
  127. }
  128. public void sendMessageToServer(Network network, String message) {
  129. sendToServer(network, message);
  130. }
  131. private void sendToServer(Network network, String text) {
  132. logger.info(String.format("-> %s: %s", network.getServerAlias(), text));
  133. network.sendToServer(text);
  134. }
  135. public void receiveText(Network network, String text) {
  136. // System.out.println(network.getServerAlias() + ": " + text);
  137. }
  138. public Network getNetworkByAlias(String networkAlias) {
  139. return networks.get(networkAlias);
  140. }
  141. public Enumeration<Network> getNetworks() {
  142. return networks.elements();
  143. }
  144. public static void main(String[] args) {
  145. new OnlineGuru();
  146. }
  147. }