? hook_og_user_roles.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	19 Jun 2009 21:38:24 -0000
@@ -422,6 +422,8 @@ function og_user_roles_role_add($gid, $u
   $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);
   }
 }
 
@@ -442,5 +444,7 @@ function og_user_roles_role_delete($gid,
   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	19 Jun 2009 21:38:24 -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);
     }
   }
