Welcome, guest! Login / Register - Why register?
Psst.. new poll here.
Psst.. new forums here.

Paste

Pasted as PHP by registered user atmaca ( 1 month ago )
<?php
define('THIS_SCRIPT', 'ft_story_json');
require_once('./global.php');

/* DB handle garanti */
if (!isset($db) || !is_object($db))
{
	$db =& $vbulletin->db;
}
$db->query_write("SET NAMES utf8mb4");

/* JSON helper (charset sorunlarına karşı) */
function ft_utf8ize($mixed, $fromCharset)
{
	if (is_array($mixed))
	{
		foreach ($mixed as $k => $v)
		{
			$mixed[$k] = ft_utf8ize($v, $fromCharset);
		}
		return $mixed;
	}
	if (is_string($mixed))
	{
		if (!strcasecmp($fromCharset, 'utf-8'))
		{
			return $mixed;
		}
		if (function_exists('mb_convert_encoding'))
		{
			return @mb_convert_encoding($mixed, 'UTF-8', $fromCharset);
		}

		return utf8_encode($mixed);
	}

	return $mixed;
}

function ft_json_exit($arr)
{
	if (function_exists('ob_get_length') && ob_get_length())
	{
		@ob_clean();
	}

	header('Content-Type: application/json; charset=UTF-8');
	header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
	header('Pragma: no-cache');

	$json = json_encode($arr, JSON_UNESCAPED_UNICODE);

	if ($json === false)
	{
		echo json_encode(array(
			'ok'    => 0,
			'error' => 'json_encode_failed',
			'code'  => json_last_error()
		));
		exit;
	}

	echo $json;
	exit;
}

/*
  Visibility:
  1 = Forum Üyeleri
  3 = Sadece Arkadaşlar
*/

function ft_story_get_buddy_ids($userid)
{
	global $db;

	static $cache = array();
	$userid = intval($userid);

	if ($userid < 1)
	{
		return array();
	}
	if (isset($cache[$userid]))
	{
		return $cache[$userid];
	}

	$row = $db->query_first("
		SELECT buddylist
		FROM usertextfield
		WHERE userid = $userid
	");

	$list = array();
	if (!empty($row['buddylist']))
	{
		$parts = preg_split('/[\s,]+/', trim($row['buddylist']));
		if (is_array($parts))
		{
			foreach ($parts as $id)
			{
				$id = intval($id);
				if ($id > 0)
				{
					$list[$id] = 1;
				}
			}
		}
	}

	$cache[$userid] = $list;
	return $list;
}

function ft_is_on_buddy_list($userid, $buddyid)
{
	$userid  = intval($userid);
	$buddyid = intval($buddyid);

	if ($userid < 1 || $buddyid < 1)
	{
		return false;
	}

	$list = ft_story_get_buddy_ids($userid);
	return !empty($list[$buddyid]);
}

function ft_are_mutual_friends($userA, $userB)
{
	$userA = intval($userA);
	$userB = intval($userB);

	if ($userA < 1 || $userB < 1 || $userA == $userB)
	{
		return false;
	}

	return (ft_is_on_buddy_list($userA, $userB) && ft_is_on_buddy_list($userB, $userA));
}

function ft_can_view_story_visibility($ownerid, $viewerid, $visibility)
{
	$ownerid    = intval($ownerid);
	$viewerid   = intval($viewerid);
	$visibility = intval($visibility);

	// Misafir görmesin
	if ($viewerid < 1)
	{
		return false;
	}

	// Sahibi her zaman görsün
	if ($ownerid == $viewerid)
	{
		return true;
	}

	if ($visibility == 1)
	{
		return true;
	}

	if ($visibility == 3)
	{
		return ft_are_mutual_friends($ownerid, $viewerid);
	}

	return false;
}

/* YouTube: filepath "yt:VIDEOID" -> VIDEOID */
function ft_extract_youtube_id($filepath)
{
	$filepath = trim((string)$filepath);
	if (strpos($filepath, 'yt:') !== 0)
	{
		return '';
	}

	$id = trim(substr($filepath, 3));
	return (preg_match('~^[A-Za-z0-9_-]{11}$~', $id) ? $id : '');
}

/* Reaction helpers */
function ft_story_get_valid_reactions()
{
	return array(
		'like'    => '????',
		'dislike' => '????',
		'love'    => '❤️',
		'laugh'   => '????',
		'wow'     => '????',
		'sad'     => '????',
		'angry'   => '????'
	);
}

function ft_story_empty_reaction_counts()
{
	return array(
		'like'    => 0,
		'dislike' => 0,
		'love'    => 0,
		'laugh'   => 0,
		'wow'     => 0,
		'sad'     => 0,
		'angry'   => 0
	);
}

function ft_story_fetch_reaction_summary_map($storyids)
{
	global $db;

	$map = array();

	if (!is_array($storyids) || empty($storyids))
	{
		return $map;
	}

	$clean_ids = array();
	foreach ($storyids as $storyid)
	{
		$storyid = intval($storyid);
		if ($storyid > 0)
		{
			$clean_ids[$storyid] = $storyid;
			$map[$storyid] = array(
				'total'  => 0,
				'counts' => ft_story_empty_reaction_counts()
			);
		}
	}

	if (empty($clean_ids))
	{
		return $map;
	}

	$idlist = implode(',', $clean_ids);

	$res = $db->query_read("
		SELECT storyid, reaction, COUNT(*) AS cnt
		FROM ft_story_reaction
		WHERE storyid IN ($idlist)
		GROUP BY storyid, reaction
	");

	while ($row = $db->fetch_array($res))
	{
		$storyid  = intval($row['storyid']);
		$reaction = trim((string)$row['reaction']);
		$cnt      = intval($row['cnt']);

		if (!isset($map[$storyid]))
		{
			$map[$storyid] = array(
				'total'  => 0,
				'counts' => ft_story_empty_reaction_counts()
			);
		}

		if (isset($map[$storyid]['counts'][$reaction]))
		{
			$map[$storyid]['counts'][$reaction] = $cnt;
			$map[$storyid]['total'] += $cnt;
		}
	}

	return $map;
}

function ft_story_fetch_user_reaction_map($storyids, $userid)
{
	global $db;

	$map    = array();
	$userid = intval($userid);

	if ($userid < 1 || !is_array($storyids) || empty($storyids))
	{
		return $map;
	}

	$clean_ids = array();
	foreach ($storyids as $storyid)
	{
		$storyid = intval($storyid);
		if ($storyid > 0)
		{
			$clean_ids[$storyid] = $storyid;
		}
	}

	if (empty($clean_ids))
	{
		return $map;
	}

	$idlist = implode(',', $clean_ids);

	$res = $db->query_read("
		SELECT storyid, reaction
		FROM ft_story_reaction
		WHERE userid = $userid
		  AND storyid IN ($idlist)
	");

	while ($row = $db->fetch_array($res))
	{
		$map[intval($row['storyid'])] = trim((string)$row['reaction']);
	}

	return $map;
}

$vbulletin->input->clean_array_gpc('g', array(
	'u' => TYPE_UINT,
));

$target_userid = intval($vbulletin->GPC['u']);
if ($target_userid <= 0)
{
	ft_json_exit(array('ok' => 0, 'error' => 'invalid_user'));
}

$viewerid = intval($vbulletin->userinfo['userid']);
if ($viewerid < 1)
{
	ft_json_exit(array('ok' => 0, 'error' => 'not_logged_in'));
}

$now = TIMENOW;

$stories   = array();
$storyids  = array();
$username  = '';
$avatar    = '';

$res = $db->query_read("
	SELECT
		s.storyid, s.userid, s.visibility, s.dateline,
		m.filepath,
		m.mediatype,
		u.username, u.avatarrevision, u.avatarid,
		a.avatarpath,
		t.text_body AS ft_text_body,
		t.bg_id     AS ft_bg_id
	FROM ft_story AS s
	INNER JOIN user AS u ON (u.userid = s.userid)
	INNER JOIN ft_story_media AS m ON (m.storyid = s.storyid)
	LEFT JOIN avatar AS a ON (a.avatarid = u.avatarid)
	LEFT JOIN ft_story_text AS t ON (t.storyid = s.storyid)
	WHERE s.userid = $target_userid
	  AND s.state = 1
	  AND s.expiretime > $now
	ORDER BY s.dateline ASC
");

while ($r = $db->fetch_array($res))
{
	if (!ft_can_view_story_visibility($r['userid'], $viewerid, $r['visibility']))
	{
		continue;
	}

	$username = $r['username'];

	// Avatar 1 kere set
	if (!$avatar)
	{
		if (!empty($r['avatarpath']))
		{
			$avatar = $r['avatarpath'];
		}
		else
		{
			$avatar = 'image.php?u=' . $target_userid . '&dateline=' . intval($r['avatarrevision']);
		}
	}

	$mediatype = intval($r['mediatype']);
	$filepath  = (string)$r['filepath'];

	$item = array(
		'storyid'         => intval($r['storyid']),
		'userid'          => intval($r['userid']),
		'ownerid'         => intval($r['userid']),
		'dateline'        => intval($r['dateline']),
		'visibility'      => intval($r['visibility']),
		'mediatype'       => $mediatype, // 1=image, 2=video, 3=text, 4=youtube
		'url'             => $filepath,
		'is_owner'        => ($viewerid == intval($r['userid']) ? 1 : 0),
		'user_reaction'   => '',
		'reaction_total'  => 0,
		'reaction_counts' => ft_story_empty_reaction_counts()
	);

	// YouTube (mediatype=4)
	if ($mediatype === 4)
	{
		$ytid = ft_extract_youtube_id($filepath);
		if ($ytid === '')
		{
			// bozuk kayıt: atla
			continue;
		}
		$item['youtube_id'] = $ytid;
	}

	// Görsel/Video için boş filepath gelirse atla
	if (($mediatype === 1 || $mediatype === 2) && trim($filepath) === '')
	{
		continue;
	}

	// Text story (mediatype=3)
	if ($mediatype === 3)
	{
		$item['text_body'] = (string)$r['ft_text_body'];
		$item['bg_id']     = intval($r['ft_bg_id']);

		// metin boşsa hiç gönderme
		if (trim($item['text_body']) === '')
		{
			continue;
		}
	}

	$stories[]  = $item;
	$storyids[] = intval($r['storyid']);
}

if (empty($stories))
{
	ft_json_exit(array('ok' => 0, 'error' => 'no_visible_stories'));
}

/* Reaction alanlarını doldur */
$reaction_summary_map = ft_story_fetch_reaction_summary_map($storyids);
$user_reaction_map    = ft_story_fetch_user_reaction_map($storyids, $viewerid);

foreach ($stories as $k => $story)
{
	$storyid = intval($story['storyid']);

	if (isset($user_reaction_map[$storyid]))
	{
		$stories[$k]['user_reaction'] = $user_reaction_map[$storyid];
	}

	if (isset($reaction_summary_map[$storyid]))
	{
		$stories[$k]['reaction_total']  = intval($reaction_summary_map[$storyid]['total']);
		$stories[$k]['reaction_counts'] = $reaction_summary_map[$storyid]['counts'];
	}
}

ft_json_exit(array(
	'ok'            => 1,
	'userid'        => $target_userid,
	'ownerid'       => $target_userid,
	'username'      => $username,
	'avatar'        => $avatar,
	'securitytoken' => (isset($vbulletin->userinfo['securitytoken']) ? $vbulletin->userinfo['securitytoken'] : ''),
	'stories'       => $stories,
	));

 

Revise this Paste

Your Name: Code Language: