mirror of
https://github.com/Kizuren/QuizConnect.git
synced 2025-12-21 13:06:15 +01:00
Improved discord webhook management
This commit is contained in:
parent
4071153754
commit
bdda63089f
2 changed files with 46 additions and 14 deletions
|
|
@ -6,9 +6,10 @@ namespace WritingServer.Services;
|
||||||
public interface IDiscordNotificationService
|
public interface IDiscordNotificationService
|
||||||
{
|
{
|
||||||
Task SendStartupNotification(TimeSpan startupTime, long memoryUsageMb);
|
Task SendStartupNotification(TimeSpan startupTime, long memoryUsageMb);
|
||||||
Task SendResponseNotification(string username, string questionSetName, string questionText, string responseText);
|
Task SendResponseNotification(string username, string questionSetName,
|
||||||
|
Dictionary<string, string> response);
|
||||||
Task SendExceptionNotification(string path);
|
Task SendExceptionNotification(string path);
|
||||||
Task SendDiscordMessage(string content);
|
Task SendDiscordMessage(string content, string username);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class DiscordNotificationService : IDiscordNotificationService
|
public class DiscordNotificationService : IDiscordNotificationService
|
||||||
|
|
@ -27,10 +28,15 @@ public class DiscordNotificationService : IDiscordNotificationService
|
||||||
await SendDiscordMessage($"Backend warmed up!\nTook {startupTime.TotalSeconds:F2} seconds.\nMemory usage: {memoryUsageMb} MB");
|
await SendDiscordMessage($"Backend warmed up!\nTook {startupTime.TotalSeconds:F2} seconds.\nMemory usage: {memoryUsageMb} MB");
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task SendResponseNotification(string username, string questionSetName, string questionText, string responseText)
|
public async Task SendResponseNotification(string username, string questionSetName,
|
||||||
|
Dictionary<string, string> response)
|
||||||
{
|
{
|
||||||
var message = $"New Response:\n**User:** {username}\n**Question Set:** {questionSetName}\n**Question:** {questionText}\n**Response:** {responseText}";
|
var message = $"**{questionSetName}**\n**Question:**\n";
|
||||||
await SendDiscordMessage(message);
|
foreach (var item in response)
|
||||||
|
{
|
||||||
|
message += $"**{item.Key}** {item.Value}\n";
|
||||||
|
}
|
||||||
|
await SendDiscordMessage(message, username);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task SendExceptionNotification(string path)
|
public async Task SendExceptionNotification(string path)
|
||||||
|
|
@ -39,14 +45,22 @@ public class DiscordNotificationService : IDiscordNotificationService
|
||||||
await SendDiscordMessage(message);
|
await SendDiscordMessage(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task SendDiscordMessage(string content)
|
public async Task SendDiscordMessage(string content, string? username = null)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(_webhookUrl))
|
if (string.IsNullOrEmpty(_webhookUrl))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var payload = new { content };
|
object payload;
|
||||||
|
if (!string.IsNullOrEmpty(username))
|
||||||
|
{
|
||||||
|
payload = new { content, username };
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
payload = new { content };
|
||||||
|
}
|
||||||
var json = JsonSerializer.Serialize(payload);
|
var json = JsonSerializer.Serialize(payload);
|
||||||
var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
|
var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -210,15 +210,33 @@ public class QuestionManagementService : IQuestionManagementService
|
||||||
|
|
||||||
await _responsesCollection.InsertOneAsync(response);
|
await _responsesCollection.InsertOneAsync(response);
|
||||||
|
|
||||||
// Discord webhook
|
|
||||||
var question = await GetQuestionByIdAsync(questionId);
|
|
||||||
string questionSetId = questionId.Split('_')[0];
|
string questionSetId = questionId.Split('_')[0];
|
||||||
var questionSet = await GetQuestionSetByIdAsync(questionSetId);
|
var questionSet = await GetQuestionSetByIdAsync(questionSetId);
|
||||||
await _discordNotificationService.SendResponseNotification(
|
|
||||||
userName,
|
var allQuestionsInSet = await GetQuestionsInSetAsync(questionSetId);
|
||||||
questionSet?.QuestionSetName ?? "Unknown Set",
|
var userResponses = await _responsesCollection
|
||||||
question?.QuestionText ?? "Unknown Question",
|
.Find(r => r.UserName == userName && r.QuestionId.StartsWith(questionSetId + "_"))
|
||||||
responseText);
|
.ToListAsync();
|
||||||
|
|
||||||
|
var answeredQuestionIds = userResponses.Select(r => r.QuestionId).ToHashSet();
|
||||||
|
|
||||||
|
if (allQuestionsInSet.Questions.All(q => answeredQuestionIds.Contains(q.QuestionId)))
|
||||||
|
{
|
||||||
|
var responseDict = new Dictionary<string, string>();
|
||||||
|
foreach (var q in allQuestionsInSet.Questions.OrderBy(q => q.QuestionOrder))
|
||||||
|
{
|
||||||
|
var userResponse = userResponses.FirstOrDefault(r => r.QuestionId == q.QuestionId);
|
||||||
|
if (userResponse != null)
|
||||||
|
{
|
||||||
|
responseDict[q.QuestionText] = userResponse.ResponseText;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await _discordNotificationService.SendResponseNotification(
|
||||||
|
userName,
|
||||||
|
questionSet?.QuestionSetName ?? "Unknown Set",
|
||||||
|
responseDict);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue