diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index c226c127a..22b7df6c9 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -1700,6 +1700,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_exceptions_list_title" = "Exceptions"; "lng_removed_list_title" = "Removed users"; +"lng_admin_log_slow_mode_seconds#one" = "{count} second"; +"lng_admin_log_slow_mode_seconds#other" = "{count} seconds"; +"lng_admin_log_slow_mode_minutes#one" = "{count} minute"; +"lng_admin_log_slow_mode_minutes#other" = "{count} minutes"; + "lng_admin_log_title_all" = "All actions"; "lng_admin_log_title_selected" = "Selected actions"; "lng_admin_log_filter" = "Filter"; @@ -1774,6 +1779,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_admin_log_removed_linked_channel" = "{from} removed the linked channel"; "lng_admin_log_changed_location_chat" = "{from} changed the group location to {address}"; "lng_admin_log_removed_location_chat" = "{from} removed the group location"; +"lng_admin_log_changed_slow_mode" = "{from} changed slow mode to {duration}"; +"lng_admin_log_removed_slow_mode" = "{from} disabled slow mode"; "lng_admin_log_user_with_username" = "{name} ({mention})"; "lng_admin_log_restricted_forever" = "indefinitely"; "lng_admin_log_restricted_until" = "until {date}"; diff --git a/Telegram/Resources/scheme.tl b/Telegram/Resources/scheme.tl index 1953f0395..18d087395 100644 --- a/Telegram/Resources/scheme.tl +++ b/Telegram/Resources/scheme.tl @@ -241,11 +241,11 @@ userStatusLastMonth#77ebc742 = UserStatus; chatEmpty#9ba2d800 id:int = Chat; chat#3bda1bde flags:# creator:flags.0?true kicked:flags.1?true left:flags.2?true deactivated:flags.5?true id:int title:string photo:ChatPhoto participants_count:int date:int version:int migrated_to:flags.6?InputChannel admin_rights:flags.14?ChatAdminRights default_banned_rights:flags.18?ChatBannedRights = Chat; chatForbidden#7328bdb id:int title:string = Chat; -channel#4df30834 flags:# creator:flags.0?true left:flags.2?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true signatures:flags.11?true min:flags.12?true scam:flags.19?true has_link:flags.20?true has_geo:flags.21?true id:int access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int version:int restriction_reason:flags.9?string admin_rights:flags.14?ChatAdminRights banned_rights:flags.15?ChatBannedRights default_banned_rights:flags.18?ChatBannedRights participants_count:flags.17?int = Chat; +channel#4df30834 flags:# creator:flags.0?true left:flags.2?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true signatures:flags.11?true min:flags.12?true scam:flags.19?true has_link:flags.20?true has_geo:flags.21?true slowmode_enabled:flags.22?true id:int access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int version:int restriction_reason:flags.9?string admin_rights:flags.14?ChatAdminRights banned_rights:flags.15?ChatBannedRights default_banned_rights:flags.18?ChatBannedRights participants_count:flags.17?int = Chat; channelForbidden#289da732 flags:# broadcast:flags.5?true megagroup:flags.8?true id:int access_hash:long title:string until_date:flags.16?int = Chat; chatFull#1b7c9db3 flags:# can_set_username:flags.7?true id:int about:string participants:ChatParticipants chat_photo:flags.2?Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:flags.3?Vector pinned_msg_id:flags.6?int folder_id:flags.11?int = ChatFull; -channelFull#10916653 flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_view_stats:flags.12?true can_set_location:flags.16?true id:int about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?int migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?int location:flags.15?ChannelLocation pts:int = ChatFull; +channelFull#2d895c74 flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_view_stats:flags.12?true can_set_location:flags.16?true id:int about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?int migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?int location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int pts:int = ChatFull; chatParticipant#c8d7493e user_id:int inviter_id:int date:int = ChatParticipant; chatParticipantCreator#da13538a user_id:int = ChatParticipant; @@ -314,9 +314,10 @@ geoPoint#296f104 long:double lat:double access_hash:long = GeoPoint; auth.checkedPhone#811ea28e phone_registered:Bool = auth.CheckedPhone; -auth.sentCode#38faab5f flags:# phone_registered:flags.0?true type:auth.SentCodeType phone_code_hash:string next_type:flags.1?auth.CodeType timeout:flags.2?int terms_of_service:flags.3?help.TermsOfService = auth.SentCode; +auth.sentCode#5e002502 flags:# type:auth.SentCodeType phone_code_hash:string next_type:flags.1?auth.CodeType timeout:flags.2?int = auth.SentCode; auth.authorization#cd050916 flags:# tmp_sessions:flags.0?int user:User = auth.Authorization; +auth.authorizationSignUpRequired#44747e9a flags:# terms_of_service:flags.0?help.TermsOfService = auth.Authorization; auth.exportedAuthorization#df969c2d id:int bytes:bytes = auth.ExportedAuthorization; @@ -493,7 +494,7 @@ config#330b4067 flags:# phonecalls_enabled:flags.1?true default_p2p_contacts:fla nearestDc#8e1a1775 country:string this_dc:int nearest_dc:int = NearestDc; -help.appUpdate#1da7158f flags:# popup:flags.0?true id:int version:string text:string entities:Vector document:flags.1?Document url:flags.2?string = help.AppUpdate; +help.appUpdate#1da7158f flags:# can_not_skip:flags.0?true id:int version:string text:string entities:Vector document:flags.1?Document url:flags.2?string = help.AppUpdate; help.noAppUpdate#c45a6536 = help.AppUpdate; help.inviteText#18cb9f78 message:string = help.InviteText; @@ -699,8 +700,8 @@ channelMessagesFilter#cd77d957 flags:# exclude_new_messages:flags.1?true ranges: channelParticipant#15ebac1d user_id:int date:int = ChannelParticipant; channelParticipantSelf#a3289a6d user_id:int inviter_id:int date:int = ChannelParticipant; -channelParticipantCreator#e3e2e1f9 user_id:int = ChannelParticipant; -channelParticipantAdmin#5daa6e23 flags:# can_edit:flags.0?true self:flags.1?true user_id:int inviter_id:flags.1?int promoted_by:int date:int admin_rights:ChatAdminRights = ChannelParticipant; +channelParticipantCreator#808d15a4 flags:# user_id:int rank:flags.0?string = ChannelParticipant; +channelParticipantAdmin#ccbebbaf flags:# can_edit:flags.0?true self:flags.1?true user_id:int inviter_id:flags.1?int promoted_by:int date:int admin_rights:ChatAdminRights rank:flags.2?string = ChannelParticipant; channelParticipantBanned#1c0facaf flags:# left:flags.0?true user_id:int kicked_by:int date:int banned_rights:ChatBannedRights = ChannelParticipant; channelParticipantsRecent#de3f3c79 = ChannelParticipantsFilter; @@ -901,7 +902,7 @@ payments.paymentForm#3f56aea3 flags:# can_save_credentials:flags.2?true password payments.validatedRequestedInfo#d1451883 flags:# id:flags.0?string shipping_options:flags.1?Vector = payments.ValidatedRequestedInfo; payments.paymentResult#4e5f810d updates:Updates = payments.PaymentResult; -payments.paymentVerficationNeeded#6b56b921 url:string = payments.PaymentResult; +payments.paymentVerificationNeeded#d8411139 url:string = payments.PaymentResult; payments.paymentReceipt#500911e1 flags:# date:int bot_id:int invoice:Invoice provider_id:int info:flags.0?PaymentRequestedInfo shipping:flags.1?ShippingOption currency:string total_amount:long credentials_title:string users:Vector = payments.PaymentReceipt; @@ -968,6 +969,7 @@ channelAdminLogEventActionDefaultBannedRights#2df5fc0a prev_banned_rights:ChatBa channelAdminLogEventActionStopPoll#8f079643 message:Message = ChannelAdminLogEventAction; channelAdminLogEventActionChangeLinkedChat#a26f881b prev_value:int new_value:int = ChannelAdminLogEventAction; channelAdminLogEventActionChangeLocation#e6b76ae prev_value:ChannelLocation new_value:ChannelLocation = ChannelAdminLogEventAction; +channelAdminLogEventActionToggleSlowMode#53909779 prev_value:int new_value:int = ChannelAdminLogEventAction; channelAdminLogEvent#3b5a3e40 id:long date:int user_id:int action:ChannelAdminLogEventAction = ChannelAdminLogEvent; @@ -1190,7 +1192,7 @@ invokeWithMessagesRange#365275f2 {X:Type} range:MessageRange query:!X = X; invokeWithTakeout#aca9fd2e {X:Type} takeout_id:long query:!X = X; auth.sendCode#a677244f phone_number:string api_id:int api_hash:string settings:CodeSettings = auth.SentCode; -auth.signUp#1b067634 phone_number:string phone_code_hash:string phone_code:string first_name:string last_name:string = auth.Authorization; +auth.signUp#80eee427 phone_number:string phone_code_hash:string first_name:string last_name:string = auth.Authorization; auth.signIn#bcd51581 phone_number:string phone_code_hash:string phone_code:string = auth.Authorization; auth.logOut#5717da40 = Bool; auth.resetAuthorizations#9fab0d1a = Bool; @@ -1447,7 +1449,7 @@ channels.getParticipant#546dd7a6 channel:InputChannel user_id:InputUser = channe channels.getChannels#a7f6bbb id:Vector = messages.Chats; channels.getFullChannel#8736a09 channel:InputChannel = messages.ChatFull; channels.createChannel#3d5fb10f flags:# broadcast:flags.0?true megagroup:flags.1?true title:string about:string geo_point:flags.2?InputGeoPoint address:flags.2?string = Updates; -channels.editAdmin#70f893ba channel:InputChannel user_id:InputUser admin_rights:ChatAdminRights = Updates; +channels.editAdmin#d33c8902 channel:InputChannel user_id:InputUser admin_rights:ChatAdminRights rank:string = Updates; channels.editTitle#566decd0 channel:InputChannel title:string = Updates; channels.editPhoto#f12e57c9 channel:InputChannel photo:InputChatPhoto = Updates; channels.checkUsername#10e6bd2c channel:InputChannel username:string = Bool; @@ -1470,6 +1472,7 @@ channels.getGroupsForDiscussion#f5dad378 = messages.Chats; channels.setDiscussionGroup#40582bb2 broadcast:InputChannel group:InputChannel = Bool; channels.editCreator#8f38cd1f channel:InputChannel user_id:InputUser password:InputCheckPasswordSRP = Updates; channels.editLocation#58e63f6d channel:InputChannel geo_point:InputGeoPoint address:string = Bool; +channels.toggleSlowMode#edd49ef0 channel:InputChannel seconds:int = Updates; bots.sendCustomRequest#aa2769ed custom_method:string params:DataJSON = DataJSON; bots.answerWebhookJSONQuery#e6213f4d query_id:long data:DataJSON = Bool; @@ -1504,4 +1507,4 @@ langpack.getLanguage#6a596502 lang_pack:string lang_code:string = LangPackLangua folders.editPeerFolders#6847d0ab folder_peers:Vector = Updates; folders.deleteFolder#1c295881 folder_id:int = Updates; -// LAYER 103 +// LAYER 104 diff --git a/Telegram/SourceFiles/boxes/peers/add_participants_box.cpp b/Telegram/SourceFiles/boxes/peers/add_participants_box.cpp index 18f6d4536..774034110 100644 --- a/Telegram/SourceFiles/boxes/peers/add_participants_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/add_participants_box.cpp @@ -591,7 +591,8 @@ void AddSpecialBoxController::editAdminDone( ? alreadyPromotedBy->bareId() : user->session().userId()), MTP_int(date), - rights)); + rights, + MTPstring())); // #TODO ranks } if (const auto callback = _adminDoneCallback) { callback(user, rights); diff --git a/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp index 15404e7e9..dbc3e0614 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp @@ -48,7 +48,8 @@ void RemoveAdmin( channel->session().api().request(MTPchannels_EditAdmin( channel->inputChannel, user->inputUser, - newRights + newRights, + MTP_string(QString()) // #TODO ranks )).done([=](const MTPUpdates &result) { channel->session().api().applyUpdates(result); channel->applyEditAdmin(user, oldRights, newRights); @@ -124,7 +125,8 @@ void SaveChannelAdmin( channel->session().api().request(MTPchannels_EditAdmin( channel->inputChannel, user->inputUser, - newRights + newRights, + MTP_string(QString()) // #TODO ranks )).done([=](const MTPUpdates &result) { channel->session().api().applyUpdates(result); channel->applyEditAdmin(user, oldRights, newRights); @@ -1460,7 +1462,8 @@ void ParticipantsBoxController::editAdminDone( ? alreadyPromotedBy->bareId() : user->session().userId()), MTP_int(date), - rights)); + rights, + MTPstring())); // #TODO ranks if (_role == Role::Admins) { prependRow(user); } else if (_role == Role::Kicked || _role == Role::Restricted) { diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_item.cpp b/Telegram/SourceFiles/history/admin_log/history_admin_log_item.cpp index d37537f31..e8e1b834f 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_item.cpp +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_item.cpp @@ -700,6 +700,24 @@ void GenerateItems( }); }; + auto createToggleSlowMode = [&](const MTPDchannelAdminLogEventActionToggleSlowMode &action) { + if (const auto seconds = action.vnew_value().v) { + const auto duration = (seconds >= 60) + ? tr::lng_admin_log_slow_mode_minutes(tr::now, lt_count, seconds / 60) + : tr::lng_admin_log_slow_mode_seconds(tr::now, lt_count, seconds); + const auto text = tr::lng_admin_log_changed_slow_mode( + tr::now, + lt_from, + fromLinkText, + lt_duration, + duration); + addSimpleServiceMessage(text); + } else { + const auto text = tr::lng_admin_log_removed_slow_mode(tr::now, lt_from, fromLinkText); + addSimpleServiceMessage(text); + } + }; + action.match([&](const MTPDchannelAdminLogEventActionChangeTitle &data) { createChangeTitle(data); }, [&](const MTPDchannelAdminLogEventActionChangeAbout &data) { @@ -740,6 +758,8 @@ void GenerateItems( createChangeLinkedChat(data); }, [&](const MTPDchannelAdminLogEventActionChangeLocation &data) { createChangeLocation(data); + }, [&](const MTPDchannelAdminLogEventActionToggleSlowMode &data) { + createToggleSlowMode(data); }); } diff --git a/Telegram/SourceFiles/intro/introcode.cpp b/Telegram/SourceFiles/intro/introcode.cpp index 9c2e47747..14731086d 100644 --- a/Telegram/SourceFiles/intro/introcode.cpp +++ b/Telegram/SourceFiles/intro/introcode.cpp @@ -228,13 +228,24 @@ void CodeWidget::onCheckRequest() { void CodeWidget::codeSubmitDone(const MTPauth_Authorization &result) { stopCheck(); _sentRequest = 0; - auto &d = result.c_auth_authorization(); - if (d.vuser().type() != mtpc_user || !d.vuser().c_user().is_self()) { // wtf? - showCodeError(rpl::single(Lang::Hard::ServerError())); - return; - } - cSetLoggedPhoneNumber(getData()->phone); - finish(d.vuser()); + result.match([&](const MTPDauth_authorization &data) { + if (data.vuser().type() != mtpc_user + || !data.vuser().c_user().is_self()) { + showCodeError(rpl::single(Lang::Hard::ServerError())); + return; + } + cSetLoggedPhoneNumber(getData()->phone); + finish(data.vuser()); + }, [&](const MTPDauth_authorizationSignUpRequired &data) { + if (const auto terms = data.vterms_of_service()) { + terms->match([&](const MTPDhelp_termsOfService &data) { + getData()->termsLock = Window::TermsLock::FromMTP(data); + }); + } else { + getData()->termsLock = Window::TermsLock(); + } + goReplace(new Intro::SignupWidget(parentWidget(), getData())); + }); } bool CodeWidget::codeSubmitFail(const RPCError &error) { @@ -257,14 +268,12 @@ bool CodeWidget::codeSubmitFail(const RPCError &error) { } else if (err == qstr("PHONE_CODE_EMPTY") || err == qstr("PHONE_CODE_INVALID")) { showCodeError(tr::lng_bad_code()); return true; - } else if (err == qstr("PHONE_NUMBER_UNOCCUPIED")) { // success, need to signUp - getData()->code = _sentCode; - goReplace(new Intro::SignupWidget(parentWidget(), getData())); - return true; } else if (err == qstr("SESSION_PASSWORD_NEEDED")) { - getData()->code = _sentCode; _checkRequest->start(1000); - _sentRequest = MTP::send(MTPaccount_GetPassword(), rpcDone(&CodeWidget::gotPassword), rpcFail(&CodeWidget::codeSubmitFail)); + _sentRequest = MTP::send( + MTPaccount_GetPassword(), + rpcDone(&CodeWidget::gotPassword), + rpcFail(&CodeWidget::codeSubmitFail)); return true; } if (Logs::DebugEnabled()) { // internal server error @@ -358,12 +367,25 @@ void CodeWidget::submit() { getData()->hasRecovery = false; getData()->pwdHint = QString(); getData()->pwdNotEmptyPassport = false; - _sentRequest = MTP::send(MTPauth_SignIn(MTP_string(getData()->phone), MTP_bytes(getData()->phoneHash), MTP_string(_sentCode)), rpcDone(&CodeWidget::codeSubmitDone), rpcFail(&CodeWidget::codeSubmitFail)); + _sentRequest = MTP::send( + MTPauth_SignIn( + MTP_string(getData()->phone), + MTP_bytes(getData()->phoneHash), + MTP_string(_sentCode)), + rpcDone(&CodeWidget::codeSubmitDone), + rpcFail(&CodeWidget::codeSubmitFail)); } void CodeWidget::onNoTelegramCode() { - if (_noTelegramCodeRequestId) return; - _noTelegramCodeRequestId = MTP::send(MTPauth_ResendCode(MTP_string(getData()->phone), MTP_bytes(getData()->phoneHash)), rpcDone(&CodeWidget::noTelegramCodeDone), rpcFail(&CodeWidget::noTelegramCodeFail)); + if (_noTelegramCodeRequestId) { + return; + } + _noTelegramCodeRequestId = MTP::send( + MTPauth_ResendCode( + MTP_string(getData()->phone), + MTP_bytes(getData()->phoneHash)), + rpcDone(&CodeWidget::noTelegramCodeDone), + rpcFail(&CodeWidget::noTelegramCodeFail)); } void CodeWidget::noTelegramCodeDone(const MTPauth_SentCode &result) { diff --git a/Telegram/SourceFiles/intro/introsignup.cpp b/Telegram/SourceFiles/intro/introsignup.cpp index b642a8111..c09e15e8d 100644 --- a/Telegram/SourceFiles/intro/introsignup.cpp +++ b/Telegram/SourceFiles/intro/introsignup.cpp @@ -211,7 +211,6 @@ void SignupWidget::submit() { MTPauth_SignUp( MTP_string(getData()->phone), MTP_bytes(getData()->phoneHash), - MTP_string(getData()->code), MTP_string(_firstName), MTP_string(_lastName)), rpcDone(&SignupWidget::nameSubmitDone), diff --git a/Telegram/SourceFiles/intro/introwidget.cpp b/Telegram/SourceFiles/intro/introwidget.cpp index 18637d453..5136a888e 100644 --- a/Telegram/SourceFiles/intro/introwidget.cpp +++ b/Telegram/SourceFiles/intro/introwidget.cpp @@ -776,14 +776,6 @@ bool Widget::Step::paintAnimated(Painter &p, QRect clip) { } void Widget::Step::fillSentCodeData(const MTPDauth_sentCode &data) { - if (const auto terms = data.vterms_of_service()) { - terms->match([&](const MTPDhelp_termsOfService &data) { - getData()->termsLock = Window::TermsLock::FromMTP(data); - }); - } else { - getData()->termsLock = Window::TermsLock(); - } - const auto &type = data.vtype(); switch (type.type()) { case mtpc_auth_sentCodeTypeApp: { diff --git a/Telegram/SourceFiles/intro/introwidget.h b/Telegram/SourceFiles/intro/introwidget.h index e11aeb79e..ab051829d 100644 --- a/Telegram/SourceFiles/intro/introwidget.h +++ b/Telegram/SourceFiles/intro/introwidget.h @@ -69,7 +69,6 @@ public: CallStatus callStatus = CallStatus::Disabled; int callTimeout = 0; - QString code; int codeLength = 5; bool codeByTelegram = false;