ruleset byu.events {
meta {
name "byu_events"
use module io.picolabs.wrangler alias wrangler
use module html
shares categories, category
}
global {
event_domain = "byu_events"
api_url = "https://calendar.byu.edu/api/Events.json?categories="
nameFromId = function(id){
ent:categories.keys().filter(function(k){
ent:categories{k} >< id
}).head()
}
categories = function(_headers){
html:header("select from categories","")
+ <<
Select from categories
>>
+ html:footer()
}
category = function(category_id,_headers){
events = http:get(api_url+category_id){"content"}.decode()
html:header("byu events by category","")
+ <<
BYU events
Category: #{nameFromId(category_id)}
#{events.map(function(v){
all_day = v{"AllDay"}.decode()
start_dt = v{"StartDateTime"}
full_url = v{"FullUrl"}
<<- #{all_day => start_dt.split(" ").head() | start_dt}
- #{v{"Title"}}
>>
}).join("")}
>>
+ html:footer()
}
}
rule initialize {
select when wrangler ruleset_installed where event:attr("rids") >< meta:rid
every {
wrangler:createChannel(
["byu_events"],
{"allow":[{"domain":event_domain,"name":"*"}],"deny":[]},
{"allow":[{"rid":meta:rid,"name":"*"}],"deny":[]}
)
}
fired {
raise byu_events event "factory_reset"
}
}
rule keepChannelsClean {
select when byu_events factory_reset
foreach wrangler:channels(["byu_events"]).reverse().tail() setting(chan)
wrangler:deleteChannel(chan.get("id"))
}
rule inferCategoryIds {
select when byu_events factory_reset
pre {
all_events = http:get(api_url+"all"){"content"}.decode()
accumulate = function(ans,ev){
cat_name = ev{"CategoryName"}
arr = ans.get(cat_name).defaultsTo([])
ans.put(cat_name,arr.union(ev{"CategoryId"}))
}
starting_with = ent:categories.defaultsTo({})
categories = all_events.reduce(accumulate,starting_with)
}
fired {
ent:categories := categories
}
}
}