にへるつおるぐ | src | ブログ | コンタクト | 統計 |

ソースコード・スクリプト・パッチ置き場

Items that do not fit in other categories

2009-03-17 15:19:52 JST-9 | akebia | General | コメント | トラックバック | 履歴
NP_Popularity.php
<?php
class NP_Popularity extends NucleusPlugin{
  function getName()   {return 'Popularity';}
  function getAuthor() {return 'akebia'; }
  function getURL()    {return 'http://nyan.co.uk/akebia/item/372';}
  function getVersion(){return '1.4';}
  function getDescription()
    {return "<%Popularity(order,num,catid,blogid)%>"; }
  function supportsFeature($f){switch($f){
    case 'SqlTablePrefix': case 'SqlApi': return 1; default: return 0;}}
  function getMinNucleusVersion(){return '350';}
  function getTableList(){return sql_table('plugin_popularity');}
  function getEventList ()
    {return array ('PostPluginOptionsUpdate', 'PreDeleteItem',
      'PreDeleteBlog', 'PreUpdateItem');}
  function install(){
    sql_query('CREATE TABLE IF NOT EXISTS '.sql_table('plugin_popularity').'('.
      'id INT KEY,'.
      'views INT NOT NULL,'.
      'ip VARCHAR(255) NOT NULL,'.
      'ctime BIGINT UNSIGNED NOT NULL,'.
      'score INT NOT NULL,'.
      'INDEX(views),'.
      'INDEX(score)'.
    ')');
    $this->createOption('IgnoreRepeat','同じIPからの反復を無視しますか?','yesno','yes');
    $this->createOption('Cleanup','アンインストール時、データベースをクリアしますか?','yesno','no');
    $this->createOption('SA','スコア計算時、アイテムの表示回数に乗ずる数(秒)','text','864000');
    $this->createOption('SD','スコア計算に必要な最低期間(秒)','text','1200');
    $this->createOption('SB','ハイスコア順のリストに出力するアイテムの最低表示回数','text','4');
    $this->createOption('SC','ロースコア順のリストに出力するアイテムの最低表示回数','text','1');
    $this->createOption('exclusion','除外するIP(複数の場合、","で区切る)','text','');
  }
  function event_PostPluginOptionsUpdate($data){
    if(!($this->getOption('SD') > 0)){$this->setOption('SD', 1);}
  }
  function unInstall(){
    if($this->getOption('Cleanup') == 'yes')
      sql_query('DROP TABLE '.sql_table('plugin_popularity'));
  }
  function doTemplateVar(&$item, $order, $num = '', $cat = '', $blog = ''){
    $itemid = $item->itemid;
    switch ($order){
      case 'score': echo quickQuery('SELECT score as result FROM '.
        sql_table('plugin_popularity').' WHERE id='.$itemid); return;
      case 'views': echo quickQuery('SELECT views as result FROM '.
        sql_table('plugin_popularity').' WHERE id='.$itemid); return;
      case 'lisc': $this->li('score', $num, $cat, $blog); return;
      case 'livi': $this->li('views', $num, $cat, $blog); return;
    }
    $remote_ip = ServerVar('REMOTE_ADDR'); $time = time();
    $exclusion_ip = split(",", $this->getOption('exclusion'));
    foreach($exclusion_ip as $value)
      {if(ltrim(rtrim($value)) == $remote_ip) return;}
    $query = "SELECT views,ip,ctime FROM ".sql_table('plugin_popularity').
      " WHERE id=".$itemid;
    $res = sql_query($query); $row = sql_fetch_object($res);
    if(sql_num_rows($res) == 0){
      $query = "INSERT INTO ".sql_table('plugin_popularity') . 
        " VALUES ('$itemid','1','$remote_ip','$time','0')";
    }else{
      if($this->getOption('IgnoreRepeat') == 'yes')
        if($remote_ip == $row->ip) return;
      $time -= $row->ctime;
      if($time >= $this->getOption('SD')){
        $views = $row->views;
        $score = intval($views * $this->getOption('SA') / $time);
        $views++;
      }else{
        $score = -1;
        $views = $row->views + 1;
      }
      $query = "UPDATE ".sql_table('plugin_popularity') .
        " SET ip='$remote_ip',views='$views',score='$score' WHERE id=$itemid";
    }
      sql_query($query);
  }
  function doSkinVar($skinType, $order, $num = '', $cat = '', $blog = ''){
    switch ($order){
      case 'lisc': $this->li('score', $num, $cat, $blog); return;
      case 'livi': $this->li('views', $num, $cat, $blog); return;
    }
  }
  function li($order, $num, $cat = '', $blog = ''){
    $num = intval($num);
    $blog = $blog == '' ? $GLOBALS['blogid'] : intval($blog);
    $cat = $cat == '' ? $GLOBALS['catid'] : intval($cat);
    $blog = $blog ? " AND i.iblog = $blog" : '';
    $cat = $cat ? " AND i.icat = $cat" : '';
    if($order == 'score'){
      $minv = $num >= 0 ? $this->getOption('SB') : $this->getOption('SC');
      $minv = " AND v.views >= $minv AND v.score >= 0";
    }else{
      $minv = '';
    }
    if($num >= 0){$od = 'DESC';}else{$od = 'ASC'; $num = -$num;}
    $q = "SELECT i.inumber id,v.views views,v.score score,i.ititle title".
      " FROM ".sql_table('plugin_popularity')." v, ".sql_table('item')." i".
      " WHERE v.id = i.inumber AND i.idraft = 0".$cat.$blog.$minv.
      " ORDER BY $order $od ".
      " LIMIT 0, ".$num;
    $res = sql_query($q);
    if($GLOBALS['catid']){$ext['catid'] = $GLOBALS['catid'];}
    echo "<ol>";
    while($row = sql_fetch_array($res)){
      echo '<li><a href="'.createItemLink($row['id'], $ext).'">'.($row['title']).
        '<small>('.$row['score'].'/'.$row['views'].')</small></a></li>';
    }
    echo "</ol>";
  }
  function event_PreDeleteItem(&$data) {
    sql_query(
      'DELETE FROM '.sql_table('plugin_popularity').
      ' WHERE id = '.$data['itemid']
    );
  }
  function event_PreUpdateItem(&$data) {
    $q = 'SELECT i.idraft result FROM '.sql_table('item').' i'.
      ' WHERE i.inumber='.$data['itemid'];
    if(quickQuery($q)) $this->event_PreDeleteItem($data);
  }
  function event_PreDeleteBlog(&$data) {
    sql_query(
      'DELETE v FROM '.
        sql_table('plugin_popularity').' v, '.sql_table('item').' i'.
      ' WHERE v.id = i.inumber AND i.iblog = '.$data['blogid']
    );
  }
}
?>

Comments

No comments yet

Add Comment

Trackback

このトラックバックURL(右クリックして、リンクのURLをコピー)を使ってこの記事にトラックバックを送ることができます。もしあなたのブログがトラックバック送信に対応していない場合にはこちらのフォームからトラックバックを送信することができます。トラックバックの手動送信に失敗したり、拒否された場合には、あけび猫が入力しますので、こちらまでご連絡下さい。重複したトラックバックは、自動的に1つにまとめられるようなので、気軽に色々試してみて下さい。


http://2hz.org/src/