mirror of
https://github.com/MrUnknownDE/VRCX.git
synced 2026-04-20 23:33:50 +02:00
* refactor: frontend * Fix avatar gallery sort * Update .NET dependencies * Update npm dependencies electron v37.1.0 * bulkRefreshFriends * fix dark theme * Remove crowdin * Fix config.json dialog not updating * VRCX log file fixes & add Cef log * Remove SharedVariable, fix startup * Revert init theme change * Logging date not working? Fix WinformThemer designer error * Add Cef request hander, no more escaping main page * clean * fix * fix * clean * uh * Apply thememode at startup, fixes random user colours * Split database into files * Instance info remove empty lines * Open external VRC links with VRCX * Electron fixes * fix userdialog style * ohhhh * fix store * fix store * fix: load all group members after kicking a user * fix: world dialog favorite button style * fix: Clear VRCX Cache Timer input value * clean * Fix VR overlay * Fix VR overlay 2 * Fix Discord discord rich presence for RPC worlds * Clean up age verified user tags * Fix playerList being occupied after program reload * no `this` * Fix login stuck loading * writable: false * Hide dialogs on logout * add flush sync option * rm LOGIN event * rm LOGOUT event * remove duplicate event listeners * remove duplicate event listeners * clean * remove duplicate event listeners * clean * fix theme style * fix t * clearable * clean * fix ipcEvent * Small changes * Popcorn Palace support * Remove checkActiveFriends * Clean up * Fix dragEnterCef * Block API requests when not logged in * Clear state on login & logout * Fix worldDialog instances not updating * use <script setup> * Fix avatar change event, CheckGameRunning at startup * Fix image dragging * fix * Remove PWI * fix updateLoop * add webpack-dev-server to dev environment * rm unnecessary chunks * use <script setup> * webpack-dev-server changes * use <script setup> * use <script setup> * Fix UGC text size * Split login event * t * use <script setup> * fix * Update .gitignore and enable checkJs in jsconfig * fix i18n t * use <script setup> * use <script setup> * clean * global types * fix * use checkJs for debugging * Add watchState for login watchers * fix .vue template * type fixes * rm Vue.filter * Cef v138.0.170, VC++ 2022 * Settings fixes * Remove 'USER:CURRENT' * clean up 2FA callbacks * remove userApply * rm i18n import * notification handling to use notification store methods * refactor favorite handling to use favorite store methods and clean up event emissions * refactor moderation handling to use dedicated functions for player moderation events * refactor friend handling to use dedicated functions for friend events * Fix program startup, move lang init * Fix friend state * Fix status change error * Fix user notes diff * fix * rm group event * rm auth event * rm avatar event * clean * clean * getUser * getFriends * getFavoriteWorlds, getFavoriteAvatars * AvatarGalleryUpload btn style & package.json update * Fix friend requests * Apply user * Apply world * Fix note diff * Fix VR overlay * Fixes * Update build scripts * Apply avatar * Apply instance * Apply group * update hidden VRC+ badge * Fix sameInstance "private" * fix 502/504 API errors * fix 502/504 API errors * clean * Fix friend in same instance on orange showing twice in friends list * Add back in broken friend state repair methods * add types --------- Co-authored-by: Natsumi <cmcooper123@hotmail.com>
98 lines
2.2 KiB
JavaScript
98 lines
2.2 KiB
JavaScript
import { escapeTag } from './string';
|
|
|
|
/**
|
|
*
|
|
* @param {number} sec
|
|
* @param {boolean} isNeedSeconds
|
|
* @returns {string}
|
|
*/
|
|
function timeToText(sec, isNeedSeconds = false) {
|
|
let n = Number(sec);
|
|
if (isNaN(n)) {
|
|
return escapeTag(sec);
|
|
}
|
|
n = Math.floor(n / 1000);
|
|
const arr = [];
|
|
if (n < 0) {
|
|
n = -n;
|
|
}
|
|
if (n >= 86400) {
|
|
arr.push(`${Math.floor(n / 86400)}d`);
|
|
n %= 86400;
|
|
}
|
|
if (n >= 3600) {
|
|
arr.push(`${Math.floor(n / 3600)}h`);
|
|
n %= 3600;
|
|
}
|
|
if (n >= 60) {
|
|
arr.push(`${Math.floor(n / 60)}m`);
|
|
n %= 60;
|
|
}
|
|
if (isNeedSeconds || (arr.length === 0 && n < 60)) {
|
|
arr.push(`${n}s`);
|
|
}
|
|
return arr.join(' ');
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param {number} duration
|
|
* @returns {string}
|
|
*/
|
|
function formatSeconds(duration) {
|
|
const pad = function (num, size) {
|
|
return `000${num}`.slice(size * -1);
|
|
},
|
|
time = parseFloat(duration).toFixed(3),
|
|
hours = Math.floor(time / 60 / 60),
|
|
minutes = Math.floor(time / 60) % 60,
|
|
seconds = Math.floor(time - minutes * 60);
|
|
let hoursOut = '';
|
|
if (hours > '0') {
|
|
hoursOut = `${pad(hours, 2)}:`;
|
|
}
|
|
return `${hoursOut + pad(minutes, 2)}:${pad(seconds, 2)}`;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param {string} duration
|
|
* @returns {number}
|
|
*/
|
|
function convertYoutubeTime(duration) {
|
|
let a = duration.match(/\d+/g);
|
|
if (
|
|
duration.indexOf('M') >= 0 &&
|
|
duration.indexOf('H') === -1 &&
|
|
duration.indexOf('S') === -1
|
|
) {
|
|
a = [0, a[0], 0];
|
|
}
|
|
if (duration.indexOf('H') >= 0 && duration.indexOf('M') === -1) {
|
|
a = [a[0], 0, a[1]];
|
|
}
|
|
if (
|
|
duration.indexOf('H') >= 0 &&
|
|
duration.indexOf('M') === -1 &&
|
|
duration.indexOf('S') === -1
|
|
) {
|
|
a = [a[0], 0, 0];
|
|
}
|
|
let length = 0;
|
|
if (a.length === 3) {
|
|
length += parseInt(a[0], 10) * 3600;
|
|
length += parseInt(a[1], 10) * 60;
|
|
length += parseInt(a[2], 10);
|
|
}
|
|
if (a.length === 2) {
|
|
length += parseInt(a[0], 10) * 60;
|
|
length += parseInt(a[1], 10);
|
|
}
|
|
if (a.length === 1) {
|
|
length += parseInt(a[0], 10);
|
|
}
|
|
return length;
|
|
}
|
|
|
|
export { timeToText, formatSeconds, convertYoutubeTime };
|