Skip to content

Commit

Permalink
feat(pubsub): support unofficial ads manager topic (#847)
Browse files Browse the repository at this point in the history
  • Loading branch information
iProdigy committed Sep 6, 2023
1 parent 194c77a commit 8306594
Show file tree
Hide file tree
Showing 6 changed files with 98 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,11 @@ default PubSubSubscription listenForAdsEvents(OAuth2Credential credential, Strin
return listenOnTopic(PubSubType.LISTEN, credential, "ads." + channelId);
}

@Unofficial
default PubSubSubscription listenForAdsManagerEvents(OAuth2Credential credential, String userId, String channelId) {
return listenOnTopic(PubSubType.LISTEN, credential, "ads-manager." + userId + '.' + channelId);
}

@Unofficial
@Deprecated
default PubSubSubscription listenForAdPropertyRefreshEvents(OAuth2Credential credential, String channelId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
import com.github.twitch4j.pubsub.domain.PubSubResponse;
import com.github.twitch4j.pubsub.domain.RadioData;
import com.github.twitch4j.pubsub.domain.RedemptionProgress;
import com.github.twitch4j.pubsub.domain.ScheduleUpdate;
import com.github.twitch4j.pubsub.domain.ShieldModeSettings;
import com.github.twitch4j.pubsub.domain.ShieldModeStatus;
import com.github.twitch4j.pubsub.domain.SubGiftData;
Expand All @@ -73,6 +74,7 @@
import com.github.twitch4j.pubsub.domain.VideoPlaybackData;
import com.github.twitch4j.pubsub.domain.WhisperThread;
import com.github.twitch4j.pubsub.enums.PubSubType;
import com.github.twitch4j.pubsub.events.AdsScheduleUpdateEvent;
import com.github.twitch4j.pubsub.events.AliasRestrictionUpdateEvent;
import com.github.twitch4j.pubsub.events.AutomodCaughtMessageEvent;
import com.github.twitch4j.pubsub.events.AutomodLevelsModifiedEvent;
Expand Down Expand Up @@ -472,6 +474,13 @@ protected void onTextMessage(String text) {
} else {
log.warn("Unparsable Message: " + message.getType() + "|" + message.getData());
}
} else if ("ads-manager".equals(topicName)) {
if ("ads-schedule-update".equals(type)) {
ScheduleUpdate data = TypeConvert.jsonToObject(rawMessage, ScheduleUpdate.class);
eventManager.publish(new AdsScheduleUpdateEvent(lastTopicIdentifier, data));
} else {
log.warn("Unparsable Message: " + message.getType() + "|" + message.getData());
}
} else if ("community-boost-events-v1".equals(topicName)) {
if ("community-boost-progression".equals(type)) {
CommunityBoostProgression progression = TypeConvert.convertValue(msgData, CommunityBoostProgression.class);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.github.twitch4j.pubsub.domain;

import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AccessLevel;
import lombok.Data;
import lombok.Setter;

import java.util.List;

@Data
@Setter(AccessLevel.PRIVATE)
@JsonNaming(PropertyNamingStrategies.LowerCamelCaseStrategy.class)
public class ScheduleUpdate {
private String scheduleUpdateType;
private List<ScheduledAd> adSchedule;

public boolean isSnooze() {
return "Snooze".equalsIgnoreCase(scheduleUpdateType);
}

public boolean isRemoval() {
return "RemoveAdTime".equalsIgnoreCase(scheduleUpdateType);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.github.twitch4j.pubsub.domain;

import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AccessLevel;
import lombok.Data;
import lombok.Setter;

import java.time.Instant;

@Data
@Setter(AccessLevel.PRIVATE)
@JsonNaming(PropertyNamingStrategies.LowerCamelCaseStrategy.class)
public class ScheduledAd {
private Instant runAtTime;
private Long durationSeconds;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.github.twitch4j.pubsub.events;

import com.github.twitch4j.common.events.TwitchEvent;
import com.github.twitch4j.pubsub.domain.ScheduleUpdate;
import lombok.EqualsAndHashCode;
import lombok.Value;

@Value
@EqualsAndHashCode(callSuper = false)
public class AdsScheduleUpdateEvent extends TwitchEvent {
String channelId;
ScheduleUpdate data;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.github.twitch4j.pubsub.domain;

import com.github.twitch4j.common.util.TypeConvert;
import org.junit.jupiter.api.Test;

import java.time.Instant;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;

class ScheduleUpdateTest {

@Test
void deserializeSnooze() {
String json = "{\"type\":\"ads-schedule-update\",\"scheduleUpdateType\":\"Snooze\",\"adSchedule\":[{\"runAtTime\":\"2023-07-20T16:30:45Z\",\"durationSeconds\":60}]}";
ScheduleUpdate data = TypeConvert.jsonToObject(json, ScheduleUpdate.class);
assertNotNull(data);
assertTrue(data.isSnooze());
assertNotNull(data.getAdSchedule());
assertFalse(data.getAdSchedule().isEmpty());
ScheduledAd ad = data.getAdSchedule().get(0);
assertNotNull(ad);
assertEquals(60L, ad.getDurationSeconds());
assertEquals(Instant.parse("2023-07-20T16:30:45Z"), ad.getRunAtTime());
}

}

0 comments on commit 8306594

Please sign in to comment.