Skip to content

Commit ee9095e

Browse files
committed
Allow user use unofficial game assets mirror when mojang api get into trouble, now supports BMCLAPI and MCBBSAPI
1 parent 456dade commit ee9095e

File tree

9 files changed

+122
-19
lines changed

9 files changed

+122
-19
lines changed

src/main/java/org/maxgamer/quickshop/QuickShop.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1902,6 +1902,7 @@ private void updateConfig(int selectedVersion) throws IOException {
19021902
if (selectedVersion == 141) {
19031903
getConfig().set("language", null);
19041904
getConfig().set("disabled-languages", Collections.singletonList("disable_here"));
1905+
getConfig().set("mojangapi-mirror", 0);
19051906
getConfig().set("config-version", ++selectedVersion);
19061907
}
19071908

src/main/java/org/maxgamer/quickshop/util/language/game/MojangGameLanguageImpl.java

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
import org.maxgamer.quickshop.util.MsgUtil;
4040
import org.maxgamer.quickshop.util.ReflectFactory;
4141
import org.maxgamer.quickshop.util.Util;
42-
import org.maxgamer.quickshop.util.mojangapi.MojangAPI;
42+
import org.maxgamer.quickshop.util.mojangapi.*;
4343

4444
import java.io.File;
4545
import java.io.FileInputStream;
@@ -66,6 +66,7 @@ public class MojangGameLanguageImpl extends BukkitGameLanguageImpl implements Ga
6666
private final QuickShop plugin;
6767
@Nullable
6868
private final JsonObject lang;
69+
private MojangApiMirror mirror;
6970

7071
@SneakyThrows
7172
public MojangGameLanguageImpl(@NotNull QuickShop plugin, @NotNull String languageCode) {
@@ -93,9 +94,36 @@ public MojangGameLanguageImpl(@NotNull QuickShop plugin, @NotNull String languag
9394
}
9495
}
9596
languageCode = languageCode.replace("-", "_").toLowerCase(Locale.ROOT);
97+
98+
switch (plugin.getConfig().getInt("mojangapi-mirror",0)){
99+
case 0:
100+
mirror = new MojangApiOfficialMirror();
101+
plugin.getLogger().info("Game assets server selected: Mojang API");
102+
break;
103+
case 1:
104+
mirror = new MojangApiBmclApiMirror();
105+
plugin.getLogger().info("Game assets server selected: BMCLAPI");
106+
plugin.getLogger().info("===Mirror description===");
107+
plugin.getLogger().info("BMCLAPI is a non-profit mirror service made by @bangbang93 to speed up download in China mainland region.");
108+
plugin.getLogger().info("Donate BMCLAPI or get details about BMCLAPI, check here: https://bmclapidoc.bangbang93.com");
109+
plugin.getLogger().info("You should only use this mirror if your server in China mainland or have connection trouble with Mojang server, otherwise use Mojang Official server");
110+
plugin.getLogger().warning("You're selected unofficial game assets server, use at your own risk.");
111+
break;
112+
case 2:
113+
mirror = new MojangApiMcbbsApiMirror();
114+
plugin.getLogger().info("Game assets server selected: BMCLAPI");
115+
plugin.getLogger().info("===Mirror description===");
116+
plugin.getLogger().info("MCBBSAPI is a special server of OpenBMCLAPI made by @bangbang93 but managed by MCBBS, same with BMCLAPI, MCBBSAPI is target speed up download in China mainland region.");
117+
plugin.getLogger().info("Donate BMCLAPI or get details about BMCLAPI (includes MCBBSAPI), check here: https://bmclapidoc.bangbang93.com");
118+
plugin.getLogger().info("You should only use this mirror if your server in China mainland or have connection trouble with Mojang server, otherwise use Mojang Official server");
119+
plugin.getLogger().warning("You're selected unofficial game assets server, use at your own risk.");
120+
break;
121+
}
122+
123+
96124
LOCK.lock();
97125
try {
98-
final GameLanguageLoadThread loadThread = new GameLanguageLoadThread(plugin, languageCode);
126+
final GameLanguageLoadThread loadThread = new GameLanguageLoadThread(plugin, languageCode,mirror);
99127
loadThread.start();
100128
boolean timeout = !DOWNLOAD_CONDITION.await(20, TimeUnit.SECONDS);
101129
if (timeout) {
@@ -106,6 +134,7 @@ public MojangGameLanguageImpl(@NotNull QuickShop plugin, @NotNull String languag
106134
} finally {
107135
LOCK.unlock();
108136
}
137+
109138
}
110139

111140
@Override
@@ -199,10 +228,12 @@ static class GameLanguageLoadThread extends Thread {
199228
private JsonObject lang;
200229
private boolean isLatest = false; //Does assets is latest?
201230
private boolean isUpdated = false; //Did we tried update assets?
231+
private MojangApiMirror mirror;
202232

203-
public GameLanguageLoadThread(@NotNull QuickShop plugin, @NotNull String languageCode) {
233+
public GameLanguageLoadThread(@NotNull QuickShop plugin, @NotNull String languageCode,@NotNull MojangApiMirror mirror) {
204234
this.plugin = plugin;
205235
this.languageCode = languageCode;
236+
this.mirror = mirror;
206237
}
207238

208239
@Override
@@ -260,7 +291,7 @@ public void execute() {
260291
plugin.getLogger().info("Loading required files from Mojang API, Please allow up to 20 secs.");
261292

262293
//Download new things from Mojang launcher meta site
263-
MojangAPI mojangAPI = new MojangAPI();
294+
MojangAPI mojangAPI = new MojangAPI(mirror);
264295
MojangAPI.AssetsAPI assetsAPI = mojangAPI.getAssetsAPI(ReflectFactory.getServerVersion());
265296
if (!assetsAPI.isAvailable()) { //This version no meta can be found, bug?
266297
Util.debugLog("AssetsAPI returns not available, This may caused by Mojang servers down or connection issue.");

src/main/java/org/maxgamer/quickshop/util/mojangapi/MojangAPI.java

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import com.google.gson.JsonParser;
2727
import lombok.AllArgsConstructor;
2828
import lombok.Data;
29-
import lombok.NoArgsConstructor;
3029
import lombok.SneakyThrows;
3130
import org.jetbrains.annotations.NotNull;
3231
import org.jetbrains.annotations.Nullable;
@@ -41,15 +40,15 @@
4140
import java.util.concurrent.TimeUnit;
4241

4342
public class MojangAPI {
44-
45-
public MojangAPI() {
46-
43+
private MojangApiMirror mirror;
44+
public MojangAPI(MojangApiMirror mirror) {
45+
this.mirror = mirror;
4746
}
4847

4948

5049
@NotNull
5150
public AssetsAPI getAssetsAPI(@NotNull String serverVersion) {
52-
return new AssetsAPI(serverVersion);
51+
return new AssetsAPI(mirror,serverVersion);
5352
}
5453

5554
@NotNull
@@ -59,11 +58,11 @@ public GameInfoAPI getGameInfoAPI(@NotNull String gameVersionJson) {
5958

6059
@NotNull
6160
public MetaAPI getMetaAPI(@NotNull String serverVersion) {
62-
return new MetaAPI(serverVersion);
61+
return new MetaAPI(mirror,serverVersion);
6362
}
6463

6564
public ResourcesAPI getResourcesAPI() {
66-
return new ResourcesAPI();
65+
return new ResourcesAPI(mirror);
6766
}
6867

6968

@@ -76,15 +75,19 @@ public static class AssetsFileData {
7675
}
7776

7877
@Data
79-
@NoArgsConstructor
8078
public static class ResourcesAPI {
8179
private final LoadingCache<URL, Optional<String>> request = CacheBuilder.newBuilder()
8280
.expireAfterAccess(10, TimeUnit.MINUTES)
8381
.build(new HttpCacheLoader());
82+
private final MojangApiMirror apiMirror;
83+
84+
public ResourcesAPI(MojangApiMirror mirror){
85+
this.apiMirror = mirror;
86+
}
8487

8588
public Optional<String> get(@NotNull String hash) {
8689
try {
87-
return request.get(new URL("https://resources.download.minecraft.net/" + hash.substring(0, 2) + "/" + hash));
90+
return request.get(new URL(apiMirror.getResourcesDownloadRoot()+"/" + hash.substring(0, 2) + "/" + hash));
8891
} catch (ExecutionException | MalformedURLException e) {
8992
return Optional.empty();
9093
}
@@ -98,8 +101,8 @@ public static class AssetsAPI {
98101
.build(new HttpCacheLoader());
99102
private final MetaAPI metaAPI;
100103

101-
AssetsAPI(@NotNull String version) {
102-
this.metaAPI = new MetaAPI(version);
104+
AssetsAPI(@NotNull MojangApiMirror apiMirror, @NotNull String version) {
105+
this.metaAPI = new MetaAPI(apiMirror,version);
103106
}
104107

105108
public boolean isAvailable() {
@@ -198,9 +201,9 @@ public static class MetaAPI {
198201
private final String version;
199202

200203
@SneakyThrows
201-
public MetaAPI(@NotNull String version) {
204+
public MetaAPI(@NotNull MojangApiMirror mirror, @NotNull String version) {
202205
this.version = version;
203-
this.metaEndpoint = new URL("https://launchermeta.mojang.com/mc/game/version_manifest.json");
206+
this.metaEndpoint = new URL(mirror.getLauncherMetaRoot()+"/mc/game/version_manifest.json");
204207
}
205208

206209
/**
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.maxgamer.quickshop.util.mojangapi;
2+
3+
public class MojangApiBmclApiMirror implements MojangApiMirror{
4+
@Override
5+
public String getLauncherMetaRoot() {
6+
return "https://bmclapi2.bangbang93.com";
7+
}
8+
9+
@Override
10+
public String getResourcesDownloadRoot() {
11+
return "https://bmclapi2.bangbang93.com/assets";
12+
}
13+
14+
@Override
15+
public String getLibrariesRoot() {
16+
return "https://bmclapi2.bangbang93.com/maven";
17+
}
18+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.maxgamer.quickshop.util.mojangapi;
2+
3+
public class MojangApiMcbbsApiMirror implements MojangApiMirror{
4+
@Override
5+
public String getLauncherMetaRoot() {
6+
return "https://download.mcbbs.net";
7+
}
8+
9+
@Override
10+
public String getResourcesDownloadRoot() {
11+
return "https://download.mcbbs.net/assets";
12+
}
13+
14+
@Override
15+
public String getLibrariesRoot() {
16+
return "https://download.mcbbs.net/maven";
17+
}
18+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.maxgamer.quickshop.util.mojangapi;
2+
3+
public interface MojangApiMirror {
4+
String getLauncherMetaRoot();
5+
String getResourcesDownloadRoot();
6+
String getLibrariesRoot();
7+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.maxgamer.quickshop.util.mojangapi;
2+
3+
public class MojangApiOfficialMirror implements MojangApiMirror{
4+
@Override
5+
public String getLauncherMetaRoot() {
6+
return "https://launchermeta.mojang.com";
7+
}
8+
9+
@Override
10+
public String getResourcesDownloadRoot() {
11+
return "https://resources.download.minecraft.net";
12+
}
13+
14+
@Override
15+
public String getLibrariesRoot() {
16+
return "https://libraries.minecraft.net";
17+
}
18+
}

src/main/resources/config.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ config-version: 142
3333
#Enter the language Code here (e.g English (en-US) -> Language Code = en-US).
3434
game-language: default
3535

36+
# 0=Official
37+
# 1=BMCLAPI (Unofficial China Mirror, https://bmclapidoc.bangbang93.com)
38+
# 2=MCBBSMirror (Another OpenBMCLAPI server, https://www.mcbbs.net)
39+
# You can choose which one you want to use for downloading resources.
40+
# By default, QuickShop use Mojang official servers to downloading resources.
41+
mojangapi-mirror: 0
42+
3643
disabled-languages:
3744
- disable_here
3845

src/test/java/org/maxgamer/quickshop/util/mojangapi/MojangAPITest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,15 @@
2727
public class MojangAPITest {
2828
@Test
2929
public void testMojangMetaApi() {
30-
MojangAPI api = new MojangAPI();
30+
MojangAPI api = new MojangAPI(new MojangApiOfficialMirror());
3131
Optional<String> metaData = api.getMetaAPI("1.16.5").get();
3232
Assert.assertTrue(metaData.isPresent());
3333
Assert.assertFalse(metaData.get().isEmpty());
3434
}
3535

3636
@Test
3737
public void testMojangAssetsApi() {
38-
MojangAPI api = new MojangAPI();
38+
MojangAPI api = new MojangAPI(new MojangApiOfficialMirror());
3939
MojangAPI.AssetsAPI assetsAPI = api.getAssetsAPI("1.16.5");
4040
Assert.assertTrue(assetsAPI.isAvailable());
4141
Optional<MojangAPI.AssetsFileData> assetsFileData = assetsAPI.getGameAssetsFile();

0 commit comments

Comments
 (0)