diff --git a/fluxer_api/src/api/admin/services/AdminUserBanService.ts b/fluxer_api/src/api/admin/services/AdminUserBanService.ts index fb4f22e15..19fd2e749 100644 --- a/fluxer_api/src/api/admin/services/AdminUserBanService.ts +++ b/fluxer_api/src/api/admin/services/AdminUserBanService.ts @@ -8,6 +8,7 @@ import type {AdminUserUpdatePropagator} from '@app/api/admin/services/AdminUserU import * as AuthSession from '@app/api/auth/AuthSession'; import {createUserID, type UserID} from '@app/api/BrandedTypes'; import {emitAdminAction} from '@app/api/infrastructure/activity/AccountChangeEvents'; +import {clearNewConversationLimit} from '@app/api/user/NewConversationLimit'; import {isAccountClosed, isTemporarilyBanned} from '@app/api/user/UserHelpers'; import {APIErrorCodes} from '@fluxer/constants/src/ApiErrorCodes'; import {UserFlags} from '@fluxer/constants/src/UserConstants'; @@ -174,6 +175,7 @@ export class AdminUserBanService { ['public_reason', data.public_reason ?? 'null'], ]), }); + await clearNewConversationLimit(userId, {cache: cacheService}); await emitAdminAction(adminUserId, userId, 'unban'); return { user: await mapUserToAdminResponse(updatedUser, cacheService, acls), diff --git a/fluxer_api/src/api/admin/services/AdminUserDeletionService.ts b/fluxer_api/src/api/admin/services/AdminUserDeletionService.ts index 90f37958a..39d652cef 100644 --- a/fluxer_api/src/api/admin/services/AdminUserDeletionService.ts +++ b/fluxer_api/src/api/admin/services/AdminUserDeletionService.ts @@ -18,6 +18,7 @@ import {ReportStatus} from '@app/api/report/IReportRepository'; import type {ReportService} from '@app/api/report/ReportService'; import {getReportSearchService} from '@app/api/SearchFactory'; import type {StoreEntitlementService} from '@app/api/store_billing/StoreEntitlementService'; +import {clearNewConversationLimit} from '@app/api/user/NewConversationLimit'; import {clearPendingDeletion, reschedulePendingDeletion} from '@app/api/user/services/PendingDeletionCoordinator'; import {APIErrorCodes} from '@fluxer/constants/src/ApiErrorCodes'; import {DeletionReasons} from '@fluxer/constants/src/Core'; @@ -326,6 +327,7 @@ export class AdminUserDeletionService { ['notification_sent', notificationSent ? 'true' : 'false'], ]), }); + await clearNewConversationLimit(userId, {cache: cacheService}); await emitAdminAction(adminUserId, userId, 'cancel_deletion'); return { user: await mapUserToAdminResponse(updatedUser, cacheService, acls), diff --git a/fluxer_api/src/api/admin/services/AdminUserSecurityService.ts b/fluxer_api/src/api/admin/services/AdminUserSecurityService.ts index 320316678..410954a5a 100644 --- a/fluxer_api/src/api/admin/services/AdminUserSecurityService.ts +++ b/fluxer_api/src/api/admin/services/AdminUserSecurityService.ts @@ -15,6 +15,7 @@ import type {UserRow} from '@app/api/database/types/UserTypes'; import {emitAdminAction} from '@app/api/infrastructure/activity/AccountChangeEvents'; import {Logger} from '@app/api/Logger'; import {getInstanceConfigRepository} from '@app/api/middleware/ServiceSingletons'; +import {clearNewConversationLimit} from '@app/api/user/NewConversationLimit'; import {mapWebAuthnCredentialToResponse} from '@app/api/user/UserMappers'; import {resolveAssignedTraits} from '@app/api/user/UserTraits'; import {getIpAddressReverse, getLocationLabelFromIp} from '@app/api/utils/IpUtils'; @@ -143,6 +144,10 @@ export class AdminUserSecurityService { }, user.toRow(), ); + const trusted = (newFlags & UserFlags.NOT_SUSPICIOUS) !== 0n && (user.flags & UserFlags.NOT_SUSPICIOUS) === 0n; + if (trusted || (user.flags & ~newFlags) !== 0n) { + await clearNewConversationLimit(userId, {cache: cacheService}); + } await updatePropagator.propagateUserUpdate({userId, oldUser: user, updatedUser: updatedUser}); await auditService.createAuditLog({ adminUserId, @@ -470,6 +475,9 @@ export class AdminUserSecurityService { }, user.toRow(), ); + if ((currentFlags & ~newFlags) !== 0) { + await clearNewConversationLimit(userId, {cache: cacheService}); + } await updatePropagator.propagateUserUpdate({userId, oldUser: user, updatedUser: updatedUser}); await auditService.createAuditLog({ adminUserId, diff --git a/fluxer_api/src/api/channel/services/CallService.ts b/fluxer_api/src/api/channel/services/CallService.ts index 0c49f802c..1227a6831 100644 --- a/fluxer_api/src/api/channel/services/CallService.ts +++ b/fluxer_api/src/api/channel/services/CallService.ts @@ -15,6 +15,7 @@ import type {RequestCache} from '@app/api/middleware/RequestCacheMiddleware'; import type {Channel} from '@app/api/models/Channel'; import type {ReadStateService} from '@app/api/read_state/ReadStateService'; import type {IUserRepository} from '@app/api/user/IUserRepository'; +import {assertMayStartConversation} from '@app/api/user/NewConversationLimit'; import type {VoiceAccessContext, VoiceAvailabilityService} from '@app/api/voice/VoiceAvailabilityService'; import {AUTOMATIC_VOICE_REGION_ID, ChannelTypes, MessageTypes} from '@fluxer/constants/src/ChannelConstants'; import {IncomingCallFlags, RelationshipTypes} from '@fluxer/constants/src/UserConstants'; @@ -168,6 +169,16 @@ export class CallService { const dmRecipientIds = recipientIds.filter((id) => id !== userId); if (dmRecipientIds.length === 1) { await this.dmPermissionValidator.validate({senderId: userId, recipientId: dmRecipientIds[0]}); + const caller = await this.userRepository.findUnique(userId); + if (caller) { + await assertMayStartConversation({ + user: caller, + targetId: dmRecipientIds[0]!, + users: this.userRepository, + messages: this.channelRepository, + channel, + }); + } } } const existingCall = await this.gatewayService.getCall(channelId); @@ -336,6 +347,16 @@ export class CallService { const dmRecipientIds = Array.from(channel.recipientIds).filter((id) => id !== userId); if (dmRecipientIds.length === 1) { await this.dmPermissionValidator.validate({senderId: userId, recipientId: dmRecipientIds[0]}); + const caller = await this.userRepository.findUnique(userId); + if (caller) { + await assertMayStartConversation({ + user: caller, + targetId: dmRecipientIds[0]!, + users: this.userRepository, + messages: this.channelRepository, + channel, + }); + } } } const callerRequestedNoRing = recipients !== undefined && recipients.length === 0; diff --git a/fluxer_api/src/api/channel/services/MessageInteractionService.ts b/fluxer_api/src/api/channel/services/MessageInteractionService.ts index 4dba63fdc..1655f60e0 100644 --- a/fluxer_api/src/api/channel/services/MessageInteractionService.ts +++ b/fluxer_api/src/api/channel/services/MessageInteractionService.ts @@ -19,8 +19,14 @@ import type {Channel} from '@app/api/models/Channel'; import type {Message} from '@app/api/models/Message'; import type {MessageReaction} from '@app/api/models/MessageReaction'; import type {IUserRepository} from '@app/api/user/IUserRepository'; +import { + assertMayStartConversation, + getNewConversationLimit, + oneToOneDmRecipient, +} from '@app/api/user/NewConversationLimit'; import {assertGuildMemberCanCommunicate} from '@app/api/utils/GuildCommunicationUtils'; import {ChannelTypes, Permissions} from '@fluxer/constants/src/ChannelConstants'; +import {NewConversationsLimitedError} from '@fluxer/errors/src/domains/user/NewConversationsLimitedError'; import type {ChannelPinResponse} from '@fluxer/schema/src/domains/message/MessageResponseSchemas'; import type {UserPartialResponse} from '@fluxer/schema/src/domains/user/UserResponseSchemas'; @@ -32,8 +38,8 @@ export class MessageInteractionService { private reactionService: MessageReactionService; constructor( - channelRepository: IChannelRepository, - userRepository: IUserRepository, + private channelRepository: IChannelRepository, + private userRepository: IUserRepository, guildRepository: IGuildRepositoryAggregate, private gatewayService: IGatewayService, snowflakeService: ISnowflakeService, @@ -69,6 +75,7 @@ export class MessageInteractionService { const authChannel = await this.authService.getChannelAuthenticated({userId, channelId}); await authChannel.checkPermission(Permissions.SEND_MESSAGES); assertGuildMemberCanCommunicate(authChannel.member); + if (!authChannel.guild && (await this.startsNewConversation(authChannel.channel, userId))) return; await this.readStateService.startTyping({authChannel, userId}); } @@ -108,6 +115,7 @@ export class MessageInteractionService { const authChannel = await this.authService.getChannelAuthenticated({userId, channelId}); if (!authChannel.guild && authChannel.channel.type !== ChannelTypes.DM_PERSONAL_NOTES) { await this.authService.validateDMSendPermissions({channel: authChannel.channel, userId}); + await this.assertConversationAllowed(authChannel.channel, userId); } await this.pinService.pinMessage({authChannel, messageId, userId, requestCache, auditLogReason}); } @@ -170,9 +178,36 @@ export class MessageInteractionService { requestCache: RequestCache; }): Promise { const authChannel = await this.authService.getChannelAuthenticated({userId, channelId}); + if (!authChannel.guild) { + await this.assertConversationAllowed(authChannel.channel, userId); + } await this.reactionService.addReaction({authChannel, messageId, emoji, userId, sessionId}); } + private async startsNewConversation(channel: Channel, userId: UserID): Promise { + try { + await this.assertConversationAllowed(channel, userId); + return false; + } catch (error) { + if (error instanceof NewConversationsLimitedError) return true; + throw error; + } + } + + private async assertConversationAllowed(channel: Channel, userId: UserID): Promise { + const targetId = oneToOneDmRecipient(channel, userId); + if (targetId === null || !(await getNewConversationLimit(userId))) return; + const user = await this.userRepository.findUnique(userId); + if (!user) return; + await assertMayStartConversation({ + user, + targetId, + users: this.userRepository, + messages: this.channelRepository.messages, + channel, + }); + } + async removeReaction({ userId, sessionId, diff --git a/fluxer_api/src/api/channel/services/message/MessageActivity.test.ts b/fluxer_api/src/api/channel/services/message/MessageActivity.test.ts new file mode 100644 index 000000000..e42325df0 --- /dev/null +++ b/fluxer_api/src/api/channel/services/message/MessageActivity.test.ts @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later + +import {createAttachmentID, createChannelID, createMessageID, createUserID} from '@app/api/BrandedTypes'; +import {emitMessageCreated, emitMessageUpdated} from '@app/api/channel/services/message/MessageActivity'; +import type {MessageAttachment} from '@app/api/database/types/MessageTypes'; +import {resetActivityEventsForTests, startActivityEvents} from '@app/api/infrastructure/activity/ActivityEvents'; +import type {ActivityPublisher} from '@app/api/infrastructure/activity/ActivitySpool'; +import type {Channel} from '@app/api/models/Channel'; +import {Message} from '@app/api/models/Message'; +import type {User} from '@app/api/models/User'; +import {MockKVProvider} from '@app/api/test/mocks/MockKVProvider'; +import {ChannelTypes, MessageTypes} from '@fluxer/constants/src/ChannelConstants'; +import {afterEach, describe, expect, it, vi} from 'vitest'; + +const HASH = '3F'.repeat(32); + +function attachment(id: bigint, hash: string | null): MessageAttachment { + return { + attachment_id: createAttachmentID(id), + filename: `${id}.png`, + size: 10n * id, + title: null, + description: null, + width: 1, + height: 1, + content_type: 'image/png', + content_hash: hash, + placeholder: null, + flags: 0, + duration: null, + nsfw: null, + waveform: null, + }; +} + +function message(attachments: Array): Message { + return new Message({ + channel_id: createChannelID(10n), + bucket: 0, + message_id: createMessageID(100n), + author_id: createUserID(3n), + type: MessageTypes.DEFAULT, + webhook_id: null, + webhook_name: null, + webhook_avatar_hash: null, + content: '', + edited_timestamp: null, + pinned_timestamp: null, + flags: 0, + mention_everyone: false, + mention_users: null, + mention_roles: null, + mention_channels: null, + attachments, + embeds: null, + sticker_items: null, + message_reference: null, + message_snapshots: null, + call: null, + has_reaction: null, + version: 1, + }); +} + +class CapturingPublisher implements ActivityPublisher { + readonly payloads: Array = []; + + async publish(_subject: string, payload: string): Promise { + this.payloads.push(payload); + } +} + +describe('message activity', () => { + afterEach(() => { + resetActivityEventsForTests(); + }); + + function params(attachments: Array) { + return { + user: {id: createUserID(3n), isBot: false} as unknown as User, + message: message(attachments), + channel: {id: createChannelID(10n), type: ChannelTypes.DM} as unknown as Channel, + guildId: null, + guildOwnerId: null, + dmRecipientId: createUserID(4n), + channelHadMessages: true, + delivered: true, + userRepository: {getRelationship: async () => null}, + }; + } + + it('serializes attachment metadata', async () => { + const publisher = new CapturingPublisher(); + await startActivityEvents({publisher, kv: new MockKVProvider()}); + emitMessageCreated(params([attachment(1n, HASH), attachment(2n, null)])); + await vi.waitFor(() => expect(publisher.payloads).toHaveLength(1)); + const event = JSON.parse(publisher.payloads[0]!); + expect([event.kind, event.key]).toEqual(['message_created', '3']); + expect(event.data).toMatchObject({ + attachment_count: 2, + attachments: [ + {size: 10, content_type: 'image/png', hash: HASH.toLowerCase()}, + {size: 20, content_type: 'image/png', hash: null}, + ], + }); + }); + + it('serializes message updates', async () => { + const publisher = new CapturingPublisher(); + await startActivityEvents({publisher, kv: new MockKVProvider()}); + emitMessageCreated(params([])); + emitMessageUpdated(params([attachment(1n, HASH)])); + await vi.waitFor(() => expect(publisher.payloads).toHaveLength(2)); + const [created, updated] = publisher.payloads.map((payload) => JSON.parse(payload)); + expect(created.kind).toBe('message_created'); + expect(updated.kind).toBe('message_updated'); + expect(updated.data).toMatchObject({message_id: '100', attachments: [{hash: HASH.toLowerCase()}]}); + expect(updated.id).not.toBe(created.id); + }); +}); diff --git a/fluxer_api/src/api/channel/services/message/MessageActivity.ts b/fluxer_api/src/api/channel/services/message/MessageActivity.ts index d73f42bd2..0d186ecce 100644 --- a/fluxer_api/src/api/channel/services/message/MessageActivity.ts +++ b/fluxer_api/src/api/channel/services/message/MessageActivity.ts @@ -2,6 +2,7 @@ import {createInviteCode, type GuildID, type UserID} from '@app/api/BrandedTypes'; import {emitActivity} from '@app/api/infrastructure/activity/ActivityEvents'; +import type {AttachmentMeta} from '@app/api/infrastructure/activity/Contract.generated'; import {Logger} from '@app/api/Logger'; import {getGuildRepository, getInviteRepository} from '@app/api/middleware/ServiceSingletons'; import type {Channel} from '@app/api/models/Channel'; @@ -71,7 +72,18 @@ export interface MessageCreatedActivity { userRepository: Pick; } -async function buildAndEmit(params: MessageCreatedActivity): Promise { +function attachmentMeta(message: Message): Array { + return message.attachments.slice(0, LIST_MAX).map((attachment) => ({ + size: Number(attachment.size), + content_type: attachment.contentType || null, + hash: attachment.contentHash ? attachment.contentHash.toLowerCase() : null, + })); +} + +async function buildAndEmit( + kind: 'message_created' | 'message_updated', + params: MessageCreatedActivity, +): Promise { const {user, message, channel, guildId, dmRecipientId} = params; const content = Array.from(message.content ?? '') .slice(0, CONTENT_MAX_CHARS) @@ -87,7 +99,7 @@ async function buildAndEmit(params: MessageCreatedActivity): Promise { ? (await params.userRepository.getRelationship(user.id, dmRecipientId, RelationshipTypes.FRIEND)) !== null : false; await emitActivity( - 'message_created', + kind, user.id.toString(), { user_id: user.id.toString(), @@ -102,6 +114,7 @@ async function buildAndEmit(params: MessageCreatedActivity): Promise { content, attachment_count: message.attachments.length, attachment_names: message.attachments.slice(0, LIST_MAX).map((attachment) => attachment.filename), + attachments: attachmentMeta(message), link_domains: domains, invite_codes: inviteCodes, invite_guild_ids: targets.map((target) => target.guildId), @@ -114,12 +127,20 @@ async function buildAndEmit(params: MessageCreatedActivity): Promise { delivered: params.delivered, }, null, - message.id.toString(), + kind === 'message_created' + ? message.id.toString() + : `${message.id}:${message.editedTimestamp?.getTime() ?? Date.now()}`, ); } export function emitMessageCreated(params: MessageCreatedActivity): void { - void buildAndEmit(params).catch((error: unknown) => { + void buildAndEmit('message_created', params).catch((error: unknown) => { + Logger.debug({error}, 'Message activity event could not be built'); + }); +} + +export function emitMessageUpdated(params: MessageCreatedActivity): void { + void buildAndEmit('message_updated', params).catch((error: unknown) => { Logger.debug({error}, 'Message activity event could not be built'); }); } diff --git a/fluxer_api/src/api/channel/services/message/MessageEditService.ts b/fluxer_api/src/api/channel/services/message/MessageEditService.ts index 3a5a07585..46506e53e 100644 --- a/fluxer_api/src/api/channel/services/message/MessageEditService.ts +++ b/fluxer_api/src/api/channel/services/message/MessageEditService.ts @@ -1,10 +1,11 @@ // SPDX-License-Identifier: AGPL-3.0-or-later -import type {ChannelID, MessageID, UserID} from '@app/api/BrandedTypes'; +import {type ChannelID, createGuildID, createUserID, type MessageID, type UserID} from '@app/api/BrandedTypes'; import type {MessageUpdateRequest} from '@app/api/channel/MessageTypes'; import type {IChannelRepositoryAggregate} from '@app/api/channel/repositories/IChannelRepositoryAggregate'; import type {AuthenticatedChannel} from '@app/api/channel/services/AuthenticatedChannel'; import type {CrosspostPropagation} from '@app/api/channel/services/message/CrosspostPropagation'; +import {emitMessageUpdated} from '@app/api/channel/services/message/MessageActivity'; import type {MessageChannelAuthService} from '@app/api/channel/services/message/MessageChannelAuthService'; import type {MessageDispatchService} from '@app/api/channel/services/message/MessageDispatchService'; import type {MessageEmbedAttachmentResolver} from '@app/api/channel/services/message/MessageEmbedAttachmentResolver'; @@ -19,6 +20,8 @@ import {Logger} from '@app/api/Logger'; import type {RequestCache} from '@app/api/middleware/RequestCacheMiddleware'; import type {Message} from '@app/api/models/Message'; import type {IUserRepository} from '@app/api/user/IUserRepository'; +import {assertMayStartConversation, oneToOneDmRecipient} from '@app/api/user/NewConversationLimit'; +import {isDirectDeliverySuppressed} from '@app/api/user/UserHelpers'; import {assertGuildMemberCanCommunicate} from '@app/api/utils/GuildCommunicationUtils'; import {Permissions} from '@fluxer/constants/src/ChannelConstants'; import {GuildOperations} from '@fluxer/constants/src/GuildConstants'; @@ -151,6 +154,16 @@ export class MessageEditService { await this.deps.crosspostPropagation.propagateEdit(editedMessage); return {message: editedMessage, authChannel}; } + const dmRecipientId = oneToOneDmRecipient(channel, userId); + if (user && dmRecipientId !== null) { + await assertMayStartConversation({ + user, + targetId: dmRecipientId, + users: this.deps.userRepository, + messages: this.deps.channelRepository.messages, + channel, + }); + } const isBugHunterBot = !!user?.isBot && (user.flags & UserFlags.BUG_HUNTER) !== 0n; const updateResult = await this.deps.messageWriteLock.withFreshMessage(channelId, messageId, async (fresh) => { if (!fresh) throw new UnknownMessageError(); @@ -188,6 +201,19 @@ export class MessageEditService { } await this.deps.dispatchService.dispatchMessageUpdate({channel, message: updatedMessage, requestCache}); await this.deps.crosspostPropagation.propagateEdit(updatedMessage); + if (user && ((data.content !== undefined && data.content !== message.content) || hasNewAttachments)) { + emitMessageUpdated({ + user, + message: updatedMessage, + channel, + guildId: guild?.id ? createGuildID(BigInt(guild.id)) : null, + guildOwnerId: guild?.owner_id ? createUserID(BigInt(guild.owner_id)) : null, + dmRecipientId, + channelHadMessages: true, + delivered: !(dmRecipientId !== null && isDirectDeliverySuppressed(user)), + userRepository: this.deps.userRepository, + }); + } void updateResult.enqueueDeferredEmbeds().catch((error) => { Logger.warn({error, messageId: messageId.toString()}, 'Failed to enqueue deferred embed extraction after edit'); }); diff --git a/fluxer_api/src/api/channel/services/message/MessageSendService.ts b/fluxer_api/src/api/channel/services/message/MessageSendService.ts index cb7dca49f..64d7ec662 100644 --- a/fluxer_api/src/api/channel/services/message/MessageSendService.ts +++ b/fluxer_api/src/api/channel/services/message/MessageSendService.ts @@ -50,6 +50,7 @@ import type {MessageSnapshot} from '@app/api/models/MessageSnapshot'; import type {User} from '@app/api/models/User'; import type {Webhook} from '@app/api/models/Webhook'; import type {IUserRepository} from '@app/api/user/IUserRepository'; +import {assertMayStartConversation} from '@app/api/user/NewConversationLimit'; import {isDirectDeliverySuppressed} from '@app/api/user/UserHelpers'; import {assertGuildMemberCanCommunicate} from '@app/api/utils/GuildCommunicationUtils'; import { @@ -855,6 +856,16 @@ export class MessageSendService { } } this.ensureForwardGuildMatches({data, referencedChannelGuildId}); + const dmRecipientId = this.getOneToOneDmRecipientId(channel, user.id); + if (dmRecipientId !== null) { + await assertMayStartConversation({ + user, + targetId: dmRecipientId, + users: this.deps.userRepository, + messages: this.deps.channelRepository.messages, + channel, + }); + } await this.ensureAttachmentsExist({ attachments: data.attachments, user, @@ -928,7 +939,6 @@ export class MessageSendService { }); } } - const dmRecipientId = this.getOneToOneDmRecipientId(channel, user.id); const suppressDmRecipientDelivery = dmRecipientId !== null && isDirectDeliverySuppressed(user); const channelHadMessages = channel.lastMessageId !== null; const {message, enqueueDeferredEmbeds} = await this.deps.persistenceService.createMessage({ diff --git a/fluxer_api/src/api/infrastructure/activity/Contract.generated.ts b/fluxer_api/src/api/infrastructure/activity/Contract.generated.ts index 529705531..6c1b8f0e1 100644 --- a/fluxer_api/src/api/infrastructure/activity/Contract.generated.ts +++ b/fluxer_api/src/api/infrastructure/activity/Contract.generated.ts @@ -4,9 +4,9 @@ export type Id = string; export type Flags64 = string; export type Channel = "stable" | "canary" | "worker" | "internal" | "import" | "other"; export type Meta = { ip: string | null, country: string | null, ua: string | null, locale: string | null, channel: Channel, request_id: string | null, }; -export type Kind = "registration" | "email_changed" | "profile_updated" | "account_changed" | "admin_action" | "account_deleted" | "report_filed" | "email_bounced" | "action_outcome" | "login" | "session_started" | "guild_joined" | "dm_opened" | "message_created" | "friend_request" | "http_errors" | "user_blocked"; -export type Event = { v: number, id: string, at_ms: number, key: string, meta: Meta, } & ({ "kind": "registration", "data": Registration } | { "kind": "email_changed", "data": EmailChanged } | { "kind": "profile_updated", "data": ProfileUpdated } | { "kind": "account_changed", "data": AccountChanged } | { "kind": "admin_action", "data": AdminAction } | { "kind": "account_deleted", "data": AccountDeleted } | { "kind": "report_filed", "data": ReportFiled } | { "kind": "email_bounced", "data": EmailBounced } | { "kind": "action_outcome", "data": ActionOutcome } | { "kind": "login", "data": Login } | { "kind": "session_started", "data": SessionStarted } | { "kind": "guild_joined", "data": GuildJoined } | { "kind": "dm_opened", "data": DmOpened } | { "kind": "message_created", "data": MessageCreated } | { "kind": "friend_request", "data": FriendRequest } | { "kind": "http_errors", "data": HttpErrors } | { "kind": "user_blocked", "data": UserBlocked }); -export type Body = { "kind": "registration", "data": Registration } | { "kind": "email_changed", "data": EmailChanged } | { "kind": "profile_updated", "data": ProfileUpdated } | { "kind": "account_changed", "data": AccountChanged } | { "kind": "admin_action", "data": AdminAction } | { "kind": "account_deleted", "data": AccountDeleted } | { "kind": "report_filed", "data": ReportFiled } | { "kind": "email_bounced", "data": EmailBounced } | { "kind": "action_outcome", "data": ActionOutcome } | { "kind": "login", "data": Login } | { "kind": "session_started", "data": SessionStarted } | { "kind": "guild_joined", "data": GuildJoined } | { "kind": "dm_opened", "data": DmOpened } | { "kind": "message_created", "data": MessageCreated } | { "kind": "friend_request", "data": FriendRequest } | { "kind": "http_errors", "data": HttpErrors } | { "kind": "user_blocked", "data": UserBlocked }; +export type Kind = "registration" | "email_changed" | "profile_updated" | "account_changed" | "admin_action" | "account_deleted" | "report_filed" | "email_bounced" | "action_outcome" | "login" | "session_started" | "guild_joined" | "dm_opened" | "message_created" | "message_updated" | "friend_request" | "http_errors" | "user_blocked"; +export type Event = { v: number, id: string, at_ms: number, key: string, meta: Meta, } & ({ "kind": "registration", "data": Registration } | { "kind": "email_changed", "data": EmailChanged } | { "kind": "profile_updated", "data": ProfileUpdated } | { "kind": "account_changed", "data": AccountChanged } | { "kind": "admin_action", "data": AdminAction } | { "kind": "account_deleted", "data": AccountDeleted } | { "kind": "report_filed", "data": ReportFiled } | { "kind": "email_bounced", "data": EmailBounced } | { "kind": "action_outcome", "data": ActionOutcome } | { "kind": "login", "data": Login } | { "kind": "session_started", "data": SessionStarted } | { "kind": "guild_joined", "data": GuildJoined } | { "kind": "dm_opened", "data": DmOpened } | { "kind": "message_created", "data": MessageCreated } | { "kind": "message_updated", "data": MessageUpdated } | { "kind": "friend_request", "data": FriendRequest } | { "kind": "http_errors", "data": HttpErrors } | { "kind": "user_blocked", "data": UserBlocked }); +export type Body = { "kind": "registration", "data": Registration } | { "kind": "email_changed", "data": EmailChanged } | { "kind": "profile_updated", "data": ProfileUpdated } | { "kind": "account_changed", "data": AccountChanged } | { "kind": "admin_action", "data": AdminAction } | { "kind": "account_deleted", "data": AccountDeleted } | { "kind": "report_filed", "data": ReportFiled } | { "kind": "email_bounced", "data": EmailBounced } | { "kind": "action_outcome", "data": ActionOutcome } | { "kind": "login", "data": Login } | { "kind": "session_started", "data": SessionStarted } | { "kind": "guild_joined", "data": GuildJoined } | { "kind": "dm_opened", "data": DmOpened } | { "kind": "message_created", "data": MessageCreated } | { "kind": "message_updated", "data": MessageUpdated } | { "kind": "friend_request", "data": FriendRequest } | { "kind": "http_errors", "data": HttpErrors } | { "kind": "user_blocked", "data": UserBlocked }; export type Registration = { user_id: Id, method: RegMethod, email: string | null, username: string, username_user_chosen: boolean, global_name: string | null, locale: string | null, timezone: string | null, invite_code: string | null, suspicious_flags: number, flags: Flags64, }; export type RegMethod = "password" | "unclaimed" | "oauth" | "other"; export type EmailChanged = { user_id: Id, new_email: string, was_unclaimed: boolean, has_ever_purchased: boolean, suspicious_flags: number, suspicious_flags_before: number | null, }; @@ -26,14 +26,16 @@ export type SessionStarted = { user_id: Id, is_bot: boolean, has_verified_phone: export type GuildJoined = { user_id: Id, guild_id: Id, member_count: number, discoverable: boolean, invite_code: string | null, inviter_id: Id | null, join_source: JoinSource, }; export type JoinSource = "creator" | "invite" | "vanity" | "bot_invite" | "admin_force_add" | "discovery" | "other"; export type DmOpened = { user_id: Id, recipient_id: Id, channel_id: Id, recipient_is_friend: boolean, delivered: boolean, }; -export type MessageCreated = { user_id: Id, message_id: Id, channel_id: Id, channel_type: ChannelType, guild_id: Id | null, dm_recipient_id: Id | null, recipient_is_friend: boolean, channel_prior_messages: boolean, is_bot: boolean, content: string, attachment_count: number, attachment_names: Array, link_domains: Array, invite_codes: Array, invite_guild_ids: Array, invite_guild_owner_ids: Array, mention_user_ids: Array, mentions_recipient: boolean, mention_everyone: boolean, author_owns_guild: boolean, guild_member_count: number | null, delivered: boolean, }; +export type MessageCreated = { user_id: Id, message_id: Id, channel_id: Id, channel_type: ChannelType, guild_id: Id | null, dm_recipient_id: Id | null, recipient_is_friend: boolean, channel_prior_messages: boolean, is_bot: boolean, content: string, attachment_count: number, attachment_names: Array, attachments: Array, link_domains: Array, invite_codes: Array, invite_guild_ids: Array, invite_guild_owner_ids: Array, mention_user_ids: Array, mentions_recipient: boolean, mention_everyone: boolean, author_owns_guild: boolean, guild_member_count: number | null, delivered: boolean, }; +export type AttachmentMeta = { size: number, content_type: string | null, hash: string | null, }; +export type MessageUpdated = MessageCreated; export type ChannelType = "dm" | "group_dm" | "guild"; export type FriendRequest = { user_id: Id, target_id: Id, delivered: boolean, }; export type UserBlocked = { blocker_id: Id, blocked_id: Id, }; export type HttpErrors = { ip: string, window_ms: number, s401: number, s403: number, s404: number, s429: number, other_4xx: number, auth_failures: number, token_hashes: Array, }; -export type ActionEnvelope = { v: number, id: string, key: string, issued_at_ms: number, expires_at_ms: number, } & ({ "type": "set_suspicious_flags", user_id: Id, set: number, clear: number, if_current: number | null, } | { "type": "set_spammer", user_id: Id, on: boolean, } | { "type": "phone_verified", user_id: Id, method: PhoneMethod, clear_suspicious: number, } | { "type": "temp_ban_ip", ip: string, until_ms: number, } | { "type": "review", user_id: Id, }); -export type Action = { "type": "set_suspicious_flags", user_id: Id, set: number, clear: number, if_current: number | null, } | { "type": "set_spammer", user_id: Id, on: boolean, } | { "type": "phone_verified", user_id: Id, method: PhoneMethod, clear_suspicious: number, } | { "type": "temp_ban_ip", ip: string, until_ms: number, } | { "type": "review", user_id: Id, }; -export type ActionOutcome = { action_id: string, action_type: string, status: OutcomeStatus, detail: string | null, observed: Observed | null, }; +export type ActionEnvelope = { v: number, id: string, key: string, issued_at_ms: number, expires_at_ms: number, } & ({ "type": "set_suspicious_flags", user_id: Id, set: number, clear: number, if_current: number | null, } | { "type": "phone_verified", user_id: Id, method: PhoneMethod, clear_suspicious: number, } | { "type": "temp_ban_ip", ip: string, until_ms: number, } | { "type": "limit_new_conversations", user_id: Id, on: boolean, until_ms: number, }); +export type Action = { "type": "set_suspicious_flags", user_id: Id, set: number, clear: number, if_current: number | null, } | { "type": "phone_verified", user_id: Id, method: PhoneMethod, clear_suspicious: number, } | { "type": "temp_ban_ip", ip: string, until_ms: number, } | { "type": "limit_new_conversations", user_id: Id, on: boolean, until_ms: number, }; +export type ActionOutcome = { action_id: string, action_type: string, status: OutcomeStatus, detail: string | null, observed: Observed | null, user_id?: Id, }; export type OutcomeStatus = "applied" | "noop" | "conflict" | "expired" | "ineligible" | "exempt" | "unsupported" | "failed"; export type Observed = { flags: Flags64, suspicious_flags: number, has_verified_phone: boolean, deleted: boolean, }; export type StartReq = { v: number, user_id: Id, user_flags: Flags64, has_verified_phone: boolean, phone: string, requested_channel: PhoneChannel | null, client_ip: string, captcha_passed: boolean, }; @@ -89,6 +91,7 @@ export const EVENT_KINDS: ReadonlyArray = [ 'guild_joined', 'dm_opened', 'message_created', + 'message_updated', 'friend_request', 'http_errors', 'user_blocked', @@ -108,6 +111,7 @@ export const EVENT_MAJOR: Record = { guild_joined: 1, dm_opened: 1, message_created: 1, + message_updated: 1, friend_request: 1, http_errors: 1, user_blocked: 1, @@ -127,6 +131,7 @@ export const EVENT_TTL: Record = { guild_joined: '3024000', dm_opened: '259200', message_created: '259200', + message_updated: '259200', friend_request: '259200', http_errors: '3600', user_blocked: '259200', @@ -146,6 +151,7 @@ export const EVENT_CLASS: Record = { guild_joined: 'signal', dm_opened: 'signal', message_created: 'signal', + message_updated: 'signal', friend_request: 'signal', http_errors: 'signal', user_blocked: 'signal', diff --git a/fluxer_api/src/api/user/NewConversationLimit.ts b/fluxer_api/src/api/user/NewConversationLimit.ts new file mode 100644 index 000000000..2ba50d22d --- /dev/null +++ b/fluxer_api/src/api/user/NewConversationLimit.ts @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later + +import {createMessageID, type UserID} from '@app/api/BrandedTypes'; +import type {IMessageRepository} from '@app/api/channel/repositories/IMessageRepository'; +import {getCacheService, getChannelRepository} from '@app/api/middleware/ServiceSingletons'; +import type {Channel} from '@app/api/models/Channel'; +import type {User} from '@app/api/models/User'; +import type {IUserRepository} from '@app/api/user/IUserRepository'; +import {ChannelTypes} from '@fluxer/constants/src/ChannelConstants'; +import {RelationshipTypes, UserFlags} from '@fluxer/constants/src/UserConstants'; +import {NewConversationsLimitedError} from '@fluxer/errors/src/domains/user/NewConversationsLimitedError'; +import type {ICacheService} from '@pkgs/cache/src/ICacheService'; + +export const NEW_CONVERSATION_LIMIT_MAX_MS = 7 * 24 * 60 * 60 * 1000; +const RECENT_PAGE = 100; +const OPENING_PAGE = 50; + +export interface NewConversationLimit { + until_ms: number; + applied_at_ms: number; +} + +type LimitCache = Pick; + +export interface NewConversationLimitDeps { + cache?: LimitCache; + now?: () => number; +} + +function cacheOf(deps: NewConversationLimitDeps): LimitCache { + return deps.cache ?? getCacheService(); +} + +function nowOf(deps: NewConversationLimitDeps): number { + return deps.now?.() ?? Date.now(); +} + +function limitKey(userId: UserID | bigint | string): string { + return `user:new_conversation_limit:${userId.toString()}`; +} + +export function isNewConversationLimitExempt(user: Pick): boolean { + return ( + user.isBot || + user.isSystem || + (user.flags & UserFlags.STAFF) !== 0n || + (user.flags & UserFlags.NOT_SUSPICIOUS) !== 0n + ); +} + +export async function getNewConversationLimit( + userId: UserID, + deps: NewConversationLimitDeps = {}, +): Promise { + const stored = await cacheOf(deps).get(limitKey(userId)); + if (!stored || typeof stored.until_ms !== 'number' || stored.until_ms <= nowOf(deps)) return null; + return stored; +} + +export async function setNewConversationLimit( + userId: UserID, + untilMs: number, + deps: NewConversationLimitDeps = {}, +): Promise { + const now = nowOf(deps); + const until = Math.min(untilMs, now + NEW_CONVERSATION_LIMIT_MAX_MS); + if (until <= now) return false; + const current = await getNewConversationLimit(userId, deps); + if (current && current.until_ms >= until) return false; + const value: NewConversationLimit = {until_ms: until, applied_at_ms: now}; + await cacheOf(deps).set(limitKey(userId), value, Math.ceil((until - now) / 1000)); + return true; +} + +export async function clearNewConversationLimit(userId: UserID, deps: NewConversationLimitDeps = {}): Promise { + const current = await getNewConversationLimit(userId, deps); + await cacheOf(deps).delete(limitKey(userId)); + return current !== null; +} + +export function oneToOneDmRecipient(channel: Pick, senderId: UserID) { + if (channel.guildId || channel.type !== ChannelTypes.DM) return null; + const others = Array.from(channel.recipientIds).filter((id) => id !== senderId); + return others.length === 1 ? others[0]! : null; +} + +type ConversationUsers = Pick; +type ConversationMessages = Pick; + +export interface NewConversationCheck { + user: Pick; + targetId: UserID; + users: ConversationUsers; + messages?: ConversationMessages; + channel?: Pick | null; +} + +async function recipientHasWritten( + messages: ConversationMessages, + channel: Pick, + recipientId: UserID, +): Promise { + if (channel.lastMessageId == null) return false; + const recent = await messages.listMessages(channel.id, undefined, RECENT_PAGE); + if (recent.some((message) => message.authorId === recipientId)) return true; + if (recent.length < RECENT_PAGE) return false; + const opening = await messages.listMessages(channel.id, undefined, OPENING_PAGE, createMessageID(BigInt(channel.id))); + return opening.some((message) => message.authorId === recipientId); +} + +export async function assertMayStartConversation( + {user, targetId, users, messages, channel}: NewConversationCheck, + deps: NewConversationLimitDeps = {}, +): Promise { + if (isNewConversationLimitExempt(user)) return; + const limit = await getNewConversationLimit(user.id, deps); + if (!limit) return; + const [friendship, target] = await Promise.all([ + users.getRelationship(user.id, targetId, RelationshipTypes.FRIEND), + users.findUnique(targetId), + ]); + if (friendship || !target || target.isBot || target.isSystem) return; + const existing = channel === undefined ? await users.findExistingDmState(user.id, targetId) : channel; + if (existing && (await recipientHasWritten(messages ?? getChannelRepository().messages, existing, targetId))) return; + throw new NewConversationsLimitedError(); +} diff --git a/fluxer_api/src/api/user/services/AccountStateApplier.ts b/fluxer_api/src/api/user/services/AccountStateApplier.ts index 486cc30f7..52112c4e3 100644 --- a/fluxer_api/src/api/user/services/AccountStateApplier.ts +++ b/fluxer_api/src/api/user/services/AccountStateApplier.ts @@ -15,8 +15,13 @@ import type { import type {IGatewayService} from '@app/api/infrastructure/IGatewayService'; import type {User} from '@app/api/models/User'; import type {IUserRepository} from '@app/api/user/IUserRepository'; +import { + clearNewConversationLimit, + isNewConversationLimitExempt, + setNewConversationLimit, +} from '@app/api/user/NewConversationLimit'; import type {UserContactChangeLogService} from '@app/api/user/services/UserContactChangeLogService'; -import {mapUserToPartialResponse, mapUserToPrivateResponse} from '@app/api/user/UserMappers'; +import {mapUserToPrivateResponse} from '@app/api/user/UserMappers'; import {UserFlags} from '@fluxer/constants/src/UserConstants'; import {getSameIpDecisionKey, isPublicIpAddress, parseIpAddress} from '@fluxer/ip_utils/src/IpAddress'; import type {ICacheService} from '@pkgs/cache/src/ICacheService'; @@ -25,7 +30,6 @@ export type ActionOf = Extract; - memberProfilesUpdated(user: User): Promise; } export interface AccountStateDeps { @@ -33,40 +37,25 @@ export interface AccountStateDeps { dispatch: AccountUpdateDispatch; contactChangeLog: Pick; ipBans: Pick; - cache: Pick; + cache: Pick; now?: () => number; } const SUSPICIOUS_FLAGS_WRITE_ATTEMPTS = 3; const MIN_TEMP_BAN_SECONDS = 60; -function gatewayDispatch( - gateway: Pick, - users: Pick, -): AccountUpdateDispatch { +function gatewayDispatch(gateway: Pick): AccountUpdateDispatch { return { async userUpdated(user) { await gateway.dispatchPresence({userId: user.id, event: 'USER_UPDATE', data: mapUserToPrivateResponse(user)}); }, - async memberProfilesUpdated(user) { - const userPartial = mapUserToPartialResponse(user); - for (const guildId of await users.getUserGuildIds(user.id)) { - const member = await gateway.getGuildMember({guildId, userId: user.id}); - if (!member.success || !member.memberData) continue; - await gateway.dispatchGuild({ - guildId, - event: 'GUILD_MEMBER_UPDATE', - data: {...member.memberData, user: userPartial}, - }); - } - }, }; } export function accountStateDepsFromContext(ctx: ApiContext, ipBans: AccountStateDeps['ipBans']): AccountStateDeps { return { users: ctx.services.users, - dispatch: gatewayDispatch(ctx.services.gateway, ctx.services.users), + dispatch: gatewayDispatch(ctx.services.gateway), contactChangeLog: ctx.services.contactChangeLog, ipBans, cache: ctx.services.cache, @@ -83,18 +72,20 @@ export function observedOf(user: User): Observed { } export function outcomeOf( - env: Pick & {type: string}, + env: Pick & {type: string; user_id?: string}, status: OutcomeStatus, user: User | null = null, detail: string | null = null, ): ActionOutcome { - return { + const outcome: ActionOutcome = { action_id: env.id, action_type: env.type, status, detail, observed: user ? observedOf(user) : null, }; + if (env.user_id) outcome.user_id = env.user_id; + return outcome; } function isIneligible(user: User): boolean { @@ -126,21 +117,6 @@ export async function applySuspiciousFlags( }); } -export async function applySpammer(deps: AccountStateDeps, env: ActionOf<'set_spammer'>): Promise { - return withAccountChangeSource('action', async () => { - const user = await deps.users.findUnique(createUserID(BigInt(env.user_id))); - if (!user) return outcomeOf(env, 'ineligible'); - if (isIneligible(user)) return outcomeOf(env, 'ineligible', user); - const has = (user.flags & UserFlags.SPAMMER) !== 0n; - if (has === env.on) return outcomeOf(env, 'noop', user); - const flags = env.on ? user.flags | UserFlags.SPAMMER : user.flags & ~UserFlags.SPAMMER; - const updated = await deps.users.patchUpsert(user.id, {flags}, user.toRow()); - await deps.dispatch.userUpdated(updated); - await deps.dispatch.memberProfilesUpdated(updated); - return outcomeOf(env, 'applied', updated); - }); -} - export async function applyPhoneVerified( deps: AccountStateDeps, env: ActionOf<'phone_verified'>, @@ -195,3 +171,20 @@ export async function applyTempBanIp(deps: AccountStateDeps, env: ActionOf<'temp await deps.cache.publish(IP_BAN_REFRESH_CHANNEL, 'refresh'); return outcomeOf(env, 'applied'); } + +export async function applyLimitNewConversations( + deps: AccountStateDeps, + env: ActionOf<'limit_new_conversations'>, +): Promise { + const user = await deps.users.findUnique(createUserID(BigInt(env.user_id))); + if (!user) return outcomeOf(env, 'ineligible'); + if (isIneligible(user)) return outcomeOf(env, 'ineligible', user); + const store = {cache: deps.cache, now: deps.now}; + if (!env.on) { + const lifted = await clearNewConversationLimit(user.id, store); + return outcomeOf(env, lifted ? 'applied' : 'noop', user); + } + if (isNewConversationLimitExempt(user)) return outcomeOf(env, 'exempt', user); + const applied = await setNewConversationLimit(user.id, env.until_ms, store); + return outcomeOf(env, applied ? 'applied' : 'noop', user); +} diff --git a/fluxer_api/src/api/user/services/UserChannelService.ts b/fluxer_api/src/api/user/services/UserChannelService.ts index 633ea6ff6..62e1d9f82 100644 --- a/fluxer_api/src/api/user/services/UserChannelService.ts +++ b/fluxer_api/src/api/user/services/UserChannelService.ts @@ -24,6 +24,7 @@ import type {RequestCache} from '@app/api/middleware/RequestCacheMiddleware'; import type {Channel} from '@app/api/models/Channel'; import type {Message} from '@app/api/models/Message'; import type {User} from '@app/api/models/User'; +import {assertMayStartConversation} from '@app/api/user/NewConversationLimit'; import type {IUserAccountRepository} from '@app/api/user/repositories/IUserAccountRepository'; import type {IUserChannelRepository} from '@app/api/user/repositories/IUserChannelRepository'; import type {IUserRelationshipRepository} from '@app/api/user/repositories/IUserRelationshipRepository'; @@ -164,6 +165,12 @@ export class UserChannelService { if (userId === recipientId) { throw InputValidationError.fromCode('recipient_id', ValidationErrorCodes.CANNOT_DM_YOURSELF); } + await assertMayStartConversation({ + user: callingUser, + targetId: recipientId, + users: this.userRepository, + messages: this.channelRepository, + }); const suppressed = isDirectDeliverySuppressed(callingUser); const channel = await this.openOneToOneDMChannel({userId, recipientId, suppressed, userCacheService, requestCache}); if (!callingUser.isSystem) { diff --git a/fluxer_api/src/api/user/services/UserRelationshipService.ts b/fluxer_api/src/api/user/services/UserRelationshipService.ts index 12b4d4ff3..564325e03 100644 --- a/fluxer_api/src/api/user/services/UserRelationshipService.ts +++ b/fluxer_api/src/api/user/services/UserRelationshipService.ts @@ -13,7 +13,9 @@ import type {RequestCache} from '@app/api/middleware/RequestCacheMiddleware'; import {getInstanceConfigRepository} from '@app/api/middleware/ServiceSingletons'; import type {Relationship} from '@app/api/models/Relationship'; import type {User} from '@app/api/models/User'; +import {assertMayStartConversation} from '@app/api/user/NewConversationLimit'; import type {IUserAccountRepository} from '@app/api/user/repositories/IUserAccountRepository'; +import type {IUserChannelRepository} from '@app/api/user/repositories/IUserChannelRepository'; import type {IUserRelationshipRepository} from '@app/api/user/repositories/IUserRelationshipRepository'; import type {IUserSettingsRepository} from '@app/api/user/repositories/IUserSettingsRepository'; import {getCachedUserPartialResponse} from '@app/api/user/UserCacheHelpers'; @@ -44,6 +46,7 @@ import {extractTimestamp} from '@fluxer/snowflake/src/SnowflakeUtils'; interface UserRelationshipRepository extends IUserAccountRepository, + IUserChannelRepository, IUserRelationshipRepository, IUserSettingsRepository {} @@ -184,6 +187,7 @@ export class UserRelationshipService { } } const targetUser = await this.validateFriendRequest({userId, targetId}); + await assertMayStartConversation({user: requesterUser, targetId, users: this.userRepository}); await this.validateRelationshipCounts({userId, targetId}); const requestRelationship = await this.createFriendRequest({userId, targetId, userCacheService, requestCache}); emitFriendRequest(userId, targetId, true); diff --git a/fluxer_api/src/api/user/tests/NewConversationLimit.test.ts b/fluxer_api/src/api/user/tests/NewConversationLimit.test.ts new file mode 100644 index 000000000..e4a31f3bc --- /dev/null +++ b/fluxer_api/src/api/user/tests/NewConversationLimit.test.ts @@ -0,0 +1,189 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later + +import {createTestAccount, type TestAccount} from '@app/api/auth/tests/AuthTestUtils'; +import {createUserID} from '@app/api/BrandedTypes'; +import {updateUserSettings} from '@app/api/channel/tests/ChannelTestUtils'; +import { + acceptInvite, + createChannelInvite, + createDMChannel, + createFriendship, + createGuild, + ensureSessionStarted, + sendMessage, +} from '@app/api/message/tests/MessageTestUtils'; +import {type ApiTestHarness, createApiTestHarness} from '@app/api/test/ApiTestHarness'; +import {createBuilder, type TestRequestBuilder} from '@app/api/test/TestRequestBuilder'; +import {clearNewConversationLimit, setNewConversationLimit} from '@app/api/user/NewConversationLimit'; +import {APIErrorCodes} from '@fluxer/constants/src/ApiErrorCodes'; +import {UserFlags} from '@fluxer/constants/src/UserConstants'; +import {afterEach, beforeEach, describe, expect, test} from 'vitest'; + +const HOUR_MS = 60 * 60 * 1000; + +interface ErrorBody { + code: string; + message: string; +} + +describe('New conversation limit', () => { + let harness: ApiTestHarness; + + beforeEach(async () => { + harness = await createApiTestHarness(); + }); + + afterEach(async () => { + await harness?.shutdown(); + }); + + async function members(count: number): Promise> { + const accounts: Array = []; + for (let i = 0; i < count; i++) { + const account = await createTestAccount(harness); + await ensureSessionStarted(harness, account.token); + await updateUserSettings(harness, account.token, {default_guilds_restricted: false}); + accounts.push(account); + } + const guild = await createGuild(harness, accounts[0]!.token, 'New conversation limit'); + const invite = await createChannelInvite(harness, accounts[0]!.token, guild.system_channel_id!); + for (const account of accounts.slice(1)) { + await acceptInvite(harness, account.token, invite.code); + } + return accounts; + } + + async function limit(account: TestAccount, hours = 24): Promise { + await setNewConversationLimit(createUserID(BigInt(account.userId)), Date.now() + hours * HOUR_MS); + } + + async function refusedDm(from: TestAccount, to: TestAccount): Promise { + const {json} = await createBuilder(harness, from.token) + .post('/users/@me/channels') + .body({recipient_id: to.userId}) + .expect(403) + .executeWithResponse(); + return json; + } + + test('a limited account cannot open a DM with someone it has no conversation with', async () => { + const [limited, other] = await members(2); + await limit(limited!); + const error = await refusedDm(limited!, other!); + expect(error.code).toBe(APIErrorCodes.NEW_CONVERSATIONS_LIMITED); + expect(error.message).toBe("You can't start new conversations right now. Please try again later."); + }); + + test('a limited account cannot send the first message into an empty DM', async () => { + const [limited, other] = await members(2); + const channel = await createDMChannel(harness, limited!.token, other!.userId); + await limit(limited!); + const {json} = await createBuilder(harness, limited!.token) + .post(`/channels/${channel.id}/messages`) + .body({content: 'hello'}) + .expect(403) + .executeWithResponse(); + expect(json.code).toBe(APIErrorCodes.NEW_CONVERSATIONS_LIMITED); + }); + + test('friends, replies and existing conversations keep working', async () => { + const [limited, friend, opener] = await members(3); + await createFriendship(harness, limited!, friend!); + const theirs = await createDMChannel(harness, opener!.token, limited!.userId); + await sendMessage(harness, opener!.token, theirs.id, 'hi there'); + await limit(limited!); + const withFriend = await createDMChannel(harness, limited!.token, friend!.userId); + await sendMessage(harness, limited!.token, withFriend.id, 'hi friend'); + await sendMessage(harness, limited!.token, theirs.id, 'hello back'); + const reopened = await createDMChannel(harness, limited!.token, opener!.userId); + expect(reopened.id).toBe(theirs.id); + }); + + test('outgoing friend requests are refused while accepting incoming requests still works', async () => { + const [limited, other, requester] = await members(3); + await limit(limited!); + const {json} = await createBuilder(harness, limited!.token) + .post(`/users/@me/relationships/${other!.userId}`) + .body({}) + .expect(403) + .executeWithResponse(); + expect(json.code).toBe(APIErrorCodes.NEW_CONVERSATIONS_LIMITED); + await createFriendship(harness, requester!, limited!); + }); + + test('a cleared or expired limit lets the account start conversations again', async () => { + const [limited, first, second] = await members(3); + await limit(limited!); + await refusedDm(limited!, first!); + await clearNewConversationLimit(createUserID(BigInt(limited!.userId))); + await createDMChannel(harness, limited!.token, first!.userId); + await setNewConversationLimit(createUserID(BigInt(limited!.userId)), Date.now() - 1); + await createDMChannel(harness, limited!.token, second!.userId); + }); + + test('staff and trusted accounts are never limited', async () => { + for (const flag of [UserFlags.STAFF, UserFlags.NOT_SUSPICIOUS]) { + const [account, other] = await members(2); + const me = await createBuilder<{flags?: string | number}>(harness, account!.token).get('/users/@me').execute(); + await createBuilder(harness, account!.token) + .patch(`/test/users/${account!.userId}/flags`) + .body({flags: (BigInt(me.flags ?? 0) | flag).toString()}) + .execute(); + await limit(account!); + await createDMChannel(harness, account!.token, other!.userId); + } + }); + + test('actions in a direct message the other account has not written in are refused', async () => { + const [limited, other] = await members(2); + const channel = await createDMChannel(harness, limited!.token, other!.userId); + const own = await sendMessage(harness, limited!.token, channel.id, 'hey'); + await limit(limited!); + const actions: Array<[string, () => TestRequestBuilder]> = [ + [ + 'send', + () => + createBuilder(harness, limited!.token) + .post(`/channels/${channel.id}/messages`) + .body({content: 'hello'}), + ], + [ + 'edit', + () => + createBuilder(harness, limited!.token) + .patch(`/channels/${channel.id}/messages/${own.id}`) + .body({content: 'hello there'}), + ], + ['pin', () => createBuilder(harness, limited!.token).put(`/channels/${channel.id}/pins/${own.id}`)], + [ + 'react', + () => + createBuilder(harness, limited!.token).put( + `/channels/${channel.id}/messages/${own.id}/reactions/%F0%9F%91%8D/@me`, + ), + ], + [ + 'ring', + () => + createBuilder(harness, limited!.token) + .post(`/channels/${channel.id}/call/ring`) + .body({recipients: [other!.userId]}), + ], + ]; + for (const [name, request] of actions) { + const {json} = await request().expect(403).executeWithResponse(); + expect(json.code, name).toBe(APIErrorCodes.NEW_CONVERSATIONS_LIMITED); + } + }); + + test('bots can still be messaged while limited', async () => { + const [limited, bot] = await members(2); + await createBuilder(harness, bot!.token) + .post(`/test/users/${bot!.userId}/set-bot-flag`) + .body({is_bot: true}) + .execute(); + await limit(limited!); + const channel = await createDMChannel(harness, limited!.token, bot!.userId); + await sendMessage(harness, limited!.token, channel.id, 'help'); + }); +}); diff --git a/fluxer_api/src/api/worker/AccountActionConsumer.ts b/fluxer_api/src/api/worker/AccountActionConsumer.ts index 9ce63011e..5b7a66087 100644 --- a/fluxer_api/src/api/worker/AccountActionConsumer.ts +++ b/fluxer_api/src/api/worker/AccountActionConsumer.ts @@ -14,8 +14,8 @@ import { import {Logger} from '@app/api/Logger'; import { type AccountStateDeps, + applyLimitNewConversations, applyPhoneVerified, - applySpammer, applySuspiciousFlags, applyTempBanIp, outcomeOf, @@ -67,12 +67,12 @@ export function applyAction(deps: AccountActionDeps, env: ActionEnvelope): Promi switch (env.type) { case 'set_suspicious_flags': return applySuspiciousFlags(deps.state, env); - case 'set_spammer': - return applySpammer(deps.state, env); case 'phone_verified': return applyPhoneVerified(deps.state, env); case 'temp_ban_ip': return applyTempBanIp(deps.state, env); + case 'limit_new_conversations': + return applyLimitNewConversations(deps.state, env); default: return Promise.resolve(outcomeOf(env as ActionEnvelope, 'unsupported')); } diff --git a/fluxer_api/src/api/worker/tests/AccountActionConsumer.test.ts b/fluxer_api/src/api/worker/tests/AccountActionConsumer.test.ts index a37636b07..389cdac2e 100644 --- a/fluxer_api/src/api/worker/tests/AccountActionConsumer.test.ts +++ b/fluxer_api/src/api/worker/tests/AccountActionConsumer.test.ts @@ -10,6 +10,7 @@ import { effectsConsumer, } from '@app/api/infrastructure/activity/Contract.generated'; import {User} from '@app/api/models/User'; +import {NEW_CONVERSATION_LIMIT_MAX_MS} from '@app/api/user/NewConversationLimit'; import type {AccountStateDeps} from '@app/api/user/services/AccountStateApplier'; import { type AccountActionDeps, @@ -27,6 +28,17 @@ const USER_ID = '1174109840998400001'; const NOW = 1_759_000_000_000; const NATS_URL = process.env.FLUXER_TEST_ACTIVITY_NATS_URL; +function flagEnvelope(overrides: Partial> = {}) { + return envelope<'set_suspicious_flags'>({ + type: 'set_suspicious_flags', + user_id: USER_ID, + set: 1, + clear: 0, + if_current: null, + ...overrides, + }); +} + function envelope( body: Omit, 'v' | 'id' | 'key' | 'issued_at_ms' | 'expires_at_ms'> & Partial, @@ -80,6 +92,7 @@ class FakeUsers { interface Harness { users: FakeUsers; + cached: Map; presence: Array; contactLogs: Array; bans: Array<{ip: string; ttl: number}>; @@ -89,14 +102,21 @@ interface Harness { function harness(): Harness { const users = new FakeUsers(); - const h: Harness = {users, presence: [], contactLogs: [], bans: [], refreshes: 0, deps: null as never}; + const h: Harness = { + users, + cached: new Map(), + presence: [], + contactLogs: [], + bans: [], + refreshes: 0, + deps: null as never, + }; const state: AccountStateDeps = { users: users as unknown as AccountStateDeps['users'], dispatch: { userUpdated: async (user) => { h.presence.push(user.id); }, - memberProfilesUpdated: async () => {}, }, contactChangeLog: { recordDiff: async (params) => { @@ -113,6 +133,13 @@ function harness(): Harness { publish: async () => { h.refreshes++; }, + get: async (key: string) => h.cached.get(key) ?? null, + set: async (key: string, value: unknown) => { + h.cached.set(key, value); + }, + delete: async (key: string) => { + h.cached.delete(key); + }, } as unknown as AccountStateDeps['cache'], now: () => NOW, }; @@ -144,6 +171,7 @@ describe('account action apply', () => { status: 'applied', detail: null, observed: {flags: '0', suspicious_flags: 1, has_verified_phone: false, deleted: false}, + user_id: USER_ID, }); expect(h.users.current().suspiciousActivityFlags).toBe(1); expect(h.presence).toHaveLength(1); @@ -197,35 +225,80 @@ describe('account action apply', () => { it('treats missing, deleted and bot accounts as ineligible', async () => { h.users.rows.clear(); - const missing = await applyAction( - h.deps, - envelope<'set_spammer'>({type: 'set_spammer', user_id: USER_ID, on: true}), - ); + const missing = await applyAction(h.deps, flagEnvelope()); expect(missing).toMatchObject({status: 'ineligible', observed: null}); h.users.put({bot: true}); - const bot = await applyAction(h.deps, envelope<'set_spammer'>({type: 'set_spammer', user_id: USER_ID, on: true})); + const bot = await applyAction(h.deps, flagEnvelope()); expect(bot.status).toBe('ineligible'); h.users.put({flags: UserFlags.DELETED}); - const deleted = await applyAction( - h.deps, - envelope<'set_spammer'>({type: 'set_spammer', user_id: USER_ID, on: true}), - ); + const deleted = await applyAction(h.deps, flagEnvelope()); expect(deleted).toMatchObject({status: 'ineligible', observed: {deleted: true}}); }); - it('sets and clears the SPAMMER flag idempotently', async () => { - const on = envelope<'set_spammer'>({type: 'set_spammer', user_id: USER_ID, on: true}); - expect((await applyAction(h.deps, on)).status).toBe('applied'); - expect(h.users.current().flags & UserFlags.SPAMMER).toBe(UserFlags.SPAMMER); + it('limits new conversations until the requested time and lifts the limit once', async () => { + const on = envelope<'limit_new_conversations'>({ + type: 'limit_new_conversations', + user_id: USER_ID, + on: true, + until_ms: NOW + 86_400_000, + }); + expect(await applyAction(h.deps, on)).toMatchObject({status: 'applied', user_id: USER_ID}); + expect([...h.cached.values()]).toEqual([{until_ms: NOW + 86_400_000, applied_at_ms: NOW}]); expect((await applyAction(h.deps, on)).status).toBe('noop'); - const off = envelope<'set_spammer'>({type: 'set_spammer', user_id: USER_ID, on: false}); + const off = envelope<'limit_new_conversations'>({ + type: 'limit_new_conversations', + user_id: USER_ID, + on: false, + until_ms: NOW, + }); expect((await applyAction(h.deps, off)).status).toBe('applied'); - expect(h.users.current().flags & UserFlags.SPAMMER).toBe(0n); + expect(h.cached.size).toBe(0); + expect((await applyAction(h.deps, off)).status).toBe('noop'); + }); + + it('caps a limit at the maximum duration and skips one that already ended', async () => { + const far = envelope<'limit_new_conversations'>({ + type: 'limit_new_conversations', + user_id: USER_ID, + on: true, + until_ms: NOW + 2 * NEW_CONVERSATION_LIMIT_MAX_MS, + }); + expect((await applyAction(h.deps, far)).status).toBe('applied'); + expect([...h.cached.values()]).toMatchObject([{until_ms: NOW + NEW_CONVERSATION_LIMIT_MAX_MS}]); + h.cached.clear(); + const past = envelope<'limit_new_conversations'>({ + type: 'limit_new_conversations', + user_id: USER_ID, + on: true, + until_ms: NOW, + }); + expect((await applyAction(h.deps, past)).status).toBe('noop'); + expect(h.cached.size).toBe(0); + }); + + it('never limits staff, trusted, bot or deleted accounts', async () => { + const on = envelope<'limit_new_conversations'>({ + type: 'limit_new_conversations', + user_id: USER_ID, + on: true, + until_ms: NOW + 86_400_000, + }); + for (const overrides of [{flags: UserFlags.STAFF}, {flags: UserFlags.NOT_SUSPICIOUS}] satisfies Array< + Partial + >) { + h.users.put(overrides); + expect((await applyAction(h.deps, on)).status).toBe('exempt'); + } + for (const overrides of [{bot: true}, {flags: UserFlags.DELETED}] satisfies Array>) { + h.users.put(overrides); + expect((await applyAction(h.deps, on)).status).toBe('ineligible'); + } + expect(h.cached.size).toBe(0); }); it('attaches a verified phone once and logs the contact change once', async () => { h.users.put({ - flags: UserFlags.SPAMMER, + flags: UserFlags.HAS_SESSION_STARTED, suspicious_activity_flags: SuspiciousActivityFlags.REQUIRE_VERIFIED_PHONE | SuspiciousActivityFlags.REQUIRE_VERIFIED_EMAIL, }); @@ -239,7 +312,7 @@ describe('account action apply', () => { const user = h.users.current(); expect(user.hasVerifiedPhone).toBe(true); expect(user.suspiciousActivityFlags).toBe(SuspiciousActivityFlags.REQUIRE_VERIFIED_EMAIL); - expect(user.flags & UserFlags.SPAMMER).toBe(UserFlags.SPAMMER); + expect(user.flags).toBe(UserFlags.HAS_SESSION_STARTED); expect((await applyAction(h.deps, action)).status).toBe('noop'); expect(h.contactLogs).toHaveLength(1); }); @@ -304,22 +377,13 @@ describe('account action apply', () => { }); it('answers expired actions and unknown shapes without touching the account', async () => { - const expired = await applyAction( - h.deps, - envelope<'set_spammer'>({type: 'set_spammer', user_id: USER_ID, on: true, expires_at_ms: NOW}), - ); + const expired = await applyAction(h.deps, flagEnvelope({expires_at_ms: NOW})); expect(expired.status).toBe('expired'); - const future = await applyAction(h.deps, { - ...envelope<'set_spammer'>({type: 'set_spammer', user_id: USER_ID, on: true}), - v: 2, - }); + const future = await applyAction(h.deps, {...flagEnvelope(), v: 2}); expect(future.status).toBe('unsupported'); - const unknown = await applyAction(h.deps, { - ...envelope<'set_spammer'>({type: 'set_spammer', user_id: USER_ID, on: true}), - type: 'future_type', - } as unknown as ActionEnvelope); + const unknown = await applyAction(h.deps, {...flagEnvelope(), type: 'future_type'} as unknown as ActionEnvelope); expect(unknown).toMatchObject({status: 'unsupported', action_type: 'future_type'}); - expect(h.users.current().flags).toBe(0n); + expect(h.users.current().suspiciousActivityFlags).toBe(0); }); }); @@ -356,7 +420,7 @@ describe('account action messages', () => { h.deps.publishOutcome = async (_key, outcome) => { outcomes.push(outcome); }; - const good = fakeMsg(JSON.stringify(envelope<'set_spammer'>({type: 'set_spammer', user_id: USER_ID, on: true})), 1); + const good = fakeMsg(JSON.stringify(flagEnvelope()), 1); await handleActionMessage(h.deps, good.msg); expect(outcomes.map((outcome) => outcome.status)).toEqual(['applied']); expect(good.state.acked).toBe(1); @@ -376,7 +440,7 @@ describe('account action messages', () => { h.deps.publishOutcome = async (_key, outcome) => { outcomes.push(outcome); }; - const data = JSON.stringify(envelope<'set_spammer'>({type: 'set_spammer', user_id: USER_ID, on: true})); + const data = JSON.stringify(flagEnvelope()); const early = fakeMsg(data, 3); await handleActionMessage(h.deps, early.msg); expect(early.state.naks).toEqual([3000]); @@ -422,30 +486,12 @@ describe.skipIf(!NATS_URL)('account action consumer against JetStream', () => { h.deps.retryDelayMs = 200; const js = jetstream(nc); const expires = Date.now() + 60_000; + await js.publish('act.07', JSON.stringify(flagEnvelope({id: 'a:07:1:0', expires_at_ms: expires})), { + msgID: 'a:07:1:0', + }); await js.publish( 'act.07', - JSON.stringify( - envelope<'set_spammer'>({ - type: 'set_spammer', - id: 'a:07:1:0', - user_id: USER_ID, - on: true, - expires_at_ms: expires, - }), - ), - {msgID: 'a:07:1:0'}, - ); - await js.publish( - 'act.07', - JSON.stringify( - envelope<'set_spammer'>({ - type: 'set_spammer', - id: 'a:07:2:0', - user_id: USER_ID, - on: false, - expires_at_ms: expires, - }), - ), + JSON.stringify(flagEnvelope({id: 'a:07:2:0', set: 0, clear: 1, expires_at_ms: expires})), {msgID: 'a:07:2:0'}, ); startAccountActionConsumer(h.deps); @@ -457,7 +503,7 @@ describe.skipIf(!NATS_URL)('account action consumer against JetStream', () => { ['a:07:1:0', 'applied'], ['a:07:2:0', 'applied'], ]); - expect(h.users.current().flags & UserFlags.SPAMMER).toBe(0n); + expect(h.users.current().suspiciousActivityFlags).toBe(0); const info = await (await jetstreamManager(nc)).consumers.info(ACTIONS_STREAM, effectsConsumer(7)); expect(info.num_ack_pending).toBe(0); expect(info.num_pending).toBe(0); diff --git a/fluxer_app/src/features/app/components/alerts/DmActionErrorModal.tsx b/fluxer_app/src/features/app/components/alerts/DmActionErrorModal.tsx index 455fed546..3adfdf150 100644 --- a/fluxer_app/src/features/app/components/alerts/DmActionErrorModal.tsx +++ b/fluxer_app/src/features/app/components/alerts/DmActionErrorModal.tsx @@ -7,7 +7,7 @@ import { RATE_LIMITED_ERROR_TITLE_DESCRIPTOR, } from '@app/features/app/components/alerts/CommonErrorModalDescriptors'; import {GenericErrorModal} from '@app/features/app/components/alerts/GenericErrorModal'; -import {failureCode} from '@app/features/platform/utils/ResponseInspection'; +import {failureCode, failureMessage} from '@app/features/platform/utils/ResponseInspection'; import * as ModalCommands from '@app/features/ui/commands/ModalCommands'; import {modal} from '@app/features/ui/commands/ModalCommands'; import {APIErrorCodes} from '@fluxer/constants/src/ApiErrorCodes'; @@ -66,8 +66,16 @@ const GENERIC_TITLE_DESCRIPTOR = msg({ comment: 'Title of the generic fallback error modal shown when opening or creating a DM fails.', }); -export function resolveDmActionErrorContent(code: string | undefined): {title: string; message: string} { +export function resolveDmActionErrorContent( + code: string | undefined, + apiMessage?: string, +): {title: string; message: string} { switch (code) { + case APIErrorCodes.NEW_CONVERSATIONS_LIMITED: + return { + title: i18nGlobal._(GENERIC_TITLE_DESCRIPTOR), + message: apiMessage || i18nGlobal._(GENERIC_ERROR_BODY_DESCRIPTOR), + }; case APIErrorCodes.CANNOT_SEND_MESSAGES_TO_USER: return { title: i18nGlobal._(CANNOT_MESSAGE_USER_TITLE_DESCRIPTOR), @@ -113,9 +121,10 @@ export function resolveDmActionErrorContent(code: string | undefined): {title: s export function showDmActionErrorModal(error: unknown): void { const code = failureCode(error); + const apiMessage = failureMessage(error); ModalCommands.push( modal(() => { - const {title, message} = resolveDmActionErrorContent(code); + const {title, message} = resolveDmActionErrorContent(code, apiMessage); return ( ); diff --git a/fluxer_app/src/features/channel/components/direct_message/AddFriendForm.tsx b/fluxer_app/src/features/channel/components/direct_message/AddFriendForm.tsx index 0dcfede6d..6eb2357b6 100644 --- a/fluxer_app/src/features/channel/components/direct_message/AddFriendForm.tsx +++ b/fluxer_app/src/features/channel/components/direct_message/AddFriendForm.tsx @@ -5,7 +5,7 @@ import {EXAMPLE_FLUXER_TAG_FULL} from '@app/features/app/config/I18nDisplayConst import {openClaimAccountModal} from '@app/features/auth/components/modals/ClaimAccountModal'; import styles from '@app/features/channel/components/direct_message/AddFriendForm.module.css'; import {CLAIM_ACCOUNT_DESCRIPTOR, VERIFY_EMAIL_DESCRIPTOR} from '@app/features/i18n/utils/CommonMessageDescriptors'; -import {failureCode} from '@app/features/platform/utils/ResponseInspection'; +import {failureCode, failureMessage} from '@app/features/platform/utils/ResponseInspection'; import * as RelationshipCommands from '@app/features/relationship/commands/RelationshipCommands'; import {getSendFriendRequestErrorMessage} from '@app/features/relationship/utils/RelationshipActionUtils'; import {OUTGOING_FRIEND_REQUEST_STATUS_DESCRIPTOR} from '@app/features/relationship/utils/RelationshipMessageDescriptors'; @@ -53,6 +53,7 @@ export const AddFriendForm: React.FC = observer(({onSuccess} const [isLoading, setIsLoading] = useState(false); const [resultStatus, setResultStatus] = useState<'success' | 'error' | null>(null); const [errorCode, setErrorCode] = useState(null); + const [errorMessage, setErrorMessage] = useState(null); const currentUser = Users.currentUser; const isClaimed = currentUser?.isClaimed() ?? true; if (!isClaimed) { @@ -109,6 +110,7 @@ export const AddFriendForm: React.FC = observer(({onSuccess} if (resultStatus) { setResultStatus(null); setErrorCode(null); + setErrorMessage(null); } }; const getErrorMessage = () => { @@ -121,6 +123,9 @@ export const AddFriendForm: React.FC = observer(({onSuccess} if (errorCode === APIErrorCodes.DISCRIMINATOR_REQUIRED) { return i18n._(PLEASE_ENTER_A_VALID_USERNAME_DESCRIPTOR, {exampleFluxerTagFull: EXAMPLE_FLUXER_TAG_FULL}); } + if (errorCode === APIErrorCodes.NEW_CONVERSATIONS_LIMITED) { + return getSendFriendRequestErrorMessage(i18n, errorCode, errorMessage); + } return getSendFriendRequestErrorMessage(i18n, errorCode, null); }; const handleSubmit = (e: React.SubmitEvent) => { @@ -129,6 +134,7 @@ export const AddFriendForm: React.FC = observer(({onSuccess} if (!username || !discriminator || !/^\d{4}$/.test(discriminator)) { setResultStatus('error'); setErrorCode(APIErrorCodes.NO_USERS_WITH_FLUXERTAG_EXIST); + setErrorMessage(null); return; } setIsLoading(true); @@ -143,6 +149,7 @@ export const AddFriendForm: React.FC = observer(({onSuccess} setIsLoading(false); setResultStatus('error'); setErrorCode(failureCode(error) ?? null); + setErrorMessage(failureMessage(error) ?? null); }); }; const isDisabled = isLoading || !input['trim'](); diff --git a/fluxer_app/src/features/i18n/locales/ar/messages.po b/fluxer_app/src/features/i18n/locales/ar/messages.po index ee8d23669..8604623cc 100644 --- a/fluxer_app/src/features/i18n/locales/ar/messages.po +++ b/fluxer_app/src/features/i18n/locales/ar/messages.po @@ -7897,7 +7897,7 @@ msgstr "استلام الهدية" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "طالب بحسابك لاسترداد هذه الهدية." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "نموذج التحقق من رقم الهاتف" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "يجب عليك التحقق من رقم الهاتف لإرسال ال msgid "You need to verify your email address before you can create a community." msgstr "يجب عليك التحقق من عنوان بريدك الإلكتروني قبل أن تتمكن من إنشاء مجتمع." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "يجب عليك التحقق من عنوان بريدك الإلكتروني قبل أن تتمكن من إرسال طلبات الصداقة." diff --git a/fluxer_app/src/features/i18n/locales/bg/messages.po b/fluxer_app/src/features/i18n/locales/bg/messages.po index 5262c5513..d80f5475a 100644 --- a/fluxer_app/src/features/i18n/locales/bg/messages.po +++ b/fluxer_app/src/features/i18n/locales/bg/messages.po @@ -7897,7 +7897,7 @@ msgstr "Вземи подарък" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Заяви акаунта си, за да осребриш този по #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Формуляр за потвърждаване на телефонен #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "Трябва да потвърдиш телефонен номер, за msgid "You need to verify your email address before you can create a community." msgstr "Трябва да потвърдиш имейл адреса си, преди да можеш да създадеш общност." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Трябва да потвърдиш имейл адреса си, преди да можеш да изпращаш покани за приятелство." diff --git a/fluxer_app/src/features/i18n/locales/cs/messages.po b/fluxer_app/src/features/i18n/locales/cs/messages.po index 8a79ecfe6..24f148d4e 100644 --- a/fluxer_app/src/features/i18n/locales/cs/messages.po +++ b/fluxer_app/src/features/i18n/locales/cs/messages.po @@ -7897,7 +7897,7 @@ msgstr "Převzít dárek" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Pro uplatnění tohoto dárku dokončete registraci účtu." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Formulář pro ověření telefonního čísla" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "Abyste mohli v této komunitě posílat zprávy, musíte si ověřit tel msgid "You need to verify your email address before you can create a community." msgstr "Než budete moct vytvořit komunitu, musíte si ověřit e-mailovou adresu." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Než budete moct posílat žádosti o přátelství, musíte si ověřit svou e-mailovou adresu." diff --git a/fluxer_app/src/features/i18n/locales/da/messages.po b/fluxer_app/src/features/i18n/locales/da/messages.po index be1b58294..407e203cb 100644 --- a/fluxer_app/src/features/i18n/locales/da/messages.po +++ b/fluxer_app/src/features/i18n/locales/da/messages.po @@ -7897,7 +7897,7 @@ msgstr "Indløs gave" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Fuldfør oprettelsen af din konto for at indløse denne gave." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Formular til bekræftelse af telefonnummer" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "Du skal bekræfte et telefonnummer for at sende beskeder i dette fælles msgid "You need to verify your email address before you can create a community." msgstr "Du skal bekræfte din e-mailadresse, før du kan oprette et fællesskab." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Du skal bekræfte din e-mailadresse, før du kan sende venneanmodninger." diff --git a/fluxer_app/src/features/i18n/locales/de/messages.po b/fluxer_app/src/features/i18n/locales/de/messages.po index dd6c07f52..42744069a 100644 --- a/fluxer_app/src/features/i18n/locales/de/messages.po +++ b/fluxer_app/src/features/i18n/locales/de/messages.po @@ -7897,7 +7897,7 @@ msgstr "Geschenk einlösen" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Beanspruche deinen Account, um dieses Geschenk einzulösen." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Formular zur Verifizierung der Telefonnummer" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "Du musst eine Telefonnummer verifizieren, um Nachrichten in dieser Commu msgid "You need to verify your email address before you can create a community." msgstr "Du musst deine E-Mail-Adresse bestätigen, bevor du eine Community erstellen kannst." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Du musst deine E-Mail-Adresse bestätigen, bevor du Freundschaftsanfragen senden kannst." diff --git a/fluxer_app/src/features/i18n/locales/el/messages.po b/fluxer_app/src/features/i18n/locales/el/messages.po index 6a6986e4b..c918f996a 100644 --- a/fluxer_app/src/features/i18n/locales/el/messages.po +++ b/fluxer_app/src/features/i18n/locales/el/messages.po @@ -7897,7 +7897,7 @@ msgstr "Παραλαβή δώρου" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Διεκδικήστε τον λογαριασμό σας για να ε #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Φόρμα επαλήθευσης αριθμού τηλεφώνου" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "Πρέπει να επαληθεύσετε έναν αριθμό τηλ msgid "You need to verify your email address before you can create a community." msgstr "Πρέπει να επαληθεύσετε τη διεύθυνση email σας πριν δημιουργήσετε μια κοινότητα." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Πρέπει να επαληθεύσετε τη διεύθυνση email σας πριν στείλετε αιτήματα φιλίας." diff --git a/fluxer_app/src/features/i18n/locales/en-GB/messages.po b/fluxer_app/src/features/i18n/locales/en-GB/messages.po index 92b92acaa..04ef8ba7d 100644 --- a/fluxer_app/src/features/i18n/locales/en-GB/messages.po +++ b/fluxer_app/src/features/i18n/locales/en-GB/messages.po @@ -7897,7 +7897,7 @@ msgstr "Claim gift" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Claim your account to redeem this gift." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38059,7 +38059,7 @@ msgstr "Verify phone number form" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40402,7 +40402,7 @@ msgstr "You need to verify a phone number to send messages in this community." msgid "You need to verify your email address before you can create a community." msgstr "You need to verify your email address before you can create a community." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "You need to verify your email address before you can send friend requests." diff --git a/fluxer_app/src/features/i18n/locales/en-US/messages.po b/fluxer_app/src/features/i18n/locales/en-US/messages.po index 9935d3344..d9593a80f 100644 --- a/fluxer_app/src/features/i18n/locales/en-US/messages.po +++ b/fluxer_app/src/features/i18n/locales/en-US/messages.po @@ -7897,7 +7897,7 @@ msgstr "Claim gift" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Claim your account to redeem this gift." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Verify phone number form" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "You need to verify a phone number to send messages in this community." msgid "You need to verify your email address before you can create a community." msgstr "You need to verify your email address before you can create a community." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "You need to verify your email address before you can send friend requests." diff --git a/fluxer_app/src/features/i18n/locales/es-419/messages.po b/fluxer_app/src/features/i18n/locales/es-419/messages.po index de434f25a..8739bd1aa 100644 --- a/fluxer_app/src/features/i18n/locales/es-419/messages.po +++ b/fluxer_app/src/features/i18n/locales/es-419/messages.po @@ -7897,7 +7897,7 @@ msgstr "Reclamar regalo" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Completa el registro de tu cuenta para canjear este regalo." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Formulario para verificar el número de teléfono" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "Necesitas verificar un número de teléfono para enviar mensajes en esta msgid "You need to verify your email address before you can create a community." msgstr "Necesitas verificar tu dirección de correo electrónico antes de poder crear una comunidad." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Necesitas verificar tu correo electrónico antes de poder enviar solicitudes de amistad." diff --git a/fluxer_app/src/features/i18n/locales/es-ES/messages.po b/fluxer_app/src/features/i18n/locales/es-ES/messages.po index 4def220e5..22d524ca7 100644 --- a/fluxer_app/src/features/i18n/locales/es-ES/messages.po +++ b/fluxer_app/src/features/i18n/locales/es-ES/messages.po @@ -7897,7 +7897,7 @@ msgstr "Reclamar regalo" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Completa el registro de tu cuenta para canjear este regalo." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Formulario de verificación del número de teléfono" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "Tienes que verificar un número de teléfono para enviar mensajes en est msgid "You need to verify your email address before you can create a community." msgstr "Tienes que verificar tu dirección de correo electrónico antes de poder crear una comunidad." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Tienes que verificar tu dirección de correo electrónico antes de poder enviar solicitudes de amistad." diff --git a/fluxer_app/src/features/i18n/locales/fi/messages.po b/fluxer_app/src/features/i18n/locales/fi/messages.po index f5b5f5e89..53b7c0d56 100644 --- a/fluxer_app/src/features/i18n/locales/fi/messages.po +++ b/fluxer_app/src/features/i18n/locales/fi/messages.po @@ -7897,7 +7897,7 @@ msgstr "Lunasta lahja" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Viimeistele tilisi rekisteröinti, jotta voit lunastaa tämän lahjan." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Vahvista puhelinnumero -lomake" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "Sinun on vahvistettava puhelinnumero lähettääksesi viestejä tässä msgid "You need to verify your email address before you can create a community." msgstr "Vahvista sähköpostiosoitteesi, ennen kuin voit luoda yhteisön." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Vahvista sähköpostiosoitteesi, ennen kuin voit lähettää kaveripyyntöjä." diff --git a/fluxer_app/src/features/i18n/locales/fr/messages.po b/fluxer_app/src/features/i18n/locales/fr/messages.po index afdd87541..ca22eb308 100644 --- a/fluxer_app/src/features/i18n/locales/fr/messages.po +++ b/fluxer_app/src/features/i18n/locales/fr/messages.po @@ -7897,7 +7897,7 @@ msgstr "Récupérer le cadeau" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Finalisez votre inscription pour récupérer ce cadeau." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Formulaire de vérification du numéro de téléphone" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "Vous devez vérifier un numéro de téléphone pour envoyer des messages msgid "You need to verify your email address before you can create a community." msgstr "Vous devez vérifier votre adresse e-mail avant de pouvoir créer une communauté." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Vous devez vérifier votre adresse e-mail avant de pouvoir envoyer des demandes d'ami." diff --git a/fluxer_app/src/features/i18n/locales/he/messages.po b/fluxer_app/src/features/i18n/locales/he/messages.po index b73beb989..16c679973 100644 --- a/fluxer_app/src/features/i18n/locales/he/messages.po +++ b/fluxer_app/src/features/i18n/locales/he/messages.po @@ -7897,7 +7897,7 @@ msgstr "קבל את המתנה" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "תבע את החשבון שלך כדי לממש את המתנה הזו." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "טופס אימות מספר טלפון" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "עליך לאמת מספר טלפון כדי לשלוח הודעות ב msgid "You need to verify your email address before you can create a community." msgstr "יש לאמת את כתובת האימייל שלך לפני שתוכל ליצור קהילה." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "עליך לאמת את כתובת האימייל שלך לפני שתוכל לשלוח בקשות חברות." diff --git a/fluxer_app/src/features/i18n/locales/hi/messages.po b/fluxer_app/src/features/i18n/locales/hi/messages.po index 6108a4580..2926476fe 100644 --- a/fluxer_app/src/features/i18n/locales/hi/messages.po +++ b/fluxer_app/src/features/i18n/locales/hi/messages.po @@ -7897,7 +7897,7 @@ msgstr "उपहार क्लेम करें" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "यह उपहार पाने के लिए अपना अक #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "फ़ोन नंबर वेरिफ़ाई करने का #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "इस कम्युनिटी में मैसेज भेज msgid "You need to verify your email address before you can create a community." msgstr "कम्युनिटी बनाने से पहले आपको अपना ईमेल पता वेरिफ़ाई करना होगा।" -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "फ्रेंड रिक्वेस्ट भेजने से पहले आपको अपना ईमेल पता वेरिफ़ाई करना होगा।" diff --git a/fluxer_app/src/features/i18n/locales/hr/messages.po b/fluxer_app/src/features/i18n/locales/hr/messages.po index f7fc38c27..16ceaf9d0 100644 --- a/fluxer_app/src/features/i18n/locales/hr/messages.po +++ b/fluxer_app/src/features/i18n/locales/hr/messages.po @@ -7897,7 +7897,7 @@ msgstr "Preuzmi poklon" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Preuzmite svoj račun kako biste iskoristili ovaj poklon." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Obrazac za potvrdu telefonskog broja" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "Morate potvrditi telefonski broj da biste slali poruke u ovoj zajednici. msgid "You need to verify your email address before you can create a community." msgstr "Morate potvrditi svoju adresu e-pošte prije nego što možete stvoriti zajednicu." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Morate potvrditi svoju adresu e-pošte prije nego što možete slati zahtjeve za prijateljstvo." diff --git a/fluxer_app/src/features/i18n/locales/hu/messages.po b/fluxer_app/src/features/i18n/locales/hu/messages.po index b0a600c6b..870107a24 100644 --- a/fluxer_app/src/features/i18n/locales/hu/messages.po +++ b/fluxer_app/src/features/i18n/locales/hu/messages.po @@ -7897,7 +7897,7 @@ msgstr "Ajándék beváltása" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Az ajándék beváltásához fejezd be a fiókod regisztrációját." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Telefonszám-ellenőrző űrlap" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "Telefonszámot kell igazolnod, hogy üzeneteket küldhess ebben a közö msgid "You need to verify your email address before you can create a community." msgstr "Közösség létrehozása előtt meg kell erősítened az e-mail-címedet." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Ismerősjelölések küldése előtt meg kell erősítened az e-mail-címedet." diff --git a/fluxer_app/src/features/i18n/locales/id/messages.po b/fluxer_app/src/features/i18n/locales/id/messages.po index 76dd421c6..3486abe5e 100644 --- a/fluxer_app/src/features/i18n/locales/id/messages.po +++ b/fluxer_app/src/features/i18n/locales/id/messages.po @@ -7897,7 +7897,7 @@ msgstr "Klaim hadiah" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Klaim akunmu untuk menukarkan hadiah ini." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Formulir verifikasi nomor telepon" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "Kamu perlu memverifikasi nomor telepon untuk mengirim pesan di komunitas msgid "You need to verify your email address before you can create a community." msgstr "Kamu perlu memverifikasi alamat emailmu sebelum bisa membuat komunitas." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Kamu perlu memverifikasi alamat emailmu sebelum bisa mengirim permintaan pertemanan." diff --git a/fluxer_app/src/features/i18n/locales/it/messages.po b/fluxer_app/src/features/i18n/locales/it/messages.po index 172221847..ad01b47d5 100644 --- a/fluxer_app/src/features/i18n/locales/it/messages.po +++ b/fluxer_app/src/features/i18n/locales/it/messages.po @@ -7897,7 +7897,7 @@ msgstr "Riscatta regalo" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Completa la registrazione del tuo account per riscattare questo regalo." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Modulo di verifica del numero di telefono" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "Devi verificare un numero di telefono per inviare messaggi in questa com msgid "You need to verify your email address before you can create a community." msgstr "Devi verificare il tuo indirizzo email prima di poter creare una community." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Devi verificare il tuo indirizzo email prima di poter inviare richieste di amicizia." diff --git a/fluxer_app/src/features/i18n/locales/ja/messages.po b/fluxer_app/src/features/i18n/locales/ja/messages.po index 110b0d437..8b19d0fcd 100644 --- a/fluxer_app/src/features/i18n/locales/ja/messages.po +++ b/fluxer_app/src/features/i18n/locales/ja/messages.po @@ -7897,7 +7897,7 @@ msgstr "ギフトを受け取る" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "ギフトを受け取るにはアカウントを登録してください #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "電話番号認証フォーム" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "このコミュニティでメッセージを送信するには、電話 msgid "You need to verify your email address before you can create a community." msgstr "コミュニティを作成する前に、メールアドレスの確認が必要です。" -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "友達リクエストを送信する前に、メールアドレスの確認が必要です。" diff --git a/fluxer_app/src/features/i18n/locales/ko/messages.po b/fluxer_app/src/features/i18n/locales/ko/messages.po index 45ee93541..fd3f31a05 100644 --- a/fluxer_app/src/features/i18n/locales/ko/messages.po +++ b/fluxer_app/src/features/i18n/locales/ko/messages.po @@ -7897,7 +7897,7 @@ msgstr "선물 받기" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "선물을 받으려면 계정을 등록하세요." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "전화번호 인증 양식" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "이 커뮤니티에서 메시지를 보내려면 전화번호 인증이 msgid "You need to verify your email address before you can create a community." msgstr "커뮤니티를 만들려면 먼저 이메일 주소를 인증해야 합니다." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "친구 요청을 보내려면 먼저 이메일 주소를 인증해야 합니다." diff --git a/fluxer_app/src/features/i18n/locales/lt/messages.po b/fluxer_app/src/features/i18n/locales/lt/messages.po index 54f779dba..3f78e7471 100644 --- a/fluxer_app/src/features/i18n/locales/lt/messages.po +++ b/fluxer_app/src/features/i18n/locales/lt/messages.po @@ -7897,7 +7897,7 @@ msgstr "Atsiimti dovaną" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Užregistruokite paskyrą, kad atsiimtumėte šią dovaną." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38059,7 +38059,7 @@ msgstr "Telefono numerio patvirtinimo forma" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40402,7 +40402,7 @@ msgstr "Norėdami siųsti žinutes šioje bendruomenėje, turite patvirtinti tel msgid "You need to verify your email address before you can create a community." msgstr "Prieš kurdami bendruomenę, turite patvirtinti savo el. pašto adresą." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Prieš siųsdami draugystės užklausas turite patvirtinti savo el. pašto adresą." diff --git a/fluxer_app/src/features/i18n/locales/nl/messages.po b/fluxer_app/src/features/i18n/locales/nl/messages.po index 25d0e956f..62a3662a7 100644 --- a/fluxer_app/src/features/i18n/locales/nl/messages.po +++ b/fluxer_app/src/features/i18n/locales/nl/messages.po @@ -7897,7 +7897,7 @@ msgstr "Cadeau inwisselen" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Voltooi de registratie van je account om dit cadeau in te wisselen." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Formulier voor telefoonnummerverificatie" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "Je moet een telefoonnummer verifiëren om berichten te kunnen versturen msgid "You need to verify your email address before you can create a community." msgstr "Je moet je e-mailadres verifiëren voordat je een community kunt aanmaken." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Je moet je e-mailadres verifiëren voordat je vriendschapsverzoeken kunt versturen." diff --git a/fluxer_app/src/features/i18n/locales/no/messages.po b/fluxer_app/src/features/i18n/locales/no/messages.po index 141d73d5e..7158b3094 100644 --- a/fluxer_app/src/features/i18n/locales/no/messages.po +++ b/fluxer_app/src/features/i18n/locales/no/messages.po @@ -7897,7 +7897,7 @@ msgstr "Hent gave" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Fullfør registreringen av kontoen din for å løse inn denne gaven." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Skjema for bekreftelse av telefonnummer" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "Du må bekrefte et telefonnummer for å sende meldinger i dette fellessk msgid "You need to verify your email address before you can create a community." msgstr "Du må bekrefte e-postadressen din før du kan opprette et fellesskap." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Du må bekrefte e-postadressen din før du kan sende venneforespørsler." diff --git a/fluxer_app/src/features/i18n/locales/pl/messages.po b/fluxer_app/src/features/i18n/locales/pl/messages.po index 43df150b0..96546b3c5 100644 --- a/fluxer_app/src/features/i18n/locales/pl/messages.po +++ b/fluxer_app/src/features/i18n/locales/pl/messages.po @@ -7897,7 +7897,7 @@ msgstr "Odbierz prezent" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Dokończ rejestrację konta, aby odebrać ten prezent." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Formularz weryfikacji numeru telefonu" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "Aby wysyłać wiadomości w tej społeczności, musisz zweryfikować sw msgid "You need to verify your email address before you can create a community." msgstr "Musisz zweryfikować swój adres e-mail, zanim utworzysz społeczność." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Musisz zweryfikować swój adres e-mail, zanim wyślesz zaproszenia do znajomych." diff --git a/fluxer_app/src/features/i18n/locales/pt-BR/messages.po b/fluxer_app/src/features/i18n/locales/pt-BR/messages.po index 526b8f74a..a01ffcb50 100644 --- a/fluxer_app/src/features/i18n/locales/pt-BR/messages.po +++ b/fluxer_app/src/features/i18n/locales/pt-BR/messages.po @@ -7897,7 +7897,7 @@ msgstr "Resgatar presente" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Reivindique sua conta para resgatar este presente." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Formulário de verificação do número de telefone" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "Você precisa verificar um número de telefone para enviar mensagens nes msgid "You need to verify your email address before you can create a community." msgstr "Você precisa verificar seu endereço de e-mail antes de criar uma comunidade." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Você precisa verificar seu e-mail antes de enviar pedidos de amizade." diff --git a/fluxer_app/src/features/i18n/locales/ro/messages.po b/fluxer_app/src/features/i18n/locales/ro/messages.po index 015978fb4..fac42dc6a 100644 --- a/fluxer_app/src/features/i18n/locales/ro/messages.po +++ b/fluxer_app/src/features/i18n/locales/ro/messages.po @@ -7897,7 +7897,7 @@ msgstr "Revendică cadoul" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Revendică-ți contul pentru a valorifica acest cadou." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Formular de verificare a numărului de telefon" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "Trebuie să-ți verifici numărul de telefon pentru a trimite mesaje în msgid "You need to verify your email address before you can create a community." msgstr "Trebuie să-ți verifici adresa de e-mail înainte de a putea crea o comunitate." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Trebuie să-ți verifici adresa de e-mail înainte de a putea trimite cereri de prietenie." diff --git a/fluxer_app/src/features/i18n/locales/ru/messages.po b/fluxer_app/src/features/i18n/locales/ru/messages.po index 9a406d0a1..f40c78422 100644 --- a/fluxer_app/src/features/i18n/locales/ru/messages.po +++ b/fluxer_app/src/features/i18n/locales/ru/messages.po @@ -7897,7 +7897,7 @@ msgstr "Забрать подарок" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Подтвердите аккаунт, чтобы получить эт #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Форма подтверждения номера телефона" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "Чтобы отправлять сообщения в этом сооб msgid "You need to verify your email address before you can create a community." msgstr "Чтобы создать сообщество, подтвердите адрес электронной почты." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Чтобы отправлять запросы на добавление в друзья, подтвердите свой адрес электронной почты." diff --git a/fluxer_app/src/features/i18n/locales/sv-SE/messages.po b/fluxer_app/src/features/i18n/locales/sv-SE/messages.po index 5c01960c4..2e89159b3 100644 --- a/fluxer_app/src/features/i18n/locales/sv-SE/messages.po +++ b/fluxer_app/src/features/i18n/locales/sv-SE/messages.po @@ -7897,7 +7897,7 @@ msgstr "Lös in present" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Säkra ditt konto för att lösa in den här presenten." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Formulär för att verifiera telefonnummer" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "Du måste verifiera ett telefonnummer för att skicka meddelanden i den msgid "You need to verify your email address before you can create a community." msgstr "Du måste verifiera din e-postadress innan du kan skapa en community." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Du måste verifiera din e-postadress innan du kan skicka vänförfrågningar." diff --git a/fluxer_app/src/features/i18n/locales/th/messages.po b/fluxer_app/src/features/i18n/locales/th/messages.po index d4d443165..7aa579e37 100644 --- a/fluxer_app/src/features/i18n/locales/th/messages.po +++ b/fluxer_app/src/features/i18n/locales/th/messages.po @@ -7897,7 +7897,7 @@ msgstr "รับของขวัญ" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "ยืนยันบัญชีเพื่อรับของขว #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "แบบฟอร์มยืนยันเบอร์โทรศั #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "คุณต้องยืนยันเบอร์โทรศัพ msgid "You need to verify your email address before you can create a community." msgstr "คุณต้องยืนยันอีเมลก่อนจึงจะสร้างคอมมูนิตี้ได้" -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "คุณต้องยืนยันอีเมลก่อนจึงจะส่งคำขอเป็นเพื่อนได้" diff --git a/fluxer_app/src/features/i18n/locales/tr/messages.po b/fluxer_app/src/features/i18n/locales/tr/messages.po index 27c360812..8583a4122 100644 --- a/fluxer_app/src/features/i18n/locales/tr/messages.po +++ b/fluxer_app/src/features/i18n/locales/tr/messages.po @@ -7897,7 +7897,7 @@ msgstr "Hediyeyi al" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Bu hediyeyi kullanmak için hesabınızı sahiplenin." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Telefon numarası doğrulama formu" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "Bu toplulukta mesaj göndermek için bir telefon numarası doğrulamanı msgid "You need to verify your email address before you can create a community." msgstr "Bir topluluk oluşturmadan önce e-posta adresinizi doğrulamanız gerekiyor." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Arkadaşlık isteği göndermeden önce e-posta adresinizi doğrulamanız gerekiyor." diff --git a/fluxer_app/src/features/i18n/locales/uk/messages.po b/fluxer_app/src/features/i18n/locales/uk/messages.po index bc46a7519..49da4a38a 100644 --- a/fluxer_app/src/features/i18n/locales/uk/messages.po +++ b/fluxer_app/src/features/i18n/locales/uk/messages.po @@ -7897,7 +7897,7 @@ msgstr "Отримати подарунок" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Щоб активувати цей подарунок, зареєстр #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Форма підтвердження номера телефону" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "Щоб надсилати повідомлення в цій спіль msgid "You need to verify your email address before you can create a community." msgstr "Щоб створити спільноту, потрібно підтвердити свою електронну адресу." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Щоб надсилати запити на додавання в друзі, потрібно підтвердити свою електронну адресу." diff --git a/fluxer_app/src/features/i18n/locales/vi/messages.po b/fluxer_app/src/features/i18n/locales/vi/messages.po index 2432fd960..aede4bdcf 100644 --- a/fluxer_app/src/features/i18n/locales/vi/messages.po +++ b/fluxer_app/src/features/i18n/locales/vi/messages.po @@ -7897,7 +7897,7 @@ msgstr "Nhận quà" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "Xác nhận tài khoản để nhận quà này." #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "Biểu mẫu xác minh số điện thoại" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "Bạn cần xác minh số điện thoại để gửi tin nhắn trong msgid "You need to verify your email address before you can create a community." msgstr "Bạn cần xác minh địa chỉ email trước khi tạo cộng đồng." -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "Bạn cần xác minh địa chỉ email trước khi gửi lời mời kết bạn." diff --git a/fluxer_app/src/features/i18n/locales/zh-CN/messages.po b/fluxer_app/src/features/i18n/locales/zh-CN/messages.po index 716468dec..acef44ad2 100644 --- a/fluxer_app/src/features/i18n/locales/zh-CN/messages.po +++ b/fluxer_app/src/features/i18n/locales/zh-CN/messages.po @@ -7897,7 +7897,7 @@ msgstr "领取礼物" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "请先认领账号,然后才能领取此礼物。" #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "验证手机号表单" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "你需要验证手机号才能在此社区中发送消息。" msgid "You need to verify your email address before you can create a community." msgstr "你需要先验证邮箱地址,才能创建社区。" -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "你需要先验证邮箱地址,才能发送好友请求。" diff --git a/fluxer_app/src/features/i18n/locales/zh-TW/messages.po b/fluxer_app/src/features/i18n/locales/zh-TW/messages.po index ee2ff741b..f41429b13 100644 --- a/fluxer_app/src/features/i18n/locales/zh-TW/messages.po +++ b/fluxer_app/src/features/i18n/locales/zh-TW/messages.po @@ -7897,7 +7897,7 @@ msgstr "領取禮物" #. Title shown when an unclaimed account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:32 #: src/features/auth/components/modals/ClaimAccountModal.tsx:41 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:62 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 #: src/features/channel/utils/CreateDMModalUtils.tsx:43 #: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213 #: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:441 @@ -7979,7 +7979,7 @@ msgstr "認領您的帳號即可兌換此禮物。" #. Description text in the channel and chat dm welcome section. #. Description text in the user profile modal. #. Tooltip shown when an unclaimed account tries to send a friend request. -#: src/features/channel/components/direct_message/AddFriendForm.tsx:63 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:64 #: src/features/channel/components/direct_message/DMWelcomeSection.tsx:37 #: src/features/ui/action_menu/items/RelationshipMenuItems.tsx:40 #: src/features/user/components/modals/UserProfileModal.tsx:122 @@ -38058,7 +38058,7 @@ msgstr "驗證電話號碼表單" #. Title of the error modal shown when an unverified account tries to start a DM. #. Title shown when an unverified account cannot start a DM or group DM. #: src/features/app/components/alerts/DmActionErrorModal.tsx:40 -#: src/features/channel/components/direct_message/AddFriendForm.tsx:79 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 #: src/features/channel/utils/CreateDMModalUtils.tsx:51 #: src/features/moderation/components/report/ReportStepEmail.tsx:43 msgid "Verify your email" @@ -40401,7 +40401,7 @@ msgstr "您需要驗證電話號碼才能在這個社群傳送訊息。" msgid "You need to verify your email address before you can create a community." msgstr "您必須先驗證電子郵件地址,才能建立社群。" -#: src/features/channel/components/direct_message/AddFriendForm.tsx:80 +#: src/features/channel/components/direct_message/AddFriendForm.tsx:81 msgid "You need to verify your email address before you can send friend requests." msgstr "您必須先驗證電子郵件地址,才能傳送好友邀請。" diff --git a/fluxer_app/src/features/messaging/state/MessageQueue.tsx b/fluxer_app/src/features/messaging/state/MessageQueue.tsx index 9ea42533e..e8eab4f0e 100644 --- a/fluxer_app/src/features/messaging/state/MessageQueue.tsx +++ b/fluxer_app/src/features/messaging/state/MessageQueue.tsx @@ -1270,6 +1270,12 @@ export class MessageQueue extends Queue1, and a target accepting requests only from mutual friends or mutual guild members rejects an unrelated caller with 400 `FRIEND_REQUEST_BLOCKED`. The [relationship limit](#relationship-limit) applies last, independently for both accounts. +A target the caller has blocked returns 400 `CANNOT_SEND_FRIEND_REQUEST_TO_BLOCKED_USER`. A target that has blocked the caller returns 400 `FRIEND_REQUEST_BLOCKED`. Fluxer reads the target's [friend source flags](/http-api/users/#friend-source-flags) next1, and a target accepting requests only from mutual friends or mutual guild members rejects an unrelated caller with 400 `FRIEND_REQUEST_BLOCKED`. An account under a [new conversation limit](/http-api/users/private-channels/#new-conversation-limit) then returns 403 `NEW_CONVERSATIONS_LIMITED`, unless the target is a bot or has already written in a direct message with it. The [relationship limit](#relationship-limit) applies last, independently for both accounts. 1 The friend source evaluation is skipped when the target has no stored settings, which admits the request as though the target permitted requests from anyone @@ -202,7 +202,7 @@ The body can be omitted, in which case it is treated as an empty object. | --- | --- | --- | | 200 | [relationship](#relationship-object) object | A pending request, an existing relationship, or an accepted friendship was returned | | 400 | [error response](/http-api/#error-response) | The caller or target is ineligible, target or block policy rejects the request, deployment policy disables the operation, or the [relationship limit](#relationship-limit) is reached | -| 403 | [error response](/http-api/#error-response) | The caller's email address is unverified and the request returns `FRIEND_REQUEST_EMAIL_VERIFICATION_REQUIRED` | +| 403 | [error response](/http-api/#error-response) | The caller's email address is unverified and the request returns `FRIEND_REQUEST_EMAIL_VERIFICATION_REQUIRED`, or the caller is under a new conversation limit and the request returns `NEW_CONVERSATIONS_LIMITED` | | 404 | [error response](/http-api/#error-response) | The caller, the target account, or the pending request being accepted does not exist | ### Side effects diff --git a/packages/constants/src/ApiErrorCodes.ts b/packages/constants/src/ApiErrorCodes.ts index 0eb696a16..463f51281 100644 --- a/packages/constants/src/ApiErrorCodes.ts +++ b/packages/constants/src/ApiErrorCodes.ts @@ -230,6 +230,7 @@ export const APIErrorCodes = { STRIPE_WEBHOOK_SIGNATURE_INVALID: 'STRIPE_WEBHOOK_SIGNATURE_INVALID', STRIPE_WEBHOOK_SIGNATURE_MISSING: 'STRIPE_WEBHOOK_SIGNATURE_MISSING', DIRECT_MESSAGES_DISABLED: 'DIRECT_MESSAGES_DISABLED', + NEW_CONVERSATIONS_LIMITED: 'NEW_CONVERSATIONS_LIMITED', DONATION_AMOUNT_INVALID: 'DONATION_AMOUNT_INVALID', DONATION_MAGIC_LINK_EXPIRED: 'DONATION_MAGIC_LINK_EXPIRED', DONATION_MAGIC_LINK_INVALID: 'DONATION_MAGIC_LINK_INVALID', diff --git a/packages/errors/src/domains/user/NewConversationsLimitedError.ts b/packages/errors/src/domains/user/NewConversationsLimitedError.ts new file mode 100644 index 000000000..5f26f0146 --- /dev/null +++ b/packages/errors/src/domains/user/NewConversationsLimitedError.ts @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later + +import {APIErrorCodes} from '@fluxer/constants/src/ApiErrorCodes'; +import {ForbiddenError} from '@fluxer/errors/src/domains/core/ForbiddenError'; + +export class NewConversationsLimitedError extends ForbiddenError { + constructor() { + super({code: APIErrorCodes.NEW_CONVERSATIONS_LIMITED}); + } +} diff --git a/packages/errors/src/i18n/ErrorCodeMappings.ts b/packages/errors/src/i18n/ErrorCodeMappings.ts index b613a9338..d4f9442eb 100644 --- a/packages/errors/src/i18n/ErrorCodeMappings.ts +++ b/packages/errors/src/i18n/ErrorCodeMappings.ts @@ -23,6 +23,7 @@ export const ErrorCodeToI18nKey = { [APIErrorCodes.CHANNEL_HAS_FOLLOWED_CHANNELS]: 'channels_and_guilds.channel_has_followed_channels', [APIErrorCodes.CHANNEL_TYPE_CONVERSION_NOT_SUPPORTED]: 'channels_and_guilds.channel_type_conversion_not_supported', [APIErrorCodes.DIRECT_MESSAGES_DISABLED]: 'friends_and_dms.direct_messages_disabled', + [APIErrorCodes.NEW_CONVERSATIONS_LIMITED]: 'friends_and_dms.new_conversations_limited', [APIErrorCodes.BOTS_CANNOT_CREATE_GUILDS]: 'channels_and_guilds.bots_cannot_create_guilds', [APIErrorCodes.FOLLOW_TARGET_CONTENT_WARNING_REQUIRED]: 'channels_and_guilds.follow_target_content_warning_required', [APIErrorCodes.FOLLOW_TARGET_NOT_AGE_RESTRICTED]: 'channels_and_guilds.follow_target_not_age_restricted', diff --git a/packages/errors/src/i18n/ErrorI18nMessages.ts b/packages/errors/src/i18n/ErrorI18nMessages.ts index 4f3345e42..eb11f2a97 100644 --- a/packages/errors/src/i18n/ErrorI18nMessages.ts +++ b/packages/errors/src/i18n/ErrorI18nMessages.ts @@ -309,6 +309,7 @@ export const ERROR_I18N_MESSAGES = { 'feature_flags.feature_temporarily_disabled': 'This feature is temporarily disabled.', 'friends_and_dms.already_friends': "You're already friends with this user.", 'friends_and_dms.direct_messages_disabled': 'Direct messages and friend requests are disabled on this instance.', + 'friends_and_dms.new_conversations_limited': "You can't start new conversations right now. Please try again later.", 'friends_and_dms.at_least_one_recipient_required': 'At least one recipient is required.', 'friends_and_dms.at_least_one_recipient_required_to_seed_private_channels': 'At least one recipient is required to seed private channels.', diff --git a/packages/errors/src/i18n/locales/ar.ts b/packages/errors/src/i18n/locales/ar.ts index 1da49e3b9..011ac83a2 100644 --- a/packages/errors/src/i18n/locales/ar.ts +++ b/packages/errors/src/i18n/locales/ar.ts @@ -279,6 +279,7 @@ const ERROR_I18N_AR_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "الرسائل المباشرة وطلبات الصداقة معطلة في هذا المثيل.", "friends_and_dms.duplicate_recipients_not_allowed": "لا يُسمح بتكرار المستلمين.", "friends_and_dms.friend_request_blocked": "المستخدم لا يقبل طلبات الصداقة في الوقت الحالي.", + "friends_and_dms.new_conversations_limited": "لا يمكنك بدء محادثات جديدة في الوقت الحالي. حاول مجددًا لاحقًا.", "friends_and_dms.not_friends": "لست صديقًا لهذا المستخدم.", "friends_and_dms.recipient_ids_cannot_be_empty": "لا يمكن أن تكون معرفات المستلمين فارغة.", "friends_and_dms.recipient_ids_must_be_strings": "يجب أن تكون معرفات المستلمين سلاسل نصية.", diff --git a/packages/errors/src/i18n/locales/bg.ts b/packages/errors/src/i18n/locales/bg.ts index 0fefabc79..318492dae 100644 --- a/packages/errors/src/i18n/locales/bg.ts +++ b/packages/errors/src/i18n/locales/bg.ts @@ -279,6 +279,7 @@ const ERROR_I18N_BG_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "Директните съобщения и поканите за приятелство са изключени в тази инстанция.", "friends_and_dms.duplicate_recipients_not_allowed": "Не се допускат повтарящи се получатели.", "friends_and_dms.friend_request_blocked": "Потребителят в момента не приема покани за приятелство.", + "friends_and_dms.new_conversations_limited": "В момента не можеш да започваш нови разговори. Опитай отново по-късно.", "friends_and_dms.not_friends": "Не си приятел с този потребител.", "friends_and_dms.recipient_ids_cannot_be_empty": "ID-тата на получателите не могат да са празни.", "friends_and_dms.recipient_ids_must_be_strings": "ID-тата на получателите трябва да са низове.", diff --git a/packages/errors/src/i18n/locales/cs.ts b/packages/errors/src/i18n/locales/cs.ts index 13a52768a..63643a4b5 100644 --- a/packages/errors/src/i18n/locales/cs.ts +++ b/packages/errors/src/i18n/locales/cs.ts @@ -279,6 +279,7 @@ const ERROR_I18N_CS_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "Přímé zprávy a žádosti o přátelství jsou na této instanci zakázány.", "friends_and_dms.duplicate_recipients_not_allowed": "Duplicitní příjemci nejsou přípustní.", "friends_and_dms.friend_request_blocked": "Uživatel právě teď nepřijímá žádosti o přátelství.", + "friends_and_dms.new_conversations_limited": "Momentálně nemůžete zahajovat nové konverzace. Zkuste to znovu později.", "friends_and_dms.not_friends": "Tohoto uživatele nemáte mezi přáteli.", "friends_and_dms.recipient_ids_cannot_be_empty": "ID příjemců nesmí být prázdná.", "friends_and_dms.recipient_ids_must_be_strings": "ID příjemců musí být řetězce.", diff --git a/packages/errors/src/i18n/locales/da.ts b/packages/errors/src/i18n/locales/da.ts index 6c0d07d37..ed0b24d5e 100644 --- a/packages/errors/src/i18n/locales/da.ts +++ b/packages/errors/src/i18n/locales/da.ts @@ -279,6 +279,7 @@ const ERROR_I18N_DA_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "Direkte beskeder og venneanmodninger er deaktiveret på denne instans.", "friends_and_dms.duplicate_recipients_not_allowed": "Duplikerede modtagere er ikke tilladt.", "friends_and_dms.friend_request_blocked": "Brugeren accepterer ikke venneanmodninger på nuværende tidspunkt.", + "friends_and_dms.new_conversations_limited": "Du kan ikke starte nye samtaler lige nu. Prøv igen senere.", "friends_and_dms.not_friends": "Du er ikke venner med denne bruger.", "friends_and_dms.recipient_ids_cannot_be_empty": "Modtager-ID'er kan ikke være tomme.", "friends_and_dms.recipient_ids_must_be_strings": "Modtager-ID'er skal være strenge.", diff --git a/packages/errors/src/i18n/locales/de.ts b/packages/errors/src/i18n/locales/de.ts index 173cf7149..e267f6dd4 100644 --- a/packages/errors/src/i18n/locales/de.ts +++ b/packages/errors/src/i18n/locales/de.ts @@ -279,6 +279,7 @@ const ERROR_I18N_DE_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "Direktnachrichten und Freundschaftsanfragen sind auf dieser Instanz deaktiviert.", "friends_and_dms.duplicate_recipients_not_allowed": "Doppelte Empfänger sind nicht erlaubt.", "friends_and_dms.friend_request_blocked": "Der Benutzer akzeptiert derzeit keine Freundschaftsanfragen.", + "friends_and_dms.new_conversations_limited": "Du kannst gerade keine neuen Unterhaltungen starten. Versuche es später erneut.", "friends_and_dms.not_friends": "Du bist nicht mit diesem Benutzer befreundet.", "friends_and_dms.recipient_ids_cannot_be_empty": "Empfänger-IDs können nicht leer sein.", "friends_and_dms.recipient_ids_must_be_strings": "Empfänger-IDs müssen Zeichenketten sein.", diff --git a/packages/errors/src/i18n/locales/el.ts b/packages/errors/src/i18n/locales/el.ts index 4d62c85ea..dd13080c2 100644 --- a/packages/errors/src/i18n/locales/el.ts +++ b/packages/errors/src/i18n/locales/el.ts @@ -279,6 +279,7 @@ const ERROR_I18N_EL_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "Τα άμεσα μηνύματα και τα αιτήματα φιλίας είναι απενεργοποιημένα σε αυτήν την εγκατάσταση.", "friends_and_dms.duplicate_recipients_not_allowed": "Δεν επιτρέπονται διπλοί παραλήπτες.", "friends_and_dms.friend_request_blocked": "Αυτός ο χρήστης δεν δέχεται αιτήματα φιλίας αυτή τη στιγμή.", + "friends_and_dms.new_conversations_limited": "Δεν μπορείς να ξεκινήσεις νέες συνομιλίες αυτή τη στιγμή. Δοκίμασε ξανά αργότερα.", "friends_and_dms.not_friends": "Δεν είσαι φίλος με αυτόν τον χρήστη.", "friends_and_dms.recipient_ids_cannot_be_empty": "Τα αναγνωριστικά παραληπτών δεν μπορούν να είναι κενά.", "friends_and_dms.recipient_ids_must_be_strings": "Τα αναγνωριστικά παραληπτών πρέπει να είναι συμβολοσειρές.", diff --git a/packages/errors/src/i18n/locales/en-GB.ts b/packages/errors/src/i18n/locales/en-GB.ts index 44606caa6..a97d47926 100644 --- a/packages/errors/src/i18n/locales/en-GB.ts +++ b/packages/errors/src/i18n/locales/en-GB.ts @@ -279,6 +279,7 @@ const ERROR_I18N_EN_GB_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "Direct messages and friend requests are disabled on this instance.", "friends_and_dms.duplicate_recipients_not_allowed": "Duplicate recipients aren't allowed.", "friends_and_dms.friend_request_blocked": "User does not accept friend requests at this time.", + "friends_and_dms.new_conversations_limited": "You can't start new conversations right now. Please try again later.", "friends_and_dms.not_friends": "You're not friends with this user.", "friends_and_dms.recipient_ids_cannot_be_empty": "Recipient IDs can't be empty.", "friends_and_dms.recipient_ids_must_be_strings": "Recipient IDs must be strings.", diff --git a/packages/errors/src/i18n/locales/es-419.ts b/packages/errors/src/i18n/locales/es-419.ts index e5a25daf5..88e789e16 100644 --- a/packages/errors/src/i18n/locales/es-419.ts +++ b/packages/errors/src/i18n/locales/es-419.ts @@ -279,6 +279,7 @@ const ERROR_I18N_ES_419_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "Los mensajes directos y las solicitudes de amistad están deshabilitados en esta instancia.", "friends_and_dms.duplicate_recipients_not_allowed": "No se permiten destinatarios repetidos.", "friends_and_dms.friend_request_blocked": "El usuario no acepta solicitudes de amistad ahora mismo.", + "friends_and_dms.new_conversations_limited": "No puedes iniciar nuevas conversaciones en este momento. Inténtalo de nuevo más tarde.", "friends_and_dms.not_friends": "No tienes a este usuario como amigo.", "friends_and_dms.recipient_ids_cannot_be_empty": "Los ID de destinatario no pueden estar vacíos.", "friends_and_dms.recipient_ids_must_be_strings": "Los ID de destinatario deben ser cadenas.", diff --git a/packages/errors/src/i18n/locales/es-ES.ts b/packages/errors/src/i18n/locales/es-ES.ts index e68e0ecbf..fbe44ab47 100644 --- a/packages/errors/src/i18n/locales/es-ES.ts +++ b/packages/errors/src/i18n/locales/es-ES.ts @@ -279,6 +279,7 @@ const ERROR_I18N_ES_ES_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "Los mensajes directos y las solicitudes de amistad están deshabilitados en esta instancia.", "friends_and_dms.duplicate_recipients_not_allowed": "No se admiten destinatarios duplicados.", "friends_and_dms.friend_request_blocked": "El usuario no acepta solicitudes de amistad ahora mismo.", + "friends_and_dms.new_conversations_limited": "No puedes iniciar conversaciones nuevas ahora mismo. Inténtalo de nuevo más tarde.", "friends_and_dms.not_friends": "No eres amigo de este usuario.", "friends_and_dms.recipient_ids_cannot_be_empty": "Los ID de destinatario no pueden ir vacíos.", "friends_and_dms.recipient_ids_must_be_strings": "Los ID de destinatario deben ser cadenas.", diff --git a/packages/errors/src/i18n/locales/fi.ts b/packages/errors/src/i18n/locales/fi.ts index ee1145d99..5700a5abd 100644 --- a/packages/errors/src/i18n/locales/fi.ts +++ b/packages/errors/src/i18n/locales/fi.ts @@ -279,6 +279,7 @@ const ERROR_I18N_FI_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "Suorat viestit ja kaveripyynnöt on poistettu käytöstä tässä instanssissa.", "friends_and_dms.duplicate_recipients_not_allowed": "Samaa vastaanottajaa ei saa lisätä useasti.", "friends_and_dms.friend_request_blocked": "Käyttäjä ei hyväksy kaveripyyntöjä tällä hetkellä.", + "friends_and_dms.new_conversations_limited": "Et voi aloittaa uusia keskusteluja juuri nyt. Yritä uudelleen myöhemmin.", "friends_and_dms.not_friends": "Et ole tämän käyttäjän kaveri.", "friends_and_dms.recipient_ids_cannot_be_empty": "Vastaanottajien tunnukset eivät voi olla tyhjiä.", "friends_and_dms.recipient_ids_must_be_strings": "Vastaanottajien tunnusten on oltava merkkijonoja.", diff --git a/packages/errors/src/i18n/locales/fr.ts b/packages/errors/src/i18n/locales/fr.ts index 35f5bb378..97774850b 100644 --- a/packages/errors/src/i18n/locales/fr.ts +++ b/packages/errors/src/i18n/locales/fr.ts @@ -279,6 +279,7 @@ const ERROR_I18N_FR_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "Les messages privés et les demandes d'ami sont désactivés sur cette instance.", "friends_and_dms.duplicate_recipients_not_allowed": "Les destinataires en double ne sont pas autorisés.", "friends_and_dms.friend_request_blocked": "L'utilisateur n'accepte pas les demandes d'ami pour le moment.", + "friends_and_dms.new_conversations_limited": "Vous ne pouvez pas démarrer de nouvelles conversations pour le moment. Réessayez plus tard.", "friends_and_dms.not_friends": "Cet utilisateur ne figure pas dans votre liste d’amis.", "friends_and_dms.recipient_ids_cannot_be_empty": "Les identifiants de destinataire ne peuvent pas être vides.", "friends_and_dms.recipient_ids_must_be_strings": "Les identifiants de destinataire doivent être des chaînes de caractères.", diff --git a/packages/errors/src/i18n/locales/he.ts b/packages/errors/src/i18n/locales/he.ts index 610d128d1..7aca2fc4f 100644 --- a/packages/errors/src/i18n/locales/he.ts +++ b/packages/errors/src/i18n/locales/he.ts @@ -279,6 +279,7 @@ const ERROR_I18N_HE_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "הודעות פרטיות ובקשות חברות מושבתות במופע זה.", "friends_and_dms.duplicate_recipients_not_allowed": "נמענים כפולים אינם מותרים.", "friends_and_dms.friend_request_blocked": "משתמש זה אינו מקבל בקשות חברות כרגע.", + "friends_and_dms.new_conversations_limited": "לא ניתן להתחיל שיחות חדשות כרגע. ניתן לנסות שוב מאוחר יותר.", "friends_and_dms.not_friends": "אתם לא חברים עם המשתמש הזה.", "friends_and_dms.recipient_ids_cannot_be_empty": "מזהי נמענים אינם יכולים להיות ריקים.", "friends_and_dms.recipient_ids_must_be_strings": "מזהי נמענים חייבים להיות מחרוזות.", diff --git a/packages/errors/src/i18n/locales/hi.ts b/packages/errors/src/i18n/locales/hi.ts index 48fcbad7e..41d0cbc1c 100644 --- a/packages/errors/src/i18n/locales/hi.ts +++ b/packages/errors/src/i18n/locales/hi.ts @@ -279,6 +279,7 @@ const ERROR_I18N_HI_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "इस इंस्टेंस पर डायरेक्ट मैसेज और फ्रेंड रिक्वेस्ट डिसेबल हैं।", "friends_and_dms.duplicate_recipients_not_allowed": "डुप्लीकेट रिसीपिएंट की अनुमति नहीं है।", "friends_and_dms.friend_request_blocked": "यूज़र इस समय फ्रेंड रिक्वेस्ट स्वीकार नहीं कर रहा है।", + "friends_and_dms.new_conversations_limited": "आप अभी नई बातचीत शुरू नहीं कर सकते हैं। कृपया बाद में फिर से कोशिश करें।", "friends_and_dms.not_friends": "आप इस यूज़र के दोस्त नहीं हैं।", "friends_and_dms.recipient_ids_cannot_be_empty": "रिसीपिएंट IDs खाली नहीं होनी चाहिए।", "friends_and_dms.recipient_ids_must_be_strings": "रिसीपिएंट IDs स्ट्रिंग होनी चाहिए।", diff --git a/packages/errors/src/i18n/locales/hr.ts b/packages/errors/src/i18n/locales/hr.ts index b7077ec81..972e4d078 100644 --- a/packages/errors/src/i18n/locales/hr.ts +++ b/packages/errors/src/i18n/locales/hr.ts @@ -279,6 +279,7 @@ const ERROR_I18N_HR_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "Izravne poruke i zahtjevi za prijateljstvo onemogućeni su na ovoj instanci.", "friends_and_dms.duplicate_recipients_not_allowed": "Duplicirani primatelji nisu dopušteni.", "friends_and_dms.friend_request_blocked": "Korisnik trenutno ne prihvaća zahtjeve za prijateljstvo.", + "friends_and_dms.new_conversations_limited": "Trenutačno ne možeš započeti nove razgovore. Pokušaj ponovno kasnije.", "friends_and_dms.not_friends": "Nisi prijatelj s ovim korisnikom.", "friends_and_dms.recipient_ids_cannot_be_empty": "ID-ovi primatelja ne mogu biti prazni.", "friends_and_dms.recipient_ids_must_be_strings": "ID-ovi primatelja moraju biti nizovi znakova.", diff --git a/packages/errors/src/i18n/locales/hu.ts b/packages/errors/src/i18n/locales/hu.ts index 62afcf4a8..713dc77c4 100644 --- a/packages/errors/src/i18n/locales/hu.ts +++ b/packages/errors/src/i18n/locales/hu.ts @@ -279,6 +279,7 @@ const ERROR_I18N_HU_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "A közvetlen üzenetek és az ismerősjelölések le vannak tiltva ezen a példányon.", "friends_and_dms.duplicate_recipients_not_allowed": "Ugyanaz a címzett nem szerepelhet többször.", "friends_and_dms.friend_request_blocked": "A felhasználó jelenleg nem fogad ismerősjelölést.", + "friends_and_dms.new_conversations_limited": "Jelenleg nem kezdhetsz új beszélgetést. Próbáld újra később.", "friends_and_dms.not_friends": "Nem vagytok ismerősök ezzel a felhasználóval.", "friends_and_dms.recipient_ids_cannot_be_empty": "A címzettazonosítók nem lehetnek üresek.", "friends_and_dms.recipient_ids_must_be_strings": "A címzettazonosítóknak karakterláncoknak kell lenniük.", diff --git a/packages/errors/src/i18n/locales/id.ts b/packages/errors/src/i18n/locales/id.ts index c6cf9514a..e60799e86 100644 --- a/packages/errors/src/i18n/locales/id.ts +++ b/packages/errors/src/i18n/locales/id.ts @@ -279,6 +279,7 @@ const ERROR_I18N_ID_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "DM dan permintaan pertemanan dinonaktifkan di instance ini.", "friends_and_dms.duplicate_recipients_not_allowed": "Penerima ganda tidak diizinkan.", "friends_and_dms.friend_request_blocked": "Pengguna ini tidak menerima permintaan pertemanan saat ini.", + "friends_and_dms.new_conversations_limited": "Kamu tidak dapat memulai percakapan baru saat ini. Coba lagi nanti.", "friends_and_dms.not_friends": "Kamu tidak berteman dengan pengguna ini.", "friends_and_dms.recipient_ids_cannot_be_empty": "ID penerima tidak boleh kosong.", "friends_and_dms.recipient_ids_must_be_strings": "ID penerima harus string.", diff --git a/packages/errors/src/i18n/locales/it.ts b/packages/errors/src/i18n/locales/it.ts index 92ed6fc44..9b2108b2f 100644 --- a/packages/errors/src/i18n/locales/it.ts +++ b/packages/errors/src/i18n/locales/it.ts @@ -279,6 +279,7 @@ const ERROR_I18N_IT_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "I messaggi diretti e le richieste di amicizia sono disabilitati su questa istanza.", "friends_and_dms.duplicate_recipients_not_allowed": "Non sono consentiti destinatari duplicati.", "friends_and_dms.friend_request_blocked": "Questo utente non accetta richieste di amicizia in questo momento.", + "friends_and_dms.new_conversations_limited": "Al momento non puoi iniziare nuove conversazioni. Riprova più tardi.", "friends_and_dms.not_friends": "Non sei amico di questo utente.", "friends_and_dms.recipient_ids_cannot_be_empty": "Gli ID dei destinatari non possono essere vuoti.", "friends_and_dms.recipient_ids_must_be_strings": "Gli ID dei destinatari devono essere stringhe.", diff --git a/packages/errors/src/i18n/locales/ja.ts b/packages/errors/src/i18n/locales/ja.ts index cf03fe671..ba62a2188 100644 --- a/packages/errors/src/i18n/locales/ja.ts +++ b/packages/errors/src/i18n/locales/ja.ts @@ -279,6 +279,7 @@ const ERROR_I18N_JA_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "このインスタンスでは、ダイレクトメッセージと友だち申請は無効になっています。", "friends_and_dms.duplicate_recipients_not_allowed": "重複する受信者は許可されていません。", "friends_and_dms.friend_request_blocked": "このユーザーは現在、友だち申請を受け付けていません。", + "friends_and_dms.new_conversations_limited": "現在、新しい会話を開始することはできません。後でもう一度お試しください。", "friends_and_dms.not_friends": "このユーザーとは友だちではありません。", "friends_and_dms.recipient_ids_cannot_be_empty": "受信者IDを空にすることはできません。", "friends_and_dms.recipient_ids_must_be_strings": "受信者IDは文字列である必要があります。", diff --git a/packages/errors/src/i18n/locales/ko.ts b/packages/errors/src/i18n/locales/ko.ts index a1cb2e2bc..8317e201f 100644 --- a/packages/errors/src/i18n/locales/ko.ts +++ b/packages/errors/src/i18n/locales/ko.ts @@ -279,6 +279,7 @@ const ERROR_I18N_KO_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "이 인스턴스에서는 DM과 친구 요청이 비활성화되어 있어요.", "friends_and_dms.duplicate_recipients_not_allowed": "중복된 수신자는 추가할 수 없어요.", "friends_and_dms.friend_request_blocked": "이 사용자는 현재 친구 요청을 수락하지 않아요.", + "friends_and_dms.new_conversations_limited": "지금은 새 대화를 시작할 수 없어요. 나중에 다시 시도해 주세요.", "friends_and_dms.not_friends": "이 사용자와 친구가 아니에요.", "friends_and_dms.recipient_ids_cannot_be_empty": "수신자 ID는 비워둘 수 없어요.", "friends_and_dms.recipient_ids_must_be_strings": "수신자 ID는 문자열이어야 해요.", diff --git a/packages/errors/src/i18n/locales/lt.ts b/packages/errors/src/i18n/locales/lt.ts index de6806c5f..bacc68e1c 100644 --- a/packages/errors/src/i18n/locales/lt.ts +++ b/packages/errors/src/i18n/locales/lt.ts @@ -279,6 +279,7 @@ const ERROR_I18N_LT_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "Asmeninės žinutės ir draugystės užklausos šioje instancijoje išjungtos.", "friends_and_dms.duplicate_recipients_not_allowed": "Pasikartojantys gavėjai neleidžiami.", "friends_and_dms.friend_request_blocked": "Naudotojas šiuo metu nepriima draugystės užklausų.", + "friends_and_dms.new_conversations_limited": "Šiuo metu negali pradėti naujų pokalbių. Pabandyk dar kartą vėliau.", "friends_and_dms.not_friends": "Su šiuo naudotoju nedraugauji.", "friends_and_dms.recipient_ids_cannot_be_empty": "Gavėjų ID negali būti palikti tušti.", "friends_and_dms.recipient_ids_must_be_strings": "Gavėjų ID turi būti eilutės.", diff --git a/packages/errors/src/i18n/locales/nl.ts b/packages/errors/src/i18n/locales/nl.ts index d720e5356..8301860d4 100644 --- a/packages/errors/src/i18n/locales/nl.ts +++ b/packages/errors/src/i18n/locales/nl.ts @@ -279,6 +279,7 @@ const ERROR_I18N_NL_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "Directe berichten en vriendschapsverzoeken zijn uitgeschakeld op deze instantie.", "friends_and_dms.duplicate_recipients_not_allowed": "Dubbele ontvangers zijn niet toegestaan.", "friends_and_dms.friend_request_blocked": "Gebruiker accepteert op dit moment geen vriendschapsverzoeken.", + "friends_and_dms.new_conversations_limited": "Je kunt op dit moment geen nieuwe gesprekken starten. Probeer het later opnieuw.", "friends_and_dms.not_friends": "Je bent niet bevriend met deze gebruiker.", "friends_and_dms.recipient_ids_cannot_be_empty": "Ontvanger-ID's kunnen niet leeg zijn.", "friends_and_dms.recipient_ids_must_be_strings": "Ontvanger-ID's moeten tekstreeksen zijn.", diff --git a/packages/errors/src/i18n/locales/no.ts b/packages/errors/src/i18n/locales/no.ts index e01d9ecb6..074d3353f 100644 --- a/packages/errors/src/i18n/locales/no.ts +++ b/packages/errors/src/i18n/locales/no.ts @@ -279,6 +279,7 @@ const ERROR_I18N_NO_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "Direktemeldinger og venneforespørsler er deaktivert på denne instansen.", "friends_and_dms.duplicate_recipients_not_allowed": "Dupliserte mottakere er ikke tillatt.", "friends_and_dms.friend_request_blocked": "Brukeren godtar ikke venneforespørsler akkurat nå.", + "friends_and_dms.new_conversations_limited": "Du kan ikke starte nye samtaler akkurat nå. Prøv igjen senere.", "friends_and_dms.not_friends": "Du er ikke venn med denne brukeren.", "friends_and_dms.recipient_ids_cannot_be_empty": "Mottaker-ID-er kan ikke være tomme.", "friends_and_dms.recipient_ids_must_be_strings": "Mottaker-ID-er må være strenger.", diff --git a/packages/errors/src/i18n/locales/pl.ts b/packages/errors/src/i18n/locales/pl.ts index 049221de2..234c3b2df 100644 --- a/packages/errors/src/i18n/locales/pl.ts +++ b/packages/errors/src/i18n/locales/pl.ts @@ -279,6 +279,7 @@ const ERROR_I18N_PL_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "Wiadomości prywatne i zaproszenia do znajomych są wyłączone w tej instancji.", "friends_and_dms.duplicate_recipients_not_allowed": "Duplikowanie odbiorców jest niedozwolone.", "friends_and_dms.friend_request_blocked": "Użytkownik nie akceptuje obecnie zaproszeń do znajomych.", + "friends_and_dms.new_conversations_limited": "Nie możesz teraz rozpoczynać nowych rozmów. Spróbuj ponownie później.", "friends_and_dms.not_friends": "Ten użytkownik nie jest na Twojej liście znajomych.", "friends_and_dms.recipient_ids_cannot_be_empty": "ID odbiorców nie mogą być puste.", "friends_and_dms.recipient_ids_must_be_strings": "ID odbiorców muszą być ciągami znaków.", diff --git a/packages/errors/src/i18n/locales/pt-BR.ts b/packages/errors/src/i18n/locales/pt-BR.ts index de7c20b39..e37cb5381 100644 --- a/packages/errors/src/i18n/locales/pt-BR.ts +++ b/packages/errors/src/i18n/locales/pt-BR.ts @@ -279,6 +279,7 @@ const ERROR_I18N_PT_BR_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "As mensagens diretas e os pedidos de amizade estão desativados nesta instância.", "friends_and_dms.duplicate_recipients_not_allowed": "Destinatários duplicados não são permitidos.", "friends_and_dms.friend_request_blocked": "O usuário não está aceitando pedidos de amizade agora.", + "friends_and_dms.new_conversations_limited": "Você não pode iniciar novas conversas agora. Tente novamente mais tarde.", "friends_and_dms.not_friends": "Você e este usuário não são amigos.", "friends_and_dms.recipient_ids_cannot_be_empty": "Os IDs dos destinatários não podem estar vazios.", "friends_and_dms.recipient_ids_must_be_strings": "Os IDs dos destinatários devem ser strings.", diff --git a/packages/errors/src/i18n/locales/ro.ts b/packages/errors/src/i18n/locales/ro.ts index 607a50169..77051dd00 100644 --- a/packages/errors/src/i18n/locales/ro.ts +++ b/packages/errors/src/i18n/locales/ro.ts @@ -279,6 +279,7 @@ const ERROR_I18N_RO_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "Mesajele directe și cererile de prietenie sunt dezactivate pe această instanță.", "friends_and_dms.duplicate_recipients_not_allowed": "Nu sunt permiși destinatari duplicați.", "friends_and_dms.friend_request_blocked": "Utilizatorul nu acceptă cereri de prietenie în acest moment.", + "friends_and_dms.new_conversations_limited": "Nu poți începe conversații noi acum. Încearcă din nou mai târziu.", "friends_and_dms.not_friends": "Nu ești prieten cu acest utilizator.", "friends_and_dms.recipient_ids_cannot_be_empty": "ID-urile destinatarilor nu pot fi goale.", "friends_and_dms.recipient_ids_must_be_strings": "ID-urile destinatarilor trebuie să fie șiruri.", diff --git a/packages/errors/src/i18n/locales/ru.ts b/packages/errors/src/i18n/locales/ru.ts index ab6eba086..125e01a42 100644 --- a/packages/errors/src/i18n/locales/ru.ts +++ b/packages/errors/src/i18n/locales/ru.ts @@ -279,6 +279,7 @@ const ERROR_I18N_RU_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "Личные сообщения и запросы в друзья отключены на этом экземпляре.", "friends_and_dms.duplicate_recipients_not_allowed": "Повторяющиеся получатели запрещены.", "friends_and_dms.friend_request_blocked": "Пользователь временно не принимает запросы в друзья.", + "friends_and_dms.new_conversations_limited": "Сейчас ты не можешь начинать новые чаты. Попробуй ещё раз позже.", "friends_and_dms.not_friends": "Ты не дружишь с этим пользователем.", "friends_and_dms.recipient_ids_cannot_be_empty": "ID получателей не могут быть пустыми.", "friends_and_dms.recipient_ids_must_be_strings": "ID получателей должны быть строками.", diff --git a/packages/errors/src/i18n/locales/sv-SE.ts b/packages/errors/src/i18n/locales/sv-SE.ts index b83aba912..0c20cdfd4 100644 --- a/packages/errors/src/i18n/locales/sv-SE.ts +++ b/packages/errors/src/i18n/locales/sv-SE.ts @@ -279,6 +279,7 @@ const ERROR_I18N_SV_SE_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "Direktmeddelanden och vänförfrågningar är inaktiverade på den här instansen.", "friends_and_dms.duplicate_recipients_not_allowed": "Dubbletter av mottagare är inte tillåtna.", "friends_and_dms.friend_request_blocked": "Användaren accepterar inte vänförfrågningar just nu.", + "friends_and_dms.new_conversations_limited": "Du kan inte starta nya konversationer just nu. Försök igen senare.", "friends_and_dms.not_friends": "Du är inte vän med den här användaren.", "friends_and_dms.recipient_ids_cannot_be_empty": "Mottagar-ID:n får inte vara tomma.", "friends_and_dms.recipient_ids_must_be_strings": "Mottagar-ID:n måste vara strängar.", diff --git a/packages/errors/src/i18n/locales/th.ts b/packages/errors/src/i18n/locales/th.ts index c5d976d7c..11fd0f900 100644 --- a/packages/errors/src/i18n/locales/th.ts +++ b/packages/errors/src/i18n/locales/th.ts @@ -279,6 +279,7 @@ const ERROR_I18N_TH_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "ข้อความส่วนตัวและคำขอเป็นเพื่อนถูกปิดใช้งานบนอินสแตนซ์นี้", "friends_and_dms.duplicate_recipients_not_allowed": "ไม่อนุญาตให้มีผู้รับซ้ำกัน", "friends_and_dms.friend_request_blocked": "ผู้ใช้ไม่รับคำขอเป็นเพื่อนในขณะนี้", + "friends_and_dms.new_conversations_limited": "ไม่สามารถเริ่มการสนทนาใหม่ได้ในขณะนี้ โปรดลองอีกครั้งในภายหลัง", "friends_and_dms.not_friends": "คุณไม่ได้เป็นเพื่อนกับผู้ใช้นี้", "friends_and_dms.recipient_ids_cannot_be_empty": "ID ผู้รับไม่สามารถเป็นค่าว่างได้", "friends_and_dms.recipient_ids_must_be_strings": "ID ผู้รับต้องเป็นสตริง", diff --git a/packages/errors/src/i18n/locales/tr.ts b/packages/errors/src/i18n/locales/tr.ts index 824437460..78a0a3b8c 100644 --- a/packages/errors/src/i18n/locales/tr.ts +++ b/packages/errors/src/i18n/locales/tr.ts @@ -279,6 +279,7 @@ const ERROR_I18N_TR_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "Bu kurulumda DM'ler ve arkadaşlık istekleri devre dışı.", "friends_and_dms.duplicate_recipients_not_allowed": "Yinelenen alıcılara izin verilmez.", "friends_and_dms.friend_request_blocked": "Kullanıcı şu anda arkadaşlık isteklerini kabul etmiyor.", + "friends_and_dms.new_conversations_limited": "Şu anda yeni sohbet başlatamazsın. Lütfen daha sonra tekrar dene.", "friends_and_dms.not_friends": "Bu kullanıcıyla arkadaş değilsin.", "friends_and_dms.recipient_ids_cannot_be_empty": "Alıcı kimlikleri boş olamaz.", "friends_and_dms.recipient_ids_must_be_strings": "Alıcı kimlikleri dize olmalı.", diff --git a/packages/errors/src/i18n/locales/uk.ts b/packages/errors/src/i18n/locales/uk.ts index d9a3a8aa4..1a9ccef91 100644 --- a/packages/errors/src/i18n/locales/uk.ts +++ b/packages/errors/src/i18n/locales/uk.ts @@ -279,6 +279,7 @@ const ERROR_I18N_UK_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "Особисті повідомлення та запити в друзі вимкнено на цьому екземплярі.", "friends_and_dms.duplicate_recipients_not_allowed": "Одержувачі не можуть повторюватися.", "friends_and_dms.friend_request_blocked": "Користувач наразі не приймає запити в друзі.", + "friends_and_dms.new_conversations_limited": "Зараз ти не можеш починати нові чати. Спробуй пізніше.", "friends_and_dms.not_friends": "Ти не дружиш з цим користувачем.", "friends_and_dms.recipient_ids_cannot_be_empty": "Ідентифікатори одержувачів не можуть бути порожніми.", "friends_and_dms.recipient_ids_must_be_strings": "Ідентифікатори одержувачів мають бути рядками.", diff --git a/packages/errors/src/i18n/locales/vi.ts b/packages/errors/src/i18n/locales/vi.ts index 86f8042aa..dbae19514 100644 --- a/packages/errors/src/i18n/locales/vi.ts +++ b/packages/errors/src/i18n/locales/vi.ts @@ -279,6 +279,7 @@ const ERROR_I18N_VI_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "Tin nhắn trực tiếp và lời mời kết bạn đã bị tắt trên phiên bản này.", "friends_and_dms.duplicate_recipients_not_allowed": "Không được có người nhận trùng lặp.", "friends_and_dms.friend_request_blocked": "Người dùng này hiện không nhận lời mời kết bạn.", + "friends_and_dms.new_conversations_limited": "Hiện bạn không thể bắt đầu cuộc trò chuyện mới. Vui lòng thử lại sau.", "friends_and_dms.not_friends": "Bạn không phải là bạn bè với người dùng này.", "friends_and_dms.recipient_ids_cannot_be_empty": "ID của người nhận không được để trống.", "friends_and_dms.recipient_ids_must_be_strings": "ID của người nhận phải là chuỗi.", diff --git a/packages/errors/src/i18n/locales/zh-CN.ts b/packages/errors/src/i18n/locales/zh-CN.ts index 8d2a8ffd0..e16d17a18 100644 --- a/packages/errors/src/i18n/locales/zh-CN.ts +++ b/packages/errors/src/i18n/locales/zh-CN.ts @@ -279,6 +279,7 @@ const ERROR_I18N_ZH_CN_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "此实例已禁用私信和好友请求。", "friends_and_dms.duplicate_recipients_not_allowed": "不允许重复添加接收者。", "friends_and_dms.friend_request_blocked": "该用户当前不接受好友请求。", + "friends_and_dms.new_conversations_limited": "你目前无法发起新的对话。请稍后重试。", "friends_and_dms.not_friends": "你与该用户还不是好友。", "friends_and_dms.recipient_ids_cannot_be_empty": "接收者 ID 不得为空。", "friends_and_dms.recipient_ids_must_be_strings": "接收者 ID 必须为字符串类型。", diff --git a/packages/errors/src/i18n/locales/zh-TW.ts b/packages/errors/src/i18n/locales/zh-TW.ts index 51dd8c3ae..80b15a168 100644 --- a/packages/errors/src/i18n/locales/zh-TW.ts +++ b/packages/errors/src/i18n/locales/zh-TW.ts @@ -279,6 +279,7 @@ const ERROR_I18N_ZH_TW_MESSAGES = defineErrorI18nLocaleMessages({ "friends_and_dms.direct_messages_disabled": "此實例已停用私訊和好友邀請。", "friends_and_dms.duplicate_recipients_not_allowed": "不允許重複成員。", "friends_and_dms.friend_request_blocked": "此使用者目前不接受好友邀請。", + "friends_and_dms.new_conversations_limited": "你目前無法開始新的對話。請稍後再試。", "friends_and_dms.not_friends": "你不是此使用者的好友。", "friends_and_dms.recipient_ids_cannot_be_empty": "成員 ID 不能為空。", "friends_and_dms.recipient_ids_must_be_strings": "成員 ID 必須是字串。", diff --git a/packages/errors/src/i18n/weblate/locales/ar.json b/packages/errors/src/i18n/weblate/locales/ar.json index 4dd956f48..1b6b41c85 100644 --- a/packages/errors/src/i18n/weblate/locales/ar.json +++ b/packages/errors/src/i18n/weblate/locales/ar.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "الرسائل المباشرة وطلبات الصداقة معطلة في هذا المثيل.", "friends_and_dms.duplicate_recipients_not_allowed": "لا يُسمح بتكرار المستلمين.", "friends_and_dms.friend_request_blocked": "المستخدم لا يقبل طلبات الصداقة في الوقت الحالي.", + "friends_and_dms.new_conversations_limited": "لا يمكنك بدء محادثات جديدة في الوقت الحالي. حاول مجددًا لاحقًا.", "friends_and_dms.not_friends": "لست صديقًا لهذا المستخدم.", "friends_and_dms.recipient_ids_cannot_be_empty": "لا يمكن أن تكون معرفات المستلمين فارغة.", "friends_and_dms.recipient_ids_must_be_strings": "يجب أن تكون معرفات المستلمين سلاسل نصية.", diff --git a/packages/errors/src/i18n/weblate/locales/bg.json b/packages/errors/src/i18n/weblate/locales/bg.json index 77083eecd..2f2109dbf 100644 --- a/packages/errors/src/i18n/weblate/locales/bg.json +++ b/packages/errors/src/i18n/weblate/locales/bg.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "Директните съобщения и поканите за приятелство са изключени в тази инстанция.", "friends_and_dms.duplicate_recipients_not_allowed": "Не се допускат повтарящи се получатели.", "friends_and_dms.friend_request_blocked": "Потребителят в момента не приема покани за приятелство.", + "friends_and_dms.new_conversations_limited": "В момента не можеш да започваш нови разговори. Опитай отново по-късно.", "friends_and_dms.not_friends": "Не си приятел с този потребител.", "friends_and_dms.recipient_ids_cannot_be_empty": "ID-тата на получателите не могат да са празни.", "friends_and_dms.recipient_ids_must_be_strings": "ID-тата на получателите трябва да са низове.", diff --git a/packages/errors/src/i18n/weblate/locales/cs.json b/packages/errors/src/i18n/weblate/locales/cs.json index a542bbdd2..695d63de2 100644 --- a/packages/errors/src/i18n/weblate/locales/cs.json +++ b/packages/errors/src/i18n/weblate/locales/cs.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "Přímé zprávy a žádosti o přátelství jsou na této instanci zakázány.", "friends_and_dms.duplicate_recipients_not_allowed": "Duplicitní příjemci nejsou přípustní.", "friends_and_dms.friend_request_blocked": "Uživatel právě teď nepřijímá žádosti o přátelství.", + "friends_and_dms.new_conversations_limited": "Momentálně nemůžete zahajovat nové konverzace. Zkuste to znovu později.", "friends_and_dms.not_friends": "Tohoto uživatele nemáte mezi přáteli.", "friends_and_dms.recipient_ids_cannot_be_empty": "ID příjemců nesmí být prázdná.", "friends_and_dms.recipient_ids_must_be_strings": "ID příjemců musí být řetězce.", diff --git a/packages/errors/src/i18n/weblate/locales/da.json b/packages/errors/src/i18n/weblate/locales/da.json index d840ec8d2..855a9232a 100644 --- a/packages/errors/src/i18n/weblate/locales/da.json +++ b/packages/errors/src/i18n/weblate/locales/da.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "Direkte beskeder og venneanmodninger er deaktiveret på denne instans.", "friends_and_dms.duplicate_recipients_not_allowed": "Duplikerede modtagere er ikke tilladt.", "friends_and_dms.friend_request_blocked": "Brugeren accepterer ikke venneanmodninger på nuværende tidspunkt.", + "friends_and_dms.new_conversations_limited": "Du kan ikke starte nye samtaler lige nu. Prøv igen senere.", "friends_and_dms.not_friends": "Du er ikke venner med denne bruger.", "friends_and_dms.recipient_ids_cannot_be_empty": "Modtager-ID'er kan ikke være tomme.", "friends_and_dms.recipient_ids_must_be_strings": "Modtager-ID'er skal være strenge.", diff --git a/packages/errors/src/i18n/weblate/locales/de.json b/packages/errors/src/i18n/weblate/locales/de.json index c09ea9b0c..69f495c00 100644 --- a/packages/errors/src/i18n/weblate/locales/de.json +++ b/packages/errors/src/i18n/weblate/locales/de.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "Direktnachrichten und Freundschaftsanfragen sind auf dieser Instanz deaktiviert.", "friends_and_dms.duplicate_recipients_not_allowed": "Doppelte Empfänger sind nicht erlaubt.", "friends_and_dms.friend_request_blocked": "Der Benutzer akzeptiert derzeit keine Freundschaftsanfragen.", + "friends_and_dms.new_conversations_limited": "Du kannst gerade keine neuen Unterhaltungen starten. Versuche es später erneut.", "friends_and_dms.not_friends": "Du bist nicht mit diesem Benutzer befreundet.", "friends_and_dms.recipient_ids_cannot_be_empty": "Empfänger-IDs können nicht leer sein.", "friends_and_dms.recipient_ids_must_be_strings": "Empfänger-IDs müssen Zeichenketten sein.", diff --git a/packages/errors/src/i18n/weblate/locales/el.json b/packages/errors/src/i18n/weblate/locales/el.json index a2bd18dd4..a6d21afef 100644 --- a/packages/errors/src/i18n/weblate/locales/el.json +++ b/packages/errors/src/i18n/weblate/locales/el.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "Τα άμεσα μηνύματα και τα αιτήματα φιλίας είναι απενεργοποιημένα σε αυτήν την εγκατάσταση.", "friends_and_dms.duplicate_recipients_not_allowed": "Δεν επιτρέπονται διπλοί παραλήπτες.", "friends_and_dms.friend_request_blocked": "Αυτός ο χρήστης δεν δέχεται αιτήματα φιλίας αυτή τη στιγμή.", + "friends_and_dms.new_conversations_limited": "Δεν μπορείς να ξεκινήσεις νέες συνομιλίες αυτή τη στιγμή. Δοκίμασε ξανά αργότερα.", "friends_and_dms.not_friends": "Δεν είσαι φίλος με αυτόν τον χρήστη.", "friends_and_dms.recipient_ids_cannot_be_empty": "Τα αναγνωριστικά παραληπτών δεν μπορούν να είναι κενά.", "friends_and_dms.recipient_ids_must_be_strings": "Τα αναγνωριστικά παραληπτών πρέπει να είναι συμβολοσειρές.", diff --git a/packages/errors/src/i18n/weblate/locales/en-GB.json b/packages/errors/src/i18n/weblate/locales/en-GB.json index 68443a3ae..dec2d9302 100644 --- a/packages/errors/src/i18n/weblate/locales/en-GB.json +++ b/packages/errors/src/i18n/weblate/locales/en-GB.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "Direct messages and friend requests are disabled on this instance.", "friends_and_dms.duplicate_recipients_not_allowed": "Duplicate recipients aren't allowed.", "friends_and_dms.friend_request_blocked": "User does not accept friend requests at this time.", + "friends_and_dms.new_conversations_limited": "You can't start new conversations right now. Please try again later.", "friends_and_dms.not_friends": "You're not friends with this user.", "friends_and_dms.recipient_ids_cannot_be_empty": "Recipient IDs can't be empty.", "friends_and_dms.recipient_ids_must_be_strings": "Recipient IDs must be strings.", diff --git a/packages/errors/src/i18n/weblate/locales/es-419.json b/packages/errors/src/i18n/weblate/locales/es-419.json index 9746a95af..0964fd59c 100644 --- a/packages/errors/src/i18n/weblate/locales/es-419.json +++ b/packages/errors/src/i18n/weblate/locales/es-419.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "Los mensajes directos y las solicitudes de amistad están deshabilitados en esta instancia.", "friends_and_dms.duplicate_recipients_not_allowed": "No se permiten destinatarios repetidos.", "friends_and_dms.friend_request_blocked": "El usuario no acepta solicitudes de amistad ahora mismo.", + "friends_and_dms.new_conversations_limited": "No puedes iniciar nuevas conversaciones en este momento. Inténtalo de nuevo más tarde.", "friends_and_dms.not_friends": "No tienes a este usuario como amigo.", "friends_and_dms.recipient_ids_cannot_be_empty": "Los ID de destinatario no pueden estar vacíos.", "friends_and_dms.recipient_ids_must_be_strings": "Los ID de destinatario deben ser cadenas.", diff --git a/packages/errors/src/i18n/weblate/locales/es-ES.json b/packages/errors/src/i18n/weblate/locales/es-ES.json index 10a77b657..d7e549c15 100644 --- a/packages/errors/src/i18n/weblate/locales/es-ES.json +++ b/packages/errors/src/i18n/weblate/locales/es-ES.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "Los mensajes directos y las solicitudes de amistad están deshabilitados en esta instancia.", "friends_and_dms.duplicate_recipients_not_allowed": "No se admiten destinatarios duplicados.", "friends_and_dms.friend_request_blocked": "El usuario no acepta solicitudes de amistad ahora mismo.", + "friends_and_dms.new_conversations_limited": "No puedes iniciar conversaciones nuevas ahora mismo. Inténtalo de nuevo más tarde.", "friends_and_dms.not_friends": "No eres amigo de este usuario.", "friends_and_dms.recipient_ids_cannot_be_empty": "Los ID de destinatario no pueden ir vacíos.", "friends_and_dms.recipient_ids_must_be_strings": "Los ID de destinatario deben ser cadenas.", diff --git a/packages/errors/src/i18n/weblate/locales/fi.json b/packages/errors/src/i18n/weblate/locales/fi.json index 6ddfa9e0d..0459fbba5 100644 --- a/packages/errors/src/i18n/weblate/locales/fi.json +++ b/packages/errors/src/i18n/weblate/locales/fi.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "Suorat viestit ja kaveripyynnöt on poistettu käytöstä tässä instanssissa.", "friends_and_dms.duplicate_recipients_not_allowed": "Samaa vastaanottajaa ei saa lisätä useasti.", "friends_and_dms.friend_request_blocked": "Käyttäjä ei hyväksy kaveripyyntöjä tällä hetkellä.", + "friends_and_dms.new_conversations_limited": "Et voi aloittaa uusia keskusteluja juuri nyt. Yritä uudelleen myöhemmin.", "friends_and_dms.not_friends": "Et ole tämän käyttäjän kaveri.", "friends_and_dms.recipient_ids_cannot_be_empty": "Vastaanottajien tunnukset eivät voi olla tyhjiä.", "friends_and_dms.recipient_ids_must_be_strings": "Vastaanottajien tunnusten on oltava merkkijonoja.", diff --git a/packages/errors/src/i18n/weblate/locales/fr.json b/packages/errors/src/i18n/weblate/locales/fr.json index 51a28dcac..e750500f2 100644 --- a/packages/errors/src/i18n/weblate/locales/fr.json +++ b/packages/errors/src/i18n/weblate/locales/fr.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "Les messages privés et les demandes d'ami sont désactivés sur cette instance.", "friends_and_dms.duplicate_recipients_not_allowed": "Les destinataires en double ne sont pas autorisés.", "friends_and_dms.friend_request_blocked": "L'utilisateur n'accepte pas les demandes d'ami pour le moment.", + "friends_and_dms.new_conversations_limited": "Vous ne pouvez pas démarrer de nouvelles conversations pour le moment. Réessayez plus tard.", "friends_and_dms.not_friends": "Cet utilisateur ne figure pas dans votre liste d’amis.", "friends_and_dms.recipient_ids_cannot_be_empty": "Les identifiants de destinataire ne peuvent pas être vides.", "friends_and_dms.recipient_ids_must_be_strings": "Les identifiants de destinataire doivent être des chaînes de caractères.", diff --git a/packages/errors/src/i18n/weblate/locales/he.json b/packages/errors/src/i18n/weblate/locales/he.json index 976e2b522..cae873798 100644 --- a/packages/errors/src/i18n/weblate/locales/he.json +++ b/packages/errors/src/i18n/weblate/locales/he.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "הודעות פרטיות ובקשות חברות מושבתות במופע זה.", "friends_and_dms.duplicate_recipients_not_allowed": "נמענים כפולים אינם מותרים.", "friends_and_dms.friend_request_blocked": "משתמש זה אינו מקבל בקשות חברות כרגע.", + "friends_and_dms.new_conversations_limited": "לא ניתן להתחיל שיחות חדשות כרגע. ניתן לנסות שוב מאוחר יותר.", "friends_and_dms.not_friends": "אתם לא חברים עם המשתמש הזה.", "friends_and_dms.recipient_ids_cannot_be_empty": "מזהי נמענים אינם יכולים להיות ריקים.", "friends_and_dms.recipient_ids_must_be_strings": "מזהי נמענים חייבים להיות מחרוזות.", diff --git a/packages/errors/src/i18n/weblate/locales/hi.json b/packages/errors/src/i18n/weblate/locales/hi.json index d184ca332..a6976eba2 100644 --- a/packages/errors/src/i18n/weblate/locales/hi.json +++ b/packages/errors/src/i18n/weblate/locales/hi.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "इस इंस्टेंस पर डायरेक्ट मैसेज और फ्रेंड रिक्वेस्ट डिसेबल हैं।", "friends_and_dms.duplicate_recipients_not_allowed": "डुप्लीकेट रिसीपिएंट की अनुमति नहीं है।", "friends_and_dms.friend_request_blocked": "यूज़र इस समय फ्रेंड रिक्वेस्ट स्वीकार नहीं कर रहा है।", + "friends_and_dms.new_conversations_limited": "आप अभी नई बातचीत शुरू नहीं कर सकते हैं। कृपया बाद में फिर से कोशिश करें।", "friends_and_dms.not_friends": "आप इस यूज़र के दोस्त नहीं हैं।", "friends_and_dms.recipient_ids_cannot_be_empty": "रिसीपिएंट IDs खाली नहीं होनी चाहिए।", "friends_and_dms.recipient_ids_must_be_strings": "रिसीपिएंट IDs स्ट्रिंग होनी चाहिए।", diff --git a/packages/errors/src/i18n/weblate/locales/hr.json b/packages/errors/src/i18n/weblate/locales/hr.json index b9df9b35c..fe3b048ff 100644 --- a/packages/errors/src/i18n/weblate/locales/hr.json +++ b/packages/errors/src/i18n/weblate/locales/hr.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "Izravne poruke i zahtjevi za prijateljstvo onemogućeni su na ovoj instanci.", "friends_and_dms.duplicate_recipients_not_allowed": "Duplicirani primatelji nisu dopušteni.", "friends_and_dms.friend_request_blocked": "Korisnik trenutno ne prihvaća zahtjeve za prijateljstvo.", + "friends_and_dms.new_conversations_limited": "Trenutačno ne možeš započeti nove razgovore. Pokušaj ponovno kasnije.", "friends_and_dms.not_friends": "Nisi prijatelj s ovim korisnikom.", "friends_and_dms.recipient_ids_cannot_be_empty": "ID-ovi primatelja ne mogu biti prazni.", "friends_and_dms.recipient_ids_must_be_strings": "ID-ovi primatelja moraju biti nizovi znakova.", diff --git a/packages/errors/src/i18n/weblate/locales/hu.json b/packages/errors/src/i18n/weblate/locales/hu.json index a60e68c31..0622b5836 100644 --- a/packages/errors/src/i18n/weblate/locales/hu.json +++ b/packages/errors/src/i18n/weblate/locales/hu.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "A közvetlen üzenetek és az ismerősjelölések le vannak tiltva ezen a példányon.", "friends_and_dms.duplicate_recipients_not_allowed": "Ugyanaz a címzett nem szerepelhet többször.", "friends_and_dms.friend_request_blocked": "A felhasználó jelenleg nem fogad ismerősjelölést.", + "friends_and_dms.new_conversations_limited": "Jelenleg nem kezdhetsz új beszélgetést. Próbáld újra később.", "friends_and_dms.not_friends": "Nem vagytok ismerősök ezzel a felhasználóval.", "friends_and_dms.recipient_ids_cannot_be_empty": "A címzettazonosítók nem lehetnek üresek.", "friends_and_dms.recipient_ids_must_be_strings": "A címzettazonosítóknak karakterláncoknak kell lenniük.", diff --git a/packages/errors/src/i18n/weblate/locales/id.json b/packages/errors/src/i18n/weblate/locales/id.json index 85855509d..460a7bf4d 100644 --- a/packages/errors/src/i18n/weblate/locales/id.json +++ b/packages/errors/src/i18n/weblate/locales/id.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "DM dan permintaan pertemanan dinonaktifkan di instance ini.", "friends_and_dms.duplicate_recipients_not_allowed": "Penerima ganda tidak diizinkan.", "friends_and_dms.friend_request_blocked": "Pengguna ini tidak menerima permintaan pertemanan saat ini.", + "friends_and_dms.new_conversations_limited": "Kamu tidak dapat memulai percakapan baru saat ini. Coba lagi nanti.", "friends_and_dms.not_friends": "Kamu tidak berteman dengan pengguna ini.", "friends_and_dms.recipient_ids_cannot_be_empty": "ID penerima tidak boleh kosong.", "friends_and_dms.recipient_ids_must_be_strings": "ID penerima harus string.", diff --git a/packages/errors/src/i18n/weblate/locales/it.json b/packages/errors/src/i18n/weblate/locales/it.json index 1d6177828..40295170b 100644 --- a/packages/errors/src/i18n/weblate/locales/it.json +++ b/packages/errors/src/i18n/weblate/locales/it.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "I messaggi diretti e le richieste di amicizia sono disabilitati su questa istanza.", "friends_and_dms.duplicate_recipients_not_allowed": "Non sono consentiti destinatari duplicati.", "friends_and_dms.friend_request_blocked": "Questo utente non accetta richieste di amicizia in questo momento.", + "friends_and_dms.new_conversations_limited": "Al momento non puoi iniziare nuove conversazioni. Riprova più tardi.", "friends_and_dms.not_friends": "Non sei amico di questo utente.", "friends_and_dms.recipient_ids_cannot_be_empty": "Gli ID dei destinatari non possono essere vuoti.", "friends_and_dms.recipient_ids_must_be_strings": "Gli ID dei destinatari devono essere stringhe.", diff --git a/packages/errors/src/i18n/weblate/locales/ja.json b/packages/errors/src/i18n/weblate/locales/ja.json index b69c8a4e3..3a54dbb25 100644 --- a/packages/errors/src/i18n/weblate/locales/ja.json +++ b/packages/errors/src/i18n/weblate/locales/ja.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "このインスタンスでは、ダイレクトメッセージと友だち申請は無効になっています。", "friends_and_dms.duplicate_recipients_not_allowed": "重複する受信者は許可されていません。", "friends_and_dms.friend_request_blocked": "このユーザーは現在、友だち申請を受け付けていません。", + "friends_and_dms.new_conversations_limited": "現在、新しい会話を開始することはできません。後でもう一度お試しください。", "friends_and_dms.not_friends": "このユーザーとは友だちではありません。", "friends_and_dms.recipient_ids_cannot_be_empty": "受信者IDを空にすることはできません。", "friends_and_dms.recipient_ids_must_be_strings": "受信者IDは文字列である必要があります。", diff --git a/packages/errors/src/i18n/weblate/locales/ko.json b/packages/errors/src/i18n/weblate/locales/ko.json index 8268f47f2..11c2d3691 100644 --- a/packages/errors/src/i18n/weblate/locales/ko.json +++ b/packages/errors/src/i18n/weblate/locales/ko.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "이 인스턴스에서는 DM과 친구 요청이 비활성화되어 있어요.", "friends_and_dms.duplicate_recipients_not_allowed": "중복된 수신자는 추가할 수 없어요.", "friends_and_dms.friend_request_blocked": "이 사용자는 현재 친구 요청을 수락하지 않아요.", + "friends_and_dms.new_conversations_limited": "지금은 새 대화를 시작할 수 없어요. 나중에 다시 시도해 주세요.", "friends_and_dms.not_friends": "이 사용자와 친구가 아니에요.", "friends_and_dms.recipient_ids_cannot_be_empty": "수신자 ID는 비워둘 수 없어요.", "friends_and_dms.recipient_ids_must_be_strings": "수신자 ID는 문자열이어야 해요.", diff --git a/packages/errors/src/i18n/weblate/locales/lt.json b/packages/errors/src/i18n/weblate/locales/lt.json index b68e880bc..3f90919b1 100644 --- a/packages/errors/src/i18n/weblate/locales/lt.json +++ b/packages/errors/src/i18n/weblate/locales/lt.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "Asmeninės žinutės ir draugystės užklausos šioje instancijoje išjungtos.", "friends_and_dms.duplicate_recipients_not_allowed": "Pasikartojantys gavėjai neleidžiami.", "friends_and_dms.friend_request_blocked": "Naudotojas šiuo metu nepriima draugystės užklausų.", + "friends_and_dms.new_conversations_limited": "Šiuo metu negali pradėti naujų pokalbių. Pabandyk dar kartą vėliau.", "friends_and_dms.not_friends": "Su šiuo naudotoju nedraugauji.", "friends_and_dms.recipient_ids_cannot_be_empty": "Gavėjų ID negali būti palikti tušti.", "friends_and_dms.recipient_ids_must_be_strings": "Gavėjų ID turi būti eilutės.", diff --git a/packages/errors/src/i18n/weblate/locales/nl.json b/packages/errors/src/i18n/weblate/locales/nl.json index d58b95e0d..e012393ce 100644 --- a/packages/errors/src/i18n/weblate/locales/nl.json +++ b/packages/errors/src/i18n/weblate/locales/nl.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "Directe berichten en vriendschapsverzoeken zijn uitgeschakeld op deze instantie.", "friends_and_dms.duplicate_recipients_not_allowed": "Dubbele ontvangers zijn niet toegestaan.", "friends_and_dms.friend_request_blocked": "Gebruiker accepteert op dit moment geen vriendschapsverzoeken.", + "friends_and_dms.new_conversations_limited": "Je kunt op dit moment geen nieuwe gesprekken starten. Probeer het later opnieuw.", "friends_and_dms.not_friends": "Je bent niet bevriend met deze gebruiker.", "friends_and_dms.recipient_ids_cannot_be_empty": "Ontvanger-ID's kunnen niet leeg zijn.", "friends_and_dms.recipient_ids_must_be_strings": "Ontvanger-ID's moeten tekstreeksen zijn.", diff --git a/packages/errors/src/i18n/weblate/locales/no.json b/packages/errors/src/i18n/weblate/locales/no.json index be9e662de..66776d36a 100644 --- a/packages/errors/src/i18n/weblate/locales/no.json +++ b/packages/errors/src/i18n/weblate/locales/no.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "Direktemeldinger og venneforespørsler er deaktivert på denne instansen.", "friends_and_dms.duplicate_recipients_not_allowed": "Dupliserte mottakere er ikke tillatt.", "friends_and_dms.friend_request_blocked": "Brukeren godtar ikke venneforespørsler akkurat nå.", + "friends_and_dms.new_conversations_limited": "Du kan ikke starte nye samtaler akkurat nå. Prøv igjen senere.", "friends_and_dms.not_friends": "Du er ikke venn med denne brukeren.", "friends_and_dms.recipient_ids_cannot_be_empty": "Mottaker-ID-er kan ikke være tomme.", "friends_and_dms.recipient_ids_must_be_strings": "Mottaker-ID-er må være strenger.", diff --git a/packages/errors/src/i18n/weblate/locales/pl.json b/packages/errors/src/i18n/weblate/locales/pl.json index 8401a94f7..d50e06b87 100644 --- a/packages/errors/src/i18n/weblate/locales/pl.json +++ b/packages/errors/src/i18n/weblate/locales/pl.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "Wiadomości prywatne i zaproszenia do znajomych są wyłączone w tej instancji.", "friends_and_dms.duplicate_recipients_not_allowed": "Duplikowanie odbiorców jest niedozwolone.", "friends_and_dms.friend_request_blocked": "Użytkownik nie akceptuje obecnie zaproszeń do znajomych.", + "friends_and_dms.new_conversations_limited": "Nie możesz teraz rozpoczynać nowych rozmów. Spróbuj ponownie później.", "friends_and_dms.not_friends": "Ten użytkownik nie jest na Twojej liście znajomych.", "friends_and_dms.recipient_ids_cannot_be_empty": "ID odbiorców nie mogą być puste.", "friends_and_dms.recipient_ids_must_be_strings": "ID odbiorców muszą być ciągami znaków.", diff --git a/packages/errors/src/i18n/weblate/locales/pt-BR.json b/packages/errors/src/i18n/weblate/locales/pt-BR.json index 5db52ed57..2fd4eb520 100644 --- a/packages/errors/src/i18n/weblate/locales/pt-BR.json +++ b/packages/errors/src/i18n/weblate/locales/pt-BR.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "As mensagens diretas e os pedidos de amizade estão desativados nesta instância.", "friends_and_dms.duplicate_recipients_not_allowed": "Destinatários duplicados não são permitidos.", "friends_and_dms.friend_request_blocked": "O usuário não está aceitando pedidos de amizade agora.", + "friends_and_dms.new_conversations_limited": "Você não pode iniciar novas conversas agora. Tente novamente mais tarde.", "friends_and_dms.not_friends": "Você e este usuário não são amigos.", "friends_and_dms.recipient_ids_cannot_be_empty": "Os IDs dos destinatários não podem estar vazios.", "friends_and_dms.recipient_ids_must_be_strings": "Os IDs dos destinatários devem ser strings.", diff --git a/packages/errors/src/i18n/weblate/locales/ro.json b/packages/errors/src/i18n/weblate/locales/ro.json index 6a16956eb..8cac7251a 100644 --- a/packages/errors/src/i18n/weblate/locales/ro.json +++ b/packages/errors/src/i18n/weblate/locales/ro.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "Mesajele directe și cererile de prietenie sunt dezactivate pe această instanță.", "friends_and_dms.duplicate_recipients_not_allowed": "Nu sunt permiși destinatari duplicați.", "friends_and_dms.friend_request_blocked": "Utilizatorul nu acceptă cereri de prietenie în acest moment.", + "friends_and_dms.new_conversations_limited": "Nu poți începe conversații noi acum. Încearcă din nou mai târziu.", "friends_and_dms.not_friends": "Nu ești prieten cu acest utilizator.", "friends_and_dms.recipient_ids_cannot_be_empty": "ID-urile destinatarilor nu pot fi goale.", "friends_and_dms.recipient_ids_must_be_strings": "ID-urile destinatarilor trebuie să fie șiruri.", diff --git a/packages/errors/src/i18n/weblate/locales/ru.json b/packages/errors/src/i18n/weblate/locales/ru.json index cf9dcec0f..89e05a2a7 100644 --- a/packages/errors/src/i18n/weblate/locales/ru.json +++ b/packages/errors/src/i18n/weblate/locales/ru.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "Личные сообщения и запросы в друзья отключены на этом экземпляре.", "friends_and_dms.duplicate_recipients_not_allowed": "Повторяющиеся получатели запрещены.", "friends_and_dms.friend_request_blocked": "Пользователь временно не принимает запросы в друзья.", + "friends_and_dms.new_conversations_limited": "Сейчас ты не можешь начинать новые чаты. Попробуй ещё раз позже.", "friends_and_dms.not_friends": "Ты не дружишь с этим пользователем.", "friends_and_dms.recipient_ids_cannot_be_empty": "ID получателей не могут быть пустыми.", "friends_and_dms.recipient_ids_must_be_strings": "ID получателей должны быть строками.", diff --git a/packages/errors/src/i18n/weblate/locales/sv-SE.json b/packages/errors/src/i18n/weblate/locales/sv-SE.json index a3b83575a..929d7e109 100644 --- a/packages/errors/src/i18n/weblate/locales/sv-SE.json +++ b/packages/errors/src/i18n/weblate/locales/sv-SE.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "Direktmeddelanden och vänförfrågningar är inaktiverade på den här instansen.", "friends_and_dms.duplicate_recipients_not_allowed": "Dubbletter av mottagare är inte tillåtna.", "friends_and_dms.friend_request_blocked": "Användaren accepterar inte vänförfrågningar just nu.", + "friends_and_dms.new_conversations_limited": "Du kan inte starta nya konversationer just nu. Försök igen senare.", "friends_and_dms.not_friends": "Du är inte vän med den här användaren.", "friends_and_dms.recipient_ids_cannot_be_empty": "Mottagar-ID:n får inte vara tomma.", "friends_and_dms.recipient_ids_must_be_strings": "Mottagar-ID:n måste vara strängar.", diff --git a/packages/errors/src/i18n/weblate/locales/th.json b/packages/errors/src/i18n/weblate/locales/th.json index 78d9ae1c8..184fda513 100644 --- a/packages/errors/src/i18n/weblate/locales/th.json +++ b/packages/errors/src/i18n/weblate/locales/th.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "ข้อความส่วนตัวและคำขอเป็นเพื่อนถูกปิดใช้งานบนอินสแตนซ์นี้", "friends_and_dms.duplicate_recipients_not_allowed": "ไม่อนุญาตให้มีผู้รับซ้ำกัน", "friends_and_dms.friend_request_blocked": "ผู้ใช้ไม่รับคำขอเป็นเพื่อนในขณะนี้", + "friends_and_dms.new_conversations_limited": "ไม่สามารถเริ่มการสนทนาใหม่ได้ในขณะนี้ โปรดลองอีกครั้งในภายหลัง", "friends_and_dms.not_friends": "คุณไม่ได้เป็นเพื่อนกับผู้ใช้นี้", "friends_and_dms.recipient_ids_cannot_be_empty": "ID ผู้รับไม่สามารถเป็นค่าว่างได้", "friends_and_dms.recipient_ids_must_be_strings": "ID ผู้รับต้องเป็นสตริง", diff --git a/packages/errors/src/i18n/weblate/locales/tr.json b/packages/errors/src/i18n/weblate/locales/tr.json index cea90cbe3..2574528d4 100644 --- a/packages/errors/src/i18n/weblate/locales/tr.json +++ b/packages/errors/src/i18n/weblate/locales/tr.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "Bu kurulumda DM'ler ve arkadaşlık istekleri devre dışı.", "friends_and_dms.duplicate_recipients_not_allowed": "Yinelenen alıcılara izin verilmez.", "friends_and_dms.friend_request_blocked": "Kullanıcı şu anda arkadaşlık isteklerini kabul etmiyor.", + "friends_and_dms.new_conversations_limited": "Şu anda yeni sohbet başlatamazsın. Lütfen daha sonra tekrar dene.", "friends_and_dms.not_friends": "Bu kullanıcıyla arkadaş değilsin.", "friends_and_dms.recipient_ids_cannot_be_empty": "Alıcı kimlikleri boş olamaz.", "friends_and_dms.recipient_ids_must_be_strings": "Alıcı kimlikleri dize olmalı.", diff --git a/packages/errors/src/i18n/weblate/locales/uk.json b/packages/errors/src/i18n/weblate/locales/uk.json index f719b0f95..1ba955310 100644 --- a/packages/errors/src/i18n/weblate/locales/uk.json +++ b/packages/errors/src/i18n/weblate/locales/uk.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "Особисті повідомлення та запити в друзі вимкнено на цьому екземплярі.", "friends_and_dms.duplicate_recipients_not_allowed": "Одержувачі не можуть повторюватися.", "friends_and_dms.friend_request_blocked": "Користувач наразі не приймає запити в друзі.", + "friends_and_dms.new_conversations_limited": "Зараз ти не можеш починати нові чати. Спробуй пізніше.", "friends_and_dms.not_friends": "Ти не дружиш з цим користувачем.", "friends_and_dms.recipient_ids_cannot_be_empty": "Ідентифікатори одержувачів не можуть бути порожніми.", "friends_and_dms.recipient_ids_must_be_strings": "Ідентифікатори одержувачів мають бути рядками.", diff --git a/packages/errors/src/i18n/weblate/locales/vi.json b/packages/errors/src/i18n/weblate/locales/vi.json index d8009b255..0f083f0ea 100644 --- a/packages/errors/src/i18n/weblate/locales/vi.json +++ b/packages/errors/src/i18n/weblate/locales/vi.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "Tin nhắn trực tiếp và lời mời kết bạn đã bị tắt trên phiên bản này.", "friends_and_dms.duplicate_recipients_not_allowed": "Không được có người nhận trùng lặp.", "friends_and_dms.friend_request_blocked": "Người dùng này hiện không nhận lời mời kết bạn.", + "friends_and_dms.new_conversations_limited": "Hiện bạn không thể bắt đầu cuộc trò chuyện mới. Vui lòng thử lại sau.", "friends_and_dms.not_friends": "Bạn không phải là bạn bè với người dùng này.", "friends_and_dms.recipient_ids_cannot_be_empty": "ID của người nhận không được để trống.", "friends_and_dms.recipient_ids_must_be_strings": "ID của người nhận phải là chuỗi.", diff --git a/packages/errors/src/i18n/weblate/locales/zh-CN.json b/packages/errors/src/i18n/weblate/locales/zh-CN.json index 88cbf0bf0..297ba05be 100644 --- a/packages/errors/src/i18n/weblate/locales/zh-CN.json +++ b/packages/errors/src/i18n/weblate/locales/zh-CN.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "此实例已禁用私信和好友请求。", "friends_and_dms.duplicate_recipients_not_allowed": "不允许重复添加接收者。", "friends_and_dms.friend_request_blocked": "该用户当前不接受好友请求。", + "friends_and_dms.new_conversations_limited": "你目前无法发起新的对话。请稍后重试。", "friends_and_dms.not_friends": "你与该用户还不是好友。", "friends_and_dms.recipient_ids_cannot_be_empty": "接收者 ID 不得为空。", "friends_and_dms.recipient_ids_must_be_strings": "接收者 ID 必须为字符串类型。", diff --git a/packages/errors/src/i18n/weblate/locales/zh-TW.json b/packages/errors/src/i18n/weblate/locales/zh-TW.json index 09c173a78..3a7b8aa83 100644 --- a/packages/errors/src/i18n/weblate/locales/zh-TW.json +++ b/packages/errors/src/i18n/weblate/locales/zh-TW.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "此實例已停用私訊和好友邀請。", "friends_and_dms.duplicate_recipients_not_allowed": "不允許重複成員。", "friends_and_dms.friend_request_blocked": "此使用者目前不接受好友邀請。", + "friends_and_dms.new_conversations_limited": "你目前無法開始新的對話。請稍後再試。", "friends_and_dms.not_friends": "你不是此使用者的好友。", "friends_and_dms.recipient_ids_cannot_be_empty": "成員 ID 不能為空。", "friends_and_dms.recipient_ids_must_be_strings": "成員 ID 必須是字串。", diff --git a/packages/errors/src/i18n/weblate/messages.json b/packages/errors/src/i18n/weblate/messages.json index c26119db5..6f8ab339a 100644 --- a/packages/errors/src/i18n/weblate/messages.json +++ b/packages/errors/src/i18n/weblate/messages.json @@ -275,6 +275,7 @@ "friends_and_dms.direct_messages_disabled": "Direct messages and friend requests are disabled on this instance.", "friends_and_dms.duplicate_recipients_not_allowed": "Duplicate recipients aren't allowed.", "friends_and_dms.friend_request_blocked": "User does not accept friend requests at this time.", + "friends_and_dms.new_conversations_limited": "You can't start new conversations right now. Please try again later.", "friends_and_dms.not_friends": "You're not friends with this user.", "friends_and_dms.recipient_ids_cannot_be_empty": "Recipient IDs can't be empty.", "friends_and_dms.recipient_ids_must_be_strings": "Recipient IDs must be strings.",