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:
Moyasee
2025-10-24 23:50:59 +03:00
parent f1f69e6dbd
commit a1f419957f
9 changed files with 136 additions and 141 deletions

View File

@@ -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);

View File

@@ -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
);
}