Advertisement
Guest User

pixmicat_mod_pushposh

a guest
Aug 4th, 2010
377
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 13.76 KB | None | 0 0
  1. <?php
  2. class mod_pushpost{
  3.     var $mypage;
  4.  
  5.     function mod_pushpost(){
  6.         global $PMS;
  7.         $PMS->hookModuleMethod('ModulePage', __CLASS__); // 向系統登記模組專屬獨立頁面
  8.         $this->mypage = $PMS->getModulePageURL(__CLASS__);
  9.         $this->PUSHPOST_SEPARATOR = '[MOD_PUSHPOST_USEpw5287]';
  10.         $this->PUSHPOST_DEF = 10; // 討論串最多顯示之推文筆數 (超過則自動隱藏,全部隱藏(包括動態功能):0)
  11.         $this->PUSH_EMOTIONS = array("","(゚∀゚)","(´∀`)","(*´∀`)","(*゚∇゚)","(*´д`)","(*゚ー゚)","(゚3゚)","(´ー`)","(・_ゝ・)","(´,_ゝ`)","(´_ゝ`)","(・ー・)","(・∀・)","(ゝ∀・)",
  12.             "(〃∀〃)","(*゚∀゚*)","(゚∀。)","(`д´)","(`ε´)","(`ヮ´)","σ`∀´)","゚∀゚)σ","゚∀゚)ノ","(╬゚д゚)","(|||゚д゚)","(´゚д゚`)","(゚д゚)","Σ(゚д゚)","(;゚д゚)","(;´д`)",
  13.             "(д)゚゚","(☉д⊙)","(((゚д゚)))","(`・´)","(´д`)","(-д-)","(&gt;д&lt;)","(つд⊂)","・゚(ノд`゚)","(TдT)","(*´ω`*)","(・ω・)","(`・ω・)","(´・ω)","(`・ω)",
  14.             "(´・ω・`)","(`・ω・´)","(・_っ・)","(^_っ^)","(`_っ´)","(`ー´)","(´_っ`)","(´ρ`)","(゚ω゚)","(o゚ω゚o)","(^ω^)","(・ิ㉨・ิ)","(。◕∀◕。)","ヾ(´ε`ヾ)","(ノ・ω・)ノ",
  15.             "(ノ゚∀゚)ノ","(σ゚д゚)σ","(σ゚∀゚)σ","|д`)","|ー`)","|д゚)","|∀゚)","ヽ(●´∀`●)ノ","(゚д゚≡゚д゚)","。・゚・(つд`゚)・゚・","_,._","゚Å゚)","⊂彡☆))д`)","⊂彡☆))д´)",
  16.             "⊂彡☆))∀`)","(´∀((☆ミつ"); // 表情
  17.         $this->GESTURES = array("","<","。o0","ノシ","彡","o彡゚","ゝ","ㄏ","ノ","ノ゛","ノ","ノミ","ツ","っ","っ゛","つ","つ゛","o","凸","/","y","y━・~","y-~","≡3","~♪","♬","❤",
  18.             "~♥","σ","ノ彡┴─┴","⌒*","⌒☆","⌒★","≡☆"); //發言
  19.  
  20.         AttachLanguage(array($this, '_loadLanguage')); // 載入語言檔
  21.     }
  22.  
  23.     /* Get the name of module */
  24.     function getModuleName(){
  25.         return 'mod_pushpost : 文章推文機制';
  26.     }
  27.  
  28.     /* Get the module version infomation */
  29.     function getModuleVersionInfo(){
  30.         return '4th.Release.5-dev (v100804)';
  31.     }
  32.  
  33.     /* 生成識別ID */
  34.     function _getID(){
  35.         return substr(crypt(md5(getREMOTE_ADDR().IDSEED.gmdate('Ymd', time() + TIME_ZONE * 3600)), 'id'), -8);
  36.     }
  37.  
  38.     /* 記錄pushpost */
  39.     function w_pustpost(&$postno, &$postname, &$postcom, &$posttime, &$postip){
  40.         global $PMS;
  41.         $PMS->loadModules('mod_audit');
  42.         if($mod_audit=$PMS->getModuleInstance('mod_audit')) $mod_audit->w_pushpost($postno, $postname, $postcom, $posttime, $postip);
  43.     }
  44.  
  45.     function autoHookHead(&$txt, $isReply){
  46.         global $language;
  47.         $txt .= '<style type="text/css">.pushpost { background-color: #fff; font-size: 0.8em; padding: 10px; }</style>
  48. <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script>
  49. <script type="text/javascript">
  50. // <![CDATA[
  51. jQuery(function($){
  52.     $(\'div.threadpost, div.reply\').find(\'div[@id^=openpush] > a\').bind(\'click\', function(){
  53.         $(this).parent().parent().find(\'*[@id^=openpush]\')
  54.             .filter(\'div[@id^=openpushbuttom]\').slideToggle().end()
  55.             .filter(\'div[@id^=openpushpush]\').slideToggle();
  56.         return false;
  57.     });
  58.    
  59.     $(\'div.threadpost, div.reply\').find(\'div[@id^=closepush] > a\').bind(\'click\', function(){
  60.         $(this).parent().parent().parent().find(\'*[@id^=openpush]\')
  61.             .filter(\'div[@id^=openpushpush]\').slideToggle().end()
  62.             .filter(\'div[@id^=openpushbuttom]\').slideToggle();
  63.         return false;
  64.     });
  65. });
  66. // ]]>
  67. </script>
  68. <script type="text/javascript">
  69. // <![CDATA[
  70. var lastpushpost=0;
  71. function mod_pushpostShow(pid){
  72.     $g("mod_pushpostID").value = pid;
  73.     $g("mod_pushpostName").value = getCookie("namec");
  74.     $("div#mod_pushpostBOX").insertBefore($("div#r"+pid+">.quote"));
  75.     if(lastpushpost!=pid) {
  76.         $("div#mod_pushpostBOX").show();
  77.     } else {
  78.         $("div#mod_pushpostBOX").toggle();
  79.     }
  80.     lastpushpost = pid;
  81.     return false;
  82. }
  83. function mod_pushpostSend(o3){
  84.     var o0 = $g("mod_pushpostID"), o1 = $g("mod_pushpostName"), o2 = $g("mod_pushpostComm"), pp = $("div#r"+o0.value+">.quote"), o4 = $("#push_emotion option:selected").val(), o5 = $("#gesture option:selected").val();
  85.     if(o2.value===""){ alert("'._T('modpushpost_nocomment').'"); return false; }
  86.     o3.disabled = true;
  87.     $.ajax({
  88.         url: "'.str_replace('&amp;', '&', $this->mypage).'&no="+o0.value,
  89.         type: "POST",
  90.         data: {ajaxmode: true, name: o1.value, push_emotion: o4, gesture: o5, comm: o2.value},
  91.         success: function(rv){
  92.             if(rv.substr(0, 4)!=="+OK "){ alert(rv); o3.disabled = false; return false; }
  93.             rv = rv.substr(4);
  94.             (pp.find(".pushpost").length===0)
  95.                 ? pp.append("<div class=\'pushpost\'>"+rv+"</div>")
  96.                 : pp.children(".pushpost").append("<br />"+rv);
  97.             o0.value = o1.value = o2.value = o4 = o5 =""; o3.disabled = false;
  98.             $("div#mod_pushpostBOX").hide();
  99.         },
  100.         error: function(){ alert("Network error."); o3.disabled = false; }
  101.     });
  102. }
  103. // ]]>
  104. </script>';
  105.     }
  106.  
  107.     function autoHookFoot(&$foot){
  108.         global $language;
  109.         $ecnt=count($this->PUSH_EMOTIONS);
  110.         $gcnt=count($this->GESTURES);
  111.         for($i=0;$i<$ecnt;$i++) {
  112.             $emot.="<option>".$this->PUSH_EMOTIONS[$i]."</option>\n";
  113.         }      
  114.         for($i=0;$i<$gcnt;$i++) {
  115.             $gest.="<option>".$this->GESTURES[$i]."</option>\n";
  116.         }
  117.         $foot .= '
  118. <div id="mod_pushpostBOX" style="display:none">
  119. <input type="hidden" id="mod_pushpostID" />'._T('modpushpost_pushpost').' <ul>
  120. <li>'._T('form_name').' <input type="text" id="mod_pushpostName" maxlength="20" /></li>
  121. <li>'._T('form_comment').
  122. '<select id="push_emotion" style="text-align:right;line-height:1.7em" class="push_area">'.$emot.'</select>'.
  123. '<select id="gesture" class="push_area" style="line-height:1.7em">'.$gest.'</select>'.
  124. '<input type="text" id="mod_pushpostComm" size="50" maxlength="50" /><input type="button" value="'._T('form_submit_btn').'" onclick="mod_pushpostSend(this)" /></li></ul>
  125. </div>
  126. ';
  127.     }
  128.  
  129.     function autoHookThreadPost(&$arrLabels, $post, $isReply){
  130.         global $language, $PIO;
  131.         $pushcount = '';
  132.         if($post['status'] != ''){
  133.             $f = $PIO->getPostStatus($post['status']);
  134.             $pushcount = $f->value('mppCnt'); // 被推次數
  135.         }
  136.         $arrLabels['{$QUOTEBTN}'] .= '&nbsp;<a href="'.$this->mypage.'&amp;no='.$post['no'].'" onclick="return mod_pushpostShow('.$post['no'].')">'.$pushcount._T('modpushpost_pushbutton').'</a>';
  137.         if(strpos($arrLabels['{$COM}'], $this->PUSHPOST_SEPARATOR.'<br />') !== false){
  138.             if($isReply || $pushcount <= $this->PUSHPOST_DEF) { // 回應模式
  139.            
  140.                 $arrLabels['{$COM}'] = str_replace($this->PUSHPOST_SEPARATOR.'<br />', '<div class="pushpost">', $arrLabels['{$COM}']).'</div>';
  141.                
  142.             }else { // 頁面瀏覽
  143.            
  144.                 $delimiter = strpos($arrLabels['{$COM}'], $this->PUSHPOST_SEPARATOR.'<br />'); // 定位符號位置
  145.                 $pushs = '';
  146.                 $pushcount = $pushcount - $this->PUSHPOST_DEF; //被隱藏的推文數目
  147.                 $push_array = explode('<br />', substr($arrLabels['{$COM}'], $delimiter + strlen($this->PUSHPOST_SEPARATOR.'<br />')));
  148.                 if($this->PUSHPOST_DEF > 0) {
  149.                     $pushs .= '
  150.                         <div class="pushpost">
  151.                             <div class="hide" id="openpushpush'.$arrLabels['{$NO}'].'">
  152.                                 <div id="closepushmsg'.$arrLabels['{$NO}'].'">[<a href="#">'._T('modpushpost_close').'</a>]</div>'.implode('<br />', array_slice($push_array, 0, $pushcount)).'</div>
  153.  
  154.                             <div id="openpushbuttom'.$arrLabels['{$NO}'].'"><a href="#">'._T('modpushpost_omitted').$pushcount._T('modpushpost_omitted2').'</a>
  155.                             <br />……
  156.                             </div>
  157.                             '.implode('<br />', array_slice($push_array, 0 - $this->PUSHPOST_DEF)).'';
  158.                 }else {//隱藏所有推文的話..
  159.                     $arrLabels['{$WARN_BEKILL}'] .='<span class="warn_txt2">'._T('modpushpost_omitted').$pushcount._T('modpushpost_omitted2').'</span>'."\n";
  160.                 }
  161.                 if($post['resto'] !== 0) $pushs .='</div>';
  162.                 $arrLabels['{$COM}'] = substr($arrLabels['{$COM}'], 0, $delimiter).$pushs;
  163.             }
  164.         }
  165.     }
  166.  
  167.     function autoHookThreadReply(&$arrLabels, $post, $isReply){
  168.         $this->autoHookThreadPost($arrLabels, $post, $isReply);
  169.     }
  170.  
  171.     function autoHookRegistBegin(&$name, &$email, &$sub, &$com, &$upfileInfo, $accessInfo, $isReply){
  172.         if(adminAuthenticate('check')) return; // 登入權限允許標籤留存不轉換 (後端登入修改文章後推文仍有效)
  173.         if(strpos($com, $this->PUSHPOST_SEPARATOR."\r\n") !== false){ // 防止不正常的插入標籤形式
  174.             $com = str_replace($this->PUSHPOST_SEPARATOR."\r\n", "\r\n", $com);
  175.         }
  176.     }
  177.  
  178.  
  179.     function ModulePage(){
  180.         global $PIO, $PTE, $language, $BAD_STRING;
  181.         if(!isset($_GET['no'])) die('[Error] not enough parameter.');
  182.         if(!isset($_POST['comm'])){
  183.             $post = $PIO->fetchPosts($_GET['no']);
  184.             if(!count($post)) die('[Error] Post does not exist.');
  185.  
  186.             $dat = $PTE->ParseBlock('HEADER', array('{$TITLE}'=>TITLE, '{$RESTO}'=>''));
  187.             $dat .= '</head><body id="main">';
  188.             $dat .= '<form action="'.$this->mypage.'&amp;no='.$_GET['no'].'" method="post">
  189. '._T('modpushpost_pushpost').' <ul>
  190. <li>'._T('form_name').' <input type="text" name="name" maxlength="20" /></li>
  191. <li>'._T('form_comment').'<input type="text" name="comm" size="50" maxlength="50" /><input type="submit" value="'._T('form_submit_btn').'" /></li></ul>
  192. </form>';
  193.             echo $dat, '</body></html>';
  194.         }else{
  195.             if($_SERVER['REQUEST_METHOD'] != 'POST') die(_T('regist_notpost')); // 傳送方法不正確
  196.            
  197.             // 查IP
  198.             $baninfo = '';
  199.             $ip = getREMOTE_ADDR(); $host = gethostbyaddr($ip);
  200.             if(BanIPHostDNSBLCheck($ip, $host, $baninfo)) die(_T('regist_ipfiltered', $baninfo));
  201.            
  202.             $name = CleanStr($_POST['name']); $comm = CleanStr($_POST['comm']);$push_emotion = CleanStr($_POST['push_emotion']);$gesture = CleanStr($_POST['gesture']);
  203.             if(strlen($name) > 30) die(_T('modpushpost_maxlength')); // 名稱太長
  204.             if(strlen($comm) > 160) die(_T('modpushpost_maxlength')); // 太多字
  205.             if(strlen($comm) == 0) die(_T('modpushpost_nocomment')); // 沒打字
  206.             $name = str_replace(array(_T('trip_pre'), _T('admin'), _T('deletor')), array(_T('trip_pre_fake'), '"'._T('admin').'"', '"'._T('deletor').'"'), $name);
  207.             $pushID = $this->_getID();
  208.             $pushtime = gmdate('y/m/d H:i:s', time() + intval(TIME_ZONE) * 3600);
  209.             if(preg_match('/(.*?)[##](.*)/u', $name, $regs)){
  210.                 $cap = strtr($regs[2], array('&amp;'=>'&'));
  211.                 $salt = strtr(preg_replace('/[^\.-z]/', '.', substr($cap.'H.', 1, 2)), ':;<=>?@[\\]^_`', 'ABCDEFGabcdef');
  212.                 $name = $regs[1]._T('trip_pre').substr(crypt($cap, $salt), -10);
  213.             }
  214.             if(!$name || ereg("^[ | |]*$", $name)){
  215.                 if(ALLOW_NONAME) $name = DEFAULT_NONAME;
  216.                 else die(_T('regist_withoutname')); // 不接受匿名
  217.             }
  218.            
  219.             $pushpost = '<font color="#117743">'.$name.'</font> : '.$push_emotion.$gesture.$comm.'<font color="#CC1105">('.$pushID.'</font>)('.$pushtime.')'; // 推文主體
  220.                
  221.             // 封鎖:限制出現之文字
  222.             foreach($BAD_STRING as $value){
  223.                 if(strpos($name, $value)!==false || strpos($comm, $value)!==false){
  224.             die(_T('regist_wordfiltered'));
  225.                 }
  226.             }
  227.  
  228.             $post = $PIO->fetchPosts($_GET['no']);
  229.             if(!count($post)) die('[Error] Post does not exist.'); // 被推之文章不存在
  230.             $parentNo = $post[0]['resto'] ? $post[0]['resto'] : $post[0]['no'];
  231.             $threads = array_flip($PIO->fetchThreadList());
  232.             $threadPage = floor($threads[$parentNo] / PAGE_DEF);
  233.  
  234.             $p = ($parentNo==$post[0]['no']) ? $post : $PIO->fetchPosts($parentNo); // 取出首篇
  235.             $flgh = $PIO->getPostStatus($p[0]['status']);
  236.             if($flgh->exists('TS')) die('[Error] '._T('regist_threadlocked')); // 首篇禁止回應/同時表示禁止推文
  237.  
  238.             $post[0]['com'] .= ((strpos($post[0]['com'], $this->PUSHPOST_SEPARATOR)===false) ? '<br />'.$this->PUSHPOST_SEPARATOR : '').'<br />'.$pushpost;
  239.             $flgh2 = $PIO->getPostStatus($post[0]['status']);
  240.             $flgh2->plus('mppCnt'); // 推文次數+1
  241.             $PIO->updatePost($_GET['no'], array('com'=>$post[0]['com'], 'status'=>$flgh2->toString())); // 更新推文
  242.             $PIO->dbCommit();
  243.             $this->w_pustpost($_GET['no'], $name, $comm, $pushtime, getREMOTE_ADDR());// 記錄
  244.             if(STATIC_HTML_UNTIL == -1 || $threadPage <= STATIC_HTML_UNTIL) updatelog(0, $threadPage, true); // 僅更新討論串出現那頁
  245.             deleteCache(array($parentNo)); // 刪除討論串舊快取
  246.  
  247.             if(isset($_POST['ajaxmode'])){
  248.                 echo '+OK ', $pushpost;
  249.             }else{
  250.                 header('HTTP/1.1 302 Moved Temporarily');
  251.                 header('Location: '.fullURL().PHP_SELF2.'?'.time());
  252.             }
  253.         }
  254.     }
  255.  
  256.     function _loadLanguage(){
  257.         global $language;
  258.         if(PIXMICAT_LANGUAGE != 'zh_TW' && PIXMICAT_LANGUAGE != 'ja_JP' && PIXMICAT_LANGUAGE != 'en_US') $lang = 'en_US';
  259.         else $lang = PIXMICAT_LANGUAGE;
  260.  
  261.         if($lang=='zh_TW'){
  262.             $language['modpushpost_nocomment'] = '請輸入內文';
  263.             $language['modpushpost_pushpost'] = '[推文]';
  264.             $language['modpushpost_pushbutton'] = '推';
  265.             $language['modpushpost_maxlength'] = '你話太多了';
  266.             $language['modpushpost_omitted'] = '推文 ';
  267.             $language['modpushpost_omitted2'] = ' 篇被省略。';
  268.             $language['modpushpost_close'] = '隱藏';
  269.         }elseif($lang=='ja_JP'){
  270.             $language['modpushpost_nocomment'] = '何か書いて下さい';
  271.             $language['modpushpost_pushpost'] = '[推文]';
  272.             $language['modpushpost_pushbutton'] = '推';
  273.             $language['modpushpost_maxlength'] = 'コメントが長すぎます';
  274.             $language['modpushpost_omitted'] = '推文 ';
  275.             $language['modpushpost_omitted2'] = ' 部省略され。';
  276.             $language['modpushpost_close'] = '隠し';
  277.            
  278.         }elseif($lang=='en_US'){
  279.             $language['modpushpost_nocomment'] = 'Please type your comment.';
  280.             $language['modpushpost_pushpost'] = '[Push this post]';
  281.             $language['modpushpost_pushbutton'] = 'PUSH';
  282.             $language['modpushpost_maxlength'] = 'You typed too many words';
  283.             $language['modpushpost_omitted'] = 'Pushpost ';
  284.             $language['modpushpost_omitted2'] = 'have be omitted.';
  285.             $language['modpushpost_close'] = 'Display';
  286.         }
  287.     }
  288. }
  289. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement