Updated 2008-08-28 12:26:59 by dkf

Michael Jacobson 8/9/02 ~ In NewzPoint there is a comic page generator that gets the current comics from uComics.com and displays them in a single page. I have updated some of this code for my current release and this is a standalone version. To use just run this code in Wish and then point your browser at http://localhost:9108/Comic .

The server behind this code just takes the arguments (+ seperated) and executes them in a safe interp. So you can also do commands like http://localhost:9108/info+command or http://localhost:9108/set+a+23 . Have fun with this...

MPJ 10/29/02 ~ fixed generated title of History page
 if {0} {
	 Comic Server by Michael Jacobson
	 Usage: Launch the server in Wish and then point your
		browser to http://localhost:9108/Comic
			this will dynamiclly generate a current comic
			page.  I have tested this in Mozilla and IE and
			it seems to work (based on NewzPoint comic page
			code)
 }

 proc Comic {} {
	global topdir
	set comic_delay {Doodles 3 \
			{Calvin and Hobbes} 4018 \
			{Captain RibMan} 1 \
			{Reynolds Unwrapped} 4}
	set comic_info {tmann {Annie} \
		tmbre {Brenda Starr} \
 		tmbro {Broom Hilda} \
		tmdic {Dick Tracy} \
		tmfba {Fred Basset} \
		tmgas {Gasoline Alley} \
		tmgil {Gil Thorp} \
		ad {Adam@Home} \
		ba {Baldo} \
		bo {Boondocks} \
		ch {Calvin and Hobbes} \
		cs {Crankshaft} \
		ft {FoxTrot} \
		fu {The Fusco Brothers} \
		ga {Garfield} \
		hc {Heart of the City} \
		jm {James} \
		tmlol {Lola} \
		tmmid {The Middletons} \
		mb {Mister Boffo} \
		tmmon {Monkey House} \
		pr {Preteena} \
		ss {Stone Soup} \
		wes {Willy 'N Ethel} \
		bi {The Big Picture} \
		ca {Cathy} \
		cr {Crabby Road} \
		dp {The Duplex} \
		tmdun {Dunigan's People} \
		tmkud {Kudzu} \
		tmmee {Meehan Streak} \
		tmplu {Pluggers} \
		rl {Real Life Adventures} \
		tmsho {Shoe} \
		tmtja {That's Jake} \
		tmcap {Captain RibMan} \
		bz {Bizarro} \
		cl {Close to Home} \
		tmloo {Loose Parts} \
		oe {Oddly Enough} \
		ob {Overboard} \
		tmqui {The Quigmans} \
		rw {Reynolds Unwrapped} \
		tmsyl {Sylvia} \
		tmntf {9 to 5} \
		tmbot {Bottomliners} \
		co {Cornered} \
		tmhel {Helen, Sweetheart of the Internet} \
		psm {P.S. Mueller} \
		tmddu {Dear Dudley} \
		db {Doonesbury} \
		nq {Non Sequitur} \
		bl {In the Bleachers} \
		tm {Tank McNamara} \
		tmani {Animal Crackers} \
		tmbou {Bound and Gagged} \
		tmcat {Cats with Hands} \
		tmmix {Mixed Media} \
		zi {Ziggy} }
	set ComicOutput {}
	append ComicOutput {<HTM-+L>} "\n"
	append ComicOutput {<HEAD>} "\n"
	append ComicOutput {<TITLE>Daily Comic Page from ucomics.com</TITLE>} "\n"
	append ComicOutput {</HEAD>} "\n"
	append ComicOutput {<BODY>} "\n"
	append ComicOutput "<center><B><H1>Daily Comic Page</B></H1>\n"
	append ComicOutput "Page Generated on [clock format [clock second] -format %c]</center>\n"
	set src {<img src="http://images.ucomics.com/comics/}
	foreach {one name} $comic_info {
		#http://www.ucomics.com/patoliphant/viewoa.htm
		regsub -all {@} $name {at} newname
		regsub -all {'} $newname {} newname
		regsub -all { } $newname {} newname
		regsub -all {,} $newname {} newname
		regsub -all {\.} $newname {} newname
		append ComicOutput "<H2><a href=http://www.ucomics.com/[string tolower $newname]/view$one.htm>$name</a> ~ "
		set offset 0
		if {[lsearch $comic_delay $name] > -1} {set offset [lindex $comic_delay [expr [lsearch $comic_delay $name] + 1]]}
		append ComicOutput "<a href=ComicHist+$one+7+$offset>Past Week</a> ~ "
		append ComicOutput "<a href=ComicHist+$one+30+$offset>Past Month</a></H2>\n"
		set outt $src
		if {[lsearch $comic_delay $name] == -1} {
			set year [clock format [clock second] -format %Y]
			set date [clock format [clock second] -format %y%m%d]
		} else {
			set day [lindex $comic_delay [expr [lsearch $comic_delay $name] + 1]]
			set sec [expr $day * 24 * 60 * 60]
			set year [clock format [expr [clock second] - $sec] -format %Y]
			set date [clock format [expr [clock second] - $sec] -format %y%m%d]
		}
		append outt $one/$year/$one$date
		append outt {.gif">}
		append ComicOutput "$outt\n"
	}
	append ComicOutput {</BODY>} "\n"
	append ComicOutput {</HTML>} "\n"
 }

 proc ComicHist {page freq {offset 0}} {
	set comic_info {tmann {Annie} \
		tmbre {Brenda Starr} \
		tmbro {Broom Hilda} \
		tmdic {Dick Tracy} \
		tmfba {Fred Basset} \
		tmgas {Gasoline Alley} \
		tmgil {Gil Thorp} \
		ad {Adam@Home} \
		ba {Baldo} \
		bo {Boondocks} \
		ch {Calvin and Hobbes} \
		cs {Crankshaft} \
		ft {FoxTrot} \
		fu {The Fusco Brothers} \
		ga {Garfield} \
		hc {Heart of the City} \
		jm {James} \
		tmlol {Lola} \
		tmmid {The Middletons} \
		mb {Mister Boffo} \
		tmmon {Monkey House} \
		pr {Preteena} \
		ss {Stone Soup} \
		wes {Willy 'N Ethel} \
		bi {The Big Picture} \
		ca {Cathy} \
		cr {Crabby Road} \
		dp {The Duplex} \
		tmdun {Dunigan's People} \
		tmkud {Kudzu} \
		tmmee {Meehan Streak} \
		tmplu {Pluggers} \
		rl {Real Life Adventures} \
		tmsho {Shoe} \
		tmtja {That's Jake} \
		tmcap {Captain RibMan} \
		bz {Bizarro} \
		cl {Close to Home} \
		tmloo {Loose Parts} \
		oe {Oddly Enough} \
		ob {Overboard} \
		tmqui {The Quigmans} \
		rw {Reynolds Unwrapped} \
		tmsyl {Sylvia} \
		tmntf {9 to 5} \
		tmbot {Bottomliners} \
		co {Cornered} \
		tmhel {Helen, Sweetheart of the Internet} \
		psm {P.S. Mueller} \
		tmddu {Dear Dudley} \
		db {Doonesbury} \
		nq {Non Sequitur} \
		bl {In the Bleachers} \
		tm {Tank McNamara} \
		tmani {Animal Crackers} \
		tmbou {Bound and Gagged} \
		tmcat {Cats with Hands} \
		tmmix {Mixed Media} \
		zi {Ziggy} }
	foreach {one name} $comic_info {
		if {[string equal $one $page]} {
			regsub -all {@} $name {at} newname
			regsub -all {'} $newname {} newname
			regsub -all { } $newname {} newname
			regsub -all {,} $newname {} newname
			regsub -all {\.} $newname {} newname
			break
		}
	}
	set ComicOutput {}
	append ComicOutput {<HTM-+L>} "\n"
	append ComicOutput {<HEAD>} "\n"
	append ComicOutput "<TITLE>History Comic Page for $name</TITLE>" "\n"
	append ComicOutput {</HEAD>} "\n"
	append ComicOutput {<BODY>} "\n"
	append ComicOutput "<center><B><H1>History Comic Page for $name</B></H1>\n"
	append ComicOutput "Page Generated on [clock format [clock second] -format %c]</center>\n"
	set src {<img src="http://images.ucomics.com/comics/}
	for {set i 0} {$i < $freq} {incr i} {
		set adjclksec [expr [clock second] - (($i + $offset) * 24 * 60 *60)]
		set linkpage [clock format $adjclksec -format %Y/%m/%d]
		append ComicOutput "<H2><a href=http://picayune.uclick.com/[string tolower $newname]/$linkpage>$linkpage</a></H2>\n"
		set outt $src
		set year [clock format $adjclksec -format %Y]
		set date [clock format $adjclksec -format %y%m%d]
		append outt $one/$year/$one$date
		append outt {.gif">}
		append ComicOutput "$outt\n"
	}
	return $ComicOutput
 }

 # run all the requested commands in the safe interp
 interp create -safe foo

 # link in the two above procs to the safe interp
 interp alias foo ComicHist {} ComicHist
 interp alias foo Comic {} Comic

 #   http server modified from JCW's hpeek.tcl
 proc http_start {port} {
	global http_fd
	if {$port} {
		set http_fd [socket -server http_accept $port]
	}
 }

 # accept a new incoming tcp/ip connection
 proc http_accept {sock h p} {
	fconfigure $sock -blocking 0
	fileevent $sock readable [list http_request $sock]
 }

 # process an http request
 proc http_request {sock} {
	set line [gets $sock]
	if {[fblocked $sock]} return
	fileevent $sock readable ""
	fconfigure $sock -buffering full
	set p /
	regexp {/[^ ]*} $line p
	regsub -all / $p :: p
	puts $sock "HTTP/1.0 200 OK\n"
	set p [string trimleft $p :]
	regsub -all "::" $p "/" p
	fconfigure $sock -encoding binary -translation binary
	set cmd [lindex [split $p +] 0]
	if {[lsearch [foo eval info command] $cmd] != -1} {
		catch {foo eval [split $p +]} genout
		puts -nonewline $sock $genout
	} else {
		puts -nonewline $sock "Not a valid User Script"
	}
	catch {flush $sock}
	catch {close $sock}
 }

 if {$argv == ""} {
	set port 9108
 } else {
	set port [lindex $argv 0]
 }

 catch {http_start $port}