fortunes_filename = $fortunes_filename; $this->users_filename = $users_filename; $this->colors_filename = $colors_filename; $this->users = Array(); $this->_loadUsers($users_filename); $this->colors = Array(); $this->_loadColors($colors_filename); } function _loadUsers($filename){ if (is_file($filename)){ $fp = fopen ($filename,"r"); while ($data = fgetcsv($fp, 1000, ",")){ $this->users[$data[0]]['url'] = $data[1]; if (isset($data[2])) { $this->users[$data[0]]['color'] = $data[2]; } } fclose ($fp); return count($this->users); } return false; } function _loadColors($filename){ $colors = file($filename); foreach ($colors as $color){ if (trim($color) != ''){ $this->colors[] = $color; } } return count($this->colors); } function getColor($string){ $n = 0; $txt_sum = 0; //On essaie de trouver dans la liste des utilisateurs $keys = array_keys($this->users); foreach ($keys as $key) { if (preg_match ('/'.addslashes($key).'/i', $string)) { if (isset($this->users[$key]['color'])) { return $this->users[$key]['color']; } } } //Sinon on hashe le pseudo pour obtenir la couleur $pseudocolors = array ( 19, 20, 22, 24, 25, 26, 27, 28, 29 ); while ($ncolors[$pseudocolors[$txt_sum]]; } } /****************************************************************************** * Classe CookieJar * ******************************************************************************/ class CookieJar{ var $config; var $cookies; var $conn; /** * Et si on faisait des fortunes cookies ? */ function CookieJar($config){ $this->config = $config; $this->conn = sqlite_open($this->config->fortunes_filename); } /** * Sort les fortune cookies du four */ function load($id='all', $count='', $order='id DESC', $nick=''){ $sql = " SELECT ROWID as id, author, date, mode, online, fortune, vote FROM fortunes WHERE online = 1"; if ($id != 'all'){ $sql .= ' AND id = '.(int)$id; } if (!empty($nick)){ $sql .= " AND fortune LIKE '%<".sqlite_escape_string($nick).">%'"; } if (!empty($order)){ $sql .= 'ORDER BY '.$order; } if (!empty($count)){ $sql .= ' LIMIT '.$count; } $result = sqlite_query($sql, $this->conn); while ($row = sqlite_fetch_array($result)){ $this->cookies[] = new FortuneCookie($row,$this->config); } } /** * Compte le nombre de fortune cookies dans la boîte */ function count(){ return count($this->cookies); } /** * Prend un fortune cookie au hasard */ function getRandomFortune(){ return array_rand($this->cookies); } function loadRandomFortune() { $this->load('all'); $idCookie = $this->getRandomFortune(); $this->cookies = array(); $this->load($idCookie); } /** * Enfourne un fortune cookie */ function addFortune($author, $texte, $mode){ $texte = str_replace("\r", '', $texte); $sql = " INSERT INTO fortunes (author, date, mode, online, fortune, vote) VALUES ( '".sqlite_escape_string($author)."', '".date("Y-m-d H:i:s")."', '".sqlite_escape_string($mode)."', 1, '".sqlite_escape_string($texte)."', 0 )"; sqlite_query($sql, $this->conn); return sqlite_changes($this->conn); } /** * Dire que le cookie est vraiment miam */ function vote($id, $inc=1){ $votes = CookieJar::getVotes(); if (!isset($votes[$id])) { //Update $sql = " UPDATE fortunes SET vote = vote + $inc WHERE ROWID = ".(int)$id; sqlite_query($sql, $this->conn); $votes[$id] = 1; setcookie('votes', addslashes(serialize($votes)), time()+60*60*24*365); setcookie('tricher','pas_bien', time()+60*60*24*365); //Nouvelle valeur $sql = "SELECT vote FROM fortunes WHERE ROWID = ".(int)$id; $result = sqlite_query($sql, $this->conn); if ($row = sqlite_fetch_array($result)){ return $row['vote']; } } else { return 0; } } function getVotes(){ $votes = Array(); if (isset($_COOKIE['votes'])){ $votes = unserialize(stripslashes($_COOKIE['votes'])); } return $votes; } /** * On planque un cookie */ function offline($id){ $sql = " UPDATE fortunes SET online = 0 WHERE ROWID = ".sqlite_escape_string($id); sqlite_query($sql, $this->conn); return sqlite_changes($this->conn); } /** * On restitue un cookie planqué */ function online($id){ $sql = " UPDATE fortunes SET online = 1 WHERE ROWID = ".sqlite_escape_string($id); sqlite_query($sql, $this->conn); return sqlite_changes($this->conn); } /* function convertCookies(){ $votes = Array(); //Convert old cookies to new cookies if (isset($_COOKIE['fortunes'])){ $votes = $_COOKIE['fortunes']; setcookie('votes', addslashes(serialize($votes)), time()+60*60*24*365); //Make them available now $_COOKIES['votes'] = $votes; } } */ } /****************************************************************************** * Classe FortuneCookie * ******************************************************************************/ class FortuneCookie{ var $config; var $id; var $header; var $content; var $users; function FortuneCookie($data, $config){ $this->config = $config; $this->id = $data['id']; $this->header['author'] = $data['author']; $this->header['date'] = strtotime($data['date']); $this->header['mode'] = $data['mode']; $this->header['online'] = $data['online']; $this->header['vote'] = $data['vote']; $this->content = explode("\n",$data['fortune']); } /** * Methodes "publiques" **************************************************************************/ function getId(){ return $this->id; } function getAuthor(){ return $this->header['author']; } function getDate($format = 'Y-m-d H:i:s'){ return date($format, $this->header['date']); } function getMode(){ return $this->header['mode']; } function getVote(){ return $this->header['vote']; } function getRawContent(){ return implode("\n", $this->content); } function getHTML(){ $result = ''; $result.= '
\n"; foreach ($this->content as $line){ if (trim($line) != ''){ //Enlève l'heure $line = FortuneCookie::_filterRemoveDate($line); if ($parts = FortuneCookie::_isSpeech($line)){ //le nickname passe à travers plusieurs filtres successifs $line_nick = FortuneCookie::_filter( $parts[1], array( '_filterRemoveBrackets', '_filterAddNickColor', '_filterAddNickLinks', ) ); //le speech passe à travers plusieurs filtres successifs $line_speech = FortuneCookie::_filter( htmlentities($parts[2]), array( '_filterMakeURLLinks', '_filterTrimFirstSpace' ) ); $result.= "
".utf8_encode($line_nick)."
\n"; $result.= "
".utf8_encode($line_speech)."
\n"; } else{ $result.= "
 
\n"; $result.= "
".utf8_encode(htmlspecialchars($line))."
\n"; } } } $result.= "
\n"; return $result; } function getAtomEntry(){ $result = ' fortune '.$this->getId().' '.$this->getDate("Y-m-d\TH:i:s\Z").' '.$this->getDate("Y-m-d\TH:i:s\Z").' '.$this->getAuthor().' getHTML().' ]]> '; return $result; } function getAtom10Entry(){ $url_parts = parse_url(FORTUNES_URL); $result = ' fortune '.$this->getId().' tag:'.$url_parts['host'].','.$this->getDate("Y").':'.$this->getId().' '.$this->getDate("Y-m-d\TH:i:s\Z").' '.$this->getDate("Y-m-d\TH:i:s\Z").' '.$this->getAuthor().' getHTML().' ]]> '; return $result; } /** * Methodes "privées" **************************************************************************/ function _parseHeader($string){ $parts = explode(',', $string); $header = Array( 'author' => trim($parts[0]), 'date' => strtotime(trim($parts[1])), 'mode' => (isset($parts[2])) ? trim($parts[2]) : 'normal' ); return $header; } function _isSpeech($string){ if (preg_match('/^(<[^<>]+>)(.*)/',$string, $matches)){ return $matches; } return false; } function _isThought($string){ return preg_match('/^\*.*/', $string); } function _isMovement($string){ return preg_match('/^(<--|-->).*/', $string); } /** * Filtrage **************************************************************************/ function _filter($string, $filters_names){ foreach($filters_names as $filter_name){ $string = FortuneCookie::$filter_name($string); } return $string; } /** * Enlève le premier et le dernier caractère */ function _filterRemoveBrackets($string){ if ($string == ''){ return $string; } else{ return substr($string,1,-1); } } /** * Enlève l'heure */ function _filterRemoveDate($string){ return preg_replace('/^\[\d+:\d+\]\s+/','', $string); } /** * Transforme les URL (http/https) en liens */ function _filterMakeURLLinks($string){ $string = preg_replace('`(http)+(s)?:(//)(\S+)?`i', '${0}', $string); return $string; } /** * Ajoute de la couleur à un pseudo * FIXME : découper ce filtre en deux pour ajouter les <> séparément */ function _filterAddNickColor($string){ return '<'.$string.'>'; } /** * Ajoute les liens aux pseudos */ function _filterAddNickLinks($string){ if (count($this->config->users) > 0) { $keys = array_keys($this->config->users); foreach ($keys as $key) { $search[] = '/('.addslashes($key).')/i'; $replace[] = '${1}'; } $string = preg_replace($search, $replace, $string); } return $string; } /** * Enlève le premier espace d'une chaine */ function _filterTrimFirstSpace($string){ if (!empty($string)){ if ($string{0} == ' '){ return substr($string, 1); } } return $string; } } ?>