Removed multiple connections (broken) support (p1/2).

keep-around/c2ad1056d9638eb2b3dbb39f2be4e03c2244b492
Pingex aka Raphaël 9 years ago
parent 53597f4b7f
commit dc67379a1f

@ -23,7 +23,7 @@ public class CoreEventsHandler
public static void onReady(ReadyEvent event) public static void onReady(ReadyEvent event)
{ {
LOGGER.info("Connection with user #{} ready.", event.getClient().getOurUser().getID()); LOGGER.info("Connection with user #{} ready.", event.getClient().getOurUser().getID());
EventManager.getInstance().updateConnectionHandlers(event.getClient()); EventManager.getInstance().updateConnectionHandlers();
} }
@EventSubscriber @EventSubscriber

@ -17,14 +17,14 @@ import java.util.Set;
public class GatewayConnectionsManager public class GatewayConnectionsManager
{ {
/** /**
* Main datastore * Main connection
*/ */
private static Set<IDiscordClient> connectionsDatastore = new HashSet<>(); private static IDiscordClient connection;
/** /**
* List of registered listeners for each connection, as we can't access registered listeners in IDC dispatcher. * List of registered listeners as we cannot access registered listeners in IDC dispatcher.
*/ */
private static Map<IDiscordClient, Set<Object>> registeredListeners = new HashMap<>(); private static Set<Object> registeredListeners = new HashSet<>();
/** /**
* Logger * Logger
@ -32,17 +32,16 @@ public class GatewayConnectionsManager
private static final Logger LOGGER = LogManager.getLogger(GatewayConnectionsManager.class); private static final Logger LOGGER = LogManager.getLogger(GatewayConnectionsManager.class);
/** /**
* Registers a connection and login automatically * Registers a connection and login automatically, called once in main
* @param builder Filled and builder ready for log in * @param builder Builder filled and ready to login
*/ */
public static void registerConnection(ClientBuilder builder) public static void registerConnection(ClientBuilder builder)
{ {
LOGGER.info("Registering new connection"); LOGGER.info("Registering new connection");
try try
{ {
IDiscordClient builtConnection = builder.login(); connection = builder.login();
connectionsDatastore.add(builtConnection); connection.getDispatcher().registerListener(CoreEventsHandler.class); // Register the DCF core events handler needed for core operations and logging.
builtConnection.getDispatcher().registerListener(CoreEventsHandler.class); // Register the core event handler independently from the events package
} }
catch (DiscordException e) catch (DiscordException e)
{ {
@ -50,76 +49,45 @@ public class GatewayConnectionsManager
} }
} }
/**
* Logout and unregister specified connection
* @param client Target connection
*/
public static void unregisterConnection(IDiscordClient client)
{
LOGGER.info("Unregistering connection with user #" + client.getOurUser().getID());
DiscordInteractionsUtil.disconnect(client);
connectionsDatastore.remove(client);
registeredListeners.remove(client);
}
/** /**
* Update listeners for target connection * Update listeners for target connection
* @param target Target conection, must be registered
* @param refListeners Reference listeners list * @param refListeners Reference listeners list
*/ */
public static void updateListeners(IDiscordClient target, Set<Class<?>> refListeners) public static void updateListeners(Set<Class<?>> refListeners)
{ {
LOGGER.debug("Updating listeners for target " + target.getOurUser().getID()); LOGGER.debug("Updating connection listeners.");
if(!connectionsDatastore.contains(target)) return;
if(!registeredListeners.containsKey(target)) registeredListeners.put(target, new HashSet<>());
Set<Object> currentListeners = registeredListeners.get(target);
// Case 1: item is not registered in IDC // Case 1: item is not registered in IDC
long toRegister = refListeners.stream().filter(item -> !currentListeners.contains(item)).count(); long toRegister = refListeners.stream().filter(item -> !registeredListeners.contains(item)).count();
refListeners.stream().filter(item -> !currentListeners.contains(item)).forEach(item -> refListeners.stream().filter(item -> !registeredListeners.contains(item)).forEach(item ->
{ {
target.getDispatcher().registerListener(item); connection.getDispatcher().registerListener(item);
currentListeners.add(item); registeredListeners.add(item);
}); });
// Case 2: item is registered, but shouldn't be // Case 2: item is registered, but shouldn't be
long toUnregister = currentListeners.stream().filter(item -> !refListeners.contains(item)).count(); long toUnregister = registeredListeners.stream().filter(item -> !refListeners.contains(item)).count();
currentListeners.stream().filter(item -> !refListeners.contains(item)).forEach(item -> registeredListeners.stream().filter(item -> !refListeners.contains(item)).forEach(item ->
{ {
target.getDispatcher().unregisterListener(item); connection.getDispatcher().unregisterListener(item);
currentListeners.remove(item); registeredListeners.remove(item);
}); });
LOGGER.debug("Registered " + toRegister + " listeners and unregistered " + toUnregister + " listeners."); LOGGER.debug("Update done. diff: +{} -{}", toRegister, toUnregister);
}
/**
* Update all connections listeners
* @param refListeners Reference listeners list
*/
public static void updateAllListeners(Set<Class<?>> refListeners)
{
for(IDiscordClient i : connectionsDatastore) updateListeners(i, refListeners);
} }
/** /**
* Reconnect a disconnected gateway connection * Reconnect a disconnected gateway connection
* @param target Disconnected connection
*/ */
public static void reconnect(IDiscordClient target) public static void reconnect()
{ {
if(!connectionsDatastore.contains(target)) return;
try try
{ {
target.login(); connection.login();
} }
catch (DiscordException e) catch (DiscordException e)
{ {
LOGGER.warn("User #" + target.getOurUser().getID() + " failed to reconnect to the gateway.", e); LOGGER.warn("User #" + connection.getOurUser().getID() + " failed to reconnect to the gateway.", e);
} }
} }
} }

@ -57,7 +57,7 @@ public class EventManager
{ {
LOGGER.debug("Registering event handlers for plugin {}.", plugin.getId()); LOGGER.debug("Registering event handlers for plugin {}.", plugin.getId());
handlers.add(plugin); handlers.add(plugin);
updateConnectionsHandlers(); // Trigger update updateConnectionHandlers(); // Trigger update
} }
else LOGGER.trace("Plugin {} has no event handlers.", plugin.getId()); else LOGGER.trace("Plugin {} has no event handlers.", plugin.getId());
} }
@ -72,7 +72,7 @@ public class EventManager
{ {
LOGGER.debug("Unregistering event handlers for plugin {}.", plugin.getId()); LOGGER.debug("Unregistering event handlers for plugin {}.", plugin.getId());
handlers.remove(plugin); handlers.remove(plugin);
updateConnectionsHandlers(); // Trigger update updateConnectionHandlers(); // Trigger update
} }
} }
@ -90,16 +90,8 @@ public class EventManager
/** /**
* Delegated method * Delegated method
*/ */
public void updateConnectionsHandlers() public void updateConnectionHandlers()
{ {
GatewayConnectionsManager.updateAllListeners(collectAllHandlers()); GatewayConnectionsManager.updateListeners(collectAllHandlers());
}
/**
* Delegated method
*/
public void updateConnectionHandlers(IDiscordClient target)
{
GatewayConnectionsManager.updateListeners(target, collectAllHandlers());
} }
} }