Skip to content

Commit 56c3533

Browse files
committed
Merge branch 'release/3.12.0'
2 parents aa1acd6 + d4a0f6f commit 56c3533

File tree

61 files changed

+638
-450
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+638
-450
lines changed

.github/workflows/create-release-on-tag-push.yml

+3-2
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,12 @@ jobs:
4040
username: ${{ github.repository_owner }}
4141
password: ${{ secrets.PACKAGE_ACTIONS_TOKEN }}
4242
- name: Build and push
43-
uses: docker/build-push-action@v3
43+
uses: docker/build-push-action@v4
4444
with:
4545
context: .
4646
platforms: linux/amd64
4747
push: true
48+
provenance: false
4849
tags: |
4950
ghcr.io/nincodedo/ninbot:latest
5051
ghcr.io/nincodedo/ninbot:${{ github.sha }}
@@ -71,7 +72,7 @@ jobs:
7172
with:
7273
credentials_json: ${{ secrets.GKE_JSON }}
7374
- name: GKE Get Credentials
74-
uses: google-github-actions/get-gke-credentials@v1.0.0
75+
uses: google-github-actions/get-gke-credentials@v1.0.1
7576
with:
7677
cluster_name: ninbot-cluster
7778
location: us-central1-c

.github/workflows/push-main.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,9 @@ jobs:
5858
username: ${{ github.repository_owner }}
5959
password: ${{ secrets.PACKAGE_ACTIONS_TOKEN }}
6060
- name: Build and push
61-
uses: docker/build-push-action@v3
61+
uses: docker/build-push-action@v4
6262
with:
6363
context: .
6464
platforms: linux/amd64
6565
push: false
66+
provenance: false

.mvn/wrapper/maven-wrapper.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,5 @@
1414
# KIND, either express or implied. See the License for the
1515
# specific language governing permissions and limitations
1616
# under the License.
17-
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.zip
17+
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.0/apache-maven-3.9.0-bin.zip
1818
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar

Dockerfile

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
FROM maven:3.8.6-eclipse-temurin-19 AS build
1+
FROM maven:3.9.0-eclipse-temurin-19 AS build
22

3-
ARG open_telemetry_version=v1.22.1
3+
ARG open_telemetry_version=v1.23.0
44
COPY . ./
55
RUN mvn -B package -P git-commit
66
RUN cp ninbot-app/target/ninbot-*.jar ninbot.jar

README.md

+4
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,7 @@ the [common Emojis class](nincord-common/src/main/java/dev/nincodedo/nincord/Emo
4848

4949
Changes and additions to a command or action that would affect the end user should be documented. The latest version of
5050
Ninbot is the only supported version, so the documentation needs to be up-to-date.
51+
52+
## Special Thanks
53+
54+
Thanks to [GetSongbpm](https://getsongbpm.com/api) for the API access!

ninbot-app/pom.xml

+10-12
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,19 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
33
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
44
<modelVersion>4.0.0</modelVersion>
55
<parent>
66
<groupId>dev.nincodedo</groupId>
77
<artifactId>ninbot-shared-parent</artifactId>
8-
<version>3.11.2</version>
8+
<version>3.12.0</version>
99
<relativePath>../ninbot-shared-parent</relativePath>
1010
</parent>
11-
1211
<artifactId>ninbot-app</artifactId>
1312
<name>Ninbot Application</name>
14-
1513
<properties>
1614
<jakarta-servlet.version>5.0.0</jakarta-servlet.version>
1715
</properties>
1816
<dependencies>
19-
<dependency>
20-
<groupId>dev.nincodedo</groupId>
21-
<artifactId>nincord-common</artifactId>
22-
</dependency>
2317
<dependency>
2418
<groupId>club.minnced</groupId>
2519
<artifactId>discord-webhooks</artifactId>
@@ -32,10 +26,6 @@
3226
<groupId>com.github.twitch4j</groupId>
3327
<artifactId>twitch4j</artifactId>
3428
</dependency>
35-
<dependency>
36-
<groupId>io.opentelemetry.instrumentation</groupId>
37-
<artifactId>opentelemetry-instrumentation-annotations</artifactId>
38-
</dependency>
3929
<dependency>
4030
<groupId>com.google.code.findbugs</groupId>
4131
<artifactId>jsr305</artifactId>
@@ -62,10 +52,18 @@
6252
<groupId>commons-lang</groupId>
6353
<artifactId>commons-lang</artifactId>
6454
</dependency>
55+
<dependency>
56+
<groupId>dev.nincodedo</groupId>
57+
<artifactId>nincord-common</artifactId>
58+
</dependency>
6559
<dependency>
6660
<groupId>eu.crydee</groupId>
6761
<artifactId>syllable-counter</artifactId>
6862
</dependency>
63+
<dependency>
64+
<groupId>io.opentelemetry.instrumentation</groupId>
65+
<artifactId>opentelemetry-instrumentation-annotations</artifactId>
66+
</dependency>
6967
<dependency>
7068
<groupId>net.dv8tion</groupId>
7169
<artifactId>JDA</artifactId>

ninbot-app/src/main/java/dev/nincodedo/ninbot/NinbotApplication.java

-1
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,4 @@ public class NinbotApplication {
2727
public static void main(String[] args) {
2828
SpringApplication.run(NinbotApplication.class, args);
2929
}
30-
3130
}

nincord-common/src/main/java/dev/nincodedo/nincord/autoconfigure/TwitchAutoConfig.java ninbot-app/src/main/java/dev/nincodedo/ninbot/autoconfigure/TwitchAutoConfig.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
package dev.nincodedo.nincord.autoconfigure;
1+
package dev.nincodedo.ninbot.autoconfigure;
22

33
import com.github.philippheuer.credentialmanager.CredentialManager;
44
import com.github.philippheuer.credentialmanager.CredentialManagerBuilder;
55
import com.github.philippheuer.credentialmanager.storage.TemporaryStorageBackend;
66
import com.github.twitch4j.auth.providers.TwitchIdentityProvider;
7-
import dev.nincodedo.nincord.config.app.TwitchConfig;
8-
import dev.nincodedo.nincord.twitch.TokenRefresh;
7+
import dev.nincodedo.ninbot.components.stream.twitch.TokenRefresh;
8+
import dev.nincodedo.ninbot.config.properties.TwitchConfig;
99
import org.springframework.boot.autoconfigure.AutoConfiguration;
1010
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
1111
import org.springframework.boot.context.properties.EnableConfigurationProperties;

ninbot-app/src/main/java/dev/nincodedo/ninbot/components/channel/voice/TempVoiceChannelManager.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ private void checkIfShouldCreateTempChannel(Guild guild, Member member, AudioCha
5555
}
5656
log.trace("hasPermission: {}, channel join {} is temp creator: {}", hasManageChannelPermission(guild),
5757
channelJoined.getName(), channelJoined.getName()
58-
.startsWith(Emojis.PLUS));
58+
.startsWith(Emojis.PLUS));
5959
if (hasManageChannelPermission(guild) && channelJoined.getName().startsWith(Emojis.PLUS)) {
6060
countOneStat(componentName, guild.getId());
6161
createTemporaryChannel(channelJoined, guild, member);

ninbot-app/src/main/java/dev/nincodedo/ninbot/components/dab/Dabber.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package dev.nincodedo.ninbot.components.dab;
22

33
import dev.nincodedo.ninbot.components.reaction.EmojiReactionResponse;
4-
import dev.nincodedo.nincord.StreamUtils;
54
import dev.nincodedo.nincord.message.MessageExecutor;
65
import dev.nincodedo.nincord.supporter.SupporterCheck;
6+
import dev.nincodedo.nincord.util.StreamUtils;
77
import lombok.Getter;
88
import lombok.extern.slf4j.Slf4j;
99
import net.dv8tion.jda.api.entities.User;
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,19 @@
11
package dev.nincodedo.ninbot.components.info;
22

33
import dev.nincodedo.nincord.command.slash.info.BotInfo;
4-
import dev.nincodedo.nincord.config.app.NincordProperties;
4+
import dev.nincodedo.nincord.config.properties.InfoCommandConfig;
5+
import dev.nincodedo.nincord.config.properties.SupporterConfig;
56
import org.springframework.boot.actuate.metrics.MetricsEndpoint;
7+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
68
import org.springframework.boot.info.GitProperties;
79
import org.springframework.stereotype.Component;
810

911
@Component
12+
@EnableConfigurationProperties({InfoCommandConfig.class, SupporterConfig.class})
1013
public class NinbotBotInfo extends BotInfo {
1114

12-
private NincordProperties autoConfig;
13-
1415
protected NinbotBotInfo(GitProperties gitProperties, MetricsEndpoint metricsEndpoint,
15-
NincordProperties autoConfig) {
16-
super(gitProperties, metricsEndpoint);
17-
this.autoConfig = autoConfig;
18-
}
19-
20-
@Override
21-
public String getGitHubUrl() {
22-
return autoConfig.info().githubUrl();
23-
}
24-
25-
@Override
26-
public String getSupporterGuildId() {
27-
return autoConfig.supporter().patreonServerId();
28-
}
29-
30-
@Override
31-
public String getDocumentationUrl() {
32-
return autoConfig.info().documentationUrl();
16+
InfoCommandConfig infoCommandConfig, SupporterConfig supporterConfig) {
17+
super(gitProperties, metricsEndpoint, infoCommandConfig, supporterConfig);
3318
}
3419
}

ninbot-app/src/main/java/dev/nincodedo/ninbot/components/pathogen/VaccinationManager.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package dev.nincodedo.ninbot.components.pathogen;
22

33
import dev.nincodedo.ninbot.components.pathogen.user.PathogenUserService;
4-
import dev.nincodedo.nincord.StreamUtils;
4+
import dev.nincodedo.nincord.util.StreamUtils;
55
import net.dv8tion.jda.api.sharding.ShardManager;
66
import org.springframework.scheduling.annotation.Scheduled;
77
import org.springframework.stereotype.Component;

ninbot-app/src/main/java/dev/nincodedo/ninbot/components/stream/banner/BannerCleanup.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public BannerCleanup(GameBannerRepository gameBannerRepository) {
2020
this.gameBannerRepository = gameBannerRepository;
2121
}
2222

23-
@Scheduled(fixedDelay = 12, timeUnit = TimeUnit.HOURS, initialDelay = 12)
23+
@Scheduled(fixedDelay = 1, timeUnit = TimeUnit.DAYS, initialDelay = 1)
2424
protected void deleteBadBannersFromCache() {
2525
gameBannerRepository.findAll()
2626
.stream()
@@ -35,7 +35,7 @@ protected void deleteBadBannersFromCache() {
3535
});
3636
}
3737

38-
@Scheduled(fixedDelay = 7, timeUnit = TimeUnit.DAYS, initialDelay = 7)
38+
@Scheduled(fixedDelay = 30, timeUnit = TimeUnit.DAYS, initialDelay = 30)
3939
protected void deleteAllBannersFromCache() {
4040
File cacheDirectory = new File("cache");
4141
if (cacheDirectory.exists()) {

ninbot-app/src/main/java/dev/nincodedo/ninbot/components/stream/banner/GameBannerBuilder.java

+10-12
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package dev.nincodedo.ninbot.components.stream.banner;
22

3-
import dev.nincodedo.nincord.StreamUtils;
3+
import dev.nincodedo.nincord.util.StreamUtils;
44
import io.opentelemetry.instrumentation.annotations.WithSpan;
55
import lombok.extern.slf4j.Slf4j;
66

@@ -38,17 +38,15 @@ public CompletableFuture<GameBanner> getGameBannerAsync(String gameTitle) {
3838
var cachedBanners = getGameBannerFilesFromCache(gameTitle).stream()
3939
.sorted(StreamUtils.shuffle())
4040
.toList();
41-
if (!cachedBanners.isEmpty()) {
42-
for (var cachedBannerFile : cachedBanners) {
43-
var gameBannerOptional = getGameBannerFromFile(cachedBannerFile);
44-
if (gameBannerOptional.isPresent() && gameBannerOptional.get().getScore() >= 0) {
45-
var gameBanner = gameBannerOptional.get();
46-
gameBanner.setFile(cachedBannerFile);
47-
futureGameBanner.complete(gameBanner);
48-
return null;
49-
} else if (gameBannerOptional.isPresent()) {
50-
Files.deleteIfExists(cachedBannerFile.toPath());
51-
}
41+
for (var cachedBannerFile : cachedBanners) {
42+
var gameBannerOptional = getGameBannerFromFile(cachedBannerFile);
43+
if (gameBannerOptional.isPresent() && gameBannerOptional.get().getScore() >= 0) {
44+
var gameBanner = gameBannerOptional.get();
45+
gameBanner.setFile(cachedBannerFile);
46+
futureGameBanner.complete(gameBanner);
47+
return null;
48+
} else if (gameBannerOptional.isPresent()) {
49+
Files.deleteIfExists(cachedBannerFile.toPath());
5250
}
5351
}
5452
futureGameBanner.complete(generateGameBannerFromTitle(gameTitle));

ninbot-app/src/main/java/dev/nincodedo/ninbot/components/stream/banner/steamgriddb/SteamGridDBBannerBuilder.java

+13-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import dev.nincodedo.ninbot.components.stream.banner.GameBanner;
44
import dev.nincodedo.ninbot.components.stream.banner.GameBannerBuilder;
55
import dev.nincodedo.ninbot.components.stream.banner.GameBannerRepository;
6-
import dev.nincodedo.nincord.StreamUtils;
6+
import dev.nincodedo.nincord.util.StreamUtils;
7+
import io.micrometer.core.instrument.Counter;
8+
import io.micrometer.core.instrument.Metrics;
79
import io.micrometer.core.instrument.util.NamedThreadFactory;
810
import lombok.extern.slf4j.Slf4j;
911
import org.imgscalr.Scalr;
@@ -28,6 +30,7 @@ public class SteamGridDBBannerBuilder extends GameBannerBuilder {
2830

2931
private SteamGridDBFeign steamGridDBFeign;
3032
private Random random;
33+
private Counter bannersGenerated = Metrics.counter("bot.stream.banners.generated.count");
3134

3235
public SteamGridDBBannerBuilder(SteamGridDBFeign steamGridDBFeign, GameBannerRepository gameBannerRepository) {
3336
super(gameBannerRepository, Executors.newCachedThreadPool(new NamedThreadFactory("game-banner-builder")));
@@ -42,16 +45,22 @@ private Optional<GameBanner> randomBanner(List<GameBanner> gameBanners) {
4245
private List<GameBanner> generateGameBanners(String gameTitle, int gameId, List<GameImage> logos,
4346
List<GameImage> heroes) {
4447
var allBanners = gameBannerRepository.findAllByGameTitle(gameTitle);
48+
4549
List<GameBanner> gameBanners = new ArrayList<>();
4650
log.trace("Generating banners for {}", gameTitle);
47-
for (int i = 0; i < 3; i++) {
51+
int iterations = 0;
52+
while (iterations < 12 && gameBanners.size() < 3) {
4853
var logo = logos.get(random.nextInt(logos.size()));
4954
var hero = heroes.get(random.nextInt(heroes.size()));
5055
var gameBanner = allBanners.stream()
5156
.filter(gameBanner1 -> gameBanner1.getLogoId() == logo.id()
5257
&& gameBanner1.getBackgroundId() == hero.id())
5358
.findFirst()
5459
.orElse(new GameBanner());
60+
iterations++;
61+
if (gameBanner.getScore() < 0) {
62+
continue;
63+
}
5564
gameBanner.setGameTitle(gameTitle);
5665
gameBanner.setGameId(gameId);
5766
gameBanner.setLogoId(logo.id());
@@ -63,7 +72,8 @@ private List<GameBanner> generateGameBanners(String gameTitle, int gameId, List<
6372
gameBanners.add(gameBanner);
6473
allBanners.add(gameBanner);
6574
}
66-
log.debug("Finished with {} game banners generated", gameBanners.size());
75+
bannersGenerated.increment(gameBanners.size());
76+
log.debug("Finished with {} game banners generated in {} iterations", gameBanners.size(), iterations);
6777
return gameBanners;
6878
}
6979

nincord-common/src/main/java/dev/nincodedo/nincord/twitch/TokenRefresh.java ninbot-app/src/main/java/dev/nincodedo/ninbot/components/stream/twitch/TokenRefresh.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package dev.nincodedo.nincord.twitch;
1+
package dev.nincodedo.ninbot.components.stream.twitch;
22

33
import com.github.philippheuer.credentialmanager.CredentialManager;
44
import com.github.twitch4j.auth.providers.TwitchIdentityProvider;
@@ -18,7 +18,6 @@ public TokenRefresh(CredentialManager credentialManager, TwitchIdentityProvider
1818
@Scheduled(timeUnit = TimeUnit.DAYS, fixedRate = 1, initialDelay = 1)
1919
protected void updateToken() {
2020
var oauthOptional = credentialManager.getOAuth2IdentityProviderByName("twitch");
21-
oauthOptional.ifPresent(oAuth2IdentityProvider -> oAuth2IdentityProvider.getAppAccessToken()
22-
.updateCredential(twitchIdentityProvider.getAppAccessToken()));
21+
oauthOptional.ifPresent(oAuth2IdentityProvider -> oAuth2IdentityProvider.refreshCredential(twitchIdentityProvider.getAppAccessToken()));
2322
}
2423
}

ninbot-app/src/main/java/dev/nincodedo/ninbot/components/subscribe/SubscribeCommand.java

+8-3
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,12 @@ public MessageExecutor execute(@NotNull SlashCommandInteractionEvent event,
3636
@NotNull SlashCommandEventMessageExecutor messageExecutor) {
3737
messageExecutor.deferEphemeralReply();
3838
var guild = event.getGuild();
39+
if (guild == null) {
40+
return messageExecutor;
41+
}
3942
var role = event.getOption(SubscribeCommandName.Option.SUBSCRIPTION.get(), OptionMapping::getAsRole);
40-
if (guild != null && isValidSubscribeRole(role, guild.getId())) {
43+
var publicRole = event.getGuild().getPublicRole();
44+
if (isValidSubscribeRole(role, publicRole, guild.getId())) {
4145
try {
4246
addOrRemoveSubscription(event.getInteraction().getHook(), event.getMember(), guild, role);
4347
} catch (PermissionException e) {
@@ -64,11 +68,12 @@ Consumer<Void> successAction(InteractionHook interactionHook) {
6468
return success -> interactionHook.editOriginal(Emojis.CHECK_MARK).queue();
6569
}
6670

67-
private boolean isValidSubscribeRole(Role role, String serverId) {
71+
private boolean isValidSubscribeRole(Role role, Role publicRole, String serverId) {
6872
List<String> roleDenyList = configService.getValuesByName(serverId, ConfigConstants.ROLE_DENY_LIST);
6973
roleDenyList.add(PathogenConfig.getINFECTED_ROLE_NAME());
7074
roleDenyList.add(PathogenConfig.getVACCINATED_ROLE_NAME());
71-
return role != null && !roleDenyList.contains(role.getName());
75+
return role != null && !roleDenyList.contains(role.getName())
76+
&& role.getPermissionsExplicit().size() <= publicRole.getPermissionsExplicit().size();
7277
}
7378

7479
@Override

0 commit comments

Comments
 (0)