? hook_og_user_roles.patch
? hook_og_user_roles2.patch
Index: og_user_roles.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/og_user_roles/og_user_roles.module,v
retrieving revision 1.36
diff -u -p -r1.36 og_user_roles.module
--- og_user_roles.module	8 Jun 2009 12:57:47 -0000	1.36
+++ og_user_roles.module	20 Jun 2009 14:00:21 -0000
@@ -417,11 +417,15 @@ function og_user_roles_get_roles_by_grou
  *   The user ID.
  * @param $rid
  *   The role ID to grant.
+ * @param $args 
+ *   an array with custom parameter values that are passed to hook implementations.
  */
-function og_user_roles_role_add($gid, $uid, $rid) {
+function og_user_roles_role_add($gid, $uid, $rid, $args = array()) {
   $granted = db_result(db_query_range("SELECT rid FROM {og_users_roles} WHERE gid = %d AND uid = %d AND rid = %d", $gid, $uid, $rid, 0, 1));
   if (!$granted) {
     db_query("INSERT INTO {og_users_roles} (uid, gid, rid) VALUES (%d, %d, %d)", $uid, $gid, $rid);
+    
+    module_invoke_all('og_user_roles', 'role add', $gid, $uid, $rid, $args);
   }
 }
 
@@ -434,13 +438,17 @@ function og_user_roles_role_add($gid, $u
  *   The user ID.
  * @param $rid
  *   (Optional) The role ID to remove. If omitted, all roles are removed.
+ * @param $args 
+ *   an array with custom parameter values that are passed to hook implementations.
  */
-function og_user_roles_role_delete($gid, $uid, $rid = NULL) {
+function og_user_roles_role_delete($gid, $uid, $rid = NULL, $args = array()) {
   if (is_null($rid)) {
     db_query("DELETE FROM {og_users_roles} WHERE gid = %d AND uid = %d", $gid, $uid);
   }
   else {
     db_query("DELETE FROM {og_users_roles} WHERE gid = %d AND uid = %d AND rid = %d", $gid, $uid, $rid);
   }
+  
+  module_invoke_all('og_user_roles', 'role delete', $gid, $uid, $rid, $args);
 }
 
Index: og_user_roles.pages.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/og_user_roles/og_user_roles.pages.inc,v
retrieving revision 1.3
diff -u -p -r1.3 og_user_roles.pages.inc
--- og_user_roles.pages.inc	8 Jun 2009 13:00:05 -0000	1.3
+++ og_user_roles.pages.inc	20 Jun 2009 14:00:21 -0000
@@ -131,10 +131,21 @@ function og_user_roles_page_form_submit(
   $gid = $form['#node']->nid;
 
   foreach ($form_state['values']['user_roles'] as $uid => $new_roles) {
-    og_user_roles_role_delete($gid, $uid);
+    //get the user's current roles from the db.
+    $original_roles = og_user_roles_get_roles_by_group($gid, $uid); 
+    
+    //determine which roles to add
+    $add_roles = array_diff($new_roles, $original_roles);
+    $add_roles = array_filter($add_roles);
+
+    //determine which roles to delete
+    $delete_roles = array_diff($original_roles, $new_roles);
+    
+    foreach ($delete_roles as $rid => $checked) {
+      og_user_roles_role_delete($gid, $uid, $rid);
+    }
 
-    $new_roles = array_filter($new_roles);
-    foreach ($new_roles as $rid => $checked) {
+    foreach ($add_roles as $rid => $checked) {
       og_user_roles_role_add($gid, $uid, $rid);
     }
   }
