mirror of
https://github.com/MrUnknownDE/VRCX.git
synced 2026-04-16 13:23:52 +02:00
IPC Fixes (#1415)
* fix chatbox issues * fix ipc issues * add Ipc debug
This commit is contained in:
@@ -12,6 +12,7 @@ const AppDebug = reactive({
|
||||
debugGameLog: false,
|
||||
debugWebRequests: false,
|
||||
debugFriendState: false,
|
||||
debugIPC: false,
|
||||
errorNoty: null,
|
||||
dontLogMeOut: false,
|
||||
endpointDomain: 'https://api.vrchat.cloud/api/1',
|
||||
|
||||
@@ -16,7 +16,7 @@ import {
|
||||
import { instanceRequest, userRequest } from '../api';
|
||||
import { AppDebug } from '../service/appConfig';
|
||||
import { database } from '../service/database';
|
||||
import { photonEventType } from '../shared/constants/photon';
|
||||
import { photonEmojis, photonEventType } from '../shared/constants/photon';
|
||||
import { useAvatarStore } from './avatar';
|
||||
import { useFavoriteStore } from './favorite';
|
||||
import { useFriendStore } from './friend';
|
||||
@@ -136,6 +136,17 @@ export const usePhotonStore = defineStore('Photon', () => {
|
||||
}
|
||||
});
|
||||
const chatboxUserBlacklist = ref(new Map());
|
||||
// Keyword-based chatbox blacklist (array of strings)
|
||||
const chatboxBlacklist = ref([
|
||||
'NP: ',
|
||||
'Now Playing',
|
||||
'Now playing',
|
||||
"▶️ '",
|
||||
'( ▶️ ',
|
||||
"' - '",
|
||||
"' by '",
|
||||
'[Spotify] '
|
||||
]);
|
||||
const photonEventTableFilter = ref('');
|
||||
const moderationAgainstTable = ref([]);
|
||||
const photonEventTableTypeFilter = ref([]);
|
||||
@@ -150,7 +161,8 @@ export const usePhotonStore = defineStore('Photon', () => {
|
||||
photonLobbyTimeoutThresholdConfig,
|
||||
photonOverlayMessageTimeoutConfig,
|
||||
photonEventTableTypeFilterConfig,
|
||||
chatboxUserBlacklistConfig
|
||||
chatboxUserBlacklistConfig,
|
||||
chatboxKeywordBlacklistConfig
|
||||
] = await Promise.all([
|
||||
configRepository.getBool('VRCX_PhotonEventOverlay', false),
|
||||
configRepository.getString(
|
||||
@@ -172,7 +184,8 @@ export const usePhotonStore = defineStore('Photon', () => {
|
||||
(6000).toString()
|
||||
),
|
||||
configRepository.getString('VRCX_photonEventTypeFilter', '[]'),
|
||||
configRepository.getString('VRCX_chatboxUserBlacklist')
|
||||
configRepository.getString('VRCX_chatboxUserBlacklist'),
|
||||
configRepository.getString('VRCX_chatboxBlacklist')
|
||||
]);
|
||||
|
||||
photonEventOverlay.value = photonEventOverlayConfig;
|
||||
@@ -198,6 +211,17 @@ export const usePhotonStore = defineStore('Photon', () => {
|
||||
chatboxUserBlacklist.value = new Map(
|
||||
Object.entries(JSON.parse(chatboxUserBlacklistConfig || '{}'))
|
||||
);
|
||||
|
||||
try {
|
||||
if (chatboxKeywordBlacklistConfig) {
|
||||
const arr = JSON.parse(chatboxKeywordBlacklistConfig);
|
||||
if (Array.isArray(arr)) {
|
||||
chatboxBlacklist.value = arr;
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Failed to parse chatbox keyword blacklist config', err);
|
||||
}
|
||||
}
|
||||
|
||||
initPhotonStates();
|
||||
@@ -303,29 +327,37 @@ export const usePhotonStore = defineStore('Photon', () => {
|
||||
}
|
||||
if (typeof data.Parameters[249] !== 'undefined') {
|
||||
for (const i in data.Parameters[249]) {
|
||||
const id = parseInt(i, 10);
|
||||
const idNum = safeParseInt(i);
|
||||
if (idNum === null) continue;
|
||||
const user = data.Parameters[249][i];
|
||||
parsePhotonUser(id, user.user, dateTime);
|
||||
parsePhotonAvatarChange(
|
||||
id,
|
||||
user.user,
|
||||
user.avatarDict,
|
||||
dateTime
|
||||
);
|
||||
parsePhotonGroupChange(
|
||||
id,
|
||||
user.user,
|
||||
user.groupOnNameplate,
|
||||
dateTime
|
||||
);
|
||||
parsePhotonAvatar(user.avatarDict);
|
||||
parsePhotonAvatar(user.favatarDict);
|
||||
if (!user || !user.user) continue;
|
||||
parsePhotonUser(idNum, user.user, dateTime);
|
||||
if (user.avatarDict) {
|
||||
parsePhotonAvatarChange(
|
||||
idNum,
|
||||
user.user,
|
||||
user.avatarDict,
|
||||
dateTime
|
||||
);
|
||||
parsePhotonAvatar(user.avatarDict);
|
||||
}
|
||||
if (user.favatarDict) {
|
||||
parsePhotonAvatar(user.favatarDict);
|
||||
}
|
||||
if (typeof user.groupOnNameplate !== 'undefined') {
|
||||
parsePhotonGroupChange(
|
||||
idNum,
|
||||
user.user,
|
||||
user.groupOnNameplate,
|
||||
dateTime
|
||||
);
|
||||
}
|
||||
let hasInstantiated = false;
|
||||
const lobbyJointime = photonLobbyJointime.value.get(id);
|
||||
const lobbyJointime = photonLobbyJointime.value.get(idNum);
|
||||
if (typeof lobbyJointime !== 'undefined') {
|
||||
hasInstantiated = lobbyJointime.hasInstantiated;
|
||||
}
|
||||
photonLobbyJointime.value.set(id, {
|
||||
photonLobbyJointime.value.set(idNum, {
|
||||
joinTime: Date.parse(dateTime),
|
||||
hasInstantiated,
|
||||
inVRMode: user.inVRMode,
|
||||
@@ -348,10 +380,12 @@ export const usePhotonStore = defineStore('Photon', () => {
|
||||
}
|
||||
|
||||
function checkChatboxBlacklist(msg) {
|
||||
for (let i = 0; i < this.chatboxBlacklist.length; ++i) {
|
||||
if (msg.includes(this.chatboxBlacklist[i])) {
|
||||
return true;
|
||||
}
|
||||
if (typeof msg !== 'string') return false;
|
||||
const list = chatboxBlacklist.value || [];
|
||||
for (let i = 0; i < list.length; ++i) {
|
||||
const kw = list[i];
|
||||
if (!kw) continue;
|
||||
if (msg.includes(kw)) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -363,6 +397,13 @@ export const usePhotonStore = defineStore('Photon', () => {
|
||||
);
|
||||
}
|
||||
|
||||
async function saveChatboxBlacklist() {
|
||||
await configRepository.setString(
|
||||
'VRCX_chatboxBlacklist',
|
||||
JSON.stringify(chatboxBlacklist.value)
|
||||
);
|
||||
}
|
||||
|
||||
async function photonEventTableFilterChange() {
|
||||
photonEventTable.value.filters[0].value = photonEventTableFilter.value;
|
||||
photonEventTable.value.filters[1].value =
|
||||
@@ -689,29 +730,37 @@ export const usePhotonStore = defineStore('Photon', () => {
|
||||
// SetUserProperties
|
||||
if (data.Parameters[253] === -1) {
|
||||
for (let i in data.Parameters[251]) {
|
||||
var id = parseInt(i, 10);
|
||||
var user = data.Parameters[251][i];
|
||||
parsePhotonUser(id, user.user, gameLogDate);
|
||||
parsePhotonAvatarChange(
|
||||
id,
|
||||
user.user,
|
||||
user.avatarDict,
|
||||
gameLogDate
|
||||
);
|
||||
parsePhotonGroupChange(
|
||||
id,
|
||||
user.user,
|
||||
user.groupOnNameplate,
|
||||
gameLogDate
|
||||
);
|
||||
parsePhotonAvatar(user.avatarDict);
|
||||
parsePhotonAvatar(user.favatarDict);
|
||||
const idNum = safeParseInt(i);
|
||||
if (idNum === null) continue;
|
||||
const user = data.Parameters[251][i];
|
||||
if (!user || !user.user) continue;
|
||||
parsePhotonUser(idNum, user.user, gameLogDate);
|
||||
if (user.avatarDict) {
|
||||
parsePhotonAvatarChange(
|
||||
idNum,
|
||||
user.user,
|
||||
user.avatarDict,
|
||||
gameLogDate
|
||||
);
|
||||
parsePhotonAvatar(user.avatarDict);
|
||||
}
|
||||
if (user.favatarDict) {
|
||||
parsePhotonAvatar(user.favatarDict);
|
||||
}
|
||||
if (typeof user.groupOnNameplate !== 'undefined') {
|
||||
parsePhotonGroupChange(
|
||||
idNum,
|
||||
user.user,
|
||||
user.groupOnNameplate,
|
||||
gameLogDate
|
||||
);
|
||||
}
|
||||
var hasInstantiated = false;
|
||||
var lobbyJointime = photonLobbyJointime.value.get(id);
|
||||
var lobbyJointime = photonLobbyJointime.value.get(idNum);
|
||||
if (typeof lobbyJointime !== 'undefined') {
|
||||
hasInstantiated = lobbyJointime.hasInstantiated;
|
||||
}
|
||||
photonLobbyJointime.value.set(id, {
|
||||
photonLobbyJointime.value.set(idNum, {
|
||||
joinTime: Date.parse(gameLogDate),
|
||||
hasInstantiated,
|
||||
inVRMode: user.inVRMode,
|
||||
@@ -723,33 +772,41 @@ export const usePhotonStore = defineStore('Photon', () => {
|
||||
useImpostorAsFallback: user.useImpostorAsFallback,
|
||||
platform: user.platform
|
||||
});
|
||||
photonUserJoin(id, user, gameLogDate);
|
||||
photonUserJoin(idNum, user, gameLogDate);
|
||||
}
|
||||
} else {
|
||||
console.log('oldSetUserProps', data);
|
||||
var id = parseInt(data.Parameters[253], 10);
|
||||
var user = data.Parameters[251];
|
||||
parsePhotonUser(id, user.user, gameLogDate);
|
||||
parsePhotonAvatarChange(
|
||||
id,
|
||||
user.user,
|
||||
user.avatarDict,
|
||||
gameLogDate
|
||||
);
|
||||
parsePhotonGroupChange(
|
||||
id,
|
||||
user.user,
|
||||
user.groupOnNameplate,
|
||||
gameLogDate
|
||||
);
|
||||
parsePhotonAvatar(user.avatarDict);
|
||||
parsePhotonAvatar(user.favatarDict);
|
||||
const idNum = safeParseInt(data.Parameters[253]);
|
||||
if (idNum === null) break;
|
||||
const user = data.Parameters[251];
|
||||
if (!user || !user.user) break;
|
||||
parsePhotonUser(idNum, user.user, gameLogDate);
|
||||
if (user.avatarDict) {
|
||||
parsePhotonAvatarChange(
|
||||
idNum,
|
||||
user.user,
|
||||
user.avatarDict,
|
||||
gameLogDate
|
||||
);
|
||||
parsePhotonAvatar(user.avatarDict);
|
||||
}
|
||||
if (user.favatarDict) {
|
||||
parsePhotonAvatar(user.favatarDict);
|
||||
}
|
||||
if (typeof user.groupOnNameplate !== 'undefined') {
|
||||
parsePhotonGroupChange(
|
||||
idNum,
|
||||
user.user,
|
||||
user.groupOnNameplate,
|
||||
gameLogDate
|
||||
);
|
||||
}
|
||||
var hasInstantiated = false;
|
||||
var lobbyJointime = photonLobbyJointime.value.get(id);
|
||||
var lobbyJointime = photonLobbyJointime.value.get(idNum);
|
||||
if (typeof lobbyJointime !== 'undefined') {
|
||||
hasInstantiated = lobbyJointime.hasInstantiated;
|
||||
}
|
||||
photonLobbyJointime.value.set(id, {
|
||||
photonLobbyJointime.value.set(idNum, {
|
||||
joinTime: Date.parse(gameLogDate),
|
||||
hasInstantiated,
|
||||
inVRMode: user.inVRMode,
|
||||
@@ -761,97 +818,109 @@ export const usePhotonStore = defineStore('Photon', () => {
|
||||
useImpostorAsFallback: user.useImpostorAsFallback,
|
||||
platform: user.platform
|
||||
});
|
||||
photonUserJoin(id, user, gameLogDate);
|
||||
photonUserJoin(idNum, user, gameLogDate);
|
||||
}
|
||||
break;
|
||||
case 42:
|
||||
// SetUserProperties
|
||||
var id = parseInt(data.Parameters[254], 10);
|
||||
var user = data.Parameters[245];
|
||||
parsePhotonUser(id, user.user, gameLogDate);
|
||||
parsePhotonAvatarChange(
|
||||
id,
|
||||
user.user,
|
||||
user.avatarDict,
|
||||
gameLogDate
|
||||
);
|
||||
parsePhotonGroupChange(
|
||||
id,
|
||||
user.user,
|
||||
user.groupOnNameplate,
|
||||
gameLogDate
|
||||
);
|
||||
parsePhotonAvatar(user.avatarDict);
|
||||
parsePhotonAvatar(user.favatarDict);
|
||||
var lobbyJointime = photonLobbyJointime.value.get(id);
|
||||
photonLobbyJointime.value.set(id, {
|
||||
var id42 = safeParseInt(data.Parameters[254]);
|
||||
var user42 = data.Parameters[245];
|
||||
if (id42 === null || !user42 || !user42.user) break;
|
||||
parsePhotonUser(id42, user42.user, gameLogDate);
|
||||
if (user42.avatarDict) {
|
||||
parsePhotonAvatarChange(
|
||||
id42,
|
||||
user42.user,
|
||||
user42.avatarDict,
|
||||
gameLogDate
|
||||
);
|
||||
parsePhotonAvatar(user42.avatarDict);
|
||||
}
|
||||
if (user42.favatarDict) {
|
||||
parsePhotonAvatar(user42.favatarDict);
|
||||
}
|
||||
if (typeof user42.groupOnNameplate !== 'undefined') {
|
||||
parsePhotonGroupChange(
|
||||
id42,
|
||||
user42.user,
|
||||
user42.groupOnNameplate,
|
||||
gameLogDate
|
||||
);
|
||||
}
|
||||
var lobbyJointime = photonLobbyJointime.value.get(id42);
|
||||
photonLobbyJointime.value.set(id42, {
|
||||
hasInstantiated: true,
|
||||
...lobbyJointime,
|
||||
inVRMode: user.inVRMode,
|
||||
avatarEyeHeight: user.avatarEyeHeight,
|
||||
canModerateInstance: user.canModerateInstance,
|
||||
groupOnNameplate: user.groupOnNameplate,
|
||||
showGroupBadgeToOthers: user.showGroupBadgeToOthers,
|
||||
showSocialRank: user.showSocialRank,
|
||||
useImpostorAsFallback: user.useImpostorAsFallback,
|
||||
platform: user.platform
|
||||
inVRMode: user42.inVRMode,
|
||||
avatarEyeHeight: user42.avatarEyeHeight,
|
||||
canModerateInstance: user42.canModerateInstance,
|
||||
groupOnNameplate: user42.groupOnNameplate,
|
||||
showGroupBadgeToOthers: user42.showGroupBadgeToOthers,
|
||||
showSocialRank: user42.showSocialRank,
|
||||
useImpostorAsFallback: user42.useImpostorAsFallback,
|
||||
platform: user42.platform
|
||||
});
|
||||
break;
|
||||
case 255:
|
||||
// Join
|
||||
const id255 = safeParseInt(data.Parameters[254]);
|
||||
if (id255 === null) break;
|
||||
if (typeof data.Parameters[249] !== 'undefined') {
|
||||
parsePhotonUser(
|
||||
data.Parameters[254],
|
||||
data.Parameters[249].user,
|
||||
gameLogDate
|
||||
);
|
||||
parsePhotonAvatarChange(
|
||||
data.Parameters[254],
|
||||
data.Parameters[249].user,
|
||||
data.Parameters[249].avatarDict,
|
||||
gameLogDate
|
||||
);
|
||||
parsePhotonGroupChange(
|
||||
data.Parameters[254],
|
||||
data.Parameters[249].user,
|
||||
data.Parameters[249].groupOnNameplate,
|
||||
gameLogDate
|
||||
);
|
||||
parsePhotonAvatar(data.Parameters[249].avatarDict);
|
||||
parsePhotonAvatar(data.Parameters[249].favatarDict);
|
||||
const u255 = data.Parameters[249];
|
||||
if (u255 && u255.user) {
|
||||
parsePhotonUser(id255, u255.user, gameLogDate);
|
||||
if (u255.avatarDict) {
|
||||
parsePhotonAvatarChange(
|
||||
id255,
|
||||
u255.user,
|
||||
u255.avatarDict,
|
||||
gameLogDate
|
||||
);
|
||||
parsePhotonAvatar(u255.avatarDict);
|
||||
}
|
||||
if (u255.favatarDict) {
|
||||
parsePhotonAvatar(u255.favatarDict);
|
||||
}
|
||||
if (typeof u255.groupOnNameplate !== 'undefined') {
|
||||
parsePhotonGroupChange(
|
||||
id255,
|
||||
u255.user,
|
||||
u255.groupOnNameplate,
|
||||
gameLogDate
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
parsePhotonLobbyIds(data.Parameters[252]);
|
||||
var hasInstantiated = false;
|
||||
if (photonLobbyCurrentUser.value === data.Parameters[254]) {
|
||||
if (photonLobbyCurrentUser.value === id255) {
|
||||
// fix current user
|
||||
hasInstantiated = true;
|
||||
}
|
||||
var ref = photonLobbyCurrent.value.get(data.Parameters[254]);
|
||||
var ref = photonLobbyCurrent.value.get(id255);
|
||||
if (typeof ref !== 'undefined') {
|
||||
// fix for join event firing twice
|
||||
// fix instantiation happening out of order before join event
|
||||
hasInstantiated = ref.hasInstantiated;
|
||||
}
|
||||
photonLobbyJointime.value.set(data.Parameters[254], {
|
||||
joinTime: Date.parse(gameLogDate),
|
||||
hasInstantiated,
|
||||
inVRMode: data.Parameters[249].inVRMode,
|
||||
avatarEyeHeight: data.Parameters[249].avatarEyeHeight,
|
||||
canModerateInstance:
|
||||
data.Parameters[249].canModerateInstance,
|
||||
groupOnNameplate: data.Parameters[249].groupOnNameplate,
|
||||
showGroupBadgeToOthers:
|
||||
data.Parameters[249].showGroupBadgeToOthers,
|
||||
showSocialRank: data.Parameters[249].showSocialRank,
|
||||
useImpostorAsFallback:
|
||||
data.Parameters[249].useImpostorAsFallback,
|
||||
platform: data.Parameters[249].platform
|
||||
});
|
||||
photonUserJoin(
|
||||
data.Parameters[254],
|
||||
data.Parameters[249],
|
||||
gameLogDate
|
||||
);
|
||||
if (data.Parameters[249]) {
|
||||
photonLobbyJointime.value.set(id255, {
|
||||
joinTime: Date.parse(gameLogDate),
|
||||
hasInstantiated,
|
||||
inVRMode: data.Parameters[249].inVRMode,
|
||||
avatarEyeHeight: data.Parameters[249].avatarEyeHeight,
|
||||
canModerateInstance:
|
||||
data.Parameters[249].canModerateInstance,
|
||||
groupOnNameplate: data.Parameters[249].groupOnNameplate,
|
||||
showGroupBadgeToOthers:
|
||||
data.Parameters[249].showGroupBadgeToOthers,
|
||||
showSocialRank: data.Parameters[249].showSocialRank,
|
||||
useImpostorAsFallback:
|
||||
data.Parameters[249].useImpostorAsFallback,
|
||||
platform: data.Parameters[249].platform
|
||||
});
|
||||
photonUserJoin(id255, data.Parameters[249], gameLogDate);
|
||||
}
|
||||
startLobbyWatcherLoop();
|
||||
break;
|
||||
case 254:
|
||||
@@ -1028,66 +1097,65 @@ export const usePhotonStore = defineStore('Photon', () => {
|
||||
case 70:
|
||||
// Portal Spawn
|
||||
if (data.Parameters[245][0] === 20) {
|
||||
var portalId = data.Parameters[245][1];
|
||||
var userId = data.Parameters[245][2];
|
||||
var shortName = data.Parameters[245][5];
|
||||
var worldName = data.Parameters[245][8].name;
|
||||
const portalId = data.Parameters[245][1];
|
||||
const portalUserId = data.Parameters[245][2];
|
||||
const shortName = data.Parameters[245][5];
|
||||
const portalWorldName = data.Parameters[245][8].name;
|
||||
addPhotonPortalSpawn(
|
||||
gameLogDate,
|
||||
userId,
|
||||
portalUserId,
|
||||
shortName,
|
||||
worldName
|
||||
portalWorldName
|
||||
);
|
||||
photonLobbyActivePortals.value.set(portalId, {
|
||||
userId,
|
||||
userId: portalUserId,
|
||||
shortName,
|
||||
worldName,
|
||||
worldName: portalWorldName,
|
||||
created_at: Date.parse(gameLogDate),
|
||||
playerCount: 0,
|
||||
pendingLeave: 0
|
||||
});
|
||||
} else if (data.Parameters[245][0] === 21) {
|
||||
var portalId = data.Parameters[245][1];
|
||||
var userId = data.Parameters[245][2];
|
||||
var playerCount = data.Parameters[245][3];
|
||||
var shortName = data.Parameters[245][5];
|
||||
var worldName = '';
|
||||
const portalId = data.Parameters[245][1];
|
||||
const portalUserId = data.Parameters[245][2];
|
||||
const playerCount = data.Parameters[245][3];
|
||||
const shortName = data.Parameters[245][5];
|
||||
const portalWorldName = '';
|
||||
addPhotonPortalSpawn(
|
||||
gameLogDate,
|
||||
userId,
|
||||
portalUserId,
|
||||
shortName,
|
||||
worldName
|
||||
portalWorldName
|
||||
);
|
||||
photonLobbyActivePortals.value.set(portalId, {
|
||||
userId,
|
||||
userId: portalUserId,
|
||||
shortName,
|
||||
worldName,
|
||||
worldName: portalWorldName,
|
||||
created_at: Date.parse(gameLogDate),
|
||||
playerCount: 0,
|
||||
pendingLeave: 0
|
||||
});
|
||||
} else if (data.Parameters[245][0] === 22) {
|
||||
var portalId = data.Parameters[245][1];
|
||||
var text = 'DeletedPortal';
|
||||
var ref = photonLobbyActivePortals.value.get(portalId);
|
||||
const portalId = data.Parameters[245][1];
|
||||
let portalText = 'DeletedPortal';
|
||||
const ref = photonLobbyActivePortals.value.get(portalId);
|
||||
if (typeof ref !== 'undefined') {
|
||||
var worldName = ref.worldName;
|
||||
var playerCount = ref.playerCount;
|
||||
const portalWorldName = ref.worldName;
|
||||
const playerCount = ref.playerCount;
|
||||
const time = timeToText(
|
||||
Date.parse(gameLogDate) - ref.created_at
|
||||
);
|
||||
text = `DeletedPortal after ${time} with ${playerCount} players to "${worldName}"`;
|
||||
portalText = `DeletedPortal after ${time} with ${playerCount} players to "${portalWorldName}"`;
|
||||
}
|
||||
addEntryPhotonEvent({
|
||||
text,
|
||||
text: portalText,
|
||||
type: 'DeletedPortal',
|
||||
created_at: gameLogDate
|
||||
});
|
||||
photonLobbyActivePortals.value.delete(portalId);
|
||||
} else if (data.Parameters[245][0] === 23) {
|
||||
var portalId = data.Parameters[245][1];
|
||||
var playerCount = data.Parameters[245][3];
|
||||
var ref = photonLobbyActivePortals.value.get(portalId);
|
||||
const portalId = data.Parameters[245][1];
|
||||
const playerCount = data.Parameters[245][3];
|
||||
const ref = photonLobbyActivePortals.value.get(portalId);
|
||||
if (typeof ref !== 'undefined') {
|
||||
ref.pendingLeave++;
|
||||
ref.playerCount = playerCount;
|
||||
@@ -1299,6 +1367,9 @@ export const usePhotonStore = defineStore('Photon', () => {
|
||||
}
|
||||
|
||||
function parsePhotonLobbyIds(lobbyIds) {
|
||||
if (!Array.isArray(lobbyIds)) {
|
||||
return;
|
||||
}
|
||||
lobbyIds.forEach((id) => {
|
||||
if (!photonLobby.value.has(id)) {
|
||||
photonLobby.value.set(id);
|
||||
@@ -1692,7 +1763,7 @@ export const usePhotonStore = defineStore('Photon', () => {
|
||||
|
||||
function parsePhotonAvatar(avatar) {
|
||||
if (typeof avatar === 'undefined' || typeof avatar.id === 'undefined') {
|
||||
console.error('PhotonAvatar: avatar is undefined');
|
||||
console.warn('PhotonAvatar: avatar is undefined');
|
||||
return;
|
||||
}
|
||||
let tags = [];
|
||||
@@ -1733,6 +1804,11 @@ export const usePhotonStore = defineStore('Photon', () => {
|
||||
});
|
||||
}
|
||||
|
||||
function safeParseInt(val) {
|
||||
const n = parseInt(val, 10);
|
||||
return Number.isFinite(n) ? n : null;
|
||||
}
|
||||
|
||||
return {
|
||||
state,
|
||||
|
||||
@@ -1749,6 +1825,7 @@ export const usePhotonStore = defineStore('Photon', () => {
|
||||
photonEventTable,
|
||||
photonEventTablePrevious,
|
||||
chatboxUserBlacklist,
|
||||
chatboxBlacklist,
|
||||
photonEventTableFilter,
|
||||
photonLobby,
|
||||
photonLobbyMaster,
|
||||
@@ -1777,6 +1854,7 @@ export const usePhotonStore = defineStore('Photon', () => {
|
||||
saveEventOverlay,
|
||||
checkChatboxBlacklist,
|
||||
saveChatboxUserBlacklist,
|
||||
saveChatboxBlacklist,
|
||||
photonEventTableFilterChange,
|
||||
showUserFromPhotonId,
|
||||
promptPhotonOverlayMessageTimeout,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { defineStore } from 'pinia';
|
||||
import { watch } from 'vue';
|
||||
import { watch, computed } from 'vue';
|
||||
|
||||
import { database } from '../service/database';
|
||||
import { groupRequest } from '../api';
|
||||
@@ -60,7 +60,12 @@ export const useUpdateLoopStore = defineStore('UpdateLoop', () => {
|
||||
|
||||
const nextDiscordUpdate = state.nextDiscordUpdate;
|
||||
|
||||
const ipcTimeout = state.ipcTimeout;
|
||||
const ipcTimeout = computed({
|
||||
get: () => state.ipcTimeout,
|
||||
set: (seconds) => {
|
||||
state.ipcTimeout = Number(seconds) || 0;
|
||||
}
|
||||
});
|
||||
|
||||
async function updateLoop() {
|
||||
try {
|
||||
|
||||
@@ -422,16 +422,19 @@ export const useVrcxStore = defineStore('Vrcx', () => {
|
||||
console.log(`IPC invalid JSON, ${json}`);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (data.type) {
|
||||
case 'OnEvent':
|
||||
if (!gameStore.isGameRunning) {
|
||||
console.log('Game closed, skipped event', data);
|
||||
return;
|
||||
}
|
||||
if (AppDebug.debugPhotonLogging) {
|
||||
if (AppDebug.debugPhotonLogging || AppDebug.debugIPC) {
|
||||
console.log(
|
||||
'OnEvent',
|
||||
data.OnEventData.Code,
|
||||
'Param[254]:',
|
||||
data.OnEventData.Parameters?.[254],
|
||||
data.OnEventData
|
||||
);
|
||||
}
|
||||
@@ -443,10 +446,12 @@ export const useVrcxStore = defineStore('Vrcx', () => {
|
||||
console.log('Game closed, skipped event', data);
|
||||
return;
|
||||
}
|
||||
if (AppDebug.debugPhotonLogging) {
|
||||
if (AppDebug.debugPhotonLogging || AppDebug.debugIPC) {
|
||||
console.log(
|
||||
'OnOperationResponse',
|
||||
data.OnOperationResponseData.OperationCode,
|
||||
'Param[254]:',
|
||||
data.OnOperationResponseData.Parameters?.[254],
|
||||
data.OnOperationResponseData
|
||||
);
|
||||
}
|
||||
@@ -461,7 +466,7 @@ export const useVrcxStore = defineStore('Vrcx', () => {
|
||||
console.log('Game closed, skipped event', data);
|
||||
return;
|
||||
}
|
||||
if (AppDebug.debugPhotonLogging) {
|
||||
if (AppDebug.debugPhotonLogging || AppDebug.debugIPC) {
|
||||
console.log(
|
||||
'OnOperationRequest',
|
||||
data.OnOperationRequestData.OperationCode,
|
||||
@@ -474,10 +479,16 @@ export const useVrcxStore = defineStore('Vrcx', () => {
|
||||
console.log('Game closed, skipped event', data);
|
||||
return;
|
||||
}
|
||||
if (AppDebug.debugIPC) {
|
||||
console.log('VRCEvent:', data);
|
||||
}
|
||||
photonStore.parseVRCEvent(data);
|
||||
photonStore.photonEventPulse();
|
||||
break;
|
||||
case 'Event7List':
|
||||
if (AppDebug.debugIPC) {
|
||||
console.log('Event7List:', data);
|
||||
}
|
||||
photonStore.photonEvent7List.clear();
|
||||
for (const [id, dt] of Object.entries(data.Event7List)) {
|
||||
photonStore.photonEvent7List.set(parseInt(id, 10), dt);
|
||||
@@ -485,19 +496,25 @@ export const useVrcxStore = defineStore('Vrcx', () => {
|
||||
photonStore.photonLastEvent7List = Date.parse(data.dt);
|
||||
break;
|
||||
case 'VrcxMessage':
|
||||
if (AppDebug.debugPhotonLogging) {
|
||||
if (AppDebug.debugPhotonLogging || AppDebug.debugIPC) {
|
||||
console.log('VrcxMessage:', data);
|
||||
}
|
||||
eventVrcxMessage(data);
|
||||
break;
|
||||
case 'Ping':
|
||||
if (AppDebug.debugIPC) {
|
||||
console.log('IPC Ping');
|
||||
}
|
||||
if (!photonStore.photonLoggingEnabled) {
|
||||
photonStore.setPhotonLoggingEnabled();
|
||||
}
|
||||
ipcEnabled.value = true;
|
||||
updateLoopStore.ipcTimeout = 60; // 30secs
|
||||
updateLoopStore.ipcTimeout = 60; // 30 seconds
|
||||
break;
|
||||
case 'MsgPing':
|
||||
if (AppDebug.debugIPC) {
|
||||
console.log('MsgPing:', data);
|
||||
}
|
||||
state.externalNotifierVersion = data.version;
|
||||
break;
|
||||
case 'LaunchCommand':
|
||||
|
||||
@@ -187,6 +187,10 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-if="photonLoggingEnabled" style="margin-bottom: 10px">
|
||||
<PhotonEventTable @show-chatbox-blacklist="showChatboxBlacklistDialog" />
|
||||
</div>
|
||||
|
||||
<div class="current-instance-table">
|
||||
<DataTable
|
||||
v-bind="currentInstanceUsersTable"
|
||||
@@ -396,7 +400,6 @@
|
||||
<ChatboxBlacklistDialog
|
||||
:chatbox-blacklist-dialog="chatboxBlacklistDialog"
|
||||
@delete-chatbox-user-blacklist="deleteChatboxUserBlacklist" />
|
||||
<PhotonEventTable v-if="photonLoggingEnabled" @show-chatbox-blacklist="showChatboxBlacklistDialog" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
<template>
|
||||
<div class="photon-event-table">
|
||||
<div style="position: absolute; width: 600px; margin-left: 215px; z-index: 1">
|
||||
<div style="display: flex; align-items: center; gap: 10px; margin-bottom: 10px; flex-wrap: wrap">
|
||||
<el-select
|
||||
v-model="photonEventTableTypeFilter"
|
||||
multiple
|
||||
clearable
|
||||
collapse-tags
|
||||
style="flex: 1; width: 220px"
|
||||
style="width: 220px"
|
||||
:placeholder="t('view.player_list.photon.filter_placeholder')"
|
||||
@change="photonEventTableFilterChange">
|
||||
<el-option
|
||||
@@ -19,19 +19,17 @@
|
||||
v-model="photonEventTableFilter"
|
||||
:placeholder="t('view.player_list.photon.search_placeholder')"
|
||||
clearable
|
||||
style="width: 150px; margin-left: 10px"
|
||||
style="width: 150px"
|
||||
@input="photonEventTableFilterChange"></el-input>
|
||||
<el-button style="margin-left: 10px" @click="emitShowChatboxBlacklist">{{
|
||||
<el-button @click="emitShowChatboxBlacklist">{{
|
||||
t('view.player_list.photon.chatbox_blacklist')
|
||||
}}</el-button>
|
||||
<el-tooltip placement="bottom" :content="t('view.player_list.photon.status_tooltip')">
|
||||
<div
|
||||
style="
|
||||
display: inline-block;
|
||||
margin-left: 15px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
font-size: 14px;
|
||||
vertical-align: text-top;
|
||||
margin-top: 1px;
|
||||
">
|
||||
<span v-if="ipcEnabled && !photonEventIcon">🟢</span>
|
||||
<span v-else-if="ipcEnabled">⚪</span>
|
||||
|
||||
@@ -44,17 +44,16 @@
|
||||
|
||||
<script setup>
|
||||
import { Delete } from '@element-plus/icons-vue';
|
||||
import { ref } from 'vue';
|
||||
import { storeToRefs } from 'pinia';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
|
||||
import { usePhotonStore } from '../../../stores';
|
||||
|
||||
import configRepository from '../../../service/config';
|
||||
|
||||
const { t } = useI18n();
|
||||
|
||||
const { chatboxUserBlacklist } = storeToRefs(usePhotonStore());
|
||||
const photonStore = usePhotonStore();
|
||||
const { chatboxUserBlacklist, chatboxBlacklist } = storeToRefs(photonStore);
|
||||
const { saveChatboxBlacklist } = photonStore;
|
||||
|
||||
defineProps({
|
||||
chatboxBlacklistDialog: {
|
||||
@@ -63,30 +62,8 @@
|
||||
}
|
||||
});
|
||||
|
||||
const chatboxBlacklist = ref([
|
||||
'NP: ',
|
||||
'Now Playing',
|
||||
'Now playing',
|
||||
"▶️ '",
|
||||
'( ▶️ ',
|
||||
"' - '",
|
||||
"' by '",
|
||||
'[Spotify] '
|
||||
]);
|
||||
|
||||
const emit = defineEmits(['deleteChatboxUserBlacklist']);
|
||||
|
||||
initChatboxBlacklist();
|
||||
|
||||
async function initChatboxBlacklist() {
|
||||
if (await configRepository.getString('VRCX_chatboxBlacklist')) {
|
||||
chatboxBlacklist.value = JSON.parse(await configRepository.getString('VRCX_chatboxBlacklist'));
|
||||
}
|
||||
}
|
||||
|
||||
async function saveChatboxBlacklist() {
|
||||
await configRepository.setString('VRCX_chatboxBlacklist', JSON.stringify(chatboxBlacklist.value));
|
||||
}
|
||||
|
||||
function deleteChatboxUserBlacklist(userId) {
|
||||
emit('deleteChatboxUserBlacklist', userId);
|
||||
|
||||
Reference in New Issue
Block a user