Show notification for FLOOD_PREMIUM_WAIT (#4471)
This commit is contained in:
parent
0bda37c725
commit
8d942e62bb
@ -73,6 +73,10 @@ export interface GramJsAppConfig extends LimitsConfig {
|
|||||||
// Boosts
|
// Boosts
|
||||||
group_transcribe_level_min?: number;
|
group_transcribe_level_min?: number;
|
||||||
new_noncontact_peers_require_premium_without_ownpremium?: boolean;
|
new_noncontact_peers_require_premium_without_ownpremium?: boolean;
|
||||||
|
// Upload premium notifications
|
||||||
|
upload_premium_speedup_notify_period?: number;
|
||||||
|
upload_premium_speedup_download?: number;
|
||||||
|
upload_premium_speedup_upload?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildEmojiSounds(appConfig: GramJsAppConfig) {
|
function buildEmojiSounds(appConfig: GramJsAppConfig) {
|
||||||
@ -147,5 +151,8 @@ export function buildAppConfig(json: GramJs.TypeJSONValue, hash: number): ApiApp
|
|||||||
storyChangelogUserId: appConfig.stories_changelog_user_id?.toString() ?? SERVICE_NOTIFICATIONS_USER_ID,
|
storyChangelogUserId: appConfig.stories_changelog_user_id?.toString() ?? SERVICE_NOTIFICATIONS_USER_ID,
|
||||||
groupTranscribeLevelMin: appConfig.group_transcribe_level_min,
|
groupTranscribeLevelMin: appConfig.group_transcribe_level_min,
|
||||||
canLimitNewMessagesWithoutPremium: appConfig.new_noncontact_peers_require_premium_without_ownpremium,
|
canLimitNewMessagesWithoutPremium: appConfig.new_noncontact_peers_require_premium_without_ownpremium,
|
||||||
|
bandwidthPremiumNotifyPeriod: appConfig.upload_premium_speedup_notify_period,
|
||||||
|
bandwidthPremiumUploadSpeedup: appConfig.upload_premium_speedup_upload,
|
||||||
|
bandwidthPremiumDownloadSpeedup: appConfig.upload_premium_speedup_download,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
3
src/api/gramjs/updates/UpdatePremiumFloodWait.ts
Normal file
3
src/api/gramjs/updates/UpdatePremiumFloodWait.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
export default class LocalUpdatePremiumFloodWait {
|
||||||
|
constructor(public isUpload: boolean) {}
|
||||||
|
}
|
||||||
@ -77,11 +77,12 @@ import {
|
|||||||
import localDb from '../localDb';
|
import localDb from '../localDb';
|
||||||
import { scheduleMutedChatUpdate, scheduleMutedTopicUpdate } from '../scheduleUnmute';
|
import { scheduleMutedChatUpdate, scheduleMutedTopicUpdate } from '../scheduleUnmute';
|
||||||
|
|
||||||
|
import LocalUpdatePremiumFloodWait from './UpdatePremiumFloodWait';
|
||||||
import { LocalUpdateChannelPts, LocalUpdatePts, type UpdatePts } from './UpdatePts';
|
import { LocalUpdateChannelPts, LocalUpdatePts, type UpdatePts } from './UpdatePts';
|
||||||
|
|
||||||
export type Update = (
|
export type Update = (
|
||||||
(GramJs.TypeUpdate | GramJs.TypeUpdates) & { _entities?: (GramJs.TypeUser | GramJs.TypeChat)[] }
|
(GramJs.TypeUpdate | GramJs.TypeUpdates) & { _entities?: (GramJs.TypeUser | GramJs.TypeChat)[] }
|
||||||
) | typeof connection.UpdateConnectionState | UpdatePts;
|
) | typeof connection.UpdateConnectionState | UpdatePts | LocalUpdatePremiumFloodWait;
|
||||||
|
|
||||||
const DELETE_MISSING_CHANNEL_MESSAGE_DELAY = 1000;
|
const DELETE_MISSING_CHANNEL_MESSAGE_DELAY = 1000;
|
||||||
|
|
||||||
@ -1193,6 +1194,11 @@ export function updater(update: Update) {
|
|||||||
chatId: buildApiPeerId(update.channelId, 'channel'),
|
chatId: buildApiPeerId(update.channelId, 'channel'),
|
||||||
isEnabled: update.enabled ? true : undefined,
|
isEnabled: update.enabled ? true : undefined,
|
||||||
});
|
});
|
||||||
|
} else if (update instanceof LocalUpdatePremiumFloodWait) {
|
||||||
|
onUpdate({
|
||||||
|
'@type': 'updatePremiumFloodWait',
|
||||||
|
isUpload: update.isUpload,
|
||||||
|
});
|
||||||
} else if (update instanceof LocalUpdatePts || update instanceof LocalUpdateChannelPts) {
|
} else if (update instanceof LocalUpdatePts || update instanceof LocalUpdateChannelPts) {
|
||||||
// Do nothing, handled on the manager side
|
// Do nothing, handled on the manager side
|
||||||
} else if (DEBUG) {
|
} else if (DEBUG) {
|
||||||
|
|||||||
@ -204,6 +204,9 @@ export interface ApiAppConfig {
|
|||||||
storyChangelogUserId: string;
|
storyChangelogUserId: string;
|
||||||
groupTranscribeLevelMin?: number;
|
groupTranscribeLevelMin?: number;
|
||||||
canLimitNewMessagesWithoutPremium?: boolean;
|
canLimitNewMessagesWithoutPremium?: boolean;
|
||||||
|
bandwidthPremiumNotifyPeriod?: number;
|
||||||
|
bandwidthPremiumUploadSpeedup?: number;
|
||||||
|
bandwidthPremiumDownloadSpeedup?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ApiConfig {
|
export interface ApiConfig {
|
||||||
|
|||||||
@ -733,6 +733,11 @@ export type ApiUpdateSavedReactionTags = {
|
|||||||
'@type': 'updateSavedReactionTags';
|
'@type': 'updateSavedReactionTags';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type ApiUpdatePremiumFloodWait = {
|
||||||
|
'@type': 'updatePremiumFloodWait';
|
||||||
|
isUpload?: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
export type ApiUpdate = (
|
export type ApiUpdate = (
|
||||||
ApiUpdateReady | ApiUpdateSession | ApiUpdateWebAuthTokenFailed | ApiUpdateRequestUserUpdate |
|
ApiUpdateReady | ApiUpdateSession | ApiUpdateWebAuthTokenFailed | ApiUpdateRequestUserUpdate |
|
||||||
ApiUpdateAuthorizationState | ApiUpdateAuthorizationError | ApiUpdateConnectionState | ApiUpdateCurrentUser |
|
ApiUpdateAuthorizationState | ApiUpdateAuthorizationError | ApiUpdateConnectionState | ApiUpdateCurrentUser |
|
||||||
@ -763,7 +768,7 @@ export type ApiUpdate = (
|
|||||||
ApiRequestReconnectApi | ApiRequestSync | ApiUpdateFetchingDifference | ApiUpdateChannelMessages |
|
ApiRequestReconnectApi | ApiRequestSync | ApiUpdateFetchingDifference | ApiUpdateChannelMessages |
|
||||||
ApiUpdateStealthMode | ApiUpdateAttachMenuBots | ApiUpdateNewAuthorization | ApiUpdateGroupInvitePrivacyForbidden |
|
ApiUpdateStealthMode | ApiUpdateAttachMenuBots | ApiUpdateNewAuthorization | ApiUpdateGroupInvitePrivacyForbidden |
|
||||||
ApiUpdateViewForumAsMessages | ApiUpdateSavedDialogPinned | ApiUpdatePinnedSavedDialogIds | ApiUpdateChatLastMessage |
|
ApiUpdateViewForumAsMessages | ApiUpdateSavedDialogPinned | ApiUpdatePinnedSavedDialogIds | ApiUpdateChatLastMessage |
|
||||||
ApiUpdateDeleteSavedHistory |
|
ApiUpdateDeleteSavedHistory | ApiUpdatePremiumFloodWait |
|
||||||
ApiUpdateQuickReplyMessage | ApiUpdateQuickReplies | ApiDeleteQuickReply | ApiUpdateDeleteQuickReplyMessages
|
ApiUpdateQuickReplyMessage | ApiUpdateQuickReplies | ApiDeleteQuickReply | ApiUpdateDeleteQuickReplyMessages
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -155,6 +155,12 @@ addActionHandler('apiUpdate', (global, actions, update): ActionReturnType => {
|
|||||||
case 'updateAttachMenuBots':
|
case 'updateAttachMenuBots':
|
||||||
actions.loadAttachBots({ hash: global.attachMenu.hash });
|
actions.loadAttachBots({ hash: global.attachMenu.hash });
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'updatePremiumFloodWait': {
|
||||||
|
actions.processPremiumFloodWait({
|
||||||
|
isUpload: update.isUpload,
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return undefined;
|
return undefined;
|
||||||
|
|||||||
@ -35,6 +35,7 @@ import {
|
|||||||
import { getIsMobile, getIsTablet } from '../../../hooks/useAppLayout';
|
import { getIsMobile, getIsTablet } from '../../../hooks/useAppLayout';
|
||||||
|
|
||||||
export const APP_VERSION_URL = 'version.txt';
|
export const APP_VERSION_URL = 'version.txt';
|
||||||
|
const FLOOD_PREMIUM_WAIT_NOTIFICATION_DURATION = 6000;
|
||||||
const MAX_STORED_EMOJIS = 8 * 4; // Represents four rows of recent emojis
|
const MAX_STORED_EMOJIS = 8 * 4; // Represents four rows of recent emojis
|
||||||
|
|
||||||
addActionHandler('toggleChatInfo', (global, actions, payload): ActionReturnType => {
|
addActionHandler('toggleChatInfo', (global, actions, payload): ActionReturnType => {
|
||||||
@ -750,6 +751,43 @@ addActionHandler('setShouldCloseRightColumn', (global, actions, payload): Action
|
|||||||
}, tabId);
|
}, tabId);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
addActionHandler('processPremiumFloodWait', (global, actions, payload): ActionReturnType => {
|
||||||
|
const { isUpload } = payload;
|
||||||
|
const {
|
||||||
|
bandwidthPremiumDownloadSpeedup,
|
||||||
|
bandwidthPremiumUploadSpeedup,
|
||||||
|
bandwidthPremiumNotifyPeriod,
|
||||||
|
} = global.appConfig || {};
|
||||||
|
const { lastPremiumBandwithNotificationDate: lastNotifiedAt } = global.settings;
|
||||||
|
|
||||||
|
if (!bandwidthPremiumDownloadSpeedup || !bandwidthPremiumUploadSpeedup || !bandwidthPremiumNotifyPeriod) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
if (lastNotifiedAt && Date.now() < lastNotifiedAt + bandwidthPremiumNotifyPeriod * 1000) return undefined;
|
||||||
|
|
||||||
|
const unblurredTabIds = Object.values(global.byTabId).filter((l) => !l.isBlurred).map((l) => l.id);
|
||||||
|
|
||||||
|
unblurredTabIds.forEach((tabId) => {
|
||||||
|
actions.showNotification({
|
||||||
|
title: langProvider.translate(isUpload ? 'UploadSpeedLimited' : 'DownloadSpeedLimited'),
|
||||||
|
message: langProvider.translate(
|
||||||
|
isUpload ? 'UploadSpeedLimitedMessage' : 'DownloadSpeedLimitedMessage',
|
||||||
|
isUpload ? bandwidthPremiumUploadSpeedup : bandwidthPremiumDownloadSpeedup,
|
||||||
|
),
|
||||||
|
duration: FLOOD_PREMIUM_WAIT_NOTIFICATION_DURATION,
|
||||||
|
tabId,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
...global,
|
||||||
|
settings: {
|
||||||
|
...global.settings,
|
||||||
|
lastPremiumBandwithNotificationDate: Date.now(),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
let prevIsScreenLocked: boolean | undefined;
|
let prevIsScreenLocked: boolean | undefined;
|
||||||
let prevBlurredTabsCount: number = 0;
|
let prevBlurredTabsCount: number = 0;
|
||||||
let onlineTimeout: number | undefined;
|
let onlineTimeout: number | undefined;
|
||||||
|
|||||||
@ -1009,6 +1009,7 @@ export type GlobalState = {
|
|||||||
themes: Partial<Record<ThemeKey, IThemeSettings>>;
|
themes: Partial<Record<ThemeKey, IThemeSettings>>;
|
||||||
privacy: Partial<Record<ApiPrivacyKey, ApiPrivacySettings>>;
|
privacy: Partial<Record<ApiPrivacyKey, ApiPrivacySettings>>;
|
||||||
notifyExceptions?: Record<number, NotifyException>;
|
notifyExceptions?: Record<number, NotifyException>;
|
||||||
|
lastPremiumBandwithNotificationDate?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
push?: {
|
push?: {
|
||||||
@ -1852,6 +1853,9 @@ export interface ActionPayloads {
|
|||||||
setGlobalSearchClosing: ({
|
setGlobalSearchClosing: ({
|
||||||
isClosing?: boolean;
|
isClosing?: boolean;
|
||||||
} & WithTabId) | undefined;
|
} & WithTabId) | undefined;
|
||||||
|
processPremiumFloodWait: {
|
||||||
|
isUpload?: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
// Accounts
|
// Accounts
|
||||||
reportPeer: {
|
reportPeer: {
|
||||||
|
|||||||
8
src/lib/gramjs/client/TelegramClient.d.ts
vendored
8
src/lib/gramjs/client/TelegramClient.d.ts
vendored
@ -1,9 +1,9 @@
|
|||||||
import type { Api } from '..';
|
import type { TmpPasswordResult, TwoFaParams, updateTwoFaSettings } from './2fa';
|
||||||
|
|
||||||
import type { BotAuthParams, UserAuthParams } from './auth';
|
import type { BotAuthParams, UserAuthParams } from './auth';
|
||||||
import type { uploadFile, UploadFileParams } from './uploadFile';
|
|
||||||
import type { downloadFile, DownloadFileParams } from './downloadFile';
|
import type { downloadFile, DownloadFileParams } from './downloadFile';
|
||||||
import type { TwoFaParams, updateTwoFaSettings, TmpPasswordResult } from './2fa';
|
import type { uploadFile, UploadFileParams } from './uploadFile';
|
||||||
|
|
||||||
|
import type { Api } from '..';
|
||||||
|
|
||||||
declare class TelegramClient {
|
declare class TelegramClient {
|
||||||
constructor(...args: any);
|
constructor(...args: any);
|
||||||
|
|||||||
@ -634,6 +634,7 @@ class TelegramClient {
|
|||||||
authKeyCallback: this._authKeyCallback.bind(this),
|
authKeyCallback: this._authKeyCallback.bind(this),
|
||||||
isMainSender: dcId === this.session.dcId,
|
isMainSender: dcId === this.session.dcId,
|
||||||
isExported: true,
|
isExported: true,
|
||||||
|
updateCallback: this._handleUpdate.bind(this),
|
||||||
getShouldDebugExportedSenders: this.getShouldDebugExportedSenders.bind(this),
|
getShouldDebugExportedSenders: this.getShouldDebugExportedSenders.bind(this),
|
||||||
onConnectionBreak: () => this._cleanupExportedSender(dcId, index),
|
onConnectionBreak: () => this._cleanupExportedSender(dcId, index),
|
||||||
});
|
});
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import { Foreman } from '../../../util/foreman';
|
|||||||
import errors from '../errors';
|
import errors from '../errors';
|
||||||
import Api from '../tl/api';
|
import Api from '../tl/api';
|
||||||
|
|
||||||
|
import LocalUpdatePremiumFloodWait from '../../../api/gramjs/updates/UpdatePremiumFloodWait';
|
||||||
import { sleep } from '../Helpers';
|
import { sleep } from '../Helpers';
|
||||||
import { getDownloadPartSize } from '../Utils';
|
import { getDownloadPartSize } from '../Utils';
|
||||||
|
|
||||||
@ -185,6 +186,9 @@ async function downloadFile2(
|
|||||||
progressCallback(progress);
|
progressCallback(progress);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Limit updates to one per file
|
||||||
|
let isPremiumFloodWaitSent = false;
|
||||||
|
|
||||||
// Allocate memory
|
// Allocate memory
|
||||||
await fileView.init();
|
await fileView.init();
|
||||||
|
|
||||||
@ -292,6 +296,10 @@ async function downloadFile2(
|
|||||||
await sleep(DISCONNECT_SLEEP);
|
await sleep(DISCONNECT_SLEEP);
|
||||||
continue;
|
continue;
|
||||||
} else if (err instanceof errors.FloodWaitError) {
|
} else if (err instanceof errors.FloodWaitError) {
|
||||||
|
if (err instanceof errors.FloodPremiumWaitError && !isPremiumFloodWaitSent) {
|
||||||
|
sender?._updateCallback(new LocalUpdatePremiumFloodWait(false));
|
||||||
|
isPremiumFloodWaitSent = true;
|
||||||
|
}
|
||||||
await sleep(err.seconds * 1000);
|
await sleep(err.seconds * 1000);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,11 +1,12 @@
|
|||||||
// eslint-disable-next-line import/no-named-default
|
|
||||||
import { default as Api } from '../tl/api';
|
|
||||||
|
|
||||||
import type TelegramClient from './TelegramClient';
|
import type TelegramClient from './TelegramClient';
|
||||||
|
|
||||||
|
import { Foreman } from '../../../util/foreman';
|
||||||
|
import errors from '../errors';
|
||||||
|
import Api from '../tl/api';
|
||||||
|
|
||||||
|
import LocalUpdatePremiumFloodWait from '../../../api/gramjs/updates/UpdatePremiumFloodWait';
|
||||||
import { generateRandomBytes, readBigIntFromBuffer, sleep } from '../Helpers';
|
import { generateRandomBytes, readBigIntFromBuffer, sleep } from '../Helpers';
|
||||||
import { getUploadPartSize } from '../Utils';
|
import { getUploadPartSize } from '../Utils';
|
||||||
import errors from '../errors';
|
|
||||||
import { Foreman } from '../../../util/foreman';
|
|
||||||
|
|
||||||
interface OnProgress {
|
interface OnProgress {
|
||||||
isCanceled?: boolean;
|
isCanceled?: boolean;
|
||||||
@ -64,6 +65,9 @@ export async function uploadFile(
|
|||||||
onProgress(progress);
|
onProgress(progress);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Limit updates to one per file
|
||||||
|
let isPremiumFloodWaitSent = false;
|
||||||
|
|
||||||
const promises: Promise<any>[] = [];
|
const promises: Promise<any>[] = [];
|
||||||
|
|
||||||
for (let i = 0; i < partCount; i++) {
|
for (let i = 0; i < partCount; i++) {
|
||||||
@ -130,6 +134,10 @@ export async function uploadFile(
|
|||||||
await sleep(DISCONNECT_SLEEP);
|
await sleep(DISCONNECT_SLEEP);
|
||||||
continue;
|
continue;
|
||||||
} else if (err instanceof errors.FloodWaitError) {
|
} else if (err instanceof errors.FloodWaitError) {
|
||||||
|
if (err instanceof errors.FloodPremiumWaitError && !isPremiumFloodWaitSent) {
|
||||||
|
sender?._updateCallback(new LocalUpdatePremiumFloodWait(true));
|
||||||
|
isPremiumFloodWaitSent = true;
|
||||||
|
}
|
||||||
await sleep(err.seconds * 1000);
|
await sleep(err.seconds * 1000);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -119,6 +119,7 @@ module.exports = {
|
|||||||
FileMigrateError,
|
FileMigrateError,
|
||||||
FloodTestPhoneWaitError,
|
FloodTestPhoneWaitError,
|
||||||
FloodWaitError,
|
FloodWaitError,
|
||||||
|
FloodPremiumWaitError,
|
||||||
PhoneMigrateError,
|
PhoneMigrateError,
|
||||||
SlowModeWaitError,
|
SlowModeWaitError,
|
||||||
UserMigrateError,
|
UserMigrateError,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user