'use strict'; import * as fs from 'fs'; import { Uri } from 'vscode'; import { GravatarDefaultStyle } from './config'; import { Strings } from './system'; import { ContactPresenceStatus } from './vsls/vsls'; import { Container } from './container'; const avatarCache = new Map(); const missingGravatarHash = '00000000000000000000000000000000'; const presenceCache = new Map(); const gitHubNoReplyAddressRegex = /^(?:(?\d+)\+)?(?[a-zA-Z\d-]{1,39})@users\.noreply\.github\.com$/; export function clearAvatarCache() { avatarCache.clear(); } function getAvatarUriFromGitHubNoReplyAddress(email: string | undefined, size: number = 16): Uri | undefined { if (email == null || email.length === 0) return undefined; const match = gitHubNoReplyAddressRegex.exec(email); if (match == null) return undefined; const [, userId, userName] = match; return Uri.parse(`https://avatars.githubusercontent.com/${userId ? `u/${userId}` : userName}?size=${size}`); } export function getAvatarUri(email: string | undefined, fallback: GravatarDefaultStyle, size: number = 16): Uri { const hash = email != null && email.length !== 0 ? Strings.md5(email.trim().toLowerCase(), 'hex') : missingGravatarHash; const key = `${hash}:${size}`; let avatar = avatarCache.get(key); if (avatar !== undefined) return avatar; avatar = getAvatarUriFromGitHubNoReplyAddress(email, size) ?? Uri.parse(`https://www.gravatar.com/avatar/${hash}.jpg?s=${size}&d=${fallback}`); avatarCache.set(key, avatar); return avatar; } export function getPresenceDataUri(status: ContactPresenceStatus) { let dataUri = presenceCache.get(status); if (dataUri === undefined) { const contents = fs .readFileSync(Container.context.asAbsolutePath(`images/dark/icon-presence-${status}.svg`)) .toString('base64'); dataUri = encodeURI(`data:image/svg+xml;base64,${contents}`); presenceCache.set(status, dataUri); } return dataUri; }