Skip to content

Commit

Permalink
[FEATURE][DOCS] Updated DiscordGame module (#71)
Browse files Browse the repository at this point in the history
* [FEATURE][DOCS] Updated DiscordGame module

- Переделан конфиг модуля, необходимо перенести с старой версии данные
- Разделение на 3 части, стадии перед авторизацией, после авторизации и при запущенном клиенте игры

* Updated names and replaced HashMap to LinkedHashMap

* Format code and remove redundant update calls
  • Loading branch information
microwin7 committed Jun 28, 2023
1 parent 149bca0 commit a42c5e7
Show file tree
Hide file tree
Showing 7 changed files with 179 additions and 108 deletions.
65 changes: 45 additions & 20 deletions DiscordGame_lmodule/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,37 +24,64 @@
```json
{
"enable": true,
"appId": 810913859371532298, //APPLICATION ID
"launcherDetails": "Лучший проект Minecraft", //Текст при запущенном лаунчере (не авторизован)
"launcherState": "В лаунчере", //Вторичный текст при запущенном лаунчере (не авторизован)
"largeKey": "large", //Имя главной картинки
"smallKey": "small", //Имя вторичной картинки (миниатюры)
"largeText": "Everything", //Текст большой картинки
"smallText": "Everything", //Текст вторичной картинки (миниатюры)
"clientDetails": "Лучший проект Minecraft", //Текст при запущенном клиенте
"clientState": "Играет на %profileName%", //Вторичный текст при запущенном клиенте
"authorizedDetails": "Лучший проект Minecraft", //Текст при запущенном лаунчере (авторизован)
"authorizedState": "Выбирает сервер", //Вторичный текст при запущенном лаунчере (авторизован)
"clientLargeKey": "large", //Имя главной картинки клиента
"clientSmallKey": "small", //Имя вторичной картинки клиента (миниатюры)
"clientLargeText": "Everything", //Текст большой картинки
"clientSmallText": "Everything", //Текст вторичной картинки (миниатюры)
"profileNameKeyMappings": {} //Не работает! Ранее, должен был применять изображения к профилям
"appId": 810913859371532298,
"scopes": {
"login": {
"details": "Лучший проект Minecraft",
"state": "Авторизуется",
"largeImageKey": "large",
"smallImageKey": "small",
"largeImageText": "Everything",
"smallImageText": "Everything"
},
"authorized": {
"details": "Лучший проект Minecraft",
"state": "Выбирает сервер",
"largeImageKey": "large",
"smallImageKey": "small",
"largeImageText": "Everything",
"smallImageText": "Everything"
},
"client": {
"details": "Лучший проект Minecraft",
"state": "Играет на %profileName%",
"largeImageKey": "large",
"smallImageKey": "small",
"largeImageText": "Everything",
"smallImageText": "Everything"
}
}
}
```
- `details` - Первая строка состояния, после имени приложения
- `state` - Вторая строка состояния, после имени приложения
- `largeImageKey` - Имя главной картинки (Допускается ссылка URL на PNG больше 512x512)
- `smallImageKey` - Имя вторичной, миниатюрной картинки (Допускается ссылка URL на PNG больше 512x512)
- `largeImageText` - Текст большой картинки
- `smallImageText` - Текст вторичной, миниатюрной картинки

**Копировать не рекомендуется!**

### Немного пояснений:
- Имя приложения, отображается как название игры!
- `scopes -> login` - Отображается при загрузке лаунчера, без данных пользователя
- `scopes -> authorized` - Отображается после авторизации в лаунчере
- `scopes -> client` - Отображается после запуска клиента игры
- ![](example/user_popout.png)
- `%profileName%` - это плейсхолдер, заменяющий собой, имя запущенного клиента (больше плейсхолдеров ниже)

### Получаем "APPLICATION ID":
1. Заходим на сайт: https://discord.com/developers/applications
2. Создаём новое приложение
3. Копируем `APPLICATION ID` в `appId` конфигурации модуля

### Отображение аватара пользователя
1. Убедитесь что у вас есть скрипт, отдаваемый в разрешении 512x512 аватар скина
2. Работает только в `scopes -> authorized` и `scopes -> client` на поля `largeImageKey`, `smallImageKey`, из-за заполнителя `%username%`
3. Ваша ссылка не должна превышать с плейсхолдером пользователя: `%username%` - 127 байтов. (Можно исправить исходники **[discord-game-sdk4j-0.5.x.jar]**, если очень надо)

### Своя картинка, под каждый профиль:
1. В `clientLargeKey` или `clientSmallKey` вставляем один из плейсхолдеров: `%profileUUID%` или `%profileHash%`
1. В `largeImageKey` или `smallImageKey` в `scopes -> client` вставляем один из плейсхолдеров: `%profileUUID%` или `%profileHash%`
2. Называем изображение профиля, соответствующему ему UUID или Hash

### Как загрузить необходимое изображение:
Expand All @@ -63,7 +90,7 @@
3. Нажимаем на кнопку "Add Image(s)" и загружаем необходимые вам изображения
4. Переименовываем загруженные изображения в более удобный вид (Не обязательно)

**Модуль игнорирует аватар вашего приложения!**
**Модуль игнорирует App Icon вашего приложения!**

---

Expand All @@ -75,8 +102,6 @@
- `%profileUUID%` - UUID профиля
- `%profileHash%` - Hash профиля (UUID без `-`)
- `%username%` - Имя пользователя
- `%skinurl%` - URL скина
- `%cloakurl%` - URL плаща
- `%launcherVersion%` - Версия лаунчера
- `%javaVersion%` - Версия используемой Java
- `%javaBits%` - Разрядность используемой Java
Expand Down
Binary file added DiscordGame_lmodule/example/user_popout.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,9 @@
import de.jcm.discordgamesdk.activity.Activity;
import pro.gravit.launcher.client.ClientLauncherProcess;
import pro.gravit.launcher.profiles.PlayerProfile;
import pro.gravit.launcher.profiles.Texture;
import pro.gravit.launchermodules.discordgame.ClientModule;
import pro.gravit.launchermodules.discordgame.Config;
import pro.gravit.launchermodules.discordgame.DiscordBridge;
import pro.gravit.launchermodules.discordgame.ScopeConfig;
import pro.gravit.utils.Version;
import pro.gravit.utils.helper.JVMHelper;
import pro.gravit.utils.helper.LogHelper;
Expand Down Expand Up @@ -73,7 +72,6 @@ public String getDetails() {

public void setDetails(String details) {
this.details = replaceParams(details);
updateActivity();
}

public String getState() {
Expand All @@ -82,7 +80,6 @@ public String getState() {

public void setState(String state) {
this.state = replaceParams(state);
updateActivity();
}

public String getLargeKey() {
Expand All @@ -91,7 +88,6 @@ public String getLargeKey() {

public void setLargeKey(String largeKey) {
this.largeKey = replaceParams(largeKey);
updateActivity();
}

public String getSmallKey() {
Expand All @@ -100,7 +96,6 @@ public String getSmallKey() {

public void setSmallKey(String smallKey) {
this.smallKey = replaceParams(smallKey);
updateActivity();
}

public String getLargeText() {
Expand All @@ -109,7 +104,6 @@ public String getLargeText() {

public void setLargeText(String largeText) {
this.largeText = replaceParams(largeText);
updateActivity();
}

public String getSmallText() {
Expand All @@ -118,7 +112,6 @@ public String getSmallText() {

public void setSmallText(String smallText) {
this.smallText = replaceParams(smallText);
updateActivity();
}

public String getPartyId() {
Expand Down Expand Up @@ -176,49 +169,40 @@ public String replaceParams(String str) {
return result;
}

public void onLauncherStart() {
Config config = ClientModule.config;
setDetails(config.launcherDetails);
setState(config.launcherState);
setLargeKey(config.largeKey);
setLargeText(config.largeText);
setSmallKey(config.smallKey);
setSmallText(config.smallText);
public void updateLoginStage() {
setParam("username", null);
setParam("uuid", null);
setScope(ClientModule.loginScopeConfig);
}

public void onClientStart(ClientLauncherProcess.ClientParams params) {
public void updateAuthorizedStage(PlayerProfile playerProfile) {
onPlayerProfile(playerProfile);
setScope(ClientModule.authorizedScopeConfig);
}

public void updateClientStage(ClientLauncherProcess.ClientParams params) {
setParam("profileVersion", params.profile.getVersion().toString());
setParam("profileName", params.profile.getTitle());
setParam("profileUUID", params.profile.getUUID().toString());
setParam("profileHash", params.profile.getUUID().toString().replaceAll("-", ""));
onPlayerProfile(params.playerProfile);
Config config = ClientModule.config;
setDetails(config.clientDetails);
setState(config.clientState);
setLargeKey(config.clientLargeKey);
setLargeText(config.clientLargeText);
setSmallKey(config.clientSmallKey);
setSmallText(config.clientSmallText);
setScope(ClientModule.clientScopeConfig);
}

public void onPlayerProfile(PlayerProfile playerProfile) {
setParam("username", playerProfile.username);
setParam("uuid", playerProfile.uuid.toString());
Texture skin = playerProfile.assets.get("SKIN");
if (skin != null) {
setParam("skinurl", skin.url);
}
Texture cape = playerProfile.assets.get("CAPE");
if (cape != null) {
setParam("cloakurl", cape.url);
}
}

public void onLauncherAuth(PlayerProfile playerProfile) {
onPlayerProfile(playerProfile);
Config config = ClientModule.config;
setDetails(config.authorizedDetails);
setState(config.authorizedState);
private void setScope(ScopeConfig scopeConfig) {
LogHelper.dev(scopeConfig.toString());
setDetails(scopeConfig.getDetails());
setState(scopeConfig.getState());
setLargeKey(scopeConfig.getLargeImageKey());
setLargeText(scopeConfig.getLargeImageText());
setSmallKey(scopeConfig.getSmallImageKey());
setSmallText(scopeConfig.getSmallImageText());
updateActivity();
}

public void resetStartTime() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ public class ClientModule extends LauncherModule {
public static final Version version = new Version(1, 1, 0, 1, Version.Type.LTS);
private static final Object lock = new Object();
public static Config config;
public static ScopeConfig loginScopeConfig;
public static ScopeConfig authorizedScopeConfig;
public static ScopeConfig clientScopeConfig;
private static volatile boolean isClosed = false;

public ClientModule() {
Expand All @@ -41,14 +44,17 @@ public static boolean isClosed(boolean flag) {
@Override
public void init(LauncherInitContext initContext) {
config = new Config();
loginScopeConfig = new ScopeConfig(config.scopes.get("login"));
authorizedScopeConfig = new ScopeConfig(config.scopes.get("authorized"));
clientScopeConfig = new ScopeConfig(config.scopes.get("client"));
registerEvent(this::clientInit, ClientProcessLaunchEvent.class);
registerEvent(this::launcherInit, ClientEngineInitPhase.class);
registerEvent(this::exitHandler, ClientExitPhase.class);
registerEvent(this::exitByStartClient, ClientProcessBuilderParamsWrittedEvent.class);
}

private void clientInit(ClientProcessLaunchEvent phase) {
DiscordBridge.activityService.onClientStart(phase.params);
DiscordBridge.activityService.updateClientStage(phase.params);
try {
DiscordBridge.init(config.appId);
RequestEventWatcher.INSTANCE = new RequestEventWatcher(true);
Expand All @@ -63,7 +69,7 @@ private void unlock(ClientUnlockConsoleEvent event) {
}

private void launcherInit(ClientEngineInitPhase phase) {
DiscordBridge.activityService.onLauncherStart();
DiscordBridge.activityService.updateLoginStage();
try {
DiscordBridge.init(config.appId);
RequestEventWatcher.INSTANCE = new RequestEventWatcher(false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,64 +2,33 @@

import pro.gravit.launcher.LauncherInject;

import java.util.HashMap;
import java.util.Map;
import java.util.*;

public class Config {
@LauncherInject(value = "modules.discordgame.enable")
public boolean enable;
@LauncherInject(value = "modules.discordgame.appid")
public long appId;
@LauncherInject(value = "modules.discordgame.launcherdetails")
public String launcherDetails;
@LauncherInject(value = "modules.discordgame.launcherstate")
public String launcherState;
@LauncherInject(value = "modules.discordgame.largekey")
public String largeKey;
@LauncherInject(value = "modules.discordgame.smallkey")
public String smallKey;
@LauncherInject(value = "modules.discordgame.largetext")
public String largeText;
@LauncherInject(value = "modules.discordgame.smalltext")
public String smallText;
@LauncherInject(value = "modules.discordgame.clientdetails")
public String clientDetails;
@LauncherInject(value = "modules.discordgame.clientstate")
public String clientState;
@LauncherInject(value = "modules.discordgame.authorizeddetails")
public String authorizedDetails;
@LauncherInject(value = "modules.discordgame.authorizedstate")
public String authorizedState;
@LauncherInject(value = "modules.discordgame.clientlargekey")
public String clientLargeKey;
@LauncherInject(value = "modules.discordgame.clientsmallkey")
public String clientSmallKey;
@LauncherInject(value = "modules.discordgame.clientlargetext")
public String clientLargeText;
@LauncherInject(value = "modules.discordgame.clientsmalltext")
public String clientSmallText;
@LauncherInject(value = "modules.discordgame.profilenamekeymappings")
public Map<String, String> profileNameKeyMappings;
@LauncherInject(value = "modules.discordgame.scopes")
public Map<String, Map<String, String>> scopes;

public static Object getDefault() {
Config config = new Config();
config.enable = true;
config.appId = 810913859371532298L;
config.launcherDetails = "Лучший проект Minecraft";
config.clientDetails = "Лучший проект Minecraft";
config.authorizedDetails = "Лучший проект Minecraft";
config.launcherState = "В лаунчере";
config.authorizedState = "Выбирает сервер";
config.clientState = "Играет на %profileName%";
config.largeKey = "large";
config.smallKey = "small";
config.largeText = "Everything";
config.smallText = "Everything";
config.clientLargeKey = "large";
config.clientSmallKey = "small";
config.clientLargeText = "Everything";
config.clientSmallText = "Everything";
config.profileNameKeyMappings = new HashMap<>();

config.scopes = new LinkedHashMap<>();

config.scopes.put("login",
new ScopeConfig("Лучший проект Minecraft", "Авторизуется",
"large", "small", "Everything", "Everything").toMap());
config.scopes.put("authorized",
new ScopeConfig("Лучший проект Minecraft", "Выбирает сервер",
"large", "small", "Everything", "Everything").toMap());
config.scopes.put("client",
new ScopeConfig("Лучший проект Minecraft", "Играет на %profileName%",
"large", "small", "Everything", "Everything").toMap());

return config;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package pro.gravit.launchermodules.discordgame;

import pro.gravit.launcher.events.request.AuthRequestEvent;
import pro.gravit.launcher.events.request.ExitRequestEvent;
import pro.gravit.launcher.request.RequestService;
import pro.gravit.launcher.request.WebSocketEvent;

Expand All @@ -15,8 +16,15 @@ public RequestEventWatcher(boolean isClientInstance) {
@Override
public <T extends WebSocketEvent> boolean eventHandle(T event) {
if (event instanceof AuthRequestEvent && ((AuthRequestEvent) event).playerProfile != null) {
AuthRequestEvent event1 = (AuthRequestEvent) event;
DiscordBridge.activityService.onLauncherAuth(event1.playerProfile);
AuthRequestEvent authrequestevent = (AuthRequestEvent) event;
DiscordBridge.activityService.updateAuthorizedStage(authrequestevent.playerProfile);
}
if (event instanceof ExitRequestEvent) {
ExitRequestEvent exitEvent = (ExitRequestEvent) event;
if (exitEvent.reason == ExitRequestEvent.ExitReason.NO_EXIT) {
return false;
}
DiscordBridge.activityService.updateLoginStage();
}
return false;
}
Expand Down

0 comments on commit a42c5e7

Please sign in to comment.