소스 검색

+ Alert and (proper) background task for notifying of requests to join a group

Signed-off-by: Michael Eshom <[email protected]>
Michael Eshom 10 년 전
부모
커밋
8416e9cebc
3개의 변경된 파일124개의 추가작업 그리고 46개의 파일을 삭제
  1. 6 46
      Sources/Profile-Modify.php
  2. 117 0
      Sources/tasks/GroupReq-Notify.php
  3. 1 0
      Themes/default/languages/Alerts.english.php

+ 6 - 46
Sources/Profile-Modify.php

@@ -3622,54 +3622,14 @@ function groupMembership2($profile_vars, $post_errors, $memID)
 			array('id_request')
 		);
 
-		// Send an email to all group moderators etc.
-		require_once($sourcedir . '/Subs-Post.php');
+		// Set up some data for our background task...
+		$data = serialize(array('id_member' => $memID, 'member_name' => $user_info['name'], 'id_group' => $group_id, 'group_name' => $group_name, 'reason' => $_POST['reason'], 'time' => time()));
 
-		// Do we have any group moderators?
-		$request = $smcFunc['db_query']('', '
-			SELECT id_member
-			FROM {db_prefix}group_moderators
-			WHERE id_group = {int:selected_group}',
-			array(
-				'selected_group' => $group_id,
-			)
+		// Add a background task to handle notifying people of this request
+		$smcFunc['db_insert']('insert', '{db_prefix}background_tasks',
+			array('task_file' => 'string-255', 'task_class' => 'string-255', 'task_data' => 'string', 'claimed_time' => 'int'),
+			array('$sourcedir/tasks/GroupReq-Notify.php', 'GroupReq_Notify_Background', $data, 0), array()
 		);
-		$moderators = array();
-		while ($row = $smcFunc['db_fetch_assoc']($request))
-			$moderators[] = $row['id_member'];
-		$smcFunc['db_free_result']($request);
-
-		// Otherwise this is the backup!
-		if (empty($moderators))
-		{
-			require_once($sourcedir . '/Subs-Members.php');
-			$moderators = membersAllowedTo('manage_membergroups');
-		}
-
-		if (!empty($moderators))
-		{
-			// Figure out who wants to be alerted/emailed about this
-			$data = array('alert' => array(), 'email' => array());
-
-			include_once($sourcedir . '/Subs-Notify.php');
-			$prefs = getNotifyPrefs($moderators, 'request_group');
-			
-			// Bitwise comparisons are fun...
-			foreach ($moderators as $mod)
-			{
-				if (!empty($prefs[$mod]))
-				{
-					if ($prefs[$mod] & 0x01)
-						$data['alerts'][] = $mod;
-
-					if ($prefs[$mod] & 0x02)
-						$data['email'][] = $mod;
-				}
-			}
-
-			// Now we pass this off to our background task to handle
-			$smcFunc['db_insert']('', '{db_prefix}background_tasks', array('task_file' => 'string-255', 'task_class' => 'string-255', 'task_data' => 'string', 'claimed_time' => 'int'), array('GroupNotif-Task.php', 'GroupNotify', serialize($data), time()));
-		}
 
 		return $changeType;
 	}

+ 117 - 0
Sources/tasks/GroupReq-Notify.php

@@ -0,0 +1,117 @@
+<?php
+
+/**
+ * This taks handles notifying someone that a user has
+ * requeted to join a group they moderate.
+ * 
+ * Simple Machines Forum (SMF)
+ * 
+ * @package SMF
+ * @author Simple Machines http://www.simplemachines.org
+ * @copyright 2013 Simple Machines and individual contributors
+ * @license http://www.simplemachines.org/about/smf/license.php BSD
+ * 
+ * @version SMF 2.1 Alpha 1
+ */
+ 
+class GroupReq_Notify_Background extends SMF_BackgroundTask
+{
+	public function execute()
+ 	{
+ 		global $sourcedir, $smcFunc, $language;		
+
+		// Do we have any group moderators?
+		$request = $smcFunc['db_query']('', '
+			SELECT id_member
+			FROM {db_prefix}group_moderators
+			WHERE id_group = {int:selected_group}',
+			array(
+				'selected_group' => $group_id,
+			)
+		);
+		$moderators = array();
+		while ($row = $smcFunc['db_fetch_assoc']($request))
+			$moderators[] = $row['id_member'];
+		$smcFunc['db_free_result']($request);
+
+		require_once($sourcedir . '/Subs-Members.php');
+		
+		// Make sure anyone who can moderate_membergroups gets notified as well
+		$moderators = array_unique(array_merge($moderators, membersAllowedTo('manage_membergroups')));
+
+		if (!empty($moderators))
+		{
+			// Figure out who wants to be alerted/emailed about this
+			$data = array('alert' => array(), 'email' => array());
+
+			include_once($sourcedir . '/Subs-Notify.php');
+			$prefs = getNotifyPrefs($moderators, 'request_group');
+			
+			// Bitwise comparisons are fun...
+			foreach ($moderators as $mod)
+			{
+				if (!empty($prefs[$mod]))
+				{
+					if ($prefs[$mod] & 0x01 == 0x01)
+						$data['alert'][] = $mod;
+
+					if ($prefs[$mod] & 0x02 == 0x02)
+						$data['email'][] = $mod;
+				}
+			}
+
+			if (!empty($data['alert']))
+			{
+				$alert_rows = array();
+
+				foreach($data['alert'] as $group_mod)
+				{
+					$alert_rows[] = array(
+						'alert_time' => $this->_details['time'],
+						'id_member' => $group_mod,
+						'id_member_started' => $this->_details['id_member'],
+						'member_name' => $this->_details['member_name'],
+						'content_type' => 'member',
+						'content_id' => 0,
+						'content_action' => 'group_request',
+						'extra' => serialize(array('group_name' => $this->_details['group_name'])),
+					);
+				}
+
+				$smcFunc['db_insert']('insert', '{db_prefix}user_alerts',
+					array('alert_time' => 'int', 'id_member' => 'int', 'id_member_started' => 'int', 'member_name' => 'string',
+					'content_type' => 'string', 'content_id' => 'int', 'content_action' => 'string', 'is_read' => 'int', 'extra' => 'string'),
+					$alert_rows, array()
+				);
+			}
+
+			if (!empty($data['email']))
+			{
+				$request = $smcFunc['db_query']('', '
+					SELECT id_member, email_address, lngfile, member_name, mod_prefs
+					FROM {db_prefix}members
+					WHERE id_member IN ({array_int:moderator_list})
+					ORDER BY lngfile',
+					array(
+						'moderator_list' => $moderators,
+					)
+				);
+				while ($row = $smcFunc['db_fetch_assoc']($request))
+				{
+					$replacements = array(
+						'RECPNAME' => $row['member_name'],
+						'APPYNAME' => $this->_details['member_name'],
+						'GROUPNAME' => $this->_details['group_name'],
+						'REASON' => $this->_details['reason'],
+						'MODLINK' => $scripturl . '?action=moderate;area=groups;sa=requests',
+					);
+
+					require_once($sourcedir . '/Subs-Post.php');
+
+					$emaildata = loadEmailTemplate('request_membership', $replacements, empty($row['lngfile']) || empty($modSettings['userLanguage']) ? $language : $row['lngfile']);
+					sendmail($row['email_address'], $emaildata['subject'], $emaildata['body'], null, null, false, 2);
+				}
+			}
+		}
+	}
+}

+ 1 - 0
Themes/default/languages/Alerts.english.php

@@ -14,4 +14,5 @@ $txt['alert_msg_like'] = '{member_link} liked your post {msg_msg}';
 $txt['alert_member_register_standard'] = '{member_link} just signed up';
 $txt['alert_member_register_approval'] = '{member_link} just signed up (account requires approval)';
 $txt['alert_member_register_activation'] = '{member_link} just signed up (account requires activation)';
+$txt['alert_member_group_request'] = '{member_link} has requested to join {group_name}';
 ?>