Created
October 7, 2017 10:22
-
-
Save anonymous/1f6b7d2277bbef17cb4c4801bf6c8fa3 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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