- {#if activity.assets?.large_image}
+ {#if activity.assets?.large_image || activity.app_icon}

diff --git a/src/lib/discord/fetchUserImages.ts b/src/lib/discord/fetchUserImages.ts
index e8b1f4d..065de30 100644
--- a/src/lib/discord/fetchUserImages.ts
+++ b/src/lib/discord/fetchUserImages.ts
@@ -15,6 +15,7 @@ export type Activity = {
application_id?: string | null;
assets?: { large_image?: string | null; small_image?: string | null };
emoji?: { id?: string; animated?: boolean } | null;
+ app_icon?: string | null;
};
export type Data = {
@@ -114,6 +115,8 @@ export async function fetchUserImages(data: Data, settings: ProfileSettings) {
ImageSize.ACTIVITY_LARGE,
settings.theme || null
);
+ else if (activity?.app_icon)
+ assetLargeImage = await encodeBase64(activity.app_icon, ImageSize.ACTIVITY_LARGE);
if (activity?.assets?.small_image)
assetSmallImage = await encodeBase64(
diff --git a/src/lib/discordbot.ts b/src/lib/discordbot.ts
index fc571ed..b57e7d8 100644
--- a/src/lib/discordbot.ts
+++ b/src/lib/discordbot.ts
@@ -6,7 +6,7 @@ class Bot {
private client: Client;
// Normalize a discord.js Activity object into a simple POJO
- private mapActivity(a: any) {
+ private async mapActivity(a: any) {
const type = typeof a.type === 'number' ? a.type : (ActivityType[a.type] ?? a.type);
const application_id = a.applicationId ?? a.application_id ?? null;
@@ -23,6 +23,17 @@ class Bot {
return raw;
};
+ let app_icon = null;
+ if (type === 0 && application_id) {
+ try {
+ const appUser = await this.client.users.fetch(application_id);
+ app_icon = appUser.displayAvatarURL({ extension: 'webp', size: 128 });
+ } catch (e) {
+ // Placeholder for apps that don't have a bot user
+ app_icon = "https://cdn.discordapp.com/embed/avatars/0.png";
+ }
+ }
+
return {
name: a.name ?? null,
type,
@@ -33,6 +44,7 @@ class Bot {
large_image: formatAsset(rawLarge),
small_image: formatAsset(rawSmall)
},
+ app_icon,
emoji: a.emoji ? { id: a.emoji.id ?? null, animated: !!a.emoji.animated } : null
};
}
@@ -91,7 +103,7 @@ class Bot {
if (!presence) return { guildId, status: 'offline', activities: [], displayName: member.displayName, avatarUrl, guildTag, guildTagBadgeImage };
const status = presence.status;
- const activities = (presence.activities || []).map((a: any) => this.mapActivity(a));
+ const activities = await Promise.all((presence.activities || []).map(async (a: any) => await this.mapActivity(a)));
return { guildId, status, activities, displayName: member.displayName, avatarUrl, guildTag, guildTagBadgeImage };
} catch (err) {