telegram-invite-automation/src/renderer/hooks/useTaskPresets.js
2026-02-01 14:39:30 +04:00

133 lines
5.2 KiB
JavaScript

import { buildPresetSignature } from "../utils/presets.js";
import { sanitizeTaskForm } from "../appDefaults.js";
export default function useTaskPresets({
hasSelectedTask,
accounts,
selectedAccountIds,
taskForm,
setTaskForm,
setTaskAccountRoles,
setSelectedAccountIds,
persistAccountRoles,
showNotification,
setTaskNotice,
setActivePreset,
setActiveTab,
selectedTaskId,
presetSignatureRef
}) {
const applyTaskPreset = (type) => {
if (!hasSelectedTask) {
showNotification("Сначала выберите задачу.", "error");
return;
}
if (!accounts.length) {
showNotification("Нет доступных аккаунтов.", "error");
return;
}
const masterId = accounts[0].id;
const requiredCount = 3;
const baseIds = selectedAccountIds.length >= requiredCount
? selectedAccountIds.slice()
: accounts.map((account) => account.id);
if (baseIds.length < 3) {
showNotification("Для раздельных ролей желательно минимум 3 аккаунта (мониторинг/инвайт/подтверждение).", "info");
}
if (!baseIds.includes(masterId)) {
baseIds.unshift(masterId);
}
const pool = baseIds.filter((id) => id !== masterId);
const roleMap = {};
const addRole = (id, role) => {
if (!id) return;
if (!roleMap[id]) roleMap[id] = { monitor: false, invite: false, confirm: false, inviteLimit: 0 };
roleMap[id][role] = true;
if (role === "invite" && (!roleMap[id].inviteLimit || roleMap[id].inviteLimit === 0)) {
roleMap[id].inviteLimit = 1;
}
};
const takeFromPool = (count, used) => {
const result = [];
for (const id of pool) {
if (result.length >= count) break;
if (used.has(id)) continue;
used.add(id);
result.push(id);
}
return result;
};
const used = new Set();
const isSoft = type === "soft_50" || type === "soft_50_admin" || type === "soft_25" || type === "soft_25_admin";
const isSoft25 = type === "soft_25" || type === "soft_25_admin";
const monitorCount = 1;
const inviteCount = isSoft ? (isSoft25 ? 2 : 5) : 1;
const confirmCount = 1;
const monitorIds = takeFromPool(monitorCount, used);
const confirmIds = takeFromPool(confirmCount, used);
const inviteIds = masterId ? [masterId] : takeFromPool(inviteCount, used);
if (monitorIds.length < monitorCount) addRole(masterId, "monitor");
if (confirmIds.length < confirmCount) addRole(masterId, "confirm");
monitorIds.forEach((id) => addRole(id, "monitor"));
confirmIds.forEach((id) => addRole(id, "confirm"));
inviteIds.forEach((id) => addRole(id, "invite"));
const nextForm = sanitizeTaskForm({
...taskForm,
warmupEnabled: true,
historyLimit: 35,
separateBotRoles: true,
requireSameBotInBoth: false,
maxCompetitorBots: 1,
maxOurBots: isSoft ? (isSoft25 ? 2 : 5) : 1,
separateConfirmRoles: true,
maxConfirmBots: isSoft ? 1 : 1,
inviteViaAdmins: type === "admin" || type === "soft_50_admin" || type === "soft_25_admin",
inviteAdminAnonymous: true,
inviteAdminMasterId: masterId,
rolesMode: "auto",
dailyLimit: isSoft ? (isSoft25 ? 25 : 50) : taskForm.dailyLimit,
maxInvitesPerCycle: isSoft ? (isSoft25 ? 2 : 5) : taskForm.maxInvitesPerCycle,
minIntervalMinutes: isSoft ? 3 : taskForm.minIntervalMinutes,
maxIntervalMinutes: isSoft ? 6 : taskForm.maxIntervalMinutes,
retryOnFail: isSoft ? true : taskForm.retryOnFail,
stopOnBlocked: isSoft ? true : taskForm.stopOnBlocked,
stopBlockedPercent: isSoft ? 25 : taskForm.stopBlockedPercent,
randomAccounts: isSoft ? false : taskForm.randomAccounts,
multiAccountsPerRun: isSoft ? false : taskForm.multiAccountsPerRun,
inviteLinkOnFail: isSoft ? false : taskForm.inviteLinkOnFail,
allowStartWithoutInviteRights: isSoft ? false : taskForm.allowStartWithoutInviteRights
});
const signature = buildPresetSignature(nextForm, roleMap);
presetSignatureRef.current = signature;
const label = type === "admin"
? "Автораспределение + Инвайт через админа"
: type === "no_admin"
? "Автораспределение + Без админки"
: type === "soft_50_admin"
? "Мягкий 50/день + Инвайт через админов"
: type === "soft_25_admin"
? "Мягкий 25/день + Инвайт через админов"
: type === "soft_25"
? "Мягкий 25/день (2 инвайтера)"
: "Мягкий режим 50/день (5 инвайтеров)";
setTaskForm(nextForm);
setTaskAccountRoles(roleMap);
setSelectedAccountIds(Object.keys(roleMap).map((id) => Number(id)));
persistAccountRoles(roleMap);
if (window.api) {
window.api.addAccountEvent({
accountId: 0,
phone: "",
action: "preset_applied",
details: `задача ${selectedTaskId}: ${label}`
});
}
setTaskNotice({ text: `Пресет: ${label}`, tone: "success", source: "task" });
setActivePreset(type);
setActiveTab("events");
};
return { applyTaskPreset };
}