package thread.heartbeat; import gui.forms.GUIMain; import gui.forms.GUIViewerList; import lib.JSON.JSONArray; import lib.JSON.JSONObject; import lib.pircbot.ChannelManager; import lib.pircbot.User; import util.Timer; import util.Utils; import util.settings.Settings; import javax.swing.tree.TreePath; import java.awt.*; import java.net.URL; import java.util.Enumeration; import java.util.HashSet; /** * Created by Nick on 8/9/2014. * <p> * Handles assigning the userlist for a channel. */ public class UserManager implements HeartbeatThread { public static Timer toUpdate; private HashSet<String> collectedUsers; private static boolean beating; public UserManager() { toUpdate = new Timer(4000); collectedUsers = new HashSet<>(); beating = false; } @Override public boolean shouldBeat() { return !beating && Settings.channelManager != null && !toUpdate.isRunning(); } @Override public void beat() { beating = true; String[] channels = Settings.channelManager.getChannelNames(); URL url; for (String chan : channels) { String chanOut = chan.substring(1); GUIViewerList list = GUIMain.viewerLists.get(chanOut); if (list != null) { try { url = new URL("http://tmi.twitch.tv/group/user/" + chan.substring(1) + "/chatters"); String line = Utils.createAndParseBufferedReader(url.openStream()); if (!line.isEmpty()) { final Enumeration<TreePath> beforePaths = list.beforePaths(); final int beforeScroll = list.beforeScroll(); JSONObject site = new JSONObject(line); JSONObject chatters = site.getJSONObject("chatters"); JSONArray mods = chatters.getJSONArray("moderators"); readAndUpdate(mods, list, GUIViewerList.ViewerType.MOD); JSONArray staff = chatters.getJSONArray("staff"); readAndUpdate(staff, list, GUIViewerList.ViewerType.STAFF); JSONArray admins = chatters.getJSONArray("admins"); readAndUpdate(admins, list, GUIViewerList.ViewerType.ADMIN); JSONArray global_mods = chatters.getJSONArray("global_mods"); readAndUpdate(global_mods, list, GUIViewerList.ViewerType.GLOBAL_MOD); JSONArray viewers = chatters.getJSONArray("viewers"); readAndUpdate(viewers, list, GUIViewerList.ViewerType.VIEWER); EventQueue.invokeLater(() -> list.updateRoot(beforePaths, beforeScroll)); Thread.sleep(2000); } } catch (Exception e) { GUIMain.log(e); } } } } private void readAndUpdate(JSONArray toRead, GUIViewerList list, GUIViewerList.ViewerType type) { for (int i = 0; i < toRead.length(); i++) { User u = new User(toRead.getString(i)); switch (type) { case GLOBAL_MOD: u.setGlobalMod(true); break; case ADMIN: u.setAdmin(true); break; case STAFF: u.setStaff(true); break; default: break; } addUser(u); collectedUsers.add(toRead.getString(i)); } list.updateCategory(type, collectedUsers); collectedUsers.clear(); } private void addUser(User u) { if (getChannelManager().getUser(u.getNick(), false) == null) getChannelManager().addUser(u); } private ChannelManager getChannelManager() { return Settings.channelManager; } @Override public void afterBeat() { toUpdate.reset(); beating = false; } }