1#!/usr/local/bin/perl
2
3# before anything else, the script needs to find out its own name
4#
5# some servers (notably IIS on windows) don't set the cwd to the script's
6# directory before executing it.  So we get that information
7# from $0 (the full name & path of the script).
8BEGIN{($_=$0)=~s![\\/][^\\/]+$!!;push@INC,$_}
9
10$name = $0;
11$name =~ s/.+\/.+\///;  # for unix
12$name =~ s/.+\\.+\\//;  # for windows
13$path = $0;
14$path =~ s/(.+\/).+/$1/g;  # for unix
15$path =~ s/(.+\\).+/$1/g;  # for windows
16
17
18
19# check for required modules.
20require "includes.pl";
21
22$module_found=0;
23foreach $temp_path (@INC) {
24  if (-e "$temp_path/JSON") {
25$module_found=1;}
26}
27if ($module_found == 0) {
28  $fatal_error=1;
29  $error_info .= "unable to locate required module <b>JSON</b>!\n";
30} else {
31	require "JSON/PP58.pm";
32	use JSON::PP;
33}
34
35if ($fatal_error == 1) {
36  &fatal_error();  # print error and bail out
37}
38
39my $new_lines = "";
40my @events_in_file = ();
41
42&load_calendars();
43local $current_cal_id = 0;
44
45
46# load upcoming event data
47open (FH, "$options{email_reminders_datafile}") || ($debug_info .="\nUnable to open file $options{email_reminders_datafile}");
48flock FH,2;
49my @lines=<FH>;
50close datafile;
51
52foreach $line (@lines) {  # need pre-load to ensure we only need one call to normalize_timezone
53  if ($line !~ /\w/) {next};  # skip blank spaces
54
55  my $temp_line = $line;
56  $temp_line =~ s/<\/?email_reminder>//g;
57  my ($evt_id) = &xml_quick_extract($temp_line, "evt_id");
58  my ($before) = &xml_quick_extract($temp_line, "before");
59  my ($script_url) = &xml_quick_extract($temp_line, "script_url");
60  $script_url = &decode($script_url);
61  my ($extra_text) = &xml_quick_extract($temp_line, "extra_text");
62  $extra_text = &decode($extra_text);
63  my ($to_address) = &xml_quick_extract($temp_line, "email_address");
64  $to_address = &decode($to_address);
65
66  &load_event($evt_id);
67  push @events_in_file, {evt_id => $evt_id,
68                         before => $before,
69                         script_url => $script_url,
70                         extra_text => $extra_text,
71                         to_address => $to_address,
72                         line => $line};
73
74  #push @events_to_remind, $evt_id;
75}
76&normalize_timezone();
77
78my $results = "";
79
80foreach $event_reminder_ref (@events_in_file) {
81  my %event_reminder_stuff = %{$event_reminder_ref};
82  my $evt_id = $event_reminder_stuff{evt_id};
83
84  %current_event = %{$events{$evt_id}};
85  my $current_cal_id = $current_event{cal_ids}[0];
86
87  %current_calendar = %{$calendars{$current_cal_id}};
88
89  $rightnow = time() + 3600 * $current_calendar{gmtime_diff};
90
91  my $to_address = $event_reminder_stuff{to_address};
92  my $extra_text = $event_reminder_stuff{extra_text};
93  my $script_url = $event_reminder_stuff{script_url};
94  my $before = $event_reminder_stuff{before};
95
96  my $event_timestamp = $current_event{start};
97  $date_string = &nice_date_range_format($current_event{start}, $current_event{end}, " - ");
98
99  my $event_time = "";
100  if ($current_event{all_day_event} ne "1") {
101    $event_time = &nice_time_range_format($current_event{start}, $current_event{end});
102  }
103
104  my $reminder_text = $lang{email_reminder_text};
105
106  $reminder_text =~ s/###time###/$event_time/g;
107  $reminder_text =~ s/###title###/$current_event{title}/g;
108  $reminder_text =~ s/###date###/$date_string/g;
109  $reminder_text =~ s/###details###/$current_event{details}/g;
110  $reminder_text =~ s/###extra text###/$extra_text/g;
111  $reminder_text =~ s/###link###/$script_url?view_event=1&evt_id=$current_event{id}/g;
112
113  my $check_timestamp = $event_timestamp;
114  $check_timestamp -= $calendars{$current_event{cal_ids}[0]}{gmtime_diff};
115
116  if (($check_timestamp - $rightnow) < $before) {
117    if ($current_event{title} ne "") {  # blank title == deleted event
118      $test_reminder_results = &send_email_reminder(\%current_event, $to_address, $reminder_text);
119      if ($test_reminder_results eq "1") {
120        $results .= "Reminder for event $evt_id ($current_event{title}) sent successfully to <i>$to_address</i>!\n";
121      } else {
122        $results .= "Reminder not sent to <i>$to_address</i>:<br/><br/>($test_reminder_results)\n";
123      }
124    }
125  } else {
126    $new_lines .= $event_reminder_stuff{line};
127  }
128}
129
130open (FH, ">$options{email_reminders_datafile}") || ($debug_info .="\nUnable to open file $options{email_reminders_datafile} for writing!");
131flock FH,2;
132print FH $new_lines;
133close datafile;
134
135$results = "No email reminders to send!" if ($results eq "");
136
137$results =~ s/\n/<br\/>\n/g;
138$debug_info =~ s/\n/<br\/>\n/g;
139
140print <<p1;
141Cache-control: no-cache,no-store,private
142Content-Type: text/html; charset=iso-8859-1\n
143<html>
144<body>
145$results
146$debug_info
147</html>
148</body>
149p1
150
151sub fatal_error() {
152  $error_info =~ s/\n/<br>/g;
153
154  $html_output .=<<p1;
155Cache-control: no-cache,no-store,private
156Content-Type: text/html; charset=iso-8859-1\n
157<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
158<html>
159<head>
160<title>Plans error!</title>
161</head>
162<body>
163
164<b>Plans error:</b><br>
165$error_info
166p1
167  if ($debug_info ne "") {
168    $debug_info =~ s/\n/<br>/g;
169    $html_output .=<<p1;
170<hr>
171Debug info:<br>
172$debug_info
173p1
174
175  }
176
177  $html_output .=<<p1;
178</body>
179</html>
180p1
181
182  print $html_output;
183  exit(0);
184}
185
186
187