Add config entries for interviews

This commit is contained in:
Toastie 2024-12-26 23:47:55 +13:00
parent b02aacadd6
commit 3d2d987dfe
Signed by: toastie_t0ast
GPG key ID: 27F3B6855AFD40A4
4 changed files with 46 additions and 8 deletions

View file

@ -114,7 +114,9 @@ public class NewCommand
return (false, "You cannot use this command in a ticket channel."); return (false, "You cannot use this command in a ticket channel.");
} }
if (!Database.IsStaff(userID) && Database.TryGetOpenTickets(userID, out List<Database.Ticket> ownTickets) && ownTickets.Count >= Config.ticketLimit) if (!Database.IsStaff(userID)
&& Database.TryGetOpenTickets(userID, out List<Database.Ticket> ownTickets)
&& (ownTickets.Count >= Config.ticketLimit && Config.ticketLimit != 0))
{ {
return (false, "You have reached the limit for maximum open tickets."); return (false, "You have reached the limit for maximum open tickets.");
} }
@ -187,6 +189,7 @@ public class NewCommand
} }
DiscordMessage message = await ticketChannel.SendMessageAsync("Hello, " + member.Mention + "!\n" + Config.welcomeMessage); DiscordMessage message = await ticketChannel.SendMessageAsync("Hello, " + member.Mention + "!\n" + Config.welcomeMessage);
if (Config.pinFirstMessage) if (Config.pinFirstMessage)
{ {
try try
@ -202,6 +205,11 @@ public class NewCommand
// Refreshes the channel as changes were made to it above // Refreshes the channel as changes were made to it above
ticketChannel = await SupportChild.client.GetChannelAsync(ticketChannel.Id); ticketChannel = await SupportChild.client.GetChannelAsync(ticketChannel.Id);
if (Config.interviewsEnabled)
{
Interviewer.StartInterview(ticketChannel);
}
if (staffID != 0) if (staffID != 0)
{ {
await ticketChannel.SendMessageAsync(new DiscordEmbedBuilder await ticketChannel.SendMessageAsync(new DiscordEmbedBuilder

View file

@ -26,6 +26,10 @@ internal static class Config
internal static bool assignmentNotifications = false; internal static bool assignmentNotifications = false;
internal static bool closingNotifications = false; internal static bool closingNotifications = false;
internal static bool interviewsEnabled = false;
internal static bool deleteMessagesAfterSummary = false;
internal static bool deleteMessagesAfterNoSummary = false;
internal static string hostName = "127.0.0.1"; internal static string hostName = "127.0.0.1";
internal static int port = 3306; internal static int port = 3306;
internal static string database = "supportchild"; internal static string database = "supportchild";
@ -69,16 +73,15 @@ internal static class Config
if (!Enum.TryParse(stringLogLevel, true, out LogLevel logLevel)) if (!Enum.TryParse(stringLogLevel, true, out LogLevel logLevel))
{ {
logLevel = LogLevel.Information; logLevel = LogLevel.Information;
Logger.Warn("Log level '" + stringLogLevel + "' invalid, using 'Information' instead."); Logger.Warn("Log level '" + stringLogLevel + "' is invalid, using 'Information' instead.");
} }
Logger.SetLogLevel(logLevel); Logger.SetLogLevel(logLevel);
string stringTimestampFormat = json.SelectToken("bot.timestamp-format")?.Value<string>() ?? "RelativeTime"; string stringTimestampFormat = json.SelectToken("bot.timestamp-format")?.Value<string>() ?? "RelativeTime";
if (!Enum.TryParse(stringTimestampFormat, true, out timestampFormat)) if (!Enum.TryParse(stringTimestampFormat, true, out timestampFormat))
{ {
timestampFormat = TimestampFormat.RelativeTime; timestampFormat = TimestampFormat.RelativeTime;
Logger.Warn("Timestamp '" + stringTimestampFormat + "' invalid, using 'RelativeTime' instead."); Logger.Warn("Timestamp '" + stringTimestampFormat + "' is invalid, using 'RelativeTime' instead.");
} }
randomAssignment = json.SelectToken("bot.random-assignment")?.Value<bool>() ?? false; randomAssignment = json.SelectToken("bot.random-assignment")?.Value<bool>() ?? false;
@ -94,6 +97,10 @@ internal static class Config
assignmentNotifications = json.SelectToken("notifications.assignment")?.Value<bool>() ?? false; assignmentNotifications = json.SelectToken("notifications.assignment")?.Value<bool>() ?? false;
closingNotifications = json.SelectToken("notifications.closing")?.Value<bool>() ?? false; closingNotifications = json.SelectToken("notifications.closing")?.Value<bool>() ?? false;
interviewsEnabled = json.SelectToken("interviews.enabled")?.Value<bool>() ?? false;
deleteMessagesAfterSummary = json.SelectToken("interviews.delete-messages-after-summary")?.Value<bool>() ?? false;
deleteMessagesAfterNoSummary = json.SelectToken("interviews.delete-messages-after-no-summary")?.Value<bool>() ?? false;
// Reads database info // Reads database info
hostName = json.SelectToken("database.address")?.Value<string>() ?? ""; hostName = json.SelectToken("database.address")?.Value<string>() ?? "";
port = json.SelectToken("database.port")?.Value<int>() ?? 3306; port = json.SelectToken("database.port")?.Value<int>() ?? 3306;

View file

@ -352,7 +352,11 @@ public static class Interviewer
{ {
if (Database.TryGetInterview(command.Channel.Id, out InterviewQuestion interviewRoot)) if (Database.TryGetInterview(command.Channel.Id, out InterviewQuestion interviewRoot))
{ {
await DeletePreviousMessages(interviewRoot, command.Channel); if (Config.deleteMessagesAfterNoSummary)
{
await DeletePreviousMessages(interviewRoot, command.Channel);
}
if (!Database.TryDeleteInterview(command.Channel.Id)) if (!Database.TryDeleteInterview(command.Channel.Id))
{ {
Logger.Error("Could not delete interview from database. Channel ID: " + command.Channel.Id); Logger.Error("Could not delete interview from database. Channel ID: " + command.Channel.Id);
@ -624,7 +628,11 @@ public static class Interviewer
await channel.SendMessageAsync(embed); await channel.SendMessageAsync(embed);
await DeletePreviousMessages(interviewRoot, channel); if (Config.deleteMessagesAfterSummary)
{
await DeletePreviousMessages(interviewRoot, channel);
}
if (!Database.TryDeleteInterview(channel.Id)) if (!Database.TryDeleteInterview(channel.Id))
{ {
Logger.Error("Could not delete interview from database. Channel ID: " + channel.Id); Logger.Error("Could not delete interview from database. Channel ID: " + channel.Id);
@ -638,7 +646,11 @@ public static class Interviewer
Description = nextQuestion.message Description = nextQuestion.message
}); });
await DeletePreviousMessages(interviewRoot, channel); if (Config.deleteMessagesAfterNoSummary)
{
await DeletePreviousMessages(interviewRoot, channel);
}
if (!Database.TryDeleteInterview(channel.Id)) if (!Database.TryDeleteInterview(channel.Id))
{ {
Logger.Error("Could not delete interview from database. Channel ID: " + channel.Id); Logger.Error("Could not delete interview from database. Channel ID: " + channel.Id);

View file

@ -48,11 +48,22 @@ notifications:
ticket-updated-delay: 0.5 ticket-updated-delay: 0.5
# Notifies staff when they are assigned to tickets. # Notifies staff when they are assigned to tickets.
assignment: true assignment: true # TODO: Add option to be notified only when the initial interview is finished.
# Notifies the user opening the ticket that their ticket was closed and includes the transcript. # Notifies the user opening the ticket that their ticket was closed and includes the transcript.
closing: true closing: true
interviews: # TODO: Implement
# Enable the interview system. You must use the admin commands to set up interview templates before you can start using it.
# Any existing interviews can still be completed while interviews are disabled, but new ones will not be created.
enabled: true
# Whether to delete the interview question and answer messages after an interview summary is posted.
delete-messages-after-summary: true
# Whether to delete the interview question and answer messages after an interview ends without a summary.
delete-messages-after-no-summary: true
database: database:
# Address and port of the mysql server. # Address and port of the mysql server.
address: "127.0.0.1" address: "127.0.0.1"