[Refactoring] Add util function for server time (#1396)

This commit is contained in:
Alexander Zinchuk 2021-08-20 23:46:52 +03:00
parent 48b6a263cf
commit 88cd5e32d1
9 changed files with 27 additions and 19 deletions

View File

@ -12,6 +12,7 @@ import {
isInputPeerChannel, isInputPeerChat, isInputPeerUser, isPeerChat, isPeerUser, isInputPeerChannel, isInputPeerChat, isInputPeerUser, isPeerChat, isPeerUser,
} from './peers'; } from './peers';
import { omitVirtualClassFields } from './helpers'; import { omitVirtualClassFields } from './helpers';
import { getServerTime } from '../../../util/serverTime';
type PeerEntityApiChatFields = Omit<ApiChat, ( type PeerEntityApiChatFields = Omit<ApiChat, (
'id' | 'type' | 'title' | 'id' | 'type' | 'title' |
@ -63,7 +64,7 @@ export function buildApiChatFromDialog(
peer, folderId, unreadMark, unreadCount, unreadMentionsCount, notifySettings: { silent, muteUntil }, peer, folderId, unreadMark, unreadCount, unreadMentionsCount, notifySettings: { silent, muteUntil },
readOutboxMaxId, readInboxMaxId, draft, readOutboxMaxId, readInboxMaxId, draft,
} = dialog; } = dialog;
const isMuted = silent || (typeof muteUntil === 'number' && Date.now() + serverTimeOffset * 1000 < muteUntil * 1000); const isMuted = silent || (typeof muteUntil === 'number' && getServerTime(serverTimeOffset) < muteUntil);
return { return {
id: getApiChatIdFromMtpPeer(peer), id: getApiChatIdFromMtpPeer(peer),

View File

@ -6,6 +6,7 @@ import { ApiPrivacySettings, ApiPrivacyKey, PrivacyVisibility } from '../../../t
import { buildApiDocument } from './messages'; import { buildApiDocument } from './messages';
import { getApiChatIdFromMtpPeer } from './chats'; import { getApiChatIdFromMtpPeer } from './chats';
import { pick } from '../../../util/iteratees'; import { pick } from '../../../util/iteratees';
import { getServerTime } from '../../../util/serverTime';
export function buildApiWallpaper(wallpaper: GramJs.TypeWallPaper): ApiWallpaper | undefined { export function buildApiWallpaper(wallpaper: GramJs.TypeWallPaper): ApiWallpaper | undefined {
if (wallpaper instanceof GramJs.WallPaperNoFile) { if (wallpaper instanceof GramJs.WallPaperNoFile) {
@ -107,7 +108,7 @@ export function buildApiNotifyException(
return { return {
chatId: getApiChatIdFromMtpPeer(peer), chatId: getApiChatIdFromMtpPeer(peer),
isMuted: silent || (typeof muteUntil === 'number' && Date.now() + serverTimeOffset * 1000 < muteUntil * 1000), isMuted: silent || (typeof muteUntil === 'number' && getServerTime(serverTimeOffset) < muteUntil),
...(sound === '' && { isSilent: true }), ...(sound === '' && { isSilent: true }),
...(showPreviews !== undefined && { shouldShowPreviews: Boolean(showPreviews) }), ...(showPreviews !== undefined && { shouldShowPreviews: Boolean(showPreviews) }),
}; };

View File

@ -18,6 +18,7 @@ import { invokeRequest, uploadFile, getClient } from './client';
import { omitVirtualClassFields } from '../apiBuilders/helpers'; import { omitVirtualClassFields } from '../apiBuilders/helpers';
import { buildCollectionByKey } from '../../../util/iteratees'; import { buildCollectionByKey } from '../../../util/iteratees';
import localDb from '../localDb'; import localDb from '../localDb';
import { getServerTime } from '../../../util/serverTime';
const MAX_INT_32 = 2 ** 31 - 1; const MAX_INT_32 = 2 ** 31 - 1;
const BETA_LANG_CODES = ['ar', 'fa', 'id', 'ko', 'uz']; const BETA_LANG_CODES = ['ar', 'fa', 'id', 'ko', 'uz'];
@ -219,17 +220,17 @@ export async function fetchNotificationSettings({
hasContactJoinedNotifications: !isMutedContactSignUpNotification, hasContactJoinedNotifications: !isMutedContactSignUpNotification,
hasPrivateChatsNotifications: !( hasPrivateChatsNotifications: !(
privateSilent privateSilent
|| (typeof privateMuteUntil === 'number' && Date.now() + serverTimeOffset * 1000 < privateMuteUntil * 1000) || (typeof privateMuteUntil === 'number' && getServerTime(serverTimeOffset) < privateMuteUntil)
), ),
hasPrivateChatsMessagePreview: privateShowPreviews, hasPrivateChatsMessagePreview: privateShowPreviews,
hasGroupNotifications: !( hasGroupNotifications: !(
groupSilent || (typeof groupMuteUntil === 'number' groupSilent || (typeof groupMuteUntil === 'number'
&& Date.now() + serverTimeOffset * 1000 < groupMuteUntil * 1000) && getServerTime(serverTimeOffset) < groupMuteUntil)
), ),
hasGroupMessagePreview: groupShowPreviews, hasGroupMessagePreview: groupShowPreviews,
hasBroadcastNotifications: !( hasBroadcastNotifications: !(
broadcastSilent || (typeof broadcastMuteUntil === 'number' broadcastSilent || (typeof broadcastMuteUntil === 'number'
&& Date.now() + serverTimeOffset * 1000 < broadcastMuteUntil * 1000) && getServerTime(serverTimeOffset) < broadcastMuteUntil)
), ),
hasBroadcastMessagePreview: broadcastShowPreviews, hasBroadcastMessagePreview: broadcastShowPreviews,
}; };

View File

@ -66,6 +66,7 @@ import useContextMenuHandlers from '../../../hooks/useContextMenuHandlers';
import useLang from '../../../hooks/useLang'; import useLang from '../../../hooks/useLang';
import useInlineBotTooltip from './hooks/useInlineBotTooltip'; import useInlineBotTooltip from './hooks/useInlineBotTooltip';
import windowSize from '../../../util/windowSize'; import windowSize from '../../../util/windowSize';
import { getServerTime } from '../../../util/serverTime';
import DeleteMessageModal from '../../common/DeleteMessageModal.async'; import DeleteMessageModal from '../../common/DeleteMessageModal.async';
import Button from '../../ui/Button'; import Button from '../../ui/Button';
@ -476,7 +477,7 @@ const Composer: FC<OwnProps & StateProps & DispatchProps> = ({
if (currentAttachments.length || text) { if (currentAttachments.length || text) {
if (slowMode && !isAdmin) { if (slowMode && !isAdmin) {
const nowSeconds = Math.floor(Date.now() / 1000) + serverTimeOffset; const nowSeconds = getServerTime(serverTimeOffset);
const secondsSinceLastMessage = lastMessageSendTimeSeconds.current const secondsSinceLastMessage = lastMessageSendTimeSeconds.current
&& Math.floor(nowSeconds - lastMessageSendTimeSeconds.current); && Math.floor(nowSeconds - lastMessageSendTimeSeconds.current);
const nextSendDateNotReached = slowMode.nextSendDate && slowMode.nextSendDate > nowSeconds; const nextSendDateNotReached = slowMode.nextSendDate && slowMode.nextSendDate > nowSeconds;
@ -514,7 +515,7 @@ const Composer: FC<OwnProps & StateProps & DispatchProps> = ({
forwardMessages(); forwardMessages();
} }
lastMessageSendTimeSeconds.current = Math.floor(Date.now() / 1000) + serverTimeOffset; lastMessageSendTimeSeconds.current = getServerTime(serverTimeOffset);
clearDraft({ chatId, localOnly: true }); clearDraft({ chatId, localOnly: true });
@ -527,7 +528,7 @@ const Composer: FC<OwnProps & StateProps & DispatchProps> = ({
resetComposer(); resetComposer();
}); });
}, [ }, [
connectionState, attachments, activeVoiceRecording, isForwarding, serverTimeOffset, clearDraft, chatId, connectionState, attachments, activeVoiceRecording, isForwarding, clearDraft, chatId, serverTimeOffset,
resetComposer, stopRecordingVoice, showDialog, slowMode, isAdmin, sendMessage, forwardMessages, lang, resetComposer, stopRecordingVoice, showDialog, slowMode, isAdmin, sendMessage, forwardMessages, lang,
]); ]);

View File

@ -15,8 +15,9 @@ import { addChats, addUsers, removeBlockedContact } from '../../reducers';
import { buildCollectionByKey } from '../../../util/iteratees'; import { buildCollectionByKey } from '../../../util/iteratees';
import { debounce } from '../../../util/schedulers'; import { debounce } from '../../../util/schedulers';
import { replaceInlineBotSettings, replaceInlineBotsIsLoading } from '../../reducers/bots'; import { replaceInlineBotSettings, replaceInlineBotsIsLoading } from '../../reducers/bots';
import { getServerTime } from '../../../util/serverTime';
const TOP_PEERS_REQUEST_COOLDOWN = 60000; // 1 min const TOP_PEERS_REQUEST_COOLDOWN = 60; // 1 min
const runDebouncedForSearch = debounce((cb) => cb(), 500, false); const runDebouncedForSearch = debounce((cb) => cb(), 500, false);
addReducer('clickInlineButton', (global, actions, payload) => { addReducer('clickInlineButton', (global, actions, payload) => {
@ -96,10 +97,9 @@ addReducer('restartBot', (global, actions, payload) => {
}); });
addReducer('loadTopInlineBots', (global) => { addReducer('loadTopInlineBots', (global) => {
const { serverTimeOffset } = global;
const { hash, lastRequestedAt } = global.topInlineBots; const { hash, lastRequestedAt } = global.topInlineBots;
if (lastRequestedAt && Date.now() + serverTimeOffset * 1000 - lastRequestedAt < TOP_PEERS_REQUEST_COOLDOWN) { if (lastRequestedAt && getServerTime(global.serverTimeOffset) - lastRequestedAt < TOP_PEERS_REQUEST_COOLDOWN) {
return; return;
} }
@ -119,7 +119,7 @@ addReducer('loadTopInlineBots', (global) => {
...newGlobal.topInlineBots, ...newGlobal.topInlineBots,
hash: newHash, hash: newHash,
userIds: ids, userIds: ids,
lastRequestedAt: Date.now() + serverTimeOffset * 1000, lastRequestedAt: getServerTime(global.serverTimeOffset),
}, },
}; };
setGlobal(newGlobal); setGlobal(newGlobal);

View File

@ -14,6 +14,7 @@ import {
addChats, addUsers, updateChat, updateManagementProgress, updateUser, updateUsers, addChats, addUsers, updateChat, updateManagementProgress, updateUser, updateUsers,
updateUserSearch, updateUserSearchFetchingStatus, updateUserSearch, updateUserSearchFetchingStatus,
} from '../../reducers'; } from '../../reducers';
import { getServerTime } from '../../../util/serverTime';
const runDebouncedForFetchFullUser = debounce((cb) => cb(), 500, false, true); const runDebouncedForFetchFullUser = debounce((cb) => cb(), 500, false, true);
const TOP_PEERS_REQUEST_COOLDOWN = 60; // 1 min const TOP_PEERS_REQUEST_COOLDOWN = 60; // 1 min
@ -52,13 +53,12 @@ addReducer('loadUser', (global, actions, payload) => {
addReducer('loadTopUsers', (global) => { addReducer('loadTopUsers', (global) => {
const { const {
serverTimeOffset,
topPeers: { topPeers: {
hash, lastRequestedAt, hash, lastRequestedAt,
}, },
} = global; } = global;
if (!lastRequestedAt || Date.now() / 1000 + serverTimeOffset - lastRequestedAt > TOP_PEERS_REQUEST_COOLDOWN) { if (!lastRequestedAt || getServerTime(global.serverTimeOffset) - lastRequestedAt > TOP_PEERS_REQUEST_COOLDOWN) {
void loadTopUsers(hash); void loadTopUsers(hash);
} }
}); });
@ -102,7 +102,7 @@ async function loadTopUsers(usersHash?: number) {
...global.topPeers, ...global.topPeers,
hash, hash,
userIds: ids, userIds: ids,
lastRequestedAt: Date.now() / 1000 + global.serverTimeOffset, lastRequestedAt: getServerTime(global.serverTimeOffset),
}, },
}; };
setGlobal(global); setGlobal(global);

View File

@ -4,6 +4,7 @@ import { SERVICE_NOTIFICATIONS_USER_ID } from '../../config';
import { formatFullDate, formatTime } from '../../util/dateFormat'; import { formatFullDate, formatTime } from '../../util/dateFormat';
import { orderBy } from '../../util/iteratees'; import { orderBy } from '../../util/iteratees';
import { LangFn } from '../../hooks/useLang'; import { LangFn } from '../../hooks/useLang';
import { getServerTime } from '../../util/serverTime';
const USER_COLOR_KEYS = [1, 8, 5, 2, 7, 4, 6]; const USER_COLOR_KEYS = [1, 8, 5, 2, 7, 4, 6];
@ -189,7 +190,7 @@ export function sortUserIds(
serverTimeOffset = 0, serverTimeOffset = 0,
) { ) {
return orderBy(userIds, (id) => { return orderBy(userIds, (id) => {
const now = Date.now() / 1000 + serverTimeOffset; const now = getServerTime(serverTimeOffset);
if (priorityIds && priorityIds.includes(id)) { if (priorityIds && priorityIds.includes(id)) {
// Assuming that online status expiration date can't be as far as two days from now, // Assuming that online status expiration date can't be as far as two days from now,

View File

@ -33,8 +33,9 @@ import {
} from '../helpers'; } from '../helpers';
import { findLast } from '../../util/iteratees'; import { findLast } from '../../util/iteratees';
import { selectIsStickerFavorite } from './symbols'; import { selectIsStickerFavorite } from './symbols';
import { getServerTime } from '../../util/serverTime';
const MESSAGE_EDIT_ALLOWED_TIME_MS = 172800000; // 48 hours const MESSAGE_EDIT_ALLOWED_TIME = 172800; // 48 hours
export function selectCurrentMessageList(global: GlobalState) { export function selectCurrentMessageList(global: GlobalState) {
const { messageLists } = global.messages; const { messageLists } = global.messages;
@ -340,7 +341,6 @@ export function selectForwardedSender(global: GlobalState, message: ApiMessage):
} }
export function selectAllowedMessageActions(global: GlobalState, message: ApiMessage, threadId: number) { export function selectAllowedMessageActions(global: GlobalState, message: ApiMessage, threadId: number) {
const { serverTimeOffset } = global;
const chat = selectChat(global, message.chatId); const chat = selectChat(global, message.chatId);
if (!chat || chat.isRestricted) { if (!chat || chat.isRestricted) {
return {}; return {};
@ -361,7 +361,7 @@ export function selectAllowedMessageActions(global: GlobalState, message: ApiMes
|| (isChannel && getHasAdminRight(chat, 'editMessages')); || (isChannel && getHasAdminRight(chat, 'editMessages'));
const isMessageEditable = ( const isMessageEditable = (
(canEditMessagesIndefinitely (canEditMessagesIndefinitely
|| Date.now() + serverTimeOffset * 1000 - message.date * 1000 < MESSAGE_EDIT_ALLOWED_TIME_MS) || getServerTime(global.serverTimeOffset) - message.date < MESSAGE_EDIT_ALLOWED_TIME)
&& !( && !(
content.sticker || content.contact || content.poll || content.action || content.audio content.sticker || content.contact || content.poll || content.action || content.audio
|| (content.video && content.video.isRound) || (content.video && content.video.isRound)

3
src/util/serverTime.ts Normal file
View File

@ -0,0 +1,3 @@
export const getServerTime = (serverTimeOffset: number) => {
return Math.floor(Date.now() / 1000) + serverTimeOffset;
};