mirror of
https://github.com/MrUnknownDE/VRCX.git
synced 2026-04-20 07:13:51 +02:00
340 lines
14 KiB
JavaScript
340 lines
14 KiB
JavaScript
import { baseClass, $app, API, $t, $utils } from './baseClass.js';
|
|
|
|
export default class extends baseClass {
|
|
constructor(_app, _API, _t) {
|
|
super(_app, _API, _t);
|
|
}
|
|
|
|
init() {
|
|
API.currentUser = {
|
|
$userColour: ''
|
|
};
|
|
|
|
API.getCurrentUser = function () {
|
|
return this.call('auth/user', {
|
|
method: 'GET'
|
|
}).then((json) => {
|
|
var args = {
|
|
json,
|
|
origin: true
|
|
};
|
|
if (
|
|
json.requiresTwoFactorAuth &&
|
|
json.requiresTwoFactorAuth.includes('emailOtp')
|
|
) {
|
|
this.$emit('USER:EMAILOTP', args);
|
|
} else if (json.requiresTwoFactorAuth) {
|
|
this.$emit('USER:2FA', args);
|
|
} else {
|
|
if ($app.debugCurrentUserDiff) {
|
|
var ref = args.json;
|
|
var $ref = this.currentUser;
|
|
var props = {};
|
|
for (var prop in $ref) {
|
|
if ($ref[prop] !== Object($ref[prop])) {
|
|
props[prop] = true;
|
|
}
|
|
}
|
|
for (var prop in ref) {
|
|
if (
|
|
Array.isArray(ref[prop]) &&
|
|
Array.isArray($ref[prop])
|
|
) {
|
|
if (!$app.arraysMatch(ref[prop], $ref[prop])) {
|
|
props[prop] = true;
|
|
}
|
|
} else if (ref[prop] !== Object(ref[prop])) {
|
|
props[prop] = true;
|
|
}
|
|
}
|
|
var has = false;
|
|
for (var prop in props) {
|
|
var asis = $ref[prop];
|
|
var tobe = ref[prop];
|
|
if (asis === tobe) {
|
|
delete props[prop];
|
|
} else {
|
|
if (
|
|
prop.startsWith('$') ||
|
|
prop === 'offlineFriends' ||
|
|
prop === 'onlineFriends' ||
|
|
prop === 'activeFriends'
|
|
) {
|
|
delete props[prop];
|
|
continue;
|
|
}
|
|
props[prop] = [tobe, asis];
|
|
has = true;
|
|
}
|
|
}
|
|
if (has) {
|
|
console.log('API.getCurrentUser diff', props);
|
|
}
|
|
}
|
|
$app.nextCurrentUserRefresh = 420; // 7mins
|
|
this.$emit('USER:CURRENT', args);
|
|
}
|
|
return args;
|
|
});
|
|
};
|
|
|
|
API.$on('USER:CURRENT', function (args) {
|
|
var { json } = args;
|
|
args.ref = this.applyCurrentUser(json);
|
|
|
|
// when isGameRunning use gameLog instead of API
|
|
var $location = $app.parseLocation($app.lastLocation.location);
|
|
var $travelingLocation = $app.parseLocation(
|
|
$app.lastLocationDestination
|
|
);
|
|
var location = $app.lastLocation.location;
|
|
var instanceId = $location.instanceId;
|
|
var worldId = $location.worldId;
|
|
var travelingToLocation = $app.lastLocationDestination;
|
|
var travelingToWorld = $travelingLocation.worldId;
|
|
var travelingToInstance = $travelingLocation.instanceId;
|
|
if (!$app.isGameRunning && json.presence) {
|
|
if ($app.isRealInstance(json.presence.world)) {
|
|
location = `${json.presence.world}:${json.presence.instance}`;
|
|
travelingToLocation = `${json.presence.travelingToWorld}:${json.presence.travelingToInstance}`;
|
|
} else {
|
|
location = json.presence.world;
|
|
travelingToLocation = json.presence.travelingToWorld;
|
|
}
|
|
instanceId = json.presence.instance;
|
|
worldId = json.presence.world;
|
|
travelingToInstance = json.presence.travelingToInstance;
|
|
travelingToWorld = json.presence.travelingToWorld;
|
|
}
|
|
|
|
this.applyUser({
|
|
allowAvatarCopying: json.allowAvatarCopying,
|
|
badges: json.badges,
|
|
bio: json.bio,
|
|
bioLinks: json.bioLinks,
|
|
currentAvatarImageUrl: json.currentAvatarImageUrl,
|
|
currentAvatarTags: json.currentAvatarTags,
|
|
currentAvatarThumbnailImageUrl:
|
|
json.currentAvatarThumbnailImageUrl,
|
|
date_joined: json.date_joined,
|
|
developerType: json.developerType,
|
|
displayName: json.displayName,
|
|
friendKey: json.friendKey,
|
|
// json.friendRequestStatus - missing from currentUser
|
|
id: json.id,
|
|
// instanceId - missing from currentUser
|
|
isFriend: json.isFriend,
|
|
last_activity: json.last_activity,
|
|
last_login: json.last_login,
|
|
last_mobile: json.last_mobile,
|
|
last_platform: json.last_platform,
|
|
// location - missing from currentUser
|
|
// platform - missing from currentUser
|
|
// note - missing from currentUser
|
|
profilePicOverride: json.profilePicOverride,
|
|
// profilePicOverrideThumbnail - missing from currentUser
|
|
pronouns: json.pronouns,
|
|
state: json.state,
|
|
status: json.status,
|
|
statusDescription: json.statusDescription,
|
|
tags: json.tags,
|
|
// travelingToInstance - missing from currentUser
|
|
// travelingToLocation - missing from currentUser
|
|
// travelingToWorld - missing from currentUser
|
|
userIcon: json.userIcon,
|
|
// worldId - missing from currentUser
|
|
fallbackAvatar: json.fallbackAvatar,
|
|
|
|
// Location from gameLog/presence
|
|
location,
|
|
instanceId,
|
|
worldId,
|
|
travelingToLocation,
|
|
travelingToInstance,
|
|
travelingToWorld,
|
|
|
|
// set VRCX online/offline timers
|
|
$online_for: this.currentUser.$online_for,
|
|
$offline_for: this.currentUser.$offline_for,
|
|
$location_at: this.currentUser.$location_at,
|
|
$travelingToTime: this.currentUser.$travelingToTime
|
|
});
|
|
});
|
|
|
|
API.applyCurrentUser = function (json) {
|
|
var ref = this.currentUser;
|
|
if (this.isLoggedIn) {
|
|
if (json.currentAvatar !== ref.currentAvatar) {
|
|
$app.addAvatarToHistory(json.currentAvatar);
|
|
}
|
|
Object.assign(ref, json);
|
|
if (ref.homeLocation !== ref.$homeLocation.tag) {
|
|
ref.$homeLocation = $app.parseLocation(ref.homeLocation);
|
|
// apply home location name to user dialog
|
|
if (
|
|
$app.userDialog.visible &&
|
|
$app.userDialog.id === ref.id
|
|
) {
|
|
$app.getWorldName(API.currentUser.homeLocation).then(
|
|
(worldName) => {
|
|
$app.userDialog.$homeLocationName = worldName;
|
|
}
|
|
);
|
|
}
|
|
}
|
|
ref.$isVRCPlus = ref.tags.includes('system_supporter');
|
|
this.applyUserTrustLevel(ref);
|
|
this.applyUserLanguage(ref);
|
|
this.applyPresenceLocation(ref);
|
|
this.applyQueuedInstance(ref.queuedInstance);
|
|
this.applyPresenceGroups(ref);
|
|
} else {
|
|
ref = {
|
|
acceptedPrivacyVersion: 0,
|
|
acceptedTOSVersion: 0,
|
|
accountDeletionDate: null,
|
|
accountDeletionLog: null,
|
|
activeFriends: [],
|
|
allowAvatarCopying: false,
|
|
badges: [],
|
|
bio: '',
|
|
bioLinks: [],
|
|
currentAvatar: '',
|
|
currentAvatarAssetUrl: '',
|
|
currentAvatarImageUrl: '',
|
|
currentAvatarTags: [],
|
|
currentAvatarThumbnailImageUrl: '',
|
|
date_joined: '',
|
|
developerType: '',
|
|
displayName: '',
|
|
emailVerified: false,
|
|
fallbackAvatar: '',
|
|
friendGroupNames: [],
|
|
friendKey: '',
|
|
friends: [],
|
|
googleId: '',
|
|
hasBirthday: false,
|
|
hasEmail: false,
|
|
hasLoggedInFromClient: false,
|
|
hasPendingEmail: false,
|
|
hideContentFilterSettings: false,
|
|
homeLocation: '',
|
|
id: '',
|
|
isBoopingEnabled: false,
|
|
isFriend: false,
|
|
last_activity: '',
|
|
last_login: '',
|
|
last_mobile: null,
|
|
last_platform: '',
|
|
obfuscatedEmail: '',
|
|
obfuscatedPendingEmail: '',
|
|
oculusId: '',
|
|
offlineFriends: [],
|
|
onlineFriends: [],
|
|
pastDisplayNames: [],
|
|
picoId: '',
|
|
presence: {
|
|
avatarThumbnail: '',
|
|
currentAvatarTags: '',
|
|
displayName: '',
|
|
groups: [],
|
|
id: '',
|
|
instance: '',
|
|
instanceType: '',
|
|
platform: '',
|
|
profilePicOverride: '',
|
|
status: '',
|
|
travelingToInstance: '',
|
|
travelingToWorld: '',
|
|
userIcon: '',
|
|
world: '',
|
|
...json.presence
|
|
},
|
|
profilePicOverride: '',
|
|
pronouns: '',
|
|
queuedInstance: '',
|
|
state: '',
|
|
status: '',
|
|
statusDescription: '',
|
|
statusFirstTime: false,
|
|
statusHistory: [],
|
|
steamDetails: {},
|
|
steamId: '',
|
|
tags: [],
|
|
twoFactorAuthEnabled: false,
|
|
twoFactorAuthEnabledDate: null,
|
|
unsubscribe: false,
|
|
updated_at: '',
|
|
userIcon: '',
|
|
userLanguage: '',
|
|
userLanguageCode: '',
|
|
username: '',
|
|
viveId: '',
|
|
// VRCX
|
|
$online_for: Date.now(),
|
|
$offline_for: '',
|
|
$location_at: Date.now(),
|
|
$travelingToTime: Date.now(),
|
|
$homeLocation: {},
|
|
$isVRCPlus: false,
|
|
$isModerator: false,
|
|
$isTroll: false,
|
|
$isProbableTroll: false,
|
|
$trustLevel: 'Visitor',
|
|
$trustClass: 'x-tag-untrusted',
|
|
$userColour: '',
|
|
$trustSortNum: 1,
|
|
$languages: [],
|
|
$locationTag: '',
|
|
$travelingToLocation: '',
|
|
$vbucks: null,
|
|
...json
|
|
};
|
|
ref.$homeLocation = $app.parseLocation(ref.homeLocation);
|
|
ref.$isVRCPlus = ref.tags.includes('system_supporter');
|
|
this.applyUserTrustLevel(ref);
|
|
this.applyUserLanguage(ref);
|
|
this.applyPresenceLocation(ref);
|
|
this.applyPresenceGroups(ref);
|
|
this.currentUser = ref;
|
|
this.isLoggedIn = true;
|
|
this.$emit('LOGIN', {
|
|
json,
|
|
ref
|
|
});
|
|
}
|
|
return ref;
|
|
};
|
|
|
|
/**
|
|
* @typedef {{
|
|
* status: 'active' | 'offline' | 'busy' | 'ask me' | 'join me',
|
|
* statusDescription: string
|
|
* }} SaveCurrentUserParameters
|
|
*/
|
|
|
|
/**
|
|
* Updates current user's status.
|
|
* @param params {SaveCurrentUserParameters} new status to be set
|
|
* @returns {Promise<{json: any, params}>}
|
|
*/
|
|
API.saveCurrentUser = function (params) {
|
|
return this.call(`users/${this.currentUser.id}`, {
|
|
method: 'PUT',
|
|
params
|
|
}).then((json) => {
|
|
var args = {
|
|
json,
|
|
params
|
|
};
|
|
this.$emit('USER:CURRENT:SAVE', args);
|
|
return args;
|
|
});
|
|
};
|
|
}
|
|
|
|
_data = {};
|
|
|
|
_methods = {};
|
|
}
|