Webboard

Pełna wersja: xem Fast Reputation - błąd/luka
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
wersja skryptu MyBB:1.8.5
adres forum:https://odjechani.com.pl
na czym polega problem (screen, opis, komunikaty, nazwa i wersja wtyczki): Problem polega na tym, co opisze poniżej:

Napisałem już do autora, ale liczę od Was na szybsze rozwiązanie problemu, bo nie wiem kiedy On mi odpisze i czy naprawi plugin. Wspomniany plugin posiada pewną lukę, a mianowicie:

Tak wygląda fragment kodu przycisku dodawania reputacji:

Kod:
<span onclick="vote('11142', '144471', '1')" class="reps plus" id="rep_plus_144471" original-title="Lubię to!">+</span>

Nic specjalnego, ale jak zmienię jedną z tych trzech wartości w "vote" w samym kodzie strony, to robi się chaos. Jak zmienię tę jedynkę, na 1000, to dodam 1000 reputacji, mogę odjąć 20000, pełna swoboda, zmiana pozostałych oczywiście przydziela reputację niewłaściwemu użytkownikowi lub do niewłaściwego postu. Tak czy siak ominięcie limitu reputacji na dzień jest krytyczne. 

Dodam tu kod pluginu i jego JS, może ktoś wie jak go wyedytować, żeby wartość nie mogła być większa od 1, ewentualnie, wie co zrobić, żeby te wartości nie kuły tak w oczy w kodzie strony i nie dało się ich modyfikować bezpośrednio w przeglądarce, a najlepiej i jedno i drugie. 

Kod pluginu:

Kod PHP:
<?php
/**
 * Author: Szczepan 'Xemix' Machaj
 * WWW: xemix.eu / xemix.pl
 * Copyright (c) 2015
 * License: Creative Commons BY-NC-SA 4.0
 * License URL: http://creativecommons.org/licenses/by-nc-sa/4.0/
 */

if(!defined("IN_MYBB")) exit();

global 
$mybb;

if(
$mybb->settings['enablereputation'])
{
 
   $plugins -> add_hook('postbit', ['xem_fast_rep''in_post']);
 
   $plugins -> add_hook('xmlhttp'   ['xem_fast_rep''xmlhttp']);
}

function 
xem_fast_rep_info()
{
 
   global $lang;
 
   $lang->load('xem_fast_rep');

 
   return [
 
       'name'          => 'xem Fast Reputation',
 
       'description'   =>  $lang->xem_fast_rep_description,
 
       'website'       => 'http://xemix.eu',
 
       'author'        => 'Xemix',
 
       'authorsite'    => 'http://xemix.eu',
 
       'version'       => '1.4',
 
       'codename'      => 'xem_fast_rep',
 
       'compatibility' => '18*'
 
   ];
}

function 
xem_fast_rep_install()
{
 
   global $db$mybb$lang;

 
   $lang->load('xem_fast_rep');

 
   $setting_group_id $db->insert_query('settinggroups', [
 
       'name'        => 'xem_fast_rep_settings',
 
       'title'       => $db->escape_string($lang->xem_fast_rep_settings_title),
 
       'description' => $db->escape_string($lang->xem_fast_rep_settings_title),
 
   ]);
 
   
    $settings 
= [
 
         
            
'name'        => 'xem_fast_rep_active',
 
           'title'       =>  $lang->xem_fast_rep_plugin_active,
 
           'optionscode' => 'yesno',
 
           'value'       => '1'
 
       ],
 
         
            
'name'        => 'xem_fast_rep_show_liked_this',
 
           'title'       =>  $lang->xem_fast_rep_show_liked_this,
 
           'optionscode' => 'yesno',
 
           'value'       => '1'
 
       ],
 
   ];

 
   $i 1;

 
   foreach($settings as &$row) {
 
       $row['gid'        $setting_group_id;
 
       $row['title'      $db->escape_string($row['title']);
 
       $row['description'] = $db->escape_string($row['description']);
 
       $row['disporder'  $i++;
 
   }

 
   $db->insert_query_multiple('settings'$settings);

 
   rebuild_settings();
 
   
}

function 
xem_fast_rep_uninstall()
{
 
   global $db;

 
   $setting_group_id $db->fetch_field(
 
       $db->simple_select('settinggroups''gid'"name='xem_fast_rep_settings'"),
 
       'gid'
 
   );

 
   $db->delete_query('settinggroups'"name='xem_fast_rep_settings'");
 
   $db->delete_query('settings''gid='.$setting_group_id);

 
   include_once MYBB_ROOT."inc/adminfunctions_templates.php";

 
   find_replace_templatesets(
 
       'postbit',
 
       '#' preg_quote('{$post[\'xem_fast_rep\']}
    {$post[\'attachments\']}'
) . '#i',
 
       '{$post[\'attachments\']}'
 
   );

 
   find_replace_templatesets(
 
       'postbit_classic',
 
       '#' preg_quote('{$post[\'xem_fast_rep\']}
    {$post[\'attachments\']}'
) . '#i',
 
       '{$post[\'attachments\']}'
 
   );

 
   find_replace_templatesets(
 
       'headerinclude',
 
       '#' preg_quote('<script type="text/javascript" src="{$mybb->asset_url}/jscripts/xem_fast_rep.js"></script>
{$stylesheets}'
) . '#i',
 
       '{$stylesheets}'
 
   );

 
   rebuild_settings();
}

function 
xem_fast_rep_is_installed()
{
 
   global $db;

 
   $query $db->simple_select('settinggroups''gid'"name='xem_fast_rep_settings'");
 
   return (bool)$db->num_rows($query);
}

function 
xem_fast_rep_activate()
{
 
   include_once MYBB_ROOT.'inc/adminfunctions_templates.php';

 
   find_replace_templatesets(
 
       'postbit',
 
       '#' preg_quote('{$post[\'attachments\']}') . '#i',
 
       '{$post[\'xem_fast_rep\']}
    {$post[\'attachments\']}'
 
   );

 
   find_replace_templatesets(
 
       'postbit_classic',
 
       '#' preg_quote('{$post[\'attachments\']}') . '#i',
 
       '{$post[\'xem_fast_rep\']}
    {$post[\'attachments\']}'
 
   );

 
   find_replace_templatesets(
 
       'headerinclude',
 
       '#' preg_quote('{$stylesheets}') . '#i',
 
       '<script type="text/javascript" src="{$mybb->asset_url}/jscripts/xem_fast_rep.js"></script>
{$stylesheets}'
 
   );
}

function 
xem_fast_rep_deactivate()
{
 
   include_once MYBB_ROOT."inc/adminfunctions_templates.php";

 
   find_replace_templatesets(
 
       'postbit',
 
       '#' preg_quote('{$post[\'xem_fast_rep\']}
    {$post[\'attachments\']}'
) . '#i',
 
       '{$post[\'attachments\']}'
 
   );

 
   find_replace_templatesets(
 
       'postbit_classic',
 
       '#' preg_quote('{$post[\'xem_fast_rep\']}
    {$post[\'attachments\']}'
) . '#i',
 
       '{$post[\'attachments\']}'
 
   );

 
   find_replace_templatesets(
 
       'headerinclude',
 
       '#' preg_quote('<script type="text/javascript" src="{$mybb->asset_url}/jscripts/xem_fast_rep.js"></script>
{$stylesheets}'
) . '#i',
 
       '{$stylesheets}'
 
   );
}

class 
xem_fast_rep
{

 
   public static $reputations;
 
   public static $rid 0;
 
   public static $first_check false;

 
   public function in_post(&$post)
 
   {
 
       global $db$mybb$pids;

 
       if(!self::$first_check
 
       {
 
           if(!isset($pids) || $pids == '')
 
           {
 
               $pids "pid IN (".(int)$mybb->input['pid'].")";
 
           }

 
           self::get_reps($pids);
 
           self::$first_check true;
 
       }

 
       $r 0;
 
       
        if
(isset(self::$reputations$post['pid'] ]))
 
       {
 
           foreach(self::$reputations$post['pid'] ] as $reputation)
 
           {
 
               $r += $reputation['reputation'];

 
               $liked_this$post['pid'] ][] = [
 
                   'username'   => $reputation['username'],
 
                   'uid'        => $reputation['uid'],
 
                   'reputation' => $reputation['reputation'],
 
                   'adduid'     => $reputation['adduid'],
 
               ];

 
               if($mybb->user['uid'] == $reputation['adduid'])
 
               {
 
                   $adduid $reputation['adduid'];
 
                   $rep_value $reputation['reputation'];
 
               }

 
           
 
       }

 
       $add_reps null;
 
       $delete_reps null;
 
       if($mybb->user['uid'] != $post['uid'] && $mybb->user['uid'])
 
       {
 
           if(isset($adduid) && $adduid != $mybb->user['uid'] || $rep_value != 1)
 
           {
 
               $to_plus_rep 1;
 
               if(isset($rep_value) && $rep_value == -1$to_plus_rep 0;
 
               $add_reps self::add_button($post['uid'], $post['pid'], $to_plus_rep'1');
 
           }

 
           if(isset($adduid) && $adduid != $mybb->user['uid'] || $rep_value != -1)
 
           {
 
               $to_minus_rep = -1;
 
               if(isset($rep_value) && $rep_value == 1$to_minus_rep 0;
 
               $delete_reps self::add_button($post['uid'], $post['pid'], $to_minus_rep'-1');
 
           }
 
       }

 
       $liked self::liked_this($liked_this$post['pid'] ]);

 
       $post_reps '<span id=\"xem_fast_rep\" class=\"reps_'.$post['pid'].'\" style=\"float:right;\">'.$liked.$add_reps.$delete_reps.self::count_reps($post['pid'], $r).'</span>';

 
       if(self::adduser_permissions() && self::getuser_permissions($post))
 
       {
 
           eval("\$post['xem_fast_rep'] = \"".$post_reps."\";");
 
           return $post;
 
       }
 
   }

 
   public function xmlhttp()
 
   {
 
       global $mybb$db;

 
       if($mybb->input['action'] == 'xem_fast_rep' && (
 
           !$mybb->input['uid'] || 
 
           !$mybb->input['pid'] ||
 
           !$mybb->user['uid'] ||
 
           (int)$mybb->input['reputation'] != '1' &&
 
           (int)$mybb->input['reputation'] != '0' &&
 
           (int)$mybb->input['reputation'] != '-1'
 
       ) && !self::getuser_permissions($mybb->input['pid']) &&
 
           !self::adduser_permissions()
 
       ) exit;

 
       $reputation = (int)$mybb->input['reputation'];
 
       $uid = (int)$mybb->input['uid'];
 
       $pid = (int)$mybb->input['pid'];

 
       switch($mybb->input['action'])
 
       {

 
           case 'xem_fast_rep':

 
               $existing_reputation self::existing_reputation($pid$uid);

 
               self::$rid $existing_reputation['rid'];

 
               if(!self::$rid && $reputation != 0)
 
               {
 
                   self::add([
 
                       'uid'        => $uid,
 
                       'adduid'     => (int)$mybb->user['uid'],
 
                       'pid'        => $pid,
 
                       'reputation' => $reputation,
 
                       'comments'   => '',
 
                   ]);

 
                   if($reputation == 1)
 
                   {
 
                       die(
 
                           stripslashes(self::liked_this($pid)) .
 
                           stripslashes(self::add_button($uid$pid'0''-1')) .
 
                           stripslashes(self::count_reps($pidself::get_count_reps($pid)))
 
                       );
 
                   }
 
                   else
                    
{
 
                       die(
 
                           stripslashes(self::liked_this($pid)) .
 
                           stripslashes(self::add_button($uid$pid'0''1')) .
 
                           stripslashes(self::count_reps($pidself::get_count_reps($pid)))
 
                       );
 
                   }
 
               }
 
               elseif($reputation == && self::$rid)
 
               {
 
                   self::delete(self::$rid$uid);
 
                   die(
 
                       stripslashes(self::liked_this($pid)) .
 
                       stripslashes(self::add_button($uid$pid'1''1')) .
 
                       stripslashes(self::add_button($uid$pid'-1''-1')) .
 
                       stripslashes(self::count_reps($pidself::get_count_reps($pid)))
 
                   );
 
               }
 
               elseif($existing_reputation['reputation'] != $reputation)
 
               {
 
                   self::update([
 
                       'uid'        => $uid,
 
                       'adduid'     => (int)$mybb->user['uid'],
 
                       'pid'        => $pid,
 
                       'reputation' => $reputation,
 
                       'comments'   => '',
 
                   ]);
 
                   die;
 
               }
 
               else
                
{
 
                   die;
 
               }

 
           break;
 
       }
 
   }

 
   private static function get_reps($pids)
 
   {
 
       global $db;

 
       $get_reps $db->query("SELECT 
            r.adduid, r.pid, r.reputation, u.uid, u.username
            FROM "
.TABLE_PREFIX."reputation r 
            LEFT JOIN "
.TABLE_PREFIX."users u ON (r.adduid = u.uid) WHERE ".$pids
        
);

 
       while($rep $db->fetch_array($get_reps))
 
       {
 
           self::$reputations$rep['pid'] ][] = [
 
               'adduid'     => $rep['adduid'],
 
               'reputation' => $rep['reputation'],
 
               'username'   => $rep['username'],
 
               'uid'        => $rep['uid'],
 
           ];
 
       }
 
   }

 
   private static function add($data)
 
   {
 
       global $db;

 
       $data['dateline'] = TIME_NOW;

 
       $db->insert_query('reputation'$data);

 
       $query $db->simple_select("reputation""SUM(reputation) AS reputation_count""uid='".$data['uid']."'");
 
       $reputation_value $db->fetch_field($query"reputation_count");

 
       $db->update_query("users", ['reputation' => (int)$reputation_value], "uid='".$data['uid']."'");
 
   }

 
   private static function update($data)
 
   {
 
       global $db;

 
       $db->update_query('reputation'$data'rid = '.self::$rid);

 
       $query $db->simple_select("reputation""SUM(reputation) AS reputation_count""uid='".$data['uid']."'");
 
       $reputation_value $db->fetch_field($query"reputation_count");

 
       $db->update_query("users", ['reputation' => (int)$reputation_value], "uid='".$data['uid']."'");
 
   }

 
   private static function delete($rid$uid)
 
   {
 
       global $db;

 
       $db->delete_query('reputation''rid='.$rid);

 
       $query $db->simple_select("reputation""SUM(reputation) AS reputation_count""uid='".$uid."'");
 
       $reputation_value $db->fetch_field($query"reputation_count");

 
       $db->update_query("users", ['reputation' => (int)$reputation_value], "uid='".$uid."'");
 
   }

 
   private static function existing_reputation($pid$uid)
 
   {
 
       global $mybb$db;

 
       $query $db->simple_select("reputation""*""adduid='".$mybb->user['uid']."' AND uid='".$uid."' AND pid = '".$pid."'");
 
       $existing_reputation $db->fetch_array($query);

 
       return $existing_reputation;
 
   }

 
   private static function add_button($uid$pid$to_rep$rep_value 1)
 
   {
 
       global $mybb$lang;

 
       $lang -> load('xem_fast_rep');

 
       if(($mybb->settings['posrep'] && $to_rep == 1) || ($to_rep == && $rep_value == 1))
 
       {
 
           return '<span onclick=\"vote(\''.$uid.'\', \''.$pid.'\', \''.$to_rep.'\')\" class=\"reps plus\" id=\"rep_plus_'.$pid.'\" title=\"'.$lang->xem_fast_rep_like_it.'\">+</span>';
 
       }

 
       if(($mybb->settings['negrep'] && $to_rep == -1) || $to_rep == 0)
 
       {
 
           return '<span onclick=\"vote(\''.$uid.'\', \''.$pid.'\', \''.$to_rep.'\')\" class=\"reps minus\" id=\"rep_minus_'.$pid.'\" title=\"'.$lang->xem_fast_rep_unlike_it.'\">-</span>';
 
       }
 
   }

 
   private static function count_reps($pid$count)
 
   {
 
       global $lang;

 
       $lang -> load('xem_fast_rep');

 
       return '<span class=\"reps likes_'.$pid.'\" title=\"'.$lang->xem_fast_rep_who_like_it.'\">'.$count.'</span>';
 
   }

 
   private static function get_count_reps($pid)
 
   {
 
       global $db;

 
       $counts $db->simple_select("reputation""SUM(reputation)""pid='".$pid."'");
 
       $count $db->fetch_array($counts);

 
       return ($count['SUM(reputation)'] != null $count['SUM(reputation)'] : 0);
 
   }

 
   private static function liked_this($liked_this)
 
   {
 
       global $mybb$db$lang;

 
       $lang -> load('xem_fast_rep');

 
       if($mybb->settings['xem_fast_rep_show_liked_this'] == 1)
 
       {
 
           if(is_array($liked_this))
 
           
 
               $num 1;
 
               foreach($liked_this as $liked)
 
               {
 
                   if($liked['reputation'] == 1)
 
                   {
 
                       if($mybb->user['uid'] == $liked['uid']) $num 0;

 
                       $likeThis[$num] = [
 
                           $liked['uid'],
 
                           $liked['username'],
 
                       ];
 
                       $num++;
 
                   }
 
               }
 
           }
 
           elseif($liked_this !== NULL)
 
           {
 
               $get_likes $db->query("SELECT u.username, u.uid  
                    FROM "
.TABLE_PREFIX."reputation r 
                    LEFT JOIN "
.TABLE_PREFIX."users u ON (r.adduid = u.uid) 
                    WHERE r.pid = '"
.$liked_this."' AND r.reputation = '1'"
 
               );

 
               $num 1;
 
               while($liked $db->fetch_array($get_likes))
 
               {
 
                   if($mybb->user['uid'] == $liked['uid']) $num 0;
 
                   $likeThis[$num] = [
 
                       $liked['uid'],
 
                       $liked['username'],
 
                   ];
 
                   $num++;
 
               }
 
           }

 
           $count_likeThis count($likeThis);
 
           if(is_array($likeThis))
 
           {
 
               foreach($likeThis as $key => $lt)
 
               {
 
                   if(in_array($mybb->user['username'], $lt))
 
                   {
 
                       $likeThis[$key] = array_replace($lt, [=> $lang->you]);
 
                       $youLikeThis true;
 
                   }
 
               }

 
               ksort($likeThis);
 
               $likeThis array_values($likeThis);

 
               switch($count_likeThis)
 
               {
 
                   case 1:
 
                       if(isset($youLikeThis))
 
                       {
 
                           $m $lang->you_like_it;
 
                       }
 
                       else
                        
{
 
                           $m self::profile_url($likeThis[0][0], $likeThis[0][1]).' '.$lang->like_it;
 
                       }
 
                       break;
 
                   case 2
 
                       $m self::profile_url($likeThis[0][0], $likeThis[0][1]).' i '.self::profile_url($likeThis[1][0], $likeThis[1][1]).' '.$lang->like_it;
 
                       break;
 
                   case 3:
 
                       $m self::profile_url($likeThis[0][0], $likeThis[0][1]).', '.self::profile_url($likeThis[1][0], $likeThis[1][1]).' i '.self::profile_url($likeThis[2][0], $likeThis[2][1]).' '.$lang->like_it;
 
                       break;
 
                   default:
 
                       $m self::profile_url($likeThis[0][0], $likeThis[0][1]).', '.self::profile_url($likeThis[1][0], $likeThis[1][1]).', '.self::profile_url($likeThis[2][0], $likeThis[2][1]).' '.$lang->and.' '.($count_likeThis-3).' '.$lang->others_person_like_it;
 
                       break;
 
               }
 
               return '<span class=\"liked_this\">'.$m.'</span>';
 
           }
 
       }
 
   }

 
   private static function profile_url($uid$username)
 
   {
 
       return '<a href=\"'.$mybb->settings['bburl'].get_profile_link($uid).'\">'.$username.'</a>';
 
   }

 
   private static function adduser_permissions()
 
   {
 
       global $mybb;

 
       if($mybb->usergroup['canview'] != || $mybb->usergroup['cangivereputations'] != 1)
 
       {
 
           return false;
 
       }

 
       return true;
 
   }

 
   private static function getuser_permissions($post)
 
   {
 
       global $mybb$db;

 
       if(!is_array($post))
 
       {
 
           $get_post $db->simple_select('posts''*''pid='.$post);
 
           $post $db->fetch_array($get_post);
 
       }

 
       $user get_user($post['uid']);
 
       $user_permissions user_permissions($uid);

 
       if($post)
 
       {
 
           $thread get_thread($post['tid']);
 
           $forum get_forum($thread['fid']);
 
           $forumpermissions forum_permissions($forum['fid']);

 
           if(($post['visible'] == && !is_moderator($forum['fid'], "canviewunapprove")) || $post['visible'] < 0)
 
           {
 
               $permissions false;
 
           }
 
           elseif(($thread['visible'] == && !is_moderator($forum['fid'], "canviewunapprove")) || $thread['visible'] < 0)
 
           {
 
               $permissions false;
 
           }
 
           elseif($forumpermissions['canview'] == || $forumpermissions['canpostreplys'] == || $mybb->user['suspendposting'] == 1)
 
           {
 
               $permissions false;
 
           }
 
           elseif(isset($forumpermissions['canonlyviewownthreads']) && $forumpermissions['canonlyviewownthreads'] == && $thread['uid'] != $mybb->user['uid'])
 
           {
 
               $permissions false;
 
           }
 
           else
            
{
 
               $permissions true;
 
           }
 
       }
 
       else
        
{
 
           $permissions false;
 
       }

 
       if($user_permissions['usereputationsystem'] != || !$user || !$permissions)
 
       {
 
           return false;
 
       }

 
       return true;
 
   }



Kod JS:

Kod:
function vote(uid, pid, reputation) {
 $.ajax({
   type: "POST",
   url: "xmlhttp.php",
   data: {
     "action": "xem_fast_rep",
     "uid": uid,
     "pid": pid,
     "reputation": reputation
   },
   cache: false,

   success: function(data){
     $(".reps_"+pid).html(data);
   },
   fail: function() {
       alert("Problem z wtyczką XEM Fast Rep");
   }
 });
}

Ja nie znam się na tyle, bo jeszcze coś spartolę i skasuję komuś całą reputację, albo wywołam burdel w bazie danych. 

Ktoś wie jak to rozwiązać na chwilę obecną?
O kuźwa, rzeczywiście masz rację. Wystarczy zbadać element przy danym poście, zmienić jedynkę (1) na dowolną liczbę i wcisnąć przycisk plus, dodaje wtedy tyle pkt. reputacji ile ustaliliśmy. Sprawdziłem i może to zrobić każdy użytkownik. Po odświeżeniu CTRL + F5 punkty zostają a po przejściu do reputacji użytkownika też są. Zaraz jeszcze podam wam wyniki z bazy danych po użyciu tego triku.

Jest to naprawdę błąd krytyczny pluginu i od tak nie da się go usunąć, trzeba modyfikować kod pluginu.
No właśnie, a nie da się dodać jakiegoś magcznego If'a? Nie znam składni PHP, a wiadomo jakie konsekwencje może to za sobą nieść.
niby warunek sprawdza tą wartośc

Kod PHP:
if($mybb->input['action'] == 'xem_fast_rep' && (
            !
$mybb->input['uid'] || 
            !
$mybb->input['pid'] ||
            !
$mybb->user['uid'] ||
            (int)
$mybb->input['reputation'] != '1' &&
            (int)
$mybb->input['reputation'] != '0' &&
            (int)
$mybb->input['reputation'] != '-1'
        
) && !self::getuser_permissions($mybb->input['pid']) &&
            !
self::adduser_permissions()
        ) exit; 

zobacz tak

Kod PHP:
<?php
/**
 * Author: Szczepan 'Xemix' Machaj
 * WWW: xemix.eu / xemix.pl
 * Copyright (c) 2015
 * License: Creative Commons BY-NC-SA 4.0
 * License URL: http://creativecommons.org/licenses/by-nc-sa/4.0/
 */

if(!defined("IN_MYBB")) exit();

global 
$mybb;

if(
$mybb->settings['enablereputation'])
{
    
$plugins -> add_hook('postbit', ['xem_fast_rep''in_post']);
    
$plugins -> add_hook('xmlhttp',    ['xem_fast_rep''xmlhttp']);
}

function 
xem_fast_rep_info()
{
    global 
$lang;
    
$lang->load('xem_fast_rep');

    return [
        
'name'          => 'xem Fast Reputation',
        
'description'   =>  $lang->xem_fast_rep_description,
        
'website'       => 'http://xemix.eu',
        
'author'        => 'Xemix',
        
'authorsite'    => 'http://xemix.eu',
        
'version'       => '1.4',
        
'codename'      => 'xem_fast_rep',
        
'compatibility' => '18*'
    
];
}

function 
xem_fast_rep_install()
{
    global 
$db$mybb$lang;

    
$lang->load('xem_fast_rep');

    
$setting_group_id $db->insert_query('settinggroups', [
        
'name'        => 'xem_fast_rep_settings',
        
'title'       => $db->escape_string($lang->xem_fast_rep_settings_title),
        
'description' => $db->escape_string($lang->xem_fast_rep_settings_title),
    ]);
    
    
$settings = [
        [   
            
'name'        => 'xem_fast_rep_active',
            
'title'       =>  $lang->xem_fast_rep_plugin_active,
            
'optionscode' => 'yesno',
            
'value'       => '1'
        
],
        [   
            
'name'        => 'xem_fast_rep_show_liked_this',
            
'title'       =>  $lang->xem_fast_rep_show_liked_this,
            
'optionscode' => 'yesno',
            
'value'       => '1'
        
],
    ];

    
$i 1;

    foreach(
$settings as &$row) {
        
$row['gid']         = $setting_group_id;
        
$row['title']       = $db->escape_string($row['title']);
        
$row['description'] = $db->escape_string($row['description']);
        
$row['disporder']   = $i++;
    }

    
$db->insert_query_multiple('settings'$settings);

    
rebuild_settings();
    
}

function 
xem_fast_rep_uninstall()
{
    global 
$db;

    
$setting_group_id $db->fetch_field(
        
$db->simple_select('settinggroups''gid'"name='xem_fast_rep_settings'"),
        
'gid'
    
);

    
$db->delete_query('settinggroups'"name='xem_fast_rep_settings'");
    
$db->delete_query('settings''gid='.$setting_group_id);

    include_once 
MYBB_ROOT."inc/adminfunctions_templates.php";

    
find_replace_templatesets(
        
'postbit',
        
'#' preg_quote('{$post[\'xem_fast_rep\']}
    {$post[\'attachments\']}'
) . '#i',
        
'{$post[\'attachments\']}'
    
);

    
find_replace_templatesets(
        
'postbit_classic',
        
'#' preg_quote('{$post[\'xem_fast_rep\']}
    {$post[\'attachments\']}'
) . '#i',
        
'{$post[\'attachments\']}'
    
);

    
find_replace_templatesets(
        
'headerinclude',
        
'#' preg_quote('<script type="text/javascript" src="{$mybb->asset_url}/jscripts/xem_fast_rep.js"></script>
{$stylesheets}'
) . '#i',
        
'{$stylesheets}'
    
);

    
rebuild_settings();
}

function 
xem_fast_rep_is_installed()
{
    global 
$db;

    
$query $db->simple_select('settinggroups''gid'"name='xem_fast_rep_settings'");
    return (bool)
$db->num_rows($query);
}

function 
xem_fast_rep_activate()
{
    include_once 
MYBB_ROOT.'inc/adminfunctions_templates.php';

    
find_replace_templatesets(
        
'postbit',
        
'#' preg_quote('{$post[\'attachments\']}') . '#i',
        
'{$post[\'xem_fast_rep\']}
    {$post[\'attachments\']}'
    
);

    
find_replace_templatesets(
        
'postbit_classic',
        
'#' preg_quote('{$post[\'attachments\']}') . '#i',
        
'{$post[\'xem_fast_rep\']}
    {$post[\'attachments\']}'
    
);

    
find_replace_templatesets(
        
'headerinclude',
        
'#' preg_quote('{$stylesheets}') . '#i',
        
'<script type="text/javascript" src="{$mybb->asset_url}/jscripts/xem_fast_rep.js"></script>
{$stylesheets}'
    
);
}

function 
xem_fast_rep_deactivate()
{
    include_once 
MYBB_ROOT."inc/adminfunctions_templates.php";

    
find_replace_templatesets(
        
'postbit',
        
'#' preg_quote('{$post[\'xem_fast_rep\']}
    {$post[\'attachments\']}'
) . '#i',
        
'{$post[\'attachments\']}'
    
);

    
find_replace_templatesets(
        
'postbit_classic',
        
'#' preg_quote('{$post[\'xem_fast_rep\']}
    {$post[\'attachments\']}'
) . '#i',
        
'{$post[\'attachments\']}'
    
);

    
find_replace_templatesets(
        
'headerinclude',
        
'#' preg_quote('<script type="text/javascript" src="{$mybb->asset_url}/jscripts/xem_fast_rep.js"></script>
{$stylesheets}'
) . '#i',
        
'{$stylesheets}'
    
);
}

class 
xem_fast_rep
{

    public static 
$reputations;
    public static 
$rid 0;
    public static 
$first_check false;

    public function 
in_post(&$post)
    {
        global 
$db$mybb$pids;

        if(!
self::$first_check
        {
            if(!isset(
$pids) || $pids == '')
            {
                
$pids "pid IN (".(int)$mybb->input['pid'].")";
            }

            
self::get_reps($pids);
            
self::$first_check true;
        }

        
$r 0;
        
        if(isset(
self::$reputations$post['pid'] ]))
        {
            foreach(
self::$reputations$post['pid'] ] as $reputation)
            {
                
$r += $reputation['reputation'];

                
$liked_this$post['pid'] ][] = [
                    
'username'   => $reputation['username'],
                    
'uid'        => $reputation['uid'],
                    
'reputation' => $reputation['reputation'],
                    
'adduid'     => $reputation['adduid'],
                ];

                if(
$mybb->user['uid'] == $reputation['adduid'])
                {
                    
$adduid $reputation['adduid'];
                    
$rep_value $reputation['reputation'];
                }

            } 
        }

        
$add_reps null;
        
$delete_reps null;
        if(
$mybb->user['uid'] != $post['uid'] && $mybb->user['uid'])
        {
            if(isset(
$adduid) && $adduid != $mybb->user['uid'] || $rep_value != 1)
            {
                
$to_plus_rep 1;
                if(isset(
$rep_value) && $rep_value == -1$to_plus_rep 0;
                
$add_reps self::add_button($post['uid'], $post['pid'], $to_plus_rep'1');
            }

            if(isset(
$adduid) && $adduid != $mybb->user['uid'] || $rep_value != -1)
            {
                
$to_minus_rep = -1;
                if(isset(
$rep_value) && $rep_value == 1$to_minus_rep 0;
                
$delete_reps self::add_button($post['uid'], $post['pid'], $to_minus_rep'-1');
            }
        }

        
$liked self::liked_this($liked_this$post['pid'] ]);

        
$post_reps '<span id=\"xem_fast_rep\" class=\"reps_'.$post['pid'].'\" style=\"float:right;\">'.$liked.$add_reps.$delete_reps.self::count_reps($post['pid'], $r).'</span>';

        if(
self::adduser_permissions() && self::getuser_permissions($post))
        {
            eval(
"\$post['xem_fast_rep'] = \"".$post_reps."\";");
            return 
$post;
        }
    }

    public function 
xmlhttp()
    {
        global 
$mybb$db;

        if(
$mybb->input['action'] == 'xem_fast_rep' && (
            !
$mybb->input['uid'] || 
            !
$mybb->input['pid'] ||
            !
$mybb->user['uid'] ||
            (int)
$mybb->input['reputation'] != '1' &&
            (int)
$mybb->input['reputation'] != '0' &&
            (int)
$mybb->input['reputation'] != '-1'
        
) && !self::getuser_permissions($mybb->input['pid']) &&
            !
self::adduser_permissions()
        ) exit;

        
$reputation = (int)$mybb->input['reputation'];
        
$uid = (int)$mybb->input['uid'];
        
$pid = (int)$mybb->input['pid'];
        
        if(
$reputation 0)
            
$reputation = -1;
            else if(
$reputation 0)
                
$reputation 1;
                else
                    
$reputation 0;

        switch(
$mybb->input['action'])
        {

            case 
'xem_fast_rep':

                
$existing_reputation self::existing_reputation($pid$uid);

                
self::$rid $existing_reputation['rid'];

                if(!
self::$rid && $reputation != 0)
                {
                    
self::add([
                        
'uid'        => $uid,
                        
'adduid'     => (int)$mybb->user['uid'],
                        
'pid'        => $pid,
                        
'reputation' => $reputation,
                        
'comments'   => '',
                    ]);

                    if(
$reputation == 1)
                    {
                        die(
                            
stripslashes(self::liked_this($pid)) .
                            
stripslashes(self::add_button($uid$pid'0''-1')) .
                            
stripslashes(self::count_reps($pidself::get_count_reps($pid)))
                        );
                    }
                    else
                    {
                        die(
                            
stripslashes(self::liked_this($pid)) .
                            
stripslashes(self::add_button($uid$pid'0''1')) .
                            
stripslashes(self::count_reps($pidself::get_count_reps($pid)))
                        );
                    }
                }
                elseif(
$reputation == && self::$rid)
                {
                    
self::delete(self::$rid$uid);
                    die(
                        
stripslashes(self::liked_this($pid)) .
                        
stripslashes(self::add_button($uid$pid'1''1')) .
                        
stripslashes(self::add_button($uid$pid'-1''-1')) .
                        
stripslashes(self::count_reps($pidself::get_count_reps($pid)))
                    );
                }
                elseif(
$existing_reputation['reputation'] != $reputation)
                {
                    
self::update([
                        
'uid'        => $uid,
                        
'adduid'     => (int)$mybb->user['uid'],
                        
'pid'        => $pid,
                        
'reputation' => $reputation,
                        
'comments'   => '',
                    ]);
                    die;
                }
                else
                {
                    die;
                }

            break;
        }
    }

    private static function 
get_reps($pids)
    {
        global 
$db;

        
$get_reps $db->query("SELECT 
            r.adduid, r.pid, r.reputation, u.uid, u.username
            FROM "
.TABLE_PREFIX."reputation r 
            LEFT JOIN "
.TABLE_PREFIX."users u ON (r.adduid = u.uid) WHERE ".$pids
        
);

        while(
$rep $db->fetch_array($get_reps))
        {
            
self::$reputations$rep['pid'] ][] = [
                
'adduid'     => $rep['adduid'],
                
'reputation' => $rep['reputation'],
                
'username'   => $rep['username'],
                
'uid'        => $rep['uid'],
            ];
        }
    }

    private static function 
add($data)
    {
        global 
$db;

        
$data['dateline'] = TIME_NOW;

        
$db->insert_query('reputation'$data);

        
$query $db->simple_select("reputation""SUM(reputation) AS reputation_count""uid='".$data['uid']."'");
        
$reputation_value $db->fetch_field($query"reputation_count");

        
$db->update_query("users", ['reputation' => (int)$reputation_value], "uid='".$data['uid']."'");
    }

    private static function 
update($data)
    {
        global 
$db;

        
$db->update_query('reputation'$data'rid = '.self::$rid);

        
$query $db->simple_select("reputation""SUM(reputation) AS reputation_count""uid='".$data['uid']."'");
        
$reputation_value $db->fetch_field($query"reputation_count");

        
$db->update_query("users", ['reputation' => (int)$reputation_value], "uid='".$data['uid']."'");
    }

    private static function 
delete($rid$uid)
    {
        global 
$db;

        
$db->delete_query('reputation''rid='.$rid);

        
$query $db->simple_select("reputation""SUM(reputation) AS reputation_count""uid='".$uid."'");
        
$reputation_value $db->fetch_field($query"reputation_count");

        
$db->update_query("users", ['reputation' => (int)$reputation_value], "uid='".$uid."'");
    }

    private static function 
existing_reputation($pid$uid)
    {
        global 
$mybb$db;

        
$query $db->simple_select("reputation""*""adduid='".$mybb->user['uid']."' AND uid='".$uid."' AND pid = '".$pid."'");
        
$existing_reputation $db->fetch_array($query);

        return 
$existing_reputation;
    }

    private static function 
add_button($uid$pid$to_rep$rep_value 1)
    {
        global 
$mybb$lang;

        
$lang -> load('xem_fast_rep');

        if((
$mybb->settings['posrep'] && $to_rep == 1) || ($to_rep == && $rep_value == 1))
        {
            return 
'<span onclick=\"vote(\''.$uid.'\', \''.$pid.'\', \''.$to_rep.'\')\" class=\"reps plus\" id=\"rep_plus_'.$pid.'\" title=\"'.$lang->xem_fast_rep_like_it.'\">+</span>';
        }

        if((
$mybb->settings['negrep'] && $to_rep == -1) || $to_rep == 0)
        {
            return 
'<span onclick=\"vote(\''.$uid.'\', \''.$pid.'\', \''.$to_rep.'\')\" class=\"reps minus\" id=\"rep_minus_'.$pid.'\" title=\"'.$lang->xem_fast_rep_unlike_it.'\">-</span>';
        }
    }

    private static function 
count_reps($pid$count)
    {
        global 
$lang;

        
$lang -> load('xem_fast_rep');

        return 
'<span class=\"reps likes_'.$pid.'\" title=\"'.$lang->xem_fast_rep_who_like_it.'\">'.$count.'</span>';
    }

    private static function 
get_count_reps($pid)
    {
        global 
$db;

        
$counts $db->simple_select("reputation""SUM(reputation)""pid='".$pid."'");
        
$count $db->fetch_array($counts);

        return (
$count['SUM(reputation)'] != null $count['SUM(reputation)'] : 0);
    }

    private static function 
liked_this($liked_this)
    {
        global 
$mybb$db$lang;

        
$lang -> load('xem_fast_rep');

        if(
$mybb->settings['xem_fast_rep_show_liked_this'] == 1)
        {
            if(
is_array($liked_this))
            { 
                
$num 1;
                foreach(
$liked_this as $liked)
                {
                    if(
$liked['reputation'] == 1)
                    {
                        if(
$mybb->user['uid'] == $liked['uid']) $num 0;

                        
$likeThis[$num] = [
                            
$liked['uid'],
                            
$liked['username'],
                        ];
                        
$num++;
                    }
                }
            }
            elseif(
$liked_this !== NULL)
            {
                
$get_likes $db->query("SELECT u.username, u.uid  
                    FROM "
.TABLE_PREFIX."reputation r 
                    LEFT JOIN "
.TABLE_PREFIX."users u ON (r.adduid = u.uid) 
                    WHERE r.pid = '"
.$liked_this."' AND r.reputation = '1'"
                
);

                
$num 1;
                while(
$liked $db->fetch_array($get_likes))
                {
                    if(
$mybb->user['uid'] == $liked['uid']) $num 0;
                    
$likeThis[$num] = [
                        
$liked['uid'],
                        
$liked['username'],
                    ];
                    
$num++;
                }
            }

            
$count_likeThis count($likeThis);
            if(
is_array($likeThis))
            {
                foreach(
$likeThis as $key => $lt)
                {
                    if(
in_array($mybb->user['username'], $lt))
                    {
                        
$likeThis[$key] = array_replace($lt, [=> $lang->you]);
                        
$youLikeThis true;
                    }
                }

                
ksort($likeThis);
                
$likeThis array_values($likeThis);

                switch(
$count_likeThis)
                {
                    case 
1:
                        if(isset(
$youLikeThis))
                        {
                            
$m $lang->you_like_it;
                        }
                        else
                        {
                            
$m self::profile_url($likeThis[0][0], $likeThis[0][1]).' '.$lang->like_it;
                        }
                        break;
                    case 
2
                        
$m self::profile_url($likeThis[0][0], $likeThis[0][1]).' i '.self::profile_url($likeThis[1][0], $likeThis[1][1]).' '.$lang->like_it;
                        break;
                    case 
3:
                        
$m self::profile_url($likeThis[0][0], $likeThis[0][1]).', '.self::profile_url($likeThis[1][0], $likeThis[1][1]).' i '.self::profile_url($likeThis[2][0], $likeThis[2][1]).' '.$lang->like_it;
                        break;
                    default:
                        
$m self::profile_url($likeThis[0][0], $likeThis[0][1]).', '.self::profile_url($likeThis[1][0], $likeThis[1][1]).', '.self::profile_url($likeThis[2][0], $likeThis[2][1]).' '.$lang->and.' '.($count_likeThis-3).' '.$lang->others_person_like_it;
                        break;
                }
                return 
'<span class=\"liked_this\">'.$m.'</span>';
            }
        }
    }

    private static function 
profile_url($uid$username)
    {
        return 
'<a href=\"'.$mybb->settings['bburl'].get_profile_link($uid).'\">'.$username.'</a>';
    }

    private static function 
adduser_permissions()
    {
        global 
$mybb;

        if(
$mybb->usergroup['canview'] != || $mybb->usergroup['cangivereputations'] != 1)
        {
            return 
false;
        }

        return 
true;
    }

    private static function 
getuser_permissions($post)
    {
        global 
$mybb$db;

        if(!
is_array($post))
        {
            
$get_post $db->simple_select('posts''*''pid='.$post);
            
$post $db->fetch_array($get_post);
        }

        
$user get_user($post['uid']);
        
$user_permissions user_permissions($uid);

        if(
$post)
        {
            
$thread get_thread($post['tid']);
            
$forum get_forum($thread['fid']);
            
$forumpermissions forum_permissions($forum['fid']);

            if((
$post['visible'] == && !is_moderator($forum['fid'], "canviewunapprove")) || $post['visible'] < 0)
            {
                
$permissions false;
            }
            elseif((
$thread['visible'] == && !is_moderator($forum['fid'], "canviewunapprove")) || $thread['visible'] < 0)
            {
                
$permissions false;
            }
            elseif(
$forumpermissions['canview'] == || $forumpermissions['canpostreplys'] == || $mybb->user['suspendposting'] == 1)
            {
                
$permissions false;
            }
            elseif(isset(
$forumpermissions['canonlyviewownthreads']) && $forumpermissions['canonlyviewownthreads'] == && $thread['uid'] != $mybb->user['uid'])
            {
                
$permissions false;
            }
            else
            {
                
$permissions true;
            }
        }
        else
        {
            
$permissions false;
        }

        if(
$user_permissions['usereputationsystem'] != || !$user || !$permissions)
        {
            return 
false;
        }

        return 
true;
    }


Ja się nie znam, ale w ogóle nie ogarniam po co plugin popiera tę jedynkę od strony klienta, zamiast zareagować na kliknięcie. Tak samo pobiera stamtąd id postu i użytkownika, a przecież, chyba powinien to robić jakoś od środka. Nie wiem, ja się nie znam jak napisałem. Może Wy coś wykminicie. Zastanawiam się czy go nie wyłączyć, bo skoro mój moderator, to wykminił, a nie zna się na kodowaniu w JS i PHP podobnie jak ja, to każdy może.

Edit: Zaraz sprawdzę.

Teraz działa, ale z jednym wyjątkiem. U mnie są wyłączone ujemne punkty, ale jak wprowadzę ujemną wartość, to dodaje ujemny punkt reputacji. Jeden ujemny, bo jeden, ale ujemne są wyłączone.
(05.09.2015, 19:20)Supryk napisał(a): [ -> ]niby warunek sprawdza tą wartośc
Kod PHP:
if($mybb->input['action'] == 'xem_fast_rep' && (
            !
$mybb->input['uid'] || 
            !
$mybb->input['pid'] ||
            !
$mybb->user['uid'] ||
            (int)
$mybb->input['reputation'] != '1' &&
            (int)
$mybb->input['reputation'] != '0' &&
            (int)
$mybb->input['reputation'] != '-1'
        
) && !self::getuser_permissions($mybb->input['pid']) &&
            !
self::adduser_permissions()
        ) exit; 
Powinien tym się zająć, ale logika tego warunku jest nieprawidłowa.

Zamiast kodu Supryka (zmodyfikowana wersja build #7 z głównej bazy modyfikacji, najnowszy to #8) można również zmienić powyższy blok na
Kod PHP:
if(
            
$mybb->input['action'] == 'xem_fast_rep' &&
            (
                !
$mybb->input['uid'] || 
                !
$mybb->input['pid'] ||
                !
$mybb->user['uid'] ||
                !
in_array((int)$mybb->input['reputation'], [-101]) ||
                !
self::getuser_permissions($mybb->input['pid']) ||
                !
self::adduser_permissions()
            )
        ) exit; 

Tak czy wspak, ze względu na wymienione w tym wątku problemy modyfikacja zostaje tymczasowo ukryta na Extend.
Teraz wszystko działa, ale wciąż nie perfekcyjnie, tzn, po wciśnięciu przycisk znika, pojawia się dopiero po odświeżeniu, oczywiście tylko jak się zmodyfikuje zawartość. Dzięki i lecą reputki, liczę, że autor to jeszcze bardziej poprawi, pozdrawiam Jego i Was.

PS: Podziękowania dla moderatora z mojego forum, wpadł na pomysł, żeby pokombinować i to odkrył.
Kod PHP:
<?php
/**
 * Author: Szczepan 'Xemix' Machaj
 * WWW: xemix.eu / xemix.pl
 * Copyright (c) 2015
 * License: Creative Commons BY-NC-SA 4.0
 * License URL: http://creativecommons.org/licenses/by-nc-sa/4.0/
 */

if(!defined("IN_MYBB")) exit();

global 
$mybb;

if(
$mybb->settings['enablereputation'])
{
    
$plugins -> add_hook('postbit', ['xem_fast_rep''in_post']);
    
$plugins -> add_hook('xmlhttp',    ['xem_fast_rep''xmlhttp']);
}

function 
xem_fast_rep_info()
{
    global 
$lang;
    
$lang->load('xem_fast_rep');

    return [
        
'name'          => 'xem Fast Reputation',
        
'description'   =>  $lang->xem_fast_rep_description,
        
'website'       => 'http://xemix.eu',
        
'author'        => 'Xemix',
        
'authorsite'    => 'http://xemix.eu',
        
'version'       => '1.4',
        
'codename'      => 'xem_fast_rep',
        
'compatibility' => '18*'
    
];
}

function 
xem_fast_rep_install()
{
    global 
$db$mybb$lang;

    
$lang->load('xem_fast_rep');

    
$setting_group_id $db->insert_query('settinggroups', [
        
'name'        => 'xem_fast_rep_settings',
        
'title'       => $db->escape_string($lang->xem_fast_rep_settings_title),
        
'description' => $db->escape_string($lang->xem_fast_rep_settings_title),
    ]);
    
    
$settings = [
        [   
            
'name'        => 'xem_fast_rep_active',
            
'title'       =>  $lang->xem_fast_rep_plugin_active,
            
'optionscode' => 'yesno',
            
'value'       => '1'
        
],
        [   
            
'name'        => 'xem_fast_rep_show_liked_this',
            
'title'       =>  $lang->xem_fast_rep_show_liked_this,
            
'optionscode' => 'yesno',
            
'value'       => '1'
        
],
    ];

    
$i 1;

    foreach(
$settings as &$row) {
        
$row['gid']         = $setting_group_id;
        
$row['title']       = $db->escape_string($row['title']);
        
$row['description'] = $db->escape_string($row['description']);
        
$row['disporder']   = $i++;
    }

    
$db->insert_query_multiple('settings'$settings);

    
rebuild_settings();
    
}

function 
xem_fast_rep_uninstall()
{
    global 
$db;

    
$setting_group_id $db->fetch_field(
        
$db->simple_select('settinggroups''gid'"name='xem_fast_rep_settings'"),
        
'gid'
    
);

    
$db->delete_query('settinggroups'"name='xem_fast_rep_settings'");
    
$db->delete_query('settings''gid='.$setting_group_id);

    include_once 
MYBB_ROOT."inc/adminfunctions_templates.php";

    
find_replace_templatesets(
        
'postbit',
        
'#' preg_quote('{$post[\'xem_fast_rep\']}
    {$post[\'attachments\']}'
) . '#i',
        
'{$post[\'attachments\']}'
    
);

    
find_replace_templatesets(
        
'postbit_classic',
        
'#' preg_quote('{$post[\'xem_fast_rep\']}
    {$post[\'attachments\']}'
) . '#i',
        
'{$post[\'attachments\']}'
    
);

    
find_replace_templatesets(
        
'headerinclude',
        
'#' preg_quote('<script type="text/javascript" src="{$mybb->asset_url}/jscripts/xem_fast_rep.js"></script>
{$stylesheets}'
) . '#i',
        
'{$stylesheets}'
    
);

    
rebuild_settings();
}

function 
xem_fast_rep_is_installed()
{
    global 
$db;

    
$query $db->simple_select('settinggroups''gid'"name='xem_fast_rep_settings'");
    return (bool)
$db->num_rows($query);
}

function 
xem_fast_rep_activate()
{
    include_once 
MYBB_ROOT.'inc/adminfunctions_templates.php';

    
find_replace_templatesets(
        
'postbit',
        
'#' preg_quote('{$post[\'attachments\']}') . '#i',
        
'{$post[\'xem_fast_rep\']}
    {$post[\'attachments\']}'
    
);

    
find_replace_templatesets(
        
'postbit_classic',
        
'#' preg_quote('{$post[\'attachments\']}') . '#i',
        
'{$post[\'xem_fast_rep\']}
    {$post[\'attachments\']}'
    
);

    
find_replace_templatesets(
        
'headerinclude',
        
'#' preg_quote('{$stylesheets}') . '#i',
        
'<script type="text/javascript" src="{$mybb->asset_url}/jscripts/xem_fast_rep.js"></script>
{$stylesheets}'
    
);
}

function 
xem_fast_rep_deactivate()
{
    include_once 
MYBB_ROOT."inc/adminfunctions_templates.php";

    
find_replace_templatesets(
        
'postbit',
        
'#' preg_quote('{$post[\'xem_fast_rep\']}
    {$post[\'attachments\']}'
) . '#i',
        
'{$post[\'attachments\']}'
    
);

    
find_replace_templatesets(
        
'postbit_classic',
        
'#' preg_quote('{$post[\'xem_fast_rep\']}
    {$post[\'attachments\']}'
) . '#i',
        
'{$post[\'attachments\']}'
    
);

    
find_replace_templatesets(
        
'headerinclude',
        
'#' preg_quote('<script type="text/javascript" src="{$mybb->asset_url}/jscripts/xem_fast_rep.js"></script>
{$stylesheets}'
) . '#i',
        
'{$stylesheets}'
    
);
}

class 
xem_fast_rep
{

    public static 
$reputations;
    public static 
$rid 0;
    public static 
$first_check false;

    public function 
in_post(&$post)
    {
        global 
$db$mybb$pids;

        if(!
self::$first_check
        {
            if(!isset(
$pids) || $pids == '')
            {
                
$pids "pid IN (".(int)$mybb->input['pid'].")";
            }

            
self::get_reps($pids);
            
self::$first_check true;
        }

        
$r 0;
        
        if(isset(
self::$reputations$post['pid'] ]))
        {
            foreach(
self::$reputations$post['pid'] ] as $reputation)
            {
                
$r += $reputation['reputation'];

                
$liked_this$post['pid'] ][] = [
                    
'username'   => $reputation['username'],
                    
'uid'        => $reputation['uid'],
                    
'reputation' => $reputation['reputation'],
                    
'adduid'     => $reputation['adduid'],
                ];

                if(
$mybb->user['uid'] == $reputation['adduid'])
                {
                    
$adduid $reputation['adduid'];
                    
$rep_value $reputation['reputation'];
                }

            } 
        }

        
$add_reps null;
        
$delete_reps null;
        if(
$mybb->user['uid'] != $post['uid'] && $mybb->user['uid'])
        {
            if(isset(
$adduid) && $adduid != $mybb->user['uid'] || $rep_value != 1)
            {
                
$to_plus_rep 1;
                if(isset(
$rep_value) && $rep_value == -1$to_plus_rep 0;
                
$add_reps self::add_button($post['uid'], $post['pid'], $to_plus_rep'1');
            }

            if(isset(
$adduid) && $adduid != $mybb->user['uid'] || $rep_value != -1)
            {
                
$to_minus_rep = -1;
                if(isset(
$rep_value) && $rep_value == 1$to_minus_rep 0;
                
$delete_reps self::add_button($post['uid'], $post['pid'], $to_minus_rep'-1');
            }
        }

        
$liked self::liked_this($liked_this$post['pid'] ]);

        
$post_reps '<span id=\"xem_fast_rep\" class=\"reps_'.$post['pid'].'\" style=\"float:right;\">'.$liked.$add_reps.$delete_reps.self::count_reps($post['pid'], $r).'</span>';

        if(
self::adduser_permissions() && self::getuser_permissions($post))
        {
            eval(
"\$post['xem_fast_rep'] = \"".$post_reps."\";");
            return 
$post;
        }
    }

    public function 
xmlhttp()
    {
        global 
$mybb$db;

        if(
$mybb->input['action'] == 'xem_fast_rep' && (
            !
$mybb->input['uid'] || 
            !
$mybb->input['pid'] ||
            !
$mybb->user['uid'] ||
            (int)
$mybb->input['reputation'] != '1' &&
            (int)
$mybb->input['reputation'] != '0' &&
            (int)
$mybb->input['reputation'] != '-1'
        
) && !self::getuser_permissions($mybb->input['pid']) &&
            !
self::adduser_permissions()
        ) exit;

        
$reputation = (int)$mybb->input['reputation'];
        
$uid = (int)$mybb->input['uid'];
        
$pid = (int)$mybb->input['pid'];
        
        if(
$reputation 0)
            return;
            else if(
$reputation 0)
                
$reputation 1;
                else
                    
$reputation 0;

        switch(
$mybb->input['action'])
        {

            case 
'xem_fast_rep':

                
$existing_reputation self::existing_reputation($pid$uid);

                
self::$rid $existing_reputation['rid'];

                if(!
self::$rid && $reputation != 0)
                {
                    
self::add([
                        
'uid'        => $uid,
                        
'adduid'     => (int)$mybb->user['uid'],
                        
'pid'        => $pid,
                        
'reputation' => $reputation,
                        
'comments'   => '',
                    ]);

                    if(
$reputation == 1)
                    {
                        die(
                            
stripslashes(self::liked_this($pid)) .
                            
stripslashes(self::add_button($uid$pid'0''-1')) .
                            
stripslashes(self::count_reps($pidself::get_count_reps($pid)))
                        );
                    }
                    else
                    {
                        die(
                            
stripslashes(self::liked_this($pid)) .
                            
stripslashes(self::add_button($uid$pid'0''1')) .
                            
stripslashes(self::count_reps($pidself::get_count_reps($pid)))
                        );
                    }
                }
                elseif(
$reputation == && self::$rid)
                {
                    
self::delete(self::$rid$uid);
                    die(
                        
stripslashes(self::liked_this($pid)) .
                        
stripslashes(self::add_button($uid$pid'1''1')) .
                        
stripslashes(self::add_button($uid$pid'-1''-1')) .
                        
stripslashes(self::count_reps($pidself::get_count_reps($pid)))
                    );
                }
                elseif(
$existing_reputation['reputation'] != $reputation)
                {
                    
self::update([
                        
'uid'        => $uid,
                        
'adduid'     => (int)$mybb->user['uid'],
                        
'pid'        => $pid,
                        
'reputation' => $reputation,
                        
'comments'   => '',
                    ]);
                    die;
                }
                else
                {
                    die;
                }

            break;
        }
    }

    private static function 
get_reps($pids)
    {
        global 
$db;

        
$get_reps $db->query("SELECT 
            r.adduid, r.pid, r.reputation, u.uid, u.username
            FROM "
.TABLE_PREFIX."reputation r 
            LEFT JOIN "
.TABLE_PREFIX."users u ON (r.adduid = u.uid) WHERE ".$pids
        
);

        while(
$rep $db->fetch_array($get_reps))
        {
            
self::$reputations$rep['pid'] ][] = [
                
'adduid'     => $rep['adduid'],
                
'reputation' => $rep['reputation'],
                
'username'   => $rep['username'],
                
'uid'        => $rep['uid'],
            ];
        }
    }

    private static function 
add($data)
    {
        global 
$db;

        
$data['dateline'] = TIME_NOW;

        
$db->insert_query('reputation'$data);

        
$query $db->simple_select("reputation""SUM(reputation) AS reputation_count""uid='".$data['uid']."'");
        
$reputation_value $db->fetch_field($query"reputation_count");

        
$db->update_query("users", ['reputation' => (int)$reputation_value], "uid='".$data['uid']."'");
    }

    private static function 
update($data)
    {
        global 
$db;

        
$db->update_query('reputation'$data'rid = '.self::$rid);

        
$query $db->simple_select("reputation""SUM(reputation) AS reputation_count""uid='".$data['uid']."'");
        
$reputation_value $db->fetch_field($query"reputation_count");

        
$db->update_query("users", ['reputation' => (int)$reputation_value], "uid='".$data['uid']."'");
    }

    private static function 
delete($rid$uid)
    {
        global 
$db;

        
$db->delete_query('reputation''rid='.$rid);

        
$query $db->simple_select("reputation""SUM(reputation) AS reputation_count""uid='".$uid."'");
        
$reputation_value $db->fetch_field($query"reputation_count");

        
$db->update_query("users", ['reputation' => (int)$reputation_value], "uid='".$uid."'");
    }

    private static function 
existing_reputation($pid$uid)
    {
        global 
$mybb$db;

        
$query $db->simple_select("reputation""*""adduid='".$mybb->user['uid']."' AND uid='".$uid."' AND pid = '".$pid."'");
        
$existing_reputation $db->fetch_array($query);

        return 
$existing_reputation;
    }

    private static function 
add_button($uid$pid$to_rep$rep_value 1)
    {
        global 
$mybb$lang;

        
$lang -> load('xem_fast_rep');

        if((
$mybb->settings['posrep'] && $to_rep == 1) || ($to_rep == && $rep_value == 1))
        {
            return 
'<span onclick=\"vote(\''.$uid.'\', \''.$pid.'\', \''.$to_rep.'\')\" class=\"reps plus\" id=\"rep_plus_'.$pid.'\" title=\"'.$lang->xem_fast_rep_like_it.'\">+</span>';
        }

        if((
$mybb->settings['negrep'] && $to_rep == -1) || $to_rep == 0)
        {
            return 
'<span onclick=\"vote(\''.$uid.'\', \''.$pid.'\', \''.$to_rep.'\')\" class=\"reps minus\" id=\"rep_minus_'.$pid.'\" title=\"'.$lang->xem_fast_rep_unlike_it.'\">-</span>';
        }
    }

    private static function 
count_reps($pid$count)
    {
        global 
$lang;

        
$lang -> load('xem_fast_rep');

        return 
'<span class=\"reps likes_'.$pid.'\" title=\"'.$lang->xem_fast_rep_who_like_it.'\">'.$count.'</span>';
    }

    private static function 
get_count_reps($pid)
    {
        global 
$db;

        
$counts $db->simple_select("reputation""SUM(reputation)""pid='".$pid."'");
        
$count $db->fetch_array($counts);

        return (
$count['SUM(reputation)'] != null $count['SUM(reputation)'] : 0);
    }

    private static function 
liked_this($liked_this)
    {
        global 
$mybb$db$lang;

        
$lang -> load('xem_fast_rep');

        if(
$mybb->settings['xem_fast_rep_show_liked_this'] == 1)
        {
            if(
is_array($liked_this))
            { 
                
$num 1;
                foreach(
$liked_this as $liked)
                {
                    if(
$liked['reputation'] == 1)
                    {
                        if(
$mybb->user['uid'] == $liked['uid']) $num 0;

                        
$likeThis[$num] = [
                            
$liked['uid'],
                            
$liked['username'],
                        ];
                        
$num++;
                    }
                }
            }
            elseif(
$liked_this !== NULL)
            {
                
$get_likes $db->query("SELECT u.username, u.uid  
                    FROM "
.TABLE_PREFIX."reputation r 
                    LEFT JOIN "
.TABLE_PREFIX."users u ON (r.adduid = u.uid) 
                    WHERE r.pid = '"
.$liked_this."' AND r.reputation = '1'"
                
);

                
$num 1;
                while(
$liked $db->fetch_array($get_likes))
                {
                    if(
$mybb->user['uid'] == $liked['uid']) $num 0;
                    
$likeThis[$num] = [
                        
$liked['uid'],
                        
$liked['username'],
                    ];
                    
$num++;
                }
            }

            
$count_likeThis count($likeThis);
            if(
is_array($likeThis))
            {
                foreach(
$likeThis as $key => $lt)
                {
                    if(
in_array($mybb->user['username'], $lt))
                    {
                        
$likeThis[$key] = array_replace($lt, [=> $lang->you]);
                        
$youLikeThis true;
                    }
                }

                
ksort($likeThis);
                
$likeThis array_values($likeThis);

                switch(
$count_likeThis)
                {
                    case 
1:
                        if(isset(
$youLikeThis))
                        {
                            
$m $lang->you_like_it;
                        }
                        else
                        {
                            
$m self::profile_url($likeThis[0][0], $likeThis[0][1]).' '.$lang->like_it;
                        }
                        break;
                    case 
2
                        
$m self::profile_url($likeThis[0][0], $likeThis[0][1]).' i '.self::profile_url($likeThis[1][0], $likeThis[1][1]).' '.$lang->like_it;
                        break;
                    case 
3:
                        
$m self::profile_url($likeThis[0][0], $likeThis[0][1]).', '.self::profile_url($likeThis[1][0], $likeThis[1][1]).' i '.self::profile_url($likeThis[2][0], $likeThis[2][1]).' '.$lang->like_it;
                        break;
                    default:
                        
$m self::profile_url($likeThis[0][0], $likeThis[0][1]).', '.self::profile_url($likeThis[1][0], $likeThis[1][1]).', '.self::profile_url($likeThis[2][0], $likeThis[2][1]).' '.$lang->and.' '.($count_likeThis-3).' '.$lang->others_person_like_it;
                        break;
                }
                return 
'<span class=\"liked_this\">'.$m.'</span>';
            }
        }
    }

    private static function 
profile_url($uid$username)
    {
        return 
'<a href=\"'.$mybb->settings['bburl'].get_profile_link($uid).'\">'.$username.'</a>';
    }

    private static function 
adduser_permissions()
    {
        global 
$mybb;

        if(
$mybb->usergroup['canview'] != || $mybb->usergroup['cangivereputations'] != 1)
        {
            return 
false;
        }

        return 
true;
    }

    private static function 
getuser_permissions($post)
    {
        global 
$mybb$db;

        if(!
is_array($post))
        {
            
$get_post $db->simple_select('posts''*''pid='.$post);
            
$post $db->fetch_array($get_post);
        }

        
$user get_user($post['uid']);
        
$user_permissions user_permissions($uid);

        if(
$post)
        {
            
$thread get_thread($post['tid']);
            
$forum get_forum($thread['fid']);
            
$forumpermissions forum_permissions($forum['fid']);

            if((
$post['visible'] == && !is_moderator($forum['fid'], "canviewunapprove")) || $post['visible'] < 0)
            {
                
$permissions false;
            }
            elseif((
$thread['visible'] == && !is_moderator($forum['fid'], "canviewunapprove")) || $thread['visible'] < 0)
            {
                
$permissions false;
            }
            elseif(
$forumpermissions['canview'] == || $forumpermissions['canpostreplys'] == || $mybb->user['suspendposting'] == 1)
            {
                
$permissions false;
            }
            elseif(isset(
$forumpermissions['canonlyviewownthreads']) && $forumpermissions['canonlyviewownthreads'] == && $thread['uid'] != $mybb->user['uid'])
            {
                
$permissions false;
            }
            else
            {
                
$permissions true;
            }
        }
        else
        {
            
$permissions false;
        }

        if(
$user_permissions['usereputationsystem'] != || !$user || !$permissions)
        {
            return 
false;
        }

        return 
true;
    }



To co podalem wczesniej, bez ujemnych