feat(bot): replace /invite with /join_link command

- Remove /invite command and targeted invite flow
- Add /join_link command to generate shareable household join link
- Update i18n translations for en and ru
- Update command registration to include join_link in admin commands
This commit is contained in:
2026-03-14 23:46:32 +04:00
parent 0af8ea6f48
commit e24c53dce2
6 changed files with 151 additions and 856 deletions

View File

@@ -14,7 +14,7 @@ export const enBotTranslations: BotTranslationCatalog = {
bind_feedback_topic: 'Bind the current topic as feedback',
bind_reminders_topic: 'Bind the current topic as reminders',
bind_payments_topic: 'Bind the current topic as payments',
invite: 'Invite the replied user into this household',
join_link: 'Get a shareable link for new members to join',
payment_add: 'Record your rent or utilities payment',
pending_members: 'List pending household join requests',
approve_member: 'Approve a pending household member'
@@ -126,28 +126,16 @@ export const enBotTranslations: BotTranslationCatalog = {
usePendingMembersInGroup: 'Use /pending_members inside the household group.',
useApproveMemberInGroup: 'Use /approve_member inside the household group.',
approveMemberUsage: 'Usage: /approve_member <telegram_user_id>',
useInviteInGroup: 'Use /invite as a reply inside the household group.',
onlyInviteAdmins: 'Only Telegram group admins or household admins can invite members.',
inviteUsage: 'Reply to a real user message with /invite.',
inviteTargetInvalid: 'I can only prepare invites for real group members.',
inviteAlreadyMember: (displayName, householdName) =>
`${displayName} is already an active member of ${householdName}.`,
inviteAlreadyPending: (displayName, householdName) =>
`${displayName} already has a pending join request for ${householdName}.`,
invitePrepared: (displayName, householdName) =>
`Invitation prepared for ${displayName}. Tap below to join ${householdName}.`,
invitePreparedToast: (displayName) => `Invite prepared for ${displayName}.`,
inviteJoinWrongUser: 'This invite is for a different Telegram user.',
inviteJoinExpired: 'This invite is no longer available.',
inviteJoinCompleted: (displayName, householdName) =>
`${displayName} completed the join flow for ${householdName}.`,
inviteJoinRequestSent: (displayName, householdName) =>
`${displayName} sent a join request for ${householdName}.`,
approvedMember: (displayName, householdName) =>
`Approved ${displayName} as an active member of ${householdName}.`,
useButtonInGroup: 'Use this button in the household group.',
unableToIdentifySelectedMember: 'Unable to identify the selected member.',
approvedMemberToast: (displayName) => `Approved ${displayName}.`
approvedMemberToast: (displayName) => `Approved ${displayName}.`,
useJoinLinkInGroup: 'Use /join_link inside the household group.',
joinLinkUnavailable: 'Could not generate join link.',
joinLinkReady: (link, householdName) =>
`Join link for ${householdName}:\n${link}\n\nAnyone with this link can join the household. Share it carefully.`
},
anonymousFeedback: {
title: 'Anonymous household note',

View File

@@ -14,7 +14,7 @@ export const ruBotTranslations: BotTranslationCatalog = {
bind_feedback_topic: 'Назначить текущий топик для анонимных сообщений',
bind_reminders_topic: 'Назначить текущий топик для напоминаний',
bind_payments_topic: 'Назначить текущий топик для оплат',
invite: 'Пригласить пользователя из сообщения в этот дом',
join_link: 'Получить ссылку для приглашения новых участников',
payment_add: 'Подтвердить оплату аренды или коммуналки',
pending_members: 'Показать ожидающие заявки на вступление',
approve_member: 'Подтвердить участника дома'
@@ -128,28 +128,16 @@ export const ruBotTranslations: BotTranslationCatalog = {
usePendingMembersInGroup: 'Используйте /pending_members внутри группы дома.',
useApproveMemberInGroup: 'Используйте /approve_member внутри группы дома.',
approveMemberUsage: 'Использование: /approve_member <telegram_user_id>',
useInviteInGroup: 'Используйте /invite как ответ внутри группы дома.',
onlyInviteAdmins: 'Приглашать участников могут только админы Telegram-группы или админы дома.',
inviteUsage: 'Ответьте командой /invite на сообщение реального участника.',
inviteTargetInvalid: 'Я могу подготовить приглашение только для реального участника группы.',
inviteAlreadyMember: (displayName, householdName) =>
`${displayName} уже является активным участником ${householdName}.`,
inviteAlreadyPending: (displayName, householdName) =>
`${displayName} уже отправил(а) заявку на вступление в ${householdName}.`,
invitePrepared: (displayName, householdName) =>
`Приглашение для ${displayName} готово. Нажмите кнопку ниже, чтобы вступить в ${householdName}.`,
invitePreparedToast: (displayName) => `Приглашение для ${displayName} подготовлено.`,
inviteJoinWrongUser: 'Это приглашение предназначено для другого пользователя Telegram.',
inviteJoinExpired: 'Это приглашение больше недоступно.',
inviteJoinCompleted: (displayName, householdName) =>
`${displayName} завершил(а) вступление в ${householdName}.`,
inviteJoinRequestSent: (displayName, householdName) =>
`${displayName} отправил(а) заявку на вступление в ${householdName}.`,
approvedMember: (displayName, householdName) =>
`Участник ${displayName} подтверждён как активный участник ${householdName}.`,
useButtonInGroup: 'Используйте эту кнопку в группе дома.',
unableToIdentifySelectedMember: 'Не удалось определить выбранного участника.',
approvedMemberToast: (displayName) => `${displayName} подтверждён.`
approvedMemberToast: (displayName) => `${displayName} подтверждён.`,
useJoinLinkInGroup: 'Используйте /join_link внутри группы дома.',
joinLinkUnavailable: 'Не удалось сгенерировать ссылку для вступления.',
joinLinkReady: (link, householdName) =>
`Поделитесь этой ссылкой, чтобы пригласить участников в ${householdName}:\n\n${link}\n\nЛюбой, у кого есть эта ссылка, может подать заявку на вступление.`
},
anonymousFeedback: {
title: 'Анонимное сообщение по дому',

View File

@@ -12,7 +12,7 @@ export type TelegramCommandName =
| 'bind_feedback_topic'
| 'bind_reminders_topic'
| 'bind_payments_topic'
| 'invite'
| 'join_link'
| 'payment_add'
| 'pending_members'
| 'approve_member'
@@ -29,7 +29,7 @@ export interface BotCommandDescriptions {
bind_feedback_topic: string
bind_reminders_topic: string
bind_payments_topic: string
invite: string
join_link: string
payment_add: string
pending_members: string
approve_member: string
@@ -115,22 +115,14 @@ export interface BotTranslationCatalog {
usePendingMembersInGroup: string
useApproveMemberInGroup: string
approveMemberUsage: string
useInviteInGroup: string
onlyInviteAdmins: string
inviteUsage: string
inviteTargetInvalid: string
inviteAlreadyMember: (displayName: string, householdName: string) => string
inviteAlreadyPending: (displayName: string, householdName: string) => string
invitePrepared: (displayName: string, householdName: string) => string
invitePreparedToast: (displayName: string) => string
inviteJoinWrongUser: string
inviteJoinExpired: string
inviteJoinCompleted: (displayName: string, householdName: string) => string
inviteJoinRequestSent: (displayName: string, householdName: string) => string
approvedMember: (displayName: string, householdName: string) => string
useButtonInGroup: string
unableToIdentifySelectedMember: string
approvedMemberToast: (displayName: string) => string
useJoinLinkInGroup: string
joinLinkUnavailable: string
joinLinkReady: (link: string, householdName: string) => string
}
anonymousFeedback: {
title: string