Files
better-genshin-impact/BetterGenshinImpact/Service/Notifier/WebhookNotifier.cs
禹仔二号 f7903f8e9b webhook添加了sendto发送对象,修复了webhook通知ui显示错误问题,修复了websocket服务端错误关闭链接问题 (#1300)
* 新增图片作为email附件发送功能

* feat(notification): 为 WebhookNotifier 添加 send_to 功能

- 在 WebhookNotifier 类中添加 send_to 属性
- 修改 TransformData 方法,增加 send_to 字段
- 在 NotificationConfig 中添加 webhook_endpoint 和 websocket_endpoint 属性

* refactor(WebhookNotifier): 添加 send_to 属性并调整访问修饰符

* refactor(notification): 重构 WebhookNotifier 并更新 NotificationConfig

- 在 NotificationConfig 中添加 WebhookSendTo 属性
- 重构 WebhookNotifier 构造函数,使用 NotificationConfig 对象进行初始化
- 更新 WebhookNotifier 发送逻辑,使用新的配置属性

* feat: add webhook ui.

* refactor(WebhookNotifier): 重构 TransformData 方法以优化数据结构- 将 notification_data 的内容合并到外层字典,以便于 webhook 接收端获取数据- 新增 event、result、timestamp 等字段,使数据结构

* fix(WebSocketNotifier): 添加消息发送后关闭连接的功能

- 在 SendAsync 方法中添加了 CloseAsync() 调用,确保消息发送后关闭 WebSocket 连接
- 此修改解决了消息发送后未关闭连接的问题,提高了资源利用率和系统稳定性

* fix: implement unified webhook ui

* fix: typos.

---------

Co-authored-by: DR-lin-eng <@DR-lin-eng>
Co-authored-by: 秋云 <physligl@gmail.com>
2025-03-15 10:33:33 +08:00

82 lines
2.7 KiB
C#

using BetterGenshinImpact.Service.Notifier.Exception;
using BetterGenshinImpact.Service.Notifier.Interface;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using BetterGenshinImpact.Service.Notification.Model;
using System.Collections.Generic;
using BetterGenshinImpact.Service.Notification; // 添加对 System.Collections.Generic 命名空间的引用
using BetterGenshinImpact.Service.Notification; // 添加对 NotificationConfig 类型的引用
namespace BetterGenshinImpact.Service.Notifier;
public class WebhookNotifier : INotifier
{
public string Name { get; set; } = "Webhook";
public string Endpoint { get; set; }
// 添加 send_to 属性
private string SendTo { get; set; }
private readonly HttpClient _httpClient;
private readonly JsonSerializerOptions _jsonSerializerOptions = new()
{
PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower,
};
public WebhookNotifier(HttpClient httpClient, NotificationConfig config)
{
_httpClient = httpClient;
Endpoint = config.WebhookEndpoint;
SendTo = config.WebhookSendTo; // 初始化 send_to 属性
}
public async Task SendAsync(BaseNotificationData content)
{
if (string.IsNullOrEmpty(Endpoint))
{
throw new NotifierException("Webhook 地址为空");
}
try
{
var response = await _httpClient.PostAsync(Endpoint, TransformData(content));
if (!response.IsSuccessStatusCode)
{
throw new NotifierException($"Webhook call failed with code: {response.StatusCode}");
}
}
catch (NotifierException)
{
throw;
}
catch (System.Exception ex)
{
throw new NotifierException($"Error sending webhook: {ex.Message}");
}
}
private StringContent TransformData(BaseNotificationData notificationData)
{
// 使用 SendTo 属性来设置 send_to 字段,并将 notification_data 的内容合并到外层字典
var dataToSend = new Dictionary<string, object>
{
{ "send_to", SendTo },
{ "event", notificationData.Event },
{ "result", notificationData.Result },
{ "timestamp", notificationData.Timestamp },
{ "screenshot", notificationData.Screenshot },
{ "message", notificationData.Message },
{ "data", notificationData.Data }
};
var serializedData = JsonSerializer.Serialize(dataToSend, _jsonSerializerOptions);
return new StringContent(serializedData, Encoding.UTF8, "application/json");
}
}