View in color | License | Download script | History | Other scripts by: gchiu |
30-Apr 19:03 UTC
[0.057] 15.416k
[0.057] 15.416k
remind.rREBOL [
Title: "Cellphone reminder"
Date: 16-Jun-2000
Version: 0.2
File: %remind.r
Author: "Graham Chiu"
Purpose: {
Reads a file 'data.txt' containing appointment data, and sends
my cell phone a text message 5 minutes before the appointment.
}
Comment: {
The data.txt file can be manually updated, but 'remind' also polls a
pop mail box daily for messages with 'add' in the subject line.
If present, it appends the first line of the message body
to the data.txt file.
data occurs in the following format per line
period time description
period ( there are no daily reminders - use your brain! )
- weekday, then is a weekly reminder
- day, then is a monthly reminder
- month, then is a yearly reminder
- date, then is a one off reminder
time
is a time string, or in the case of yearly reminders, a day of the
month. With yearly reminders, the message is sent at 8 am.
The following is sample data.
"Friday" 19:30 "Farscape Ch2"
20 9:00 {PAYE returns}
"December" 25 {Xmas is coming}
1/1/2000 9:00 {New Millenium?}
1/1/2001 9:00 {Another New Millenium?}
"Thursday" 18:00 {News Ch1}
"Saturday" 18:00 "weekly test"
4-Dec-99 19:00 {one off test}
4 18:04 {monthly test}
"December" 4 {annual test}
"February" 30 {Will this choke?}
"Janvier" 1 {Test error condition}
}
Email: %gchiu--compkarori--co--nz
Lefts: 'GNU
Inspiration: { Missing the second part of a two part Star Trek Voyager
episode because I tuned into the wrong channel was the mother of
this script. }
library: [
level: 'intermediate
platform: none
type: 'tool
domain: [file-handling other-net]
tested-under: none
support: none
license: none
see-also: none
]
]
secure none
do %mycellphone.r
; uncomment this if you just want to test
; call-cellphone: func [message] [
; print join "Cellphone: at " [ now " " message ]
; ]
weekday: ["Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday" "Sunday" ]
months: [ "January" "February" "March" "April" "May" "June" "July" "August"
"September" "October" "November" "December" ]
weekly?: func [period] [find weekday period]
monthly?: func [period] [
either integer? period [
if ( ( period > 0 ) and ( period < 32)) [true]
][
false
]
]
yearly?: func [period] [find months period]
oneoff?: func [period] [
testdt: period
either error? try [to-date testdt] [false][true]
]
weekly-today?: func [period] [
period = pick weekday now/weekday
]
monthly-today?: func [period] [
period = now/day
]
oneoff-today?: func [period] [
testdt: period
now/date = to-date testdt
]
yearly-today?: func [month day] [
( month = pick months now/month )
and
( day = now/day )
]
parse-data: [
foreach [period ptime description] datafile [
either weekly? period [
if weekly-today? period [
append datablock reduce [ptime description]
]
][
either monthly? period [
if monthly-today? period [
append datablock reduce [ptime description]
]
][
either yearly? period [
if yearly-today? period ptime [
append datablock reduce [8:00 description]
]
][
either oneoff? period [
if oneoff-today? period [
append datablock reduce [ptime description]
]
][
prin [period ptime description ]
print join "" [ " **data error - unrecognised period '" period "' in the data.txt" ]
]
]
]
]
]
sort/skip datablock 2
]
send-messages: [
foreach [stime message] datablock [
either (now/time + 00:05) > stime [
; less than 5 mins to scheduled event or
; already past the event - so go for it
call-cellphone message
][
wait ( stime - now/time - 00:05 )
call-cellphone message
]
]
]
wait-till-2am: [
either now/time < 2:00 [
wait ( 2:00 - now/time )
][
wait ( 24:00 - now/time + 2:00 )
]
]
get-new-messages: [
do wait-till-2am
inbox: open load %popspec.r ;file contains POP email box info
remove-mail: true
while [not tail? inbox] [
mail: import-email message: first inbox
print mail/subject
print mail/content
subject: trim mail/subject
if subject = "add" [
write %mail.txt mail/content ; there must be an
text: first read/lines %mail.txt ; easier way to do this!
text: join text newline
write/append %data.txt text
]
either remove-mail [remove inbox][inbox: next inbox]
]
close inbox
]
remind: [
print "Reminder now active ..."
forever [
datafile: load %data.txt ; get the new data each day
datablock: make block! 100 ; reinitialise the data block each day
do parse-data ; get the events scheduled for today
do send-messages ; send all the messages
do get-new-messages ; look for new data, and change the data.txt file
]
] Notes
|