|
|
|
@ -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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|