@Override public void onStatus(String status) { System.out.println(status); if (isGettingPlayerNumber == 1) { Pattern p = Pattern.compile("There are [0-9]*/[0-9]* players online"); Matcher m = p.matcher(status); if (!m.find()) return; String s = m.group(0); s = s.substring(10, s.length() - 15); playerNumber = s; isGettingPlayerNumber = 2; return; } else if (isGettingPlayerNumber == 2) { try { status = status.substring(status.lastIndexOf("]") + 1); status = status.substring(status.indexOf(":") + 1); } catch (Exception e) { HMCLog.warn("Failed to substring status.", e); } String[] s; if (StrUtils.isNotBlank(status)) s = status.trim().split(", "); else s = new String[0]; Pair<String, String[]> p = new Pair<>(playerNumber, s); isGettingPlayerNumber = 0; gettingPlayerNumber.accept(p); return; } if (isDone == false) { Pattern p = Pattern.compile( "\\[INFO\\] Done \\([0-9]*\\.[0-9]*s\\)! For help, type \"help\" or \"\\?\""); Matcher m = p.matcher(status); if (m.find()) { stoppedEvent.execute(null); timer = new Timer(); timerTasks.clear(); for (int i = 0; i < schedules.size(); i++) { if (schedules.get(i).timeType == Schedule.TIME_TYPE_SERVER_STARTED) { ScheduleTranslator.translate(this, schedules.get(i)).run(); continue; } if (schedules.get(i).timeType != Schedule.TIME_TYPE_PER) continue; long mill = (long) Math.floor(schedules.get(i).per * 60 * 1000); timerTasks.add(ScheduleTranslator.translate(this, schedules.get(i))); timer.schedule(timerTasks.get(i), mill, mill); } pastTimer = new javax.swing.Timer(1000, this); pastTimer.start(); System.out.println("Server started!"); sendStatus("*** 服务端已启动完成 ***"); isDone = true; } } if (status.length() > 20) if (status.substring(20).contains("[SEVERE] This crash report has been saved to: ")) for (Schedule schedule : schedules) if (schedule.timeType == Schedule.TIME_TYPE_SERVER_CRASHED) ScheduleTranslator.translate(this, schedule).run(); }
@Override public boolean call(Object sender, Integer t) { if (t == 0) { sendStatus("*** 服务端已停止 ***"); System.out.println("Server stopped successfully"); } else { sendStatus("*** 服务端崩溃了!(错误码:" + t + ") ***"); System.err.println("Server crashed(exit code: " + t + ")"); } isRunning = false; for (Schedule schedule : schedules) if (schedule.timeType == Schedule.TIME_TYPE_SERVER_STOPPED) ScheduleTranslator.translate(this, schedule).run(); if (timer != null) timer.cancel(); if (pastTimer != null) pastTimer.stop(); restoreMods(); if (isRestart) { try { run(); } catch (IOException ex) { MessageBox.Show("重启失败!"); HMCLog.warn("Failed to launch!", ex); } isRestart = false; } return true; }
@Override public void actionPerformed(ActionEvent e) { c.setTime(new Date()); if (c.get(Calendar.SECOND) != 0) return; int minute = c.get(Calendar.MINUTE); for (Schedule schedule : schedules) { if (schedule.timeType != Schedule.TIME_TYPE_PAST_HOUR) continue; if (schedule.per == minute) ScheduleTranslator.translate(this, schedule).run(); } }