/* Do not remove the headers from this file! see /USAGE for more info. */ inherit M_DAEMON_DATA; mapping birthdays = ([]); mapping reverse = ([]); nosave string today; void refresh() { today = ctime(time())[4..9]; } void repeat_refresh() { today = ctime(time())[4..9]; call_out((:repeat_refresh:),86400); } varargs string array query_birthdays(string when) { mixed item; refresh(); item = birthdays[when || today]; return item ? explode(item, ",") : ({ }); } varargs mapping query_month(string mo) { int i; mapping ret = ([]); if (!mo) mo = today[0..2]; for (i = 1; i <= 10; i++) { string tmp = birthdays[mo + " " + i]; if (tmp) ret[mo + " " + i] = tmp; } for (i = 10; i <= 31; i++) { string tmp = birthdays[mo + " " + i]; if (tmp) ret[mo + " " + i] = tmp; } return ret; } void add_birthday(string name, string when) { if (strlen(when) == 5) when = when[0..2] + " " + when[3..4]; if (strlen(when) != 6 || when[3] != ' ') error("Bad date format\n"); switch (when[0..2]) { case "Jan": case "Feb": case "Mar": case "Apr": case "May": case "Jun": case "Jul": case "Aug": case "Sep": case "Oct": case "Nov": case "Dec": break; case "jan": case "feb": case "mar": case "apr": case "may": case "jun": case "jul": case "aug": case "sep": case "oct": case "nov": case "dec": when = capitalize(when); break; default: error("Bad date format\n"); } if (member_array(when[4], " 0123456789") == -1 || member_array(when[5], "0123456789") == -1) error("Bad date format\n"); if (when[4] == '0') when[4] = ' '; if (member_array(',', name) != -1) error("Bad name\n"); if (reverse[name]) { mixed tmp = explode(birthdays[reverse[name]], ","); tmp -= ({ name }); birthdays[reverse[name]] = implode(tmp, ","); } reverse[name] = when; if (birthdays[when]) birthdays[when] += "," + name; else birthdays[when] = name; save_me(); } void report() { string array bdays = query_birthdays(); if (!sizeof(bdays)) return; bdays = map(bdays, (: capitalize :)); printf("*** Todays birthdays: %s\n", implode(bdays, ", ")); } void create() { int start = time(); int end = start + 86400; string today = ctime(start)[0..9]; ::create(); /* binary search for start of tomorrow */ while (start != end) { int mid = (start + end)/2; if (ctime(mid)[0..9] == today) start = mid + 1; else end = mid; } refresh(); call_out((: repeat_refresh :), start - time()); }