From 7055fcb00ddae7c2db47b546fdf5dfd24a8afed4 Mon Sep 17 00:00:00 2001 From: loki5512344 Date: Sun, 12 Jul 2026 23:39:09 +0200 Subject: [PATCH] fix: add rule34 API credentials support (required since Aug 2025) --- .env.example | 5 +++++ docker-compose.yml | 2 ++ src/main/java/creator/loki/config/BotConfig.java | 16 +++++++++++++++- .../java/creator/loki/config/ConfigLoader.java | 7 ++++++- .../creator/loki/feature/image/ImageModule.java | 5 +++-- .../creator/loki/feature/image/ImageService.java | 10 +++++++++- 6 files changed, 40 insertions(+), 5 deletions(-) diff --git a/.env.example b/.env.example index 98441a1..24f16fc 100644 --- a/.env.example +++ b/.env.example @@ -35,3 +35,8 @@ LAVALINK_ENABLED=true # === Spotify (для LavaSrc) === SPOTIFY_CLIENT_ID=your_spotify_client_id SPOTIFY_CLIENT_SECRET=your_spotify_client_secret + +# === Rule34 API (обязательно с Aug 2025) === +# Получить: https://rule34.xxx/index.php?page=account&s=options +R34_API_KEY=your_rule34_api_key +R34_USER_ID=your_rule34_user_id diff --git a/docker-compose.yml b/docker-compose.yml index 2f2637a..edbadd9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -36,6 +36,8 @@ services: LAVALINK_PASSWORD: Hch4HiVCxkKs9JPiSnrt4Q SPOTIFY_CLIENT_ID: ${SPOTIFY_CLIENT_ID} SPOTIFY_CLIENT_SECRET: ${SPOTIFY_CLIENT_SECRET} + R34_API_KEY: ${R34_API_KEY} + R34_USER_ID: ${R34_USER_ID} DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY} AI_CHANNEL_ID: ${AI_CHANNEL_ID} AI_CONTEXT_MSGS: ${AI_CONTEXT_MSGS:-10} diff --git a/src/main/java/creator/loki/config/BotConfig.java b/src/main/java/creator/loki/config/BotConfig.java index ef37a09..fdc1827 100644 --- a/src/main/java/creator/loki/config/BotConfig.java +++ b/src/main/java/creator/loki/config/BotConfig.java @@ -18,6 +18,8 @@ public class BotConfig { private final int aiDossierUpdateHours; private final String aiDebateChannelId; private final LavalinkConfig lavalinkConfig; + private final String r34ApiKey; + private final String r34UserId; public BotConfig( String mainToken, @@ -36,7 +38,9 @@ public class BotConfig { int aiDossierMsgs, int aiDossierUpdateHours, String aiDebateChannelId, - LavalinkConfig lavalinkConfig) { + LavalinkConfig lavalinkConfig, + String r34ApiKey, + String r34UserId) { this.mainToken = mainToken; this.musicToken = musicToken; this.radioToken = radioToken; @@ -54,6 +58,8 @@ public class BotConfig { this.aiDossierUpdateHours = aiDossierUpdateHours; this.aiDebateChannelId = aiDebateChannelId; this.lavalinkConfig = lavalinkConfig; + this.r34ApiKey = r34ApiKey; + this.r34UserId = r34UserId; } public String getMainToken() { @@ -127,4 +133,12 @@ public class BotConfig { public LavalinkConfig getLavalinkConfig() { return lavalinkConfig; } + + public String getR34ApiKey() { + return r34ApiKey; + } + + public String getR34UserId() { + return r34UserId; + } } diff --git a/src/main/java/creator/loki/config/ConfigLoader.java b/src/main/java/creator/loki/config/ConfigLoader.java index e9d76a8..1e0a36e 100644 --- a/src/main/java/creator/loki/config/ConfigLoader.java +++ b/src/main/java/creator/loki/config/ConfigLoader.java @@ -83,6 +83,9 @@ public final class ConfigLoader { int aiDossierUpdateHours = Integer.parseInt(getEnv(dotenv, "AI_DOSSIER_UPDATE_HOURS", "24")); String aiDebateChannelId = dotenv.get("AI_DEBATE_CHANNEL_ID"); + String r34ApiKey = getEnv(dotenv, "R34_API_KEY", ""); + String r34UserId = getEnv(dotenv, "R34_USER_ID", ""); + LavalinkConfig lavalinkConfig = getLavalinkConfig(); LoggerDecorator.success(logger, "Конфигурация загружена успешно"); return new BotConfig( @@ -102,6 +105,8 @@ public final class ConfigLoader { aiDossierMsgs, aiDossierUpdateHours, aiDebateChannelId, - lavalinkConfig); + lavalinkConfig, + r34ApiKey, + r34UserId); } } diff --git a/src/main/java/creator/loki/feature/image/ImageModule.java b/src/main/java/creator/loki/feature/image/ImageModule.java index f94e45a..11f19be 100644 --- a/src/main/java/creator/loki/feature/image/ImageModule.java +++ b/src/main/java/creator/loki/feature/image/ImageModule.java @@ -3,6 +3,7 @@ package creator.loki.feature.image; import com.google.inject.AbstractModule; import com.google.inject.Provides; import com.google.inject.Singleton; +import creator.loki.config.BotConfig; public class ImageModule extends AbstractModule { @@ -14,7 +15,7 @@ public class ImageModule extends AbstractModule { @Provides @Singleton - ImageService provideImageService() { - return new ImageService(); + ImageService provideImageService(BotConfig config) { + return new ImageService(config); } } diff --git a/src/main/java/creator/loki/feature/image/ImageService.java b/src/main/java/creator/loki/feature/image/ImageService.java index 82b2f96..c514bc2 100644 --- a/src/main/java/creator/loki/feature/image/ImageService.java +++ b/src/main/java/creator/loki/feature/image/ImageService.java @@ -6,6 +6,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.inject.Inject; import com.google.inject.Singleton; +import creator.loki.config.BotConfig; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; @@ -25,9 +26,13 @@ public class ImageService { "https://api.rule34.xxx/index.php?page=dapi&s=post&q=index&json=1"; private final OkHttpClient client; + private final String r34ApiKey; + private final String r34UserId; @Inject - public ImageService() { + public ImageService(BotConfig config) { + this.r34ApiKey = config.getR34ApiKey(); + this.r34UserId = config.getR34UserId(); this.client = new OkHttpClient.Builder() .connectTimeout(15, TimeUnit.SECONDS) @@ -88,6 +93,9 @@ public class ImageService { int capped = Math.min(limit, 100); String url = R34_API + "&tags=" + encodeTags(tags) + "&limit=" + capped + "&pid=" + (page - 1); + if (!r34ApiKey.isEmpty() && !r34UserId.isEmpty()) { + url += "&api_key=" + r34ApiKey + "&user_id=" + r34UserId; + } return fetchBooruJson(url, limit); }