Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- class pssys
- {
- var $ipsclass;
- var $__PS_SIGNATURE_ ='VladMih PaySys';
- var $__PS_VERSION_ ='1.0.0';
- var $__PS_USER_ ='fx-vladmih.ru';
- var $__PS_DISTRIBUTOR_=''; //дистрибьютор
- function pssys()
- {
- global $ipsclass;
- $this->ipsclass=& $ipsclass;
- define('__PSSYS_LOAD',1);
- //==========================================
- //Отладка
- //==========================================
- //error_reporting(E_ALL);
- //==========================================
- //Получаем путь до модуля установки
- //==========================================
- $this->Path=DirName(RealPath(__FILE__));
- if (!$this->ModIsInstall() && file_exists($this->Path."/install/install.php"))
- {
- require_once($this->Path."/install/install.php");
- $this->install=new pssys_install;
- }
- $this->PsInit();
- }
- function init()
- {
- //Заглушка для совместимости с 1.3.1 alpha 4
- }
- function PsInit()
- {
- if (!$this->ModIsEnable()) return;
- //==========================================
- //Подключаем smarty
- //==========================================
- require_once($this->Path."/smarty/class.Smarty.php");
- $this->smarty=new Smarty();
- $this->smarty->compile_check = true; //проверять изменения в шаблонах
- $this->smarty->debugging = 0; //отключить режим дебага
- $this->smarty->template_dir = $this->Path."/template"; //директория шаблона
- $this->smarty->compile_dir = $this->Path."/tmp"; //директория для откомпилированных шаблонов
- //==========================================
- //Загрузка основных настроек из БД
- //==========================================
- $this->ipsclass->DB->query("SELECT * FROM ".SQL_PREFIX."paysys WHERE name='settings'");
- $row=$this->ipsclass->DB->fetch_row();
- $this->Settings=unserialize($row['data']);
- $this->Settings['Currency']= base64_decode($this->Settings['Currency']);
- //==========================================
- //передача требуемых переменных в шаблон
- //==========================================
- $this->smarty->assign('___Currency', $this->Settings['Currency']);
- //==========================================
- //Инициализация кнопки
- //==========================================
- $this->openerlink=$this->smarty->fetch('memberbar.tpl');
- //==========================================
- //Загрузка настроек рефсистемы из БД
- //==========================================
- $this->ipsclass->DB->query("SELECT * FROM ".SQL_PREFIX."paysys WHERE name='refsys' ORDER BY id DESC");
- $row=$this->ipsclass->DB->fetch_row();
- $row['data']=unserialize($row['data']);
- $this->RefSys->RefLevels= base64_decode($row['data']['reflevels']);
- $this->RefSys->WriteDate= $row['data']['record_time'];
- }
- function AutoRun()
- {
- if (!$this->ModIsEnable()) return;
- define('__PSSYS_AUTORUN',1);
- //==========================================
- //Нужно для нормальной алгебры
- //==========================================
- if (!setlocale(LC_ALL, "en_US")) setlocale(LC_ALL, "US");
- if (!$this->ipsclass->member['id'])
- {
- $this->ipsclass->load_template('skin_global');
- $this->ipsclass->print->pop_up_window( "Ошибка доступа", "Для доступа к панели требуется авторизация на форуме");
- return;
- }
- $this->smarty->assign('___baseurl', $this->ipsclass->base_url);
- $this->smarty->assign('is_mod', $this->ipsclass->member['is_mod']);
- $this->smarty->assign('is_adm', ($this->ipsclass->member['mgroup']==$this->ipsclass->vars['admin_group'])?1:0);
- if ($this->ipsclass->member['mgroup']==$this->ipsclass->vars['admin_group'])
- {
- $this->ipsclass->DB->query("SELECT COUNT(*) as cnt FROM ".SQL_PREFIX."pay_history WHERE type='withdrawal_r' ORDER BY id");
- $row=$this->ipsclass->DB->fetch_row();
- $this->smarty->assign('wr', intval($row['cnt']));
- }
- $out=$this->RenderCopyright();
- switch ($this->ipsclass->input['code'])
- {
- case 'showp':
- $this->ShowPenalty();
- break;
- case 'showh':
- $this->ShowHistory();
- break;
- case 'showrefs':
- $this->ShowReferals();
- break;
- case 'cashout':
- $this->Cashout();
- break;
- case 'adm':
- $this->Adm_Start();
- break;
- case 'mod':
- $this->Mod_Start();
- break;
- case 'test':
- $this->test();
- break;
- default:
- $this->LoadAccount();
- }
- $out.=$this->smarty->fetch('main.tpl');
- $out.=$this->RenderCopyright2();
- $this->ipsclass->load_template('skin_global');
- $this->ipsclass->print->pop_up_window( "IPB PaySys::".$this->smarty->_smarty_vars["capture"]["title"], $out);
- }
- function ModIsInstall()
- {
- if (file_exists($this->Path."/install_lock.php"))
- {
- return 1;
- }
- }
- function ModIsEnable()
- {
- if (!$this->ModIsInstall() || !defined('__PSSYS_LOAD')) return 0;
- return 1;
- }
- function AddLogLine($line=array())
- {
- if (!$this->ModIsEnable()) return;
- $this->ipsclass->DB->do_insert("pay_history",$line);
- }
- function ShowReferals()
- {
- if (!$this->ModIsEnable()) return;
- if ($this->Settings['RefEnable']) $this->smarty->assign('reflevels', split(",", $this->RefSys->RefLevels));
- $this->smarty->assign('uid', $this->ipsclass->member['id']);
- $this->smarty->assign('referals', $this->GetAllReferals());
- $this->smarty->assign('___Data', $this->smarty->fetch('showrefs.tpl'));
- }
- function GetAllReferals()
- {
- if (!$this->ModIsEnable()) return;
- $i=1;
- $ids=$this->ipsclass->member['id'];
- while (1)
- {
- $refs[$i]=$this->GetReferals($ids);
- if (sizeof($refs[$i]))
- {
- $ids=implode(",",$refs[$i]);
- foreach ($refs[$i] as $key=>$ref)
- {
- $refs[$i][$key]=array();
- $refs[$i][$key]=$this->GetMemberInfoById($ref);
- $refs[$i][$key]['joined']=date("j.n.Y, G:i",$refs[$i][$key]['joined']);
- }
- $i++;
- }
- else
- {
- unset($refs[$i]);
- break;
- }
- }
- return $refs;
- }
- function GetReferals($uid=0)
- {
- if (!$this->ModIsEnable()) return;
- $q=$this->ipsclass->DB->query("SELECT id FROM ".SQL_PREFIX."members WHERE pay_referer IN($uid)");
- while ($row=$this->ipsclass->DB->fetch_row($q))
- {
- $refs[]=$row['id'];
- }
- return $refs;
- }
- function Cashout()
- {
- if (!$this->ModIsEnable()) return;
- $cash=$this->GetMemberCash();
- if (isset($this->ipsclass->input['spend']))
- {
- if ($this->ipsclass->input['to']=="to_user" && !$this->Settings['TransactionEnable']) $error['notrans']=1;
- if (($cash['balans']<$this->Settings['MinCashOut'] || $cash['balans']<floatval($this->ipsclass->input['spend'])) && $this->ipsclass->input['to']!="to_user")
- {
- $error['mincashout']=1;
- }
- elseif (
- (
- $cash['balans']<$this->Settings['MinSpend'] ||
- (floatval($this->ipsclass->input['spend']+$this->ipsclass->input['spend']*$this->Settings['TransactionCom']/100)>$cash['balans'])
- )
- && $this->ipsclass->input['to']=="to_user")
- {
- $error['minspend']=1;
- }
- elseif (floatval($this->ipsclass->input['spend'])<$this->Settings['MinCashOut'] && $this->ipsclass->input['to']!="to_user")
- {
- $error['nomincashout']=1;
- }
- elseif (floatval($this->ipsclass->input['spend'])<$this->Settings['MinSpend'] && $this->ipsclass->input['to']=="to_user")
- {
- $error['nominspend']=1;
- }
- if (!preg_match("/^[a-zA-Z0-9]{1,254}$/", $this->ipsclass->input['acc']))
- {
- $error['acc']=1;
- }
- elseif ($this->ipsclass->input['to']=="to_user" && $this->ipsclass->member['id']==intval($this->ipsclass->input['acc']))
- {
- $error['acce']=1;
- }
- if ($error)
- {
- $this->smarty->assign('settings', $this->Settings);
- $this->smarty->assign('errors', $error);
- }
- else
- {
- $data=array("value"=>floatval($this->ipsclass->input['spend']),"comment"=>base64_encode($this->ipsclass->input['comments']));
- if ($this->ipsclass->input['to']!="to_user")
- {
- $data['acc_type']=base64_encode($this->ipsclass->input['to']);
- $data['acc']=base64_encode($this->ipsclass->input['acc']);
- }
- $line=array(
- "date" => mktime(),
- "user" => $this->ipsclass->member['id'],
- "to_user" => $this->ipsclass->input['to']=="to_user" ? intval($this->ipsclass->input['acc']) : $this->ipsclass->member['id'],
- "type" => $this->ipsclass->input['to']=="to_user" ? "spend" : "withdrawal_r",
- "data" => serialize($data),
- "post" => 0,
- );
- $this->AddLogLine($line);
- if (floatval($this->Settings['TransactionCom']) && $this->ipsclass->input['to']=="to_user")
- {
- $data=array("value"=>floatval($this->ipsclass->input['spend']*$this->Settings['TransactionCom']/100),"comment"=>base64_encode("Комиссия за перевод"));
- $line=array(
- "date" => mktime(),
- "user" => 0,
- "to_user" => $this->ipsclass->member['id'],
- "type" => "spend_com",
- "data" => serialize($data),
- "post" => 0,
- );
- $this->AddLogLine($line);
- }
- header("Location: {$this->ipsclass->base_url}act=ps&code=cashout&ok");
- exit();
- }
- }
- if (isset($this->ipsclass->input['ok'])) $this->smarty->assign('ok', 1);
- $this->smarty->assign('___Data', $this->smarty->fetch('cashout.tpl'));
- }
- function RenderCopyright()
- {
- $out=<<<HTML
- <table width="100%" bgcolor="#FFFFFF" style="border-bottom:1px solid #000000">
- <tr>
- <td width="50%">
- <font style="font-size:10px;"><b>IPB PaySys v2.0.0</b>
- </td>
- <td align="right">
- <font style="font-size:10px;"><b>AllForums</b>
- </td>
- </tr>
- </table>
- HTML;
- return $out;
- }
- function RenderCopyright2()
- {
- $out=<<<HTML
- <table width="100%" bgcolor="#FFFFFF" style="border-top:1px solid #000000">
- <tr>
- <td align="center" style="padding-left:45px;">
- <font style="font-size:9px;">
- <b>License #00-000-0001 (fx-vladmih.ru)</b><br>
- </td>
- </tr>
- </table>
- HTML;
- return $out;
- }
- function LoadAccount()
- {
- if (!$this->ModIsEnable()) return;
- $this->smarty->assign('___MemberCash', $this->GetMemberCash());
- $this->smarty->assign('___Data', $this->smarty->fetch('account.tpl'));
- }
- function GetMemberCash($uid=0)
- {
- if (!$this->ModIsEnable()) return;
- if (!$uid) $uid=$this->ipsclass->member['id'];
- $this->ipsclass->DB->query("SELECT pay_cash FROM ".SQL_PREFIX."members WHERE id=$uid");
- $row=$this->ipsclass->DB->fetch_row();
- $ret['paid']=round($row['pay_cash'],3);
- $this->ipsclass->DB->query("SELECT * FROM ".SQL_PREFIX."pay_history WHERE user=$uid OR to_user=$uid ORDER BY ID");
- while ($row=$this->ipsclass->DB->fetch_row())
- {
- if ($row['type']=="spend" && $row['to_user']==$uid)
- {
- $row['data']=unserialize($row['data']);
- $ret['addition']=round($ret['addition']+$row['data']['value'],3);
- }
- elseif ($row['to_user']==$uid || ($row['type']=="spend" && $row['user']==$uid))
- {
- $row['data']=unserialize($row['data']);
- $ret[$row['type']]=round($ret[$row['type']]+$row['data']['value'],3);
- }
- }
- $this->ipsclass->DB->query("SELECT SUM(pay) as paid FROM ".SQL_PREFIX."posts WHERE author_id=$uid");
- $row=$this->ipsclass->DB->fetch_row();
- $ret['paid']=round($row['paid']+$ret['paid'],3);
- $ret['balans']=round($ret['paid']-$ret['penalty']-$ret['withdrawal']-$ret['withdrawal_r']+$ret['addition']-$ret['spend']-$ret['spend_com'],3);
- return $ret;
- }
- function GetGroupNameById($id)
- {
- if (!$id) return 0;
- $this->ipsclass->DB->query("SELECT g_title FROM ".SQL_PREFIX."groups WHERE g_id='$id'");
- $row=$this->ipsclass->DB->fetch_row();
- return $row['g_title'];
- }
- function GetGroupIdByMemberId($id)
- {
- if (!$id) return 0;
- $this->ipsclass->DB->query("SELECT mgroup FROM ".SQL_PREFIX."members WHERE id='$id'");
- $row=$this->ipsclass->DB->fetch_row();
- return $row['mgroup'];
- }
- function GetMemberNameById($id)
- {
- if (!$id) return 0;
- $this->ipsclass->DB->query("SELECT members_display_name FROM ".SQL_PREFIX."members WHERE id='$id'");
- $row=$this->ipsclass->DB->fetch_row();
- return $row['members_display_name'];
- }
- function GetMemberInfoById($id)
- {
- if (!$id) return 0;
- $this->ipsclass->DB->query("SELECT * FROM ".SQL_PREFIX."members WHERE id='$id'");
- $row=$this->ipsclass->DB->fetch_row();
- return $row;
- }
- function ShowHistory()
- {
- if (!$this->ModIsEnable()) return;
- //адаптировать для просотра админами
- $uid=$this->ipsclass->member['id'];
- /*******************************************************
- * Постраничный вывод
- *******************************************************/
- $this->ipsclass->DB->query("SELECT COUNT(*) as cnt FROM ".SQL_PREFIX."pay_history WHERE (to_user=$uid OR (user=$uid AND type ='spend')) AND type!='penalty' AND ( data NOT LIKE '%s:5:\"value\";s:1:\"0\";s:6:\"value2\";N;%' OR data NOT LIKE '%s:5:\"value\";s:1:\"0\";s:6:\"value2\";s:1:\"0\";%' OR (data NOT LIKE '%s:5:\"value\";s:1:\"0\";%' AND data NOT LIKE '%s:6:\"value2\";%'))");
- $cnt=$this->ipsclass->DB->fetch_row();
- $pager['per_page']=$this->Settings['RowCount'];
- $pager['from']= abs(intval($this->ipsclass->input['sp'])) ? abs(intval($this->ipsclass->input['sp'])-1)*$pager['per_page'] : 0;
- $pager['cur_page']=$pager['from']/$pager['per_page']+1;
- $pager['total']=$cnt['cnt'];
- $pager['page_count']=ceil($pager['total']/$pager['per_page']);
- $this->smarty->assign("pager",$pager);
- /*******************************************************/
- $q=$this->ipsclass->DB->query("SELECT * FROM ".SQL_PREFIX."pay_history WHERE (to_user=$uid OR (user=$uid AND type ='spend')) AND type!='penalty' AND ( data NOT LIKE '%s:5:\"value\";s:1:\"0\";s:6:\"value2\";N;%' OR data NOT LIKE '%s:5:\"value\";s:1:\"0\";s:6:\"value2\";s:1:\"0\";%' OR (data NOT LIKE '%s:5:\"value\";s:1:\"0\";%' AND data NOT LIKE '%s:6:\"value2\";%')) ORDER BY id DESC LIMIT {$pager['from']},{$this->Settings['RowCount']}");
- while ($row=$this->ipsclass->DB->fetch_row($q))
- {
- $row['data']=unserialize($row['data']);
- $row['data']['comment']=base64_decode($row['data']['comment']);
- $row['date']=date("j.n.Y, G:i",$row['date']);
- $row['data']['amount'] = round($row['data']['value'], 4);
- switch ($row['type'])
- {
- case 'spend':
- if($row['to_user'] == $uid)
- {
- $row['data']['descr'] ="Получен перевод со счета ". $this->GetMemberNameById($row['user']);
- $row['data']['amount'] =round($row['data']['value'], 4);
- }
- else
- {
- $row['data']['descr'] ="Произведен перевод на счет ". $this->GetMemberNameById($row['to_user']);
- $row['data']['amount'] =round(-$row['data']['value'], 4);
- }
- break;
- case 'spend_com':
- $row['data']['descr'] ="";
- $row['data']['amount'] =round(-$row['data']['value'], 4);
- break;
- case 'null_pay':
- $row['data']['descr'] ="Омена оплаты";
- $row['data']['amount'] =round(-$row['data']['value'], 4);
- break;
- case 'add_pay_for_post':
- $row['data']['descr'] ="Оплата засчитана";
- $row['data']['amount'] =round($row['data']['value'], 4);
- break;
- case 'repay_post':
- $row['data']['descr'] ="Перерасчет стоимости сообщения";
- $row['data']['amount'] =round($row['data']['value2']-$row['data']['value'], 4);
- break;
- case 'del_post_on_del_topic':
- $row['data']['descr'] ="Тема удалена";
- $row['data']['amount'] =round(-$row['data']['value'], 4);
- break;
- case 'move_post_on_move_topic':
- $row['data']['descr'] ="Перерасчет стоимости (тема перенесена)";
- $row['data']['amount'] =round($row['data']['value2']-$row['data']['value'], 4);
- break;
- case 'split_topic':
- $row['data']['descr'] ="Перерасчет стоимости (тема разделена)";
- $row['data']['amount'] =round($row['data']['value2']-$row['data']['value'], 4);
- break;
- case 'union_post':
- $row['data']['descr'] ="Перерасчет стоимости (объединение сообщений)";
- $row['data']['amount'] =round($row['data']['value2']-$row['data']['value'], 4);
- break;
- case 'union_topic':
- $row['data']['descr'] ="Перерасчет стоимости (объединение тем)";
- $row['data']['amount'] =round($row['data']['value2']-$row['data']['value'], 4);
- break;
- case 'null_pay':
- $row['data']['descr'] ="Омена оплаты";
- $row['data']['amount'] =round(-$row['data']['value'], 4);
- break;
- case 'del_post':
- $row['data']['descr'] ="Сообщение удалено";
- $row['data']['amount'] =round(-$row['data']['value'], 4);
- break;
- case 'edit_post':
- $row['data']['descr'] ="Перерасчет стоимости (сообщение изменено)";
- $row['data']['amount'] =round($row['data']['value2']-$row['data']['value'], 4);
- break;
- case 'move_post':
- $row['data']['descr'] ="Перерасчет стоимости (сообщение перенесено)";
- $row['data']['amount'] =round($row['data']['value2']-$row['data']['value'], 4);
- break;
- case 'ref_comp':
- $row['data']['descr'] ="Реф. начисление (".$this->GetMemberNameById($row['user']).")";
- $row['data']['amount'] =round($row['data']['value'], 4);
- break;
- case 'change_ref_comp':
- $row['data']['descr'] ="Изменение реф. начисления (".$this->GetMemberNameById($row['user']).")";
- $row['data']['amount'] =round($row['data']['value'], 4);
- break;
- case 'withdrawal_r':
- $row['data']['descr'] ="Заказ выплаты";
- $row['data']['amount'] =round(-$row['data']['value'], 4);
- break;
- case 'withdrawal':
- $row['data']['descr']="Произведена выплата ".date("j.n.Y, G:i",$row['data']['update_date'])." на счет ".base64_decode($row['data']['acc_type']).":".base64_decode($row['data']['acc']). "<br>Исполнитель ".$this->GetMemberNameById($row['data']['by_user'])."<br>";
- $row['data']['amount'] =round(-$row['data']['value'], 4);
- break;}
- if($row['data']['amount'] >= 0)
- {
- $row['data']['color'] = "#008000";
- }
- else
- {
- $row['data']['color'] = "#FF0000";
- }
- $this->smarty->append('lines', $row);
- }
- $this->smarty->assign('username', $this->GetMemberNameById($uid));
- //$this->smarty->assign('___Data', $this->smarty->fetch('showp.tpl'));
- $this->smarty->assign('___Data', $this->smarty->fetch('showh.tpl'));
- }
- function ShowPenalty()
- {
- if (!$this->ModIsEnable()) return;
- $uid=$this->ipsclass->member['id'];
- $this->smarty->assign("___url",$this->ipsclass->base_url."act=ps&code=showp");
- if (intval($this->ipsclass->input['uid']) && $this->ipsclass->member['is_mod'])
- {
- $uid=intval($this->ipsclass->input['uid']);
- if ( $this->ipsclass->member['mgroup']!=$this->ipsclass->vars['admin_group'] &&
- !$this->Settings['ModSeeOtherPenalty']
- ) $a="user=".$this->ipsclass->member['id']." AND ";
- $this->smarty->assign("___url",$this->ipsclass->base_url."act=ps&code=showp&uid=".intval($this->ipsclass->input['uid']));
- }
- /*******************************************************
- * Постраничный вывод
- *******************************************************/
- $this->ipsclass->DB->query("SELECT COUNT(*) as cnt FROM ".SQL_PREFIX."pay_history WHERE $a to_user=$uid AND type='penalty'");
- $cnt=$this->ipsclass->DB->fetch_row();
- $pager['per_page']=$this->Settings['RowCount'];
- $pager['from']= abs(intval($this->ipsclass->input['sp'])) ? abs(intval($this->ipsclass->input['sp'])-1)*$pager['per_page'] : 0;
- $pager['cur_page']=$pager['from']/$pager['per_page']+1;
- $pager['total']=$cnt['cnt'];
- $pager['page_count']=ceil($pager['total']/$pager['per_page']);
- $this->smarty->assign("pager",$pager);
- /*******************************************************/
- $q=$this->ipsclass->DB->query("SELECT * FROM ".SQL_PREFIX."pay_history WHERE $a to_user=$uid AND type='penalty' ORDER BY id LIMIT {$pager['from']},{$this->Settings['RowCount']}");
- while ($row=$this->ipsclass->DB->fetch_row($q))
- {
- $row['topic_name']=$this->GetTopicNameByPostId($row['post']);
- $row['topic_id']=$this->GetTopicIdByPostId($row['post']);
- $row['data']=unserialize($row['data']);
- $row['data']['comment']=base64_decode($row['data']['comment']);
- $row['user_name']=$this->GetMemberNameById($row['user']);
- $row['date']=date("j.n.Y, G:i",$row['date']);
- //==========================================
- //Имеет ли пользователь права на удаление штрафа.
- //==========================================
- if ( ($this->IsModInForum($this->GetForumIdByPostId($row['post'])) && $row['user']==$this->ipsclass->member['id']) || //если просматривает модератор выставивший штраф
- ($this->ipsclass->member['is_mod'] && $this->Settings['ModCancelOtherPenalty']) || //или другой модератор, но модерам разрешено отменять другие штрафы
- $this->ipsclass->member['mgroup']==$this->ipsclass->vars['admin_group'] //или это главный админ
- )
- {
- $row['Cancel']=1;
- }
- //==========================================
- //Имеет ли пользовател права на изменение штрафа.
- //==========================================
- if ( ($this->IsModInForum($this->GetForumIdByPostId($row['post'])) && $row['user']==$this->ipsclass->member['id']) || //если просматривает модератор выставивший штраф
- ($this->ipsclass->member['is_mod'] && $this->Settings['ModEditOtherPenalty']) || //или другой модератор, но модерам разрешено редактировать другие штрафы
- $this->ipsclass->member['mgroup']==$this->ipsclass->vars['admin_group'] //или это главный админ
- )
- {
- $row['Edit']=1;
- }
- $this->smarty->append('pens', $row);
- }
- $this->smarty->assign('username', $this->GetMemberNameById($uid));
- $this->smarty->assign('___Data', $this->smarty->fetch('showp.tpl'));
- }
- function Mod_ShowPenalty()
- {
- if (!$this->ModIsEnable()) return;
- $uid=$this->ipsclass->member['id'];
- $this->smarty->assign("___url",$this->ipsclass->base_url."act=ps&code=mod&show=ph");
- $this->smarty->assign("inmod",1);
- /*******************************************************
- * Постраничный вывод
- *******************************************************/
- $this->ipsclass->DB->query("SELECT COUNT(*) as cnt FROM ".SQL_PREFIX."pay_history WHERE user={$this->ipsclass->member['id']} AND type='penalty'");
- $cnt=$this->ipsclass->DB->fetch_row();
- $pager['per_page']=$this->Settings['RowCount'];
- $pager['from']= abs(intval($this->ipsclass->input['sp'])) ? abs(intval($this->ipsclass->input['sp'])-1)*$pager['per_page'] : 0;
- $pager['cur_page']=$pager['from']/$pager['per_page']+1;
- $pager['total']=$cnt['cnt'];
- $pager['page_count']=ceil($pager['total']/$pager['per_page']);
- $this->smarty->assign("pager",$pager);
- /*******************************************************/
- $q=$this->ipsclass->DB->query("SELECT * FROM ".SQL_PREFIX."pay_history WHERE user={$this->ipsclass->member['id']} AND type='penalty' ORDER BY id LIMIT {$pager['from']},{$this->Settings['RowCount']}");
- while ($row=$this->ipsclass->DB->fetch_row($q))
- {
- $row['topic_name']=$this->GetTopicNameByPostId($row['post']);
- $row['topic_id']=$this->GetTopicIdByPostId($row['post']);
- $row['data']=unserialize($row['data']);
- $row['data']['comment']=base64_decode($row['data']['comment']);
- $row['user_name']=$this->GetMemberNameById($row['user']);
- $row['date']=date("j.n.Y, G:i",$row['date']);
- //==========================================
- //Имеет ли пользователь права на удаление штрафа.
- //==========================================
- if ( ($this->IsModInForum($this->GetForumIdByPostId($row['post'])) && $row['user']==$this->ipsclass->member['id']) || //если просматривает модератор выставивший штраф
- ($this->ipsclass->member['is_mod'] && $this->Settings['ModCancelOtherPenalty']) || //или другой модератор, но модерам разрешено отменять другие штрафы
- $this->ipsclass->member['mgroup']==$this->ipsclass->vars['admin_group'] //или это главный админ
- )
- {
- $row['Cancel']=1;
- }
- //==========================================
- //Имеет ли пользовател права на изменение штрафа.
- //==========================================
- if ( ($this->IsModInForum($this->GetForumIdByPostId($row['post'])) && $row['user']==$this->ipsclass->member['id']) || //если просматривает модератор выставивший штраф
- ($this->ipsclass->member['is_mod'] && $this->Settings['ModEditOtherPenalty']) || //или другой модератор, но модерам разрешено редактировать другие штрафы
- $this->ipsclass->member['mgroup']==$this->ipsclass->vars['admin_group'] //или это главный админ
- )
- {
- $row['Edit']=1;
- }
- $this->smarty->append('pens', $row);
- }
- $this->smarty->assign('___Data', $this->smarty->fetch('showp.tpl'));
- }
- function Mod_Start()
- {
- if (!$this->ModIsEnable()) return;
- //==========================================
- //Проверка - является ли пользователь админом.
- //==========================================
- if (!$this->ipsclass->member['is_mod'])
- {
- $this->smarty->assign('___ERROR', "У Вас нет доступа к данной функции");
- $this->smarty->assign('___Data', $this->smarty->fetch('error.tpl'));
- return;
- }
- switch ($this->ipsclass->input['t'])
- {
- case 'p':
- $this->Mod_SetPenalty();
- break;
- case 'ph':
- $this->Mod_ShowPenalty();
- break;
- case 'nulled':
- $this->Mod_ToNullPayForPost();
- break;
- case 'added':
- $this->Mod_AddPayForPost();
- break;
- case 'repay':
- $this->Mod_RePayForPost();
- break;
- case 'dp':
- $this->Mod_DeletePenalty();
- break;
- case 'ep':
- $this->Mod_EditPenalty();
- break;
- default:
- $this->smarty->assign('___ERROR', "Ошибка выполнения программы");
- $this->smarty->assign('___Data', $this->smarty->fetch('error.tpl'));
- return;
- }
- }
- function Mod_ToNullPayForPost()
- {
- if (!$this->ModIsEnable()) return;
- //==========================================
- //Имеет ли пользователь права на модерирование раздела.
- //==========================================
- if ( $this->IsModInForum($this->GetForumIdByPostId(intval($this->ipsclass->input['pid']))) || //если просматривает модератор раздела
- $this->ipsclass->member['mgroup']==$this->ipsclass->vars['admin_group'] //или это главный админ
- )
- {
- $this->ipsclass->DB->query("SELECT pay,author_id,post_date FROM ".SQL_PREFIX."posts WHERE pid=".intval($this->ipsclass->input['pid']));
- $row=$this->ipsclass->DB->fetch_row();
- if (floatval($row['pay']))
- {
- //==========================================
- //Заносим информацию в историю
- //==========================================
- $line=array(
- "date" => mktime(),
- "user" => $this->ipsclass->member['id'],
- "to_user" => $row['author_id'],
- "type" => "null_pay",
- "data" => serialize(array("value"=>$row['pay'])),
- "post" => $row['post'],
- );
- $this->AddLogLine($line);
- $this->RefCharges(-$row['pay'],$row['author_id'],$row['post_date']);
- $this->ipsclass->DB->do_update("posts",array('pay'=>0),"pid=".intval($this->ipsclass->input['pid']));
- $this->smarty->assign('___Data', "<center><br>Оплата отменена<br><br>");
- }
- else
- {
- $this->smarty->assign('___Data', "<center><br>Данное сообщение не оплачено<br><br>");
- }
- }
- }
- function Mod_AddPayForPost()
- {
- if (!$this->ModIsEnable()) return;
- //==========================================
- //Имеет ли пользователь права на модерирование раздела.
- //==========================================
- if ( $this->IsModInForum($this->GetForumIdByPostId(intval($this->ipsclass->input['pid']))) || //если просматривает модератор раздела
- $this->ipsclass->member['mgroup']==$this->ipsclass->vars['admin_group'] //или это главный админ
- )
- {
- $this->ipsclass->DB->query("SELECT * FROM ".SQL_PREFIX."posts WHERE pid=".intval($this->ipsclass->input['pid']));
- $row=$this->ipsclass->DB->fetch_row();
- if (!floatval($row['pay']))
- {
- $newpay=$this->GetPayForPost($this->GetForumIdByPostId(intval($this->ipsclass->input['pid'])),$row['new_topic'],$row['post'],0,$row['author_id']);
- $this->ipsclass->DB->do_update("posts",array('pay'=>$newpay),"pid=".intval($this->ipsclass->input['pid']));
- //==========================================
- //Заносим информацию в историю
- //==========================================
- $line=array(
- "date" => mktime(),
- "user" => $this->ipsclass->member['id'],
- "to_user" => $row['author_id'],
- "type" => "add_pay_for_post",
- "data" => serialize(array("value"=>$newpay)),
- "post" => $row['pid'],
- );
- $this->AddLogLine($line);
- $this->RefCharges($newpay,$row['author_id'],$row['post_date'],0);
- $this->smarty->assign('___Data', "<center><br>Засчитана оплата {$this->Settings['Currency']}$newpay<br><br>");
- }
- else
- {
- $this->smarty->assign('___Data', "<center><br>оплата за данное сообщение уже была засчитана.<br><br>");
- }
- }
- }
- function Mod_RePayForPost()
- {
- if (!$this->ModIsEnable()) return;
- //==========================================
- //Имеет ли пользователь права на модерирование раздела.
- //==========================================
- if ( $this->IsModInForum($this->GetForumIdByPostId(intval($this->ipsclass->input['pid']))) || //если просматривает модератор раздела
- $this->ipsclass->member['mgroup']==$this->ipsclass->vars['admin_group'] //или это главный админ
- )
- {
- $this->ipsclass->DB->query("SELECT * FROM ".SQL_PREFIX."posts WHERE pid=".intval($this->ipsclass->input['pid']));
- $row=$this->ipsclass->DB->fetch_row();
- $newpay=$this->GetPayForPost($this->GetForumIdByPostId(intval($this->ipsclass->input['pid'])),$row['new_topic'],$row['post'],1,$row['author_id']);
- if (round($row['pay'],7)!=round($newpay,7))
- {
- //==========================================
- //Заносим информацию в историю
- //==========================================
- $line=array(
- "date" => mktime(),
- "user" => $this->ipsclass->member['id'],
- "to_user" => $row['author_id'],
- "type" => "repay_post",
- "data" => serialize(array("value"=>$row['pay'],"value2"=>$newpay)),
- "post" => $row['pid'],
- );
- $this->AddLogLine($line);
- $this->RefCharges($newpay-$row['pay'],$row['author_id'],$row['post_date'],1);
- $this->ipsclass->DB->do_update("posts",array('pay'=>$newpay),"pid=".intval($this->ipsclass->input['pid']));
- }
- $this->smarty->assign('___Data', "<center><br>Произведен перерасчет оплаты с {$this->Settings['Currency']}{$row['pay']} на {$this->Settings['Currency']}$newpay<br><br>");
- }
- }
- function Mod_EditPenalty()
- {
- if (!$this->ModIsEnable()) return;
- //==========================================
- //Есть ли данный штраф в таблице, если да
- //получаем информацию о нем.
- //==========================================
- if (intval($this->ipsclass->input['pid']) && $pen=$this->GetPenaltyInfo(intval($this->ipsclass->input['pid'])))
- {
- //==========================================
- //Имеет ли пользовател права на изменение штрафа.
- //==========================================
- if ( ($this->IsModInForum($this->GetForumIdByPostId($pen['post'])) && $pen['user']==$this->ipsclass->member['id']) || //если просматривает модератор выставивший штраф
- ($this->ipsclass->member['is_mod'] && $this->Settings['ModEditOtherPenalty']) || //или другой модератор, но модерам разрешено редактировать другие штрафы
- $this->ipsclass->member['mgroup']==$this->ipsclass->vars['admin_group'] //или это главный админ
- )
- {
- //==========================================
- //передан ли флаг сохранения штрафа
- //и не занулена величина штрафа
- //==========================================
- if (isset($this->ipsclass->input['save']) && abs(floatval($this->ipsclass->input['pen'])))
- {
- if (round($pen['data']['value'],7)!=round(abs(floatval($this->ipsclass->input['pen'])),7))
- {
- //==========================================
- //Заносим информацию в историю
- //==========================================
- $line=array(
- "date" => mktime(),
- "user" => $this->ipsclass->member['id'],
- "to_user" => $pen['to_user'],
- "type" => "penalty_edit",
- "data" => serialize(array("pid"=>$pen['id'],"value"=>$pen['data']['value'],"value2"=>abs(floatval($this->ipsclass->input['pen'])))),
- "post" => $pen['post'],
- );
- $this->AddLogLine($line);
- }
- //==========================================
- //обновляем запись в таблице
- //==========================================
- $pen['data']['comment']=$_POST['com'];
- $pen['data']['value']=abs(floatval($this->ipsclass->input['pen']));
- $pen_line['comment']=base64_encode($_POST['com']);
- $pen_line['value']=floatval($this->ipsclass->input['pen']);
- $pen_line=serialize($pen_line);
- $this->ipsclass->DB->do_update("pay_history",array('data'=>$pen_line),"id=".$pen['id']);
- //==========================================
- //готовим переменные для вывода отчета
- //==========================================
- $this->smarty->assign('pok', 1);
- $pen['date']=date("j.n.Y, G:i",$pen['date']);
- $pen['user_name']=$this->GetMemberNameById($pen['user']);
- $pen['to_user_name']=$this->GetMemberNameById($pen['to_user']);
- $pen['topic']=$this->GetTopicIdByPostId($pen['post']);
- $pen['topic_name']=$this->GetTopicNameByPostId($pen['post']);
- $this->smarty->assign('report', $pen);
- $this->smarty->assign('___Data', $this->smarty->fetch('editpenalty.tpl'));
- }
- //==========================================
- //если нет, то выводим форму для редактирования
- //==========================================
- else
- {
- $this->smarty->assign('membername', $this->GetMemberNameById($pen['to_user']));
- $this->smarty->assign('penid', $pen['id']);
- $this->smarty->assign('topicname', $this->GetTopicNameByPostId($pen['post']));
- $this->smarty->assign('pid', $pen['post']);
- $this->smarty->assign('date', date("j.n.Y, G:i",$pen['date']));
- $this->smarty->assign('pen', $pen['data']['value']);
- $this->smarty->assign('com', $pen['data']['comment']);
- $this->smarty->assign('___Data', $this->smarty->fetch('editpenalty.tpl'));
- }
- }
- else
- {
- $this->smarty->assign('___ERROR', "Вы не имеете достаточных полномочий для редактирования штрафа №".$pen['id']);
- $this->smarty->assign('___Data', $this->smarty->fetch('error.tpl'));
- }
- }
- else
- {
- $this->smarty->assign('___ERROR', "Запись о штрафе не обнаружена в таблице.");
- $this->smarty->assign('___Data', $this->smarty->fetch('error.tpl'));
- }
- }
- function Mod_DeletePenalty()
- {
- if (!$this->ModIsEnable()) return;
- //==========================================
- //Есть ли данный штраф в таблице, если да
- //получаем информацию о нем.
- //==========================================
- if (intval($this->ipsclass->input['pid']) && $pen=$this->GetPenaltyInfo(intval($this->ipsclass->input['pid'])))
- {
- //==========================================
- //Имеет ли пользователь права на удаление штрафа.
- //==========================================
- if ( ($this->IsModInForum($this->GetForumIdByPostId($pen['post'])) && $pen['user']==$this->ipsclass->member['id']) || //если просматривает модератор выставивший штраф
- ($this->ipsclass->member['is_mod'] && $this->Settings['ModCancelOtherPenalty']) || //или другой модератор, но модерам разрешено отменять другие штрафы
- $this->ipsclass->member['mgroup']==$this->ipsclass->vars['admin_group'] //или это главный админ
- )
- {
- //==========================================
- //Передан флаг удаления.
- //==========================================
- if (isset($this->ipsclass->input['del']))
- {
- $pen['type']="penalty_del";
- $pen['data']['by_user']=$this->ipsclass->member['id'];
- $pen['data']=serialize($pen['data']);
- $this->ipsclass->DB->do_update("pay_history",$pen,"id=".$pen['id']);
- header("Location: {$this->ipsclass->base_url}act=ps");
- exit();
- }
- //==========================================
- //не передан флаг удаления.
- //==========================================
- else
- {
- $pen['date']=date("j.n.Y, G:i",$pen['date']);
- $pen['user_name']=$this->GetMemberNameById($pen['user']);
- $pen['to_user_name']=$this->GetMemberNameById($pen['to_user']);
- $pen['topic']=$this->GetTopicIdByPostId($pen['post']);
- $pen['topic_name']=$this->GetTopicNameByPostId($pen['post']);
- $this->smarty->assign('report', $pen);
- $this->smarty->assign('___Data', $this->smarty->fetch('deletepenalty.tpl'));
- }
- }
- else
- {
- $this->smarty->assign('___ERROR', "Вы не имеете достаточных полномочий для удаления штрафа №".$pen['id']);
- $this->smarty->assign('___Data', $this->smarty->fetch('error.tpl'));
- }
- }
- else
- {
- $this->smarty->assign('___ERROR', "Запись о штрафе не обнаружена в таблице.");
- $this->smarty->assign('___Data', $this->smarty->fetch('error.tpl'));
- }
- }
- function Mod_SetPenalty()
- {
- if (!$this->ModIsEnable()) return;
- if (!intval($this->ipsclass->input['pid']) || !$this->IsValidPost(intval($this->ipsclass->input['pid'])))
- {
- $this->smarty->assign('___ERROR', "Не верные параметры");
- $this->smarty->assign('___Data', $this->smarty->fetch('error.tpl'));
- return;
- }
- if (isset($this->ipsclass->input['add']) && floatval($this->ipsclass->input['pen']))
- {
- $log_line['date']=mktime();
- $log_line['user']=$this->ipsclass->member['id'];
- $log_line['to_user']=$this->GetAuthorIdByPost(intval($this->ipsclass->input['pid']));
- $log_line['type']="penalty";
- $log_line['data']=serialize(array("value"=>floatval($this->ipsclass->input['pen']),"comment"=>base64_encode($_POST['com'])));
- $log_line['post']=intval($this->ipsclass->input['pid']);
- $this->AddLogLine($log_line);
- /* function of PM notification is disabled. Silen ----------------
- if ($this->Settings['MailOnPenalty'])
- {
- require_once( ROOT_PATH.'sources/lib/func_msg.php' );
- $this->lib = new func_msg();
- $this->lib->ipsclass =& $this->ipsclass;
- $this->lib->init();
- $this->lib->to_by_id = 5;
- $this->lib->from_member = $this->GetMemberInfoById(1);
- $p=$this->GetPenaltyInfo($this->ipsclass->DB->get_insert_id());
- $p['user_name']=$this->GetMemberNameById($p['user']);
- $p['topic']=$this->GetTopicIdByPostId($p['post']);
- $p['topic_name']=$this->GetTopicNameByPostId($p['post']);
- $this->smarty->assign('pen',$p);
- $this->lib->msg_post = $this->smarty->fetch('penalty_pm.tpl');
- $this->lib->msg_title = $this->smarty->_smarty_vars["capture"]["title"];
- $this->lib->force_pm = 0;
- $this->lib->send_pm();
- }
- --------------------------------------------------------------- */
- header("Location: {$this->ipsclass->base_url}act=ps&code=mod&t=p&ok&pid=".intval($this->ipsclass->input['pid']));
- exit();
- }
- elseif (isset($this->ipsclass->input['ok']) && $this->IsValidPost(intval($this->ipsclass->input['pid'])))
- {
- $this->ipsclass->DB->query("SELECT * FROM ".SQL_PREFIX."pay_history WHERE user='{$this->ipsclass->member['id']}' AND post=".intval($this->ipsclass->input['pid'])." ORDER BY id DESC");
- $row=$this->ipsclass->DB->fetch_row();
- $row['date']=date("j.n.Y, G:i",$row['date']);
- $row['user_name']=$this->GetMemberNameById($row['user']);
- $row['to_user_name']=$this->GetMemberNameById($row['to_user']);
- $row['topic']=$this->GetTopicIdByPostId($row['post']);
- $row['topic_name']=$this->GetTopicNameByPostId($row['post']);
- $row['data']=unserialize($row['data']);
- $row['data']['comment']=base64_decode($row['data']['comment']);
- $this->smarty->assign('report', $row);
- $this->smarty->assign('pok', 1);
- $this->smarty->assign('___Data', $this->smarty->fetch('setpenalty.tpl'));
- }
- else
- {
- $this->smarty->assign('membername', $this->GetMemberNameById($this->GetAuthorIdByPost(intval($this->ipsclass->input['pid']))));
- $this->smarty->assign('topicname', $this->GetTopicNameByPostId(intval($this->ipsclass->input['pid'])));
- $this->smarty->assign('pid', intval($this->ipsclass->input['pid']));
- $this->smarty->assign('date', date("j.n.Y, G:i",mktime()));
- $this->smarty->assign('___Data', $this->smarty->fetch('setpenalty.tpl'));
- }
- }
- function Adm_Start()
- {
- if (!$this->ModIsEnable()) return;
- //==========================================
- //Проверка - является ли пользователь админом.
- //==========================================
- if ($this->ipsclass->member['mgroup']!=$this->ipsclass->vars['admin_group'])
- {
- $this->smarty->assign('___ERROR', "У Вас нет доступа к данной функции");
- $this->smarty->assign('___Data', $this->smarty->fetch('error.tpl'));
- return;
- }
- switch ($this->ipsclass->input['t'])
- {
- case 'setup':
- $this->Adm_Setup();
- break;
- case 'pay_rules':
- $this->Adm_RulesSetup();
- break;
- case 'pay_forums':
- $this->Adm_ForumsSetup();
- break;
- case 'sponsors':
- $this->Adm_SponsorsSetup();
- break;
- case 'users':
- $this->Adm_Users();
- break;
- case 'wr':
- $this->Adm_WithdrawalRequest();
- break;
- default:
- $this->smarty->assign('___ERROR', "Ошибка выполнения программы");
- $this->smarty->assign('___Data', $this->smarty->fetch('error.tpl'));
- return;
- }
- }
- function Adm_WithdrawalRequest()
- {
- if (!$this->ModIsEnable()) return;
- if (intval($this->ipsclass->input['w']))
- {
- $this->ipsclass->DB->query("SELECT type,data FROM ".SQL_PREFIX."pay_history WHERE type='withdrawal_r' AND id=".intval($this->ipsclass->input['w']));
- $row=$this->ipsclass->DB->fetch_row();
- $row['type']="withdrawal";
- $row['data']=unserialize($row['data']);
- $row['data']['by_user']=$this->ipsclass->member['id'];
- $row['data']['update_date']=mktime();
- $row['data']=serialize($row['data']);
- $this->ipsclass->DB->do_update("pay_history",$row,"id=".intval($this->ipsclass->input['w']));
- header("Location: {$this->ipsclass->base_url}act=ps&code=adm&t=wr");
- exit();
- }
- $q=$this->ipsclass->DB->query("SELECT * FROM ".SQL_PREFIX."pay_history WHERE type='withdrawal_r' ORDER BY id");
- while ($row=$this->ipsclass->DB->fetch_row($q))
- {
- $row['date']=date("j.n.Y, G:i",$row['date']);
- $row['username']=$this->GetMemberNameById($row['user']);
- $row['data']=unserialize($row['data']);
- $row['data']['acc']=base64_decode($row['data']['acc']);
- $row['data']['acc_type']=base64_decode($row['data']['acc_type']);
- $row['data']['comment']=base64_decode($row['data']['comment']);
- $this->smarty->append('lines', $row);
- }
- $this->smarty->assign('___Data', $this->smarty->fetch('wr.tpl'));
- }
- //==========================================
- //Обработка работы с настройками мода
- //(админ. панель) v.2
- //==========================================
- function Adm_Setup()
- {
- if (!$this->ModIsEnable()) return;
- //==========================================
- //Нужно для нормальной алгебры
- //==========================================
- if (!setlocale(LC_ALL, "en_US")) setlocale(LC_ALL, "US");
- if (isset($this->ipsclass->input['save']))
- {
- $this->Settings['Currency']=base64_encode($this->ipsclass->input['Currency']);
- $this->Settings['ShowForumPay']=intval($this->ipsclass->input['ShowForumPay']);
- $this->Settings['ShowNullForumPay']=intval($this->ipsclass->input['ShowNullForumPay']);
- $this->Settings['PostLenghtEnable']=intval($this->ipsclass->input['PostLenghtEnable']);
- $this->Settings['RowCount']=intval($this->ipsclass->input['RowCount']);
- $this->Settings['ModSeeOtherPenalty']=intval($this->ipsclass->input['ModSeeOtherPenalty']);
- $this->Settings['ModCancelOtherPenalty']=intval($this->ipsclass->input['ModCancelOtherPenalty']);
- $this->Settings['MinCashOut']=abs(floatval($this->ipsclass->input['MinCashOut']));
- $this->Settings['RulesEnable']=intval($this->ipsclass->input['RulesEnable']);
- $this->Settings['RefEnable']=intval($this->ipsclass->input['RefEnable']);
- $this->Settings['AutoPostPay']=intval($this->ipsclass->input['AutoPostPay']);
- $this->Settings['Sponsors']=intval($this->ipsclass->input['Sponsors']);
- $this->Settings['UsersMaySeeOtherPenalty']=intval($this->ipsclass->input['UsersMaySeeOtherPenalty']);
- $this->Settings['UsersMaySeeValueOtherPenalty']=intval($this->ipsclass->input['UsersMaySeeValueOtherPenalty']);
- $this->Settings['ModEditOtherPenalty']=intval($this->ipsclass->input['ModEditOtherPenalty']);
- $this->Settings['MailOnPenalty']=intval($this->ipsclass->input['MailOnPenalty']);
- $this->Settings['MinSpend']=abs(floatval($this->ipsclass->input['MinSpend']));
- $this->Settings['TransactionEnable']=abs(intval($this->ipsclass->input['TransactionEnable']));
- $this->Settings['TransactionCom']=abs(floatval($this->ipsclass->input['TransactionCom']));
- $this->Settings['FreezeAfterDays']=intval($this->ipsclass->input['FreezeAfterDays']);
- $data=serialize($this->Settings);
- $this->ipsclass->DB->query("UPDATE ".SQL_PREFIX."paysys SET data='$data' WHERE name='settings';");
- if ($this->RefSys->RefLevels!=$this->ipsclass->input['reflevels'])
- {
- $this->RefSys->RefLevels=$this->ipsclass->input['reflevels'];
- $data=serialize(array('reflevels'=>base64_encode($this->RefSys->RefLevels),'record_time'=>mktime()));
- $this->ipsclass->DB->query("INSERT INTO ".SQL_PREFIX."paysys(name,data) VALUES('refsys','$data');");
- }
- header("Location: {$this->ipsclass->base_url}act=ps&code=adm&t=setup");
- exit();
- }
- $this->smarty->assign('___Settings', $this->Settings);
- $this->smarty->assign('___RefLevels', $this->RefSys->RefLevels);
- $this->smarty->assign('___Data', $this->smarty->fetch('setup.tpl'));
- }
- //==========================================
- //Обработка работы с правилами начисления
- //(админ. панель) v.2
- //==========================================
- function Adm_RulesSetup()
- {
- if (!$this->ModIsEnable()) return;
- //==========================================
- //Нужно для нормальной алгебры
- //==========================================
- if (!setlocale(LC_ALL, "en_US")) setlocale(LC_ALL, "US");
- //==========================================
- //Добавление правила
- //==========================================
- if (isset($this->ipsclass->input['add']))
- {
- foreach ($this->ipsclass->input['who'] as $who)
- {
- $rule=array(
- 'type' => ($this->ipsclass->input['value']=="v") ? "Pay" : "PayEnable",
- 'value' => ($this->ipsclass->input['value']=="y") ? 1 : (($this->ipsclass->input['value']=="n") ? 0 : floatval($this->ipsclass->input['value2'])),
- 'value2' => floatval($this->ipsclass->input['value3']),
- 'area' => ($this->ipsclass->input['area']=="global") ? "global" : floatval($this->ipsclass->input['area']),
- 'acts' => ($who=="all") ? "*" : $who[0].intval(substr($who,1)),
- );
- $this->ipsclass->DB->do_insert("pay_rules",$rule);
- }
- header("Location: {$this->ipsclass->base_url}act=ps&code=adm&t=pay_rules");
- exit();
- }
- //==========================================
- //Удаление правила
- //==========================================
- if (intval($this->ipsclass->input['del']))
- {
- $this->ipsclass->DB->do_delete("pay_rules","id=".intval($this->ipsclass->input['del']));
- header("Location: {$this->ipsclass->base_url}act=ps&code=adm&t=pay_rules");
- exit();
- }
- //==========================================
- //Подъем правила
- //==========================================
- if (intval($this->ipsclass->input['move_up']))
- {
- $this->ipsclass->DB->query("SELECT * FROM ".SQL_PREFIX."pay_rules WHERE id<".intval($this->ipsclass->input['move_up'])." ORDER BY id DESC");
- $row=$this->ipsclass->DB->fetch_row();
- if (intval($row['id']))
- {
- $this->ipsclass->DB->do_delete("pay_rules","id=".intval($row['id']));
- $this->ipsclass->DB->query("UPDATE ".SQL_PREFIX."pay_rules SET id=".intval($row['id'])." WHERE id=".intval($this->ipsclass->input['move_up']));
- $row['id']=intval($this->ipsclass->input['move_up']);
- $this->ipsclass->DB->do_insert("pay_rules",$row);
- }
- header("Location: {$this->ipsclass->base_url}act=ps&code=adm&t=pay_rules");
- exit();
- }
- //==========================================
- //Спуск правила
- //==========================================
- if (intval($this->ipsclass->input['move_down']))
- {
- $this->ipsclass->DB->query("SELECT * FROM ".SQL_PREFIX."pay_rules WHERE id>".intval($this->ipsclass->input['move_down'])." ORDER BY id");
- $row=$this->ipsclass->DB->fetch_row();
- if (intval($row['id']))
- {
- $this->ipsclass->DB->do_delete("pay_rules","id=".intval($row['id']));
- $this->ipsclass->DB->query("UPDATE ".SQL_PREFIX."pay_rules SET id=".intval($row['id'])." WHERE id=".intval($this->ipsclass->input['move_down']));
- $row['id']=intval($this->ipsclass->input['move_down']);
- $this->ipsclass->DB->do_insert("pay_rules",$row);
- }
- header("Location: {$this->ipsclass->base_url}act=ps&code=adm&t=pay_rules");
- exit();
- }
- //==========================================
- //Разбор существующих правил для их
- //отображения
- //==========================================
- $q=$this->ipsclass->DB->query("SELECT * FROM ".SQL_PREFIX."pay_rules ORDER BY id");
- while ($row0=$this->ipsclass->DB->fetch_row($q))
- {
- $row=$row0;
- if ($row['area']!="global") $row['area']=$this->GetForumNameById(intval($row['area']));
- if ($row['acts']!="*")
- {
- $row['acts']=array("type" => $row['acts'][0], "value" => substr($row['acts'],1));
- switch ($row['acts']['type'])
- {
- case "g":
- $row['acts']['value']=$this->GetGroupNameById($row['acts']['value']);
- break;
- case "m":
- $row['acts']['value']=$this->GetMemberNameById($row['acts']['value']);
- break;
- }
- }
- else $row['acts']['value']=$row['acts'];
- $this->smarty->append('rules',$row);
- }
- //==========================================
- //Информация для формы добавления правил
- //==========================================
- $this->ipsclass->DB->query("SELECT id,name FROM ".SQL_PREFIX."forums");
- while ($row=$this->ipsclass->DB->fetch_row())
- {
- $this->smarty->append('area',$row);
- }
- $this->ipsclass->DB->query("SELECT g_id,g_title FROM ".SQL_PREFIX."groups");
- while ($row=$this->ipsclass->DB->fetch_row())
- {
- $this->smarty->append('groups',$row);
- }
- $this->ipsclass->DB->query("SELECT id,members_l_display_name FROM ".SQL_PREFIX."members ORDER BY id");
- while ($row=$this->ipsclass->DB->fetch_row())
- {
- $this->smarty->append('members',$row);
- }
- $this->smarty->assign('___Data', $this->smarty->fetch('rules.tpl'));
- }
- //==========================================
- //настройка оплаты сообщений в форумах.
- //==========================================
- function Adm_ForumsSetup()
- {
- if (!$this->ModIsEnable()) return;
- //==========================================
- //Нужно для нормальной алгебры
- //==========================================
- if (!setlocale(LC_ALL, "en_US")) setlocale(LC_ALL, "US");
- if (isset($this->ipsclass->input['save']))
- {
- foreach ($this->ipsclass->input['psn'] as $key => $psn)
- {
- if ($this->Settings['AutoPostPay'] && !floatval($this->ipsclass->input['psr'][$key])) $this->ipsclass->input['psr'][$key]=floatval($psn);
- $this->ipsclass->DB->query("UPDATE ".SQL_PREFIX."forums SET pay_new_topic='".floatval($psn)."',pay_new_post='".floatval($this->ipsclass->input['psr'][$key])."',pay_mess_lenght='".floatval($this->ipsclass->input['psl'][$key])."' WHERE id='".intval($key)."';");
- }
- header("Location: {$this->ipsclass->base_url}act=ps&code=adm&t=pay_forums");
- exit();
- }
- require_once(ROOT_PATH.'sources/lib/admin_forum_functions.php');
- $this->forumfunc = new admin_forum_functions();
- $this->forumfunc->ipsclass =& $this->ipsclass;
- $forumslist=$this->forumfunc->ad_forums_forum_list();
- foreach ($forumslist as $key=>$forum)
- {
- $forumslist[$key][2]=0; //intval(strrpos($forum[1],"-"));
- while (substr($forum[1], $forumslist[$key][2], 1) == '-')
- {
- $forumslist[$key][2]++;
- }
- if ($forumslist[$key][2] > 0) $forumslist[$key][1]=substr($forumslist[$key][1],$forumslist[$key][2]);
- //if ($forumslist[$key][2]) $forumslist[$key][1]=substr($forumslist[$key][1],$forumslist[$key][2]+1);
- $this->ipsclass->DB->query("SELECT pay_new_topic,pay_new_post,pay_mess_lenght FROM ".SQL_PREFIX."forums WHERE id='{$forumslist[$key][0]}'");
- $row=$this->ipsclass->DB->fetch_row();
- $forumslist[$key][3]=floatval($row['pay_new_topic']);
- $forumslist[$key][4]=floatval($row['pay_new_post']);
- $forumslist[$key][5]=floatval($row['pay_mess_lenght']);
- }
- $this->smarty->assign('forumslist', $forumslist);
- $this->smarty->assign('___Data', $this->smarty->fetch('forums.tpl'));
- unset($this->forumfunc);
- }
- //==========================================
- //настройка банеров спонсоров разделов.
- //==========================================
- function Adm_SponsorsSetup()
- {
- if (!$this->ModIsEnable()) return;
- //==========================================
- //Нужно для нормальной алгебры
- //==========================================
- if (!setlocale(LC_ALL, "en_US")) setlocale(LC_ALL, "US");
- if (isset($this->ipsclass->input['save']))
- {
- foreach ($_POST['pss'] as $key => $pss)
- {
- if (!function_exists('get_magic_quotes_gpc') || !get_magic_quotes_gpc())
- {
- $pss = mysql_escape_string($pss);
- }
- $this->ipsclass->DB->query("UPDATE ".SQL_PREFIX."forums SET pay_sponsor='".$pss."' WHERE id='".intval($key)."';");
- }
- header("Location: {$this->ipsclass->base_url}act=ps&code=adm&t=sponsors");
- exit();
- }
- require_once(ROOT_PATH.'sources/lib/admin_forum_functions.php');
- $this->forumfunc = new admin_forum_functions();
- $this->forumfunc->ipsclass =& $this->ipsclass;
- $forumslist=$this->forumfunc->ad_forums_forum_list();
- foreach ($forumslist as $key=>$forum)
- {
- $forumslist[$key][2]=intval(strrpos($forum[1],"-"));
- if ($forumslist[$key][2]) $forumslist[$key][1]=substr($forumslist[$key][1],$forumslist[$key][2]+1);
- $this->ipsclass->DB->query("SELECT pay_sponsor FROM ".SQL_PREFIX."forums WHERE id='{$forumslist[$key][0]}'");
- $row=$this->ipsclass->DB->fetch_row();
- $forumslist[$key][3]=$this->StripSlashesDeep($row['pay_sponsor']);
- }
- $this->smarty->assign('forumslist', $forumslist);
- $this->smarty->assign('___Data', $this->smarty->fetch('sponsors.tpl'));
- unset($this->forumfunc);
- }
- //==========================================
- //Управление счетами пользователей.
- //==========================================
- function Adm_Users()
- {
- if (!$this->ModIsEnable()) return;
- if (intval($this->ipsclass->input['uid']))
- {
- $this->Adm_UserEdit();
- return;
- }
- /*******************************************************
- * Сортировка
- *******************************************************/
- switch ($this->ipsclass->input['sort'])
- {
- case "name":
- $sort="members_display_name";
- break;
- case "group":
- $sort="mgroup";
- break;
- default:
- $sort="id";
- }
- if (intval($this->ipsclass->input['desc'])) $sort.=" DESC";
- /*******************************************************/
- /*******************************************************
- * Постраничный вывод
- *******************************************************/
- $this->ipsclass->DB->query("SELECT COUNT(*) as cnt FROM ".SQL_PREFIX."members");
- $cnt=$this->ipsclass->DB->fetch_row();
- $pager['per_page']=$this->Settings['RowCount'];
- $pager['from']= abs(intval($this->ipsclass->input['sp'])) ? abs(intval($this->ipsclass->input['sp'])-1)*$pager['per_page'] : 0;
- $pager['cur_page']=$pager['from']/$pager['per_page']+1;
- $pager['total']=$cnt['cnt'];
- $pager['page_count']=ceil($pager['total']/$pager['per_page']);
- if ($this->ipsclass->input['sort']) $pager['link'].="&sort=".$this->ipsclass->input['sort'];
- $this->smarty->assign("pager",$pager);
- /*******************************************************/
- $q=$this->ipsclass->DB->query("SELECT id,members_display_name,mgroup FROM ".SQL_PREFIX."members ORDER BY $sort LIMIT {$pager['from']},{$this->Settings['RowCount']}");
- while ($row=$this->ipsclass->DB->fetch_row($q))
- {
- $row['group']=$this->GetGroupNameById($row['mgroup']);
- $row['stats']=$this->GetMemberCash($row['id']);
- $this->smarty->append('users', $row);
- }
- if ($this->ipsclass->input['sort']=="balans")
- {
- if (intval($this->ipsclass->input['desc']))
- {
- usort ($this->smarty->_tpl_vars['users'], array("pssys","BalansSortForUsers2"));
- }
- else
- {
- usort ($this->smarty->_tpl_vars['users'], array("pssys","BalansSortForUsers1"));
- }
- }
- $this->smarty->assign('___Data', $this->smarty->fetch('users.tpl'));
- }
- function BalansSortForUsers1($a, $b)
- {
- if ($a['stats']['balans'] == $b['stats']['balans']) return 0;
- return ($a['stats']['balans'] > $b['stats']['balans']) ? -1 : 1;
- }
- function BalansSortForUsers2($a, $b)
- {
- if ($a['stats']['balans'] == $b['stats']['balans']) return 0;
- return ($a['stats']['balans'] > $b['stats']['balans']) ? 1 : -1;
- }
- //==========================================
- //редактирование счета пользователя.
- //==========================================
- function Adm_UserEdit()
- {
- if (!$this->ModIsEnable()) return;
- $this->smarty->assign('___Data', "Эта функция недоступна в данной версии");
- }
- //----------------------------------------------------------------------------------------------------------------------------//
- //------------------------------------------------------GET-------------------------------------------------------------------//
- //----------------------------------------------------------------------------------------------------------------------------//
- //==========================================
- //Возращает название форума.
- //==========================================
- function GetForumNameById($forum_id=0)
- {
- if (!$forum_id) return;
- $this->ipsclass->DB->query("SELECT name FROM ".SQL_PREFIX."forums WHERE id='$forum_id'");
- $row=$this->ipsclass->DB->fetch_row();
- return $row['name'];
- }
- function GetAuthorIdByPost($pid=0)
- {
- if (!$pid) return 0;
- $this->ipsclass->DB->query("SELECT author_id FROM ".SQL_PREFIX."posts WHERE pid='$pid'");
- $row=$this->ipsclass->DB->fetch_row();
- return $row['author_id'];
- }
- function GetTopicNameByPostId($post_id=0)
- {
- if (!$post_id) return;
- return $this->GetTopicNameById($this->GetTopicIdByPostId($post_id));
- }
- function GetPenaltyInfo($id=0)
- {
- if (!$this->ModIsEnable()) return;
- $this->ipsclass->DB->query("SELECT * FROM ".SQL_PREFIX."pay_history WHERE id='$id' AND type='penalty'");
- $row=$this->ipsclass->DB->fetch_row();
- if (!intval($row['id'])) return 0;
- $row['data']=unserialize($row['data']);
- $row['data']['comment']=base64_decode($row['data']['comment']);
- return $row;
- }
- function GetTopicIdByPostId($post_id=0)
- {
- if (!$post_id) return;
- $this->ipsclass->DB->query("SELECT topic_id FROM ".SQL_PREFIX."posts WHERE pid='$post_id'");
- $row=$this->ipsclass->DB->fetch_row();
- return $row['topic_id'];
- }
- function GetForumIdByPostId($post_id=0)
- {
- if (!$post_id) return;
- $this->ipsclass->DB->query("SELECT forum_id FROM ".SQL_PREFIX."topics WHERE tid=".$this->GetTopicIdByPostId($post_id));
- $row=$this->ipsclass->DB->fetch_row();
- return $row['forum_id'];
- }
- function GetTopicNameById($id=0)
- {
- if (!$id) return;
- $this->ipsclass->DB->query("SELECT title FROM ".SQL_PREFIX."topics WHERE tid='$id'");
- $row=$this->ipsclass->DB->fetch_row();
- return $row['title'];
- }
- //----------------------------------------------------------------------------------------------------------------------------//
- //-----------------------------------------------------#GET-------------------------------------------------------------------//
- //----------------------------------------------------------------------------------------------------------------------------//
- function IsModInForum($forum_id)
- {
- if (!isset($this->ipsclass->member['_moderator'])) return 0;
- foreach ($this->ipsclass->member['_moderator'] as $modline)
- {
- if ($modline['forum_id']==$forum_id) return 1;
- }
- return 0;
- }
- function IsValidPost($id)
- {
- if (!intval($id)) return 0;
- $this->ipsclass->DB->query("SELECT pid FROM ".SQL_PREFIX."posts WHERE pid=".intval($id));
- $row=$this->ipsclass->DB->fetch_row();
- return intval($row['pid']);
- }
- function StripSlashesDeep($value)
- {
- if (!empty($value) && is_string($value))
- {
- $value = stripslashes($value);
- }
- return $value;
- }
- //----------------------------------------------------------------------------------------------------------------------------//
- //----------------------------------------Функции - реакции на изменения сообщений--------------------------------------------//
- //----------------------------------------------------------------------------------------------------------------------------//
- function OnDeleteTopic($ids)
- {
- if (!$this->ModIsEnable()) return;
- //==========================================
- //перебор идов переданных топиков
- //==========================================
- foreach ($ids as $id)
- {
- //==========================================
- //получаем данные о всех постах в текущем топике:
- //автор поста и кол-во начисленных денег
- //==========================================
- $SQL = "SELECT author_id,pay,post_date FROM ".SQL_PREFIX."posts WHERE topic_id=".$id." AND DATEDIFF(NOW(), DATE_ADD('1970-01-01', INTERVAL post_date SECOND)) <= ".$this->Settings['FreezeAfterDays'];
- $db_id=$this->ipsclass->DB->query($SQL);
- //==========================================
- //перебор постов
- //==========================================
- while ($del_post=$this->ipsclass->DB->fetch_row($db_id))
- {
- if ($del_post['pay'])
- {
- //==========================================
- //Заносим информацию в историю
- //==========================================
- $line=array(
- "date" => mktime(),
- "user" => $this->ipsclass->member['id'],
- "to_user" => $del_post['author_id'],
- "type" => "del_post_on_del_topic",
- "data" => serialize(array("value"=>$del_post['pay'])),
- "post" => 0,
- );
- $this->AddLogLine($line);
- //==========================================
- //пересчитываем рефпроцент
- //==========================================
- $this->RefCharges(-1*$del_post['pay'],$del_post['author_id'],$del_post['post_date'],1);
- }
- }
- }
- }
- function OnMoveTopic($tids=array(),$source_id,$dest_id)
- {
- if (!$this->ModIsEnable()) return;
- //==========================================
- //Нужно для нормальной алгебры
- //==========================================
- if (!setlocale(LC_ALL, "en_US")) setlocale(LC_ALL, "US");
- //==========================================
- //формируем базовый запрос
- //==========================================
- $query['select']="pid,author_id,pay,new_topic,post,post_date";
- $query['from']="posts";
- //==========================================
- //Начинаем перебор перемещаемых топиков
- //==========================================
- foreach ($tids as $tid)
- {
- $query['where']="topic_id=".$tid." AND DATEDIFF(NOW(), DATE_ADD('1970-01-01', INTERVAL post_date SECOND)) <= ".$this->Settings['FreezeAfterDays'];;
- //==========================================
- //Выполняем запрос к базе и перебираем посты
- //==========================================
- $this->ipsclass->DB->simple_construct($query);
- $q_id=$this->ipsclass->DB->simple_exec();
- while ($move_post=$this->ipsclass->DB->fetch_row($q_id))
- {
- //==========================================
- //расчитать новую стоимость поста, с условием new_topic
- //==========================================
- if ($move_post['new_topic']==1) $newpay=$this->GetPayForPost($dest_id,1,$move_post['post'],1,$move_post['author_id']);
- else $newpay=$this->GetPayForPost($dest_id,0,$move_post['post'],1,$move_post['author_id']);
- //==========================================
- //если стоимость рассматриваемого поста равна
- //стоимости в форуме куда перемещаем то не трогаем ряды
- //==========================================
- if ($newpay!=$move_post['pay'])
- {
- //==========================================
- //Заносим информацию в историю
- //==========================================
- $line=array(
- "date" => mktime(),
- "user" => $this->ipsclass->member['id'],
- "to_user" => $move_post['author_id'],
- "type" => "move_post_on_move_topic",
- "data" => serialize(array("value"=>$move_post['pay'],"value2"=>$newpay)),
- "post" => $move_post['pid'],
- );
- $this->AddLogLine($line);
- //==========================================
- //пересчитать рефначисления
- //==========================================
- $this->RefCharges($newpay-$move_post['pay'],$move_post['author_id'],$move_post['post_date']);
- //==========================================
- //обновить запись поста
- //==========================================
- $this->ipsclass->DB->query("UPDATE ".SQL_PREFIX."posts SET pay='$newpay' WHERE pid='{$move_post['pid']}';");
- }
- }
- }
- }
- //==========================================
- //Реакция на разделение темы
- //==========================================
- function OnSplitTopic($forum_id,$post_ids,$from_topic_id)
- {
- if (!$this->ModIsEnable()) return;
- //==========================================
- //Нужно для нормальной алгебры
- //==========================================
- if (!setlocale(LC_ALL, "en_US")) setlocale(LC_ALL, "US");
- //==========================================
- //Производим выборку перемещаемых постов
- //==========================================
- $q=$this->ipsclass->DB->query("SELECT pid,post,author_id,post_date,pay FROM ".SQL_PREFIX."posts WHERE pid IN ($post_ids) AND DATEDIFF(NOW(), DATE_ADD('1970-01-01', INTERVAL post_date SECOND)) <= ".$this->Settings['FreezeAfterDays']." ORDER BY pid");
- //==========================================
- //Получаем первое сообщение из выборки, которое
- //является первым сообщением новой темы
- //==========================================
- $first_post=$this->ipsclass->DB->fetch_row($q);
- //==========================================
- //Пересчитываем стоимость этого сообщения и
- //обновляем оплату и рефские если стоимость отличается
- //==========================================
- $new_pay=$this->GetPayForPost($forum_id,1,$first_post['post'],1,$first_post['author_id']);
- if (round($new_pay,10)!=round($first_post['pay'],10))
- {
- //==========================================
- //Заносим информацию в историю
- //==========================================
- $line=array(
- "date" => mktime(),
- "user" => $this->ipsclass->member['id'],
- "to_user" => $first_post['author_id'],
- "type" => "split_topic",
- "data" => serialize(array("value"=>$first_post['pay'],"value2"=>$new_pay,"parent_topic" => $from_topic_id)),
- "post" => $first_post['pid'],
- );
- $this->AddLogLine($line);
- $this->ipsclass->DB->do_update("posts",array("pay"=>$new_pay),"pid=".$first_post['pid']);
- $this->RefCharges($new_pay-$first_post['pay'],$first_post['author_id'],$first_post['post_date'],1);
- }
- //==========================================
- //Уходим в перебор остальных сообщений
- //новой темы
- //==========================================
- while ($posts=$this->ipsclass->DB->fetch_row($q))
- {
- //==========================================
- //Пересчитываем стоимость сообщения и
- //обновляем оплату и рефские если стоимость отличается
- //==========================================
- $new_pay=$this->GetPayForPost($forum_id,0,$posts['post'],1,$posts['author_id']);
- if (round($new_pay,10)!=round($posts['pay'],10))
- {
- //==========================================
- //Заносим информацию в историю
- //==========================================
- $line=array(
- "date" => mktime(),
- "user" => $this->ipsclass->member['id'],
- "to_user" => $posts['author_id'],
- "type" => "split_topic",
- "data" => serialize(array("value"=>$posts['pay'],"value2"=>$new_pay,"parent_topic" => $from_topic_id)),
- "post" => $posts['pid'],
- );
- $this->AddLogLine($line);
- $this->ipsclass->DB->do_update("posts",array("pay"=>$new_pay),"pid=".$posts['pid']);
- $this->RefCharges($new_pay-$posts['pay'],$posts['author_id'],$posts['post_date']);
- }
- }
- //==========================================
- //Получаем первое сообщение в теме откуда
- //перемещались посты и если надо пересчитываем
- //стоимость данного сообщения
- //==========================================
- $this->ipsclass->DB->query("SELECT pid,post,author_id,post_date,pay FROM ".SQL_PREFIX."posts WHERE topic_id=".$from_topic_id." AND DATEDIFF(NOW(), DATE_ADD('1970-01-01', INTERVAL post_date SECOND)) <= ".$this->Settings['FreezeAfterDays']." ORDER BY pid");
- $first_post_in_old_topic=$this->ipsclass->DB->fetch_row();
- $new_pay=$this->GetPayForPost($this->GetForumIdByPostId($first_post_in_old_topic['pid']),1,$first_post_in_old_topic['post'],1,$first_post_in_old_topic['author_id']);
- if (round($new_pay,10)!=round($first_post_in_old_topic['pay'],10))
- {
- $this->ipsclass->DB->do_update("posts",array("pay"=>$new_pay),"pid=".$first_post_in_old_topic['pid']);
- $this->RefCharges($new_pay-$first_post_in_old_topic['pay'],$first_post_in_old_topic['author_id'],$first_post_in_old_topic['post_date']);
- }
- }
- //==========================================
- //Функция пересчитывает стоимость сообщения и рефские
- //==========================================
- function OnUnionPosts($main_post)
- {
- if (!$this->ModIsEnable()) return;
- $this->ipsclass->DB->query("SELECT * FROM ".SQL_PREFIX."posts WHERE pid=".$main_post['pid']." AND DATEDIFF(NOW(), DATE_ADD('1970-01-01', INTERVAL post_date SECOND)) <= ".$this->Settings['FreezeAfterDays']);
- $old_post=$this->ipsclass->DB->fetch_row();
- //==========================================
- //Получить новую оплату и обновить поле
- //==========================================
- $new_pay=$this->GetPayForPost($this->GetForumIdByPostId($main_post['pid']),$old_post['new_topic'],$main_post['post'],1,$old_post['author_id']);
- //==========================================
- //Заносим информацию в историю
- //==========================================
- $line=array(
- "date" => mktime(),
- "user" => $this->ipsclass->member['id'],
- "to_user" => $old_post['author_id'],
- "type" => "union_post",
- "data" => serialize(array("value"=>$old_post['pay'],"value2"=>$new_pay)),
- "post" => $main_post['pid'],
- );
- $this->AddLogLine($line);
- $this->ipsclass->DB->do_update("posts",array("pay"=>$new_pay),"pid=".$main_post['pid']);
- //==========================================
- //Пересчитать реферальские
- //==========================================
- $this->RefCharges(($new_pay-$old_post['pay']),$old_post['author_id'],$old_post['post_date'],1);
- }
- //==========================================
- //Функция пересчитывает стоимость сообщений
- //и рефские. Написана с учетом того, что
- //объединяемые темы находятся в одном разделе(форуме)
- //==========================================
- function OnUnionTopics($mids,$main_topic_id)
- {
- if (!$this->ModIsEnable()) return;
- $mids=implode(",",$mids);
- $q=$this->ipsclass->DB->query("SELECT pid,pay,topic_id,post,author_id,post_date FROM ".SQL_PREFIX."posts WHERE topic_id IN ($mids) AND new_topic=1 AND DATEDIFF(NOW(), DATE_ADD('1970-01-01', INTERVAL post_date SECOND)) <= ".$this->Settings['FreezeAfterDays']);
- while ($post=$this->ipsclass->DB->fetch_row($q))
- {
- //==========================================
- //Заносим информацию в историю
- //==========================================
- $line=array(
- "date" => mktime(),
- "user" => $this->ipsclass->member['id'],
- "to_user" => $post['author_id'],
- "type" => "union_topic",
- "data" => serialize(array("value"=>$post['pay'],"value2"=>$new_pay)),
- "post" => $post['pid'],
- );
- $this->AddLogLine($line);
- $new_pay=$this->GetPayForPost($this->GetForumIdByPostId($post['pid']),0,$post['post'],1,$post['author_id']);
- $this->ipsclass->DB->do_update("posts",array("pay"=>$new_pay),"pid=".$post['pid']);
- $this->RefCharges(($new_pay-$post['pay']),$post['author_id'],$post['post_date']);
- }
- }
- function OnDeletePost($ids)
- {
- if (!$this->ModIsEnable()) return;
- //==========================================
- //Нужно для нормальной алгебры
- //==========================================
- if (!setlocale(LC_ALL, "en_US")) setlocale(LC_ALL, "US");
- foreach ($ids as $id)
- {
- //==========================================
- //получаем данные о постах:
- //автор поста и кол-во начисленных денег
- //==========================================
- $SQL = "SELECT author_id,pay,post_date,topic_id FROM ".SQL_PREFIX."posts WHERE pid=".$id." AND DATEDIFF(NOW(), DATE_ADD('1970-01-01', INTERVAL post_date SECOND)) <= ".$this->Settings['FreezeAfterDays'];
- $db_id=$this->ipsclass->DB->query($SQL);
- //==========================================
- //перебор постов
- //==========================================
- while ($del_post=$this->ipsclass->DB->fetch_row($db_id))
- {
- //==========================================
- //Если сообзение было оплачено, то
- //==========================================
- if ($del_post['pay'])
- {
- //==========================================
- //Заносим информацию в историю
- //==========================================
- $line=array(
- "date" => mktime(),
- "user" => $this->ipsclass->member['id'],
- "to_user" => $del_post['author_id'],
- "type" => "del_post",
- "data" => serialize(array("value"=>$del_post['pay'],"topic_id"=>$del_post['topic_id'])),
- "post" => 0,
- );
- $this->AddLogLine($line);
- //==========================================
- //пересчитываем рефпроцент
- //==========================================
- $this->RefCharges(-1*$del_post['pay'],$del_post['author_id'],$del_post['post_date'],1);
- }
- }
- }
- }
- function OnEditPost($new_post,$orig_post)
- {
- if (!$this->ModIsEnable()) return;
- //==========================================
- //Если пост редактирует не автор, то не производим перерасчет
- //==========================================
- if ($new_post['author_id']!=$this->ipsclass->member['id'])
- {
- return $new_post;
- }
- $SQL = "SELECT COUNT(*) cnt FROM ".SQL_PREFIX."posts WHERE pid=".$orig_post['pid']." AND DATEDIFF(NOW(), DATE_ADD('1970-01-01', INTERVAL post_date SECOND)) <= ".$this->Settings['FreezeAfterDays'];
- $db_id=$this->ipsclass->DB->query($SQL);
- $ed_post=$this->ipsclass->DB->fetch_row($db_id);
- if ($ed_post['cnt'] == 0)
- {
- return $new_post;
- }
- //==========================================
- //Нужно для нормальной алгебры
- //==========================================
- if (!setlocale(LC_ALL, "en_US")) setlocale(LC_ALL, "US");
- //==========================================
- //Расчитываем новую стоимость сообщения
- //при этом не зачисляем рефские
- //==========================================
- $new_post['pay']=$this->GetPayForPost($this->GetForumIdByPostId($orig_post['pid']),$orig_post['new_topic'],$new_post['post'],1);
- if ($new_post['pay']!=$orig_post['pay'])
- {
- //==========================================
- //Заносим информацию в историю
- //==========================================
- $line=array(
- "date" => mktime(),
- "user" => 0,
- "to_user" => $this->ipsclass->member['id'],
- "type" => "edit_post",
- "data" => serialize(array("value"=>$orig_post['pay'],"value2"=>$new_post['pay'])),
- "post" => $orig_post['pid'],
- );
- $this->AddLogLine($line);
- //==========================================
- //Расчитываем рефские от разницы стоимости сообщения
- //и пересчитываем рефские.
- //==========================================
- $this->RefCharges($new_post['pay']-$orig_post['pay'],$orig_post['author_id'],$orig_post['post_date']);
- }
- return $new_post;
- }
- function OnMovePost($pid_string, $move_to_topic=array(),$from_topic=array())
- {
- if (!$this->ModIsEnable()) return;
- //==========================================
- //Если перемещаем внутри форума то выходим
- //из функции
- //==========================================
- if ($from_topic['forum_id']==$move_to_topic['forum_id']) return 0;
- //==========================================
- //Нужно для нормальной алгебры
- //==========================================
- if (!setlocale(LC_ALL, "en_US")) setlocale(LC_ALL, "US");
- //==========================================
- //Получаем переменные постов для дальнейшего
- //расчета
- //==========================================
- $move_posts_db_id=$this->ipsclass->DB->query("SELECT pid,author_id,pay,post,post_date FROM ".SQL_PREFIX."posts WHERE pid IN($pid_string) AND DATEDIFF(NOW(), DATE_ADD('1970-01-01', INTERVAL post_date SECOND)) <= ".$this->Settings['FreezeAfterDays']);
- //==========================================
- //перебераем посты
- //==========================================
- while ($move_post=$this->ipsclass->DB->fetch_row($move_posts_db_id))
- {
- //==========================================
- //расчитываем новую стоимость
- //==========================================
- $newpay=$this->GetPayForPost($move_to_topic['forum_id'],0,$move_post['post'],1,$move_post['author_id']);
- //==========================================
- //Если стоимоть остается прежней то не производим
- //изменений в счетах пользователя и не делаем
- //пересчет реф начислений.
- //==========================================
- if ($newpay!=$move_post['pay'])
- {
- //==========================================
- //Заносим информацию в историю
- //==========================================
- $line=array(
- "date" => mktime(),
- "user" => $this->ipsclass->member['id'],
- "to_user" => $move_post['author_id'],
- "type" => "move_post",
- "data" => serialize(array("value"=>$move_post['pay'],"value2"=>$newpay)),
- "post" => $move_post['pid'],
- );
- $this->AddLogLine($line);
- //==========================================
- //пересчитать рефначисления
- //==========================================
- $this->RefCharges($newpay-$move_post['pay'],$move_post['author_id'],$move_post['post_date'],1);
- //==========================================
- //Записать данные:
- //обновить запись поста
- //==========================================
- $this->ipsclass->DB->query("UPDATE ".SQL_PREFIX."posts SET pay='$newpay' WHERE pid='{$move_post['pid']}';");
- }
- }
- }
- //----------------------------------------------------------------------------------------------------------------------------//
- //---------------------------------------#Функции - реакции на изменения сообщений--------------------------------------------//
- //----------------------------------------------------------------------------------------------------------------------------//
- //==========================================
- //v.2
- //==========================================
- //Возращает значение, которое записывается в БД
- //в таблицу с постами. Начисляет реферальные и
- //изменяет счет пользователя при условии
- //передачи переменной $ref_no_charge=1, в противном
- //случае возращает только цену за пост
- //==========================================
- //Учесть флаг $ref_no_charge, чтоб не распределялись рефские
- //==========================================
- function GetPayForPost($forum_id,$newtopic=0,$post="",$ref_no_charge=0,$uid=0)
- {
- if (!$this->ModIsEnable()) return;
- //==========================================
- //Нужно для нормальной алгебры
- //==========================================
- if (!setlocale(LC_ALL, "en_US")) setlocale(LC_ALL, "US");
- //==========================================
- //Проверяем, включена ли система правил начисления,
- //и если да, то получаем данные из парсера,
- //а именно платить/неплатить или стоимость
- //==========================================
- if ($this->Settings['RulesEnable'])
- {
- $pay=$this->PayRulesParser($forum_id,$uid,$newtopic);
- if (floatval($pay)==-2) return 0; //-2 означает не платить
- elseif (floatval($pay)==-1) //-1 платить по основной стоимости
- {
- $pay=$this->GetForumPay($forum_id,$newtopic);
- }
- //==========================================
- //В остальных случаях возращается либо стоимость оплаты, либо нуль
- //==========================================
- }
- else $pay=$this->GetForumPay($forum_id,$newtopic);
- //==========================================
- //Если включена опция расчета оплаты по длинне сообщения
- //==========================================
- if ($this->Settings['PostLenghtEnable'])
- {
- //==========================================
- //Вырезаем цитаты
- //==========================================
- $post = preg_replace("#<!--quoteo(.+?)>(.+?)QuoteEEnd-->#is", "", $post);
- //==========================================
- //Обрезаем html теги (из-за формата ipb)
- //==========================================
- $post=strip_tags($post);
- //==========================================
- //Обрезаем символы пробела
- //==========================================
- $post = str_replace(chr(0x20), "", $post);
- //print "<textarea cols=40 rows=20>$post</textarea>";
- //exit();
- //==========================================
- //Вычисляем длинну сообщения и расчитываем окончательнный ценник
- //==========================================
- $strlen=$this->GetForumStrlen($forum_id);
- //==========================================
- //если сообщение меньше нормы делаем расчет
- //==========================================
- if (strlen($post)>=0)
- {
- if ($strlen && (strlen($post)<$strlen))
- {
- //==========================================
- //Расчет и округление до установленного разряда
- //==========================================
- $pay=round(($pay*strlen($post)/$strlen),7);
- }
- }
- }
- //==========================================
- //Производим зачисление рефпроцентов если рефсистема включена
- //и передан флаг начисления, т.е. $ref_no_charge=0
- //==========================================
- if ($this->Settings['RefEnable'] && $ref_no_charge==0)
- {
- $this->RefCharges($pay,$uid);
- }
- //==========================================
- //возращаем полную стоимость
- //==========================================
- return "$pay";
- }
- //==========================================
- //Возращает установленную для форума длинну сообщения.
- //==========================================
- function GetForumStrlen($forum_id)
- {
- if (!$this->ModIsEnable()) return;
- //==========================================
- //Получаем необходимую длинну сообщений рекурсивным методом:
- //если длина установлена в 0 смотрим длинну форума-родителя.
- //Для отключения функции в настройках требуется указать значение -1
- //==========================================
- while (true)
- {
- $this->ipsclass->DB->query("SELECT pay_mess_lenght,parent_id FROM ".SQL_PREFIX."forums WHERE id='$forum_id'");
- $row=$this->ipsclass->DB->fetch_row();
- switch ($row["pay_mess_lenght"])
- {
- case "-1":
- return "0";
- break;
- case "0":
- //==========================================
- //Повтор цикла с родительским идом
- //==========================================
- if ($row["parent_id"]=="-1") return "0";
- $forum_id=$row["parent_id"];
- break;
- }
- //==========================================
- //Если необходимая длинна сообщения определена, то возращаем значение
- //==========================================
- if ($row["pay_mess_lenght"]) return "{$row["pay_mess_lenght"]}";
- }
- }
- function GetReferer($id=0)
- {
- if (!$this->ModIsEnable()) return;
- $this->ipsclass->DB->query("SELECT pay_referer FROM ".SQL_PREFIX."members WHERE id='$id'");
- $row=$this->ipsclass->DB->fetch_row();
- return $row['pay_referer'];
- }
- //==========================================
- //Производит начисление реф. процента
- //по всем уровням рефералов
- //==========================================
- //==========================================
- //Переписать распределение рефских
- //в случае переброски постов - закоментировано
- //==========================================
- function RefCharges($pay=0,$uid=0,$date=0,$change=0)
- {
- if (!$this->ModIsEnable()) return;
- if (!$uid) $uid=$this->ipsclass->member['id'];
- if ($pay==0) return;
- //=======================================================
- //Проверяем валидна ли процентная ставка, т.е. по ней начислялся рефпроцент или нет,
- //в противном случае грузим из базы требуемые ставки
- //=======================================================
- if ($date && ($this->RefSys->WriteDate>$date))
- {
- $this->ipsclass->DB->query("SELECT data FROM ".SQL_PREFIX."paysys WHERE name='refsys' ORDER BY id DESC");
- //=======================================================
- //Перебираем изменение процентных ставок по рефсистеме
- //=======================================================
- while ($row=$this->ipsclass->DB->fetch_row())
- {
- $refsys_parse =unserialize($row['data']);
- if ($refsys_parse['record_time']<=$date)
- {
- $reflevels_str=$refsys_parse['reflevels'];
- break;
- }
- }
- }
- else $reflevels_str=$this->RefSys->RefLevels;
- //=======================================================
- //Создаем массив состоящий из значений процентных ставок.
- //=======================================================
- $reflevels=split(",", $reflevels_str);
- //=======================================================
- //Определяем есть ли у мембера реферер, и если есть
- //уходим в перебор ставок
- //=======================================================
- $pay_referer=intval($this->GetReferer($uid));
- if ($pay_referer)
- {
- foreach($reflevels as $reflevel)
- {
- //=======================================================
- //Начисляем деньги за реферала соотвествующего уровня
- //=======================================================
- $this->ipsclass->DB->query("SELECT pay_cash as paid FROM ".SQL_PREFIX."members WHERE id='$pay_referer';");
- $mem=$this->ipsclass->DB->fetch_row();
- $total=round($mem['paid']+$pay*($reflevel/100),7);
- $this->ipsclass->DB->query("UPDATE ".SQL_PREFIX."members SET pay_cash='$total' WHERE id='$pay_referer';");
- //==========================================
- //Заносим информацию в историю
- //==========================================
- $line=array(
- "date" => mktime(),
- "user" => $uid,
- "to_user" => $pay_referer,
- "type" => $change ? "change_ref_comp" : "ref_comp",
- "data" => serialize(array("value"=>round($pay*($reflevel/100),7))),
- "post" => 0,
- );
- $this->AddLogLine($line);
- //=======================================================
- //Определяем реферера стоящего на уровне выше и повторяем
- //процедуру,а если его нет выходим из цикла.
- //=======================================================
- $pay_referer=intval($this->GetReferer($pay_referer));
- if (!$pay_referer) break;
- }
- }
- }
- //==========================================
- //Возращает стоимость/платить или нет.
- //Запрограммирована для текущего пользователя.
- //==========================================
- function PayRulesParser($forum_id=0,$uid=0,$new_topic=0)
- {
- if (!$this->ModIsEnable()) return;
- if (!$forum_id) return 0;
- $ret=-1;
- if (!$uid) $uid=$this->ipsclass->member['id'];
- $gid=$this->GetGroupIdByMemberId($uid);
- $q=$this->ipsclass->DB->query("SELECT * FROM ".SQL_PREFIX."pay_rules WHERE (acts='*' OR acts='m".$uid."' OR acts='g".$gid."') AND (area='global' OR area='$forum_id') ORDER BY id");
- while ($row=$this->ipsclass->DB->fetch_row($q))
- {
- switch ($row['type'])
- {
- case 'PayEnable':
- if ($row['value']==1) $ret=-1;
- if ($row['value']==0) $ret=-2;
- break;
- case 'Pay':
- if ($new_topic)
- {
- $ret=$row['value'];
- }
- else
- {
- $ret=$row['value2'];
- }
- break;
- }
- }
- return $ret;
- }
- //==========================================
- //Менюшка в топиках.
- //!!!внешняя функция!!!
- //==========================================
- function RenderTopic($row=array())
- {
- if (!$this->ModIsEnable()) return;
- if ($row['author_id']>0) { //-- не показывать PaySys для гостей
- //==========================================
- //Нужно для нормальной алгебры
- //==========================================
- if (!setlocale(LC_ALL, "en_US")) setlocale(LC_ALL, "US");
- if ($this->ipsclass->member['is_mod'])
- {
- $this->smarty->assign('user', $row['author_id']);
- $this->smarty->assign('postid', $row['pid']);
- $this->smarty->assign('___baseurl', $this->ipsclass->base_url);
- $this->ipsclass->DB->query("SELECT pay FROM ".SQL_PREFIX."posts WHERE pid='{$row['pid']}'");
- $pay=$this->ipsclass->DB->fetch_row();
- if (floatval($pay['pay'])) $this->smarty->assign('pay',1);
- else $this->smarty->assign('pay',0);
- $row['ps_t_menu']=$this->smarty->fetch('topicmenu.tpl');
- }
- $this->smarty->assign('membercash',$this->GetMemberCash($row['author_id']));
- $row['ps_info']=$this->smarty->fetch('topicinfo.tpl');
- $pq=$this->ipsclass->DB->query("SELECT * FROM ".SQL_PREFIX."pay_history WHERE post='{$row['pid']}' AND to_user='{$row['id']}' AND type='penalty'");
- while ($pen=$this->ipsclass->DB->fetch_row($pq))
- {
- $this->smarty->assign('moder', $this->GetMemberNameById($pen['user']));
- $this->smarty->assign('date', date("j.n.Y, G:i",$pen['date']));
- $pen['data']=unserialize($pen['data']);
- $pen['data']['comment']=base64_decode($pen['data']['comment']);
- $pen['data']['id']=$pen['id'];
- if (
- (!$this->Settings['UsersMaySeeValueOtherPenalty'] && $this->ipsclass->member['mgroup']!=$this->ipsclass->vars['admin_group']) &&
- !($this->ipsclass->member['is_mod'] && $pen['user']==$this->ipsclass->member['id'])
- )
- {
- unset($pen['data']['value']);
- }
- if ( ($this->IsModInForum($this->GetForumIdByPostId($pen['post'])) && $pen['user']==$this->ipsclass->member['id']) || //если просматривает модератор выставивший штраф
- ($this->ipsclass->member['is_mod'] && $this->Settings['ModCancelOtherPenalty']) || //или другой модератор, но модерам разрешено отменять другие штрафы
- $this->ipsclass->member['mgroup']==$this->ipsclass->vars['admin_group'] //или это главный админ
- )
- {
- $pen['data']['Cancel']=1; //разрешено отменить штраф
- }
- if ( ($this->IsModInForum($this->GetForumIdByPostId($pen['post'])) && $pen['user']==$this->ipsclass->member['id']) || //если просматривает модератор выставивший штраф
- ($this->ipsclass->member['is_mod'] && $this->Settings['ModEditOtherPenalty']) || //или другой модератор, но модерам разрешено редактировать другие штрафы
- $this->ipsclass->member['mgroup']==$this->ipsclass->vars['admin_group'] //или это главный админ
- )
- {
- $pen['data']['Edit']=1; //разрешено редактировать штраф
- }
- $this->smarty->assign('data', $pen['data']);
- if ( ($this->ipsclass->member['is_mod'] && $pen['user']==$this->ipsclass->member['id']) || //если просматривает модератор выставивший штраф
- ($this->ipsclass->member['is_mod'] && $this->Settings['ModSeeOtherPenalty']) || //или другой модератор, но модерам разрешено просматривать другие штрафы
- $this->Settings['UsersMaySeeOtherPenalty'] || //или пользователям разршено просматривать чужие штрафы
- $this->ipsclass->member['mgroup']==$this->ipsclass->vars['admin_group'] //или это админ
- )
- {
- $row['post'].=$this->smarty->fetch('penalty.tpl');
- }
- }
- } return $row;
- }
- //==========================================
- //Возращает текс спонсора раздела.
- //==========================================
- function GetSponsor($forum_id=0)
- {
- if (!$this->ModIsEnable()) return;
- if (intval($forum_id) && $this->Settings['Sponsors'])
- {
- $this->ipsclass->DB->query("SELECT pay_sponsor FROM ".SQL_PREFIX."forums WHERE id='$forum_id'");
- $row=$this->ipsclass->DB->fetch_row();
- return $this->StripSlashesDeep($row['pay_sponsor']);
- }
- }
- //==========================================
- //Возращает ценник для форума.
- //!!!внешняя функция!!!
- //==========================================
- function RenderForumPay($forum_id=0)
- {
- if (!$this->ModIsEnable()) return;
- //==========================================
- //Нужно для нормальной алгебры
- //==========================================
- if (!setlocale(LC_ALL, "en_US")) setlocale(LC_ALL, "US");
- if ($forum_id && $this->Settings['ShowForumPay'])
- {
- $pay_new_post=$this->GetForumPay($forum_id,0);
- $pay_new_topic=$this->GetForumPay($forum_id,1);
- if ( (!$pay_new_post && !$pay_new_topic) && !$this->ipsclass->ps->Settings['ShowNullForumPay'])
- {
- return;
- }
- $this->smarty->assign('new', $pay_new_topic);
- $this->smarty->assign('reply', $pay_new_post);
- return $this->smarty->fetch("forumpay.tpl"); ;
- }
- }
- //==========================================
- //Возращает стоимость поста в форуме.
- //==========================================
- function GetForumPay($forum_id,$newtopic=0)
- {
- if (!$this->ModIsEnable()) return;
- //==========================================
- //Получаем размер оплаты за пост рекурсивным методом: если оплата установлена в 0 смотрим ценник форума-родителя.
- //Для отключения оплаты сообщений в настройках требуется указать цену -1
- //==========================================
- while (true)
- {
- //==========================================
- //Определяем часть запроса к БД для выяснения новый топик или просто пост
- //==========================================
- $pay="pay_new_post";
- if ($newtopic) $pay="pay_new_topic";
- $q_id=$this->ipsclass->DB->query("SELECT $pay,parent_id FROM ".SQL_PREFIX."forums WHERE id='$forum_id'");
- $row=$this->ipsclass->DB->fetch_row($q_id);
- switch ($row["$pay"])
- {
- case "-1":
- return "0";
- break;
- case "0":
- //==========================================
- //Повтор цикла с родительским идом
- //==========================================
- if ($row["parent_id"]=="-1") return "0";
- $forum_id=$row["parent_id"];
- break;
- }
- //==========================================
- //Если ценник определен, то возращаем значение
- //==========================================
- if ($row["$pay"]) return "{$row["$pay"]}";
- }
- }
- }
- ?>
Add Comment
Please, Sign In to add comment