7
7
import me .dreamvoid .miraimc .Platform ;
8
8
import me .dreamvoid .miraimc .commands .MiraiCommand ;
9
9
import me .dreamvoid .miraimc .commands .MiraiMcCommand ;
10
- import me .dreamvoid .miraimc .commands .MiraiVerifyCommand ;
11
10
import me .dreamvoid .miraimc .internal .Utils ;
12
11
import me .dreamvoid .miraimc .internal .config .PluginConfig ;
13
12
import me .dreamvoid .miraimc .internal .loader .LibraryLoader ;
14
13
import me .dreamvoid .miraimc .sponge .utils .Metrics ;
15
14
import me .dreamvoid .miraimc .sponge .utils .SpecialUtils ;
15
+ import net .kyori .adventure .text .Component ;
16
16
import org .slf4j .Logger ;
17
17
import org .slf4j .LoggerFactory ;
18
+ import org .spongepowered .api .Server ;
18
19
import org .spongepowered .api .Sponge ;
20
+ import org .spongepowered .api .command .Command ;
19
21
import org .spongepowered .api .command .CommandResult ;
20
- import org .spongepowered .api .command .args .ArgumentParseException ;
21
- import org .spongepowered .api .command .args .GenericArguments ;
22
- import org .spongepowered .api .command .spec .CommandSpec ;
22
+ import org .spongepowered .api .command .parameter .Parameter ;
23
23
import org .spongepowered .api .config .ConfigDir ;
24
- import org .spongepowered .api .entity .living .player .User ;
24
+ import org .spongepowered .api .entity .living .player .server . ServerPlayer ;
25
25
import org .spongepowered .api .event .Listener ;
26
- import org .spongepowered .api .event .game .state .GameInitializationEvent ;
27
- import org .spongepowered .api .event .game .state .GamePreInitializationEvent ;
28
- import org .spongepowered .api .event .game .state .GameStartingServerEvent ;
29
- import org .spongepowered .api .event .game .state .GameStoppingServerEvent ;
30
- import org .spongepowered .api .plugin .Plugin ;
31
- import org .spongepowered .api .plugin .PluginContainer ;
32
- import org .spongepowered .api .scheduler .SpongeExecutorService ;
26
+ import org .spongepowered .api .event .lifecycle .*;
33
27
import org .spongepowered .api .scheduler .Task ;
34
- import org .spongepowered .api .text . Text ;
28
+ import org .spongepowered .api .util . Ticks ;
35
29
import org .spongepowered .api .util .metric .MetricsConfigManager ;
30
+ import org .spongepowered .plugin .PluginContainer ;
31
+ import org .spongepowered .plugin .builtin .jvm .Plugin ;
36
32
37
33
import java .io .File ;
34
+ import java .io .IOException ;
38
35
import java .net .URLClassLoader ;
36
+ import java .util .Collections ;
39
37
import java .util .HashMap ;
40
38
import java .util .List ;
41
- import java .util .Random ;
42
39
import java .util .UUID ;
43
- import java .util .concurrent .TimeUnit ;
44
-
45
- @ Plugin (id = "miraimc" ,
46
- name = "MiraiMC" ,
47
- description = "MiraiBot for Minecraft server" ,
48
- version = "1.9-pre1" ,
49
- url = "https://github.com/DreamVoid/MiraiMC" ,
50
- authors = {"DreamVoid" }
51
- )
40
+
41
+ @ Plugin (value = "miraimc" )
52
42
public class SpongePlugin implements Platform {
53
43
private final LifeCycle lifeCycle ;
54
44
private PluginConfig platformConfig ;
55
45
@ SuppressWarnings ("SpongeLogging" )
56
46
private java .util .logging .Logger SpongeLogger ;
57
47
private final LibraryLoader loader ;
48
+ private final Metrics .Factory metricsFactory ;
58
49
59
- public SpongePlugin (){
50
+ @ Inject
51
+ public SpongePlugin (Metrics .Factory factory ){
60
52
lifeCycle = new LifeCycle (this );
61
53
lifeCycle .startUp (new SpongeLogger ("MiraiMC" , LoggerFactory .getLogger ("MiraiMC" )));
62
54
loader = new LibraryLoader ((URLClassLoader ) getClass ().getClassLoader ());
55
+
56
+ metricsFactory = factory ;
63
57
}
64
58
65
59
@ Inject
@@ -79,10 +73,10 @@ public SpongePlugin(){
79
73
private MiraiAutoLogin MiraiAutoLogin ;
80
74
81
75
/**
82
- * 触发 GamePreInitializationEvent 时,插件准备进行初始化,这时默认的 Logger 已经准备好被调用,同时你也可以开始引用配置文件中的内容 。
76
+ * StartingEngineEvent 将在指定的 Engine 启动时触发。此时该引擎的任何内容都尚未初始化,世界将不存在,并且引擎范围的注册表此时尚未准备好 。
83
77
*/
84
78
@ Listener
85
- public void onLoad (GamePreInitializationEvent e ) {
79
+ public void onLoad (StartingEngineEvent < Server > e ) {
86
80
SpongeLogger = new SpongeLogger ("MiraiMC" , this .getLogger ());
87
81
88
82
try {
@@ -97,25 +91,25 @@ public void onLoad(GamePreInitializationEvent e) {
97
91
}
98
92
99
93
/**
100
- * 触发 GameInitializationEvent 时,插件应该完成他所需功能的所有应该完成的准备工作,你应该在这个事件发生时注册监听事件 。
94
+ * StartedEngineEvent 将在指定的 Engine 完成初始化时触发。具体来说,这意味着注册表已被填充,对于服务器引擎来说,世界已被创建 。
101
95
*/
102
96
@ Listener
103
- public void onEnable (GameInitializationEvent e ) {
97
+ public void onEnable (StartedEngineEvent < Server > e ) {
104
98
try {
105
99
lifeCycle .postLoad ();
106
100
107
101
// 监听事件
108
102
if (PluginConfig .General .LogEvents ) {
109
103
getLogger ().info ("Registering events." );
110
- Sponge .getEventManager ().registerListeners (this , new Events ());
104
+ Sponge .eventManager ().registerListeners (this . pluginContainer , new Events ());
111
105
}
112
106
113
107
// bStats统计
114
108
if (PluginConfig .General .AllowBStats ) {
115
- if (this .metricsConfigManager .getCollectionState (this .pluginContainer ).asBoolean ()) {
109
+ if (this .metricsConfigManager .collectionState (this .pluginContainer ).asBoolean ()) {
116
110
getLogger ().info ("Initializing bStats metrics." );
117
111
int pluginId = 12847 ;
118
- new Metrics ( this . pluginContainer , getLogger (), getDataFolder (). toPath (), pluginId );
112
+ metricsFactory . make ( pluginId );
119
113
} else {
120
114
getLogger ().warn ("你在配置文件中启用了bStats,但是MetricsConfigManager告知MiraiMC不允许收集信息,因此bStats已关闭" );
121
115
getLogger ().warn ("要启用bStats,请执行命令 /sponge metrics miraimc enable" );
@@ -126,12 +120,7 @@ public void onEnable(GameInitializationEvent e) {
126
120
// HTTP API
127
121
if (PluginConfig .General .EnableHttpApi ) {
128
122
getLogger ().info ("Initializing HttpAPI async task." );
129
- Sponge .getScheduler ().createTaskBuilder ()
130
- .async ()
131
- .execute (new MiraiHttpAPIResolver (this ))
132
- .intervalTicks (PluginConfig .HttpApi .MessageFetch .Interval )
133
- .name ("MiraiMC-HttpApi" )
134
- .submit (this );
123
+ runTaskTimerAsync (new MiraiHttpAPIResolver (this ), PluginConfig .HttpApi .MessageFetch .Interval );
135
124
}
136
125
} catch (Exception ex ){
137
126
Utils .resolveException (ex , SpongeLogger , "加载 MiraiMC 阶段 2 时出现异常!" );
@@ -142,62 +131,60 @@ public void onEnable(GameInitializationEvent e) {
142
131
* 触发 GameStartingServerEvent 时,服务器初始化和世界载入都已经完成,你应该在这时注册插件命令。
143
132
*/
144
133
@ Listener
145
- public void onServerLoaded ( GameStartingServerEvent e ) {
134
+ public void onRegisterCommand ( RegisterCommandEvent < Command . Parameterized > e ) {
146
135
getLogger ().info ("Registering commands." );
147
136
148
- CommandSpec mirai = CommandSpec .builder ()
149
- .description (Text .of ("MiraiMC Bot Command." ))
137
+ final Parameter .Key <String > argsKey = Parameter .key ("args" , String .class );
138
+
139
+ e .register (this .pluginContainer , Command .builder ()
140
+ .shortDescription (Component .text ("MiraiMC Bot Command." ))
150
141
.permission ("miraimc.command.mirai" )
151
- .executor ((src , arg ) -> {
152
- if (arg .<String >getOne ("args" ).isPresent ()){
153
- String argo = arg .<String >getOne ("args" ).get ();
154
- String [] args = argo .split ("\\ s+" );
155
- new MiraiCommand ().onCommand (SpecialUtils .getSender (src ), args );
156
- return CommandResult .builder ().successCount (1 ).build ();
157
- } else throw new ArgumentParseException (Text .of ("isPresent() returned false!" ),"MiraiMC" ,0 );
142
+ .executor (context1 -> {
143
+ String [] args1 = context1 .requireOne (argsKey ).split (" " );
144
+ new MiraiCommand ().onCommand (SpecialUtils .getSender (context1 ), args1 );
145
+ return CommandResult .success ();
158
146
})
159
- .arguments (GenericArguments .remainingJoinedStrings ((Text .of ("args" ))))
160
- .build ();
161
- CommandSpec miraimc = CommandSpec .builder ()
162
- .description (Text .of ("MiraiMC Plugin Command." ))
147
+ .build (), "mirai" );
148
+ e .register (this .pluginContainer , Command .builder ()
149
+ .shortDescription (Component .text ("MiraiMC Plugin Command." ))
163
150
.permission ("miraimc.command.miraimc" )
164
- .executor ((src , arg ) -> {
165
- if (arg .<String >getOne ("args" ).isPresent ()){
166
- String argo = arg .<String >getOne ("args" ).get ();
167
- String [] args = argo .split ("\\ s+" );
168
- new MiraiMcCommand ().onCommand (SpecialUtils .getSender (src ), args );
169
- return CommandResult .builder ().successCount (1 ).build ();
170
- } else throw new ArgumentParseException (Text .of ("isPresent() returned false!" ),"MiraiMC" ,0 );
151
+ .executor (context1 -> {
152
+ String [] args1 = context1 .requireOne (argsKey ).split (" " );
153
+ new MiraiMcCommand ().onCommand (SpecialUtils .getSender (context1 ), args1 );
154
+ return CommandResult .success ();
171
155
})
172
- .arguments (GenericArguments .remainingJoinedStrings ((Text .of ("args" ))))
173
- .build ();
174
- CommandSpec miraiverify = CommandSpec .builder ()
175
- .description (Text .of ("MiraiMC LoginVerify Command." ))
156
+ .build (), "miraimc" );
157
+ e .register (this .pluginContainer , Command .builder ()
158
+ .shortDescription (Component .text ("MiraiMC LoginVerify Command." ))
176
159
.permission ("miraimc.command.miraiverify" )
177
- .executor ((src , arg ) -> {
178
- if (arg .<String >getOne ("args" ).isPresent ()){
179
- String argo = arg .<String >getOne ("args" ).get ();
180
- String [] args = argo .split ("\\ s+" );
181
- new MiraiVerifyCommand ().onCommand (SpecialUtils .getSender (src ), args );
182
- return CommandResult .builder ().successCount (1 ).build ();
183
- } else throw new ArgumentParseException (Text .of ("isPresent() returned false!" ),"MiraiMC" ,0 );
160
+ .executor (context -> {
161
+ String [] args = context .requireOne (argsKey ).split (" " );
162
+ new MiraiMcCommand ().onCommand (SpecialUtils .getSender (context ), args );
163
+ return CommandResult .success ();
184
164
})
185
- .arguments (GenericArguments .remainingJoinedStrings ((Text .of ("args" ))))
186
- .build ();
187
-
188
- Sponge .getCommandManager ().register (this , mirai , "mirai" );
189
- Sponge .getCommandManager ().register (this , miraimc , "miraimc" );
190
- Sponge .getCommandManager ().register (this , miraiverify , "miraiverify" );
165
+ .build (), "miraiverify" );
191
166
}
192
167
193
168
/**
194
- * 触发 GameStoppingServerEvent 时,服务器会进入最后一个 Tick,紧接着就会开始保存世界 。
169
+ * 当引擎被告知关闭并且即将关闭它负责的所有内容时,StoppingEngineEvent 将触发。如果游戏异常终止,可能不会触发 。
195
170
*/
196
171
@ Listener
197
- public void onServerStopping (GameStoppingServerEvent event ){
172
+ public void onServerStopping (StoppingEngineEvent < Server > event ){
198
173
lifeCycle .unload ();
199
174
}
200
175
176
+ /**
177
+ * RefreshGameEvent 可以响应于用户请求刷新所有配置而被激发。插件应该侦听此事件并重新加载其配置作为响应。
178
+ */
179
+ @ Listener
180
+ public void onRefresh (RefreshGameEvent event ){
181
+ try {
182
+ platformConfig .loadConfig ();
183
+ } catch (IOException e ) {
184
+ Utils .resolveException (e , SpongeLogger , "重新加载配置时出现异常!" );
185
+ }
186
+ }
187
+
201
188
public Logger getLogger () {
202
189
return logger ;
203
190
}
@@ -212,59 +199,60 @@ public PluginContainer getPluginContainer() {
212
199
213
200
@ Override
214
201
public String getPlayerName (UUID uuid ) {
215
- return Sponge .getServer ().getPlayer (uuid ).map (User :: getName ).orElse (null );
202
+ return Sponge .server ().player (uuid ).map (ServerPlayer :: name ).orElse (null );
216
203
}
217
204
218
205
@ Override
219
206
public UUID getPlayerUUID (String name ) {
220
- return Sponge .getServer ().getPlayer (name ).map (User :: getUniqueId ).orElse (null );
207
+ return Sponge .server ().player (name ).map (ServerPlayer :: uniqueId ).orElse (null );
221
208
}
222
209
223
210
@ Override
224
211
public void runTaskAsync (Runnable task ) {
225
- try (SpongeExecutorService service = Sponge .getScheduler ().createAsyncExecutor (this )){
226
- service .execute (task );
227
- }
212
+ Sponge .asyncScheduler ().submit (Task .builder ()
213
+ .plugin (this .pluginContainer )
214
+ .execute (task )
215
+ .build ());
228
216
}
229
217
230
218
@ Override
231
219
public void runTaskLaterAsync (Runnable task , long delay ) {
232
- try (SpongeExecutorService service = Sponge .getScheduler ().createAsyncExecutor (this )){
233
- service .schedule (task , delay * 50 , TimeUnit .MILLISECONDS );
234
- }
220
+ Sponge .asyncScheduler ().submit (Task .builder ()
221
+ .plugin (this .pluginContainer )
222
+ .delay (Ticks .of (delay ))
223
+ .execute (task )
224
+ .build ());
235
225
}
236
226
237
227
private final HashMap <Integer , Task > tasks = new HashMap <>();
238
228
239
229
@ Override
240
230
public int runTaskTimerAsync (Runnable task , long period ) {
241
- Task task1 = Sponge .getScheduler ().createTaskBuilder ().async ().execute (task ).intervalTicks (period ).submit (this );
242
- int taskId ; // 谁让sponge的任务id是uuid呢
243
- do {
244
- taskId = new Random ().nextInt ();
245
- } while (tasks .containsKey (taskId ));
246
- tasks .put (taskId , task1 );
247
- return taskId ;
231
+ return Sponge .asyncScheduler ().submit (Task .builder ()
232
+ .plugin (this .pluginContainer )
233
+ .interval (Ticks .of (period ))
234
+ .execute (task )
235
+ .build ()).hashCode ();
248
236
}
249
237
250
238
@ Override
251
239
public void cancelTask (int taskId ) {
252
- tasks .get (taskId ). cancel () ;
240
+ tasks .get (taskId );
253
241
}
254
242
255
243
@ Override
256
244
public String getPluginName () {
257
- return getPluginContainer (). getName () ;
245
+ return "MiraiMC" ;
258
246
}
259
247
260
248
@ Override
261
249
public String getPluginVersion () {
262
- return getPluginContainer ().getVersion ().orElse ( "reserved" );
250
+ return getPluginContainer ().metadata ().version (). getQualifier ( );
263
251
}
264
252
265
253
@ Override
266
254
public List <String > getAuthors () {
267
- return getPluginContainer (). getAuthors ( );
255
+ return Collections . singletonList ( "DreamVoid" );
268
256
}
269
257
270
258
@ Override
0 commit comments