Compare commits

..

No commits in common. "874a2db85326c3de220d033417acb9c19fa80c26" and "425b4724d288f0ccc2f7a86e09d4d06bf24d9fa1" have entirely different histories.

3 changed files with 33 additions and 55 deletions

View file

@ -827,8 +827,23 @@ export async function executeAutoPick(params: {
logger.error("[AutoPick] Error updating Brackt EVs after pick:", error);
}
// Announce before triggering the chain so Discord messages arrive in pick-number
// order. If the chain ran first, chained picks would announce before this one.
// Check if next team has autodraft enabled and trigger immediately
// Only run the chain from the top-level call to prevent recursion
if (!isDraftComplete && params.chainEnabled !== false) {
await checkAndTriggerNextAutodraft({
seasonId,
nextPickNumber,
totalTeams,
draftSlots,
db,
});
// Fire-and-forget: sendOnTheClockEmail fetches the current pick number from
// the DB itself, so it always sees the post-chain state without blocking here.
sendOnTheClockEmail({ seasonId, totalTeams, draftSlots, db })
.catch((err) => logger.error("[AutoPick] On-the-clock email failed:", err));
}
const pickedSlot = draftSlots.find((s) => s.teamId === teamId);
if (!pickedSlot) {
logger.warn(`[AutoPick] Skipping Discord pick announcement: no draft slot found for team ${teamId}`);
@ -850,23 +865,6 @@ export async function executeAutoPick(params: {
}).catch((err) => logger.error("[AutoPick] Discord pick announcement failed:", err));
}
// Check if next team has autodraft enabled and trigger immediately
// Only run the chain from the top-level call to prevent recursion
if (!isDraftComplete && params.chainEnabled !== false) {
await checkAndTriggerNextAutodraft({
seasonId,
nextPickNumber,
totalTeams,
draftSlots,
db,
});
// Fire-and-forget: sendOnTheClockEmail fetches the current pick number from
// the DB itself, so it always sees the post-chain state without blocking here.
sendOnTheClockEmail({ seasonId, totalTeams, draftSlots, db })
.catch((err) => logger.error("[AutoPick] On-the-clock email failed:", err));
}
return {
success: true,
pick: draftPick,

View file

@ -303,24 +303,6 @@ export async function action(args: ActionFunctionArgs) {
logger.error("Socket.IO error:", error);
}
// Announce before triggering the chain so Discord messages arrive in pick-number
// order. If the chain ran first, chained picks would announce before this one.
notifyPickMadeOnDiscord({
seasonId,
leagueId: season.leagueId,
pickedTeamName: currentDraftSlot.team.name,
participantName: participant.name,
sportName: participant.sportsSeason.sport.name,
pickNumber: currentPickNumber,
nextPickNumber,
round: currentRound,
rawPickInRound,
isDraftComplete,
totalTeams,
draftSlots: draftSlots.map((s) => ({ teamId: s.teamId, draftOrder: s.draftOrder })),
db,
}).catch((err) => logger.error("Discord pick announcement failed:", err));
// Check if next team has autodraft enabled and trigger immediately
if (!isDraftComplete) {
try {
@ -349,6 +331,22 @@ export async function action(args: ActionFunctionArgs) {
.catch((err) => logger.error("On-the-clock email failed:", err));
}
notifyPickMadeOnDiscord({
seasonId,
leagueId: season.leagueId,
pickedTeamName: currentDraftSlot.team.name,
participantName: participant.name,
sportName: participant.sportsSeason.sport.name,
pickNumber: currentPickNumber,
nextPickNumber,
round: currentRound,
rawPickInRound,
isDraftComplete,
totalTeams,
draftSlots: draftSlots.map((s) => ({ teamId: s.teamId, draftOrder: s.draftOrder })),
db,
}).catch((err) => logger.error("Discord pick announcement failed:", err));
return Response.json({
success: true,
pick: draftPick,

View file

@ -24,24 +24,6 @@ export async function sendDiscordWebhook(
body: JSON.stringify(payload),
});
if (response.status === 429) {
// Cap at 10 s so awaited callers (e.g. settings actions) are never hung for
// a full Discord global-rate-limit window. Use || 1 instead of ?? 1 so that
// NaN (non-numeric header) and 0 both fall back to a 1-second default.
const retryAfterSeconds = Math.min(Number(response.headers.get("Retry-After")) || 1, 10);
await new Promise((r) => setTimeout(r, retryAfterSeconds * 1000));
const retry = await fetch(webhookUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload),
});
if (!retry.ok) {
const text = await retry.text().catch(() => "");
throw new Error(`Discord webhook failed after retry: ${retry.status} ${text}`);
}
return;
}
if (!response.ok) {
const text = await response.text().catch(() => "");
throw new Error(`Discord webhook failed: ${response.status} ${text}`);