class ScrapeCalendarJob < ApplicationJob queue_as :default def clean_up_lecture_title(unit_code, short_lecture_title) end def perform(*args) ics_file = HTTParty.get("https://mytimetable.bath.ac.uk/ical?6519757b&group=false&timetable=!MjAyMyFzdHVkZW50c2V0ITRDRjQ5MjlGRTg1M0Q4N0MyMDZENTVDNUQ3QTJFNzk0&eu=amMzMDkxQGJhdGguYWMudWs=&h=MiuDbRiudE_Yf7B25v2SfEuFCtmYGkFb5sAUI3yGmtY=") calendars = Icalendar::Calendar.parse(ics_file) calendar = calendars.first unit_codes = Course.all.map(&:unit_code) events = calendar.events.map do |event| summary = event.summary match = summary.split('-') # Handle odd events we don't care about next if match.length != 2 unit_code = match[0] short_lecture_title = match[1] start_time = event.dtstart.to_time event_uuid = event.uid.to_s next if unit_code.nil? || short_lecture_title.nil? || event_uuid.nil? || start_time.nil? || !unit_code.in?(unit_codes) { unit_code:, short_lecture_title:, start_time:, event_uuid:, } end events .compact .filter { |attrs| attrs[:unit_code].in? unit_codes } .group_by { |attrs| attrs[:unit_code] } .map do |unit_code, course_events| course = Course.find_by(unit_code: unit_code) lecture_counter = 0 course_events.each do |event| # Naive check to see if we've already created this lecture if course.lectures.find_by(event_uuid: event[:event_uuid]).present? || course.lectures.find_by( start_time: (event[:start_time].beginning_of_hour + 5.minutes)..(event[:start_time].beginning_of_hour + 1.hour + 5.minutes) ).present? next end if event[:short_lecture_title].starts_with? "Lec" lecture_counter += 1 title = "Lecture #{lecture_counter}" else title = event[:short_lecture_title] end course.lectures.create!( title: title, start_time: event[:start_time], event_uuid: event[:event_uuid], ) end end end end