-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMySQLModule.cs
More file actions
186 lines (171 loc) · 8.6 KB
/
Copy pathMySQLModule.cs
File metadata and controls
186 lines (171 loc) · 8.6 KB
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
using Prism.Ioc;
using Prism.Modularity;
using System;
using System.Collections.Generic;
using RYCBEditorX.Utils;
using System.Diagnostics.CodeAnalysis;
using RYCBEditorX.Crossings;
using RYCBEditorX.Crossing;
using RYCBEditorX.Utils.Crossings;
using System.Globalization;
namespace RYCBEditorX.MySQL;
public class MySQLModule : IModule
{
[MaybeNull]
public static ISQLConnectionUtils ConnectionUtils
{
get; set;
}
public static MySql.Data.MySqlClient.MySqlConnection MySQLConnection
{
get; set;
}
public static List<Dictionary<string, object>> EchoChambers
{
get; set;
}
public void OnInitialized(IContainerProvider containerProvider)
{
MySQLConnectionUtils mySQLConnection = new();
mySQLConnection.Init();
if (mySQLConnection.MySqlConnection is null)
{
GlobalConfig.CurrentLogger.Error(new NullReferenceException("`MySqlConnection`为null。已停止连接。"), "", EnumLogType.WARN);
return;
}
if (!mySQLConnection.ConnectionOpened)
{
GlobalConfig.CurrentLogger.Error(new SQLConnectionException("`MySqlConnection`连接失败。已停止连接。"), "", EnumLogType.WARN);
return;
}
ConnectionUtils = mySQLConnection;
MySQLConnection = mySQLConnection.MySqlConnection;
var _ = mySQLConnection.Select("update_info");
List<object> LatestVersion = [], PatchLevel = [], LatestRevision = [], LTSVersions = [], ComingToEOLVersions = [], EOLVersions = [], VulnerableVersions = [];
foreach (var item in _)
{
LatestVersion.AddNotNullAndNoRepeat(item["latest_ver"]);
LatestRevision.AddNotNullAndNoRepeat(item["latest_rev"]);
PatchLevel.AddNotNullAndNoRepeat(item["patch_level"]);
LTSVersions.AddNotNullAndNoRepeat(item["lts_ver"]);
ComingToEOLVersions.AddNotNullAndNoRepeat(item["coming_to_eol_ver"]);
EOLVersions.AddNotNullAndNoRepeat(item["eol_ver"]);
VulnerableVersions.AddNotNullAndNoRepeat(item["vulnerable_ver"]);
}
UpdateInfoCrossing.HasNew = !LatestVersion.Contains(GlobalConfig.Version) || (LatestVersion.Contains(GlobalConfig.Version) & !IsRevisionNumberNewest(GlobalConfig.Revision, LatestRevision[0].ToString()));
UpdateInfoCrossing.ComingToEOL = ComingToEOLVersions.Contains(GlobalConfig.Version);
UpdateInfoCrossing.EOL = EOLVersions.Contains(GlobalConfig.Version);
UpdateInfoCrossing.HasSV = VulnerableVersions.Contains(GlobalConfig.Version);
UpdateInfoCrossing.NewVersion = "{0}-{1}_{2}".Format(LatestVersion[0].ToString(), LatestRevision[0].ToString(), PatchLevel[0].ToString());
if (UpdateInfoCrossing.HasNew)
{
GlobalConfig.CurrentLogger.Log("RYCB Editor 有更新,最新版本: {0} 当前版本: {1}-{2}"
.Format(UpdateInfoCrossing.NewVersion, GlobalConfig.Revision, PatchLevel[0].ToString()), EnumLogType.WARN);
GlobalConfig.CurrentLogger.Log("RYCB Editor has been updated, the latest version: {0} Current Version: {1}-{2}"
.Format(UpdateInfoCrossing.NewVersion, GlobalConfig.Version, GlobalConfig.Revision, PatchLevel[0].ToString()), EnumLogType.WARN);
}
if (UpdateInfoCrossing.ComingToEOL)
{
GlobalConfig.CurrentLogger.Log("当前版本即将停止支持,请使用最新版本 " + LatestVersion[0], EnumLogType.WARN);
GlobalConfig.CurrentLogger.Log("The current version is about to stop supporting, please use the latest version: " + LatestVersion[0], EnumLogType.WARN);
}
if (UpdateInfoCrossing.EOL)
{
GlobalConfig.CurrentLogger.Log("当前版本已停止支持,请使用最新版本: " + LatestVersion[0], EnumLogType.ERROR);
GlobalConfig.CurrentLogger.Log("The current version is no longer supported, please use the latest version: " + LatestVersion[0], EnumLogType.ERROR);
}
if (UpdateInfoCrossing.HasSV)
{
GlobalConfig.CurrentLogger.Log("当前版本包含安全漏洞,请使用已修复的最新版本: " + LatestVersion[0], EnumLogType.FATAL);
GlobalConfig.CurrentLogger.Log("The current version contains security vulnerabilities, please use the latest version that has been fixed: " + LatestVersion[0], EnumLogType.FATAL);
}
_ = null;
_ = mySQLConnection.Select("global_msg");
GlobalConfig.CurrentLogger.Log("加载全局消息", module: EnumLogModule.SQL);
foreach (var item in _)
{
if (/*item["time"].TryConvertTo<DateTime>().IsWithinSomeDays(30) && */item["lang"].ToString() == CultureInfo.CurrentCulture.TwoLetterISOLanguageName)
{
GlobalConfig.CurrentLogger.Log("找到全局消息", module: EnumLogModule.SQL);
GlobalMsgCrossing.GlobalMsg.Add(new()
{
Text = item["msg"].ToString(),
Level = item["level"].TryConvertTo<int>()
});
GlobalMsgCrossing.HasGlobalMsg = true;
break;
}
else if (item["time"].TryConvertTo<DateTime>().IsWithinSomeDays(30))
{
GlobalConfig.CurrentLogger.Log("找到全局消息", module: EnumLogModule.SQL);
GlobalMsgCrossing.GlobalMsg.Add(new()
{
Text = item["msg"].ToString(),
Level = item["level"].TryConvertTo<int>()
});
GlobalMsgCrossing.HasGlobalMsg = true;
break;
}
}
EchoChambers = ConnectionUtils.Select("echo_chamber", "content");
RefreshWikis();
GlobalConfig.CurrentLogger.Log("MySQL模块初始化完成.", module: EnumLogModule.SQL);
}
private void RefreshWikis()
{
System.Threading.Tasks.Task.Run(() =>
{
Dictionary<string, List<string>> offlineWikis;
try
{
if (ConnectionUtils.ConnectionOpened)
{
GlobalConfig.CurrentLogger.Log("刷新 Wiki 列表", type: EnumLogType.DEBUG, module: EnumLogModule.CUSTOM, customModuleName: "初始化:配置");
var res = IWikiLoader.GetAllTargets();
GlobalConfig.TotalLoadedOnline = res.Count;
var index = 0;
offlineWikis = [];
foreach (var item in res)
{
GlobalConfig.CurrentLogger.Log($"HIT: {item}", type: EnumLogType.DEBUG, module: EnumLogModule.CUSTOM, customModuleName: "初始化:配置");
offlineWikis[item] = IWikiLoader.GetWiki(item);
index++;
GlobalConfig.CurrentLoadedOnlineIndex = index;
}
// 成功获取后更新缓存
WikiCache.SaveToCache(offlineWikis);
}
else
{
GlobalMsgCrossing.GlobalMsg.Add(new()
{
Text = "网络不可用,使用缓存的 Wiki 数据",
Level = 1
});
// 网络不可用时从缓存加载
GlobalConfig.CurrentLogger.Log("使用缓存的 Wiki 数据", type: EnumLogType.WARN, module: EnumLogModule.CUSTOM, customModuleName: "初始化:配置");
offlineWikis = WikiCache.LoadFromCache();
GlobalConfig.TotalLoadedOnline = offlineWikis.Count;
GlobalConfig.CurrentLoadedOnlineIndex = offlineWikis.Count;
}
}
catch (Exception ex)
{
GlobalConfig.CurrentLogger.Log($"加载 Wiki 数据失败: {ex.Message}", type: EnumLogType.ERROR, module: EnumLogModule.CUSTOM, customModuleName: "初始化:配置");
// 从缓存加载作为后备
offlineWikis = WikiCache.LoadFromCache();
GlobalConfig.TotalLoadedOnline = offlineWikis.Count;
GlobalConfig.CurrentLoadedOnlineIndex = offlineWikis.Count;
}
GlobalConfig.OnlineWikis = offlineWikis;
});
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
}
public static bool IsRevisionNumberNewest(string revisionNumber, string latstRevisionNumber)
{
List<string> revisionNumbers = ["p", "o", "rc4", "rc3", "rc2", "rc1", "rc0", "b", "a"];
return revisionNumbers.IndexOf(revisionNumber) <= revisionNumbers.IndexOf(latstRevisionNumber);
}
}