Hotclock

I use a program on my Macintosh during the radio show to remind me when to take a commercial break – the network is pretty finicky about getting out on time. The program warns me a minute before I need to break, then counts me down 10 seconds before and says “Break!” when I’m supposed to stop talking. It mostly works.

Fullscreen.jpg

A number of people who noticed the alerts on my Ustream stream have asked me for the source, so here it is, one year to the day after I wrote it.

A couple of caveats: it’s in Applescript, requires Quicksilver (for the really big text), and must be saved as a “Run On Idle” script. The main “on idle” loop needs to be called again and again – if the program quits after “on run” nothing will happen.

If you want to actually use this (instead of just looking at it and mocking me) you’ll probably want to change the break times.

I’m posting this as is and without support, mostly so that I can point people here who want to know “how I do that?”

-- Application to warn host when it's time to take a break
-- in the last minute before the break post word "wrap"
-- do a ten second countdown to end then show "break"

-- Requires Quicksilver!

-- Leo Laporte, 8 February 2007
-- v 1.0

property wraps : {"16:35", "27:35", "44:35", "56:25"}
property breaks : {"17:35", "28:35", "45:35", "57:25"}
property countdown : {"10", "9", "8", "7", "6", "5", "4", "3", "2", "1", "Break!"}

global currentSegment, breakTime, wrapTime

on run
	-- find current segment
	set now to getTime()
	set currentSegment to 1
	set wrapTime to item currentSegment of wraps

	repeat until now is less than wrapTime
		-- keep going until the next segment 
		if currentSegment is greater than or equal to (length of wraps) then
			set currentSegment to 1
		else
			set currentSegment to currentSegment + 1
		end if
		set wrapTime to item currentSegment of wraps
	end repeat
end run

on idle
	-- runs until applet is quit
	set now to getTime()
	set wrapTime to item currentSegment of wraps

	if now is greater than or equal to wrapTime then
		-- there's a minute (or less) left

		tellHost("Wrap...")

		set breakTime to item currentSegment of breaks
		repeat until now is greater than or equal to breakTime
			set now to getTime()
		end repeat

		-- in final ten seconds, display countdown
		repeat with msg in countdown
			tellHost(msg)
			-- delay 1
		end repeat

		-- go to next break time
		if currentSegment is greater than or equal to (length of breaks) then
			set currentSegment to 1
		else
			set currentSegment to currentSegment + 1
		end if

		set waitTime to (10 * minutes) -- don't come back for 10 minutes
	else
		set waitTime to 5 -- check every five seconds so as not to use cycles unnecessarily
	end if

	return waitTime
end idle

-- subroutines

on tellHost(message)
	tell application "Quicksilver"
		show large type message as text
	end tell
end tellHost

on getTime()
	set timeStr to time string of (current date)

	-- Get the "hour"	
	set Pos to offset of ":" in timeStr
	set theHour to characters 1 thru (Pos - 1) of timeStr as string
	set timeStr to characters (Pos + 1) through end of timeStr as string

	-- Get the "minute"
	set Pos to offset of ":" in timeStr
	set theMin to characters 1 thru (Pos - 1) of timeStr as string
	set timeStr to characters (Pos + 1) through end of timeStr as string

	--Get the "second"
	set Pos to offset of " " in timeStr
	set theSec to characters 1 thru (Pos - 1) of timeStr as string

	return (theMin & ":" & theSec) as string
end getTime

6 Replies to “Hotclock”

Comments are closed.