package io.shockah.skylark.ident; import io.shockah.skylark.Bot; import io.shockah.skylark.BotManager; import io.shockah.skylark.ServerManager; import io.shockah.skylark.plugin.BotManagerService; import io.shockah.skylark.plugin.Plugin; import io.shockah.skylark.plugin.PluginManager; import io.shockah.skylark.util.ReadWriteList; import java.util.ArrayList; import java.util.Map; import org.pircbotx.User; public class IdentPlugin extends Plugin implements BotManagerService.Factory { protected final ReadWriteList<IdentMethodFactory> methodFactories = new ReadWriteList<>(new ArrayList<>()); public IdentPlugin(PluginManager manager, Info info) { super(manager, info); } @Override protected void onLoad() { register( new NameIdentMethod.Factory(), new HostnameIdentMethod.Factory(), new ServerIdentMethod.Factory() ); } public void register(IdentMethodFactory... factories) { methodFactories.writeOperation(methodFactories -> { for (IdentMethodFactory factory : factories) { methodFactories.add(factory); ServerManager serverManager = manager.app.serverManager; serverManager.botManagers.iterate(botManager -> { IdentService service = botManager.getService(IdentService.class); if (service != null) service.methods.add(factory.create(service)); }); } }); } public void unregister(IdentMethodFactory... factories) { methodFactories.writeOperation(methodFactories -> { for (IdentMethodFactory factory : factories) { methodFactories.remove(factory); ServerManager serverManager = manager.app.serverManager; serverManager.botManagers.iterate(botManager -> { IdentService service = botManager.getService(IdentService.class); if (service != null) service.methods.remove(factory); }); } }); } public IdentMethodFactory getFactoryForPrefix(String prefix) { return methodFactories.filterFirst(factory -> factory.prefix.equalsIgnoreCase(prefix)); } @Override public BotManagerService createService(BotManager manager) { return new IdentService(this, manager); } public Map<IdentMethod, String> getIdentsForUser(User user) { return user.<Bot>getBot().manager.getService(IdentService.class).getIdentsForUser(user); } }