package pl.touk.chat.bot.janusz; import com.google.common.collect.ImmutableMap; import com.truward.di.InjectionContext; import com.truward.di.support.DefaultInjectionContext; import org.h2.jdbcx.JdbcConnectionPool; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import pl.touk.chat.bot.janusz.commands.Commands; import pl.touk.chat.bot.janusz.commands.bus.BusCommand; import pl.touk.chat.bot.janusz.commands.bus.TransitApi; import pl.touk.chat.bot.janusz.commands.cmdfucommand.CMDFuCommand; import pl.touk.chat.bot.janusz.commands.gif.GifCommand; import pl.touk.chat.bot.janusz.commands.stack.StackOverflowCommand; import pl.touk.chat.bot.janusz.commands.store.StoreCommand; import pl.touk.chat.bot.janusz.config.ConfigLoader; import pl.touk.chat.bot.janusz.config.JanuszConfiguration; import pl.touk.chat.bot.janusz.hipchat.HippyJanusz; import pl.touk.chat.bot.janusz.slack.SlackJanusz; import pl.touk.chat.bot.janusz.store.JdbcStore; import java.io.IOException; import java.util.List; public class JanuszStarter { private static final Logger LOGGER = LoggerFactory.getLogger(JanuszStarter.class); private InjectionContext context; private List<JanuszListener> listeners; public static void main(String [] args) throws InterruptedException, IOException { JanuszConfiguration januszConfiguration = ConfigLoader.load(args); JanuszStarter januszStarter = new JanuszStarter(januszConfiguration); januszStarter.startListening(); while (true) { Thread.sleep(1000); } } public JanuszStarter(JanuszConfiguration januszConfiguration) { context = createContext(januszConfiguration); listeners = context.getBeans(JanuszListener.class); } public void startListening() { LOGGER.info("Starting listeners"); listeners.forEach(januszListener -> { if (januszListener.isEnabled()) januszListener.listen(); }); LOGGER.info("Finished starting listeners"); } public InjectionContext createContext(JanuszConfiguration januszConfiguration) { InjectionContext context = new DefaultInjectionContext(); context.registerBean(januszConfiguration); context.registerBean(connectionPool(januszConfiguration)); context.registerBean(JdbcStore.class); context.registerBean(TransitApi.class); context.registerBean(BusCommand.class); context.registerBean(StoreCommand.class); context.registerBean(StackOverflowCommand.class); context.registerBean(GifCommand.class); context.registerBean(CMDFuCommand.class); context.registerBean(createCommands(context)); context.registerBean(CommandInvoker.class); context.registerBean(JanuszCommander.class); context.registerBean(SlackJanusz.class); context.registerBean(HippyJanusz.class); context.freeze(); return context; } private JdbcConnectionPool connectionPool(JanuszConfiguration configuration) { return JdbcConnectionPool.create(configuration.jdbc.url, configuration.jdbc.username, configuration.jdbc.password); } private Commands createCommands(InjectionContext context) { return new Commands(ImmutableMap.of( "bus", context.getBean(BusCommand.class), "stack", context.getBean(StackOverflowCommand.class), "gif", context.getBean(GifCommand.class), "cmdfu", context.getBean(CMDFuCommand.class), "store", context.getBean(StoreCommand.class))); } }