- '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<string, Uri>();
- const missingGravatarHash = '00000000000000000000000000000000';
-
- const presenceCache = new Map<ContactPresenceStatus, string>();
-
- const gitHubNoReplyAddressRegex = /^(?:(?<userId>\d+)\+)?(?<userName>[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;
- }
|