Index: includes/node_admin.inc
=========================================================
--- includes/node_admin.inc	(revision 1.1.2.5)
+++ includes/node_admin.inc	Mon Nov 15 15:30:10 CET 2010
@@ -152,10 +152,23 @@
 
     case 'attend_yes':
       $attend = 1;
+
+      if (module_exists('rules')) {
+        foreach ($users as $sid) {
+          $signup = signup_load_signup($sid);
+          rules_invoke_event('user_attended', $signup);
+        }
+      }
       break;
 
     case 'attend_no':
       $attend = 0;
+      if (module_exists('rules')) {
+        foreach ($users as $sid) {
+          $signup = signup_load_signup($sid);
+          rules_invoke_event('user_notattended', $signup);
+        }
+      }
       break;
 
   }
Index: includes/signup.rules.inc
=========================================================
--- includes/signup.rules.inc	(revision 0)
+++ includes/signup.rules.inc	Tue Jun 08 21:20:08 CEST 2010
@@ -0,0 +1,133 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Provides rules integration for the signup module.
+ */
+
+/**
+ * Implementation of hook_rules_event_info().
+ * @ingroup rules
+ */
+function signup_rules_event_info() {
+  return array(
+    'signup_insert' => array(
+      'label' => t('User signed up to a node'),
+      'module' => 'Signup',
+      'arguments' => signup_rules_events_signup_arguments(FALSE),
+    ),
+    'signup_update' => array(
+      'label' => t('User updated signup to a node'),
+      'module' => 'Signup',
+      'arguments' => signup_rules_events_signup_arguments(FALSE),
+    ),
+    'signup_cancel' => array(
+      'label' => t('User canceled signup to a node'),
+      'module' => 'Signup',
+      'arguments' => signup_rules_events_signup_arguments(TRUE),
+    ),
+    'user_add' => array(
+      'label' => t('User was added to a signup'),
+      'module' => 'Signup',
+      'arguments' => signup_rules_events_signup_arguments(FALSE),
+    ),
+    'user_attended' => array(
+      'label' => t('User attended'),
+      'module' => 'Signup',
+      'arguments' => signup_rules_events_signup_arguments(FALSE),
+    ),
+    'user_notattended' => array(
+      'label' => t('User did not attend'),
+      'module' => 'Signup',
+      'arguments' => signup_rules_events_signup_arguments(FALSE),
+    ),
+    'open_signup' => array(
+      'label' => t('Signup for a node was opened'),
+      'module' => 'Signup',
+      'arguments' => signup_rules_events_signup_arguments(FALSE),
+    ),
+    'close_signup' => array(
+      'label' => t('Signup for a node was closed'),
+      'module' => 'Signup',
+      'arguments' => signup_rules_events_signup_arguments(FALSE),
+    ),
+  );
+}
+
+/**
+ * Default arguments to signup rules events.
+ */
+function signup_rules_events_signup_arguments($have_node = FALSE) {
+  return array(
+    'signup' => array(
+      'type' => 'signup',
+      'label' => t('signup object'),
+    ),
+    'node' => array(
+      'type' => 'node',
+      'label' => t('Node to which the user signed up'),
+      'handler' => $have_node ? '' : 'signup_rules_events_argument_signup_node',
+    ),
+    'account' => array(
+      'type' => 'user',
+      'label' => t('acting user'),
+      'handler' => 'signup_rules_events_argument_signup_user',
+    ),
+  );
+}
+
+/**
+ * Load associated node for a signup object.
+ */
+function signup_rules_events_argument_signup_node($signup) {
+  return node_load($signup->nid);
+}
+
+/**
+ * Load associated user account for a signup object.
+ */
+function signup_rules_events_argument_signup_user($signup) {
+  // If signup user is anonymous user get basic info from signup object.
+  if (!$signup->uid) {
+    $account = new stdClass();
+    $account->uid = 0;
+    $account->name = '';
+    $account->mail = $signup->anon_mail;
+    $account->roles = array(DRUPAL_ANONYMOUS_RID => 'anonymous user');
+  }
+  else {
+    $account = user_load($signup->uid);
+  }
+  return $account;
+}
+
+/**
+ * Implementation of hook_rules_data_type_info().
+ * @ingroup rules
+ */
+function signup_rules_data_type_info() {
+  return array(
+    'signup' => array(
+      'label' => t('signup'),
+      'class' => 'rules_data_type_signup',
+      'savable' => FALSE,
+      'identifiable' => TRUE,
+    ),
+  );
+}
+
+/**
+ * Implements the signup data type.
+ * @ingroup rules
+ */
+class rules_data_type_signup extends rules_data_type {
+  function load($sid) {
+    return signup_load_signup($sid);
+  }
+
+  function get_identifier() {
+    $signup = $this->get();
+    return $signup->sid;
+  }
+}
\ No newline at end of file
Index: signup.module
=========================================================
--- signup.module	(revision 1.205.2.38)
+++ signup.module	Sun Nov 14 07:05:43 CET 2010
@@ -875,9 +875,47 @@
       'description' => t('Mark signup did not attend'),
       'configurable' => FALSE,
     ),
+    'signup_user_signup' => array(
+      'type' => 'signup_user',
+      'description' => t('Signup user'),
+      'configurable' => FALSE,
+    ),
+    'signup_user_cancelsignup' => array(
+      'type' => 'signup_user',
+      'description' => t('Cancel signup for a user'),
+      'configurable' => FALSE,
+    ),
   );
 }
 
+function signup_user_signup($user) {
+  if ((arg(0) == 'node') && (is_numeric(arg(1)))) {
+    $sid = db_result(db_query("SELECT sl.sid FROM {signup_log} sl WHERE sl.nid = %d AND sl.uid=%d", arg(1), $user->uid));
+    if ($sid) {
+      $signup = signup_load_signup($sid);
+      signup_mark_attended_action($signup);
+    }
+    else {
+      $signup_form['nid'] = arg(1);
+      $signup_form['uid'] = $user->uid;
+      $sid = signup_sign_up_user($signup_form, FALSE);
+      if ($sid) {
+        $signup = signup_load_signup($sid);
+        signup_mark_attended_action($signup);
+      }
+    }
+  }
+}
+
+function signup_user_cancelsignup($user) {
+  if ((arg(0) == 'node') && (is_numeric(arg(1)))) {
+    $sid = db_result(db_query("SELECT sl.sid FROM {signup_log} sl WHERE sl.nid = %d AND sl.uid=%d", arg(1), $user->uid));
+    if ($sid) {
+      signup_cancel_signup($sid, FALSE);
+    }
+  }
+}
+
 /**
  * Action callback to cancel a given signup.
  *
@@ -905,6 +943,12 @@
 function signup_mark_attended_action(&$signup) {
   db_query("UPDATE {signup_log} SET attended = %d WHERE sid = %d", TRUE, $signup->sid);
   $signup->attended = TRUE;
+
+  // Invoke rules event handler to mark attended.
+  if (module_exists('rules')) {
+    rules_invoke_event('user_attended', $signup);
+  }
+
   watchdog('action', 'Marked signup @signup_id attended.', array('@signup_id' => $signup->sid));
 }
 
@@ -921,6 +965,12 @@
 function signup_mark_not_attended_action(&$signup) {
   db_query("UPDATE {signup_log} SET attended = %d WHERE sid = %d", FALSE, $signup->sid);
   $signup->attended = FALSE;
+
+  // Invoke rules event handler to mark not attended.
+  if (module_exists('rules')) {
+    rules_invoke_event('user_nonattended', $signup);
+  }
+
   watchdog('action', 'Marked signup @signup_id did not attend.', array('@signup_id' => $signup->sid));
 }
 
@@ -937,6 +987,12 @@
       'load' => 'signup_load_signup',
       'title' => 'label',
     ),
+    'signup_user' => array(
+      'type' => 'signup_user',
+      'base_table' => 'users',
+      'load' => 'user_load',
+      'title' => 'name',
+    ),
   );
 }
 
@@ -1011,6 +1067,11 @@
   if (!empty($rval)) {
     // If we successfully wrote a record, invoke the appropriate hook.
     module_invoke_all($hook, $signup);
+
+    // Invoke rules event handlers.
+    if (module_exists('rules')) {
+      rules_invoke_event($hook, $signup);
+    }
   }
 
   // Propagate the return value from drupal_write_record().
@@ -1091,6 +1152,11 @@
   // Invoke hook_signup_cancel().
   module_invoke_all('signup_cancel', $signup, $node);
 
+  // Invoke rules event handler to cancel signup.
+  if (module_exists('rules')) {
+    rules_invoke_event('signup_cancel', $signup, $node);
+  }
+  
   // Delete the record from the {signup_log} table.
   db_query('DELETE FROM {signup_log} WHERE sid = %d', $signup->sid);
   if ($notify_user) {
@@ -1131,6 +1197,12 @@
       $function = $module .'_signup_close';
       $function($node);
     }
+
+    // Invoke rules event handler to close signup.
+    if (module_exists('rules')) {
+      rules_invoke_event('close_signup', null, $node);
+    }
+
     watchdog('signup', 'Signups closed for %title.', array('%title' => $node->title), WATCHDOG_NOTICE, l(t('view'), 'node/'. $nid));
   }
 }
@@ -1147,6 +1219,12 @@
       $function = $module .'_signup_open';
       $function($node);
     }
+
+    // Invoke rules event handler to open signup.
+    if (module_exists('rules')) {
+      rules_invoke_event('open_signup', null, $node);
+    }
+
     watchdog('signup', 'Signups reopened for %title.', array('%title' => $node->title), WATCHDOG_NOTICE, l(t('view'), 'node/'. $nid));
   }
 }
@@ -1265,6 +1343,11 @@
     // Invoke hook_signup_data_alter() to let other modules change this.
     drupal_alter('signup_data', $signup, $signup_form);
 
+    // Invoke rules event handler to add users.
+    if (module_exists('rules')) {
+      rules_invoke_event('user_add', $signup, $node, $account);
+    }
+
     // Insert the signup into the {signup_log} table.
     signup_save_signup($signup);
 
