[Option][GUI] Show chat ID
This commit is contained in:
parent
dfbe22bdb3
commit
626fddae85
7 changed files with 173 additions and 0 deletions
|
|
@ -43,10 +43,26 @@
|
||||||
"ktg_settings_network": "Network",
|
"ktg_settings_network": "Network",
|
||||||
"ktg_settings_system": "System",
|
"ktg_settings_system": "System",
|
||||||
"ktg_settings_other": "Other",
|
"ktg_settings_other": "Other",
|
||||||
|
"ktg_profile_copy_id": "Copy ID",
|
||||||
|
"ktg_profile_bot_id": "Bot ID",
|
||||||
|
"ktg_profile_user_id": "User ID",
|
||||||
|
"ktg_profile_group_id": "Group ID",
|
||||||
|
"ktg_profile_supergroup_id": "Supergroup ID",
|
||||||
|
"ktg_profile_channel_id": "Channel ID",
|
||||||
"ktg_settings_adaptive_bubbles": "Adaptive bubbles",
|
"ktg_settings_adaptive_bubbles": "Adaptive bubbles",
|
||||||
"ktg_settings_filters": "Folders",
|
"ktg_settings_filters": "Folders",
|
||||||
"ktg_settings_messages": "Messages",
|
"ktg_settings_messages": "Messages",
|
||||||
|
"ktg_settings_chat_id": "Chat ID in profile",
|
||||||
|
"ktg_settings_chat_id_desc": "You can choose desired format here.\n\nTelegram API uses IDs as-is, but Bot API adds minus in the beginning for groups, and -100 for channels and supergroups to fit it in one field.\n\nIf you have profile panel opened, re-open it to see changes.",
|
||||||
|
"ktg_settings_chat_id_disable": "Hide",
|
||||||
|
"ktg_settings_chat_id_telegram": "Telegram API",
|
||||||
|
"ktg_settings_chat_id_bot": "Bot API",
|
||||||
"ktg_settings_monospace_large_bubbles": "Expand bubbles with monospace",
|
"ktg_settings_monospace_large_bubbles": "Expand bubbles with monospace",
|
||||||
|
"ktg_bot_id_copied": "Bot ID copied to clipboard.",
|
||||||
|
"ktg_user_id_copied": "User ID copied to clipboard.",
|
||||||
|
"ktg_group_id_copied": "Group ID copied to clipboard.",
|
||||||
|
"ktg_supergroup_id_copied": "Supergroup ID copied to clipboard.",
|
||||||
|
"ktg_channel_id_copied": "Channel ID copied to clipboard.",
|
||||||
"ktg_settings_forward": "Forward",
|
"ktg_settings_forward": "Forward",
|
||||||
"ktg_in_app_update_disabled": "In-app updater is disabled.",
|
"ktg_in_app_update_disabled": "In-app updater is disabled.",
|
||||||
"dummy_last_string": ""
|
"dummy_last_string": ""
|
||||||
|
|
|
||||||
|
|
@ -1010,6 +1010,11 @@ infoLabeledOneLine: FlatLabel(defaultFlatLabel) {
|
||||||
}
|
}
|
||||||
margin: margins(5px, 5px, 5px, 5px);
|
margin: margins(5px, 5px, 5px, 5px);
|
||||||
}
|
}
|
||||||
|
infoLabeledOneLineInline: FlatLabel(infoLabeledOneLine) {
|
||||||
|
palette: TextPalette(defaultTextPalette) {
|
||||||
|
linkFg: windowFg;
|
||||||
|
}
|
||||||
|
}
|
||||||
infoLabelSkip: 2px;
|
infoLabelSkip: 2px;
|
||||||
infoLabeled: FlatLabel(infoLabeledOneLine) {
|
infoLabeled: FlatLabel(infoLabeledOneLine) {
|
||||||
minWidth: 180px;
|
minWidth: 180px;
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
*/
|
*/
|
||||||
#include "info/profile/info_profile_actions.h"
|
#include "info/profile/info_profile_actions.h"
|
||||||
|
|
||||||
|
#include "kotato/kotato_lang.h"
|
||||||
|
#include "kotato/kotato_settings.h"
|
||||||
#include "api/api_blocked_peers.h"
|
#include "api/api_blocked_peers.h"
|
||||||
#include "api/api_chat_participants.h"
|
#include "api/api_chat_participants.h"
|
||||||
#include "apiwrap.h"
|
#include "apiwrap.h"
|
||||||
|
|
@ -1030,8 +1032,44 @@ object_ptr<Ui::RpWidget> DetailsFiller::setupInfo() {
|
||||||
result.text->setContextCopyText(contextCopyText);
|
result.text->setContextCopyText(contextCopyText);
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
auto addInfoOneLineInline = [&](
|
||||||
|
rpl::producer<QString> &&label,
|
||||||
|
rpl::producer<TextWithEntities> &&text,
|
||||||
|
const QString &contextCopyText) {
|
||||||
|
auto result = addInfoLine(
|
||||||
|
std::move(label),
|
||||||
|
std::move(text),
|
||||||
|
st::infoLabeledOneLineInline);
|
||||||
|
result->setContextCopyText(contextCopyText);
|
||||||
|
return result;
|
||||||
|
};
|
||||||
if (const auto user = _peer->asUser()) {
|
if (const auto user = _peer->asUser()) {
|
||||||
const auto controller = _controller->parentController();
|
const auto controller = _controller->parentController();
|
||||||
|
if (::Kotato::JsonSettings::GetInt("show_chat_id") != 0) {
|
||||||
|
auto idDrawableText = IDValue(
|
||||||
|
user
|
||||||
|
) | rpl::map([](TextWithEntities &&text) {
|
||||||
|
return Ui::Text::Link(text.text);
|
||||||
|
});
|
||||||
|
auto idInfo = addInfoOneLineInline(
|
||||||
|
(user->isBot()
|
||||||
|
? rktr("ktg_profile_bot_id")
|
||||||
|
: rktr("ktg_profile_user_id")),
|
||||||
|
std::move(idDrawableText),
|
||||||
|
ktr("ktg_profile_copy_id"));
|
||||||
|
|
||||||
|
idInfo->setClickHandlerFilter([user](auto&&...) {
|
||||||
|
const auto idText = IDString(user);
|
||||||
|
if (!idText.isEmpty()) {
|
||||||
|
QGuiApplication::clipboard()->setText(idText);
|
||||||
|
Ui::Toast::Show(user->isBot()
|
||||||
|
? ktr("ktg_bot_id_copied")
|
||||||
|
: ktr("ktg_user_id_copied"));
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (user->session().supportMode()) {
|
if (user->session().supportMode()) {
|
||||||
addInfoLineGeneric(
|
addInfoLineGeneric(
|
||||||
user->session().supportHelper().infoLabelValue(user),
|
user->session().supportHelper().infoLabelValue(user),
|
||||||
|
|
@ -1151,6 +1189,35 @@ object_ptr<Ui::RpWidget> DetailsFiller::setupInfo() {
|
||||||
[=] { controller->window().show(Box(EditContactBox, controller, user)); },
|
[=] { controller->window().show(Box(EditContactBox, controller, user)); },
|
||||||
tracker);
|
tracker);
|
||||||
} else {
|
} else {
|
||||||
|
if (::Kotato::JsonSettings::GetInt("show_chat_id") != 0) {
|
||||||
|
auto idDrawableText = IDValue(
|
||||||
|
_peer
|
||||||
|
) | rpl::map([](TextWithEntities &&text) {
|
||||||
|
return Ui::Text::Link(text.text);
|
||||||
|
});
|
||||||
|
auto idInfo = addInfoOneLineInline(
|
||||||
|
(_peer->isChat()
|
||||||
|
? rktr("ktg_profile_group_id")
|
||||||
|
: _peer->isMegagroup()
|
||||||
|
? rktr("ktg_profile_supergroup_id")
|
||||||
|
: rktr("ktg_profile_channel_id")),
|
||||||
|
std::move(idDrawableText),
|
||||||
|
ktr("ktg_profile_copy_id"));
|
||||||
|
|
||||||
|
idInfo->setClickHandlerFilter([peer = _peer](auto&&...) {
|
||||||
|
const auto idText = IDString(peer);
|
||||||
|
if (!idText.isEmpty()) {
|
||||||
|
QGuiApplication::clipboard()->setText(idText);
|
||||||
|
Ui::Toast::Show(peer->isChat()
|
||||||
|
? ktr("ktg_group_id_copied")
|
||||||
|
: peer->isMegagroup()
|
||||||
|
? ktr("ktg_supergroup_id_copied")
|
||||||
|
: ktr("ktg_channel_id_copied"));
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const auto topicRootId = _topic ? _topic->rootId() : 0;
|
const auto topicRootId = _topic ? _topic->rootId() : 0;
|
||||||
const auto addToLink = topicRootId
|
const auto addToLink = topicRootId
|
||||||
? ('/' + QString::number(topicRootId.bare))
|
? ('/' + QString::number(topicRootId.bare))
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
*/
|
*/
|
||||||
#include "info/profile/info_profile_values.h"
|
#include "info/profile/info_profile_values.h"
|
||||||
|
|
||||||
|
#include "kotato/kotato_settings.h"
|
||||||
#include "api/api_chat_participants.h"
|
#include "api/api_chat_participants.h"
|
||||||
#include "apiwrap.h"
|
#include "apiwrap.h"
|
||||||
#include "info/profile/info_profile_phone_menu.h"
|
#include "info/profile/info_profile_phone_menu.h"
|
||||||
|
|
@ -40,6 +41,8 @@ namespace Info {
|
||||||
namespace Profile {
|
namespace Profile {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
constexpr auto kMaxChannelId = -1000000000000;
|
||||||
|
|
||||||
using UpdateFlag = Data::PeerUpdate::Flag;
|
using UpdateFlag = Data::PeerUpdate::Flag;
|
||||||
|
|
||||||
auto PlainAboutValue(not_null<PeerData*> peer) {
|
auto PlainAboutValue(not_null<PeerData*> peer) {
|
||||||
|
|
@ -92,6 +95,30 @@ void StripExternalLinks(TextWithEntities &text) {
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
QString IDString(not_null<PeerData*> peer) {
|
||||||
|
auto resultId = QString::number(peerIsUser(peer->id)
|
||||||
|
? peerToUser(peer->id).bare
|
||||||
|
: peerIsChat(peer->id)
|
||||||
|
? peerToChat(peer->id).bare
|
||||||
|
: peerIsChannel(peer->id)
|
||||||
|
? peerToChannel(peer->id).bare
|
||||||
|
: peer->id.value);
|
||||||
|
|
||||||
|
if (::Kotato::JsonSettings::GetInt("show_chat_id") == 2) {
|
||||||
|
if (peer->isChannel()) {
|
||||||
|
resultId = QString::number(peerToChannel(peer->id).bare - kMaxChannelId).prepend("-");
|
||||||
|
} else if (peer->isChat()) {
|
||||||
|
resultId = resultId.prepend("-");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return resultId;
|
||||||
|
}
|
||||||
|
|
||||||
|
rpl::producer<TextWithEntities> IDValue(not_null<PeerData*> peer) {
|
||||||
|
return rpl::single(IDString(peer)) | Ui::Text::ToWithEntities();
|
||||||
|
}
|
||||||
|
|
||||||
rpl::producer<QString> NameValue(not_null<PeerData*> peer) {
|
rpl::producer<QString> NameValue(not_null<PeerData*> peer) {
|
||||||
return peer->session().changes().peerFlagsValue(
|
return peer->session().changes().peerFlagsValue(
|
||||||
peer,
|
peer,
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,10 @@ inline auto ToSingleLine() {
|
||||||
rpl::producer<not_null<PeerData*>> MigratedOrMeValue(
|
rpl::producer<not_null<PeerData*>> MigratedOrMeValue(
|
||||||
not_null<PeerData*> peer);
|
not_null<PeerData*> peer);
|
||||||
|
|
||||||
|
QString IDString(not_null<PeerData*> peer);
|
||||||
|
|
||||||
|
[[nodiscard]] rpl::producer<TextWithEntities> IDValue(
|
||||||
|
not_null<PeerData*> peer);
|
||||||
[[nodiscard]] rpl::producer<QString> NameValue(not_null<PeerData*> peer);
|
[[nodiscard]] rpl::producer<QString> NameValue(not_null<PeerData*> peer);
|
||||||
[[nodiscard]] rpl::producer<QString> TitleValue(
|
[[nodiscard]] rpl::producer<QString> TitleValue(
|
||||||
not_null<Data::ForumTopic*> topic);
|
not_null<Data::ForumTopic*> topic);
|
||||||
|
|
|
||||||
|
|
@ -245,6 +245,10 @@ const std::map<QString, Definition, std::greater<QString>> DefinitionMap {
|
||||||
{ "always_show_scheduled", {
|
{ "always_show_scheduled", {
|
||||||
.type = SettingType::BoolSetting,
|
.type = SettingType::BoolSetting,
|
||||||
.defaultValue = false, }},
|
.defaultValue = false, }},
|
||||||
|
{ "show_chat_id", {
|
||||||
|
.type = SettingType::IntSetting,
|
||||||
|
.defaultValue = 2,
|
||||||
|
.limitHandler = IntLimit(0, 2, 2), }},
|
||||||
};
|
};
|
||||||
|
|
||||||
using OldOptionKey = QString;
|
using OldOptionKey = QString;
|
||||||
|
|
|
||||||
|
|
@ -49,6 +49,23 @@ namespace Settings {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
|
||||||
|
QString ChatIdLabel(int option) {
|
||||||
|
switch (option) {
|
||||||
|
case 0:
|
||||||
|
return ktr("ktg_settings_chat_id_disable");
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
return ktr("ktg_settings_chat_id_telegram");
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
return ktr("ktg_settings_chat_id_bot");
|
||||||
|
|
||||||
|
default:
|
||||||
|
Unexpected("Option in Settings::ChatIdLabel.");
|
||||||
|
}
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
#define SettingsMenuJsonSwitch(LangKey, Option) container->add(object_ptr<Button>( \
|
#define SettingsMenuJsonSwitch(LangKey, Option) container->add(object_ptr<Button>( \
|
||||||
|
|
@ -228,6 +245,39 @@ void SetupKotatoOther(
|
||||||
Ui::AddSkip(container);
|
Ui::AddSkip(container);
|
||||||
Ui::AddSubsectionTitle(container, rktr("ktg_settings_other"));
|
Ui::AddSubsectionTitle(container, rktr("ktg_settings_other"));
|
||||||
|
|
||||||
|
|
||||||
|
const auto chatIdButton = container->add(
|
||||||
|
object_ptr<Button>(
|
||||||
|
container,
|
||||||
|
rktr("ktg_settings_chat_id"),
|
||||||
|
st::settingsButtonNoIcon));
|
||||||
|
auto chatIdText = rpl::single(
|
||||||
|
ChatIdLabel(::Kotato::JsonSettings::GetInt("show_chat_id"))
|
||||||
|
) | rpl::then(
|
||||||
|
::Kotato::JsonSettings::Events(
|
||||||
|
"show_chat_id"
|
||||||
|
) | rpl::map([] {
|
||||||
|
return ChatIdLabel(::Kotato::JsonSettings::GetInt("show_chat_id"));
|
||||||
|
})
|
||||||
|
);
|
||||||
|
CreateRightLabel(
|
||||||
|
chatIdButton,
|
||||||
|
std::move(chatIdText),
|
||||||
|
st::settingsButtonNoIcon,
|
||||||
|
rktr("ktg_settings_chat_id"));
|
||||||
|
chatIdButton->addClickHandler([=] {
|
||||||
|
Ui::show(Box<::Kotato::RadioBox>(
|
||||||
|
ktr("ktg_settings_chat_id"),
|
||||||
|
ktr("ktg_settings_chat_id_desc"),
|
||||||
|
::Kotato::JsonSettings::GetInt("show_chat_id"),
|
||||||
|
3,
|
||||||
|
ChatIdLabel,
|
||||||
|
[=] (int value) {
|
||||||
|
::Kotato::JsonSettings::Set("show_chat_id", value);
|
||||||
|
::Kotato::JsonSettings::Write();
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
|
||||||
Ui::AddSkip(container);
|
Ui::AddSkip(container);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue