/** * Fetch the events for a specific calendar and date range * * @param int The calendar ID * @param int Start time stamp * @param int End time stmap * @param int 1 to fetch unapproved events too * @param int The user ID to fetch private events for (0 fetches none) * @return array Array of events */ function get_events($calendar, $start, $end, $unapproved = 0, $private = 1) { global $db, $mybb; // We take in to account timezones here - we add/subtract 12 hours from our GMT time ranges $start -= 12 * 3600; $end += 12 * 3600; $visible_where = ''; if ($unapproved != 1) { $visible_where = " AND e.visible='1'"; } $events_cache = array(); $query = $db->query("\n\t\tSELECT u.*, e.*\n\t\tFROM " . TABLE_PREFIX . "events e\n\t\tLEFT JOIN " . TABLE_PREFIX . "users u ON (u.uid=e.uid)\n\t\tWHERE e.cid='{$calendar['cid']}' {$visible_where} AND ((e.endtime>={$start} AND e.starttime<={$end}) OR (e.endtime=0 AND e.starttime>={$start} AND e.starttime<={$end})) AND ((e.uid='{$mybb->user['uid']}' AND private='1') OR private!='1')\n\t\tORDER BY endtime DESC\n\t"); while ($event = $db->fetch_array($query)) { if ($event['ignoretimezone'] == 0) { $offset = $event['timezone']; } else { $offset = $mybb->user['timezone']; } $event['starttime_user'] = $event['starttime'] + $offset * 3600; // Single day event if ($event['endtime'] == 0) { $event_date = gmdate("j-n-Y", $event['starttime_user']); $events_cache[$event_date][] = $event; } else { $event_date = explode("-", gmdate("j-n-Y", $event['starttime_user'])); $event['endtime_user'] = $event['endtime'] + $offset * 3600; $event['weekday_start'] = $calendar['startofweek']; $start_day = gmmktime(0, 0, 0, $event_date[1], $event_date[0], $event_date[2]); $event['repeats'] = my_unserialize($event['repeats']); // Event does not repeat - just goes over a few days if ($event['repeats']['repeats'] == 0) { if ($start_day < $start) { $range_start = gmmktime(0, 0, 0, gmdate("n", $start), gmdate("j", $start), gmdate("Y", $start)); } else { $range_start = $start_day; } } else { $range_start = fetch_next_occurance($event, array("start" => $start, "end" => $end), $start_day, true); } $first = ""; $event_date = explode("-", gmdate("j-n-Y", $range_start)); // Get rid of hour/minutes because sometimes they cause the events to stretch into the next day $range_end = gmmktime(23, 59, 59, gmdate("n", $event['endtime_user']), gmdate("j", $event['endtime_user']), gmdate("Y", $event['endtime_user'])); while ($range_start < $range_end) { // Outside the dates we care about, break! (No unnecessary looping here!) if ($range_start > $end || !$range_start) { break; } if ($range_start >= $start) { $day_date = gmdate("j-n-Y", $range_start); if ($first && $day_date != "{$first}") { $events_cache[$day_date][] =& $events_cache["{$first}"][$count]; } else { if (!$first) { if (!isset($events_cache[$day_date])) { $events_cache[$day_date] = array(); } $count = count($events_cache[$day_date]); $first = $day_date; $events_cache[$day_date][] = $event; } } } if ($event['repeats']['repeats'] == 0) { $range_start += 86400; } else { $range_start = fetch_next_occurance($event, array("start" => $start, "end" => $end), $range_start); } } } } return $events_cache; }
/** * @return bool */ function verify_repeats() { $event =& $this->data; if (!is_array($event['repeats']) || !$event['repeats']['repeats']) { return true; } if (!$event['endtime']) { $this->set_error("only_ranged_events_repeat"); return false; } switch ($event['repeats']['repeats']) { case 1: $event['repeats']['days'] = (int) $event['repeats']['days']; if ($event['repeats']['days'] <= 0) { $this->set_error("invalid_repeat_day_interval"); return false; } case 2: break; case 3: $event['repeats']['weeks'] = (int) $event['repeats']['weeks']; if ($event['repeats']['weeks'] <= 0) { $this->set_error("invalid_repeat_week_interval"); return false; } if (count($event['repeats']['days']) == 0) { $this->set_error("invalid_repeat_weekly_days"); return false; } asort($event['repeats']['days']); break; case 4: if ($event['repeats']['day']) { $event['repeats']['day'] = (int) $event['repeats']['day']; if ($event['repeats']['day'] <= 0 || $event['repeats']['day'] > 31) { $this->set_error("invalid_repeat_day_interval"); return false; } } else { if ($event['repeats']['occurance'] != "last") { $event['repeats']['occurance'] = (int) $event['repeats']['occurance']; } $event['repeats']['weekday'] = (int) $event['repeats']['weekday']; } $event['repeats']['months'] = (int) $event['repeats']['months']; if ($event['repeats']['months'] <= 0 || $event['repeats']['months'] > 12) { $this->set_error("invalid_repeat_month_interval"); return false; } break; case 5: if ($event['repeats']['day']) { $event['repeats']['day'] = (int) $event['repeats']['day']; if ($event['repeats']['day'] <= 0 || $event['repeats']['day'] > 31) { $this->set_error("invalid_repeat_day_interval"); return false; } } else { if ($event['repeats']['occurance'] != "last") { $event['repeats']['occurance'] = (int) $event['repeats']['occurance']; } $event['repeats']['weekday'] = (int) $event['repeats']['weekday']; } $event['repeats']['month'] = (int) $event['repeats']['month']; if ($event['repeats']['month'] <= 0 || $event['repeats']['month'] > 12) { $this->set_error("invalid_repeat_month_interval"); return false; } $event['repeats']['years'] = (int) $event['repeats']['years']; if ($event['repeats']['years'] <= 0 || $event['repeats']['years'] > 4) { $this->set_error("invalid_repeat_year_interval"); return false; } break; default: $event['repeats'] = array(); } require_once MYBB_ROOT . "inc/functions_calendar.php"; $event['starttime_user'] = $event['starttime']; $event['endtime_user'] = $event['endtime']; $next_occurance = fetch_next_occurance($event, array('start' => $event['starttime'], 'end' => $event['endtime']), $event['starttime'], true); if ($next_occurance > $event['endtime']) { $this->set_error("event_wont_occur"); return false; } return true; }