mirror of https://github.com/procxx/kepka.git
				
				
				
			Handle the ADMINS_TOO_MUCH error for channels.
This commit is contained in:
		
							parent
							
								
									0238c03956
								
							
						
					
					
						commit
						38daffdbfe
					
				|  | @ -123,6 +123,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL | ||||||
| "lng_error_cant_add_admin_invite" = "Sorry, you can't add this user as an admin because they are not a member of this group and you are not allowed to invite them."; | "lng_error_cant_add_admin_invite" = "Sorry, you can't add this user as an admin because they are not a member of this group and you are not allowed to invite them."; | ||||||
| "lng_error_cant_add_admin_unban" = "Sorry, you can't add this user as an admin because they are in the blacklist and you can't unban them."; | "lng_error_cant_add_admin_unban" = "Sorry, you can't add this user as an admin because they are in the blacklist and you can't unban them."; | ||||||
| "lng_error_cant_ban_admin" = "Sorry, you can't ban this user because they are an admin in this group and you are not allowed to demote them."; | "lng_error_cant_ban_admin" = "Sorry, you can't ban this user because they are an admin in this group and you are not allowed to demote them."; | ||||||
|  | "lng_error_admin_limit" = "Sorry, you've reached the maximum number of admins for this group."; | ||||||
|  | "lng_error_admin_limit_channel" = "Sorry, you've reached the maximum number of admins for this channel."; | ||||||
| "lng_sure_add_admin_invite" = "This user is not a member of this group. Add them to the group and promote them to admin?"; | "lng_sure_add_admin_invite" = "This user is not a member of this group. Add them to the group and promote them to admin?"; | ||||||
| "lng_sure_add_admin_invite_channel" = "This user is not a subscriber of this channel. Add them to the channel and promote them to admin?"; | "lng_sure_add_admin_invite_channel" = "This user is not a subscriber of this channel. Add them to the channel and promote them to admin?"; | ||||||
| "lng_sure_add_admin_unban" = "This user is currently restricted or banned. Are you sure you want to unban and promote them?"; | "lng_sure_add_admin_unban" = "This user is currently restricted or banned. Are you sure you want to unban and promote them?"; | ||||||
|  |  | ||||||
|  | @ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL | ||||||
| #include "ui/widgets/labels.h" | #include "ui/widgets/labels.h" | ||||||
| #include "boxes/confirm_box.h" | #include "boxes/confirm_box.h" | ||||||
| #include "boxes/edit_participant_box.h" | #include "boxes/edit_participant_box.h" | ||||||
|  | #include "profile/profile_channel_controllers.h" | ||||||
| #include "ui/widgets/popup_menu.h" | #include "ui/widgets/popup_menu.h" | ||||||
| #include "data/data_peer_values.h" | #include "data/data_peer_values.h" | ||||||
| #include "mainwidget.h" | #include "mainwidget.h" | ||||||
|  | @ -67,16 +68,19 @@ void GroupMembersWidget::editAdmin(not_null<UserData*> user) { | ||||||
| 	auto currentRightsIt = megagroup->mgInfo->lastAdmins.find(user); | 	auto currentRightsIt = megagroup->mgInfo->lastAdmins.find(user); | ||||||
| 	auto hasAdminRights = (currentRightsIt != megagroup->mgInfo->lastAdmins.cend()); | 	auto hasAdminRights = (currentRightsIt != megagroup->mgInfo->lastAdmins.cend()); | ||||||
| 	auto currentRights = hasAdminRights ? currentRightsIt->second.rights : MTP_channelAdminRights(MTP_flags(0)); | 	auto currentRights = hasAdminRights ? currentRightsIt->second.rights : MTP_channelAdminRights(MTP_flags(0)); | ||||||
| 	auto weak = QPointer<GroupMembersWidget>(this); | 	auto weak = std::make_shared<QPointer<EditAdminBox>>(nullptr); | ||||||
| 	auto box = Box<EditAdminBox>(megagroup, user, currentRights); | 	auto box = Box<EditAdminBox>(megagroup, user, currentRights); | ||||||
| 	box->setSaveCallback([weak, megagroup, user](const MTPChannelAdminRights &oldRights, const MTPChannelAdminRights &newRights) { | 	box->setSaveCallback(SaveAdminCallback(megagroup, user, [=]( | ||||||
| 		Ui::hideLayer(); | 			const MTPChannelAdminRights &newRights) { | ||||||
| 		MTP::send(MTPchannels_EditAdmin(megagroup->inputChannel, user->inputUser, newRights), rpcDone([weak, megagroup, user, oldRights, newRights](const MTPUpdates &result) { | 		if (*weak) { | ||||||
| 			if (App::main()) App::main()->sentUpdatesReceived(result); | 			(*weak)->closeBox(); | ||||||
| 			megagroup->applyEditAdmin(user, oldRights, newRights); | 		} | ||||||
| 		})); | 	}, [=] { | ||||||
| 	}); | 		if (*weak) { | ||||||
| 	Ui::show(std::move(box)); | 			(*weak)->closeBox(); | ||||||
|  | 		} | ||||||
|  | 	})); | ||||||
|  | 	*weak = Ui::show(std::move(box)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GroupMembersWidget::restrictUser(not_null<UserData*> user) { | void GroupMembersWidget::restrictUser(not_null<UserData*> user) { | ||||||
|  |  | ||||||
|  | @ -53,6 +53,56 @@ void RemoveAdmin( | ||||||
| 
 | 
 | ||||||
| } // namespace
 | } // namespace
 | ||||||
| 
 | 
 | ||||||
|  | base::lambda<void( | ||||||
|  | 	const MTPChannelAdminRights &oldRights, | ||||||
|  | 	const MTPChannelAdminRights &newRights)> SaveAdminCallback( | ||||||
|  | 		not_null<ChannelData*> channel, | ||||||
|  | 		not_null<UserData*> user, | ||||||
|  | 		base::lambda<void(const MTPChannelAdminRights &newRights)> onDone, | ||||||
|  | 		base::lambda<void()> onFail) { | ||||||
|  | 	return [=]( | ||||||
|  | 			const MTPChannelAdminRights &oldRights, | ||||||
|  | 			const MTPChannelAdminRights &newRights) { | ||||||
|  | 		auto done = [=](const MTPUpdates &result) { | ||||||
|  | 			Auth().api().applyUpdates(result); | ||||||
|  | 			channel->applyEditAdmin(user, oldRights, newRights); | ||||||
|  | 			onDone(newRights); | ||||||
|  | 		}; | ||||||
|  | 		auto fail = [=](const RPCError &error) { | ||||||
|  | 			if (MTP::isDefaultHandledError(error)) { | ||||||
|  | 				return false; | ||||||
|  | 			} | ||||||
|  | 			if (error.type() == qstr("USER_NOT_MUTUAL_CONTACT")) { | ||||||
|  | 				Ui::show( | ||||||
|  | 					Box<InformBox>(PeerFloodErrorText( | ||||||
|  | 						channel->isMegagroup() | ||||||
|  | 						? PeerFloodType::InviteGroup | ||||||
|  | 						: PeerFloodType::InviteChannel)), | ||||||
|  | 					LayerOption::KeepOther); | ||||||
|  | 			} else if (error.type() == qstr("BOT_GROUPS_BLOCKED")) { | ||||||
|  | 				Ui::show( | ||||||
|  | 					Box<InformBox>(lang(lng_error_cant_add_bot)), | ||||||
|  | 					LayerOption::KeepOther); | ||||||
|  | 			} else if (error.type() == qstr("ADMINS_TOO_MUCH")) { | ||||||
|  | 				Ui::show( | ||||||
|  | 					Box<InformBox>(lang(channel->isMegagroup() | ||||||
|  | 						? lng_error_admin_limit | ||||||
|  | 						: lng_error_admin_limit_channel)), | ||||||
|  | 					LayerOption::KeepOther); | ||||||
|  | 			} | ||||||
|  | 			onFail(); | ||||||
|  | 			return true; | ||||||
|  | 		}; | ||||||
|  | 		MTP::send( | ||||||
|  | 			MTPchannels_EditAdmin( | ||||||
|  | 				channel->inputChannel, | ||||||
|  | 				user->inputUser, | ||||||
|  | 				newRights), | ||||||
|  | 			rpcDone(std::move(done)), | ||||||
|  | 			rpcFail(std::move(fail))); | ||||||
|  | 	}; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| ParticipantsBoxController::ParticipantsBoxController( | ParticipantsBoxController::ParticipantsBoxController( | ||||||
| 	not_null<Window::Navigation*> navigation, | 	not_null<Window::Navigation*> navigation, | ||||||
| 	not_null<ChannelData*> channel, | 	not_null<ChannelData*> channel, | ||||||
|  | @ -717,15 +767,16 @@ void ParticipantsBoxController::showAdmin(not_null<UserData*> user) { | ||||||
| 	auto canEdit = (_additional.adminCanEdit.find(user) != _additional.adminCanEdit.end()); | 	auto canEdit = (_additional.adminCanEdit.find(user) != _additional.adminCanEdit.end()); | ||||||
| 	auto canSave = notAdmin ? _channel->canAddAdmins() : canEdit; | 	auto canSave = notAdmin ? _channel->canAddAdmins() : canEdit; | ||||||
| 	if (canSave) { | 	if (canSave) { | ||||||
| 		box->setSaveCallback([channel = _channel.get(), user, weak](const MTPChannelAdminRights &oldRights, const MTPChannelAdminRights &newRights) { | 		box->setSaveCallback(SaveAdminCallback(_channel, user, [=]( | ||||||
| 			MTP::send(MTPchannels_EditAdmin(channel->inputChannel, user->inputUser, newRights), rpcDone([channel, user, weak, oldRights, newRights](const MTPUpdates &result) { | 				const MTPChannelAdminRights &newRights) { | ||||||
| 				Auth().api().applyUpdates(result); | 			if (weak) { | ||||||
| 				channel->applyEditAdmin(user, oldRights, newRights); | 				weak->editAdminDone(user, newRights); | ||||||
| 				if (weak) { | 			} | ||||||
| 					weak->editAdminDone(user, newRights); | 		}, [=] { | ||||||
| 				} | 			if (weak && weak->_editBox) { | ||||||
| 			})); | 				weak->_editBox->closeBox(); | ||||||
| 		}); | 			} | ||||||
|  | 		})); | ||||||
| 	} | 	} | ||||||
| 	_editBox = Ui::show(std::move(box), LayerOption::KeepOther); | 	_editBox = Ui::show(std::move(box), LayerOption::KeepOther); | ||||||
| } | } | ||||||
|  | @ -1389,35 +1440,16 @@ void AddParticipantBoxController::showAdmin(not_null<UserData*> user, bool sure) | ||||||
| 			&& (_additional.adminCanEdit.find(user) == _additional.adminCanEdit.end())); | 			&& (_additional.adminCanEdit.find(user) == _additional.adminCanEdit.end())); | ||||||
| 	auto box = Box<EditAdminBox>(_channel, user, currentRights); | 	auto box = Box<EditAdminBox>(_channel, user, currentRights); | ||||||
| 	if (!canNotEdit) { | 	if (!canNotEdit) { | ||||||
| 		box->setSaveCallback([channel = _channel.get(), user, weak](const MTPChannelAdminRights &oldRights, const MTPChannelAdminRights &newRights) { | 		box->setSaveCallback(SaveAdminCallback(_channel, user, [=]( | ||||||
| 			MTP::send(MTPchannels_EditAdmin(channel->inputChannel, user->inputUser, newRights), rpcDone([channel, user, weak, oldRights, newRights](const MTPUpdates &result) { | 				const MTPChannelAdminRights &newRights) { | ||||||
| 				Auth().api().applyUpdates(result); | 			if (weak) { | ||||||
| 				channel->applyEditAdmin(user, oldRights, newRights); | 				weak->editAdminDone(user, newRights); | ||||||
| 				if (weak) { | 			} | ||||||
| 					weak->editAdminDone(user, newRights); | 		}, [=] { | ||||||
| 				} | 			if (weak && weak->_editBox) { | ||||||
| 			}), rpcFail([channel, weak](const RPCError &error) { | 				weak->_editBox->closeBox(); | ||||||
| 				if (MTP::isDefaultHandledError(error)) { | 			} | ||||||
| 					return false; | 		})); | ||||||
| 				} |  | ||||||
| 				if (error.type() == qstr("USER_NOT_MUTUAL_CONTACT")) { |  | ||||||
| 					Ui::show( |  | ||||||
| 						Box<InformBox>(PeerFloodErrorText( |  | ||||||
| 							channel->isMegagroup() |  | ||||||
| 								? PeerFloodType::InviteGroup |  | ||||||
| 								: PeerFloodType::InviteChannel)), |  | ||||||
| 						LayerOption::KeepOther); |  | ||||||
| 				} else if (error.type() == qstr("BOT_GROUPS_BLOCKED")) { |  | ||||||
| 					Ui::show( |  | ||||||
| 						Box<InformBox>(lang(lng_error_cant_add_bot)), |  | ||||||
| 						LayerOption::KeepOther); |  | ||||||
| 				} |  | ||||||
| 				if (weak && weak->_editBox) { |  | ||||||
| 					weak->_editBox->closeBox(); |  | ||||||
| 				} |  | ||||||
| 				return true; |  | ||||||
| 			})); |  | ||||||
| 		}); |  | ||||||
| 	} | 	} | ||||||
| 	_editBox = Ui::show(std::move(box), LayerOption::KeepOther); | 	_editBox = Ui::show(std::move(box), LayerOption::KeepOther); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -20,6 +20,14 @@ class Navigation; | ||||||
| 
 | 
 | ||||||
| namespace Profile { | namespace Profile { | ||||||
| 
 | 
 | ||||||
|  | base::lambda<void( | ||||||
|  | 	const MTPChannelAdminRights &oldRights, | ||||||
|  | 	const MTPChannelAdminRights &newRights)> SaveAdminCallback( | ||||||
|  | 		not_null<ChannelData*> channel, | ||||||
|  | 		not_null<UserData*> user, | ||||||
|  | 		base::lambda<void(const MTPChannelAdminRights &newRights)> onDone, | ||||||
|  | 		base::lambda<void()> onFail); | ||||||
|  | 
 | ||||||
| // Viewing admins, banned or restricted users list with search.
 | // Viewing admins, banned or restricted users list with search.
 | ||||||
| class ParticipantsBoxController | class ParticipantsBoxController | ||||||
| 	: public PeerListController | 	: public PeerListController | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue