Перейти к контенту

Объединение (склейка) аккаунтов


Рекомендуемые сообщения

Не помешает для версии 1.3 сделать склейку участников через меню интерфейса админцентра.

Если рассмотреть код мода для версии 2.1 под названием Merge members http://mods.invisionize.com/db/index.php/f/6902 то я думаю все-таки можно подогнать этот код под IPB 1.3

 

Для 2.1

Open: ./sources/acp_loaders/acp_pages_content.php

 

Find:

 

8  => array ( 'Manage Validating'	 , 'section=content&act=mem&code=mod'  ),

 

Add below:

 

15 => array ( 'Merge Members'		 , 'section=content&act=mem&code=merge'		),

 

Для 1.3

 

Open: ./sources/Admin/admin_pages.php

 

Find:

 

8 => array ( 'Подтверждение рег-ций', 'act=mem&code=mod'  ),

 

Add below:

 

15 => array ( 'Объединение аккаунтов'		 , 'act=mem&code=merge'		),

 

Для 2.1

 

Open: ./sources/action_admin/member.php

 

Find:

 

	default:
			$this->ipsclass->admin->cp_permission_check( $this->perm_main.'|'.$this->perm_child.':' );
			$this->search_form();
			break;

 

Add above:

 

case 'merge':
			$this->merge_member();
			break;
		case 'domerge':
			$this->do_merge_member();
			break;

 

Для 1.3

 

Open: ./sources/Admin/ad_member.php

 

Find:

 

default:
			$this->search_form();
			break;

Add above:

 

case 'merge':
			$this->merge_member();
			break;
		case 'domerge':
			$this->do_merge_member();
			break;

 

Там же:

 

Для 2.1

 

Find:

 

}

?>

 

Add above:

 

/*-------------------------------------------------------------------------*/
// Merge Members
/*-------------------------------------------------------------------------*/

function merge_member()
{
	$this->ipsclass->admin->page_title  = "Merge Members";
	$this->ipsclass->admin->page_detail = "Merge allows you to join two member accounts into one single account. The source account will be combined into the destination account.<br />Announcements, attachments, calendar events, private messages, topics, posts, post count, buddylist and ignorelist will be combined. The combined member will still have the same permissions that the destination member had to begin with. Any access masks or moderator ability that the source member had will not be transferred.<br /><font color='red'><b>Warning: This process can not be reversed.</b></font>";

	//-----------------------------------------
	// Make sure we're a root admin, or else!
	//-----------------------------------------

	if( $this->ipsclass->member['mgroup'] != $this->ipsclass->vars['admin_group'] )
	{
		$this->ipsclass->admin->error( "Sorry, this function is for the root admin group only" );
	}

	//-----------------------------------------
	// Start form
	//-----------------------------------------

	$this->ipsclass->html .= $this->ipsclass->adskin->start_form( array(
																	1 => array( 'code'  , 'domerge' ),
											 						2 => array( 'act'   , 'mem'	 ),
											 						4 => array( 'section', $this->ipsclass->section_code )
								   								)	  );

	$this->ipsclass->html .= $this->ipsclass->adskin->start_table( 'Merge Members' );

	$this->ipsclass->html .= $this->ipsclass->adskin->add_td_row( array( "<b>Source Username</b>", $this->ipsclass->adskin->form_input( 'sname', $_POST['sname'] ? $_POST['sname'] : '' ) ) );

	$this->ipsclass->html .= $this->ipsclass->adskin->add_td_row( array( "<b>Destination Username</b>", $this->ipsclass->adskin->form_input( 'dname', $_POST['dname'] ? $_POST['dname'] : '' ) ) );

	$this->ipsclass->html .= $this->ipsclass->adskin->end_form( 'Continue' );

	$this->ipsclass->html .= $this->ipsclass->adskin->end_table();

	$this->ipsclass->admin->output();
}

 

Для 1.3 эта функция будет выглядеть как-то так:

 

/*-------------------------------------------------------------------------*/
// Merge Members
/*-------------------------------------------------------------------------*/

function merge_member()
{
	$ADMIN->page_title  = "Merge Members";
	$ADMIN->page_detail = "Merge allows you to join two member accounts into one single account. The source account will be combined into the destination account.<br />Announcements, attachments, calendar events, private messages, topics, posts, post count, buddylist and ignorelist will be combined. The combined member will still have the same permissions that the destination member had to begin with. Any access masks or moderator ability that the source member had will not be transferred.<br /><font color='red'><b>Warning: This process can not be reversed.</b></font>";



	//-----------------------------------------
	// Start form
	//-----------------------------------------

	$ADMIN->html .= $SKIN->start_form( array(
											  1 => array( 'code'  , 'domerge' ),
											  2 => array( 'act'   , 'mem'	 ),

								   								)	  );

	$ADMIN->html .= $SKIN->start_table( 'Merge Members' );

	$ADMIN->html .= $SKIN->add_td_row( array( "<b>Source Username</b>", $ADMIN->html .= $SKIN->form_input( 'sname', $_POST['sname'] ? $_POST['sname'] : '' ) ) );

	$ADMIN->html .= $SKIN->add_td_row( array( "<b>Destination Username</b>", $ADMIN->html .= $SKIN->form_input( 'dname', $_POST['dname'] ? $_POST['dname'] : '' ) ) );

	$ADMIN->html .= $SKIN->end_form( 'Continue' );

	$ADMIN->html .= $SKIN->end_table();

	$ADMIN->output();	
}

 

Ниже функции function merge_member() добавить:

 

Для 2.1

 

function do_merge_member()
{
	//-----------------------------------------
	// Make sure we're a root admin, or else!
	//-----------------------------------------

	if( $this->ipsclass->member['mgroup'] != $this->ipsclass->vars['admin_group'] )
	{
		$this->ipsclass->admin->error( "Sorry, this function is for the root admin group only" );
	}

	//-----------------------------------------
	// Check the inputs
	//-----------------------------------------

	$sname = strtolower(str_replace('|', '|', $this->ipsclass->input['sname']));
	$dname = strtolower(str_replace('|', '|', $this->ipsclass->input['dname']));

	if( $this->ipsclass->vars['auth_allow_dnames'] )
	{
		$ssql = " OR LOWER(members_display_name)='{$sname}'";
		$dsql = " OR LOWER(members_display_name)='{$dname}'";
	}

	# Check for source name
	if( empty($sname) )
	{
		$this->ipsclass->main_msg = "Invalid source username specified.";
		$this->merge_member();
	}

	$this->ipsclass->DB->simple_construct( array( 'select' => 'id,name,mgroup,posts,members_display_name', 'from' => 'members', 'where' => "LOWER(name)='{$sname}'".$ssql ) );
	$this->ipsclass->DB->simple_exec();

	if( ! $r = $this->ipsclass->DB->fetch_row() )
	{
		$this->ipsclass->main_msg = "Invalid source username specified.";
		$this->merge_member();
	}

	# Check for destination name
	if( empty($dname) )
	{
		$this->ipsclass->main_msg = "Invalid destination username specified.";
		$this->merge_member();
	}

	$this->ipsclass->DB->simple_construct( array( 'select' => 'id,name,mgroup,ip_address,posts,members_display_name', 'from' => 'members', 'where' => "LOWER(name)='{$dname}'".$dsql ) );
	$this->ipsclass->DB->simple_exec();

	if( ! $row = $this->ipsclass->DB->fetch_row() )
	{
		$this->ipsclass->main_msg = "Invalid destination username specified.";
		$this->merge_member();
	}

	# Check for both
	if( $r['name'] == $row['name'] )
	{
		$this->ipsclass->main_msg = "The source and destination members can not be identical.";
		$this->merge_member();
	}

	if( $r['mgroup'] == $this->ipsclass->vars['admin_group'] && $r['mgroup'] != $row['mgroup'] )
	{
		$this->ipsclass->admin->error( "Sorry, you can not join a root admin account into a non-root admin account." );
	}

	if( $this->ipsclass->vars['auth_allow_dnames'] && $dname != $row['members_display_name'] )
	{
		$dname = $row['members_display_name'];
	}

	if( $_POST['confirm'] )
	{
		# So, lets do the converteroo
		$this->ipsclass->DB->do_update( 'announcements', array( 'announce_member_id' => $row['id'] ), 'announce_member_id='.$r['id'] );
		$this->ipsclass->DB->do_update( 'attachments', array( 'attach_member_id' => $row['id'] ), 'attach_member_id='.$r['id'] );
		$this->ipsclass->DB->do_update( 'cal_events', array( 'event_member_id' => $row['id'] ), 'event_member_id='.$r['id'] );
		$this->ipsclass->DB->do_update( 'calendar_events', array( 'userid' => $row['id'] ), 'userid='.$r['id'] );
		$this->ipsclass->DB->do_update( 'contacts', array( 'contact_id' => $row['id'], 'contact_name' => $dname ), 'contact_id='.$r['id'] );
		$this->ipsclass->DB->do_update( 'contacts', array( 'member_id' => $row['id'] ), 'member_id='.$r['id'] );
		$this->ipsclass->DB->do_update( 'forums', array( 'last_poster_id' => $row['id'], 'last_poster_name' => $dname ), 'last_poster_id='.$r['id'] );
		$this->ipsclass->DB->do_update( 'message_text', array( 'msg_author_id' => $row['id'], 'msg_ip_address' => $row['ip_address'] ), 'msg_author_id='.$r['id'] );
		$this->ipsclass->DB->do_update( 'message_topics', array( 'mt_from_id' => $row['id'] ), 'mt_from_id='.$r['id'] );
		$this->ipsclass->DB->do_update( 'message_topics', array( 'mt_to_id' => $row['id'] ), 'mt_to_id='.$r['id'] );
		$this->ipsclass->DB->do_update( 'message_topics', array( 'mt_owner_id' => $row['id'] ), 'mt_owner_id='.$r['id'] );
		$this->ipsclass->DB->do_update( 'polls', array( 'starter_id' => $row['id'] ), 'starter_id='.$r['id'] );
		$this->ipsclass->DB->do_update( 'posts', array( 'author_id' => $row['id'], 'author_name' => $dname, 'ip_address' => $row['ip_address'] ), 'author_id='.$r['id'] );
		$this->ipsclass->DB->do_update( 'subscription_trans', array( 'subtrans_member_id' => $row['id'], 'subtrans_old_group' => $row['mgroup'] ), 'subtrans_member_id='.$r['id'] );
		$this->ipsclass->DB->do_update( 'topics', array( 'starter_id' => $row['id'], 'starter_name' => $dname ), 'starter_id='.$r['id'] );
		$this->ipsclass->DB->do_update( 'topics', array( 'last_poster_id' => $row['id'], 'last_poster_name' => $dname ), 'last_poster_id='.$r['id'] );

		# Update new post count
		$this->ipsclass->DB->do_update( 'members', array( 'posts' => intval($r['posts'] + $row['posts']) ), 'id='.$row['id'] );

		# Delete
		foreach( array('admin_logs','forum_tracker','moderator_logs','moderators','pfields_content','sessions','tracker','validating','voters') as $tbl )
		{
			$this->ipsclass->DB->simple_exec_query( array( 'delete' => $tbl, 'where' => 'member_id='.$r['id'] ) );
		}

		$this->ipsclass->DB->simple_exec_query( array( 'delete' => 'dnames_change'	, 'where' => 'dname_member_id='.$r['id'] ) );
		$this->ipsclass->DB->simple_exec_query( array( 'delete' => 'email_logs'	   , 'where' => 'from_member_id='.$r['id'].' OR to_member_id='.$r['id'] ) );
		$this->ipsclass->DB->simple_exec_query( array( 'delete' => 'members'		  , 'where' => 'id='.$r['id'] ) );
		$this->ipsclass->DB->simple_exec_query( array( 'delete' => 'member_extra'	 , 'where' => 'id='.$r['id'] ) );
		$this->ipsclass->DB->simple_exec_query( array( 'delete' => 'members_converge' , 'where' => 'converge_id='.$r['id'] ) );
		$this->ipsclass->DB->simple_exec_query( array( 'delete' => 'subscription_logs', 'where' => 'sublog_member_id='.$r['id'] ) );
		$this->ipsclass->DB->simple_exec_query( array( 'delete' => 'topic_markers'	, 'where' => 'marker_member_id='.$r['id'] ) );
		$this->ipsclass->DB->simple_exec_query( array( 'delete' => 'topic_ratings'	, 'where' => 'rating_member_id='.$r['id'] ) );
		$this->ipsclass->DB->simple_exec_query( array( 'delete' => 'topics_read'	  , 'where' => 'read_mid='.$r['id'] ) );
		$this->ipsclass->DB->simple_exec_query( array( 'delete' => 'warn_logs'		, 'where' => 'wlog_mid='.$r['id'] ) );

		if( USE_MODULES == 1 )
		{
			$this->modules->register_class($this);
			$this->modules->on_delete($ids);
		}

		# Recache moderators
		require_once( ROOT_PATH .'sources/action_admin/moderator.php' );
		$admod = new ad_moderator();
		$admod->ipsclass =& $this->ipsclass;
		$admod->rebuild_moderator_cache();

		# Recache announcements
		require_once( ROOT_PATH.'sources/action_public/announcements.php' );
		$announcements = new announcements();
		$announcements->ipsclass =& $this->ipsclass;
		$announcements->announce_recache();

		# Recache forums
		$this->ipsclass->update_forum_cache();

		# Update stats
		$stats = $this->ipsclass->DB->simple_exec_query( array( 'select' => '*', 'from' => 'cache_store', 'where' => "cs_key='stats'" ) );
		$stats = unserialize($this->ipsclass->txt_stripslashes($stats['cs_value']));

		$this->ipsclass->DB->simple_construct( array( 'select' => 'id,name,members_display_name',
													  'from'   => 'members',
													  'where'  => "mgroup <> '".$this->ipsclass->vars['auth_group']."'",
													  'order'  => "id DESC",
													  'limit'  => array(0,1) ) );
		$this->ipsclass->DB->simple_exec();

		$i = $this->ipsclass->DB->fetch_row();
		$stats['last_mem_name'] = $i['members_display_name'] ? $i['members_display_name'] : $i['name'];
		$stats['last_mem_id']   = $i['id'];

		if( count($stats) > 0 )
		{
			$this->ipsclass->cache['stats'] =& $stats;
			$this->ipsclass->update_cache( array( 'name' => 'stats', 'array' => 1, 'deletefirst' => 1 ) );
		}

		$this->ipsclass->admin->save_log( "Merged '{$r['name']}' into '{$row['name']}' and deleted member {$r['name']}" );
		$this->ipsclass->admin->done_screen( "Member Account Merged.", "Merge Members", $this->ipsclass->form_code.'&code=merge', 'redirect' );
	}
	else
	{
		//-----------------------------------------
		// Confirm Merge
		//-----------------------------------------

		$this->ipsclass->html .= $this->ipsclass->adskin->start_form( array(
																		1 => array( 'code'   , 'domerge' ),
												 						2 => array( 'act'	, 'mem'	 ),
												 						3 => array( 'sname'  , $sname	),
												 						4 => array( 'dname'  , $dname	),
												 						5 => array( 'section', $this->ipsclass->section_code )
									   								)	  );

		$this->ipsclass->html .= $this->ipsclass->adskin->start_table( 'Confirm Merge' );

		$this->ipsclass->html .= $this->ipsclass->adskin->add_td_basic( "Are you sure you want to merge <b>{$r['name']}</b> (Display name: {$r['members_display_name']})<br />into <b>{$row['name']}</b> (Display name: {$row['members_display_name']})?<br /><br /><b>{$r['name']}</b> will be deleted after the merge." );

		$this->ipsclass->html .= $this->ipsclass->adskin->add_td_basic( "<input name='confirm' type='submit' value='Yes' accesskey='s' class='realbutton' /> ".$this->ipsclass->adskin->js_make_button( 'No', $this->ipsclass->base_url.'&'.$this->ipsclass->form_code_js.'&code=merge' ), 'center', 'tablefooter' );

		$this->ipsclass->html .= $this->ipsclass->adskin->end_table();

		$this->ipsclass->admin->output();
	}
}

 

Вот, собственно, и весь мод.

 

А вот как правильно записать функцию function do_merge_member() для версии 1.3 ? Здесь надо учесть, что в 1.3 нет встроенных объявлений, поэтому весь announcements надо вырезать.

Может кто хорошо владеет PHP посмотрит этот код функции и поможет подправить?

Ссылка на комментарий
Поделиться на других сайтах

  • 3 недели спустя...
  • 1 год спустя...

Сделал слияние 2-х пользователей в одного через модули. Параллельно показывает список забаненых, в перспективе буду делать удобные инструменты разбанивания для админов/модераторов.

Показ забаненых и склейка аккаунтов уже сейчас работают корректно.

 

Файл поместить в директорию modules, вызов по index.php?act=module&module=banka

mod_banka.php

Ссылка на комментарий
Поделиться на других сайтах

  • 3 года спустя...

Файл поместить в директорию modules, вызов по index.php?act=module&module=banka

Хорошо, а как правлильно внедрить этот вызов в Админцентр? (

15 => array ( 'Объединение аккаунтов'

)

Ссылка на комментарий
Поделиться на других сайтах

Хорошо, а как правлильно внедрить этот вызов в Админцентр?

Научиться читать.

вызов по index.php?act=module&module=banka

Где тут слова про админцентр?
Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.