Fixed bug where references didn't work in the first step

This commit is contained in:
Toastie 2025-02-04 19:42:02 +13:00
parent d43cfecb29
commit 6d71918cd5
Signed by: toastie_t0ast
GPG key ID: 0861BE54AD481DC7

View file

@ -19,23 +19,28 @@ public static class Interviewer
return false; return false;
} }
if (!ConvertReferences(interview, interview.interviewRoot, out string errID))
{
DiscordMessage errorMessage = await channel.SendMessageAsync(new DiscordEmbedBuilder
{
Description = "Error: Could not start interview, the referenced step id '" + errID + "' does not exist in the interview template step definitions.",
Color = DiscordColor.Red
});
interview.interviewRoot.AddRelatedMessageIDs(errorMessage.Id);
Database.SaveInterview(interview);
return false;
}
await SendNextMessage(interview, channel, interview.interviewRoot); await SendNextMessage(interview, channel, interview.interviewRoot);
return Database.SaveInterview(interview); return Database.SaveInterview(interview);
} }
public static async Task<bool> RestartInterview(DiscordChannel channel) public static async Task<bool> RestartInterview(DiscordChannel channel)
{ {
if (Database.TryGetInterview(channel.Id, out Interview interview)) if (!await StopInterview(channel))
{ {
if (Config.deleteMessagesAfterInterviewEnd) Logger.Error("Failed to stop interview in channel '" + channel.Id + "'.");
{ return false;
await DeletePreviousMessages(interview, channel);
}
if (!Database.TryDeleteInterview(channel.Id))
{
Logger.Warn("Could not delete interview from database. Channel ID: " + channel.Id);
}
} }
return await StartInterview(channel); return await StartInterview(channel);
@ -211,7 +216,7 @@ public static class Interviewer
} }
} }
public static bool TryGetStepFromReference(Interview interview, ReferencedInterviewStep reference, out InterviewStep step) private static bool TryGetStepFromReference(Interview interview, ReferencedInterviewStep reference, out InterviewStep step)
{ {
foreach (KeyValuePair<string, InterviewStep> definition in interview.definitions) foreach (KeyValuePair<string, InterviewStep> definition in interview.definitions)
{ {
@ -339,28 +344,22 @@ public static class Interviewer
case MessageType.USER_SELECTOR: case MessageType.USER_SELECTOR:
case MessageType.CHANNEL_SELECTOR: case MessageType.CHANNEL_SELECTOR:
case MessageType.MENTIONABLE_SELECTOR: case MessageType.MENTIONABLE_SELECTOR:
foreach ((string stepPattern, ReferencedInterviewStep reference) in nextStep.references) if (!ConvertReferences(interview, nextStep, out string errID))
{ {
if (!reference.TryGetReferencedStep(interview.definitions, out InterviewStep step)) if (answerMessage != null)
{ {
if (answerMessage != null) DiscordMessage errorMessage = await answerMessage.RespondAsync(new DiscordEmbedBuilder
{ {
DiscordMessage lengthMessage = await answerMessage.RespondAsync(new DiscordEmbedBuilder Description = "Error: The referenced step id '" + errID + "' does not exist in the step definitions.",
{ Color = DiscordColor.Red
Description = "Error: The referenced step id '" + reference.id + "' does not exist in the step definitions.", });
Color = DiscordColor.Red nextStep.AddRelatedMessageIDs(answerMessage.Id, errorMessage.Id);
}); previousStep.answer = null;
nextStep.AddRelatedMessageIDs(answerMessage.Id, lengthMessage.Id); previousStep.answerID = 0;
previousStep.answer = null; Database.SaveInterview(interview);
previousStep.answerID = 0;
Database.SaveInterview(interview);
}
return;
} }
return;
nextStep.steps.Add(stepPattern, step);
} }
nextStep.references.Clear();
await SendNextMessage(interview, channel, nextStep); await SendNextMessage(interview, channel, nextStep);
Database.SaveInterview(interview); Database.SaveInterview(interview);
@ -477,6 +476,23 @@ public static class Interviewer
} }
} }
private static bool ConvertReferences(Interview interview, InterviewStep step, out string errorID)
{
foreach ((string stepPattern, ReferencedInterviewStep reference) in step.references)
{
if (!reference.TryGetReferencedStep(interview.definitions, out InterviewStep referencedStep))
{
errorID = reference.id;
return false;
}
step.steps.Add(stepPattern, referencedStep);
}
step.references.Clear();
errorID = "";
return true;
}
private static async Task DeletePreviousMessages(Interview interview, DiscordChannel channel) private static async Task DeletePreviousMessages(Interview interview, DiscordChannel channel)
{ {
List<ulong> previousMessages = []; List<ulong> previousMessages = [];