wangzhibo
2026-05-09 53418655c061ac26f66058253f39200aced1ab1d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
using BoardApp.Config;
 
namespace BoardApp.Services;
 
public sealed class UserScenarioService
{
    public const int StaytimeMin = 5;
    public const int StaytimeMax = 86400;
 
    private readonly BoardConfigLoader _cfg;
 
    public UserScenarioService(BoardConfigLoader cfg)
    {
        _cfg = cfg;
    }
 
    private static bool IsValidStaytime(int n) => n >= StaytimeMin && n <= StaytimeMax;
 
    private Dictionary<string, PageDef> PagesById()
    {
        var cfg = _cfg.LoadPagesConfig();
        var map = new Dictionary<string, PageDef>(StringComparer.Ordinal);
        foreach (var p in cfg.Pages)
        {
            map[p.Id] = p;
        }
        return map;
    }
 
    private static void EnsureUser(UserScenariosConfig cfg, string username)
    {
        if (!cfg.Users.ContainsKey(username))
        {
            cfg.Users[username] = new UserScenariosUser { Scenarios = new List<UserScenario>() };
        }
    }
 
    private static string NewScenarioId()
        => $"u_{DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}_{Guid.NewGuid().ToString("N")[..8]}";
 
    public List<UserScenario> ListUserScenarios(string username)
    {
        var cfg = _cfg.LoadUserScenariosConfig();
        return cfg.Users.TryGetValue(username, out var u) ? (u.Scenarios ?? new List<UserScenario>()) : new List<UserScenario>();
    }
 
    public (bool Ok, string? Error) DeleteUserScenario(string username, string scenarioId)
    {
        var cfg = _cfg.LoadUserScenariosConfig();
        EnsureUser(cfg, username);
        var before = cfg.Users[username].Scenarios.Count;
        cfg.Users[username].Scenarios = cfg.Users[username].Scenarios
            .Where(s => !string.Equals(s.Id, scenarioId, StringComparison.Ordinal))
            .ToList();
 
        if (cfg.Users[username].Scenarios.Count == before)
        {
            return (false, "未找到该场景");
        }
 
        _cfg.WriteUserScenariosConfig(cfg);
        return (true, null);
    }
 
    public (bool Ok, UserScenario? Scenario, string? Error) CreateUserScenario(
        string username,
        string name,
        List<ScenarioPageRef> pageRefs)
    {
        var nm = (name ?? "").Trim();
        if (nm.Length == 0) return (false, null, "场景名称不能为空");
        if (pageRefs is null || pageRefs.Count == 0) return (false, null, "至少选择 1 个 page");
 
        var pages = PagesById();
        foreach (var r in pageRefs)
        {
            if (r is null || string.IsNullOrWhiteSpace(r.PageId) || !pages.ContainsKey(r.PageId))
            {
                return (false, null, $"pageId 不存在:{r?.PageId ?? ""}");
            }
            if (!IsValidStaytime(r.Staytime))
            {
                return (false, null, $"停留时间须为 {StaytimeMin}~{StaytimeMax} 的整数(秒)");
            }
        }
 
        var cfg = _cfg.LoadUserScenariosConfig();
        EnsureUser(cfg, username);
        var exists = cfg.Users[username].Scenarios.Any(s => string.Equals(s.Name, nm, StringComparison.Ordinal));
        if (exists) return (false, null, "该用户下已存在同名场景");
 
        var firstPage = pages[pageRefs[0].PageId];
        var scenario = new UserScenario
        {
            Id = NewScenarioId(),
            Name = nm,
            Image = firstPage.Image ?? "",
            Pages = pageRefs,
            CreatedAtMs = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
        };
 
        cfg.Users[username].Scenarios.Insert(0, scenario);
        _cfg.WriteUserScenariosConfig(cfg);
        return (true, scenario, null);
    }
}