Poll: Support custom emoji (#4626)

This commit is contained in:
zubiden 2024-06-12 18:10:48 +02:00 committed by Alexander Zinchuk
parent 8182987d48
commit f45a5ff023
23 changed files with 171 additions and 54 deletions

View File

@ -29,6 +29,7 @@ import { SUPPORTED_IMAGE_CONTENT_TYPES, SUPPORTED_VIDEO_CONTENT_TYPES, VIDEO_WEB
import { pick } from '../../../util/iteratees';
import { addStoryToLocalDb, serializeBytes } from '../helpers';
import {
buildApiFormattedText,
buildApiMessageEntity,
buildApiPhoto,
buildApiPhotoSize,
@ -609,7 +610,7 @@ export function buildMessageStoryData(media: GramJs.TypeMessageMedia): ApiMessag
export function buildPoll(poll: GramJs.Poll, pollResults: GramJs.PollResults): ApiPoll {
const { id, answers: rawAnswers } = poll;
const answers = rawAnswers.map((answer) => ({
text: answer.text,
text: buildApiFormattedText(answer.text),
option: serializeBytes(answer.option),
}));
@ -617,11 +618,11 @@ export function buildPoll(poll: GramJs.Poll, pollResults: GramJs.PollResults): A
id: String(id),
summary: {
isPublic: poll.publicVoters,
question: buildApiFormattedText(poll.question),
...pick(poll, [
'closed',
'multipleChoice',
'quiz',
'question',
'closePeriod',
'closeDate',
]),

View File

@ -169,9 +169,12 @@ export function buildInputPoll(pollParams: ApiNewPoll, randomId: BigInt.BigInteg
const poll = new GramJs.Poll({
id: randomId,
publicVoters: summary.isPublic,
question: summary.question,
question: buildInputTextWithEntities(summary.question),
answers: summary.answers.map(({ text, option }) => {
return new GramJs.PollAnswer({ text, option: deserializeBytes(option) });
return new GramJs.PollAnswer({
text: buildInputTextWithEntities(text),
option: deserializeBytes(option),
});
}),
quiz: summary.quiz,
multipleChoice: summary.multipleChoice,
@ -200,9 +203,12 @@ export function buildInputPollFromExisting(poll: ApiPoll, shouldClose = false) {
poll: new GramJs.Poll({
id: BigInt(poll.id),
publicVoters: poll.summary.isPublic,
question: poll.summary.question,
question: buildInputTextWithEntities(poll.summary.question),
answers: poll.summary.answers.map(({ text, option }) => {
return new GramJs.PollAnswer({ text, option: deserializeBytes(option) });
return new GramJs.PollAnswer({
text: buildInputTextWithEntities(text),
option: deserializeBytes(option),
});
}),
quiz: poll.summary.quiz,
multipleChoice: poll.summary.multipleChoice,

View File

@ -139,7 +139,7 @@ export interface ApiContact {
}
export interface ApiPollAnswer {
text: string;
text: ApiFormattedText;
option: string;
}
@ -157,7 +157,7 @@ export interface ApiPoll {
isPublic?: true;
multipleChoice?: true;
quiz?: true;
question: string;
question: ApiFormattedText;
answers: ApiPollAnswer[];
closePeriod?: number;
closeDate?: number;

View File

@ -7,11 +7,14 @@ import { ApiMessageEntityTypes } from '../../api/types';
import {
extractMessageText,
getMessagePoll,
} from '../../global/helpers';
import {
getMessageSummaryDescription,
getMessageSummaryEmoji,
getMessageSummaryText,
TRUNCATED_SUMMARY_LENGTH,
} from '../../global/helpers';
} from '../../global/helpers/messageSummary';
import trimText from '../../util/trimText';
import renderText from './helpers/renderText';
@ -47,8 +50,9 @@ function MessageSummary({
const { text, entities } = extractMessageText(message, inChatList) || {};
const hasSpoilers = entities?.some((e) => e.type === ApiMessageEntityTypes.Spoiler);
const hasCustomEmoji = entities?.some((e) => e.type === ApiMessageEntityTypes.CustomEmoji);
const hasPoll = Boolean(getMessagePoll(message));
if (!text || (!hasSpoilers && !hasCustomEmoji)) {
if ((!text || (!hasSpoilers && !hasCustomEmoji)) && !hasPoll) {
const summaryText = translatedText?.text || getMessageSummaryText(lang, message, noEmoji);
const trimmedText = trimText(summaryText, truncateLength);

View File

@ -11,7 +11,6 @@ import type { IconName } from '../../../types/icons';
import { CONTENT_NOT_SUPPORTED } from '../../../config';
import {
getMediaContentTypeDescription,
getMessageIsSpoiler,
getMessageMediaHash,
getMessageRoundVideo,
@ -22,6 +21,7 @@ import {
isMessageTranslatable,
isUserId,
} from '../../../global/helpers';
import { getMediaContentTypeDescription } from '../../../global/helpers/messageSummary';
import buildClassName from '../../../util/buildClassName';
import freezeWhenClosed from '../../../util/hoc/freezeWhenClosed';
import { getPictogramDimensions } from '../helpers/mediaDimensions';

View File

@ -10,10 +10,10 @@ import type { TextPart } from '../../../types';
import {
getChatTitle,
getExpiredMessageDescription,
getMessageSummaryText,
getUserFullName,
isExpiredMessage,
} from '../../../global/helpers';
import { getMessageSummaryText } from '../../../global/helpers/messageSummary';
import { formatCurrency } from '../../../util/formatCurrency';
import trimText from '../../../util/trimText';
import renderText from './renderText';

View File

@ -3,13 +3,15 @@ import type { LangFn } from '../../../hooks/useLang';
import type { TextPart } from '../../../types';
import { ApiMessageEntityTypes } from '../../../api/types';
import {
getMessageText,
} from '../../../global/helpers';
import {
getMessageSummaryDescription,
getMessageSummaryEmoji,
getMessageSummaryText,
getMessageText,
TRUNCATED_SUMMARY_LENGTH,
} from '../../../global/helpers';
} from '../../../global/helpers/messageSummary';
import { getMessageKey } from '../../../util/messageKey';
import trimText from '../../../util/trimText';
import renderText from './renderText';

View File

@ -125,7 +125,7 @@ const SettingsDoNotTranslate: FC<OwnProps & StateProps> = ({
}
return displayedOptions.filter((option) => (
option.label.toLowerCase().includes(search.toLowerCase())
option.label.toString().toLowerCase().includes(search.toLowerCase())
|| option.subLabel?.toLowerCase().includes(search.toLowerCase())
|| option.value.toLowerCase().includes(search.toLowerCase())
));

View File

@ -111,7 +111,9 @@ const PollModal: FC<OwnProps> = ({
if (!text) return undefined;
return {
text,
text: {
text,
},
option: String(index),
...(index === correctOption && { correct: true }),
};
@ -141,7 +143,9 @@ const PollModal: FC<OwnProps> = ({
const payload: ApiNewPoll = {
summary: {
question: questionTrimmed,
question: {
text: questionTrimmed,
},
answers,
...(!isAnonymous && { isPublic: true }),
...(isMultipleAnswers && { multipleChoice: true }),

View File

@ -12,11 +12,11 @@ import { getActions, getGlobal, withGlobal } from '../../../global';
import type {
ApiMessage, ApiPeer, ApiPoll, ApiPollAnswer,
} from '../../../api/types';
import type { ObserveFn } from '../../../hooks/useIntersectionObserver';
import type { LangFn } from '../../../hooks/useLang';
import { formatMediaDuration } from '../../../util/date/dateFormat';
import { getServerTime } from '../../../util/serverTime';
import renderText from '../../common/helpers/renderText';
import { renderTextWithEntities } from '../../common/helpers/renderTextWithEntities';
import useLang from '../../../hooks/useLang';
@ -34,6 +34,8 @@ import './Poll.scss';
type OwnProps = {
message: ApiMessage;
poll: ApiPoll;
observeIntersectionForLoading?: ObserveFn;
observeIntersectionForPlaying?: ObserveFn;
onSendVote: (options: string[]) => void;
};
@ -52,6 +54,8 @@ const Poll: FC<OwnProps & StateProps> = ({
message,
poll,
recentVoterIds,
observeIntersectionForLoading,
observeIntersectionForPlaying,
onSendVote,
}) => {
const { loadMessage, openPollResults, requestConfetti } = getActions();
@ -81,10 +85,18 @@ const Poll: FC<OwnProps & StateProps> = ({
return voteResults?.filter((r) => r.isCorrect).map((r) => r.option) || [];
}, [voteResults]);
const answers = useMemo(() => summary.answers.map((a) => ({
label: a.text,
label: renderTextWithEntities({
text: a.text.text,
entities: a.text.entities,
observeIntersectionForLoading,
observeIntersectionForPlaying,
}),
value: a.option,
hidden: Boolean(summary.quiz && summary.closePeriod && closePeriod <= 0),
})), [closePeriod, summary]);
})), [
closePeriod, observeIntersectionForLoading, observeIntersectionForPlaying,
summary.answers, summary.closePeriod, summary.quiz,
]);
useEffect(() => {
const chosen = poll.results.results?.find((result) => result.isChosen);
@ -238,7 +250,14 @@ const Poll: FC<OwnProps & StateProps> = ({
return (
<div className="Poll" dir={lang.isRtl ? 'auto' : 'ltr'}>
{renderSolution()}
<div className="poll-question">{renderText(summary.question, ['emoji', 'br'])}</div>
<div className="poll-question">
{renderTextWithEntities({
text: summary.question.text,
entities: summary.question.entities,
observeIntersectionForLoading,
observeIntersectionForPlaying,
})}
</div>
<div className="poll-type">
{lang(getPollTypeString(summary))}
{renderRecentVoters()}

View File

@ -7,7 +7,7 @@ import React, {
import type { ApiPollAnswer, ApiPollResult } from '../../../api/types';
import buildClassName from '../../../util/buildClassName';
import renderText from '../../common/helpers/renderText';
import { renderTextWithEntities } from '../../common/helpers/renderTextWithEntities';
import './PollOption.scss';
@ -65,7 +65,10 @@ const PollOption: FC<OwnProps> = ({
</div>
<div className="poll-option-right">
<div className="poll-option-text" dir="auto">
{renderText(answer.text)}
{renderTextWithEntities({
text: answer.text.text,
entities: answer.text.entities,
})}
</div>
<div className={buildClassName('poll-option-answer', showIcon && !correctAnswer && 'wrong')}>
{shouldAnimate && (

View File

@ -8,11 +8,11 @@ import {
getMessageMediaHash,
getMessagePhoto,
getMessageText,
getMessageTextWithSpoilers,
getMessageWebPagePhoto,
getMessageWebPageVideo,
hasMessageLocalBlobUrl,
} from '../../../../global/helpers';
import { getMessageTextWithSpoilers } from '../../../../global/helpers/messageSummary';
import {
CLIPBOARD_ITEM_SUPPORTED,
copyHtmlToClipboard,

View File

@ -14,6 +14,7 @@ import type {
import { isUserId } from '../../global/helpers';
import { selectTabState } from '../../global/selectors';
import { renderTextWithEntities } from '../common/helpers/renderTextWithEntities';
import useLang from '../../hooks/useLang';
import usePrevious from '../../hooks/usePrevious';
@ -133,7 +134,12 @@ const PollAnswerResults: FC<OwnProps & StateProps> = ({
{voters && renderViewMoreButton()}
</div>
<div className="answer-head" dir={lang.isRtl ? 'rtl' : undefined}>
<span className="answer-title" dir="auto">{text}</span>
<span className="answer-title" dir="auto">
{renderTextWithEntities({
text: text.text,
entities: text.entities,
})}
</span>
<span className="answer-percent" dir={lang.isRtl ? 'auto' : undefined}>
{getPercentage(answerVote.votersCount, totalVoters)}%
</span>

View File

@ -7,7 +7,7 @@ import type { ApiChat, ApiMessage } from '../../api/types';
import { getMessagePoll } from '../../global/helpers';
import { selectChat, selectChatMessage, selectTabState } from '../../global/selectors';
import { buildCollectionByKey } from '../../util/iteratees';
import renderText from '../common/helpers/renderText';
import { renderTextWithEntities } from '../common/helpers/renderTextWithEntities';
import useHistoryBack from '../../hooks/useHistoryBack';
import useLang from '../../hooks/useLang';
@ -53,7 +53,12 @@ const PollResults: FC<OwnProps & StateProps> = ({
return (
<div className="PollResults" dir={lang.isRtl ? 'rtl' : undefined}>
<h3 className="poll-question" dir="auto">{renderText(summary.question, ['emoji', 'br'])}</h3>
<h3 className="poll-question" dir="auto">
{renderTextWithEntities({
text: summary.question.text,
entities: summary.question.entities,
})}
</h3>
<div className="poll-results-list custom-scroll">
{summary.answers.map((answer) => (
<PollAnswerResults

View File

@ -1,11 +1,11 @@
import type { ChangeEvent } from 'react';
import type { FC } from '../../lib/teact/teact';
import type { FC, TeactNode } from '../../lib/teact/teact';
import React, { memo, useCallback, useState } from '../../lib/teact/teact';
import Checkbox from './Checkbox';
export type IRadioOption = {
label: string;
label: TeactNode;
subLabel?: string;
disabled?: boolean;
value: string;

View File

@ -22,8 +22,9 @@ import { getServerTime } from '../../../util/serverTime';
import { IS_TOUCH_ENV } from '../../../util/windowEnvironment';
import versionNotification from '../../../versionNotification.txt';
import {
getIsSavedDialog, getMessageSummaryText, getSenderTitle, isChatChannel, isJoinedChannelMessage,
getIsSavedDialog, getSenderTitle, isChatChannel, isJoinedChannelMessage,
} from '../../helpers';
import { getMessageSummaryText } from '../../helpers/messageSummary';
import { renderMessageSummaryHtml } from '../../helpers/renderMessageSummaryHtml';
import { addActionHandler, getGlobal, setGlobal } from '../../index';
import {

View File

@ -1,7 +1,6 @@
export * from './users';
export * from './chats';
export * from './messages';
export * from './messageSummary';
export * from './messageMedia';
export * from './localSearch';
export * from './reactions';

View File

@ -6,6 +6,7 @@ import { ApiMessageEntityTypes } from '../../api/types';
import { CONTENT_NOT_SUPPORTED } from '../../config';
import trimText from '../../util/trimText';
import { renderTextWithEntities } from '../../components/common/helpers/renderTextWithEntities';
import { getGlobal } from '../index';
import {
getExpiredMessageContentDescription, getMessageText, getMessageTranscription, isExpiredMessageContent,
@ -179,7 +180,10 @@ function getSummaryDescription(
}
if (poll) {
summary = poll.summary.question;
summary = renderTextWithEntities({
text: poll.summary.question.text,
entities: poll.summary.question.entities,
});
}
if (invoice) {

View File

@ -1,6 +1,6 @@
const api = require('./api');
const LAYER = 178;
const LAYER = 179;
const tlobjects = {};
for (const tl of Object.values(api)) {

File diff suppressed because one or more lines are too long

View File

@ -631,6 +631,8 @@ auth.sentCodeTypeEmailCode#f450f59b flags:# apple_signin_allowed:flags.0?true go
auth.sentCodeTypeSetUpEmailRequired#a5491dea flags:# apple_signin_allowed:flags.0?true google_signin_allowed:flags.1?true = auth.SentCodeType;
auth.sentCodeTypeFragmentSms#d9565c39 url:string length:int = auth.SentCodeType;
auth.sentCodeTypeFirebaseSms#e57b1432 flags:# nonce:flags.0?bytes receipt:flags.1?string push_timeout:flags.1?int length:int = auth.SentCodeType;
auth.sentCodeTypeSmsWord#a416ac81 flags:# beginning:flags.0?string = auth.SentCodeType;
auth.sentCodeTypeSmsPhrase#b37794af flags:# beginning:flags.0?string = auth.SentCodeType;
messages.botCallbackAnswer#36585ea4 flags:# alert:flags.1?true has_url:flags.3?true native_ui:flags.4?true message:flags.0?string url:flags.2?string cache_time:int = messages.BotCallbackAnswer;
messages.messageEditData#26b5dde6 flags:# caption:flags.0?true = messages.MessageEditData;
inputBotInlineMessageID#890c3d89 dc_id:int id:long access_hash:long = InputBotInlineMessageID;
@ -915,8 +917,8 @@ page#98657f0d flags:# part:flags.0?true rtl:flags.1?true v2:flags.2?true url:str
help.supportName#8c05f1c9 name:string = help.SupportName;
help.userInfoEmpty#f3ae2eed = help.UserInfo;
help.userInfo#1eb3758 message:string entities:Vector<MessageEntity> author:string date:int = help.UserInfo;
pollAnswer#6ca9c2e9 text:string option:bytes = PollAnswer;
poll#86e18161 id:long flags:# closed:flags.0?true public_voters:flags.1?true multiple_choice:flags.2?true quiz:flags.3?true question:string answers:Vector<PollAnswer> close_period:flags.4?int close_date:flags.5?int = Poll;
pollAnswer#ff16e2ca text:TextWithEntities option:bytes = PollAnswer;
poll#58747131 id:long flags:# closed:flags.0?true public_voters:flags.1?true multiple_choice:flags.2?true quiz:flags.3?true question:TextWithEntities answers:Vector<PollAnswer> close_period:flags.4?int close_date:flags.5?int = Poll;
pollAnswerVoters#3b6ddad2 flags:# chosen:flags.0?true correct:flags.1?true option:bytes voters:int = PollAnswerVoters;
pollResults#7adf2420 flags:# min:flags.0?true results:flags.1?Vector<PollAnswerVoters> total_voters:flags.2?int recent_voters:flags.3?Vector<Peer> solution:flags.4?string solution_entities:flags.4?Vector<MessageEntity> = PollResults;
chatOnlines#f041e250 onlines:int = ChatOnlines;
@ -1139,6 +1141,8 @@ requestPeerTypeBroadcast#339bef6c flags:# creator:flags.0?true has_username:flag
emojiListNotModified#481eadfa = EmojiList;
emojiList#7a1e11d1 hash:long document_id:Vector<long> = EmojiList;
emojiGroup#7a9abda9 title:string icon_emoji_id:long emoticons:Vector<string> = EmojiGroup;
emojiGroupGreeting#80d26cc7 title:string icon_emoji_id:long emoticons:Vector<string> = EmojiGroup;
emojiGroupPremium#93bcf34 title:string icon_emoji_id:long = EmojiGroup;
messages.emojiGroupsNotModified#6fb4ad87 = messages.EmojiGroups;
messages.emojiGroups#881fb94b hash:int groups:Vector<EmojiGroup> = messages.EmojiGroups;
textWithEntities#751f3146 text:string entities:Vector<MessageEntity> = TextWithEntities;
@ -1279,7 +1283,7 @@ sponsoredMessageReportOption#430d3150 text:string option:bytes = SponsoredMessag
channels.sponsoredMessageReportResultChooseOption#846f9e42 title:string options:Vector<SponsoredMessageReportOption> = channels.SponsoredMessageReportResult;
channels.sponsoredMessageReportResultAdsHidden#3e3bcf2f = channels.SponsoredMessageReportResult;
channels.sponsoredMessageReportResultReported#ad798849 = channels.SponsoredMessageReportResult;
stats.broadcastRevenueStats#d07b4bad top_hours_graph:StatsGraph revenue_graph:StatsGraph current_balance:long available_balance:long overall_revenue:long usd_rate:double = stats.BroadcastRevenueStats;
stats.broadcastRevenueStats#5407e297 top_hours_graph:StatsGraph revenue_graph:StatsGraph balances:BroadcastRevenueBalances usd_rate:double = stats.BroadcastRevenueStats;
stats.broadcastRevenueWithdrawalUrl#ec659737 url:string = stats.BroadcastRevenueWithdrawalUrl;
broadcastRevenueTransactionProceeds#557e2cc4 amount:long from_date:int to_date:int = BroadcastRevenueTransaction;
broadcastRevenueTransactionWithdrawal#5a590978 flags:# pending:flags.0?true failed:flags.2?true amount:long date:int provider:string transaction_date:flags.1?int transaction_url:flags.1?string = BroadcastRevenueTransaction;
@ -1288,6 +1292,7 @@ stats.broadcastRevenueTransactions#87158466 count:int transactions:Vector<Broadc
reactionNotificationsFromContacts#bac3a61a = ReactionNotificationsFrom;
reactionNotificationsFromAll#4b9e22a0 = ReactionNotificationsFrom;
reactionsNotifySettings#56e34970 flags:# messages_notify_from:flags.0?ReactionNotificationsFrom stories_notify_from:flags.1?ReactionNotificationsFrom sound:NotificationSound show_previews:Bool = ReactionsNotifySettings;
broadcastRevenueBalances#8438f1c6 current_balance:long available_balance:long overall_revenue:long = BroadcastRevenueBalances;
---functions---
invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X;
initConnection#c1cd5ea9 {X:Type} flags:# api_id:int device_model:string system_version:string app_version:string system_lang_code:string lang_pack:string lang_code:string proxy:flags.0?InputClientProxy params:flags.1?JSONValue query:!X = X;

View File

@ -758,6 +758,8 @@ auth.sentCodeTypeEmailCode#f450f59b flags:# apple_signin_allowed:flags.0?true go
auth.sentCodeTypeSetUpEmailRequired#a5491dea flags:# apple_signin_allowed:flags.0?true google_signin_allowed:flags.1?true = auth.SentCodeType;
auth.sentCodeTypeFragmentSms#d9565c39 url:string length:int = auth.SentCodeType;
auth.sentCodeTypeFirebaseSms#e57b1432 flags:# nonce:flags.0?bytes receipt:flags.1?string push_timeout:flags.1?int length:int = auth.SentCodeType;
auth.sentCodeTypeSmsWord#a416ac81 flags:# beginning:flags.0?string = auth.SentCodeType;
auth.sentCodeTypeSmsPhrase#b37794af flags:# beginning:flags.0?string = auth.SentCodeType;
messages.botCallbackAnswer#36585ea4 flags:# alert:flags.1?true has_url:flags.3?true native_ui:flags.4?true message:flags.0?string url:flags.2?string cache_time:int = messages.BotCallbackAnswer;
@ -1149,9 +1151,9 @@ help.supportName#8c05f1c9 name:string = help.SupportName;
help.userInfoEmpty#f3ae2eed = help.UserInfo;
help.userInfo#1eb3758 message:string entities:Vector<MessageEntity> author:string date:int = help.UserInfo;
pollAnswer#6ca9c2e9 text:string option:bytes = PollAnswer;
pollAnswer#ff16e2ca text:TextWithEntities option:bytes = PollAnswer;
poll#86e18161 id:long flags:# closed:flags.0?true public_voters:flags.1?true multiple_choice:flags.2?true quiz:flags.3?true question:string answers:Vector<PollAnswer> close_period:flags.4?int close_date:flags.5?int = Poll;
poll#58747131 id:long flags:# closed:flags.0?true public_voters:flags.1?true multiple_choice:flags.2?true quiz:flags.3?true question:TextWithEntities answers:Vector<PollAnswer> close_period:flags.4?int close_date:flags.5?int = Poll;
pollAnswerVoters#3b6ddad2 flags:# chosen:flags.0?true correct:flags.1?true option:bytes voters:int = PollAnswerVoters;
@ -1517,6 +1519,8 @@ emojiListNotModified#481eadfa = EmojiList;
emojiList#7a1e11d1 hash:long document_id:Vector<long> = EmojiList;
emojiGroup#7a9abda9 title:string icon_emoji_id:long emoticons:Vector<string> = EmojiGroup;
emojiGroupGreeting#80d26cc7 title:string icon_emoji_id:long emoticons:Vector<string> = EmojiGroup;
emojiGroupPremium#93bcf34 title:string icon_emoji_id:long = EmojiGroup;
messages.emojiGroupsNotModified#6fb4ad87 = messages.EmojiGroups;
messages.emojiGroups#881fb94b hash:int groups:Vector<EmojiGroup> = messages.EmojiGroups;
@ -1760,7 +1764,7 @@ channels.sponsoredMessageReportResultChooseOption#846f9e42 title:string options:
channels.sponsoredMessageReportResultAdsHidden#3e3bcf2f = channels.SponsoredMessageReportResult;
channels.sponsoredMessageReportResultReported#ad798849 = channels.SponsoredMessageReportResult;
stats.broadcastRevenueStats#d07b4bad top_hours_graph:StatsGraph revenue_graph:StatsGraph current_balance:long available_balance:long overall_revenue:long usd_rate:double = stats.BroadcastRevenueStats;
stats.broadcastRevenueStats#5407e297 top_hours_graph:StatsGraph revenue_graph:StatsGraph balances:BroadcastRevenueBalances usd_rate:double = stats.BroadcastRevenueStats;
stats.broadcastRevenueWithdrawalUrl#ec659737 url:string = stats.BroadcastRevenueWithdrawalUrl;
@ -1775,6 +1779,8 @@ reactionNotificationsFromAll#4b9e22a0 = ReactionNotificationsFrom;
reactionsNotifySettings#56e34970 flags:# messages_notify_from:flags.0?ReactionNotificationsFrom stories_notify_from:flags.1?ReactionNotificationsFrom sound:NotificationSound show_previews:Bool = ReactionsNotifySettings;
broadcastRevenueBalances#8438f1c6 current_balance:long available_balance:long overall_revenue:long = BroadcastRevenueBalances;
---functions---
invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X;
@ -1808,6 +1814,7 @@ auth.checkRecoveryPassword#d36bf79 code:string = Bool;
auth.importWebTokenAuthorization#2db873a9 api_id:int api_hash:string web_auth_token:string = auth.Authorization;
auth.requestFirebaseSms#89464b50 flags:# phone_number:string phone_code_hash:string safety_net_token:flags.0?string ios_push_secret:flags.1?string = Bool;
auth.resetLoginEmail#7e960193 phone_number:string phone_code_hash:string = auth.SentCode;
auth.reportMissingCode#cb9deff6 phone_number:string phone_code_hash:string mnc:string = Bool;
account.registerDevice#ec86017a flags:# no_muted:flags.0?true token_type:int token:string app_sandbox:Bool secret:bytes other_uids:Vector<long> = Bool;
account.unregisterDevice#6a0d3206 token_type:int token:string other_uids:Vector<long> = Bool;
@ -2162,6 +2169,7 @@ messages.sendQuickReplyMessages#6c750de1 peer:InputPeer shortcut_id:int id:Vecto
messages.deleteQuickReplyMessages#e105e910 shortcut_id:int id:Vector<int> = Updates;
messages.toggleDialogFilterTags#fd2dda49 enabled:Bool = Bool;
messages.getMyStickers#d0b5e1fc offset_id:long limit:int = messages.MyStickers;
messages.getEmojiStickerGroups#1dd840f5 hash:int = messages.EmojiGroups;
updates.getState#edd4882a = updates.State;
updates.getDifference#19c2f763 flags:# pts:int pts_limit:flags.1?int pts_total_limit:flags.0?int date:int qts:int qts_limit:flags.2?int = updates.Difference;

View File

@ -13,7 +13,6 @@ import {
getMessageAction,
getMessageRecentReaction,
getMessageSenderName,
getMessageSummaryText,
getPrivateChatUserId,
getUserFullName,
isActionMessage,
@ -21,6 +20,7 @@ import {
selectIsChatMuted,
selectShouldShowMessagePreview,
} from '../global/helpers';
import { getMessageSummaryText } from '../global/helpers/messageSummary';
import { getMessageReplyInfo } from '../global/helpers/replies';
import { addNotifyExceptions, replaceSettings } from '../global/reducers';
import {