package commands;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import polly.core.MSG;
import de.skuzzle.polly.sdk.Command;
import de.skuzzle.polly.sdk.MyPolly;
import de.skuzzle.polly.sdk.Parameter;
import de.skuzzle.polly.sdk.Signature;
import de.skuzzle.polly.sdk.Types;
import de.skuzzle.polly.sdk.User;
import de.skuzzle.polly.sdk.exceptions.CommandException;
import de.skuzzle.polly.sdk.exceptions.DuplicatedSignatureException;
import de.skuzzle.polly.sdk.time.DateUtils;
public class CalendarCommand extends Command {
public CalendarCommand(MyPolly polly) throws DuplicatedSignatureException {
super(polly, "cal"); //$NON-NLS-1$
this.createSignature(MSG.calendarSig0Desc,
new Parameter(MSG.calendarSig0Date, Types.DATE));
this.setHelpText(MSG.calendarHelp);
}
@Override
protected boolean executeOnBoth(User executer, String channel,
Signature signature) throws CommandException {
if (this.match(signature, 0)) {
Date d = signature.getDateValue(0);
String[] lines = calendarString(d).split("\n"); //$NON-NLS-1$
for (String line : lines) {
this.reply(channel, line);
}
}
return false;
}
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
c.set(Calendar.MONTH, 4);
System.out.println(calendarString(c.getTime()));
}
private static String calendarString(Date d) {
StringBuilder b = new StringBuilder();
Calendar firstDay = Calendar.getInstance();
firstDay.setTime(d);
firstDay.set(Calendar.DAY_OF_MONTH, 1);
System.out.println(firstDay.getTime());
Calendar lastMonth = Calendar.getInstance();
lastMonth.setTime(d);
lastMonth.add(Calendar.MONTH, -1);
// days last month
int ld = lastMonth.getActualMaximum(Calendar.DAY_OF_MONTH);
lastMonth.set(Calendar.DAY_OF_MONTH, ld);
/*
* no one will ever get what happens here
*/
lastMonth.add(Calendar.DAY_OF_MONTH, -diff(firstDay.get(Calendar.DAY_OF_WEEK)));
SimpleDateFormat sdf = new SimpleDateFormat("MMMM yyyy"); //$NON-NLS-1$
b.append(MSG.bind(MSG.calendarFor, sdf.format(d)));
b.append("\n"); //$NON-NLS-1$
b.append("\u0002\u001fKW | Mo Di Mi Do Fr Sa So\n"); //$NON-NLS-1$
System.out.println(lastMonth.getTime());
for (int j = 0; j < 6; ++j) {
b.append(pad(lastMonth.get(Calendar.WEEK_OF_YEAR)));
b.append(" | "); //$NON-NLS-1$
for (int i = 0; i < 7; ++i) {
String prefix = ""; //$NON-NLS-1$
String postfix = ""; //$NON-NLS-1$
if (lastMonth.before(firstDay) ||
lastMonth.get(Calendar.MONTH) > firstDay.get(Calendar.MONTH)) {
prefix = "\u000314"; //$NON-NLS-1$
postfix = "\u000f"; //$NON-NLS-1$
} else if (DateUtils.isToday(lastMonth.getTime())) {
prefix = "\u0002\u000304"; //$NON-NLS-1$
postfix = "\u000f"; //$NON-NLS-1$
} else if (DateUtils.isSameDay(lastMonth.getTime(), d)) {
prefix = "\u0002"; //$NON-NLS-1$
postfix = "\u000f"; //$NON-NLS-1$
}
b.append(prefix);
b.append(pad(lastMonth.get(Calendar.DAY_OF_MONTH)));
b.append(postfix);
b.append(" "); //$NON-NLS-1$
lastMonth.add(Calendar.DAY_OF_MONTH, 1);
}
b.append("\n"); //$NON-NLS-1$
}
return b.toString();
}
private static int diff(int day) {
switch (day) {
case Calendar.MONDAY: return -1;
case Calendar.TUESDAY: return 0;
case Calendar.WEDNESDAY: return 1;
case Calendar.THURSDAY: return 2;
case Calendar.FRIDAY: return 3;
case Calendar.SATURDAY: return 4;
case Calendar.SUNDAY: return 5;
default: return 0;
}
}
private static String pad(int num) {
if (num < 10) {
return "0" + Integer.toString(num); //$NON-NLS-1$
}
return Integer.toString(num);
}
}