网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
using System.Text;
using Dpz.Core.Service.Network;
using Dpz.Core.Service.Network.Models;
using Dpz.Core.Service.RepositoryService;
using Hangfire;
using JetBrains.Annotations;
using Medallion.Threading;
using Microsoft.Extensions.Logging;

namespace Dpz.Core.Hangfire;

[UsedImplicitly]
public class AnalyzeCodeActivator(
    AnalyzeService analyzeService,
    ICodeNoteService codeNoteService,
    IDistributedLockProvider distributedLockProvider,
    ILogger<AnalyzeCodeActivator> logger
) : JobActivator
{
    /// <summary>
    /// analyze code
    /// </summary>
    /// <param name="codeContent"></param>
    /// <param name="path"></param>
    /// <param name="fileName"></param>
    [ProlongExpirationTime]
    public async Task AnalyzeAsync(string codeContent, string[] path, string fileName)
    {
        var key = new List<string>(path) { fileName };
        if (GetContentLineCount(codeContent) < 50)
        {
            return;
        }

        var keyParts = new List<string>(path) { fileName };
        var subKey = Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Join("\0", keyParts)));
        var lockKey = $"AI_Analyze.Code.Lock:{subKey}";
        await using (await distributedLockProvider.AcquireLockAsync(lockKey))
        {
            var codeNote = await codeNoteService.FindAsync(path, fileName);
            if (!string.IsNullOrWhiteSpace(codeNote?.AiAnalyzeResult))
            {
                return;
            }

            var prompt = new StringBuilder(codeContent)
                .AppendLine()
                .AppendLine()
                .Append("请解释一下上述代码的功能")
                .ToString();
            var result = await analyzeService.ChatAsync(
                [
                    new ChatMessage
                    {
                        Role = "system",
                        Message = "你是一个经验丰富且专业的开发人员",
                    },
                    new ChatMessage { Role = "user", Message = prompt },
                ]
            );

            if (result is { Success: true, Data: not null })
            {
                logger.LogInformation(
                    "AI分析成功 | Path:{@Path} File:{FileName},Data:{@Data}",
                    path,
                    fileName,
                    result.Data
                );
                await codeNoteService.SaveAiAnalyzeResultAsync(path, fileName, result.Data);
                return;
            }

            logger.LogWarning(
                "AI分析失败 | 错误信息:{Message} | Path:{@Path} File:{FileName}",
                result.Message,
                path,
                fileName
            );
        }
    }

    private static int GetContentLineCount(string codeContent)
    {
        return codeContent.Split(["\r\n", "\r", "\n"], StringSplitOptions.None).Length;
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这段代码定义了一个名为 AnalyzeCodeActivator 的类,它是一个 Hangfire 任务激活器,主要用于分析代码并生成相应的注释或解释。以下是代码的主要功能和结构的详细解释:

类和构造函数

  • 类定义: AnalyzeCodeActivator 继承自 JobActivator,用于在 Hangfire 中激活任务。
  • 构造函数: 接受四个参数:
    • AnalyzeService analyzeService: 用于与 AI 分析服务交互。
    • ICodeNoteService codeNoteService: 用于处理代码注释的服务。
    • IDistributedLockProvider distributedLockProvider: 用于提供分布式锁的服务,确保在并发情况下的安全性。
    • ILogger<AnalyzeCodeActivator> logger: 用于记录日志的服务。

方法:AnalyzeAsync

  • 参数:

    • string codeContent: 要分析的代码内容。
    • string[] path: 代码文件的路径。
    • string fileName: 代码文件的名称。
  • 功能:

    1. 行数检查: 如果代码内容的行数少于 50 行,则直接返回,不进行分析。
    2. 生成锁键: 使用文件路径和文件名生成一个唯一的锁键,以确保同一时间只有一个分析任务在处理相同的文件。
    3. 获取分布式锁: 使用 distributedLockProvider 获取锁,确保在并发环境下的安全性。
    4. 检查已有分析结果: 查询 codeNoteService,检查该文件是否已经有 AI 分析结果。如果有,则返回。
    5. 构建提示信息: 创建一个提示信息,要求 AI 解释代码的功能。
    6. 调用分析服务: 使用 analyzeService.ChatAsync 方法与 AI 进行交互,发送构建的提示信息。
    7. 处理分析结果:
      • 如果分析成功,记录成功日志,并将结果保存到 codeNoteService
      • 如果分析失败,记录警告日志,包含错误信息。

辅助方法:GetContentLineCount

  • 功能: 计算给定代码内容的行数。使用 Split 方法根据不同的换行符(\r\n, \r, \n)将内容分割成行,并返回行数。

总结

整体来看,这段代码的目的是在 Hangfire 任务中分析代码文件的内容,并通过 AI 生成相应的解释或注释。它确保了在并发环境下的安全性,并记录了分析的结果和可能的错误信息。

loading