use of net.anweisen.utilities.common.function.ExceptionallyBiConsumer in project Utility by anweisen.
the class DiscordBot method init.
protected final void init() throws Exception {
if (initialized)
throw new IllegalStateException("init() was already called");
initialized = true;
builder = builder().validate();
DiscordBotBuilder.logger.debug("Building bot with following configuration:" + "\n\t" + config + "\n\t" + builder + "\n\t" + (builder.databaseConfig == null ? "BotDatabaseConfig{null}" : builder.databaseConfig));
boolean requireDatabase = builder.databaseConfig != null || !builder.tables.isEmpty() || builder.requireDatabase;
if (builder.databaseConfig == null) {
builder.databaseConfig = new BotDatabaseConfig("guilds", "guildId", null, null, null);
}
if (requireDatabase) {
database = config.createDatabase();
database.connect();
builder.tables.forEach((ExceptionallyBiConsumer<String, SQLColumn[]>) database::createTable);
} else {
database = Database.unsupported();
}
builder.fileLanguages.addAll(config.getLanguageFiles());
commandManager = new DefaultCommandManager(builder.databaseConfig.getPrefixColumn() == null ? new ConstantPrefixProvider(config.getDefaultPrefix()) : new DatabasePrefixProvider(config.getDefaultPrefix(), database, builder.databaseConfig.getGuildTable(), builder.databaseConfig.getGuildKeyColumn(), builder.databaseConfig.getPrefixColumn())).setUseEmbeds(builder.useEmbeds);
if (builder.databaseConfig.getTeamRoleColumn() != null) {
commandManager.setTeamRoleManager(new DatabaseTeamRoleManager(database, builder.databaseConfig.getGuildTable(), builder.databaseConfig.getGuildKeyColumn(), builder.databaseConfig.getTeamRoleColumn()));
}
if (builder.databaseConfig.getLanguageColumn() != null) {
LanguageManager languageManager = new DatabaseLanguageManager(database, builder.databaseConfig.getGuildTable(), builder.databaseConfig.getGuildKeyColumn(), builder.databaseConfig.getLanguageColumn());
commandManager.setLanguageManager(languageManager);
for (String filename : builder.fileLanguages) languageManager.readFile(filename);
for (String filename : builder.resourceLanguages) languageManager.readResource(filename);
languageManager.setDefaultLanguage(config.getDefaultLanguage());
} else if (!builder.fileLanguages.isEmpty() || !builder.resourceLanguages.isEmpty()) {
DiscordBotBuilder.logger.warn("Languages were registered but no database for language management is setup!");
LanguageManager languageManager = new ConstantLanguageManager();
commandManager.setLanguageManager(languageManager);
for (String filename : builder.fileLanguages) languageManager.readFile(filename);
for (String filename : builder.resourceLanguages) languageManager.readResource(filename);
languageManager.setDefaultLanguage(config.getDefaultLanguage());
}
builder.parsers.forEach((key, parser) -> commandManager.getParserContext().registerParser(key, parser.getFirst(), parser.getSecond()));
commandManager.register(builder.commands);
builder.taskCommands.forEach(pair -> commandManager.register(pair.getFirst(), pair.getSecond()));
List<GatewayIntent> intents = Arrays.asList(builder.intents);
if (!intents.contains(GatewayIntent.DIRECT_MESSAGES))
DiscordBotBuilder.logger.warn("Missing GatewayIntent.DIRECT_MESSAGES, no commands will be available in private chats");
if (!intents.contains(GatewayIntent.GUILD_MESSAGES))
DiscordBotBuilder.logger.warn("Missing GatewayIntent.GUILD_MESSAGES, no commands will be available in guild chats");
DefaultShardManagerBuilder shardManagerBuilder = DefaultShardManagerBuilder.create(config.getToken(), intents).setCallbackPoolProvider(newThreadPoolProvider("Callback")).setEventPoolProvider(newThreadPoolProvider("Events")).setShardsTotal(config.getShards()).setMemberCachePolicy(builder.memberCachePolicy).setEventManagerProvider(shardId -> eventManager).setStatusProvider(shardId -> config.getOnlineStatus()).addEventListeners(new CommandListener(commandManager), this);
if (builder.chunkingFilter != null)
shardManagerBuilder.setChunkingFilter(builder.chunkingFilter);
builder.builderSettings.forEach(action -> action.accept(shardManagerBuilder));
builder.listener.forEach(shardManagerBuilder::addEventListeners);
for (CacheFlag cache : CacheFlag.values()) {
if (builder.cacheFlags.contains(cache)) {
shardManagerBuilder.enableCache(cache);
} else {
shardManagerBuilder.disableCache(cache);
}
}
shardManager = shardManagerBuilder.build();
builder.shardManagerSettings.forEach(action -> action.accept(shardManager));
if (!builder.customSlashCommands.isEmpty())
getJDA().updateCommands().addCommands(builder.customSlashCommands).queue();
else if (!builder.disableAutoSlashCommands)
commandManager.setupSlashCommands(getJDA());
getJDA().retrieveApplicationInfo().queue(applicationInfo -> this.applicationInfo = applicationInfo);
onStart();
if (!builder.activities.isEmpty()) {
new Timer("BotActivityChanger").schedule(new TimerTask() {
private int index = 0;
@Override
public void run() {
if (index >= builder.activities.size()) {
index = 0;
}
Supplier<? extends Activity> activitySupplier = builder.activities.get(index);
Activity activity = activitySupplier.get();
shardManager.setActivity(activity);
index++;
}
}, 3000, builder.activityUpdateRate * 1000L);
}
}
Aggregations