Don't like ads? PRO users don't see any ads ;-)
Guest

r811整合V板表情符號

By: a guest on Jun 16th, 2012  |  syntax: PHP  |  size: 14.85 KB  |  hits: 59  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. <?php
  2. class mod_pushpost{
  3.         var $mypage;
  4.  
  5.         function mod_pushpost($PMS){
  6.                 $PMS->hookModuleMethod('ModulePage', __CLASS__); // 向系統登記模組專屬獨立頁面
  7.                 $this->mypage = $PMS->getModulePageURL(__CLASS__);
  8.                 $this->PUSHPOST_SEPARATOR = '[MOD_PUSHPOST_USE]';
  9.                 $this->PUSHPOST_DEF = 10; // 討論串最多顯示之推文筆數 (超過則自動隱藏,全部隱藏:0)
  10.                 $this->PUSH_EMOTIONS = array("","(゚∀゚)","(´∀`)","(*´∀`)","(*゚∇゚)","(*´д`)","(*゚ー゚)","(゚3゚)","(´ー`)","(・_ゝ・)","(´,_ゝ`)","(´_ゝ`)","(・ー・)","(・∀・)","(ゝ∀・)",
  11.                         "(〃∀〃)","(*゚∀゚*)","(゚∀。)","(`д´)","(`ε´)","(`ヮ´)","σ`∀´)","゚∀゚)σ","゚∀゚)ノ","(╬゚д゚)","(|||゚д゚)","(´゚д゚`)","(゚д゚)","Σ(゚д゚)","(;゚д゚)","(;´д`)",
  12.                         "(д)゚゚","(☉д⊙)","(((゚д゚)))","(`・´)","(´д`)","(-д-)","(&gt;д&lt;)","(つд⊂)","・゚(ノд`゚)","(TдT)","(*´ω`*)","(・ω・)","(`・ω・)","(´・ω)","(`・ω)",
  13.                         "(´・ω・`)","(`・ω・´)","(・_っ・)","(^_っ^)","(`_っ´)","(`ー´)","(´_っ`)","(´ρ`)","(゚ω゚)","(o゚ω゚o)","(^ω^)","(・ิ㉨・ิ)","(。◕∀◕。)","ヾ(´ε`ヾ)","(ノ・ω・)ノ",
  14.                         "(ノ゚∀゚)ノ","(σ゚д゚)σ","(σ゚∀゚)σ","|д`)","|ー`)","|д゚)","|∀゚)","ヽ(●´∀`●)ノ","(゚д゚≡゚д゚)","。・゚・(つд`゚)・゚・","_,._","゚Å゚)","⊂彡☆))д`)","⊂彡☆))д´)",
  15.                         "⊂彡☆))∀`)","(´∀((☆ミつ"); // 表情
  16.                 $this->GESTURES = array("","<","。o0","ノシ","彡","o彡゚","ゝ","ㄏ","ノ","ノ゛","ノ","ノミ","ツ","っ","っ゛","つ","つ゛","o","凸","/","y","y━・~","y-~","≡3","~♪","♬","❤",
  17.                         "~♥","σ","ノ彡┴─┴","⌒*","⌒☆","⌒★","≡☆"); //發言
  18.                 AttachLanguage(array($this, '_loadLanguage')); // 載入語言檔
  19.         }
  20.  
  21.         /* Get the name of module */
  22.         function getModuleName(){
  23.                 return 'mod_pushpost : 文章推文機制';
  24.         }
  25.  
  26.         /* Get the module version infomation */
  27.         function getModuleVersionInfo(){
  28.                 return 'r811整合V板表情符號 (v120616)';
  29.         }
  30.  
  31.         /* 生成識別ID */
  32.         function _getID(){
  33.                 return substr(crypt(md5(getREMOTE_ADDR().IDSEED.gmdate('Ymd', time() + TIME_ZONE * 3600)), 'id'), -8);
  34.         }
  35.  
  36.         function autoHookHead(&$txt, $isReply){
  37.                 global $language;
  38.                 $txt .= '<style type="text/css">.pushpost { background-color: #fff; font-size: 0.8em; padding: 10px; }</style>
  39. <script type="text/javascript">
  40. // <![CDATA[
  41. var lastpushpost=0;
  42. function mod_pushpostShow(pid){
  43.         $g("mod_pushpostID").value = pid;
  44.         $g("mod_pushpostName").value = getCookie("namec");
  45.         $("div#mod_pushpostBOX").insertBefore($("div#r"+pid+" .quote"));
  46.  
  47.         if(lastpushpost!=pid) {
  48.                 $("div#mod_pushpostBOX").show();
  49.         } else
  50.                 $("div#mod_pushpostBOX").toggle();
  51.         lastpushpost = pid;
  52.         return false;
  53. }
  54. function mod_pushpostKeyPress(e){if(e.which==13){e.preventDefault();mod_pushpostSend();}}
  55. function mod_pushpostSend(){
  56.         var o0 = $g("mod_pushpostID"), o1 = $g("mod_pushpostName"), o2 = $g("mod_pushpostComm"), o3 = $g("mod_pushpostSmb"), pp = $("div#r"+o0.value+" .quote"), o4 = $("#push_emotion option:selected").val(), o5 = $("#gesture option:selected").val();
  57.         if(o2.value===""){ alert("'._T('modpushpost_nocomment').'"); return false; }
  58.         o1.disabled = o2.disabled = o3.disabled = true;
  59.         $.ajax({
  60.                 url: "'.str_replace('&amp;', '&', $this->mypage).'&no="+o0.value,
  61.                 type: "POST",
  62.                 data: {ajaxmode: true, name: o1.value, push_emotion: o4, gesture: o5, comm: o2.value},
  63.                 success: function(rv){
  64.                         if(rv.substr(0, 4)!=="+OK "){ alert(rv); o3.disabled = false; return false; }
  65.                         rv = rv.substr(4);
  66.                         (pp.find(".pushpost").length===0)
  67.                                 ? pp.append("<div class=\'pushpost\'>"+rv+"</div>")
  68.                                 : pp.children(".pushpost").append("<br />"+rv);
  69.                         o0.value = o1.value = o2.value = o4 = o5 = ""; o1.disabled = o2.disabled = o3.disabled = false;
  70.                         $("div#mod_pushpostBOX").hide();
  71.                 },
  72.                 error: function(){ alert("Network error."); o1.disabled = o2.disabled = o3.disabled = false; }
  73.         });
  74. }
  75. // ]]>
  76. </script>';
  77.         }
  78.  
  79.         function autoHookFoot(&$foot){
  80.                 global $language;
  81.                 $ecnt=count($this->PUSH_EMOTIONS);
  82.                 $gcnt=count($this->GESTURES);
  83.                 for($i=0;$i<$ecnt;$i++) {
  84.                         $emot.="<option>".$this->PUSH_EMOTIONS[$i]."</option>\n";
  85.                 }
  86.                 for($i=0;$i<$gcnt;$i++) {
  87.                         $gest.="<option>".$this->GESTURES[$i]."</option>\n";
  88.                 }
  89.                 $foot .= '
  90. <div id="mod_pushpostBOX" style="display:none">
  91. <input type="hidden" id="mod_pushpostID" />'._T('modpushpost_pushpost').' <ul>
  92. <li>'._T('form_name').' <input type="text" id="mod_pushpostName" maxlength="20" onkeypress="mod_pushpostKeyPress(event)" /></li>
  93. <li>'._T('form_comment').
  94. '<select id="push_emotion" style="text-align:right;line-height:1.7em" class="push_area">'.$emot.'</select>'.
  95. '<select id="gesture" class="push_area" style="line-height:1.7em">'.$gest.'</select>'.
  96. '<input type="text" id="mod_pushpostComm" size="50" maxlength="50" onkeypress="mod_pushpostKeyPress(event)" /><input type="button" id="mod_pushpostSmb" value="'._T('form_submit_btn').'" onclick="mod_pushpostSend()" /></li></ul>
  97. </div>
  98. ';
  99.         }
  100.  
  101.         function autoHookThreadPost(&$arrLabels, $post, $isReply){
  102.                 global $language, $PIO;
  103.                 $pushcount = '';
  104.                 if($post['status'] != ''){
  105.                         $f = $PIO->getPostStatus($post['status']);
  106.                         $pushcount = $f->value('mppCnt'); // 被推次數
  107.                 }
  108.                 $arrLabels['{$QUOTEBTN}'] .= '&nbsp;<a href="'.$this->mypage.'&amp;no='.$post['no'].'" onclick="return mod_pushpostShow('.$post['no'].')">'.$pushcount._T('modpushpost_pushbutton').'</a>';
  109.                 if(strpos($arrLabels['{$COM}'], $this->PUSHPOST_SEPARATOR.'<br />') !== false){
  110.                         if($isReply || $pushcount <= $this->PUSHPOST_DEF) // 回應模式
  111.                                 $arrLabels['{$COM}'] = str_replace($this->PUSHPOST_SEPARATOR.'<br />', '<div class="pushpost">', $arrLabels['{$COM}']).'</div>';
  112.                         else{ // 頁面瀏覽
  113.                                 $delimiter = strpos($arrLabels['{$COM}'], $this->PUSHPOST_SEPARATOR.'<br />'); // 定位符號位置
  114.                                 if($this->PUSHPOST_DEF > 0){
  115.                                         $push_array = explode('<br />', substr($arrLabels['{$COM}'], $delimiter + strlen($this->PUSHPOST_SEPARATOR.'<br />')));
  116.                                         $pushs = '<div class="pushpost">……<br />'.implode('<br />', array_slice($push_array, 0 - $this->PUSHPOST_DEF)).'</div>';
  117.                                 }else{
  118.                                         $pushs = '';
  119.                                 }
  120.                                 $arrLabels['{$COM}'] = substr($arrLabels['{$COM}'], 0, $delimiter).$pushs;
  121.                                 $arrLabels['{$WARN_BEKILL}'] .= '<span class="warn_txt2">'._T('modpushpost_omitted').'<br /></span>'."\n";
  122.                         }
  123.                 }
  124.         }
  125.  
  126.         function autoHookThreadReply(&$arrLabels, $post, $isReply){
  127.                 $this->autoHookThreadPost($arrLabels, $post, $isReply);
  128.         }
  129.  
  130.         function autoHookRegistBegin(&$name, &$email, &$sub, &$com, $upfileInfo, $accessInfo, $isReply){
  131.                 if(adminAuthenticate('check')) return; // 登入權限允許標籤留存不轉換 (後端登入修改文章後推文仍有效)
  132.                 if(strpos($com, $this->PUSHPOST_SEPARATOR."\r\n") !== false){ // 防止不正常的插入標籤形式
  133.                         $com = str_replace($this->PUSHPOST_SEPARATOR."\r\n", "\r\n", $com);
  134.                 }
  135.         }
  136.  
  137.         function autoHookAdminList(&$modFunc, $post, $isres){
  138.                 $modFunc .= '[<a href="'.$this->mypage.'&amp;action=del&amp;no='.$post['no'].'">刪推</a>]';
  139.         }
  140.  
  141.         function ModulePage(){
  142.                 global $PIO, $PTE, $PMS, $language;
  143.                 if(!isset($_GET['no'])) die('[Error] not enough parameter.');
  144.                 if(isset($_GET['action'])) {
  145.                         if(adminAuthenticate('check')) {
  146.                                 $pushcount = ''; $puststart=0;
  147.                                 $post = $PIO->fetchPosts($_GET['no']);
  148.                                 if(!count($post)) die('[Error] Post does not exist.'); // 被推之文章不存在
  149.                                 extract($post[0]);
  150.  
  151.                                 if($status != ''){
  152.                                         $f = $PIO->getPostStatus($status);
  153.                                         $pushcount = $f->value('mppCnt'); // 被推次數
  154.                                 }
  155.  
  156.                                 if(($puststart=strpos($com, $this->PUSHPOST_SEPARATOR.'<br />'))===false) die('[Error] No pushpost.');
  157.  
  158.                                 $ocom = substr($com,0,$puststart);
  159.                                 $pushpost = explode('<br />',substr($com,$puststart+strlen($this->PUSHPOST_SEPARATOR.'<br />')));
  160.                                 $com = $ocom;
  161.  
  162.                                 if($_GET['action'] == 'del') { // list
  163.                                         $p_count = 1;
  164.                                         $com .= '<div class="pushpost">';
  165.                                         foreach($pushpost as $p)
  166.                                                 $com .= '<input type="checkbox" name="'.($p_count++).'" value="delete" />'.$p.'<br />';
  167.                                         $com .= '</div>';
  168.  
  169.                                         $dat = '';
  170.                                         head($dat);
  171.                                         $dat .= '<div class="bar_reply">'._T('modpushpost_deletepush').'</div>';
  172.                                         $dat .= '<form action="'.$this->mypage.'&amp;action=delpush&amp;no='.$_GET['no'].'" method="post">';
  173.                                         $dat .= $PTE->ParseBlock('SEARCHRESULT', array('{$NO}'=>$no, '{$SUB}'=>$sub, '{$NAME}'=>$name, '{$NOW}'=>$now, '{$COM}'=>$com, '{$CATEGORY}'=>$category, '{$NAME_TEXT}'=>_T('post_name'), '{$CATEGORY_TEXT}'=>_T('post_category')));
  174.                                         echo $dat, '<input type="submit" value="'._T('del_btn').'" /></form></body></html>';
  175.                                         return;
  176.                                 } elseif($_GET['action'] == 'delpush') { // delete
  177.                                         $delno = array();
  178.                                         reset($_POST);
  179.                                         while($item = each($_POST)){ if($item[1]=='delete' && $item[0] != 'func') array_push($delno, $item[0]); }
  180.                                         if(count($delno)) foreach($delno as $d) if(isset($pushpost[$d-1])) unset($pushpost[$d-1]);
  181.                                         $pushcount = count($pushpost);
  182.                                         if($pushcount) {
  183.                                                 $f->update('mppCnt',$pushcount); // 更新推文次數
  184.                                                 $com = $ocom.$this->PUSHPOST_SEPARATOR.'<br />'.implode('<br />',$pushpost);
  185.                                         } else {
  186.                                                 $f->remove('mppCnt'); // 刪除推文次數
  187.                                                 $com = $ocom;
  188.                                         }
  189.  
  190.                                         $PIO->updatePost($_GET['no'], array('com'=>$com, 'status'=>$f->toString())); // 更新推文
  191.                                         $PIO->dbCommit();
  192.  
  193.                                         echo '+OK ';
  194.                                         return;
  195.                                 } else die('[Error] unknown action.');
  196.                         } else die('[Error] unauthenticated action.');
  197.                 }
  198.                 if(!isset($_POST['comm'])){
  199.                         $post = $PIO->fetchPosts($_GET['no']);
  200.                         if(!count($post)) die('[Error] Post does not exist.');
  201.  
  202.                         $dat = $PTE->ParseBlock('HEADER', array('{$TITLE}'=>TITLE, '{$RESTO}'=>''));
  203.                         $dat .= '</head><body id="main">';
  204.                         $dat .= '<form action="'.$this->mypage.'&amp;no='.$_GET['no'].'" method="post">
  205. '._T('modpushpost_pushpost').' <ul><li>'._T('form_name').' <input type="text" name="name" maxlength="20" /></li><li>'._T('form_comment').' <input type="text" name="comm" size="50" maxlength="50" /><input type="submit" value="'._T('form_submit_btn').'" /></li></ul>
  206. </form>';
  207.                         echo $dat, '</body></html>';
  208.                 }else{
  209.                         if($_SERVER['REQUEST_METHOD'] != 'POST') die(_T('regist_notpost')); // 傳送方法不正確
  210.  
  211.                         // 查IP
  212.                         $baninfo = '';
  213.                         $ip = getREMOTE_ADDR(); $host = gethostbyaddr($ip);
  214.                         if(BanIPHostDNSBLCheck($ip, $host, $baninfo)) die(_T('regist_ipfiltered', $baninfo));
  215.  
  216.                         $name = CleanStr($_POST['name']); $comm = CleanStr($_POST['comm']); $push_emotion = CleanStr($_POST['push_emotion']); $gesture = CleanStr($_POST['gesture']);
  217.                         if(strlen($name) > 30) die(_T('modpushpost_maxlength')); // 名稱太長
  218.                         if(strlen($comm) > 160) die(_T('modpushpost_maxlength')); // 太多字
  219.                         if(strlen($comm) == 0) die(_T('modpushpost_nocomment')); // 沒打字
  220.                         $name = str_replace(array(_T('trip_pre'), _T('admin'), _T('deletor')), array(_T('trip_pre_fake'), '"'._T('admin').'"', '"'._T('deletor').'"'), $name);
  221.                         $pushID = $this->_getID();
  222.                         $pushtime = gmdate('y/m/d H:i', time() + intval(TIME_ZONE) * 3600);
  223.                         if(preg_match('/(.*?)[##](.*)/u', $name, $regs)){
  224.                                 $cap = strtr($regs[2], array('&amp;'=>'&'));
  225.                                 $salt = strtr(preg_replace('/[^\.-z]/', '.', substr($cap.'H.', 1, 2)), ':;<=>?@[\\]^_`', 'ABCDEFGabcdef');
  226.                                 $name = $regs[1]._T('trip_pre').substr(crypt($cap, $salt), -10);
  227.                         }
  228.                         if(!$name || preg_match("/^[ | |]*$/", $name)){
  229.                                 if(ALLOW_NONAME) $name = DEFAULT_NONAME;
  230.                                 else die(_T('regist_withoutname')); // 不接受匿名
  231.                         }
  232.                         if(ALLOW_NONAME==2){ // 強制砍名
  233.                                 $name = preg_match('/(\\'._T('trip_pre').'.{10})/', $name, $matches) ? $matches[1].':' : DEFAULT_NONAME.':';
  234.                         }else{
  235.                                 $name .= ':';
  236.                         }
  237.                         $pushpost = "{$name} {$push_emotion}{$gesture}{$comm} ({$pushID} {$pushtime})"; // 推文主體
  238.  
  239.                         $post = $PIO->fetchPosts($_GET['no']);
  240.                         if(!count($post)) die('[Error] Post does not exist.'); // 被推之文章不存在
  241.  
  242.                         $parentNo = $post[0]['resto'] ? $post[0]['resto'] : $post[0]['no'];
  243.                         $threads = array_flip($PIO->fetchThreadList());
  244.                         $threadPage = floor($threads[$parentNo] / PAGE_DEF);
  245.  
  246.                         $p = ($parentNo==$post[0]['no']) ? $post : $PIO->fetchPosts($parentNo); // 取出首篇
  247.                         $flgh = $PIO->getPostStatus($p[0]['status']);
  248.                         if($flgh->exists('TS')) die('[Error] '._T('regist_threadlocked')); // 首篇禁止回應/同時表示禁止推文
  249.  
  250.                         $post[0]['com'] .= ((strpos($post[0]['com'], $this->PUSHPOST_SEPARATOR.'<br />')===false) ? '<br />'.$this->PUSHPOST_SEPARATOR : '').'<br /> '.$pushpost;
  251.                         $flgh2 = $PIO->getPostStatus($post[0]['status']);
  252.                         $flgh2->plus('mppCnt'); // 推文次數+1
  253.                         $PIO->updatePost($_GET['no'], array('com'=>$post[0]['com'], 'status'=>$flgh2->toString())); // 更新推文
  254.                         $PIO->dbCommit();
  255.                         // logcat
  256.                         $PMS->callCHP('mod_audit_logcat',
  257.                                 array(sprintf('[%s] No.%d %s (%s)',
  258.                                         __CLASS__,
  259.                                         $_GET['no'],
  260.                                         str_cut($comm, 50),
  261.                                         $pushID)
  262.                                 )
  263.                         );
  264.                         if(STATIC_HTML_UNTIL == -1 || $threadPage <= STATIC_HTML_UNTIL) updatelog(0, $threadPage, true); // 僅更新討論串出現那頁
  265.                         deleteCache(array($parentNo)); // 刪除討論串舊快取
  266.  
  267.                         if(isset($_POST['ajaxmode'])){
  268.                                 echo '+OK ', $pushpost;
  269.                         }else{
  270.                                 header('HTTP/1.1 302 Moved Temporarily');
  271.                                 header('Location: '.fullURL().PHP_SELF2.'?'.time());
  272.                         }
  273.                 }
  274.         }
  275.  
  276.         function _loadLanguage(){
  277.                 global $language;
  278.                 if(PIXMICAT_LANGUAGE != 'zh_TW' && PIXMICAT_LANGUAGE != 'ja_JP' && PIXMICAT_LANGUAGE != 'en_US') $lang = 'en_US';
  279.                 else $lang = PIXMICAT_LANGUAGE;
  280.  
  281.                 if($lang=='zh_TW'){
  282.                         $language['modpushpost_nocomment'] = '請輸入內文';
  283.                         $language['modpushpost_pushpost'] = '[推文]';
  284.                         $language['modpushpost_pushbutton'] = '推';
  285.                         $language['modpushpost_maxlength'] = '你話太多了';
  286.                         $language['modpushpost_omitted'] = '有部分推文被省略。要閱讀全部推文請按下回應連結。';
  287.                         $language['modpushpost_deletepush'] = '刪除推文模式';
  288.                 }elseif($lang=='ja_JP'){
  289.                         $language['modpushpost_nocomment'] = '何か書いて下さい';
  290.                         $language['modpushpost_pushpost'] = '[推文]';
  291.                         $language['modpushpost_pushbutton'] = '推';
  292.                         $language['modpushpost_maxlength'] = 'コメントが長すぎます';
  293.                         $language['modpushpost_omitted'] = '推文省略。全て読むには返信ボタンを押してください。';
  294.                         $language['modpushpost_deletepush'] = '削除推文モード';
  295.                 }elseif($lang=='en_US'){
  296.                         $language['modpushpost_nocomment'] = 'Please type your comment.';
  297.                         $language['modpushpost_pushpost'] = '[Push this post]';
  298.                         $language['modpushpost_pushbutton'] = 'PUSH';
  299.                         $language['modpushpost_maxlength'] = 'You typed too many words';
  300.                         $language['modpushpost_omitted'] = 'Some pushs omitted. Click Reply to view.';
  301.                         $language['modpushpost_deletepush'] = 'Delete Push Post Mode';
  302.                 }
  303.         }
  304. }
  305. ?>