mirror of
https://github.com/vrcx-team/VRCX.git
synced 2026-04-06 00:32:02 +02:00
Random fixes
This commit is contained in:
@@ -143,7 +143,7 @@ namespace VRCX
|
||||
var output = new Dictionary<string, Dictionary<string, object>>();
|
||||
using var regKey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\VRChat\VRChat");
|
||||
if (regKey == null)
|
||||
throw new Exception("Nothing to backup.");
|
||||
throw new Exception("Failed to get VRC registry data");
|
||||
|
||||
var keys = regKey.GetValueNames();
|
||||
|
||||
|
||||
@@ -24,6 +24,26 @@ namespace VRCX
|
||||
var fileName = Path.GetFileNameWithoutExtension(path);
|
||||
if (!File.Exists(path) || !path.EndsWith(".png") || !fileName.StartsWith("VRChat_"))
|
||||
return string.Empty;
|
||||
|
||||
// check if file is in use and we have permission to write
|
||||
var success = false;
|
||||
for (var i = 0; i < 10; i++)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (File.Open(path, FileMode.Append, FileAccess.Write, FileShare.None))
|
||||
{
|
||||
success = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (IOException)
|
||||
{
|
||||
Thread.Sleep(1000);
|
||||
}
|
||||
}
|
||||
if (!success)
|
||||
return string.Empty;
|
||||
|
||||
if (changeFilename)
|
||||
{
|
||||
|
||||
@@ -14,7 +14,6 @@ namespace VRCX
|
||||
public partial class AppApi
|
||||
{
|
||||
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
||||
private static readonly MD5 _hasher = MD5.Create();
|
||||
|
||||
public void Init()
|
||||
{
|
||||
@@ -30,7 +29,8 @@ namespace VRCX
|
||||
|
||||
public int GetColourFromUserID(string userId)
|
||||
{
|
||||
var hash = _hasher.ComputeHash(Encoding.UTF8.GetBytes(userId));
|
||||
using var hasher = MD5.Create();
|
||||
var hash = hasher.ComputeHash(Encoding.UTF8.GetBytes(userId));
|
||||
return (hash[3] << 8) | hash[4];
|
||||
}
|
||||
|
||||
|
||||
@@ -30,19 +30,24 @@ namespace VRCX
|
||||
_steamPath = Path.Join(_homeDirectory, ".local/share/Steam");
|
||||
|
||||
var flatpakSteamPath = Path.Join(_homeDirectory, ".var/app/com.valvesoftware.Steam/.local/share/Steam");
|
||||
if (!Directory.Exists(_steamPath) && Directory.Exists(flatpakSteamPath))
|
||||
if (!IsValidSteamPath(_steamPath) && IsValidSteamPath(flatpakSteamPath))
|
||||
{
|
||||
logger.Info("Flatpak Steam detected.");
|
||||
_steamPath = flatpakSteamPath;
|
||||
}
|
||||
|
||||
var legacySteamPath = Path.Join(_homeDirectory, ".steam/steam");
|
||||
if (!Directory.Exists(_steamPath) && Directory.Exists(legacySteamPath))
|
||||
if (!IsValidSteamPath(_steamPath) && IsValidSteamPath(legacySteamPath))
|
||||
{
|
||||
logger.Info("Legacy Steam path detected.");
|
||||
_steamPath = legacySteamPath;
|
||||
}
|
||||
|
||||
if (!IsValidSteamPath(_steamPath))
|
||||
{
|
||||
logger.Error("No valid Steam library found.");
|
||||
}
|
||||
|
||||
var libraryFoldersVdfPath = Path.Join(_steamPath, "config/libraryfolders.vdf");
|
||||
var vrcLibraryPath = GetLibraryWithAppId(libraryFoldersVdfPath, vrchatAppid);
|
||||
if (string.IsNullOrEmpty(vrcLibraryPath))
|
||||
@@ -55,6 +60,11 @@ namespace VRCX
|
||||
_vrcAppDataPath = Path.Join(_vrcPrefixPath, "drive_c/users/steamuser/AppData/LocalLow/VRChat/VRChat");
|
||||
_vrcCrashesPath = Path.Join(_vrcPrefixPath, "drive_c/users/steamuser/AppData/Local/Temp/VRChat/VRChat/Crashes");
|
||||
}
|
||||
|
||||
private static bool IsValidSteamPath(string path)
|
||||
{
|
||||
return File.Exists(Path.Join(path, "config/libraryfolders.vdf"));
|
||||
}
|
||||
|
||||
private static string? GetLibraryWithAppId(string libraryFoldersVdfPath, string appId)
|
||||
{
|
||||
|
||||
@@ -611,10 +611,10 @@ namespace VRCX
|
||||
public string GetVRChatRegistryJson()
|
||||
{
|
||||
var registry = new Dictionary<string, Dictionary<string, object>>();
|
||||
string regCommand = "query \"HKEY_CURRENT_USER\\SOFTWARE\\VRChat\\VRChat\"";
|
||||
const string regCommand = "query \"HKEY_CURRENT_USER\\SOFTWARE\\VRChat\\VRChat\"";
|
||||
var queryResult = GetWineRegCommand(regCommand);
|
||||
if (queryResult == null)
|
||||
return null;
|
||||
throw new Exception("Failed to get VRC registry data");
|
||||
|
||||
var lines = queryResult.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries)
|
||||
.Where(line =>
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<OutputPath>..\build\Cef\</OutputPath>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OutputType>WinExe</OutputType>
|
||||
@@ -32,6 +31,7 @@
|
||||
<GenerateTargetFrameworkAttribute>false</GenerateTargetFrameworkAttribute>
|
||||
<!-- Fix fail fast exception -->
|
||||
<CETCompat>false</CETCompat>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
<WarningLevel>0</WarningLevel>
|
||||
</PropertyGroup>
|
||||
|
||||
|
||||
@@ -185,7 +185,7 @@
|
||||
const friendsInCurrentInstance = lastLocation.value.friendList;
|
||||
for (const friend of friendsInCurrentInstance.values()) {
|
||||
const ctx = friends.value.get(friend.userId);
|
||||
if (typeof ctx.ref === 'undefined') {
|
||||
if (typeof ctx?.ref === 'undefined') {
|
||||
continue;
|
||||
}
|
||||
D.friendsInInstance.push(ctx);
|
||||
|
||||
@@ -594,7 +594,7 @@
|
||||
const friendsInCurrentInstance = lastLocation.value.friendList;
|
||||
for (const friend of friendsInCurrentInstance.values()) {
|
||||
const ctx = friends.value.get(friend.userId);
|
||||
if (typeof ctx.ref === 'undefined') {
|
||||
if (typeof ctx?.ref === 'undefined') {
|
||||
continue;
|
||||
}
|
||||
D.friendsInInstance.push(ctx);
|
||||
|
||||
@@ -249,7 +249,7 @@
|
||||
style="margin-left: 5px"
|
||||
@click="showBioDialog"></el-button>
|
||||
</div>
|
||||
<div v-if="translationApi" style="float: right">
|
||||
<div v-if="translationApi && userDialog.ref.bio" style="float: right">
|
||||
<el-button type="text" size="small" style="margin-left: 5px" @click="translateBio"
|
||||
><i class="ri-translate-2"></i
|
||||
></el-button>
|
||||
|
||||
@@ -364,7 +364,7 @@ export const useInstanceStore = defineStore('Instance', () => {
|
||||
}
|
||||
if (
|
||||
userStore.userDialog.visible &&
|
||||
userStore.userDialog.ref?.$location.tag === ref.id
|
||||
userStore.userDialog.ref?.$location?.tag === ref.id
|
||||
) {
|
||||
userStore.applyUserDialogLocation();
|
||||
}
|
||||
|
||||
@@ -397,6 +397,10 @@ export const useVrcxStore = defineStore('Vrcx', () => {
|
||||
location.worldId,
|
||||
advancedSettingsStore.screenshotHelperModifyFilename
|
||||
);
|
||||
if (!newPath) {
|
||||
console.error('Failed to add screenshot metadata', path);
|
||||
return;
|
||||
}
|
||||
console.log('Screenshot metadata added', newPath);
|
||||
}
|
||||
if (advancedSettingsStore.screenshotHelperCopyToClipboard) {
|
||||
@@ -618,11 +622,16 @@ export const useVrcxStore = defineStore('Vrcx', () => {
|
||||
|
||||
async function backupVrcRegistry(name) {
|
||||
let regJson;
|
||||
if (WINDOWS) {
|
||||
regJson = await AppApi.GetVRChatRegistry();
|
||||
} else {
|
||||
regJson = await AppApi.GetVRChatRegistryJson();
|
||||
regJson = JSON.parse(regJson);
|
||||
try {
|
||||
if (WINDOWS) {
|
||||
regJson = await AppApi.GetVRChatRegistry();
|
||||
} else {
|
||||
regJson = await AppApi.GetVRChatRegistryJson();
|
||||
regJson = JSON.parse(regJson);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('Failed to get VRChat registry for backup:', e);
|
||||
return;
|
||||
}
|
||||
const newBackup = {
|
||||
name,
|
||||
|
||||
@@ -200,6 +200,15 @@ export const useVRCXUpdaterStore = defineStore('VRCXUpdater', () => {
|
||||
} finally {
|
||||
checkingForVRCXUpdate.value = false;
|
||||
}
|
||||
if (response.status !== 200) {
|
||||
ElMessage({
|
||||
message: t('message.vrcx_updater.failed', {
|
||||
message: `${response.status} ${response.data}`
|
||||
}),
|
||||
type: 'error'
|
||||
});
|
||||
return;
|
||||
}
|
||||
pendingVRCXUpdate.value = false;
|
||||
const json = JSON.parse(response.data);
|
||||
if (AppDebug.debugWebRequests) {
|
||||
@@ -263,6 +272,15 @@ export const useVRCXUpdaterStore = defineStore('VRCXUpdater', () => {
|
||||
} finally {
|
||||
checkingForVRCXUpdate.value = false;
|
||||
}
|
||||
if (response.status !== 200) {
|
||||
ElMessage({
|
||||
message: t('message.vrcx_updater.failed', {
|
||||
message: `${response.status} ${response.data}`
|
||||
}),
|
||||
type: 'error'
|
||||
});
|
||||
return;
|
||||
}
|
||||
const json = JSON.parse(response.data);
|
||||
if (AppDebug.debugWebRequests) {
|
||||
console.log(json, response);
|
||||
|
||||
@@ -170,7 +170,7 @@
|
||||
t(props.isLocalFavorite ? 'view.favorite.copy_tooltip' : 'view.favorite.move_tooltip')
|
||||
);
|
||||
const smallThumbnail = computed(
|
||||
() => localFavFakeRef.value.thumbnailImageUrl.replace('256', '128') || localFavFakeRef.value.thumbnailImageUrl
|
||||
() => localFavFakeRef.value.thumbnailImageUrl?.replace('256', '128') || localFavFakeRef.value.thumbnailImageUrl
|
||||
);
|
||||
const favoriteGroupName = computed(() => {
|
||||
if (typeof props.group === 'string') {
|
||||
|
||||
@@ -68,6 +68,6 @@
|
||||
defineEmits(['click']);
|
||||
|
||||
const smallThumbnail = computed(() => {
|
||||
return props.favorite.thumbnailImageUrl.replace('256', '128') || props.favorite.thumbnailImageUrl;
|
||||
return props.favorite.thumbnailImageUrl?.replace('256', '128') || props.favorite.thumbnailImageUrl;
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
);
|
||||
|
||||
const smallThumbnail = computed(() => {
|
||||
const url = localFavFakeRef.value.thumbnailImageUrl.replace('256', '128');
|
||||
const url = localFavFakeRef.value.thumbnailImageUrl?.replace('256', '128');
|
||||
return url || localFavFakeRef.value.thumbnailImageUrl;
|
||||
});
|
||||
|
||||
|
||||
@@ -670,7 +670,7 @@
|
||||
}
|
||||
|
||||
function setProfilePicOverride(fileId) {
|
||||
if (!currentUser.value.$isVRCPlus) {
|
||||
if (!isLocalUserVrcPlusSupporter.value) {
|
||||
ElMessage({
|
||||
message: 'VRCPlus required',
|
||||
type: 'error'
|
||||
@@ -773,7 +773,7 @@
|
||||
}
|
||||
|
||||
function setVRCPlusIcon(fileId) {
|
||||
if (!currentUser.value.$isVRCPlus) {
|
||||
if (!isLocalUserVrcPlusSupporter.value) {
|
||||
ElMessage({
|
||||
message: 'VRCPlus required',
|
||||
type: 'error'
|
||||
|
||||
Reference in New Issue
Block a user