Automated Task

活动奖惩发放

Type Scheduled

Date Executed 10/8/2024, 4:55:00 PM

Created 10/8/2024, 3:28:18 PM

Updated 10/8/2024, 4:53:38 PM

Description 为特定名次的稿件及相关作者发放活动奖惩。

Code
1
using Microsoft.Extensions.Logging;
2
using Microsoft.Extensions.DependencyInjection;
3
using PhiZoneApi.Models;
4
using PhiZoneApi.Interfaces;
5
using System.Collections.Generic;
6
using System.Threading.Tasks;
7
using System.Linq;
8
using System;
9
using System.Globalization;
10
using System.Text;
11
using System.IO;
12
using PhiZoneApi.Constants;
13
using PhiZoneApi.Dtos.Deliverers;
14
using PhiZoneApi.Enums;
15
using Microsoft.AspNetCore.Identity;
16

17
var listRanked = new List<string>
18
{
19
    "1f0049f7-1916-4db5-8a88-69a85745e71d",
20
    "060410d1-df8a-497c-9e45-1d3d71c526e5",
21
    "ab7db7b6-9934-46b1-8ca5-15ab9d79b095",
22
    "ba6c0499-6af7-4983-9924-cd43e2682f4e",
23
    "08e8a50a-428c-429e-a73b-307317eb0368",
24
    "09a66015-6855-44ed-a0ed-e7168c538857",
25
    "b170fe3d-3053-4761-8e81-732fa6a875cf",
26
    "2f4d9ce7-1c6f-4015-8522-5db7d7b4ac41",
27
    "9cd53235-b3fe-489d-ab3f-14e2f8fc3922",
28
    "5adcf5bf-814f-4b9b-a69f-3608e9d8b86d",
29
    "6c20a442-1cbb-40a0-a665-bfe9d630f99f",
30
    "a3611bc9-7e28-4f9d-9fa2-3136840866ec",
31
    "f2ce6ab8-6952-4b52-a17b-b41138c79081",
32
    "3febeaf5-52a6-4396-931e-d179e780e2dd",
33
    "fbf04595-26ad-46a5-890a-454371caa4a7",
34
    "f8812a2f-02bb-4ce4-9cb4-4ac6200b1caa",
35
    "08a72b94-3690-49d4-bcfb-b046448ea487",
36
    "782edd21-5e14-426d-8fca-84bc08d3f072",
37
    "ab810a32-2eda-4e13-9235-e979e880bd91",
38
    "cd3deb0c-eecf-4cdf-98c5-aa9dfae9cc70",
39
    "1fbe8e41-c820-49c6-946f-f684fb10ef00",
40
    "bba0f1c7-ded0-4854-9ac6-32f367b72b38",
41
    "750ebb6f-1ba2-484a-81a8-9a5847ff7b97",
42
    "ca68d619-3e35-4453-bff4-96bebb426fa9",
43
    "61128225-6745-4cb4-a709-81c07f9af883",
44
    "0e97942c-c767-42dd-85bf-04fda33168f2",
45
    "f89645fe-8e52-4e91-9a9e-4a6639ca085c",
46
    "634e9a9c-0650-449b-baf9-80ddbccd0f81",
47
    "c72d46f2-65cd-4bef-9979-84091bd210ff",
48
    "73c850b6-138f-41eb-8daa-383d9e6be99c",
49
}.Select(Guid.Parse);
50
var listQualified = new List<string>
51
{
52
    "24b1296b-7281-41a9-a87d-e32dc4ffc3d5",
53
    "831d2c9c-c86a-4dc8-80cd-f44a83ca5138",
54
    "f5ab4591-f0ff-4a89-9c98-83fb4013e3ef",
55
    "9b8163ad-0d00-41a7-ad12-8161d60b7e9e",
56
    "7f523253-9eaf-4955-aa53-05309de86753",
57
    "2b588b6b-5d6c-41ed-a69c-450aa163e885",
58
    "9b44b9cd-1032-4bb4-8f94-48f1ce47fa7f",
59
    "7d23a7c6-a65c-4c8b-92e8-f0dcc7303270",
60
    "39c032ed-ff90-4746-9689-90038a6d156d",
61
    "b4e4bbe1-cace-413e-9c1a-8c7f360e6454",
62
    "8e658335-0b6f-4129-bc61-342548cf72aa",
63
    "6d871ac9-2ba5-4151-839e-3c9cfbb2ca24",
64
    "4b9b0745-8b5e-4355-a36d-4e93f1f71dd2",
65
    "64c7b803-b94c-42ad-9496-e5b36cc79cd2",
66
    "25220179-a457-4acc-bad8-a224b0d53f01",
67
    "97f77a05-b70b-4eac-8d1c-fcc6e598495d",
68
    "0b4c2abe-a335-4d57-8ad6-19488cfd92b9",
69
    "538a4239-29f8-490b-b520-1ee3046183a3",
70
    "d3d6f7bc-6ea5-4401-abba-dde86553a2b4",
71
    "2d0d632b-1a01-48c9-a5b5-68b33fe19ef3",
72
    "35bcb3d9-353b-4a42-945d-2cff1f86b6de",
73
    "637b6c4b-d050-4f92-afca-ae2d2a8b3a72",
74
    "2c6c93c0-a431-4f38-a6e1-a760a8b729f0",
75
    "74225178-2907-4a7a-875e-0b832c85b489",
76
    "6cfd3fe6-8126-45e5-b264-f0041bbd71de",
77
    "d16bfa0f-9cd3-4924-a161-53d2c6e50971",
78
    "13e363de-823e-4b7b-bcaf-d10523266d11",
79
    "11cc4c3b-4cac-41d2-98d3-1b992811cf90",
80
    "b6195094-a581-462e-ac6f-64c481204525",
81
    "3013babe-3a43-47f4-a9b4-32b1faae3114",
82
    "cc489152-28a9-4eab-a044-ec58ed196ddf",
83
    "8f8d4c2e-2c0a-49a7-91e5-49d12f7d6a5a",
84
}.Select(Guid.Parse);
85
var listHidden = new List<string>
86
{
87
    "5b0b4855-a44a-48a7-b52f-866bb7d0d5f5",
88
    "bcc6ce55-8933-4d9f-9c45-0b14737df71a",
89
    "41d9aaf2-a536-4f48-8587-31e2175e63b3",
90
    "71541d88-5b73-4fec-bce9-19ea91de6ddf",
91
    "8d5f4b66-c2d2-41f8-9ee0-66d10b1ee52b",
92
    "a1a4a4d2-b32b-421a-915b-59fa9bf5ea33",
93
    "a8d797b2-20f0-4590-9531-11734bcf5dc3",
94
    "2b7ffcb0-6a4c-4144-bbff-31aa0f4d4477",
95
    "4ff90979-297a-4347-a992-f18feb55b496",
96
    "6f3fd906-0fea-4859-a4f0-d7e03bbf0263",
97
    "de94f9e4-5d90-41f3-8306-b3b9576ad417",
98
    "5129bb78-ae7e-47cc-bc31-10b5046f5486",
99
    "aa42c42e-fa7a-4720-8fc0-bc1e2937aae3",
100
    "510c7c39-c397-4345-b5cf-2d036e8c08ed",
101
    "2bca7b71-bfa6-4d4d-9771-4d1b70b5db36",
102
}.Select(Guid.Parse);
103
await using (var scope = ServiceProvider.CreateAsyncScope())
104
{
105
    var userManager = scope.ServiceProvider.GetRequiredService<UserManager<User>>();
106
    var userRepository = scope.ServiceProvider.GetRequiredService<IUserRepository>();
107
    var chartRepository = scope.ServiceProvider.GetRequiredService<IChartRepository>();
108
    var authorshipRepository = scope.ServiceProvider.GetRequiredService<IAuthorshipRepository>();
109
    var resourceService = scope.ServiceProvider.GetRequiredService<IResourceService>();
110

111
    var chartsRanked = await chartRepository.GetChartsAsync(predicate: e => listRanked.Contains(e.Id));
112
    foreach (var chart in chartsRanked)
113
    {
114
        chart.IsRanked = true;
115
        Console.WriteLine("Made {0} [{1} {2}] ranked", chart.Song.Title, chart.Level, Math.Floor(chart.Difficulty));
116
        var authors = await authorshipRepository.GetAuthorsAsync(chart.Id);
117
        foreach (var author in authors)
118
        {
119
            var user = (await userRepository.GetUserByIdAsync(author.AuthorId))!;
120
            if (!resourceService.HasPermission(user, UserRole.Qualified))
121
            {
122
                user.Role = UserRole.Qualified;
123
                Console.WriteLine("Made {0} qualified", user.UserName);
124
                await userManager.UpdateAsync(user);
125
            }
126
        }
127

128
        await chartRepository.UpdateChartAsync(chart);
129
    }
130

131
    var chartsQualified = await chartRepository.GetChartsAsync(predicate: e => listQualified.Contains(e.Id));
132
    foreach (var chart in chartsQualified)
133
    {
134
        var authors = await authorshipRepository.GetAuthorsAsync(chart.Id);
135
        foreach (var author in authors)
136
        {
137
            var user = (await userRepository.GetUserByIdAsync(author.AuthorId))!;
138
            if (!resourceService.HasPermission(user, UserRole.Qualified))
139
            {
140
                user.Role = UserRole.Qualified;
141
                Console.WriteLine("Made {0} qualified", user.UserName);
142
                await userManager.UpdateAsync(user);
143
            }
144
        }
145
    }
146

147
    var chartsHidden = await chartRepository.GetChartsAsync(predicate: e => listHidden.Contains(e.Id));
148
    foreach (var chart in chartsHidden)
149
    {
150
        chart.IsHidden = true;
151
        Console.WriteLine("Made {0} [{1} {2}] hidden", chart.Song.Title, chart.Level, Math.Floor(chart.Difficulty));
152
        await chartRepository.UpdateChartAsync(chart);
153
    }
154
}