using System.Text.Json.Serialization;
using Dpz.Core.Entity.Base;

namespace Dpz.Core.Public.Entity.Steam;

/// <summary>
/// 成就详情
/// </summary>
public class AchievementDetail
{
    /// <summary>
    /// 名称
    /// </summary>
    [JsonPropertyName("name")]
    public string? Name { get; set; }

    /// <summary>
    /// 默认值
    /// </summary>
    [JsonPropertyName("defaultvalue")]
    public int DefaultValue { get; set; }

    /// <summary>
    /// 显示名称
    /// </summary>
    [JsonPropertyName("displayName")]
    public string? DisplayName { get; set; }

    /// <summary>
    /// 是否为隐藏成就
    /// </summary>
    [JsonPropertyName("hidden")]
    [JsonConverter(typeof(BooleanConverter))]
    public bool Hidden { get; set; }

    /// <summary>
    /// 描述
    /// </summary>
    [JsonPropertyName("description")]
    public string? Description { get; set; }

    /// <summary>
    /// 已解锁成就图标
    /// </summary>
    [JsonPropertyName("icon")]
    public string? Icon { get; set; }

    /// <summary>
    /// 未解锁成就图标
    /// </summary>
    [JsonPropertyName("icongray")]
    public string? IconGray { get; set; }

    /// <summary>
    /// 成就解锁时间
    /// </summary>
    [BsonDateTimeOptions(Kind = DateTimeKind.Local)]
    public DateTime? UnlockTime { get; set; }

    /// <summary>
    /// 获取与另一个成就对象的差异
    /// </summary>
    /// <param name="other">要比较的成就对象</param>
    /// <returns>差异信息字典</returns>
    public Dictionary<string, string> GetChanges(AchievementDetail? other)
    {
        if (other == null)
        {
            return [];
        }

        var changes = new Dictionary<string, string>();

        if (DefaultValue != other.DefaultValue)
        {
            changes.Add(nameof(DefaultValue), $"原值:{DefaultValue},新值:{other.DefaultValue}");
        }

        if (DisplayName != other.DisplayName)
        {
            changes.Add(nameof(DisplayName), $"原值:{DisplayName},新值:{other.DisplayName}");
        }

        if (Hidden != other.Hidden)
        {
            changes.Add(nameof(Hidden), $"原值:{Hidden},新值:{other.Hidden}");
        }

        if (Description != other.Description)
        {
            changes.Add(nameof(Description), $"原值:{Description},新值:{other.Description}");
        }

        if (Icon != other.Icon)
        {
            changes.Add(nameof(Icon), $"原值:{Icon},新值:{other.Icon}");
        }

        if (IconGray != other.IconGray)
        {
            changes.Add(nameof(IconGray), $"原值:{IconGray},新值:{other.IconGray}");
        }

        if (
            UnlockTime?.ToString("yyyy/MM/dd HH:mm:ss")
            != other.UnlockTime?.ToString("yyyy/MM/dd HH:mm:ss")
        )
        {
            changes.Add(
                nameof(UnlockTime),
                $"原值:{UnlockTime?.ToString("yyyy/MM/dd HH:mm:ss") ?? "未解锁"},新值:{other.UnlockTime?.ToString("yyyy/MM/dd HH:mm:ss") ?? "未解锁"}"
            );
        }

        return changes;
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这是一个用于表示Steam游戏成就详情的C#实体类。让我详细解释一下这个代码的各个部分:

类的基本信息

public class AchievementDetail

这是一个公共类,用于封装Steam游戏成就的详细信息。

属性说明

JSON序列化属性

大部分属性都使用了[JsonPropertyName]特性,用于JSON序列化和反序列化时的属性名映射:

  • Name: 成就的内部名称
  • DefaultValue: 成就的默认值(通常为0或1)
  • DisplayName: 成就的显示名称(用户看到的名称)
  • Hidden: 是否为隐藏成就,使用了自定义的BooleanConverter进行类型转换
  • Description: 成就的描述文本
  • Icon: 已解锁成就的图标URL
  • IconGray: 未解锁成就的灰色图标URL

特殊属性

[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime? UnlockTime { get; set; }

UnlockTime属性使用了MongoDB的BSON序列化特性,指定日期时间为本地时间格式,用于记录成就解锁的时间。

核心方法:GetChanges

public Dictionary<string, string> GetChanges(AchievementDetail? other)

这是一个非常实用的方法,用于比较两个成就对象之间的差异:

功能特点:

  1. 空值处理: 如果传入的比较对象为null,直接返回空字典
  2. 逐属性比较: 比较所有重要属性的值变化
  3. 格式化输出: 将差异以"原值:xxx,新值:xxx"的格式记录
  4. 时间格式化: 对UnlockTime进行特殊处理,格式化为"yyyy/MM/dd HH:mm:ss",未解锁时显示"未解锁"

应用场景:

  • 成就数据更新时的变更追踪
  • 游戏数据同步时的差异检测
  • 用户成就进度的变化记录
  • 数据审计和日志记录

设计优点

  1. JSON友好: 通过JsonPropertyName特性实现与Steam API的无缝对接
  2. 数据库兼容: 支持MongoDB的BSON序列化
  3. 变更追踪: 内置的差异比较功能便于数据管理
  4. 类型安全: 使用强类型属性和可空类型确保数据安全
  5. 用户友好: 提供格式化的差异信息,便于理解和展示

这个类设计得很完整,既满足了与Steam API的数据交互需求,也提供了实用的数据管理功能。

评论加载中...