source: spip-zone/_plugins_/omnipresence/inc/omnipresence.php @ 30903

Last change on this file since 30903 was 30903, checked in by da@…, 11 years ago

Import du projet Omnipresence.
La structure générale du code a été nonchalamment pompée sur Gravatar.

File size: 4.3 KB
Line 
1<?php
2
3// Champs utilisés
4define('CHAMP_SERVEUR_OMNIPRESENCE', 'omnipresence_serveur');
5define('CHAMP_JID', 'jid');
6
7// Serveur Omniprésence par dépit si rien n'est précisé comme serveur par défaut
8// La changer également définie dans fonds/cfg_omnipresence.html
9// TODO: Définir la chaîne à un seul endroit.
10define('OMNIPRESENCE_SERVEUR_DEFAUT_DEFAUT', 'http://presence.jabberfr.org');
11
12// notre fonction de recherche de logo
13function calcule_logo_ou_avatar($jid, $host) {
14        $a = func_get_args();
15        $jid = array_shift($a);
16        $host = array_shift($a);
17
18        // la fonction normale
19        $c = call_user_func_array('calcule_logo',$a);
20
21        // si elle repond pas, on va chercher l'avatar
22        if (!$c[0]) {
23                $c[0] = demander_action('avatar', $jid, $host, $url = True);
24        }
25
26        return $c;
27}
28
29function omnipresence_verifier_index($tmp) {
30        static $done = false;
31        if ($done) return;
32        $done = true;
33        if (!file_exists($tmp.'index.php'))
34                ecrire_fichier ($tmp.'index.php', '<?php
35        foreach(glob(\'./*.{png,gif,jpg,bmp}\', GLOB_BRACE) as $i)
36                echo "<img src=\'$i\' />\n";
37?>'
38                );
39}
40
41// Récupère l'information sur le serveur, écrit le résultat en cache.
42// Si c'est une image, $cache est renommé pour refléter le type de l'image.
43function omnipresence_recuperer_info(&$cache, $md5_jid, $action, $host) {
44        include_spip("inc/distant");
45        if ('' == $host) {
46                $host = lire_config('omnipresence/omnipresence_serveur_defaut', '');
47                if ('' == $host)
48                        $host = OMNIPRESENCE_SERVEUR_DEFAUT_DEFAUT;
49        }
50        $data = recuperer_page("$host/$md5_jid/$action");
51        ecrire_fichier($cache, $data);
52        $info = @getimagesize($cache);
53        $img_ext = array(
54                IMAGETYPE_PNG => 'png',
55                IMAGETYPE_GIF => 'gif',
56                IMAGETYPE_JPEG => 'jpg',
57                IMAGETYPE_BMP => 'bmp',
58                // IMAGETYPE_ICO => 'ico', // Seulement à partir de PHP 5.3.0
59        );
60        if (array_key_exists($info[2], $img_ext)) {
61                $cache_new = $cache . '.' . $img_ext[$info[2]];
62                rename($cache, $cache_new);
63                $cache = $cache_new;
64        }
65        return $data;
66}
67
68// Fonction principale. Demande une information, stocke le résultat en cache,
69// renvoie le résultat sous forme d'URL, de contenu ou de balise IMG.
70// Pour les données rarement changées (avatar), on garde une liste des JID
71// qui n'ont pas renvoyé de réponse, pour ne pas redemander l'info trop
72// souvent. On les garde aussi en cache plus longtemps (10 min au lieu de 24h).
73// Pour référence, les actions demandées par les balises de ce plugin sont :
74// - avatar, image, text, message
75// - pep/mood/value, pep/mood/text.txt, pep/mood/image.png
76// - pep/activity/value.txt, pep/activity/text.txt, pep/activity/image.png
77// - pep/tune.txt, pep/tune/artist.txt, pep/tune/song.txt
78// -> image peut être image-nomdetheme
79// -> text peut être text-locale
80// -> */value.txt peut être value-locale.txt
81function demander_action($action, $jid, $host, $url = False) {
82        static $nb;
83        static $max;
84        $nb[$action] = 8; // ne pas en charger plus de 8 anciens par tour
85        $max[$action] = 10; // et en tout etat de cause pas plus de 10 nouveaux
86        $rarely_changed = array('avatar');
87
88        if (!strlen($jid))
89                return '';
90        $tmp = sous_repertoire(_DIR_VAR, "cache-omnipresence");
91        $md5_jid = md5(strtolower($jid));
92        $cache = $tmp.$md5_jid.'-'.urlencode($action);
93        $expiry = (in_array($action, $rarely_changed)) ? 60*60*24 : 60*10;
94        $binary_content = preg_match('/image-?.*|avatar/', $action);
95
96        if ((!file_exists("$cache")
97        OR (
98                (time() - $expiry > filemtime($cache))
99                AND $nb[$action] > 0
100          ))
101        ) {
102                // Pas de cache, ou bien : cache trop ancien + il reste des actions
103                $liste_vides = "$tmp$action-vides.txt";
104                lire_fichier($liste_vides, $vides);
105                $vides = @unserialize($vides);
106                if ((!isset($vides[$md5_jid])
107                OR time() - $vides[$md5_jid] > 3600*8
108                ) AND $max[$action]-- > 0) {
109                        // md5 inconnu dans vides, ou bien: md5 trop ancien + on est pas au max
110                        $nb[$action]--;
111                        if (omnipresence_recuperer_info($cache, $md5_jid, $action, $host)) {
112                                spip_log("Jabber: $action ok pour $jid");
113                        } else {
114                                if (in_array($action, $rarely_changed)) {
115                                        $vides[$md5_jid] = time();
116                                        ecrire_fichier($liste_vides, serialize($vides));
117                                }
118                        }
119                        omnipresence_verifier_index($tmp);
120                }
121        }
122        // On verifie si l'info existe en controlant la taille du fichier
123        if (@filesize($cache)) {
124                if ($url) {
125                        return $cache;
126                } else {
127                        if ($binary_content) {
128                                return "<img src=\"$cache\" />";
129                        } else {
130                                lire_fichier($cache, $contenu);
131                                return $contenu;
132                        }
133                }
134        } else
135                return '';
136}
137
138?>
Note: See TracBrowser for help on using the repository browser.