mirror of
https://github.com/MrUnknownDE/VRCX.git
synced 2026-04-23 08:43:50 +02:00
* refactor: dialogs * fix: storeAvatarImage * FriendLog.vue * FriendLog.vue * FriendLog.vue * GameLog.vue * fix: next day button jumping to the wrong date * sync master * fix: launchGame * Notification.vue * Feed.vue * Search.vue * Profile.vue * PlayerList.vue * Login.vue * utils * update dialog * del gameLog.pug * fix * fix: group role cannot be displayed currently * fix: "Hide Friends in Same Instance" hides players in unrelated private instances (#1210) * fix * fix: "Hide Friends in Same Instance" does not work when "Split Favorite Friends" is enabled * fix Notification.vue message * fix: deleteFavoriteNoConfirm * fix: feed status style * fix: infinite loading when deleting note * fix: private players will not be hidden when 'Hide Friends in Same Instance', and 'Hide Friends in Same Instance' will not work when 'Split Favorite Friends'
169 lines
5.5 KiB
JavaScript
169 lines
5.5 KiB
JavaScript
import { instanceRequest } from '../../api';
|
|
|
|
// TODO: launch, invite, refresh, etc. buttons, better to split into one component
|
|
function refreshInstancePlayerCount(instance) {
|
|
const L = parseLocation(instance);
|
|
if (L.isRealInstance) {
|
|
instanceRequest.getInstance({
|
|
worldId: L.worldId,
|
|
instanceId: L.instanceId
|
|
});
|
|
}
|
|
}
|
|
|
|
function isRealInstance(instanceId) {
|
|
if (!instanceId) {
|
|
return false;
|
|
}
|
|
switch (instanceId) {
|
|
case ':':
|
|
case 'offline':
|
|
case 'offline:offline':
|
|
case 'private':
|
|
case 'private:private':
|
|
case 'traveling':
|
|
case 'traveling:traveling':
|
|
case instanceId.startsWith('local'):
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function displayLocation(location, worldName, groupName) {
|
|
var text = worldName;
|
|
var L = parseLocation(location);
|
|
if (L.isOffline) {
|
|
text = 'Offline';
|
|
} else if (L.isPrivate) {
|
|
text = 'Private';
|
|
} else if (L.isTraveling) {
|
|
text = 'Traveling';
|
|
} else if (L.worldId) {
|
|
if (groupName) {
|
|
text = `${worldName} ${L.accessTypeName}(${groupName})`;
|
|
} else if (L.instanceId) {
|
|
text = `${worldName} ${L.accessTypeName}`;
|
|
}
|
|
}
|
|
return text;
|
|
}
|
|
|
|
function parseLocation(tag) {
|
|
var _tag = String(tag || '');
|
|
var ctx = {
|
|
tag: _tag,
|
|
isOffline: false,
|
|
isPrivate: false,
|
|
isTraveling: false,
|
|
isRealInstance: false,
|
|
worldId: '',
|
|
instanceId: '',
|
|
instanceName: '',
|
|
accessType: '',
|
|
accessTypeName: '',
|
|
region: '',
|
|
shortName: '',
|
|
userId: null,
|
|
hiddenId: null,
|
|
privateId: null,
|
|
friendsId: null,
|
|
groupId: null,
|
|
groupAccessType: null,
|
|
canRequestInvite: false,
|
|
strict: false,
|
|
ageGate: false
|
|
};
|
|
if (_tag === 'offline' || _tag === 'offline:offline') {
|
|
ctx.isOffline = true;
|
|
} else if (_tag === 'private' || _tag === 'private:private') {
|
|
ctx.isPrivate = true;
|
|
} else if (_tag === 'traveling' || _tag === 'traveling:traveling') {
|
|
ctx.isTraveling = true;
|
|
} else if (!_tag.startsWith('local')) {
|
|
ctx.isRealInstance = true;
|
|
var sep = _tag.indexOf(':');
|
|
// technically not part of instance id, but might be there when coping id from url so why not support it
|
|
var shortNameQualifier = '&shortName=';
|
|
var shortNameIndex = _tag.indexOf(shortNameQualifier);
|
|
if (shortNameIndex >= 0) {
|
|
ctx.shortName = _tag.substr(
|
|
shortNameIndex + shortNameQualifier.length
|
|
);
|
|
_tag = _tag.substr(0, shortNameIndex);
|
|
}
|
|
if (sep >= 0) {
|
|
ctx.worldId = _tag.substr(0, sep);
|
|
ctx.instanceId = _tag.substr(sep + 1);
|
|
ctx.instanceId.split('~').forEach((s, i) => {
|
|
if (i) {
|
|
var A = s.indexOf('(');
|
|
var Z = A >= 0 ? s.lastIndexOf(')') : -1;
|
|
var key = Z >= 0 ? s.substr(0, A) : s;
|
|
var value = A < Z ? s.substr(A + 1, Z - A - 1) : '';
|
|
if (key === 'hidden') {
|
|
ctx.hiddenId = value;
|
|
} else if (key === 'private') {
|
|
ctx.privateId = value;
|
|
} else if (key === 'friends') {
|
|
ctx.friendsId = value;
|
|
} else if (key === 'canRequestInvite') {
|
|
ctx.canRequestInvite = true;
|
|
} else if (key === 'region') {
|
|
ctx.region = value;
|
|
} else if (key === 'group') {
|
|
ctx.groupId = value;
|
|
} else if (key === 'groupAccessType') {
|
|
ctx.groupAccessType = value;
|
|
} else if (key === 'strict') {
|
|
ctx.strict = true;
|
|
} else if (key === 'ageGate') {
|
|
ctx.ageGate = true;
|
|
}
|
|
} else {
|
|
ctx.instanceName = s;
|
|
}
|
|
});
|
|
ctx.accessType = 'public';
|
|
if (ctx.privateId !== null) {
|
|
if (ctx.canRequestInvite) {
|
|
// InvitePlus
|
|
ctx.accessType = 'invite+';
|
|
} else {
|
|
// InviteOnly
|
|
ctx.accessType = 'invite';
|
|
}
|
|
ctx.userId = ctx.privateId;
|
|
} else if (ctx.friendsId !== null) {
|
|
// FriendsOnly
|
|
ctx.accessType = 'friends';
|
|
ctx.userId = ctx.friendsId;
|
|
} else if (ctx.hiddenId !== null) {
|
|
// FriendsOfGuests
|
|
ctx.accessType = 'friends+';
|
|
ctx.userId = ctx.hiddenId;
|
|
} else if (ctx.groupId !== null) {
|
|
// Group
|
|
ctx.accessType = 'group';
|
|
}
|
|
ctx.accessTypeName = ctx.accessType;
|
|
if (ctx.groupAccessType !== null) {
|
|
if (ctx.groupAccessType === 'public') {
|
|
ctx.accessTypeName = 'groupPublic';
|
|
} else if (ctx.groupAccessType === 'plus') {
|
|
ctx.accessTypeName = 'groupPlus';
|
|
}
|
|
}
|
|
} else {
|
|
ctx.worldId = _tag;
|
|
}
|
|
}
|
|
return ctx;
|
|
}
|
|
|
|
export {
|
|
refreshInstancePlayerCount,
|
|
isRealInstance,
|
|
displayLocation,
|
|
parseLocation
|
|
};
|