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)
{
LOGGER.info("Connection with user #{} ready.", event.getClient().getOurUser().getID());
EventManager.getInstance().updateConnectionHandlers(event.getClient());
EventManager.getInstance().updateConnectionHandlers();
}
@EventSubscriber

@ -17,14 +17,14 @@ import java.util.Set;
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
@ -32,17 +32,16 @@ public class GatewayConnectionsManager
private static final Logger LOGGER = LogManager.getLogger(GatewayConnectionsManager.class);
/**
* Registers a connection and login automatically
* @param builder Filled and builder ready for log in
* Registers a connection and login automatically, called once in main
* @param builder Builder filled and ready to login
*/
public static void registerConnection(ClientBuilder builder)
{
LOGGER.info("Registering new connection");
try
{
IDiscordClient builtConnection = builder.login();
connectionsDatastore.add(builtConnection);
builtConnection.getDispatcher().registerListener(CoreEventsHandler.class); // Register the core event handler independently from the events package
connection = builder.login();
connection.getDispatcher().registerListener(CoreEventsHandler.class); // Register the DCF core events handler needed for core operations and logging.
}
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
* @param target Target conection, must be registered
* @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());
if(!connectionsDatastore.contains(target)) return;
if(!registeredListeners.containsKey(target)) registeredListeners.put(target, new HashSet<>());
Set<Object> currentListeners = registeredListeners.get(target);
LOGGER.debug("Updating connection listeners.");
// Case 1: item is not registered in IDC
long toRegister = refListeners.stream().filter(item -> !currentListeners.contains(item)).count();
refListeners.stream().filter(item -> !currentListeners.contains(item)).forEach(item ->
long toRegister = refListeners.stream().filter(item -> !registeredListeners.contains(item)).count();
refListeners.stream().filter(item -> !registeredListeners.contains(item)).forEach(item ->
{
target.getDispatcher().registerListener(item);
currentListeners.add(item);
connection.getDispatcher().registerListener(item);
registeredListeners.add(item);
});
// Case 2: item is registered, but shouldn't be
long toUnregister = currentListeners.stream().filter(item -> !refListeners.contains(item)).count();
currentListeners.stream().filter(item -> !refListeners.contains(item)).forEach(item ->
long toUnregister = registeredListeners.stream().filter(item -> !refListeners.contains(item)).count();
registeredListeners.stream().filter(item -> !refListeners.contains(item)).forEach(item ->
{
target.getDispatcher().unregisterListener(item);
currentListeners.remove(item);
connection.getDispatcher().unregisterListener(item);
registeredListeners.remove(item);
});
LOGGER.debug("Registered " + toRegister + " listeners and unregistered " + toUnregister + " listeners.");
}
/**
* Update all connections listeners
* @param refListeners Reference listeners list
*/
public static void updateAllListeners(Set<Class<?>> refListeners)
{
for(IDiscordClient i : connectionsDatastore) updateListeners(i, refListeners);
LOGGER.debug("Update done. diff: +{} -{}", toRegister, toUnregister);
}
/**
* 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
{
target.login();
connection.login();
}
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());
handlers.add(plugin);
updateConnectionsHandlers(); // Trigger update
updateConnectionHandlers(); // Trigger update
}
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());
handlers.remove(plugin);
updateConnectionsHandlers(); // Trigger update
updateConnectionHandlers(); // Trigger update
}
}
@ -90,16 +90,8 @@ public class EventManager
/**
* Delegated method
*/
public void updateConnectionsHandlers()
public void updateConnectionHandlers()
{
GatewayConnectionsManager.updateAllListeners(collectAllHandlers());
}
/**
* Delegated method
*/
public void updateConnectionHandlers(IDiscordClient target)
{
GatewayConnectionsManager.updateListeners(target, collectAllHandlers());
GatewayConnectionsManager.updateListeners(collectAllHandlers());
}
}