mirror of
https://github.com/MrUnknownDE/VRCX.git
synced 2026-04-26 02:03:49 +02:00
refactor store
This commit is contained in:
228
src/shared/utils/discordPresence.js
Normal file
228
src/shared/utils/discordPresence.js
Normal file
@@ -0,0 +1,228 @@
|
||||
import { ActivityType, StatusDisplayType } from '../constants/discord';
|
||||
|
||||
/**
|
||||
* RPC world configuration table.
|
||||
* Maps worldId → { activityType, statusDisplayType, appId, bigIcon }.
|
||||
*/
|
||||
const RPC_WORLD_CONFIGS = new Map([
|
||||
// PyPyDance
|
||||
[
|
||||
'wrld_f20326da-f1ac-45fc-a062-609723b097b1',
|
||||
{
|
||||
activityType: ActivityType.Listening,
|
||||
statusDisplayType: StatusDisplayType.Details,
|
||||
appId: '784094509008551956',
|
||||
bigIcon: 'pypy'
|
||||
}
|
||||
],
|
||||
[
|
||||
'wrld_10e5e467-fc65-42ed-8957-f02cace1398c',
|
||||
{
|
||||
activityType: ActivityType.Listening,
|
||||
statusDisplayType: StatusDisplayType.Details,
|
||||
appId: '784094509008551956',
|
||||
bigIcon: 'pypy'
|
||||
}
|
||||
],
|
||||
[
|
||||
'wrld_04899f23-e182-4a8d-b2c7-2c74c7c15534',
|
||||
{
|
||||
activityType: ActivityType.Listening,
|
||||
statusDisplayType: StatusDisplayType.Details,
|
||||
appId: '784094509008551956',
|
||||
bigIcon: 'pypy'
|
||||
}
|
||||
],
|
||||
// VR Dancing
|
||||
[
|
||||
'wrld_42377cf1-c54f-45ed-8996-5875b0573a83',
|
||||
{
|
||||
activityType: ActivityType.Listening,
|
||||
statusDisplayType: StatusDisplayType.Details,
|
||||
appId: '846232616054030376',
|
||||
bigIcon: 'vr_dancing'
|
||||
}
|
||||
],
|
||||
[
|
||||
'wrld_dd6d2888-dbdc-47c2-bc98-3d631b2acd7c',
|
||||
{
|
||||
activityType: ActivityType.Listening,
|
||||
statusDisplayType: StatusDisplayType.Details,
|
||||
appId: '846232616054030376',
|
||||
bigIcon: 'vr_dancing'
|
||||
}
|
||||
],
|
||||
// ZuwaZuwa Dance
|
||||
[
|
||||
'wrld_52bdcdab-11cd-4325-9655-0fb120846945',
|
||||
{
|
||||
activityType: ActivityType.Listening,
|
||||
statusDisplayType: StatusDisplayType.Details,
|
||||
appId: '939473404808007731',
|
||||
bigIcon: 'zuwa_zuwa_dance'
|
||||
}
|
||||
],
|
||||
[
|
||||
'wrld_2d40da63-8f1f-4011-8a9e-414eb8530acd',
|
||||
{
|
||||
activityType: ActivityType.Listening,
|
||||
statusDisplayType: StatusDisplayType.Details,
|
||||
appId: '939473404808007731',
|
||||
bigIcon: 'zuwa_zuwa_dance'
|
||||
}
|
||||
],
|
||||
// LS Media
|
||||
[
|
||||
'wrld_74970324-58e8-4239-a17b-2c59dfdf00db',
|
||||
{
|
||||
activityType: ActivityType.Watching,
|
||||
statusDisplayType: StatusDisplayType.Details,
|
||||
appId: '968292722391785512',
|
||||
bigIcon: 'ls_media'
|
||||
}
|
||||
],
|
||||
[
|
||||
'wrld_db9d878f-6e76-4776-8bf2-15bcdd7fc445',
|
||||
{
|
||||
activityType: ActivityType.Watching,
|
||||
statusDisplayType: StatusDisplayType.Details,
|
||||
appId: '968292722391785512',
|
||||
bigIcon: 'ls_media'
|
||||
}
|
||||
],
|
||||
[
|
||||
'wrld_435bbf25-f34f-4b8b-82c6-cd809057eb8e',
|
||||
{
|
||||
activityType: ActivityType.Watching,
|
||||
statusDisplayType: StatusDisplayType.Details,
|
||||
appId: '968292722391785512',
|
||||
bigIcon: 'ls_media'
|
||||
}
|
||||
],
|
||||
[
|
||||
'wrld_f767d1c8-b249-4ecc-a56f-614e433682c8',
|
||||
{
|
||||
activityType: ActivityType.Watching,
|
||||
statusDisplayType: StatusDisplayType.Details,
|
||||
appId: '968292722391785512',
|
||||
bigIcon: 'ls_media'
|
||||
}
|
||||
],
|
||||
// Popcorn Palace
|
||||
[
|
||||
'wrld_266523e8-9161-40da-acd0-6bd82e075833',
|
||||
{
|
||||
activityType: ActivityType.Watching,
|
||||
statusDisplayType: StatusDisplayType.Details,
|
||||
appId: '1095440531821170820',
|
||||
bigIcon: 'popcorn_palace'
|
||||
}
|
||||
],
|
||||
[
|
||||
'wrld_27c7e6b2-d938-447e-a270-3d1a873e2cf3',
|
||||
{
|
||||
activityType: ActivityType.Watching,
|
||||
statusDisplayType: StatusDisplayType.Details,
|
||||
appId: '1095440531821170820',
|
||||
bigIcon: 'popcorn_palace'
|
||||
}
|
||||
]
|
||||
]);
|
||||
|
||||
/** Set of Popcorn Palace world IDs (big icon can be overridden by thumbnail) */
|
||||
const POPCORN_PALACE_WORLD_IDS = new Set([
|
||||
'wrld_266523e8-9161-40da-acd0-6bd82e075833',
|
||||
'wrld_27c7e6b2-d938-447e-a270-3d1a873e2cf3'
|
||||
]);
|
||||
|
||||
/**
|
||||
* Get custom world rpc configuration for a specific world ID.
|
||||
* @param {string} worldId
|
||||
* @returns {{ activityType: number, statusDisplayType: number, appId: string, bigIcon: string } | null}
|
||||
*/
|
||||
export function getRpcWorldConfig(worldId) {
|
||||
const config = RPC_WORLD_CONFIGS.get(worldId);
|
||||
if (!config) {
|
||||
return null;
|
||||
}
|
||||
return { ...config };
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a world ID is a Popcorn Palace world.
|
||||
* @param {string} worldId
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function isPopcornPalaceWorld(worldId) {
|
||||
return POPCORN_PALACE_WORLD_IDS.has(worldId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the platform display label for Discord RPC.
|
||||
* @param {string} platform - VRC platform string (e.g. 'standalonewindows', 'android')
|
||||
* @param {boolean} isGameRunning
|
||||
* @param {boolean} isGameNoVR
|
||||
* @param {Function} t - i18n translate function
|
||||
* @returns {string} Platform label string (e.g. ' (VR)', ' (PC)'), or empty string
|
||||
*/
|
||||
export function getPlatformLabel(platform, isGameRunning, isGameNoVR, t) {
|
||||
if (isGameRunning) {
|
||||
return isGameNoVR
|
||||
? ` (${t('view.settings.discord_presence.rpc.desktop')})`
|
||||
: ` (${t('view.settings.discord_presence.rpc.vr')})`;
|
||||
}
|
||||
switch (platform) {
|
||||
case 'web':
|
||||
return '';
|
||||
case 'standalonewindows':
|
||||
return ` (PC)`;
|
||||
case 'android':
|
||||
return ` (Android)`;
|
||||
case 'ios':
|
||||
return ` (iOS)`;
|
||||
default:
|
||||
return platform ? ` (${platform})` : '';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Discord status info from VRC user status.
|
||||
* @param {string} status - VRC user status ('active', 'join me', 'ask me', 'busy')
|
||||
* @param {boolean} discordHideInvite - Whether invite-hiding is enabled
|
||||
* @param {Function} t - i18n translate function
|
||||
* @returns {{ statusName: string, statusImage: string, hidePrivate: boolean }}
|
||||
*/
|
||||
export function getStatusInfo(status, discordHideInvite, t) {
|
||||
switch (status) {
|
||||
case 'active':
|
||||
return {
|
||||
statusName: t('dialog.user.status.active'),
|
||||
statusImage: 'active',
|
||||
hidePrivate: false
|
||||
};
|
||||
case 'join me':
|
||||
return {
|
||||
statusName: t('dialog.user.status.join_me'),
|
||||
statusImage: 'joinme',
|
||||
hidePrivate: false
|
||||
};
|
||||
case 'ask me':
|
||||
return {
|
||||
statusName: t('dialog.user.status.ask_me'),
|
||||
statusImage: 'askme',
|
||||
hidePrivate: discordHideInvite
|
||||
};
|
||||
case 'busy':
|
||||
return {
|
||||
statusName: t('dialog.user.status.busy'),
|
||||
statusImage: 'busy',
|
||||
hidePrivate: true
|
||||
};
|
||||
default:
|
||||
return {
|
||||
statusName: t('dialog.user.status.offline'),
|
||||
statusImage: 'offline',
|
||||
hidePrivate: true
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user