some
This commit is contained in:
parent
37410dff97
commit
e43eed7f9c
@ -87,7 +87,7 @@ export default function useTaskActions({
|
|||||||
const chosen = pool.slice(0, required);
|
const chosen = pool.slice(0, required);
|
||||||
accountRolesMap = {};
|
accountRolesMap = {};
|
||||||
chosen.forEach((accountId) => {
|
chosen.forEach((accountId) => {
|
||||||
const existing = accountRolesMap[accountId] || {};
|
const existing = taskAccountRoles[accountId] || {};
|
||||||
accountRolesMap[accountId] = { monitor: true, invite: true, confirm: true, inviteLimit: existing.inviteLimit || 1 };
|
accountRolesMap[accountId] = { monitor: true, invite: true, confirm: true, inviteLimit: existing.inviteLimit || 1 };
|
||||||
});
|
});
|
||||||
accountIds = chosen;
|
accountIds = chosen;
|
||||||
@ -98,7 +98,7 @@ export default function useTaskActions({
|
|||||||
accountIds = accounts.map((account) => account.id);
|
accountIds = accounts.map((account) => account.id);
|
||||||
accountRolesMap = {};
|
accountRolesMap = {};
|
||||||
accountIds.forEach((accountId) => {
|
accountIds.forEach((accountId) => {
|
||||||
const existing = accountRolesMap[accountId] || {};
|
const existing = taskAccountRoles[accountId] || {};
|
||||||
accountRolesMap[accountId] = { monitor: true, invite: true, confirm: true, inviteLimit: existing.inviteLimit || 1 };
|
accountRolesMap[accountId] = { monitor: true, invite: true, confirm: true, inviteLimit: existing.inviteLimit || 1 };
|
||||||
});
|
});
|
||||||
setTaskAccountRoles(accountRolesMap);
|
setTaskAccountRoles(accountRolesMap);
|
||||||
|
|||||||
@ -168,14 +168,36 @@ function LogsTab({
|
|||||||
const buildUserReason = (invite) => {
|
const buildUserReason = (invite) => {
|
||||||
const codeRaw = invite.error || invite.confirmError || invite.skippedReason || "";
|
const codeRaw = invite.error || invite.confirmError || invite.skippedReason || "";
|
||||||
const code = String(codeRaw).split(/[:(]/, 1)[0].trim();
|
const code = String(codeRaw).split(/[:(]/, 1)[0].trim();
|
||||||
|
const isInviteLinkTarget = String(invite.targetChat || "").includes("t.me/+");
|
||||||
if (invite.status === "success") return "Пользователь добавлен и участие подтверждено.";
|
if (invite.status === "success") return "Пользователь добавлен и участие подтверждено.";
|
||||||
if (invite.status === "unconfirmed") {
|
if (invite.status === "unconfirmed") {
|
||||||
|
if (isInviteLinkTarget) {
|
||||||
|
return "Инвайт отправлен. Для цели по invite-ссылке вступление может подтверждаться с задержкой.";
|
||||||
|
}
|
||||||
if (code === "USER_NOT_PARTICIPANT") return "Инвайт отправлен, но пользователь еще не вступил в группу.";
|
if (code === "USER_NOT_PARTICIPANT") return "Инвайт отправлен, но пользователь еще не вступил в группу.";
|
||||||
return explainRawError(invite.confirmError) || "Инвайт отправлен, но участие пока не подтверждено.";
|
return explainRawError(invite.confirmError) || "Инвайт отправлен, но участие пока не подтверждено.";
|
||||||
}
|
}
|
||||||
if (invite.status === "skipped") return explainRawError(invite.skippedReason) || "Попытка была пропущена.";
|
if (invite.status === "skipped") return explainRawError(invite.skippedReason) || "Попытка была пропущена.";
|
||||||
return explainRawError(invite.error) || "Telegram отклонил попытку приглашения.";
|
return explainRawError(invite.error) || "Telegram отклонил попытку приглашения.";
|
||||||
};
|
};
|
||||||
|
const buildDetailedExplanation = (invite) => {
|
||||||
|
if (!invite) return "Причина не определена";
|
||||||
|
if (invite.status === "unconfirmed") {
|
||||||
|
const isInviteLinkTarget = String(invite.targetChat || "").includes("t.me/+");
|
||||||
|
const confirmCode = String(invite.confirmError || "").split(/[:(]/, 1)[0].trim();
|
||||||
|
const hasRightForbidden = String(invite.strategyMeta || "").includes("RIGHT_FORBIDDEN");
|
||||||
|
if (confirmCode === "USER_NOT_PARTICIPANT") {
|
||||||
|
if (hasRightForbidden) {
|
||||||
|
return "У admin_invite не хватило прав (RIGHT_FORBIDDEN), а проверка показала, что пользователь пока не вступил в группу.";
|
||||||
|
}
|
||||||
|
return isInviteLinkTarget
|
||||||
|
? "Инвайт отправлен, но для цели по invite-ссылке пользователь может вступить позже (задержка подтверждения/ожидание одобрения)."
|
||||||
|
: "Инвайт отправлен, но пользователь ещё не вступил в группу на момент проверки.";
|
||||||
|
}
|
||||||
|
return explainRawError(invite.confirmError) || "Инвайт отправлен, но участие пока не подтверждено.";
|
||||||
|
}
|
||||||
|
return explainRawError(invite.error) || explainRawError(invite.confirmError) || "Причина не определена";
|
||||||
|
};
|
||||||
const buildInviteSummary = (invite) => {
|
const buildInviteSummary = (invite) => {
|
||||||
const userLabel = invite.username
|
const userLabel = invite.username
|
||||||
? `@${invite.username}${invite.userId ? ` (ID: ${invite.userId})` : ""}`
|
? `@${invite.username}${invite.userId ? ` (ID: ${invite.userId})` : ""}`
|
||||||
@ -193,8 +215,11 @@ function LogsTab({
|
|||||||
if (invite.status === "success") {
|
if (invite.status === "success") {
|
||||||
reason = "Успешно добавлен в группу";
|
reason = "Успешно добавлен в группу";
|
||||||
} else if (invite.status === "unconfirmed") {
|
} else if (invite.status === "unconfirmed") {
|
||||||
|
const isInviteLinkTarget = String(invite.targetChat || "").includes("t.me/+");
|
||||||
if (invite.confirmError && invite.confirmError.includes("USER_NOT_PARTICIPANT")) {
|
if (invite.confirmError && invite.confirmError.includes("USER_NOT_PARTICIPANT")) {
|
||||||
reason = "Инвайт отправлен, но пользователь ещё не вступил (нужно согласие/вход по ссылке)";
|
reason = isInviteLinkTarget
|
||||||
|
? "Инвайт отправлен, ожидаем вступление (цель по invite-ссылке)"
|
||||||
|
: "Инвайт отправлен, но пользователь ещё не вступил (нужно согласие/вход по ссылке)";
|
||||||
} else {
|
} else {
|
||||||
reason = explainRawError(invite.confirmError) || "Участие не подтверждено";
|
reason = explainRawError(invite.confirmError) || "Участие не подтверждено";
|
||||||
}
|
}
|
||||||
@ -250,6 +275,13 @@ function LogsTab({
|
|||||||
return "Ошибка";
|
return "Ошибка";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
const formatInviteStatusForRow = (invite) => {
|
||||||
|
if (!invite) return "—";
|
||||||
|
if (invite.status === "unconfirmed" && String(invite.targetChat || "").includes("t.me/+")) {
|
||||||
|
return "Ожидает вступления";
|
||||||
|
}
|
||||||
|
return formatInviteStatus(invite.status);
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section className="card logs">
|
<section className="card logs">
|
||||||
@ -527,7 +559,7 @@ function LogsTab({
|
|||||||
<div className="log-time">
|
<div className="log-time">
|
||||||
<div>{formatTimestamp(invite.invitedAt)}</div>
|
<div>{formatTimestamp(invite.invitedAt)}</div>
|
||||||
<div>
|
<div>
|
||||||
<span className={`log-status ${invite.status}`}>{formatInviteStatus(invite.status)}</span>
|
<span className={`log-status ${invite.status}`}>{formatInviteStatusForRow(invite)}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="log-details">
|
<div className="log-details">
|
||||||
@ -543,7 +575,7 @@ function LogsTab({
|
|||||||
</button>
|
</button>
|
||||||
{expandedInviteId === invite.id && (
|
{expandedInviteId === invite.id && (
|
||||||
<div className="invite-details">
|
<div className="invite-details">
|
||||||
<div><strong>Что случилось:</strong> {formatInviteStatus(invite.status)}</div>
|
<div><strong>Что случилось:</strong> {formatInviteStatusForRow(invite)}</div>
|
||||||
<div><strong>Почему:</strong> {buildUserReason(invite)}</div>
|
<div><strong>Почему:</strong> {buildUserReason(invite)}</div>
|
||||||
{suggestAction(invite) && (
|
{suggestAction(invite) && (
|
||||||
<div><strong>Что сделать:</strong> {suggestAction(invite).replace(/^Совет:\s*/, "")}</div>
|
<div><strong>Что сделать:</strong> {suggestAction(invite).replace(/^Совет:\s*/, "")}</div>
|
||||||
@ -607,7 +639,7 @@ function LogsTab({
|
|||||||
<div>Цель: {invite.targetChat || "—"}</div>
|
<div>Цель: {invite.targetChat || "—"}</div>
|
||||||
<div>Тип цели: {formatTargetType(invite.targetType)}</div>
|
<div>Тип цели: {formatTargetType(invite.targetType)}</div>
|
||||||
<div>Действие: {invite.action || "invite"}</div>
|
<div>Действие: {invite.action || "invite"}</div>
|
||||||
<div>Статус: {formatInviteStatus(invite.status)}</div>
|
<div>Статус: {formatInviteStatusForRow(invite)}</div>
|
||||||
<div>Результат: {formatErrorWithExplain(invite.skippedReason)}</div>
|
<div>Результат: {formatErrorWithExplain(invite.skippedReason)}</div>
|
||||||
<div>Ошибка: {formatErrorWithExplain(invite.error)}</div>
|
<div>Ошибка: {formatErrorWithExplain(invite.error)}</div>
|
||||||
{invite.confirmError && invite.confirmError.includes("(") && (
|
{invite.confirmError && invite.confirmError.includes("(") && (
|
||||||
@ -617,7 +649,7 @@ function LogsTab({
|
|||||||
&& selectedTask && selectedTask.randomAccounts && hasBothRoles(invite.watcherAccountId) && (
|
&& selectedTask && selectedTask.randomAccounts && hasBothRoles(invite.watcherAccountId) && (
|
||||||
<div>Примечание: у наблюдателя стоят обе роли, но включен случайный выбор — инвайт выполнен другим аккаунтом.</div>
|
<div>Примечание: у наблюдателя стоят обе роли, но включен случайный выбор — инвайт выполнен другим аккаунтом.</div>
|
||||||
)}
|
)}
|
||||||
<div>Пояснение: {explainRawError(invite.error) || explainRawError(invite.confirmError) || "Причина не определена"}</div>
|
<div>Пояснение: {buildDetailedExplanation(invite)}</div>
|
||||||
<div>Стратегия: {invite.strategy || "—"}</div>
|
<div>Стратегия: {invite.strategy || "—"}</div>
|
||||||
{invite.strategyMeta && !hasStrategySuccess(invite.strategyMeta) && (
|
{invite.strategyMeta && !hasStrategySuccess(invite.strategyMeta) && (
|
||||||
<div>Результат: все стратегии не сработали</div>
|
<div>Результат: все стратегии не сработали</div>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user