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.

  • gracias ya solucione lo de ecomments

  • @Steve Aquila and mariano

    I cant download "ecomments" anymore.  How about getting this to work with "rivercomments"?  ive been trying to make this work for awhile now.

    mod/rivercomments/action/comment.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
                ));
            }
        }

  • mod / rivercomments / acción / comment.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($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()

                    )

                    );

                   

                }

                $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

    ));

    }

    }

  • Next step should be to work out a REAL on-site notification system like Facebook's own. Email boxes are easily overwhelmed now a days. If we can have a good on-site notification system, user engagement will increase

  • yes puedes chequear mi sitio para ver q opinas de mi sistema de notificaciones en www.floops.com.ar

  • @PHPlord and Mariano

    Ive been using "elgg notify" its a live notification system just like facebook. 

    Ive implemented your modifications to actions/comments/add.php (i also add a line of code for "elgg notify") .  Now "elgg notify" notifies the user who has had a comment on their item.  When user A comments on user B's item, user B gets notified.  When user B writes a second comment (reply) then user A gets notified.  When user C writes a comment then users A and B both get notified.  It works perfectly for all comments but im still trying to get it to work with "rivercomment".  If we can get this to work then we would have a comment/notifications just like facebook.  more interation. 

    Ive figured out a way to have the "elgg notify" notify the user that had the comment on their item and direct them right to the item.  Ive also had "elgg notify" direct them right to their wire post with the new comment under it.  I just need to figure out a way to add a comment back box under the comments (mod/rivercomments/allcomments.php).  I also need to make your mod work with "mod/rivercomments/actions/comment.php" plus adding the little peace of "elgg notify"

    Im really happy to have gotten this far.   With your and Mariano's help we can make this happen.

  • tienes alguna idea sobre mod/elgg_notify/actions/delete.php

  • para rivercoments es facil basta con agregar 

    en mod/rivercomments/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($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

    ));

    }

    }

  • need help with this

    create delete.php

    function new_notification($access_id = "",$user, $action_user, $desc) {

    $notify = new ElggObject();

     

    $notify->subtype = "notification";

     

    $notify->access_id = $access_id;

     

    //notify the person who needs to be notified

    $notify->to_id = $user;

     

     

    //who took the action

    $notify->action_user = $action_user;

     

    //message assigned by developer , eg. 'userx' wrote on your message board, must include html link!

    $notify->desc = $desc;

    //set it as not read

    $notify->read = 0;

     

     

    $notify->save();

    }

    function super_notify_removeNewNotifies($user) {

    delete_entities("object", "notification", $user->guid);

    }

    function super_notify_removeNotify($user, $guid) {

     

    $entity = get_entity($guid);

          

    if($entity->type == 'object' && get_subtype_from_id($entity->subtype)=='notification'){

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

    return delete_entity($guid);

    }

    }

    return false;

    }