mirror of
https://github.com/hydralauncher/hydra.git
synced 2026-01-24 11:21:02 +00:00
ci: changed css variables to image from souvenirs, made image add in a single api call with updating achievements, renamed variables
This commit is contained in:
@@ -15,7 +15,7 @@ export class AchievementImageService {
|
||||
|
||||
const response = await HydraApi.post<{
|
||||
presignedUrl: string;
|
||||
achievementImageUrl: string;
|
||||
imageUrl: string;
|
||||
}>("/presigned-urls/achievement-image", {
|
||||
imageExt: path.extname(imagePath).slice(1),
|
||||
imageLength: fileSizeInBytes,
|
||||
@@ -29,7 +29,7 @@ export class AchievementImageService {
|
||||
},
|
||||
});
|
||||
|
||||
return response.achievementImageUrl;
|
||||
return response.imageUrl;
|
||||
}
|
||||
|
||||
private static async storeImageLocally(imagePath: string): Promise<string> {
|
||||
@@ -40,17 +40,6 @@ export class AchievementImageService {
|
||||
return `data:${mimeType?.mime || "image/jpeg"};base64,${base64Image}`;
|
||||
}
|
||||
|
||||
private static async updateAchievementWithImageUrl(
|
||||
shop: GameShop,
|
||||
gameId: string,
|
||||
achievementName: string,
|
||||
imageUrl: string
|
||||
): Promise<void> {
|
||||
await HydraApi.patch(
|
||||
`/profile/games/achievements/${shop}/${gameId}/${achievementName}/image`,
|
||||
{ achievementImageUrl: imageUrl }
|
||||
);
|
||||
}
|
||||
|
||||
private static async hasActiveSubscription(): Promise<boolean> {
|
||||
return db
|
||||
@@ -75,7 +64,7 @@ export class AchievementImageService {
|
||||
if (existingData) {
|
||||
await gameAchievementsSublevel.put(achievementKey, {
|
||||
...existingData,
|
||||
achievementImageUrl: imageUrl,
|
||||
imageUrl,
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -99,8 +88,7 @@ export class AchievementImageService {
|
||||
static async uploadAchievementImage(
|
||||
gameId: string,
|
||||
achievementName: string,
|
||||
imagePath: string,
|
||||
shop?: GameShop
|
||||
imagePath: string
|
||||
): Promise<{ success: boolean; imageUrl: string }> {
|
||||
try {
|
||||
let imageUrl: string;
|
||||
@@ -109,14 +97,9 @@ export class AchievementImageService {
|
||||
|
||||
if (hasSubscription) {
|
||||
imageUrl = await this.uploadImageToCDN(imagePath);
|
||||
if (shop) {
|
||||
await this.updateAchievementWithImageUrl(
|
||||
shop,
|
||||
gameId,
|
||||
achievementName,
|
||||
imageUrl
|
||||
);
|
||||
}
|
||||
// Removed per new single-call sync: image URL will be included
|
||||
// in the PUT /profile/games/achievements payload later.
|
||||
// No direct API call here anymore.
|
||||
logger.log(
|
||||
`Achievement image uploaded to CDN for ${gameId}:${achievementName}`
|
||||
);
|
||||
@@ -155,8 +138,7 @@ export class AchievementImageService {
|
||||
const result = await this.uploadAchievementImage(
|
||||
gameId,
|
||||
achievementName,
|
||||
imagePath,
|
||||
shop
|
||||
imagePath
|
||||
);
|
||||
|
||||
await this.updateLocalAchievementData(shop, gameId, result.imageUrl);
|
||||
|
||||
@@ -161,6 +161,65 @@ export const mergeAchievements = async (
|
||||
}
|
||||
}
|
||||
|
||||
// For subscribers, capture and upload screenshots first to get image URLs
|
||||
let achievementsWithImages = [...mergedLocalAchievements];
|
||||
|
||||
if (
|
||||
newAchievements.length &&
|
||||
userPreferences.enableAchievementScreenshots === true
|
||||
) {
|
||||
try {
|
||||
for (const achievement of newAchievements) {
|
||||
try {
|
||||
const achievementData = achievementsData.find(
|
||||
(steamAchievement) => {
|
||||
return (
|
||||
achievement.name.toUpperCase() ===
|
||||
steamAchievement.name.toUpperCase()
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
const achievementDisplayName =
|
||||
achievementData?.displayName || achievement.name;
|
||||
|
||||
const screenshotPath =
|
||||
await ScreenshotService.captureDesktopScreenshot(
|
||||
game.title,
|
||||
achievementDisplayName
|
||||
);
|
||||
|
||||
const uploadResult = await AchievementImageService.uploadAchievementImage(
|
||||
game.objectId,
|
||||
achievement.name,
|
||||
screenshotPath
|
||||
);
|
||||
|
||||
// Update the achievement with the image URL for API sync
|
||||
const achievementIndex = achievementsWithImages.findIndex(
|
||||
(a) => a.name.toUpperCase() === achievement.name.toUpperCase()
|
||||
);
|
||||
if (achievementIndex !== -1 && uploadResult.imageUrl) {
|
||||
achievementsWithImages[achievementIndex] = {
|
||||
...achievementsWithImages[achievementIndex],
|
||||
imageUrl: uploadResult.imageUrl,
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
achievementsLogger.error(
|
||||
"Failed to upload achievement image",
|
||||
error
|
||||
);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
achievementsLogger.error(
|
||||
"Failed to capture screenshot for achievement",
|
||||
error
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
const shouldSyncWithRemote =
|
||||
game.remoteId &&
|
||||
(newAchievements.length || AchievementWatcherManager.hasFinishedPreSearch);
|
||||
@@ -170,7 +229,7 @@ export const mergeAchievements = async (
|
||||
"/profile/games/achievements",
|
||||
{
|
||||
id: game.remoteId,
|
||||
achievements: mergedLocalAchievements,
|
||||
achievements: achievementsWithImages,
|
||||
},
|
||||
{ needsSubscription: !newAchievements.length }
|
||||
)
|
||||
@@ -186,56 +245,10 @@ export const mergeAchievements = async (
|
||||
await saveAchievementsOnLocal(
|
||||
game.objectId,
|
||||
game.shop,
|
||||
mergedLocalAchievements,
|
||||
achievementsWithImages,
|
||||
publishNotification
|
||||
);
|
||||
}
|
||||
|
||||
if (
|
||||
newAchievements.length &&
|
||||
userPreferences.enableAchievementScreenshots === true
|
||||
) {
|
||||
try {
|
||||
for (const achievement of newAchievements) {
|
||||
try {
|
||||
const achievementData = achievementsData.find(
|
||||
(steamAchievement) => {
|
||||
return (
|
||||
achievement.name.toUpperCase() ===
|
||||
steamAchievement.name.toUpperCase()
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
const achievementDisplayName =
|
||||
achievementData?.displayName || achievement.name;
|
||||
|
||||
const screenshotPath =
|
||||
await ScreenshotService.captureDesktopScreenshot(
|
||||
game.title,
|
||||
achievementDisplayName
|
||||
);
|
||||
|
||||
await AchievementImageService.uploadAchievementImage(
|
||||
game.objectId,
|
||||
achievement.name,
|
||||
screenshotPath,
|
||||
game.shop
|
||||
);
|
||||
} catch (error) {
|
||||
achievementsLogger.error(
|
||||
"Failed to upload achievement image",
|
||||
error
|
||||
);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
achievementsLogger.error(
|
||||
"Failed to capture screenshot for achievement",
|
||||
error
|
||||
);
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch((err) => {
|
||||
if (err instanceof SubscriptionRequiredError) {
|
||||
@@ -249,7 +262,7 @@ export const mergeAchievements = async (
|
||||
return saveAchievementsOnLocal(
|
||||
game.objectId,
|
||||
game.shop,
|
||||
mergedLocalAchievements,
|
||||
achievementsWithImages,
|
||||
publishNotification
|
||||
);
|
||||
})
|
||||
@@ -260,7 +273,7 @@ export const mergeAchievements = async (
|
||||
await saveAchievementsOnLocal(
|
||||
game.objectId,
|
||||
game.shop,
|
||||
mergedLocalAchievements,
|
||||
achievementsWithImages,
|
||||
publishNotification
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user