Skip to content

Instantly share code, notes, and snippets.

Created October 7, 2017 10:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/1f6b7d2277bbef17cb4c4801bf6c8fa3 to your computer and use it in GitHub Desktop.
Save anonymous/1f6b7d2277bbef17cb4c4801bf6c8fa3 to your computer and use it in GitHub Desktop.
var AdvancedCalendar = AdvancedCalendar || {
version: 1.0,
clearImage: 'https://s3.amazonaws.com/files.d20.io/images/4277467/iQYjFOsYC5JsuOPUCI9RGA/max.png?1401938659',
_Ordinal: function(num) {
var ones=(num%10);
var tens=((num%100)-ones);
switch(ones)
{
case 1: return ((10 == tens) ? 'th' : 'st');
case 2: return ((10 == tens) ? 'th' : 'nd');
case 3: return ((10 == tens) ? 'th' : 'rd');
default: return 'th';
}
},
_GetOptionsFromTokens: function (tokens) {
var options={};
var switches=_.filter(tokens, function(tok){
return null != tok.match(/^--/);
});
_.each(switches,function(s){
switch(s)
{
case '--lunar': options.showLunarPhases=true; break;
case '--nolunar': options.showLunarPhases=false; break;
}
});
return options;
},
CheckInstall: function(calendar) {
if(! state.hasOwnProperty('AdvancedCalendar') || state.AdvancedCalendar.version != AdvancedCalendar.version)
{
log("Reseting calendar data...");
// Default Settings stored in the state.
state.AdvancedCalendar = {
version: AdvancedCalendar.version,
now: calendar.startingDate,
setting: calendar.setting,
holidays : calendar.holidays,
schedule: {},
}
}
},
AddLog: function(date, character, log, isNote) {
var dateId = (AdvancedCalendar._GetTotalDaysForDate(date)).toString();
if (! _.has(state.AdvancedCalendar.schedule, dateId)) {
state.AdvancedCalendar.schedule[dateId] = {};
state.AdvancedCalendar.schedule[dateId]["logs"] = [];
} else if (! _.has(state.AdvancedCalendar.schedule[dateId], "logs")) {
state.AdvancedCalendar.schedule[dateId]["logs"] = [];
}
state.AdvancedCalendar.schedule[dateId]["logs"].push(
{character: character, log: log, isNote: isNote });
},
GetLogs: function(date) {
var dateId = (AdvancedCalendar._GetTotalDaysForDate(date)).toString();
var sched = state.AdvancedCalendar.schedule;
if (_.has(sched, dateId) && _.has(sched[dateId], "logs")) {
return sched[dateId]["logs"];
} else {
return [];
}
},
AdvanceDays: function(days){
var n = state.AdvancedCalendar.now;
var s = state.AdvancedCalendar.setting;
log(n);
var y = Math.floor(days/s.daysOfYear);
days-=(y*s.daysOfYear);
log(n.day + days);
log(s.monthsOfTheYear[n.month -1].days);
while (n.day + days > s.monthsOfTheYear[n.month -1].days) {
days = days - s.monthsOfTheYear[n.month -1].days + n.day;
n.day = 0;
n.month++;
if (n.month > 12) {
n.month = 1;
n.year++;
}
}
log("days: " + days);
log("years: " + y);
n.day += days;
n.year = n.year + y;
state.AdvancedCalendar.now=n;
},
RemoveDays: function(days){
var n = state.AdvancedCalendar.now;
var s = state.AdvancedCalendar.setting;
var y = Math.floor(days/s.daysOfYear);
days-=(y*s.daysOfYear);
while (days >= n.day) {
days = days - n.day;
n.month--;
if (n.month < 1) {
n.month = 12;
n.year--;
}
n.day = s.monthsOfTheYear[n.month -1].days;
}
n.day-=days;
n.year-=y;
state.AdvancedCalendar.now=n;
},
_GetTotalDaysForDate: function(d) {
var s = state.AdvancedCalendar.setting;
var totalDays = d.year*s.daysOfYear;
for (var i=0; i < d.month-1; i++) {
totalDays += s.monthsOfTheYear[i].days;
}
totalDays += d.day;
return totalDays;
},
_GetWeekDayForDate: function(d) {
var s = state.AdvancedCalendar.setting;
var totalDays = AdvancedCalendar._GetTotalDaysForDate(d);
var weekday = totalDays % s.daysOfTheWeek.length;
return ( weekday ? weekday : 7);
},
_GetHolidays: function(d, options) {
var opt=_.defaults( (options||{}), {
showHolidays: true
});
var s = state.AdvancedCalendar.holidays;
var dayId = d.day + "/" + d.month;
if (opt.showHolidays && _.has(s, dayId)) {
var temp = "<div>";
_.each(s[dayId], function(h) {
var t = '<span style="font-weight: bold;">' + h.name;
if (h.area != "") {
t += " (" + h.area + "): </span>"
} else {
t += ": :</span>"
}
if (h.description != "") {
t += h.description;
}
temp += "<br>" + t;
});
temp += "</div>";
return temp;
} else {
return '';
}
},
_GetLogs: function(d, options) {
var opt=_.defaults( (options||{}), {
showLogs: true
});
var logs = AdvancedCalendar.GetLogs(d);
if (opt.showLogs) {
var temp = "<div>";
_.each(logs, function(h) {
if (!h.isNote) {
var t = '<span style="font-weight: bold;">' + h.character + ": ";
if (h.description != "") {
t += h.log;
}
temp += "<br>" + t;
}
});
temp += "</div>";
return temp;
} else {
return '';
}
},
_GetDayForDate: function(d,options){
var opt=_.defaults((options||{}),{
});
var n = state.AdvancedCalendar.now;
if(d.year == n.year && d.month == n.month && d.day == n.day) {
return '<div style="white-space: nowrap;">'
+'<span style="font-weight: bold; color: #990000; font-size: 13px; background: white; border-radius: 2px; padding: 2px; box-shadow: 0 0 1px 1px red;">'+d.day
+'</span>'
+'</div>';
}
else if( (d.year < n.year)
|| ( (d.year <= n.year) && (d.month<n.month))
|| ( (d.year <= n.year) && (d.month<=n.month) && (d.day<n.day)) ) {
return '<div style="white-space: nowrap;">'
+'<strike style="color:red; font-weight: bold;">'
+'<span style="font-weight:bold; color:#999999; font-size: 13px;">'
+d.day
+'</span>'
+'</strike>'
+'</div>';
}
else {
return '<div style="white-space: nowrap;">'
+'<span style="font-weight: bold; color: #000099; font-size: 13px;">'
+d.day
+'</span>'
+'</div>';
}
},
_GetMonthForDate: function(d,options){
var opt=_.defaults((options||{}),{
showYear: true,
showMonthNumber: false
});
log(d);
var s=state.AdvancedCalendar.setting;
var daysHeader='';
_.each(s.daysOfTheWeek,function(d){
daysHeader+='<th><div style="width: 25px;margin: 0px auto;">'+d.substring(0,2)+'</div></th>';
});
var mday=_.clone(d);
var weeks='';
mday.day=1;
var rows = 0;
//First week can be trick
var firstWeekDay = AdvancedCalendar._GetWeekDayForDate(mday);
//placing empty spaces for month that doesn't start at first week day.
weeks+='<tr>'
for (i=1; i < firstWeekDay; i++) {
weeks+='<td style="vertical-align: middle; text-align:right;">';
weeks+= '<div style="white-space: nowrap;">'
+'<strike style="color:red; font-weight: bold;">'
+'<span style="font-weight:bold; color:#999999;">'
+ ' '
+'</span>'
+'</strike>'
+'</div>';
weeks+='</td>';
}
//Filling the rest of the week
for (i = firstWeekDay; i <= s.daysOfTheWeek.length; i++) {
weeks+='<td style="vertical-align: middle; text-align:center; padding:0px 5px;">';
weeks+=AdvancedCalendar._GetDayForDate(mday,opt);
weeks+='</td>';
mday.day++;
}
weeks+='</tr>';
var restingWeeks = Math.ceil( (s.monthsOfTheYear[mday.month -1].days -1) / s.daysOfTheWeek.length);
var j = 0;
for (i= 0; i < restingWeeks; i++) {
weeks+='<tr>';
for (j=0; j < s.daysOfTheWeek.length && mday.day <= s.monthsOfTheYear[mday.month -1].days; j++) {
weeks+='<td style="vertical-align: middle; text-align:center; padding:0px 5px;">';
weeks+=AdvancedCalendar._GetDayForDate(mday,opt);
weeks+='</td>';
mday.day++;
}
//filling the last week
if (j < s.daysOfTheWeek.length) {
for (var k = j; k < s.daysOfTheWeek.length; k++) {
weeks+='<td style="vertical-align: middle; text-align:center; padding:0px 5px;">';
weeks+= '<div style="white-space: nowrap;">'
+'<strike style="color:red; font-weight: bold;">'
+'<span style="font-weight:bold; color:#999999;">'
+ ' '
+'</span>'
+'</strike>'
+'</div>';
weeks+='</td>';
}
}
weeks+='</tr>';
}
return '<table style="background-color:#ffffff; min-height:210px; border-radius:5px; box-shadow: 0 0 5px 1px rgba(0,0,0,0.5);">'
+'<tr><th colspan="'+s.daysOfTheWeek.length+'">'
+((opt.showMonthNumber)?('<div style="float:right; padding: 0px 3px;">'+d.month+'</div>'):(''))
+'<div style="margin-left: auto; margin-right: auto;">' + s.monthsOfTheYear[d.month-1]["name"]
+((opt.showYear)?(' '+d.year):(''))
+'</div>'
+'</th></tr>'
+'<tr style="border-bottom: 1px solid #aaaaaa;">'+daysHeader+'</tr>'
+weeks
+'</table>';
},
_GetYearForDate: function(d,options){
var opt=_.defaults((options||{}),{
showYear: false,
showMonthNumber: true
});
var s=state.AdvancedCalendar.setting;
var yday=_.clone(d);
yday.day=1;
yday.month=1;
var months='';
_.each(s.monthsOfTheYear, function(r){
months+='<div style="float:left;padding: 2px 2px;">';
months+=AdvancedCalendar._GetMonthForDate(yday,opt);
months+='</div>';
yday.month++;
});
return '<div style="background-color: darkseagreen; padding: 15px;">'
+'<div style="margin: 3px 3px; font-weight: bold; font-size: 27px; color: white; text-shadow: 0px 0px 6px rgba( 0 , 0 , 0 , 0.9 ); border-bottom: 3px solid white; padding: 1px; margin-bottom: 11px; padding-bottom: 10px;">'+d.year+' '+s.yearPrefix+'</div>'+months +'<div style="clear:both;"></div></div>';
},
_GetDateAsString: function(date){
var s=state.AdvancedCalendar.setting;
return s.daysOfTheWeek[AdvancedCalendar._GetWeekDayForDate(date)-1] + " - " +date.day + " "
+ s.monthsOfTheYear[date.month-1]["name"] + ', ' + date.year + ' ' +s.yearPrefix;
},
ShowDate: function(d,options) {
var opt=_.defaults((options||{}),{
});
sendChat('','/direct '
+'<div style="color: moccasin; font-weight: bold; font-family: Arial; text-align: center; padding: 10px; '
+'background: #333; border-radius: 10px; box-shadow: 2px 2px 3px 1px rgba(0,0,0,0.5); '
+'border: 4px solid #fff; font-size: 16px; margin: 0 10px;">'
+AdvancedCalendar._GetDateAsString(d,opt)
+' '
+AdvancedCalendar._GetHolidays(d, opt)
+AdvancedCalendar._GetLogs(d, opt)
+'</div>'
);
},
ShowDateAsWhisper: function(who, d, options) {
sendChat('','/w GM '
+AdvancedCalendar._GetDateAsString(d,options)
+' '
);
},
ShowFutureDate: function(d, options) {
var opt=_.defaults((options||{}),{
});
sendChat('','/direct '
+'<div style="color: moccasin; font-weight: bold; font-family: Arial; text-align: center; padding: 10px; '
+'background: #333; border-radius: 10px; box-shadow: 2px 2px 3px 1px rgba(0,0,0,0.5); '
+'border: 4px solid #fff; font-size: 16px; margin: 0 10px;">'
+AdvancedCalendar._GetDateAsString(d,opt)
+' '
+AdvancedCalendar._GetHolidays(d, opt)
+AdvancedCalendar._GetLogs(d, opt)
+'</div>'
);
},
ShowMonth: function(d,options){
var opt=_.defaults((options||{}),{
});
sendChat('','/direct '+AdvancedCalendar._GetMonthForDate(d,opt));
},
ShowYear: function(d,options){
var opt=_.defaults((options||{}),{
showYear: false
});
sendChat('','/direct '+AdvancedCalendar._GetYearForDate(d,opt));
},
GoToDate: function(day, month, year) {
var s = state.AdvancedCalendar.setting;
if (month < 1 || month > 12) {
return;
}
if (day < 1 || day > s.monthsOfTheYear[state.AdvancedCalendar.now.month-1]) {
return;
}
state.AdvancedCalendar.now = {
day : day,
month : month,
year : year
};
},
HandleInput: function(tokens, msg, isGM){
var options = AdvancedCalendar._GetOptionsFromTokens(tokens);
tokens=_.filter(tokens, function(tok){
return null == tok.match(/^--/);
});
var cmd = tokens[0] || 'month';
switch (cmd)
{
/* Show the current month calendar */
case 'month':
AdvancedCalendar.ShowMonth(state.AdvancedCalendar.now,options);
break;
/* Show the current year calendar */
case 'year':
AdvancedCalendar.ShowYear(state.AdvancedCalendar.now,options);
break;
/* Show todays info in detail */
case 'today':
AdvancedCalendar.ShowDate(state.AdvancedCalendar.now,options);
break;
/* Advance the current date by a number of days (1 of argument is ommited) */
case 'next':
if (!isGM) return;
var days=tokens[1] || 1;
AdvancedCalendar.AdvanceDays(days);
AdvancedCalendar.ShowDate(state.AdvancedCalendar.now,options);
break;
/* Go back a number of days (1 of argument is ommited) in the current date */
case 'prev':
if (!isGM) return;
var days=tokens[1] || 1;
AdvancedCalendar.RemoveDays(days);
AdvancedCalendar.ShowDate(state.AdvancedCalendar.now,options);
break;
/* Go to a specific date using the parameters according to DD MM YYYY */
case 'goto':
if (!isGM) return;
var day = parseInt(tokens[1]);
var month = parseInt(tokens[2] || state.AdvancedCalendar.now.month);
var year = parseInt(tokens[3] || state.AdvancedCalendar.now.year);
AdvancedCalendar.GoToDate(day, month, year);
AdvancedCalendar.ShowDate(state.AdvancedCalendar.now,options);
break;
case 'see':
var day = parseInt(tokens[1]);
var month = parseInt(tokens[2] || state.AdvancedCalendar.now.month);
var year = parseInt(tokens[3] || state.AdvancedCalendar.now.year);
var seedate = {
day : day,
month : month,
year : year
};
AdvancedCalendar.ShowFutureDate(seedate, options);
break;
case 'log':
var mindex = msg.content.indexOf('-m ');
if (mindex <0) return;
var logdata = msg.content.substring(mindex +3);
log(logdata);
AdvancedCalendar.AddLog(state.AdvancedCalendar.now, msg.who, logdata, false);
break;
case 'note':
if (!isGM) return;
var mindex = msg.content.indexOf('-m ');
if (mindex <0) return;
var logdata = msg.content.substring(mindex +3);
log(logdata);
AdvancedCalendar.AddLog(state.AdvancedCalendar.now, msg.who, logdata, true);
break;
}
},
RegisterEventHandlers: function() {
on("chat:message", function (msg) {
// Exit if not an api command
if (msg.type != "api") return;
// clean up message bits.
msg.who = msg.who.replace(" (GM)", "");
msg.content = msg.content.replace("(GM) ", "");
var isGM = playerIsGM(msg.playerid);
log(msg.content);
var tokenized = msg.content.split(" ");
var command = tokenized[0];
switch(command)
{
case "!cal":
case "!calendar":
{
AdvancedCalendar.HandleInput(_.rest(tokenized), msg, isGM);
}
break;
case "!s":
{
sendChat('',
'/direct <div style="border: 2px solid red;"><b>state.AdvancedCalendar</b><br><pre>'
+JSON.stringify(state.AdvancedCalendar,undefined," ").replace(/\n/g,'<br>')
+"</pre></div>" );
}
break;
case "!t":
{
AdvancedCalendar._GetWeekDayForDate(state.AdvancedCalendar.now);
}
break;
}
});
}
};
on("ready",function(){
log("AdvancedCalendar - Version " + AdvancedCalendar.version);
log("Installing " + CALENDAR.name + "...");
AdvancedCalendar.CheckInstall(CALENDAR);
AdvancedCalendar.RegisterEventHandlers();
});
var GregorianCalendar = GregorianCalendar || {
name: "Grecorian Calendar",
startingDate : {
day: 11,
month: 8,
year: 2016
},
setting : {
daysOfYear : 365,
daysOfTheWeek: [
'Sunday',
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday'
],
monthsOfTheYear: [
{name:'January', days: 31},
{name:'February', days: 28},
{name:'March', days: 31},
{name:'April', days: 30},
{name:'May', days: 31},
{name:'June', days: 30},
{name:'July', days: 31},
{name:'August', days: 31},
{name:'September', days: 30},
{name:'October', days: 31},
{name:'November', days: 30},
{name:'December', days: 31}
],
yearPrefix: 'AD',
}
};
CALENDAR = GregorianCalendar;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment