Comic Server

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}