diff --git a/package.json b/package.json index a802c6d1..27958b3f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hydralauncher", - "version": "3.5.1", + "version": "3.5.2", "description": "Hydra", "main": "./out/main/index.js", "author": "Los Broxas", diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index 93e18f17..4adc5585 100644 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -379,7 +379,8 @@ "platinum": "Platinum", "hidden": "Hidden", "test_notification": "Test notification", - "notification_preview": "Achievement Notification Preview" + "notification_preview": "Achievement Notification Preview", + "enable_friend_start_game_notifications": "When a friend starts playing a game" }, "notifications": { "download_complete": "Download complete", diff --git a/src/locales/pt-BR/translation.json b/src/locales/pt-BR/translation.json index c99fab6f..6b9546ec 100644 --- a/src/locales/pt-BR/translation.json +++ b/src/locales/pt-BR/translation.json @@ -365,7 +365,8 @@ "platinum": "Platina", "hidden": "Oculta", "test_notification": "Testar notificação", - "notification_preview": "Prévia da Notificação de Conquistas" + "notification_preview": "Prévia da Notificação de Conquistas", + "enable_friend_start_game_notifications": "Quando um amigo iniciar um jogo" }, "notifications": { "download_complete": "Download concluído", diff --git a/src/main/events/library/open-game-installer-path.ts b/src/main/events/library/open-game-installer-path.ts index b61246fa..0bbe96de 100644 --- a/src/main/events/library/open-game-installer-path.ts +++ b/src/main/events/library/open-game-installer-path.ts @@ -12,16 +12,14 @@ const openGameInstallerPath = async ( ) => { const download = await downloadsSublevel.get(levelKeys.game(shop, objectId)); - if (!download || !download.folderName || !download.downloadPath) return true; + if (!download?.folderName || !download.downloadPath) return; const gamePath = path.join( download.downloadPath ?? (await getDownloadsPath()), - download.folderName! + download.folderName ); shell.showItemInFolder(gamePath); - - return true; }; registerEvent("openGameInstallerPath", openGameInstallerPath); diff --git a/src/main/services/window-manager.ts b/src/main/services/window-manager.ts index 8014c240..3d84d6f3 100644 --- a/src/main/services/window-manager.ts +++ b/src/main/services/window-manager.ts @@ -395,7 +395,16 @@ export class WindowManager { this.notificationWindow?.webContents.send( "on-achievement-unlocked", userPreferences.achievementCustomNotificationPosition ?? "top-left", - [generateAchievementCustomNotificationTest(t, language)] + [ + generateAchievementCustomNotificationTest(t, language), + generateAchievementCustomNotificationTest(t, language, { + isRare: true, + isHidden: true, + }), + generateAchievementCustomNotificationTest(t, language, { + isPlatinum: true, + }), + ] ); } @@ -460,9 +469,8 @@ export class WindowManager { } }); - editorWindow.webContents.on("before-input-event", (event, input) => { + editorWindow.webContents.on("before-input-event", (_event, input) => { if (input.key === "F12") { - event.preventDefault(); this.mainWindow?.webContents.toggleDevTools(); } }); diff --git a/src/main/services/ws/events/friend-game-session.ts b/src/main/services/ws/events/friend-game-session.ts index 930b4885..47d8164e 100644 --- a/src/main/services/ws/events/friend-game-session.ts +++ b/src/main/services/ws/events/friend-game-session.ts @@ -1,15 +1,25 @@ import type { FriendGameSession } from "@main/generated/envelope"; +import { db, levelKeys } from "@main/level"; import { HydraApi } from "@main/services/hydra-api"; import { publishFriendStartedPlayingGameNotification } from "@main/services/notifications"; -import { GameStats } from "@types"; +import type { GameStats, UserPreferences, UserProfile } from "@types"; export const friendGameSessionEvent = async (payload: FriendGameSession) => { + const userPreferences = await db.get( + levelKeys.userPreferences, + { + valueEncoding: "json", + } + ); + + if (userPreferences?.friendStartGameNotificationsEnabled === false) return; + const [friend, gameStats] = await Promise.all([ - HydraApi.get(`/users/${payload.friendId}`), + HydraApi.get(`/users/${payload.friendId}`), HydraApi.get( `/games/stats?objectId=${payload.objectId}&shop=steam` ), - ]); + ]).catch(() => [null, null]); if (friend && gameStats) { publishFriendStartedPlayingGameNotification(friend, gameStats); diff --git a/src/renderer/src/components/achievements/notification/achievement-notification.tsx b/src/renderer/src/components/achievements/notification/achievement-notification.tsx index 7bb681fe..bcc22047 100644 --- a/src/renderer/src/components/achievements/notification/achievement-notification.tsx +++ b/src/renderer/src/components/achievements/notification/achievement-notification.tsx @@ -31,7 +31,7 @@ export function AchievementNotificationItem({ [`${baseClassName}--platinum`]: achievement.isPlatinum, })} > - {achievement.points && ( + {achievement.points !== undefined && (
diff --git a/src/renderer/src/declaration.d.ts b/src/renderer/src/declaration.d.ts index 3290d798..05d0cad0 100644 --- a/src/renderer/src/declaration.d.ts +++ b/src/renderer/src/declaration.d.ts @@ -139,10 +139,7 @@ declare global { verifyExecutablePathInUse: (executablePath: string) => Promise; getLibrary: () => Promise; openGameInstaller: (shop: GameShop, objectId: string) => Promise; - openGameInstallerPath: ( - shop: GameShop, - objectId: string - ) => Promise; + openGameInstallerPath: (shop: GameShop, objectId: string) => Promise; openGameExecutablePath: (shop: GameShop, objectId: string) => Promise; openGame: ( shop: GameShop, diff --git a/src/renderer/src/pages/settings/settings-general.tsx b/src/renderer/src/pages/settings/settings-general.tsx index ad4f1b82..c698440d 100644 --- a/src/renderer/src/pages/settings/settings-general.tsx +++ b/src/renderer/src/pages/settings/settings-general.tsx @@ -38,6 +38,7 @@ export function SettingsGeneral() { downloadNotificationsEnabled: false, repackUpdatesNotificationsEnabled: false, friendRequestNotificationsEnabled: false, + friendStartGameNotificationsEnabled: true, achievementNotificationsEnabled: true, achievementCustomNotificationsEnabled: true, achievementCustomNotificationPosition: @@ -111,6 +112,8 @@ export function SettingsGeneral() { userPreferences.achievementCustomNotificationPosition ?? "top-left", friendRequestNotificationsEnabled: userPreferences.friendRequestNotificationsEnabled ?? false, + friendStartGameNotificationsEnabled: + userPreferences.friendStartGameNotificationsEnabled ?? true, language: language ?? "en", })); } @@ -248,6 +251,17 @@ export function SettingsGeneral() { } /> + + handleChange({ + friendStartGameNotificationsEnabled: + !form.friendStartGameNotificationsEnabled, + }) + } + /> + ("top-left"); + const [shadowRootRef, setShadowRootRef] = useState(null); + const achievementPreview = useMemo(() => { return { - achievement: { - ...generateAchievementCustomNotificationTest(t, i18n.language), + achievement: generateAchievementCustomNotificationTest(t, i18n.language, { isRare: notificationVariation === "rare", isHidden: notificationVariation === "hidden", isPlatinum: notificationVariation === "platinum", - }, + }), position: notificationAlignment, }; }, [t, i18n.language, notificationVariation, notificationAlignment]); @@ -58,10 +62,13 @@ export default function ThemeEditor() { if (loadedTheme) { setTheme(loadedTheme); setCode(loadedTheme.code); + if (shadowRootRef) { + injectCustomCss(loadedTheme.code, shadowRootRef); + } } }); } - }, [themeId]); + }, [themeId, shadowRootRef]); const handleSave = useCallback(async () => { if (theme) { @@ -69,11 +76,14 @@ export default function ThemeEditor() { setHasUnsavedChanges(false); setIsClosingNotifications(true); setTimeout(() => { - injectCustomCss(code); + if (shadowRootRef) { + injectCustomCss(code, shadowRootRef); + } + setIsClosingNotifications(false); }, 450); } - }, [code, theme]); + }, [code, theme, shadowRootRef]); useEffect(() => { const handleKeyDown = (event: KeyboardEvent) => { @@ -185,11 +195,18 @@ export default function ThemeEditor() { />
- + + +
setShadowRootRef(ref)}> + +
+
diff --git a/src/shared/index.ts b/src/shared/index.ts index 98b20f10..2f35692f 100644 --- a/src/shared/index.ts +++ b/src/shared/index.ts @@ -179,7 +179,8 @@ export const formatDate = ( export const generateAchievementCustomNotificationTest = ( t: any, - language?: string + language?: string, + options: { isHidden?: boolean; isRare?: boolean; isPlatinum?: boolean } = {} ): AchievementNotificationInfo => { return { title: t("test_achievement_notification_title", { @@ -192,8 +193,8 @@ export const generateAchievementCustomNotificationTest = ( }), iconUrl: "https://cdn.losbroxas.org/favicon.svg", points: 2440, - isHidden: false, - isRare: false, - isPlatinum: false, + isHidden: options.isHidden ?? false, + isRare: options.isRare ?? false, + isPlatinum: options.isPlatinum ?? false, }; }; diff --git a/src/types/level.types.ts b/src/types/level.types.ts index bca933c1..fd904ca5 100644 --- a/src/types/level.types.ts +++ b/src/types/level.types.ts @@ -97,6 +97,7 @@ export interface UserPreferences { achievementCustomNotificationsEnabled?: boolean; achievementCustomNotificationPosition?: AchievementCustomNotificationPosition; friendRequestNotificationsEnabled?: boolean; + friendStartGameNotificationsEnabled?: boolean; showDownloadSpeedInMegabytes?: boolean; extractFilesByDefault?: boolean; }