<?php
define(&#039;THIS_SCRIPT&#039;, &#039;ft_story_json&#039;);
require_once(&#039;./global.php&#039;);

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

/* 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, &#039;utf-8&#039;))
		{
			return $mixed;
		}
		if (function_exists(&#039;mb_convert_encoding&#039;))
		{
			return @mb_convert_encoding($mixed, &#039;UTF-8&#039;, $fromCharset);
		}

		return utf8_encode($mixed);
	}

	return $mixed;
}

function ft_json_exit($arr)
{
	global $stylevar;

	$fromCharset = &#039;UTF-8&#039;;
	if (!empty($stylevar[&#039;charset&#039;]))
	{
		$fromCharset = $stylevar[&#039;charset&#039;];
	}

	$json = json_encode($arr, JSON_UNESCAPED_UNICODE);
	if ($json === false)
	{
		$arr  = ft_utf8ize($arr, $fromCharset);
		$json = json_encode($arr, JSON_UNESCAPED_UNICODE);
	}

	if (function_exists(&#039;ob_get_length&#039;) && ob_get_length())
	{
		@ob_clean();
	}

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

	if ($json === false)
	{
		echo json_encode(array(
			&#039;ok&#039;    => 0,
			&#039;error&#039; => &#039;json_encode_failed&#039;,
			&#039;code&#039;  => 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[&#039;buddylist&#039;]))
	{
		$parts = preg_split(&#039;/[\s,]+/&#039;, trim($row[&#039;buddylist&#039;]));
		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, &#039;yt:&#039;) !== 0) return &#039;&#039;;

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


$vbulletin->input->clean_array_gpc(&#039;g&#039;, array(
	&#039;u&#039; => TYPE_UINT,
));

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

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

$now = TIMENOW;

$stories  = array();
$username = &#039;&#039;;
$avatar   = &#039;&#039;;

// JSON endpoint için utf8mb4 bağlantı
$db->query_write("SET NAMES utf8mb4");

// (isteğe bağlı ama iyi) doğru header
header(&#039;Content-Type: application/json; charset=UTF-8&#039;);

$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[&#039;userid&#039;], $viewerid, $r[&#039;visibility&#039;]))
	{
		continue;
	}

	$username = $r[&#039;username&#039;];

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

	$mediatype = intval($r[&#039;mediatype&#039;]);
	$filepath  = (string)$r[&#039;filepath&#039;];

	$item = array(
		&#039;storyid&#039;    => intval($r[&#039;storyid&#039;]),
		&#039;dateline&#039;   => intval($r[&#039;dateline&#039;]),
		&#039;visibility&#039; => intval($r[&#039;visibility&#039;]),
		&#039;mediatype&#039;  => $mediatype, // 1=image, 2=video, 4=youtube
		&#039;url&#039;        => $filepath,
		&#039;ownerid&#039;    => intval($r[&#039;userid&#039;]),
	);

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

	// Görsel/Video için boş filepath gelirse atla
	if (($mediatype === 1 || $mediatype === 2) && trim($filepath) === &#039;&#039;)
	{
		continue;
	}
// Text story (mediatype=3)
if ($mediatype === 3)
{
  $item[&#039;text_body&#039;] = (string)$r[&#039;ft_text_body&#039;];
  $item[&#039;bg_id&#039;]     = intval($r[&#039;ft_bg_id&#039;]);

  // metin boşsa hiç gönderme (boş siyah ekran olmasın)
  if (trim($item[&#039;text_body&#039;]) === &#039;&#039;)
  {
    continue;
  }
}
	$stories[] = $item;
}

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

ft_json_exit(array(
	&#039;ok&#039;       => 1,
	&#039;userid&#039;   => $target_userid,
	&#039;ownerid&#039;  => $target_userid,
	&#039;username&#039; => $username,
	&#039;avatar&#039;   => $avatar,
	&#039;stories&#039;  => $stories
));

Add a code snippet to your website: www.paste.org