Index: pm_block_user/pm_block_user.module
===================================================================
RCS file: /cvs/drupal/contributions/modules/privatemsg/pm_block_user/pm_block_user.module,v
retrieving revision 1.3
diff -u -p -r1.3 pm_block_user.module
--- pm_block_user/pm_block_user.module	2 Dec 2009 20:04:00 -0000	1.3
+++ pm_block_user/pm_block_user.module	11 Jan 2010 22:20:58 -0000
@@ -41,6 +41,16 @@ function pm_block_user_menu() {
     'weight'           => -10,
   );
 
+  $items['messages/blocked'] = array(
+    'title'            => 'Blocked users',
+    'page callback'    => 'pm_block_user_blocked',
+    'file'             => 'pm_block_user.pages.inc',
+    'access callback'  => 'privatemsg_user_access',
+    'access arguments' => array('read privatemsg'),
+    'type'             => MENU_LOCAL_TASK,
+    'weight'           => 10,
+  );
+
   $items['admin/settings/messages/block'] = array(
     'title'            => 'User blocking rules',
     'description'      => 'Configure rules for which users may block each other.',
Index: pm_block_user/pm_block_user.pages.inc
===================================================================
RCS file: /cvs/drupal/contributions/modules/privatemsg/pm_block_user/pm_block_user.pages.inc,v
retrieving revision 1.1
diff -u -p -r1.1 pm_block_user.pages.inc
--- pm_block_user/pm_block_user.pages.inc	2 Dec 2009 20:04:00 -0000	1.1
+++ pm_block_user/pm_block_user.pages.inc	11 Jan 2010 22:20:59 -0000
@@ -71,4 +71,63 @@ function pm_block_user_form_submit($form
     }
   }
   $form_state['redirect'] = $form_state['values']['destination'];
+}
+
+/**
+ * Menu callback for blocked users page.
+ */
+function pm_block_user_blocked() {
+  global $user;
+
+  $header = array(
+    array(
+      'data' => t('Username'),
+      'field' => 'u.name',
+      'sort'  => 'asc',
+      ),
+    array(
+      'data' => t('Operations'),
+      ),
+  );
+
+  $result = pager_query('SELECT * FROM {pm_block_user} pmb INNER JOIN {users} u ON (u.uid = pmb.author) WHERE pmb.recipient = %d ' . tablesort_sql($header), 20, 0, NULL, $user->uid);
+
+  $rows = array();
+  while ($row = db_fetch_object($result)) {
+    $rows[] = array(
+      theme('username', user_load($row->author)),
+      l(t('unblock'), 'messages/block/' . $row->author, array('query' => drupal_get_destination())),
+    );
+  }
+  return drupal_get_form('pm_block_user_block_user_form') . theme('table', $header, $rows) . theme('pager');
+}
+
+function pm_block_user_block_user_form() {
+  $form['new'] = array(
+    '#type'   => 'fieldset',
+    '#title'  => t('Block a user'),
+  );
+
+  $form['new']['name'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Username'),
+    '#autocomplete_path' => 'messages/user-name-autocomplete',
+    '#description'        => t('Separate multiple names with commas.'),
+  );
+  $form['new']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Block user'),
+  );
+  return $form;
+}
+
+function pm_block_user_block_user_form_submit($form, &$form_state) {
+  global $user;
+  list($accounts, $invalid) = _privatemsg_parse_userstring($form_state['values']['name']);
+  if (!empty($accounts)) {
+    foreach ($accounts as $account) {
+      db_query('INSERT INTO {pm_block_user} (author, recipient) VALUES (%d, %d)', $account->uid, $user->uid);
+      drupal_set_message(t('!author has been blocked from sending you any further messages.', array('!author' => theme('username', $account))));
+    }
+  }
 }
\ No newline at end of file
