mirror of https://github.com/movim/movim
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
231 lines
6.2 KiB
231 lines
6.2 KiB
<?php
|
|
|
|
use Moxl\Xec\Action\Pubsub\GetItemsId;
|
|
use Moxl\Xec\Action\Pubsub\GetItems;
|
|
use Moxl\Xec\Action\Pubsub\Delete;
|
|
|
|
use Respect\Validation\Validator;
|
|
use Cocur\Slugify\Slugify;
|
|
use App\User;
|
|
|
|
include_once WIDGETS_PATH.'Post/Post.php';
|
|
|
|
class CommunityPosts extends \Movim\Widget\Base
|
|
{
|
|
private $_paging = 10;
|
|
|
|
function load()
|
|
{
|
|
//$this->registerEvent('pubsub_getitemsid_handle', 'onItemsId');
|
|
$this->registerEvent('pubsub_getitems_handle', 'onItemsId');
|
|
$this->registerEvent('pubsub_getitems_error', 'onItemsError');
|
|
$this->registerEvent('pubsub_getitemsid_error', 'onItemsError');
|
|
|
|
$this->addjs('communityposts.js');
|
|
}
|
|
|
|
/*function onItems($packet)
|
|
{
|
|
list($origin, $node) = array_values($packet->content);
|
|
$this->displayItems($origin, $node);
|
|
}*/
|
|
|
|
function onItemsId($packet)
|
|
{
|
|
list($origin, $node, $ids, $first, $last, $count, $paginated)
|
|
= array_values($packet->content);
|
|
|
|
$this->displayItems($origin, $node, $ids, $first, $last, $count, $paginated);
|
|
}
|
|
|
|
function onItemsError($packet)
|
|
{
|
|
list($origin, $node) = array_values($packet->content);
|
|
|
|
if ($node != 'urn:xmpp:microblog:0') {
|
|
$sd = new \Modl\SubscriptionDAO;
|
|
|
|
if ($sd->get($origin, $node)) {
|
|
$this->rpc('CommunityAffiliations_ajaxDelete', $origin, $node, true);
|
|
$this->rpc('CommunityAffiliations_ajaxGetAffiliations', $origin, $node);
|
|
} else {
|
|
$id = new \Modl\InfoDAO;
|
|
$id->delete($origin, $node);
|
|
$this->ajaxClear();
|
|
}
|
|
} else {
|
|
$this->displayItems($origin, $node, false, true);
|
|
}
|
|
}
|
|
|
|
private function displayItems(
|
|
$origin,
|
|
$node,
|
|
$ids = false,
|
|
$first = false,
|
|
$last = false,
|
|
$count = false,
|
|
$paginated = false)
|
|
{
|
|
if (!$this->validateServerNode($origin, $node)) return;
|
|
|
|
$html = $this->prepareCommunity($origin, $node, 0, $ids, $first, $last, $count);
|
|
|
|
$slugify = new Slugify;
|
|
$this->rpc(
|
|
($paginated) ? 'MovimTpl.append' : 'MovimTpl.fill',
|
|
'#communityposts.'.$slugify->slugify('c'.$origin.'_'.$node), $html);
|
|
$this->rpc('MovimUtils.enhanceArticlesContent');
|
|
}
|
|
|
|
function ajaxGetContact($jid)
|
|
{
|
|
$c = new Contact;
|
|
$c->ajaxGetDrawer($jid);
|
|
}
|
|
|
|
function ajaxGetItems($origin, $node, $before = 'empty')
|
|
{
|
|
if (!$this->validateServerNode($origin, $node)) return;
|
|
|
|
// https://github.com/maranda/metronome/issues/236
|
|
/*if ($node == 'urn:xmpp:microblog:0') {
|
|
$r = new GetItems;
|
|
} else {*/
|
|
$r = new GetItems;
|
|
//}
|
|
|
|
if (!isset($before)) $before = 'empty';
|
|
|
|
$r->setTo($origin)
|
|
->setNode($node)
|
|
->setPaging($this->_paging)
|
|
->setBefore($before)
|
|
->request();
|
|
}
|
|
|
|
function ajaxClear()
|
|
{
|
|
$html = $this->prepareEmpty();
|
|
$this->rpc('MovimTpl.fill', '#communityposts', $html);
|
|
}
|
|
|
|
function prepareEmpty()
|
|
{
|
|
$id = new \Modl\InfoDAO;
|
|
|
|
$view = $this->tpl();
|
|
$view->assign('servers', $id->getCommunitiesServers());
|
|
$html = $view->draw('_communityposts_empty', true);
|
|
|
|
return $html;
|
|
}
|
|
|
|
public function preparePost($p)
|
|
{
|
|
$pw = new \Post;
|
|
return $pw->preparePost($p, true, false, true);
|
|
}
|
|
|
|
private function prepareCommunity(
|
|
$origin,
|
|
$node,
|
|
$page = 0,
|
|
$ids = false,
|
|
$first = false,
|
|
$last = false,
|
|
$count = false)
|
|
{
|
|
$pd = new \Modl\PostnDAO;
|
|
|
|
$ids = is_array($ids) ? $ids : [];
|
|
foreach($ids as $key => $id) {
|
|
if (empty($id)) {
|
|
unset($ids[$key]);
|
|
}
|
|
}
|
|
|
|
$posts = $pd->getIds($origin, $node, $ids);
|
|
|
|
$id = new \Modl\InfoDAO;
|
|
$info = $id->get($origin, $node);
|
|
|
|
$sd = new \Modl\SubscriptionDAO;
|
|
$subscription = $sd->get($origin, $node);
|
|
|
|
$nsfwMessage = false;
|
|
|
|
if (User::me()->nsfw == false
|
|
&& is_array($posts)) {
|
|
foreach ($posts as $key => $post) {
|
|
if ($post->nsfw) {
|
|
unset($posts[$key]);
|
|
$nsfwMessage = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (is_array($posts)) {
|
|
foreach ($posts as $key => $post) {
|
|
$posts[$post->nodeid] = $post;
|
|
unset($posts[$key]);
|
|
}
|
|
}
|
|
|
|
$view = $this->tpl();
|
|
|
|
if ($nsfwMessage) {
|
|
$this->rpc('MovimTpl.remove', '#nsfwmessage');
|
|
$this->rpc(
|
|
'MovimTpl.prepend',
|
|
'#communityposts',
|
|
$view->draw('_communityposts_nsfw', true)
|
|
);
|
|
}
|
|
|
|
$view->assign('server', $origin);
|
|
$view->assign('node', $node);
|
|
$view->assign('page', $page);
|
|
$view->assign('ids', $ids);
|
|
$view->assign('posts', $posts);
|
|
$view->assign('info', $info);
|
|
$view->assign('subscription', $subscription);
|
|
$view->assign('paging', $this->_paging);
|
|
|
|
$view->assign('publicposts', ($ids == false)
|
|
? $pd->getPublic($origin, $node, $page*$this->_paging, $this->_paging)
|
|
: false);
|
|
|
|
$view->assign('first', $first);
|
|
$view->assign('last', $last);
|
|
$view->assign('count', $count);
|
|
|
|
$html = $view->draw('_communityposts', true);
|
|
|
|
return $html;
|
|
}
|
|
|
|
private function validateServerNode($origin, $node)
|
|
{
|
|
$validate_server = Validator::stringType()->noWhitespace()->length(6, 40);
|
|
$validate_node = Validator::stringType()->length(3, 100);
|
|
|
|
return ($validate_server->validate($origin)
|
|
&& $validate_node->validate($node));
|
|
}
|
|
|
|
function getComments($post)
|
|
{
|
|
$pd = new \Modl\PostnDAO;
|
|
return $pd->getComments($post);
|
|
}
|
|
|
|
function display()
|
|
{
|
|
$slugify = new Slugify;
|
|
|
|
$node = $this->get('n') != null ? $this->get('n') : 'urn:xmpp:microblog:0';
|
|
$this->view->assign('class', $slugify->slugify('c'.$this->get('s').'_'.$node));
|
|
}
|
|
}
|
|
|