A Notify-all commenting system [help needed]

Hi All!

I'm trying to build a plugin that will notify all users that comment on any post, I attempt to do this by creating a new metadata called commenters, commenters will be an array of GUIDs of users who hv added a comment and then notify them all using the notify_user() function.

The concept worked but however whenever a new user joins the comment stream, older users start getting DOUBLE notifications i.e there GUIDs are inserted twice, below is code for my modified actions/comments/add.php

 

<?php
/**
* Elgg add comment action
*
* @package Elgg
* @author Curverider <curverider.co.uk>
* @link http://elgg.org/
*/

// Make sure we're logged in; forward to the front page if not
gatekeeper();

// Get input
$entity_guid = (int) get_input('entity_guid');
$comment_text = get_input('generic_comment');

// make sure comment is not empty
if (empty($comment_text)) {
register_error(elgg_echo("generic_comment:blank"));
forward($_SERVER['HTTP_REFERER']);
}

// Let's see if we can get an entity with the specified GUID
$entity = get_entity($entity_guid);
if (!$entity) {
register_error(elgg_echo("generic_comment:notfound"));
forward($_SERVER['HTTP_REFERER']);
}

$user = get_loggedin_user();

$annotation = create_annotation($entity->guid,
'generic_comment',
$comment_text,
"",
$user->guid,
$entity->access_id);

// tell user annotation posted
if (!$annotation) {
register_error(elgg_echo("generic_comment:failure"));
forward($_SERVER['HTTP_REFERER']);
}

//Notify everybody!
//create metadata to do that!
if (!$entity->commenters || !is_array($entity->commenters)){
if ($entity->owner_guid != $user->guid) {
$commenters = array();
//add owner_guid
$commenters[] = $entity->owner_guid;
//add poster's guid
$commenters[] = $user->guid;
$entity->commenters = $commenters;
}

}else{
//check if guid is inside, else add it!
if (!in_array($user->guid,$entity->commenters)){
$commenters = array();
$commenters = $entity->commenters;
$commenters[] = $user->guid;
//clean up first
//remove_metadata($entity->guid, commenters);
$entity->commenters = $commenters;
}
}

notify_user($entity->commenters,
$user->guid,
elgg_echo('generic_comment:email:subject'),
sprintf(
elgg_echo('generic_comment:email:body'),
$entity->title,
$user->name,
$comment_text,
$entity->getURL(),
$user->name,
$user->getURL()
)
);
system_message(elgg_echo("generic_comment:posted"));
//add to river
add_to_river('annotation/annotate','comment',$user->guid,$entity->guid, "", 0, $annotation);

// Forward to the entity page
forward($entity->getURL());

I'm planning to release it as a full plugin and would appreciate any help.

  • It will be great to also combine it with the notification plugin. So that the notification won't be going to the message instead it will be going to the new notification area.

  • Yeah, that's the Grand plan ;-) but first we need to debug the code i pasted above. Did you try out the code?

  • PHPlord,

    have you made any progress with this?  This is some really good work and is something Ive been looking for.  keep me posted and keep up the great work!

  • One more thing, how can i get this to work with "river comments" plug in.

    mod/river_comments/actions/comments.php

    <?php

     /**
     * river_comments
     *
     * @author Pedro Prez
     * @link http://community.elgg.org/pg/profile/pedroprez
     * @copyright (c) Keetup 2010
     * @link http://www.keetup.com/
     * @license GNU General Public License (GPL) version 2
     */

     // Make sure we're logged in; forward to the front page if not
     
     if ($callback && !isloggedin()) {
      echo 'loginerror';
      exit;
     }
     
     gatekeeper();
     
     // Get input
     $entity_guid = (int) get_input('guid');
     $comment_text = get_input('river_comment_text');
     
     // make sure comment is not empty
     if (empty($comment_text)) {
      if (!$callback) {
       register_error(elgg_echo("generic_comment:blank"));
       forward($_SERVER['HTTP_REFERER']);
      } else {
       echo "<p class='comment_error'>" . elgg_echo("generic_comment:blank") . "</p>";
       exit;
      } 
     }
     
     // Let's see if we can get an entity with the specified GUID
     $entity = get_entity($entity_guid);
     if (!$entity) {
      if (!$callback) {
       register_error(elgg_echo("generic_comment:notfound"));
       forward($_SERVER['HTTP_REFERER']);
      } else {
       echo "<p class='comment_error'>" . elgg_echo("generic_comment:notfound") . "</p>";
       exit;
      }
     }
     
     $user = get_loggedin_user();
     
     $annotation = create_annotation($entity->guid,
             'generic_comment',
             $comment_text,
             "",
             $user->guid,
             $entity->access_id);
     
     // tell user annotation posted
     if (!$annotation) {
      if (!$callback) {
       register_error(elgg_echo("generic_comment:failure"));
       forward($_SERVER['HTTP_REFERER']);
      } else {
       echo "<p class='comment_error'>" . elgg_echo("generic_comment:failure") . "</p>";
       exit;
      }
     }
     
     // notify if poster wasn't owner
     if ($entity->owner_guid != $user->guid) {
        
      notify_user($entity->owner_guid,
         $user->guid,
         elgg_echo('generic_comment:email:subject'),
         sprintf(
          elgg_echo('generic_comment:email:body'),
          $entity->title,
          $user->name,
          $comment_text,
          $entity->getURL(),
          $user->name,
          $user->getURL()
         )
        );
     }
     
     if (!$callback) {
      system_message(elgg_echo("generic_comment:posted"));
     
      // Forward to the entity page
      forward($_SERVER['HTTP_REFERER']);
     } else {
      //Fix for elgg version minor or equal than 1.6.2
      if (get_version() <= 2009072201 && $annotation) {
       $annotation = get_annotations($entity_guid, '','', 'generic_comment', $comment_text, $user->guid, 1);
       if (!empty($annotation)) {
        $annotation = array_shift($annotation);
       }
       $comment = $annotation;
      } else {
       $comment = get_annotation($annotation);
      }
      if ($comment) {
       $owner = get_user($comment->owner_guid);
       echo elgg_view('river_comments/river_comment', array(
        'owner' => $owner,
        'annotation' => $comment
       ));
      }
     }

  • Hello Everyone,

    here is what my final code looked like. But i abandoned the project because In had other pressing issues to attend to.

     

    <?php
    /**
     * Elgg add comment action
     *
     * @package Elgg
     * @author Curverider <curverider.co.uk>
     * @link http://elgg.org/
     */

    // Make sure we're logged in; forward to the front page if not
    gatekeeper();

    // Get input
    $entity_guid = (int) get_input('entity_guid');
    $comment_text = get_input('generic_comment');

    // make sure comment is not empty
    if (empty($comment_text)) {
        register_error(elgg_echo("generic_comment:blank"));
        forward($_SERVER['HTTP_REFERER']);
    }

    // Let's see if we can get an entity with the specified GUID
    $entity = get_entity($entity_guid);
    if (!$entity) {
        register_error(elgg_echo("generic_comment:notfound"));
        forward($_SERVER['HTTP_REFERER']);
    }

    $user = get_loggedin_user();

    $annotation = create_annotation($entity->guid,
                                    'generic_comment',
                                    $comment_text,
                                    "",
                                    $user->guid,
                                    $entity->access_id);

    // tell user annotation posted
    if (!$annotation) {
        register_error(elgg_echo("generic_comment:failure"));
        forward($_SERVER['HTTP_REFERER']);
    }

    // notify if poster wasn't owner
    //load description
        if (strlen($comment_text) > 90) {
            $notice = substr($comment_text, 0, strpos($comment_text, ' ', 90)) . "... (cont'd)";
        } else {
            $notice = $comment_text;
        }
    if ($entity->owner_guid != $user->guid) {
               
        notify_user($entity->owner_guid,
                    $user->guid,
                    elgg_echo('generic_comment:email:subject'),
                    sprintf(
                        elgg_echo('generic_comment:email:body'),
                        $entity->title,
                        $user->name,
                        $comment_text,
                        $entity->getURL(),
                        $user->name,
                        $user->getURL()
                    )
                );
       
    }

    //Notify everybody!
    //extract annotations and ping each!
        //$commenters = get_annotations($entity->guid, "", "", 'generic_comment', , get_loggedin_userid(), 1);
        $commenters = get_annotations($entity->guid, "", "", 'generic_comment');
        $pinged_users = array('');
        foreach ($commenters as $item)
        {
        $cowner = $item->getOwnerEntity();
        $commenter_guid = $cowner->guid;
        //dont notify poster and owner again!
        if ($user->guid != $commenter_guid && $entity->owner_guid != $commenter_guid){
        if (!in_array($commenter_guid, $pinged_users )) {
                    notify_user($commenter_guid,
                    $user->guid,
                    elgg_echo('generic_comment:email:subject'),
                    sprintf(
                        elgg_echo('generic_comment:email:body'),
                        $entity->title,
                        $user->name,
                        $comment_text,
                        $entity->getURL(),
                        $user->name,
                        $user->getURL()
                    )
                    );
                   
                }
                $pinged_users[] = $commenter_guid;
        }
        }
    system_message(elgg_echo("generic_comment:posted"));
    //add to river
    add_to_river('annotation/annotate','comment',$user->guid,$entity->guid, "", 0, $annotation);

    // Forward to the entity page
    forward($entity->getURL());

  • @phplord

    Works perfectly!  you are good! 

    @anyone

    can this be integrated with "ecomments"?

  • new_comments.php 

     

    <?php

     

    require_once(dirname(dirname(dirname(dirname(dirname(dirname(dirname(__FILE__))))))) . "/engine/start.php");

     

    gatekeeper();

    action_gatekeeper();

     

    $value = get_input('value');

    $entity_guid = (int)get_input('entity_guid');

    $entity = get_entity($entity_guid);

    $user = get_loggedin_user();

     

    if ($entity instanceof ElggObject) {

        if ($entity->getSubtype() == 'groupforumtopic') {

                $annotation_type = 'group_topic_post';

            } else {

                $annotation_type = 'generic_comment';

            }

        create_annotation($entity->getGUID(), $annotation_type, $value, '', get_loggedin_userid(), $entity->access_id);

    new_notification(1,$entity->owner_guid, $user->guid, sprintf("a comentado uno de tus articulos ( {$value} ) <a href=\"{$vars['url']}/pg/dashboard/#{$entity_guid}\">Click para ver</a>"));

    }

    die();

    ?>

  • @stuartsloan might want to try this hook

    <?php

    if(is_plugin_enabled('eComments')){

              echo elgg_view('eComments/river/bar', $vars);

              }

    ?>