diff --git a/Telegram/SourceFiles/boxes/username_box.cpp b/Telegram/SourceFiles/boxes/username_box.cpp index b1feee7f5..862a43e25 100644 --- a/Telegram/SourceFiles/boxes/username_box.cpp +++ b/Telegram/SourceFiles/boxes/username_box.cpp @@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "boxes/peers/edit_peer_usernames_list.h" #include "base/timer.h" #include "boxes/peers/edit_peer_common.h" +#include "data/data_channel.h" #include "data/data_session.h" #include "data/data_user.h" #include "lang/lang_keys.h" @@ -45,7 +46,7 @@ namespace { class UsernameEditor final : public Ui::RpWidget { public: - UsernameEditor(not_null, not_null session); + UsernameEditor(not_null, not_null peer); void setInnerFocus(); [[nodiscard]] rpl::producer<> submitted() const; @@ -66,8 +67,11 @@ private: void checkInfoChange(); + [[nodiscard]] QString editableUsername() const; + QString getName() const; + const not_null _peer; const not_null _session; const style::margins &_padding; MTP::Sender _api; @@ -87,18 +91,19 @@ private: UsernameEditor::UsernameEditor( not_null, - not_null session) -: _session(session) + not_null peer) +: _peer(peer) +, _session(&peer->session()) , _padding(st::usernamePadding) , _api(&_session->mtp()) , _username( this, st::defaultInputField, rpl::single(u"@username"_q), - session->user()->editableUsername(), + editableUsername(), QString()) , _checkTimer([=] { check(); }) { - _goodText = _session->user()->editableUsername().isEmpty() + _goodText = editableUsername().isEmpty() ? QString() : tr::lng_username_available(tr::now); @@ -148,6 +153,16 @@ rpl::producer<> UsernameEditor::save() { return _saved.events(); } +QString UsernameEditor::editableUsername() const { + if (const auto user = _peer->asUser()) { + return user->editableUsername(); + } else if (const auto channel = _peer->asChannel()) { + return channel->editableUsername(); + } else { + return QString(); + } +} + rpl::producer UsernameEditor::checkInfoChanged() const { return _checkInfoChanged.events(); } @@ -166,7 +181,7 @@ void UsernameEditor::check() { _checkRequestId = 0; _errorText = (mtpIsTrue(result) - || _checkUsername == _session->user()->editableUsername()) + || (_checkUsername == editableUsername())) ? QString() : tr::lng_username_occupied(tr::now); _goodText = _errorText.isEmpty() @@ -251,14 +266,15 @@ void UsernameEditor::checkInfoPurchaseAvailable() { } void UsernameEditor::updateFail(const QString &error) { - const auto self = _session->user(); if ((error == u"USERNAME_NOT_MODIFIED"_q) - || (_sentUsername == self->editableUsername())) { - self->setName( - TextUtilities::SingleLine(self->firstName), - TextUtilities::SingleLine(self->lastName), - TextUtilities::SingleLine(self->nameOrPhone), - TextUtilities::SingleLine(_sentUsername)); + || (_sentUsername == editableUsername())) { + if (const auto user = _peer->asUser()) { + user->setName( + TextUtilities::SingleLine(user->firstName), + TextUtilities::SingleLine(user->lastName), + TextUtilities::SingleLine(user->nameOrPhone), + TextUtilities::SingleLine(_sentUsername)); + } _saved.fire_done(); } else if (error == u"USERNAME_INVALID"_q) { _username->setFocus(); @@ -283,7 +299,7 @@ void UsernameEditor::checkFail(const QString &error) { _errorText = tr::lng_username_invalid(tr::now); checkInfoChange(); } else if ((error == u"USERNAME_OCCUPIED"_q) - && (_checkUsername != _session->user()->editableUsername())) { + && (_checkUsername != editableUsername())) { _errorText = tr::lng_username_occupied(tr::now); checkInfoChange(); } else if (error == u"USERNAME_PURCHASE_AVAILABLE"_q) { @@ -302,20 +318,25 @@ QString UsernameEditor::getName() const { void UsernamesBox( not_null box, - not_null session) { - box->setTitle(tr::lng_username_title()); + not_null peer) { + const auto isBot = peer && peer->isUser() && peer->asUser()->isBot(); + box->setTitle(isBot + ? tr::lng_bot_username_title() + : tr::lng_username_title()); const auto container = box->verticalLayout(); const auto editor = box->addRow( - object_ptr(box, session), + object_ptr(box, peer), {}); box->setFocusCallback([=] { editor->setInnerFocus(); }); AddUsernameCheckLabel(container, editor->checkInfoChanged()); auto description = rpl::combine( - tr::lng_username_description1(Ui::Text::RichLangValue), + (isBot + ? tr::lng_bot_username_description1 + : tr::lng_username_description1)(Ui::Text::RichLangValue), tr::lng_username_description2(Ui::Text::RichLangValue) ) | rpl::map([](TextWithEntities d1, TextWithEntities d2) { return d1.append("\n\n").append(std::move(d2)); @@ -331,7 +352,7 @@ void UsernamesBox( const auto list = box->addRow( object_ptr( box, - session->user(), + peer, std::make_shared(box), [=] { box->scrollToY(0); diff --git a/Telegram/SourceFiles/boxes/username_box.h b/Telegram/SourceFiles/boxes/username_box.h index 46183e3ef..423631dd1 100644 --- a/Telegram/SourceFiles/boxes/username_box.h +++ b/Telegram/SourceFiles/boxes/username_box.h @@ -12,13 +12,11 @@ class GenericBox; class VerticalLayout; } // namespace Ui -namespace Main { -class Session; -} // namespace Main +class PeerData; void UsernamesBox( not_null box, - not_null session); + not_null peer); struct UsernameCheckInfo final { enum class Type { diff --git a/Telegram/SourceFiles/settings/settings_information.cpp b/Telegram/SourceFiles/settings/settings_information.cpp index 3ecd1ba5a..204cd73b8 100644 --- a/Telegram/SourceFiles/settings/settings_information.cpp +++ b/Telegram/SourceFiles/settings/settings_information.cpp @@ -419,7 +419,8 @@ void SetupRows( std::move(value), tr::lng_context_copy_mention(tr::now), [=] { - const auto box = controller->show(Box(UsernamesBox, session)); + const auto box = controller->show( + Box(UsernamesBox, session->user())); box->boxClosing( ) | rpl::start_with_next([=] { session->api().usernames().requestToCache(session->user()); diff --git a/Telegram/SourceFiles/settings/settings_main.cpp b/Telegram/SourceFiles/settings/settings_main.cpp index 48105d8ef..7b46bb111 100644 --- a/Telegram/SourceFiles/settings/settings_main.cpp +++ b/Telegram/SourceFiles/settings/settings_main.cpp @@ -209,7 +209,7 @@ void Cover::initViewers() { _username->overrideLinkClickHandler([=] { const auto username = _user->userName(); if (username.isEmpty()) { - _controller->show(Box(UsernamesBox, &_user->session())); + _controller->show(Box(UsernamesBox, _user)); } else { QGuiApplication::clipboard()->setText( _user->session().createInternalLinkFull(username));