35
36:- module(avatar,
37 [ email_gravatar/2, 38 valid_gravatar/1, 39 random_avatar/1, 40 release_avatar/1, 41
42 clean_avatar_cache/0
43 ]). 44:- use_module(library(uri)). 45:- use_module(library(md5)). 46:- use_module(library(lists)). 47:- use_module(library(random)). 48:- use_module(library(apply)). 49:- use_module(library(http/http_path)). 50:- use_module(library(http/http_open)). 51:- use_module(library(error)).
63email_gravatar(Email, AvatarURL) :-
64 downcase_atom(Email, CanonicalEmail),
65 md5_hash(CanonicalEmail, Hash, []),
66 atom_concat('/avatar/', Hash, Path),
67 uri_data(scheme, Components, http),
68 uri_data(authority, Components, 'www.gravatar.com'),
69 uri_data(path, Components, Path),
70 uri_components(AvatarURL, Components).
77valid_gravatar(URL) :-
78 string_concat(URL, "?d=404", URL2),
79 catch(http_open(URL2, In, [method(head)]),
80 error(existence_error(_,_),_),
81 fail),
82 close(In).
94random_avatar(AvatarURL) :-
95 avatar_cache(_Size),
96 repeat,
97 findall(I, free_avatar(I), L),
98 ( L == []
99 -> resource_error(avatars)
100 ; random_member(A, L),
101 avatar(A, AvatarURL),
102 with_mutex(avatar, claim_avatar(A)),
103 !
104 ).
105
106free_avatar(I) :-
107 avatar(I, _),
108 \+ used_avatar(I).
109
110claim_avatar(I) :-
111 used_avatar(I), !, fail.
112claim_avatar(I) :-
113 assertz(used_avatar(I)).
119release_avatar(URL0) :-
120 atom_string(URL, URL0),
121 forall(avatar(I, URL),
122 retractall(used_avatar(I))).
123
124clean_avatar_cache :-
125 retractall(avatar_cache_size(_)),
126 retractall(avatar(_,_)).
127
128:- dynamic
129 used_avatar/1,
130 avatar_cache_size/1,
131 avatar/2. 132:- volatile
133 used_avatar/1,
134 avatar_cache_size/1,
135 avatar/2. 136
137avatar_cache(Size) :-
138 avatar_cache_size(Size), !.
139avatar_cache(Size) :-
140 findall(Path, avatar_path(Path), Paths),
141 foldl(assert_avatar, Paths, 0, Size0),
142 assertz(avatar_cache_size(Size0)),
143 Size = Size0.
144
145avatar_path(icons(avatar/File)) :-
146 absolute_file_name(icons(avatar), Dir,
147 [ file_type(directory),
148 solutions(all)
149 ]),
150 directory_files(Dir, Files),
151 member(File, Files),
152 file_name_extension(_, Ext, File),
153 downcase_atom(Ext, LwrExt),
154 image_extension(LwrExt).
155
156image_extension(png).
157image_extension(jpg).
158image_extension(jpeg).
159image_extension(gif).
160
161assert_avatar(Path, N, N2) :-
162 http_absolute_location(Path, HREF, []),
163 assertz(avatar(N, HREF)),
164 N2 is N+1
Avatar management
This module provides access to avatar handling. */