#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum AvatarSize {
#[default]
Small,
Medium,
Full,
}
pub fn get_avatar_url_from_hash(hash: &str, size: AvatarSize) -> Option<String> {
if hash.is_empty() {
return None;
}
let base_url = "https://avatars.akamai.steamstatic.com/";
let suffix = match size {
AvatarSize::Full => "_full.jpg",
AvatarSize::Medium => "_medium.jpg",
AvatarSize::Small => ".jpg",
};
Some(format!("{}{}{}", base_url, hash, suffix))
}
pub fn get_avatar_hash_from_url(url: &str) -> Option<String> {
if url.is_empty() {
return None;
}
const SUFFIXES: [&str; 3] = ["_full.jpg", "_medium.jpg", ".jpg"];
for suffix in SUFFIXES {
if let Some(before_suffix) = url.strip_suffix(suffix) {
if let Some(hash) = before_suffix.rsplit('/').next() {
if !hash.is_empty() {
return Some(hash.to_string());
}
}
}
}
None
}
pub fn get_avatar_hash_from_multiple_urls(urls: &[&str]) -> Option<String> {
for url in urls {
if let Some(hash) = get_avatar_hash_from_url(url) {
return Some(hash);
}
}
None
}
pub(crate) fn extract_custom_url(url: &str) -> Option<String> {
url.find("/id/").map(|start| url[start + 4..].trim_matches('/').to_string())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_get_avatar_url_from_hash() {
assert_eq!(get_avatar_url_from_hash("fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb", AvatarSize::Full), Some("https://avatars.akamai.steamstatic.com/fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb_full.jpg".to_string()));
assert_eq!(get_avatar_url_from_hash("abc123", AvatarSize::Medium), Some("https://avatars.akamai.steamstatic.com/abc123_medium.jpg".to_string()));
assert_eq!(get_avatar_url_from_hash("abc123", AvatarSize::Small), Some("https://avatars.akamai.steamstatic.com/abc123.jpg".to_string()));
assert_eq!(get_avatar_url_from_hash("", AvatarSize::Full), None);
}
#[test]
fn test_get_avatar_hash_from_url() {
assert_eq!(get_avatar_hash_from_url("https://avatars.akamai.steamstatic.com/fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb_full.jpg"), Some("fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb".to_string()));
assert_eq!(get_avatar_hash_from_url("https://avatars.akamai.steamstatic.com/abc123_medium.jpg"), Some("abc123".to_string()));
assert_eq!(get_avatar_hash_from_url("https://avatars.akamai.steamstatic.com/xyz789.jpg"), Some("xyz789".to_string()));
assert_eq!(get_avatar_hash_from_url(""), None);
assert_eq!(get_avatar_hash_from_url("https://example.com/image.png"), None);
}
#[test]
fn test_get_avatar_hash_from_multiple_urls() {
let urls = vec!["", "invalid_url", "https://avatars.akamai.steamstatic.com/abc123_full.jpg", "https://avatars.akamai.steamstatic.com/xyz789_medium.jpg"];
assert_eq!(get_avatar_hash_from_multiple_urls(&urls), Some("abc123".to_string()));
let invalid_urls = vec!["", "invalid", "https://example.com/image.png"];
assert_eq!(get_avatar_hash_from_multiple_urls(&invalid_urls), None);
let empty: Vec<&str> = vec![];
assert_eq!(get_avatar_hash_from_multiple_urls(&empty), None);
}
}