package org.manalith.ircbot.plugin.time; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.joda.time.DateTime; import org.joda.time.DateTimeConstants; import org.joda.time.Period; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.joda.time.format.PeriodFormatter; import org.joda.time.format.PeriodFormatterBuilder; import org.manalith.ircbot.common.stereotype.BotCommand; import org.manalith.ircbot.plugin.SimplePlugin; import org.manalith.ircbot.resources.MessageEvent; import org.springframework.stereotype.Component; @Component public class TimePlugin extends SimplePlugin { private final String[] commands = { "!시간", "!time", "!월요일", "!금요일", "!토요일", "!일요일", "!주말" }; private final DateTimeFormatter dateFormatter = DateTimeFormat .forPattern("yyyy년 MM월 dd일 HH시 mm분 ss초"); private final PeriodFormatter periodFormatter = new PeriodFormatterBuilder() .appendYears().appendSuffix("년 ").appendMonths().appendSuffix("월 ") .appendWeeks().appendSuffix("주 ").appendDays().appendSuffix("일 ") .appendHours().appendSuffix("시 ").appendMinutes() .appendSuffix("분 ").appendSeconds().appendSuffix("초") .printZeroNever().toFormatter(); @Override public String getName() { return "시간계산"; } @Override public String getCommands() { return StringUtils.join(commands, '|'); } @Override public void onMessage(MessageEvent event) { String cmd = event.getMessage(); if (ArrayUtils.contains(commands, cmd)) { DateTime now = new DateTime(); switch (cmd) { case "!시간": case "!time": event.respond(dateFormatter.print(now)); break; case "!월요일": { String str = getPeriod(now, DateTimeConstants.MONDAY); event.respond(String.format("다음 월요일 생성까지 %s 남았습니다.", str)); break; } case "!금요일": { String str = getPeriod(now, DateTimeConstants.FRIDAY); event.respond(String.format("다음 금요일 생성까지 %s 남았습니다.", str)); break; } case "!토요일": { String str = getPeriod(now, DateTimeConstants.SATURDAY); event.respond(String.format("다음 토요일 생성까지 %s 남았습니다.", str)); break; } case "!일요일": { String str = getPeriod(now, DateTimeConstants.SUNDAY); event.respond(String.format("다음 일요일 생성까지 %s 남았습니다.", str)); break; } case "!주말": { String str = getPeriod(now, DateTimeConstants.SATURDAY); event.respond(String.format("다음 주말 생성까지 %s 남았습니다.", str)); break; } } } } @BotCommand({ "dday" }) public String getPeriod(String year, String monthOfYear, String dayOfMonth) { DateTime target = new DateTime(Integer.parseInt(year), Integer.parseInt(monthOfYear), Integer.parseInt(dayOfMonth), 0, 0); Period period = new Period(new DateTime(), target); return periodFormatter.print(period); } public DateTime getNextDate(DateTime source, int dayOfWeek) { DateTime date = new DateTime(source.getYear(), source.getMonthOfYear(), source.getDayOfMonth(), 0, 0); if (date.getDayOfWeek() < dayOfWeek) { return date.withDayOfWeek(dayOfWeek); } else { return date.plusWeeks(1).withDayOfWeek(dayOfWeek); } } private String getPeriod(DateTime now, int dayOfWeek) { Period period = new Period(now, getNextDate(now, dayOfWeek)); return periodFormatter.print(period); } }