use of net.dv8tion.jda.api.entities.Activity 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);
}
}
use of net.dv8tion.jda.api.entities.Activity in project Ninbot by Nincodedo.
the class StreamListenerTest method userStartsStreamingNotAlreadyStreamingOnCooldown.
@Test
void userStartsStreamingNotAlreadyStreamingOnCooldown() {
UserActivityStartEvent userActivityStartEvent = mock(UserActivityStartEvent.class);
Member member = mock(Member.class);
Guild guild = mock(Guild.class);
Activity activity = mock(Activity.class);
MessageAction messageAction = mock(MessageAction.class);
AuditableRestAction auditableRestAction = mock(AuditableRestAction.class);
when(configService.getValuesByName("123", ConfigConstants.STREAMING_ANNOUNCE_USERS)).thenReturn(List.of("123"));
when(userActivityStartEvent.getMember()).thenReturn(member);
when(member.getId()).thenReturn("123");
when(userActivityStartEvent.getGuild()).thenReturn(guild);
when(guild.getId()).thenReturn("123");
when(userActivityStartEvent.getNewActivity()).thenReturn(activity);
when(activity.getType()).thenReturn(Activity.ActivityType.STREAMING);
streamListener.onGenericUserPresence(userActivityStartEvent);
verify(messageAction, times(0)).queue();
verify(auditableRestAction, times(0)).queue();
}
use of net.dv8tion.jda.api.entities.Activity in project JDA by DV8FromTheWorld.
the class PresenceUpdateHandler method handleActivities.
private void handleActivities(List<Activity> newActivities, @Nullable MemberImpl member, MemberPresenceImpl presence) {
List<Activity> oldActivities = presence.getActivities();
presence.setActivities(newActivities);
if (member == null)
return;
boolean unorderedEquals = Helpers.deepEqualsUnordered(oldActivities, newActivities);
if (unorderedEquals) {
boolean deepEquals = Helpers.deepEquals(oldActivities, newActivities);
if (!deepEquals) {
getJDA().handleEvent(new UserUpdateActivityOrderEvent(getJDA(), responseNumber, oldActivities, member));
}
} else {
getJDA().getEntityBuilder().updateMemberCache(member);
// create modifiable copy
List<Activity> stoppedActivities = new ArrayList<>(oldActivities);
List<Activity> startedActivities = new ArrayList<>();
for (Activity activity : newActivities) {
if (!stoppedActivities.remove(activity))
startedActivities.add(activity);
}
for (Activity activity : startedActivities) {
getJDA().handleEvent(new UserActivityStartEvent(getJDA(), responseNumber, member, activity));
}
for (Activity activity : stoppedActivities) {
getJDA().handleEvent(new UserActivityEndEvent(getJDA(), responseNumber, member, activity));
}
getJDA().handleEvent(new UserUpdateActivitiesEvent(getJDA(), responseNumber, member, oldActivities));
}
}
use of net.dv8tion.jda.api.entities.Activity in project JDA by DV8FromTheWorld.
the class PresenceUpdateHandler method handleInternally.
@Override
protected Long handleInternally(DataObject content) {
// Ignore events for relationships, presences are guild only to us
if (content.isNull("guild_id")) {
log.debug("Received PRESENCE_UPDATE without guild_id. Ignoring event.");
return null;
}
if (api.getCacheFlags().stream().noneMatch(CacheFlag::isPresence))
return null;
// Do a pre-check to see if this is for a Guild, and if it is, if the guild is currently locked or not cached.
final long guildId = content.getUnsignedLong("guild_id");
if (getJDA().getGuildSetupController().isLocked(guildId))
return guildId;
GuildImpl guild = (GuildImpl) getJDA().getGuildById(guildId);
if (guild == null) {
getJDA().getEventCache().cache(EventCache.Type.GUILD, guildId, responseNumber, allContent, this::handle);
EventCache.LOG.debug("Received a PRESENCE_UPDATE for a guild that is not yet cached! GuildId:{} UserId: {}", guildId, content.getObject("user").get("id"));
return null;
}
CacheView.SimpleCacheView<MemberPresenceImpl> presences = guild.getPresenceView();
if (presences == null)
// technically this should be impossible
return null;
DataObject jsonUser = content.getObject("user");
final long userId = jsonUser.getUnsignedLong("id");
MemberImpl member = (MemberImpl) guild.getMemberById(userId);
MemberPresenceImpl presence = presences.get(userId);
OnlineStatus status = OnlineStatus.fromKey(content.getString("status"));
if (status == OnlineStatus.OFFLINE)
presences.remove(userId);
if (presence == null) {
presence = new MemberPresenceImpl();
if (status != OnlineStatus.OFFLINE) {
try (UnlockHook lock = presences.writeLock()) {
presences.getMap().put(userId, presence);
}
}
}
// Now that we've update the User's info, lets see if we need to set the specific Presence information.
// This is stored in the Member objects.
// We set the activities to null to prevent parsing if the cache was disabled
final DataArray activityArray = !getJDA().isCacheFlagSet(CacheFlag.ACTIVITY) || content.isNull("activities") ? null : content.getArray("activities");
List<Activity> newActivities = new ArrayList<>();
boolean parsedActivity = parseActivities(userId, activityArray, newActivities);
if (getJDA().isCacheFlagSet(CacheFlag.CLIENT_STATUS) && !content.isNull("client_status"))
handleClientStatus(content, presence);
// Check if activities changed
if (parsedActivity)
handleActivities(newActivities, member, presence);
if (presence.getOnlineStatus() != status) {
OnlineStatus oldStatus = presence.getOnlineStatus();
presence.setOnlineStatus(status);
if (member != null) {
getJDA().getEntityBuilder().updateMemberCache(member);
getJDA().handleEvent(new UserUpdateOnlineStatusEvent(getJDA(), responseNumber, member, oldStatus));
}
}
return null;
}
use of net.dv8tion.jda.api.entities.Activity in project Ninbot by Nincodedo.
the class StreamListenerTest method userStartsStreamingNotAlreadyStreamingNoCooldown.
@Test
void userStartsStreamingNotAlreadyStreamingNoCooldown() {
UserActivityStartEvent userActivityStartEvent = mock(UserActivityStartEvent.class);
Member member = mock(Member.class);
Guild guild = mock(Guild.class);
Activity activity = mock(Activity.class);
User user = mock(User.class);
TextChannel textChannel = mock(TextChannel.class);
MessageAction messageAction = mock(MessageAction.class);
Role streamingRole = mock(Role.class);
RichPresence richPresence = mock(RichPresence.class);
AuditableRestAction auditableRestAction = mock(AuditableRestAction.class);
Message message = mock(Message.class);
when(configService.getValuesByName("123", ConfigConstants.STREAMING_ANNOUNCE_USERS)).thenReturn(List.of("123"));
when(configService.getSingleValueByName("123", ConfigConstants.STREAMING_ANNOUNCE_CHANNEL)).thenReturn(Optional.of("123"));
when(configService.getSingleValueByName("123", ConfigConstants.STREAMING_ROLE)).thenReturn(Optional.of("123"));
when(userActivityStartEvent.getMember()).thenReturn(member);
when(member.getUser()).thenReturn(user);
when(member.getId()).thenReturn("123");
when(userActivityStartEvent.getGuild()).thenReturn(guild);
when(guild.getId()).thenReturn("123");
when(userActivityStartEvent.getNewActivity()).thenReturn(activity);
when(activity.getType()).thenReturn(Activity.ActivityType.STREAMING);
when(userActivityStartEvent.getUser()).thenReturn(user);
when(user.getName()).thenReturn("Nin");
when(activity.isRich()).thenReturn(true);
when(activity.asRichPresence()).thenReturn(richPresence);
when(activity.getUrl()).thenReturn("https://twitch.tv/nincodedo");
when(richPresence.getState()).thenReturn("Zeldo Breath of the Wild 2");
when(guild.getLocale()).thenReturn(Locale.ENGLISH);
when(guild.getMember(user)).thenReturn(member);
when(guild.getTextChannelById("123")).thenReturn(textChannel);
when(textChannel.sendMessage(any(Message.class))).thenReturn(messageAction);
when(guild.getRoleById("123")).thenReturn(streamingRole);
when(guild.addRoleToMember(member, streamingRole)).thenReturn(auditableRestAction);
when(textChannel.getLatestMessageId()).thenReturn("123");
when(textChannel.retrieveMessageById("123")).thenReturn(auditableRestAction);
when(auditableRestAction.complete()).thenReturn(message);
when(message.getContentRaw()).thenReturn("some other stream announcement");
streamListener.onGenericUserPresence(userActivityStartEvent);
verify(messageAction, times(1)).queue(any());
verify(auditableRestAction, times(1)).queue();
}
Aggregations