This repository has been archived on 2025-11-02. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
dashboard/get_calendar_events.rb
2022-09-20 00:27:25 +01:00

108 lines
2.6 KiB
Ruby

#"aCnPi-aKBsH-ALNWZ-zfAiz-SQYdK"
require "active_support"
require "builder"
require "net/https"
require "rexml/document"
require "rexml/xpath"
require "icalendar"
require "net-http-report"
require "time"
@user="usr"
@password="pwd"
NAMESPACES = { "xmlns:d" => 'DAV:', "xmlns:c" => "urn:ietf:params:xml:ns:caldav" }
@calendars = ["cal_link_1", "cal_link_2"]
@startTime=Time.now
@endTime=@startTime.next_month(1)
def errorhandling response
#raise AuthenticationError if response.code.to_i == 401
#raise NotExistError if response.code.to_i == 410
#raise APIError if response.code.to_i >= 500
end
class ReportVEVENT
attr_accessor :tstart, :tend
attr :xml
def initialize( tstart=nil, tend=nil )
@tstart = tstart
@tend = tend
@xml = Builder::XmlMarkup.new(:indent => 2)
@xml.instruct!
end
def to_xml
xml.c 'calendar-query'.intern, NAMESPACES do
xml.d :prop do
xml.d :getetag
xml.c 'calendar-data'.intern
end
xml.c :filter do
xml.c 'comp-filter'.intern, :name=> 'VCALENDAR' do
xml.c 'comp-filter'.intern, :name=> 'VEVENT' do
xml.c 'time-range'.intern, :start=> "#{tstart}Z", :end=> "#{tend}Z"
end
end
end
end
end
end
def __create_http url
uri = URI(url)
@host = uri.host
@port = uri.port.to_i
@url = uri.path
http = Net::HTTP.new(@host, @port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
http
end
def find_events
@events = []
@yaml_events = 'events:
'
@calendars.each do |calendar_url|
result = ""
events = []
res = nil
__create_http(calendar_url).start { |http|
req = Net::HTTP::Report.new(calendar_url, initheader = {'Content-Type'=>'application/xml','Depth'=>'1'} )
req.basic_auth @user, @password
req.body = ReportVEVENT.new(@startTime.utc.strftime("%Y%m%dT%H%M%S"), @endTime.utc.strftime("%Y%m%dT%H%M%S") ).to_xml
res = http.request(req)
}
errorhandling res
result = ""
xml = REXML::Document.new(res.body)
REXML::XPath.each( xml, '//c:calendar-data/', {"c"=>"urn:ietf:params:xml:ns:caldav"} ){|c| result << c.text}
r = Icalendar::Calendar.parse(result)
unless r.empty?
r.each do |calendar|
calendar.events.each do |event|
@events << event
@yaml_events << ' - name: >-
' + event.summary + '
date: ' + event.dtstart.to_s + '
background: "lightblue"
'
puts event.rrule
end
end
end
end
if @events.empty?
return false
end
end
find_events
puts @yaml_events
File.write('/home/me/dashboard/timeline.yml', @yaml_events)