using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace Ink_Canvas.Helpers { /// /// Dlass上传队列 /// public class DlassUploadQueue : BaseUploadQueue { private const string APP_ID = "app_WkjocWqsrVY7T6zQV2CfiA"; private const string APP_SECRET = "o7dx5b5ASGUMcM72PCpmRQYAhSijqaOVHoGyBK0IxbA"; /// /// 队列文件名 /// protected override string QueueFileName => "DlassUploadQueue.json"; /// /// 上传笔记响应模型 /// public class UploadNoteResponse { [JsonProperty("success")] public bool Success { get; set; } [JsonProperty("message")] public string Message { get; set; } [JsonProperty("note_id")] public int? NoteId { get; set; } [JsonProperty("filename")] public string Filename { get; set; } [JsonProperty("file_path")] public string FilePath { get; set; } [JsonProperty("file_url")] public string FileUrl { get; set; } } /// /// 白板信息模型(用于查找白板) /// private class WhiteboardInfo { [JsonProperty("id")] public int Id { get; set; } [JsonProperty("name")] public string Name { get; set; } [JsonProperty("board_id")] public string BoardId { get; set; } [JsonProperty("secret_key")] public string SecretKey { get; set; } [JsonProperty("class_name")] public string ClassName { get; set; } [JsonProperty("class_id")] public int ClassId { get; set; } } /// /// 认证响应模型 /// private class AuthWithTokenResponse { [JsonProperty("success")] public bool Success { get; set; } [JsonProperty("whiteboards")] public List Whiteboards { get; set; } } /// /// 检查上传是否启用 /// protected override bool IsUploadEnabled() { return MainWindow.Settings?.Dlass?.IsAutoUploadNotes == true; } /// /// 内部上传方法,执行实际上传操作 /// protected override async Task UploadFileInternalAsync(string filePath, CancellationToken cancellationToken) { try { cancellationToken.ThrowIfCancellationRequested(); // 再次检查文件是否存在(可能在队列等待时被删除) if (!File.Exists(filePath)) { return false; } // 获取白板信息 var whiteboard = await GetWhiteboardInfo(cancellationToken); if (whiteboard == null) { return false; } // 获取API基础URL和用户Token var apiBaseUrl = MainWindow.Settings?.Dlass?.ApiBaseUrl ?? "https://dlass.tech"; var userToken = MainWindow.Settings?.Dlass?.UserToken; // 准备上传参数 var fileName = Path.GetFileNameWithoutExtension(filePath); var fileExtension = Path.GetExtension(filePath).ToLower(); var title = fileName; string fileType; string tags; if (fileExtension == ".zip") { fileType = "多页面墨迹压缩包"; tags = "自动上传,多页面,zip,压缩包"; } else if (fileExtension == ".icstk") { fileType = "墨迹文件"; tags = "自动上传,墨迹,icstk"; } else if (fileExtension == ".xml") { fileType = "XML文件"; tags = "自动上传,xml"; } else { fileType = "笔记"; tags = "自动上传,笔记,png"; } var description = $"自动上传的{fileType} - {DateTime.Now:yyyy-MM-dd HH:mm:ss}"; // 创建API客户端并上传文件 var apiClient = new DlassApiClient(APP_ID, APP_SECRET, apiBaseUrl, userToken); try { cancellationToken.ThrowIfCancellationRequested(); var uploadResult = await apiClient.UploadNoteAsync( "/api/whiteboard/upload_note", filePath, whiteboard.BoardId, whiteboard.SecretKey, title, description, tags, cancellationToken); if (uploadResult != null && uploadResult.Success) { return true; } else { return false; } } finally { apiClient.Dispose(); } } catch (OperationCanceledException) { throw; } catch (Exception) { throw; } } /// /// 获取白板信息 /// private async Task GetWhiteboardInfo(CancellationToken cancellationToken) { try { cancellationToken.ThrowIfCancellationRequested(); var selectedClassName = MainWindow.Settings?.Dlass?.SelectedClassName; if (string.IsNullOrEmpty(selectedClassName)) { LogHelper.WriteLogToFile("[DlassUploadQueue] 上传失败:未选择班级", LogHelper.LogType.Error); return null; } var userToken = MainWindow.Settings?.Dlass?.UserToken; if (string.IsNullOrEmpty(userToken)) { LogHelper.WriteLogToFile("[DlassUploadQueue] 上传失败:未设置用户Token", LogHelper.LogType.Error); return null; } var apiBaseUrl = MainWindow.Settings?.Dlass?.ApiBaseUrl ?? "https://dlass.tech"; // 创建API客户端并获取白板信息 var apiClient = new DlassApiClient(APP_ID, APP_SECRET, apiBaseUrl, userToken); try { var authData = new { app_id = APP_ID, app_secret = APP_SECRET, user_token = userToken }; var authResult = await apiClient.PostAsync("/api/whiteboard/framework/auth-with-token", authData, requireAuth: false, cancellationToken: cancellationToken); if (authResult == null || !authResult.Success || authResult.Whiteboards == null) { LogHelper.WriteLogToFile("[DlassUploadQueue] 上传失败:无法获取白板信息", LogHelper.LogType.Error); return null; } // 查找匹配班级的白板 var whiteboard = authResult.Whiteboards .FirstOrDefault(w => !string.IsNullOrEmpty(w.ClassName) && w.ClassName == selectedClassName); if (whiteboard == null || string.IsNullOrEmpty(whiteboard.BoardId) || string.IsNullOrEmpty(whiteboard.SecretKey)) { LogHelper.WriteLogToFile($"[DlassUploadQueue] 上传失败:未找到班级'{selectedClassName}'对应的白板", LogHelper.LogType.Error); return null; } return whiteboard; } finally { apiClient.Dispose(); } } catch (OperationCanceledException) { throw; } catch (Exception) { return null; } } } }