2010-07-20 01:52:31 -04:00
< ? php
2011-07-25 10:54:39 -04:00
require_once ( " include/datetime.php " );
2015-04-30 00:11:05 -04:00
require_once ( 'include/bbcode.php' );
2016-02-04 08:51:54 -05:00
require_once ( 'include/ForumManager.php' );
2015-12-03 16:42:53 -05:00
require_once ( 'include/group.php' );
2016-11-16 23:26:43 -05:00
require_once ( 'mod/proxy.php' );
2016-08-10 16:51:03 -04:00
require_once ( 'include/xml.php' );
2010-07-20 01:52:31 -04:00
function ping_init ( & $a ) {
2016-11-16 23:26:43 -05:00
$format = 'xml' ;
if ( isset ( $_GET [ 'format' ]) && $_GET [ 'format' ] == 'json' ) {
$format = 'json' ;
}
2016-08-11 02:44:03 -04:00
2016-08-10 16:51:03 -04:00
if ( local_user ()){
2015-04-26 07:25:04 -04:00
// Different login session than the page that is calling us.
2016-08-10 16:51:03 -04:00
if ( intval ( $_GET [ 'uid' ]) && intval ( $_GET [ 'uid' ]) != local_user ()) {
2016-11-16 23:26:43 -05:00
$data = array ( 'result' => array ( 'invalid' => 1 ));
if ( $format == 'json' ) {
if ( isset ( $_GET [ 'callback' ])) {
// JSONP support
header ( " Content-type: application/javascript " );
echo $_GET [ 'callback' ] . '(' . json_encode ( $data ) . ')' ;
} else {
header ( " Content-type: application/json " );
echo json_encode ( $data );
}
} else {
header ( " Content-type: text/xml " );
echo xml :: from_array ( $data , $xml );
}
2012-05-22 19:01:07 -04:00
killme ();
}
2015-06-25 04:02:26 -04:00
$notifs = ping_get_notifications ( local_user ());
2015-04-22 02:39:27 -04:00
$sysnotify = 0 ; // we will update this in a moment
2016-11-16 23:26:43 -05:00
$tags = array ();
2011-09-28 03:30:22 -04:00
$comments = array ();
2016-11-16 23:26:43 -05:00
$likes = array ();
2011-09-28 03:30:22 -04:00
$dislikes = array ();
2016-11-16 23:26:43 -05:00
$friends = array ();
$posts = array ();
$regs = array ();
$mails = array ();
2012-09-18 20:43:09 -04:00
2012-02-26 15:40:41 -05:00
$home = 0 ;
$network = 0 ;
2015-12-03 11:15:49 -05:00
$groups_unseen = array ();
2015-11-24 16:14:26 -05:00
$forums_unseen = array ();
2011-11-30 20:08:16 -05:00
2014-07-26 09:01:01 -04:00
$r = q ( " SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`wall`, `item`.`author-name`,
`item` . `contact-id` , `item` . `author-link` , `item` . `author-avatar` , `item` . `created` , `item` . `object` ,
`pitem` . `author-name` as `pname` , `pitem` . `author-link` as `plink`
2011-09-28 03:30:22 -04:00
FROM `item` INNER JOIN `item` as `pitem` ON `pitem` . `id` = `item` . `parent`
2014-07-26 09:01:01 -04:00
WHERE `item` . `unseen` = 1 AND `item` . `visible` = 1 AND
2012-10-10 19:17:40 -04:00
`item` . `deleted` = 0 AND `item` . `uid` = % d AND `pitem` . `parent` != 0
2015-11-22 06:28:39 -05:00
AND `item` . `contact-id` != % d
2011-11-30 20:08:16 -05:00
ORDER BY `item` . `created` DESC " ,
2015-11-22 06:28:39 -05:00
intval ( local_user ()), intval ( local_user ())
2011-09-28 03:30:22 -04:00
);
2010-07-20 01:52:31 -04:00
2016-08-10 16:51:03 -04:00
if ( dbm :: is_result ( $r )) {
2012-02-23 19:50:29 -05:00
2012-09-26 07:50:24 -04:00
$arr = array ( 'items' => $r );
call_hooks ( 'network_ping' , $arr );
2012-09-26 07:46:54 -04:00
2012-02-23 19:50:29 -05:00
foreach ( $r as $it ) {
2016-11-16 23:26:43 -05:00
if ( $it [ 'wall' ]) {
$home ++ ;
} else {
$network ++ ;
2012-02-23 19:50:29 -05:00
}
2011-09-28 03:30:22 -04:00
}
2011-08-23 07:52:20 -04:00
}
2016-08-10 16:51:03 -04:00
if ( $network ) {
if ( intval ( feature_enabled ( local_user (), 'groups' ))) {
2015-12-03 11:15:49 -05:00
// Find out how unseen network posts are spread across groups
2016-11-16 23:26:43 -05:00
$group_counts = groups_count_unseen ();
if ( dbm :: is_result ( $group_counts )) {
foreach ( $groups_counts as $group_count ) {
if ( $group_count [ 'count' ] > 0 ) {
$groups_unseen [] = $group_count ;
}
}
}
2015-12-03 11:15:49 -05:00
}
2015-11-24 16:14:26 -05:00
2016-08-10 16:51:03 -04:00
if ( intval ( feature_enabled ( local_user (), 'forumlist_widget' ))) {
2016-11-16 23:26:43 -05:00
$forum_counts = ForumManager :: count_unseen_items ();
if ( dbm :: is_result ( $forums_counts )) {
foreach ( $forums_counts as $forum_count ) {
if ( $forum_count [ 'count' ] > 0 ) {
$forums_unseen [] = $forum_count ;
}
}
}
2015-11-24 16:14:26 -05:00
}
2015-11-08 09:33:12 -05:00
}
2014-07-26 09:01:01 -04:00
$intros1 = q ( " SELECT `intro`.`id`, `intro`.`datetime`,
`fcontact` . `name` , `fcontact` . `url` , `fcontact` . `photo`
2011-09-28 03:30:22 -04:00
FROM `intro` LEFT JOIN `fcontact` ON `intro` . `fid` = `fcontact` . `id`
WHERE `intro` . `uid` = % d AND `intro` . `blocked` = 0 AND `intro` . `ignore` = 0 AND `intro` . `fid` != 0 " ,
intval ( local_user ())
);
2014-07-26 09:01:01 -04:00
$intros2 = q ( " SELECT `intro`.`id`, `intro`.`datetime`,
`contact` . `name` , `contact` . `url` , `contact` . `photo`
2011-09-28 03:30:22 -04:00
FROM `intro` LEFT JOIN `contact` ON `intro` . `contact-id` = `contact` . `id`
WHERE `intro` . `uid` = % d AND `intro` . `blocked` = 0 AND `intro` . `ignore` = 0 AND `intro` . `contact-id` != 0 " ,
intval ( local_user ())
);
2014-02-16 11:36:52 -05:00
2012-02-20 14:21:34 -05:00
$intro = count ( $intros1 ) + count ( $intros2 );
2011-09-28 03:30:22 -04:00
$intros = $intros1 + $intros2 ;
$myurl = $a -> get_baseurl () . '/profile/' . $a -> user [ 'nickname' ] ;
2015-04-23 02:37:31 -04:00
$mails = q ( " SELECT * FROM `mail`
2011-09-28 03:30:22 -04:00
WHERE `uid` = % d AND `seen` = 0 AND `from-url` != '%s' " ,
intval ( local_user ()),
dbesc ( $myurl )
);
2016-11-16 23:26:43 -05:00
$mail_count = count ( $mails );
2014-02-16 11:36:52 -05:00
2012-01-04 21:03:09 -05:00
if ( $a -> config [ 'register_policy' ] == REGISTER_APPROVE && is_site_admin ()){
$regs = q ( " SELECT `contact`.`name`, `contact`.`url`, `contact`.`micro`, `register`.`created`, COUNT(*) as `total` FROM `contact` RIGHT JOIN `register` ON `register`.`uid`=`contact`.`uid` WHERE `contact`.`self`=1 " );
2016-11-16 23:26:43 -05:00
if ( $regs ) {
2012-02-23 19:50:29 -05:00
$register = $regs [ 0 ][ 'total' ];
2016-11-16 23:26:43 -05:00
}
2011-09-28 03:30:22 -04:00
} else {
2016-11-16 23:26:43 -05:00
$register = 0 ;
2011-09-28 03:30:22 -04:00
}
2011-08-17 15:59:06 -04:00
2012-09-18 20:43:09 -04:00
$all_events = 0 ;
$all_events_today = 0 ;
$events = 0 ;
$events_today = 0 ;
$birthdays = 0 ;
$birthdays_today = 0 ;
$ev = q ( " SELECT count(`event`.`id`) as total, type, start, adjust FROM `event`
WHERE `event` . `uid` = % d AND `start` < '%s' AND `finish` > '%s' and `ignore` = 0
ORDER BY `start` ASC " ,
intval ( local_user ()),
dbesc ( datetime_convert ( 'UTC' , 'UTC' , 'now + 7 days' )),
dbesc ( datetime_convert ( 'UTC' , 'UTC' , 'now' ))
);
2016-08-10 16:51:03 -04:00
if ( dbm :: is_result ( $ev )) {
2012-09-18 20:43:09 -04:00
$all_events = intval ( $ev [ 0 ][ 'total' ]);
2016-08-10 16:51:03 -04:00
if ( $all_events ) {
2012-09-18 20:43:09 -04:00
$str_now = datetime_convert ( 'UTC' , $a -> timezone , 'now' , 'Y-m-d' );
foreach ( $ev as $x ) {
$bd = false ;
2016-08-10 16:51:03 -04:00
if ( $x [ 'type' ] === 'birthday' ) {
2012-09-18 20:43:09 -04:00
$birthdays ++ ;
$bd = true ;
}
else {
$events ++ ;
}
2016-08-10 16:51:03 -04:00
if ( datetime_convert ( 'UTC' ,(( intval ( $x [ 'adjust' ])) ? $a -> timezone : 'UTC' ), $x [ 'start' ], 'Y-m-d' ) === $str_now ) {
2012-09-18 20:43:09 -04:00
$all_events_today ++ ;
2016-08-10 16:51:03 -04:00
if ( $bd )
2012-09-18 20:43:09 -04:00
$birthdays_today ++ ;
else
$events_today ++ ;
}
}
}
}
2016-11-16 23:26:43 -05:00
$data = array ();
$data [ 'intro' ] = $intro ;
$data [ 'mail' ] = $mail_count ;
$data [ 'net' ] = $network ;
$data [ 'home' ] = $home ;
$data [ 'register' ] = $register ;
2014-02-16 11:36:52 -05:00
2016-11-16 23:26:43 -05:00
$data [ 'all-events' ] = $all_events ;
$data [ 'all-events-today' ] = $all_events_today ;
$data [ 'events' ] = $events ;
$data [ 'events-today' ] = $events_today ;
$data [ 'birthdays' ] = $birthdays ;
$data [ 'birthdays-today' ] = $birthdays_today ;
2015-04-23 02:37:31 -04:00
2016-08-10 16:51:03 -04:00
if ( dbm :: is_result ( $notifs ) && ! $sysnotify ) {
2016-11-16 23:26:43 -05:00
foreach ( $notifs as $notif ) {
if ( $notif [ 'seen' ] == 0 ) {
2015-06-25 04:02:26 -04:00
$sysnotify ++ ;
2016-11-16 23:26:43 -05:00
}
2012-02-21 22:03:55 -05:00
}
}
2015-06-25 04:02:26 -04:00
// merge all notification types in one array
2016-08-10 16:51:03 -04:00
if ( dbm :: is_result ( $intros )) {
2016-11-16 23:26:43 -05:00
foreach ( $intros as $intro ) {
$notif = array (
'href' => $a -> get_baseurl () . '/notifications/intros/' . $intro [ 'id' ],
'name' => $intro [ 'name' ],
'url' => $intro [ 'url' ],
'photo' => $intro [ 'photo' ],
'date' => $intro [ 'datetime' ],
'seen' => false ,
'message' => t ( '{0} wants to be your friend' ),
2015-06-25 04:02:26 -04:00
);
2016-11-16 23:26:43 -05:00
$notifs [] = $notif ;
2012-02-23 19:50:29 -05:00
}
2015-06-25 04:02:26 -04:00
}
2015-11-08 12:02:04 -05:00
2016-08-10 16:51:03 -04:00
if ( dbm :: is_result ( $mails )) {
2016-11-16 23:26:43 -05:00
foreach ( $mails as $mail ) {
$notif = array (
'href' => $a -> get_baseurl () . '/message/' . $mail [ 'id' ],
'name' => $mail [ 'from-name' ],
'url' => $mail [ 'from-url' ],
'photo' => $mail [ 'from-photo' ],
'date' => $mail [ 'created' ],
'seen' => false ,
'message' => t ( '{0} sent you a message' ),
2015-06-25 04:02:26 -04:00
);
2016-11-16 23:26:43 -05:00
$notifs [] = $notif ;
2012-02-23 19:50:29 -05:00
}
2015-06-25 04:02:26 -04:00
}
2015-11-08 12:02:04 -05:00
2016-08-10 16:51:03 -04:00
if ( dbm :: is_result ( $regs )) {
2016-11-16 23:26:43 -05:00
foreach ( $regs as $reg ) {
$notif = array (
'href' => $a -> get_baseurl () . '/admin/users/' ,
'name' => $reg [ 'name' ],
'url' => $reg [ 'url' ],
'photo' => $reg [ 'micro' ],
'date' => $reg [ 'created' ],
'seen' => false ,
'message' => t ( '{0} requested registration' ),
2015-06-25 04:02:26 -04:00
);
2016-11-16 23:26:43 -05:00
$notifs [] = $notif ;
2012-02-23 19:50:29 -05:00
}
2015-06-25 04:02:26 -04:00
}
2016-03-01 08:33:54 -05:00
2015-06-25 04:02:26 -04:00
// sort notifications by $[]['date']
$sort_function = function ( $a , $b ) {
$adate = date ( $a [ 'date' ]);
$bdate = date ( $b [ 'date' ]);
if ( $adate == $bdate ) {
return 0 ;
2012-02-23 19:50:29 -05:00
}
2015-06-25 04:02:26 -04:00
return ( $adate < $bdate ) ? 1 : - 1 ;
};
usort ( $notifs , $sort_function );
2012-02-21 22:03:55 -05:00
2016-08-10 16:51:03 -04:00
if ( dbm :: is_result ( $notifs )) {
2016-11-16 23:26:43 -05:00
// Are the nofications called from the regular process or via the friendica app?
2016-08-10 16:51:03 -04:00
$regularnotifications = ( intval ( $_GET [ 'uid' ]) AND intval ( $_GET [ '_' ]));
2016-11-16 23:26:43 -05:00
foreach ( $notifs as $notif ) {
if ( $a -> is_friendica_app () OR ! $regularnotifications ) {
$notif [ 'message' ] = str_replace ( " { 0} " , $notif [ 'name' ], $notif [ 'message' ]);
}
2016-08-10 16:51:03 -04:00
2016-11-16 23:26:43 -05:00
$contact = get_contact_details_by_url ( $notif [ 'url' ]);
if ( isset ( $contact [ 'micro' ])) {
$notif [ 'photo' ] = proxy_url ( $contact [ 'micro' ], false , PROXY_SIZE_MICRO );
} else {
$notif [ 'photo' ] = proxy_url ( $notif [ 'photo' ], false , PROXY_SIZE_MICRO );
}
2016-08-10 16:51:03 -04:00
2016-11-16 23:26:43 -05:00
$local_time = datetime_convert ( 'UTC' , date_default_timezone_get (), $notif [ 'date' ]);
$notifications [] = array (
'id' => $notif [ 'id' ],
'href' => $notif [ 'href' ],
'name' => $notif [ 'name' ],
'url' => $notif [ 'url' ],
'photo' => $notif [ 'photo' ],
'date' => relative_date ( $notif [ 'date' ]),
'message' => $notif [ 'message' ],
'seen' => $notif [ 'seen' ],
'timestamp' => strtotime ( $local_time )
);
2012-02-23 19:50:29 -05:00
}
2012-01-05 19:47:47 -05:00
}
2011-07-29 10:24:09 -04:00
}
2011-09-28 03:30:22 -04:00
2016-11-16 23:26:43 -05:00
$sysmsgs = array ();
$sysmsgs_info = array ();
2016-08-10 16:51:03 -04:00
2016-11-16 23:26:43 -05:00
if ( x ( $_SESSION , 'sysmsg' )) {
$sysmsgs = $_SESSION [ 'sysmsg' ];
2012-02-23 19:50:29 -05:00
unset ( $_SESSION [ 'sysmsg' ]);
}
2016-08-10 16:51:03 -04:00
2016-11-16 23:26:43 -05:00
if ( x ( $_SESSION , 'sysmsg_info' )) {
$sysmsgs_info = $_SESSION [ 'sysmsg_info' ];
2012-02-23 19:50:29 -05:00
unset ( $_SESSION [ 'sysmsg_info' ]);
}
2015-04-22 02:39:27 -04:00
2016-11-16 23:26:43 -05:00
if ( $format == 'json' ) {
$data [ 'groups' ] = $groups_unseen ;
$data [ 'forums' ] = $forums_unseen ;
$data [ 'notify' ] = $sysnotify + $intro + $mail_count + $register ;
$data [ 'notifications' ] = $notifications ;
$data [ 'sysmsgs' ] = array (
'notice' => $sysmsgs ,
'info' => $sysmsgs_info
);
$json_payload = json_encode ( array ( " result " => $data ));
if ( isset ( $_GET [ 'callback' ])) {
// JSONP support
header ( " Content-type: application/javascript " );
echo $_GET [ 'callback' ] . '(' . $json_payload . ')' ;
} else {
header ( " Content-type: application/json " );
echo $json_payload ;
}
} else {
// Legacy slower XML format output
$data = ping_format_xml_data ( $data , $sysnotify , $notifications , $sysmsgs , $sysmsgs_info , $groups_unseen , $forums_unseen );
header ( " Content-type: text/xml " );
echo xml :: from_array ( array ( " result " => $data ), $xml );
}
2010-07-20 01:52:31 -04:00
killme ();
}
2016-10-28 06:28:16 -04:00
/**
* @ brief Retrieves the notifications array for the given user ID
*
2016-10-28 22:14:51 -04:00
* @ param int $uid User id
* @ return array Associative array of notifications
2016-10-28 06:28:16 -04:00
*/
2015-06-14 19:20:04 -04:00
function ping_get_notifications ( $uid ) {
2015-04-22 02:39:27 -04:00
$result = array ();
$offset = 0 ;
$seen = false ;
$seensql = " NOT " ;
2015-06-24 10:10:06 -04:00
$order = " DESC " ;
2015-04-22 02:39:27 -04:00
$quit = false ;
2015-06-13 14:23:26 -04:00
$a = get_app ();
2015-04-22 02:39:27 -04:00
do {
$r = q ( " SELECT `notify`.*, `item`.`visible`, `item`.`spam`, `item`.`deleted`
FROM `notify` LEFT JOIN `item` ON `item` . `id` = `notify` . `iid`
WHERE `notify` . `uid` = % d AND `notify` . `msg` != ''
2015-04-23 02:37:31 -04:00
AND NOT ( `notify` . `type` IN ( % d , % d ))
2015-04-23 02:59:30 -04:00
AND $seensql `notify` . `seen` ORDER BY `notify` . `date` $order LIMIT % d , 50 " ,
2015-04-23 02:37:31 -04:00
intval ( $uid ),
intval ( NOTIFY_INTRO ),
intval ( NOTIFY_MAIL ),
intval ( $offset )
2015-04-22 02:39:27 -04:00
);
if ( ! $r AND ! $seen ) {
$seen = true ;
$seensql = " " ;
2015-04-23 02:59:30 -04:00
$order = " DESC " ;
2015-04-22 02:39:27 -04:00
$offset = 0 ;
2016-10-28 06:28:16 -04:00
} elseif ( ! $r ) {
2015-04-22 02:39:27 -04:00
$quit = true ;
2016-10-28 06:28:16 -04:00
} else {
2015-04-22 02:39:27 -04:00
$offset += 50 ;
2016-10-28 06:28:16 -04:00
}
2015-04-22 02:39:27 -04:00
foreach ( $r AS $notification ) {
2016-10-28 06:28:16 -04:00
if ( is_null ( $notification [ " visible " ])) {
2015-04-22 02:39:27 -04:00
$notification [ " visible " ] = true ;
2016-10-28 06:28:16 -04:00
}
2015-04-22 02:39:27 -04:00
2016-10-28 06:28:16 -04:00
if ( is_null ( $notification [ " spam " ])) {
2015-04-22 02:39:27 -04:00
$notification [ " spam " ] = 0 ;
2016-10-28 06:28:16 -04:00
}
2015-04-22 02:39:27 -04:00
2016-10-28 06:28:16 -04:00
if ( is_null ( $notification [ " deleted " ])) {
2015-04-22 02:39:27 -04:00
$notification [ " deleted " ] = 0 ;
2016-10-28 06:28:16 -04:00
}
2015-04-22 02:39:27 -04:00
2016-10-28 06:28:16 -04:00
if ( $notification [ " msg_cache " ]) {
$notification [ " name " ] = $notification [ " name_cache " ];
$notification [ " message " ] = $notification [ " msg_cache " ];
} else {
$notification [ " name " ] = strip_tags ( bbcode ( $notification [ " name " ]));
$notification [ " message " ] = format_notification_message ( $notification [ " name " ], strip_tags ( bbcode ( $notification [ " msg " ])));
q ( " UPDATE `notify` SET `name_cache` = '%s', `msg_cache` = '%s' WHERE `id` = %d " ,
dbesc ( $notification [ " name " ]),
dbesc ( $notification [ " message " ]),
intval ( $notification [ " id " ])
);
}
2015-04-23 02:37:31 -04:00
2016-10-28 06:28:16 -04:00
$notification [ " href " ] = $a -> get_baseurl () . " /notify/view/ " . $notification [ " id " ];
2015-11-08 12:02:04 -05:00
2015-04-22 02:39:27 -04:00
if ( $notification [ " visible " ] AND ! $notification [ " spam " ] AND
2015-06-24 10:10:06 -04:00
! $notification [ " deleted " ] AND ! is_array ( $result [ $notification [ " parent " ]])) {
2015-04-22 02:39:27 -04:00
$result [ $notification [ " parent " ]] = $notification ;
2015-06-24 10:10:06 -04:00
}
2015-04-22 02:39:27 -04:00
}
} while (( count ( $result ) < 50 ) AND ! $quit );
return ( $result );
}
2016-11-16 23:26:43 -05:00
/**
* @ brief Backward - compatible XML formatting for ping . php output
* @ deprecated
*
* @ param array $data The initial ping data array
* @ param int $sysnotify Number of unseen system notifications
* @ param array $notifs Complete list of notification
* @ param array $sysmsgs List of system notice messages
* @ param array $sysmsgs_info List of system info messages
* @ return array XML - transform ready data array
*/
function ping_format_xml_data ( $data , $sysnotify , $notifs , $sysmsgs , $sysmsgs_info , $groups_unseen , $forums_unseen ) {
$notifications = array ();
foreach ( $notifs as $key => $n ) {
$notifications [ $key . " :note " ] = $n [ 'message' ];
$notifications [ $key . " :@attributes " ] = array (
" id " => $n [ " id " ],
" href " => $n [ 'href' ],
" name " => $n [ 'name' ],
" url " => $n [ 'url' ],
" photo " => $n [ 'photo' ],
" date " => $n [ 'date' ],
" seen " => $n [ 'seen' ],
" timestamp " => $n [ 'timestamp' ]
);
}
$sysmsg = array ();
foreach ( $sysmsgs as $key => $m ){
$sysmsg [ $key . " :notice " ] = $m ;
}
foreach ( $sysmsgs_info as $key => $m ){
$sysmsg [ $key . " :info " ] = $m ;
}
$data [ " notif " ] = $notifications ;
$data [ " @attributes " ] = array ( " count " => $sysnotify + $data [ " intro " ] + $data [ " mail " ] + $data [ " register " ]);
$data [ " sysmsgs " ] = $sysmsg ;
if ( $data [ " register " ] == 0 ) {
unset ( $data [ " register " ]);
}
$groups = array ();
if ( count ( $groups_unseen )) {
foreach ( $groups_unseen as $key => $item ) {
$groups [ $key . ':group' ] = $item [ 'count' ];
$groups [ $key . ':@attributes' ] = array ( 'id' => $item [ 'id' ]);
}
$data [ 'groups' ] = $groups ;
}
$forums = array ();
if ( count ( $forums_unseen )) {
foreach ( $forums_unseen as $key => $item ) {
$forums [ $count . ':forum' ] = $item [ 'count' ];
$forums [ $count . ':@attributes' ] = array ( 'id' => $item [ 'id' ]);
}
$data [ 'forums' ] = $forums ;
}
return $data ;
}