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.

  • @ Mariano

    This only notifies the second user.  user A makes the post, user B comments on that post but user A is never notified.  When user A comments again than user B is notified.  when user B replies user A never recieves a notification.

    it also sends a notification to the users mail as well as the live notifications plugin.  how can i shut it off to the mail and just have it go to the live notificatins plugin?

     

    <?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($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()

                    )

                    );

    }

     

    //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()

                    )

                    );

                    new_notification(1,$cowner->guid, $user->guid, sprintf("a comentado un articulo donde tu comentaste ( {$comment_text} ) <a href=\"{$vars['url']}/pg/dashboard/#{$annotation}\">Click para ver</a>"));

                }

                $pinged_users[] = $commenter_guid;

        }

        }

     

     

     

     

    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

    ));

    }

    }

  • Peter M

    @Stuart,

    You're not really a code person are you ?

    Did you read the part that says :-

    // notify if poster wasn't owner

    ??

    So of course -- the owner "user A is never notified" ;-)

  • @ Peter M

    your right im learning how to code as we speek. 

    // notify if poster wasn't owner
     refers to the person making the comment not to the person who made the wire post.

    // notify if poster wasn't owner

    if ($entity->owner_guid != $user->guid) {

     

    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()

                    )

                    );

    this bit of code tells the origanl "wire poster" they have a comment.  your not really a coder either are you?

  • Peter M

    you'll need to retrieve the owning entity, then fetch that entity's owner - to get the original wire poster ;-)

    (btw... i work fulltime in the arena of coding )

  • pues a mi me funciona si A es el dueño de su articulo luego EL USUARIO B comenta ese articulo notifica al usuario A pero derepente aparece C y comenta sobre el articulo del usuario A pues notifica  a EL USUARIO A Y B

  • it works for me if A is the owner of his article says then the user B notifies the user that article but derepente A C appears and comments on the article by then notifies User A USER AND B

    google translator

  • a: create an article

    b: comment on this article

    c: comment on this article

    then A, B and C are reported. that B is not even a friend of C


  • live notify tis code is 

    ------------------------------------------

    new_notification(1,$cowner->guid, $user->guid, sprintf("to and article where you said you told ( {$comment_text} ) <a href=\"{$vars['url']}/pg/dashboard/#{$annotation}\">Click para ver</a>"));

    -------------------------------------------

  • @ Mariano

    Thank you.  Is there any reason why i get a live notifications and along side messages.  I looked at engine/lib/users.php and set it like so

    // Turn on email and site notifications by default
        set_user_notification_setting($user->getGUID(), 'email', false);
            set_user_notification_setting($user->getGUID(), 'site', true);

  • I GOT IT!!!

     

    <?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()



                    ),

    $live = "commented on your Zone post <a href=\"{$vars['url']}/pg/river_comments/allcomments/?guid={$entity_guid}\">click here to see it</a>"

                    );

    }


    //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()



                    ),

    $live = "commented under your comment <a href=\"{$vars['url']}/pg/river_comments/allcomments/?guid={$entity_guid}\">click here to see it</a>"

                    );

                  

                }

                $pinged_users[] = $commenter_guid;

        }

        }




    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

    ));

    }

    }