Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so dont bother with any of their useless mail servers here and just use oauth login instead. Thank the nice Russians for causing that. :)
Paste
Pasted as PHP by registered user atmaca ( 3 months ago )
<?php
// ft_react.php - Tepki ekleme / değiştirme / kaldırma (vB 3.8.x + vBSEO likes tabanlı)
// Geliştirme: atmaca
define('THIS_SCRIPT', 'ft_react');
// JSON bozulmasın diye mümkün olduğunca erken buffer başlat
if (!headers_sent()) {
@ob_start();
}
require_once('./global.php');
global $vbulletin;
function ft_json_exit($payload)
{
// Eğer bir şeyler çıktıysa JSON'dan önce temizle
if (function_exists('ob_get_length') && ob_get_length()) {
@ob_clean();
}
header('Content-Type: application/json; charset=utf-8');
echo json_encode($payload);
exit;
}
function ft_to_utf8($str)
{
if ($str === '' || $str === null) {
return '';
}
if (preg_match('//u', $str)) {
return $str;
}
$tmp = @iconv('ISO-8859-9', 'UTF-8//IGNORE', $str);
if ($tmp !== false) {
return $tmp;
}
$tmp = @iconv('ISO-8859-1', 'UTF-8//IGNORE', $str);
if ($tmp !== false) {
return $tmp;
}
return $str;
}
/**
* Tepki config'ini yükle.
*/
function ft_load_reactions()
{
$reactions = array();
$config = dirname(__FILE__) . '/ft_reactions_config.php';
if (file_exists($config)) {
$ft_reactions = array();
include($config);
if (isset($ft_reactions) && is_array($ft_reactions)) {
foreach ($ft_reactions as $rid => $info) {
$rid = intval($rid);
if ($rid <= 0) { continue; }
if (!is_array($info)) { continue; }
if (empty($info['file'])) { continue; }
$reactions[$rid] = array(
'file' => (string)$info['file'],
'alt' => isset($info['alt']) ? (string)$info['alt'] : '',
);
}
}
}
// Fallback: config yoksa en azından boş dönme
if (!$reactions) {
$reactions = array(
1 => array('file'=>'like.png','alt'=>'Beğen'),
2 => array('file'=>'heart.png','alt'=>'Muhteşem'),
3 => array('file'=>'haha.png','alt'=>'Hahaha'),
4 => array('file'=>'wow.png','alt'=>'Şaşkın'),
5 => array('file'=>'sad.png','alt'=>'Üzgün'),
6 => array('file'=>'sad2.png','alt'=>'Üzüntülü'),
7 => array('file'=>'angry.png','alt'=>'Kızgın'),
8 => array('file'=>'care.png','alt'=>'Yanındayım'),
9 => array('file'=>'dislike.png','alt'=>'Beğenmedim'),
10 => array('file'=>'cool.png','alt'=>'Havalı'),
11 => array('file'=>'100.png','alt'=>'Kesinlikle'),
12 => array('file'=>'thinking.png','alt'=>'Düşünceli'),
13 => array('file'=>'brokenheart.png','alt'=>'Kalbi Kırılmış'),
14 => array('file'=>'cursing.png','alt'=>'Çok Tepkili'),
15 => array('file'=>'explodinghead.png','alt'=>'Beyni Yanmış'),
16 => array('file'=>'party.png','alt'=>'Parti'),
17 => array('file'=>'clap.png','alt'=>'Alkış'),
18 => array('file'=>'hearteyes.png','alt'=>'Kalpli Göz'),
19 => array('file'=>'smilingfacewithheart.png','alt'=>'Sevgi Dolu'),
20 => array('file'=>'coldface.png','alt'=>'Üşüyen Yüz'),
);
}
return $reactions;
}
function ft_verify_token($request_token, $vbulletin)
{
$request_token = trim((string)$request_token);
if ($request_token === '') {
return false;
}
$raw = '';
if (!empty($vbulletin->userinfo['securitytoken_raw'])) {
$raw = $vbulletin->userinfo['securitytoken_raw'];
} else {
$raw = (string)$vbulletin->userinfo['securitytoken'];
if (strpos($raw, '-') !== false) {
$parts = explode('-', $raw, 2);
$raw = isset($parts[1]) ? $parts[1] : $raw;
}
}
if (function_exists('verify_security_token') && $raw !== '') {
return (bool) verify_security_token($request_token, $raw);
}
if ($raw !== '' && strpos($request_token, '-') !== false) {
$parts = explode('-', $request_token, 2);
$hash = isset($parts[1]) ? $parts[1] : '';
return ($hash !== '' && function_exists('hash_equals') ? hash_equals($raw, $hash) : ($raw === $hash));
}
return false;
}
function ft_vbseo_like_counter_user($from_userid, $dest_userid, $dn)
{
global $vbulletin;
$from_userid = intval($from_userid);
$dest_userid = intval($dest_userid);
$dn = intval($dn);
if ($from_userid <= 0 || $dest_userid <= 0 || $dn == 0) {
return;
}
if (!class_exists('vBSEO_UI')) {
$vbseo_ui_file = DIR . '/vbseo/includes/functions_vbseo_ui.php';
if (file_exists($vbseo_ui_file)) {
require_once($vbseo_ui_file);
}
}
if (class_exists('vBSEO_UI') && method_exists('vBSEO_UI', 'like_counter_user')) {
@vBSEO_UI::like_counter_user($from_userid, $dest_userid, $dn);
return;
}
$abs = abs($dn);
if ($dn > 0) {
$vbulletin->db->query_write("
UPDATE " . TABLE_PREFIX . "user
SET vbseo_likes_out = vbseo_likes_out + $dn
WHERE userid = $from_userid
");
$vbulletin->db->query_write("
UPDATE " . TABLE_PREFIX . "user
SET vbseo_likes_in = vbseo_likes_in + $dn,
vbseo_likes_unread = vbseo_likes_unread + $dn
WHERE userid = $dest_userid
");
} else {
$vbulletin->db->query_write("
UPDATE " . TABLE_PREFIX . "user
SET vbseo_likes_out = IF(vbseo_likes_out < $abs, 0, vbseo_likes_out - $abs)
WHERE userid = $from_userid
");
$vbulletin->db->query_write("
UPDATE " . TABLE_PREFIX . "user
SET vbseo_likes_in = IF(vbseo_likes_in < $abs, 0, vbseo_likes_in - $abs)
WHERE userid = $dest_userid
");
}
}
// -------------------------
// 1) Giriş kontrolü
// -------------------------
$userid = intval($vbulletin->userinfo['userid']);
if (!$userid) {
ft_json_exit(array('success' => false, 'error' => 'not_logged_in'));
}
// -------------------------
// 2) Parametreleri al
// -------------------------
$vbulletin->input->clean_array_gpc('p', array(
'type' => TYPE_STR,
'ctype' => TYPE_STR,
'postid' => TYPE_UINT,
'contentid' => TYPE_UINT,
'reactionid' => TYPE_UINT,
'securitytoken' => TYPE_STR,
));
$type = $vbulletin->GPC['type'] ? $vbulletin->GPC['type'] : $vbulletin->GPC['ctype'];
$postid = intval($vbulletin->GPC['postid'] ? $vbulletin->GPC['postid'] : $vbulletin->GPC['contentid']);
$reactionid = intval($vbulletin->GPC['reactionid']);
$token = $vbulletin->GPC['securitytoken'];
if ($type !== 'post') {
ft_json_exit(array('success' => false, 'error' => 'invalid_type'));
}
if (!$postid || !$reactionid) {
ft_json_exit(array('success' => false, 'error' => 'invalid_params'));
}
// -------------------------
// 3) Token doğrula
// -------------------------
if (!ft_verify_token($token, $vbulletin)) {
ft_json_exit(array('success' => false, 'error' => 'bad_token'));
}
// -------------------------
// 4) Tepki ID geçerli mi? (config'ten)
// -------------------------
$reactions = ft_load_reactions();
if (!isset($reactions[$reactionid])) {
ft_json_exit(array('success' => false, 'error' => 'invalid_reaction'));
}
// -------------------------
// 5) Gönderi var mı / sahibi kim?
// -------------------------
$post = $vbulletin->db->query_first("
SELECT userid
FROM " . TABLE_PREFIX . "post
WHERE postid = $postid
LIMIT 1
");
if (!$post) {
ft_json_exit(array('success' => false, 'error' => 'invalid_post'));
}
$dest_userid = intval($post['userid']);
if ($dest_userid && $dest_userid == $userid) {
ft_json_exit(array('success' => false, 'error' => 'own_post'));
}
$now = TIMENOW;
$username = $vbulletin->userinfo['username'];
// -------------------------
// 6) Kullanıcının mevcut tepkisi var mı?
// -------------------------
$existing = $vbulletin->db->query_first("
SELECT reactionid
FROM vbseo_likes
WHERE l_contentid = $postid
AND l_ctype = 1
AND l_cgroup = 0
AND l_from_userid = $userid
LIMIT 1
");
// Aynı tepkiye tekrar basarsa -> kaldır
if ($existing && intval($existing['reactionid']) === $reactionid) {
$vbulletin->db->query_write("
DELETE FROM vbseo_likes
WHERE l_contentid = $postid
AND l_ctype = 1
AND l_cgroup = 0
AND l_from_userid = $userid
LIMIT 1
");
// vBSEO sayaçlarını güncelle
if ($dest_userid) {
$dn = 0;
if (method_exists($vbulletin->db, 'affected_rows')) {
$dn = intval($vbulletin->db->affected_rows());
} else {
$dn = 1;
}
if ($dn > 0) {
ft_vbseo_like_counter_user($userid, $dest_userid, -$dn);
}
}
ft_json_exit(array(
'success' => true,
'removed' => true,
'user_reactionid' => 0,
));
}
if ($existing) {
$vbulletin->db->query_write("
UPDATE vbseo_likes
SET reactionid = $reactionid,
l_dateline = $now
WHERE l_contentid = $postid
AND l_ctype = 1
AND l_cgroup = 0
AND l_from_userid = $userid
LIMIT 1
");
} else {
$vbulletin->db->query_write("
INSERT INTO vbseo_likes
(l_contentid, l_ctype, l_cgroup,
l_from_userid, l_from_username,
l_dest_userid, l_dateline, reactionid)
VALUES
($postid, 1, 0,
$userid, '" . $vbulletin->db->escape_string($username) . "',
$dest_userid, $now, $reactionid)
");
if ($dest_userid) {
ft_vbseo_like_counter_user($userid, $dest_userid, 1);
}
}
ft_json_exit(array(
'success' => true,
'removed' => false,
'user_reactionid' => $reactionid,
));
Revise this Paste