Administrator's Toolkit VS plugin
修訂 | 8fd88dcb4ab0a1fe38b74b43b44c7c57d2795260 (tree) |
---|---|
時間 | 2019-08-31 05:45:50 |
作者 | melchior <melchior@user...> |
Commiter | melchior |
Enabled multi-lingual Rules text support,
Game time elapsed message for players joining,
Version bump & V1.10 API update (lang code)
@@ -22,6 +22,7 @@ namespace AdminToolkit | ||
22 | 22 | * Server RULES Printout {richtext / multi-linugual } |
23 | 23 | * Optional: ACCEPTANCE / REJECT of server rules {changes players role} |
24 | 24 | * List all Admins (online or offline) & track last logoff date |
25 | + * Keeps track of Elapsed game calendar days for players | |
25 | 26 | * { Alter ADMIN text to look 'different' } |
26 | 27 | * Cyclic automatic Backups |
27 | 28 | */ |
@@ -51,6 +52,7 @@ namespace AdminToolkit | ||
51 | 52 | }; |
52 | 53 | |
53 | 54 | internal const string _lastLoginKey = @"LastLogin"; |
55 | + internal const string _lastGameDayCountKey = @"LastDayCount"; | |
54 | 56 | internal const string _configFilename = @"admintoolkit.json"; |
55 | 57 | |
56 | 58 | internal static List<string> AdminRoles; |
@@ -97,7 +99,7 @@ namespace AdminToolkit | ||
97 | 99 | if (CachedConfiguration.BoomingVoice) { |
98 | 100 | this.ServerAPI.Event.PlayerChat += BoomingVoiceOfAuthority; |
99 | 101 | } |
100 | - | |
102 | + //TODO: Server MOTD / Name, DYNAMIC status info [season, moon-phase, events... ect] | |
101 | 103 | |
102 | 104 | this.ServerAPI.Event.ServerRunPhase(EnumServerRunPhase.Shutdown, SaveConfigSettings); |
103 | 105 | } |
@@ -42,10 +42,10 @@ namespace AdminToolkit | ||
42 | 42 | Rules = new Dictionary<string, List<string>>( ); |
43 | 43 | RulesPath = ServerAPI.GetOrCreateDataPath(_rulesPathKey); |
44 | 44 | |
45 | - string[] lang_codes = { "en", /*"fr", "es", "de", "ru", "kr" */};//FIXME: this should not be hardcoded | |
45 | + string[] lang_codes = { "en", "de", "it", "fr", "pt-br", "ru" };//FIXME: this should extracted from language codes | |
46 | 46 | |
47 | 47 | foreach (var languageCode in lang_codes) { |
48 | - //For each locale that is configured... get/create rules.txt | |
48 | + //For each locale that is configured... get rules_?.txt | |
49 | 49 | string rulesFilePath = Path.Combine(RulesPath, $"rules_{languageCode}.txt"); |
50 | 50 | if (File.Exists(rulesFilePath)) { |
51 | 51 | using (var ruleFileStream = File.OpenRead(rulesFilePath)) { |
@@ -68,7 +68,7 @@ namespace AdminToolkit | ||
68 | 68 | ruleReader.Close( ); |
69 | 69 | } |
70 | 70 | } else { |
71 | - Logger.Error("Non existant '{0}' file for Rules-text!!!", $"rules_{languageCode}.txt"); | |
71 | + Logger.Warning("Non existant '{0}' file for Rules-text", $"rules_{languageCode}.txt"); | |
72 | 72 | } |
73 | 73 | } |
74 | 74 | } |
@@ -114,23 +114,6 @@ namespace AdminToolkit | ||
114 | 114 | if (args.Length == 1) { |
115 | 115 | string word = args.PopWord( ); |
116 | 116 | |
117 | - /* | |
118 | - #if DEBUG | |
119 | - if (string.Compare("demote", word, StringComparison.InvariantCultureIgnoreCase) == 0) | |
120 | - { | |
121 | - IPlayerRole restrainRole = ServerAPI.Server.Config.Roles.Single(rl => string.Compare(rl.Code, this.CachedConfiguration.PlayerRoleRestrain, StringComparison.InvariantCultureIgnoreCase) == 0); | |
122 | - player.SendMessage(groupId, $"{player.PlayerName} was demoted", EnumChatType.CommandSuccess); | |
123 | - ServerAPI.Permissions.SetRole(player, restrainRole.Code); | |
124 | - } | |
125 | - | |
126 | - if (string.Compare("promote", word, StringComparison.InvariantCultureIgnoreCase) == 0) { | |
127 | - IPlayerRole normalRole = ServerAPI.Server.Config.Roles.Single(rl => string.Compare(rl.Code, this.CachedConfiguration.PlayerRoleNormal, StringComparison.InvariantCultureIgnoreCase) == 0); | |
128 | - player.SendMessage(groupId, $"{player.PlayerName} was promoted", EnumChatType.CommandSuccess); | |
129 | - ServerAPI.Permissions.SetRole(player, normalRole.Code); | |
130 | - } | |
131 | - #endif | |
132 | - */ | |
133 | - | |
134 | 117 | if (string.Compare(_acceptKeyword, word, StringComparison.InvariantCultureIgnoreCase) == 0) { |
135 | 118 | |
136 | 119 | if (CheckRuleAccepted(player) == false) { |
@@ -144,7 +127,7 @@ namespace AdminToolkit | ||
144 | 127 | } |
145 | 128 | |
146 | 129 | } else { |
147 | - var targetLocale = "en";//TODO: actually get locale! | |
130 | + var targetLocale = player.LanguageCode; | |
148 | 131 | |
149 | 132 | if (Rules.ContainsKey(targetLocale)) { |
150 | 133 |
@@ -153,15 +136,16 @@ namespace AdminToolkit | ||
153 | 136 | player.SendMessage(groupId, line, EnumChatType.OthersMessage); |
154 | 137 | } |
155 | 138 | } else { |
156 | - player.SendMessage(groupId, "* MISSING RULES FILE ! *", EnumChatType.CommandError); | |
139 | + //Subsitute rules? | |
140 | + player.SendMessage(groupId, $"* MISSING RULES FILE ({targetLocale})! *", EnumChatType.CommandError); | |
157 | 141 | } |
158 | 142 | } |
159 | 143 | } |
160 | 144 | |
161 | - /// <summary> | |
162 | - /// Send Rule info text or Admin welcome | |
163 | - /// </summary> | |
164 | - /// <param name="byPlayer">By player.</param> | |
145 | + /// <summary> | |
146 | + /// Send Rule info text or Admin welcome, plus other info | |
147 | + /// </summary> | |
148 | + /// <param name="byPlayer">By player.</param> | |
165 | 149 | private void UponJoin(IServerPlayer byPlayer) |
166 | 150 | { |
167 | 151 | if (AdminToolkit.AdminRoles.Contains(byPlayer.Role.Code)) { |
@@ -174,11 +158,10 @@ namespace AdminToolkit | ||
174 | 158 | ServerAPI.SendMessageToGroup(GlobalConstants.AllChatGroups, adminMessage.ToString( ), EnumChatType.AllGroups); |
175 | 159 | |
176 | 160 | byPlayer.ServerData.CustomPlayerData[AdminToolkit._lastLoginKey] = DateTimeOffset.UtcNow.ToString("u"); |
177 | - | |
178 | 161 | } else { |
179 | 162 | //For regular players |
180 | 163 | if (RulesCommand.CheckRuleAccepted(byPlayer) == false) { |
181 | - //TODO: localize somehow? | |
164 | + //TODO: localize | |
182 | 165 | byPlayer.SendMessage(GlobalConstants.CurrentChatGroup, "type ' /rules ' command for reading server rules.", EnumChatType.Notification); |
183 | 166 | |
184 | 167 | if (this.CachedConfiguration.RuleRoleChangerEnabled) { |
@@ -186,6 +169,22 @@ namespace AdminToolkit | ||
186 | 169 | } |
187 | 170 | } |
188 | 171 | } |
172 | + | |
173 | + double elapsedDays = 0D; | |
174 | + string elapsedDayStr; | |
175 | + | |
176 | + if (byPlayer.ServerData.CustomPlayerData.TryGetValue(AdminToolkit._lastGameDayCountKey, out elapsedDayStr) | |
177 | + && | |
178 | + double.TryParse(elapsedDayStr, out elapsedDays)) | |
179 | + { | |
180 | + elapsedDays = ServerAPI.World.Calendar.TotalDays - elapsedDays; | |
181 | + byPlayer.SendMessage(GlobalConstants.CurrentChatGroup, $"Meantime... {elapsedDays.ToString("F1")} days have passed. ", EnumChatType.OthersMessage); | |
182 | + } else | |
183 | + { | |
184 | + byPlayer.SendMessage(GlobalConstants.CurrentChatGroup, $"In the year; {ServerAPI.World.Calendar.PrettyDate( )}", EnumChatType.OthersMessage); | |
185 | + } | |
186 | + | |
187 | + byPlayer.ServerData.CustomPlayerData[AdminToolkit._lastGameDayCountKey] = ServerAPI.World.Calendar.TotalDays.ToString("R"); | |
189 | 188 | } |
190 | 189 | |
191 | 190 | private void PlayerAcceptsRulesAction(IServerPlayer byPlayer ) |
@@ -81,6 +81,12 @@ namespace AdminToolkit | ||
81 | 81 | } |
82 | 82 | } |
83 | 83 | |
84 | + public string LanguageCode { | |
85 | + get { | |
86 | + return @"en";//ISO639-2 ? | |
87 | + } | |
88 | + } | |
89 | + | |
84 | 90 | public float Ping { |
85 | 91 | get { |
86 | 92 | return 0.0f; |
@@ -1,9 +1,9 @@ | ||
1 | 1 | { |
2 | 2 | "type": "code", |
3 | 3 | "name": "Administrator's Toolkit mod", |
4 | - "description" : "Provides misc. Admin functions;\n list admins, print & accept rules , auto-backup...", | |
4 | + "description" : "Provides misc. Admin functions;\n list admins, print & accept rules (multi-lingual) , auto-backup...", | |
5 | 5 | "authors": ["Melchior", ], |
6 | - "version": "0.3.1", | |
6 | + "version": "0.3.2", | |
7 | 7 | "dependencies": { |
8 | 8 | "game": "1.10.0" |
9 | 9 | }, |