ksh chatroom snaphost history


In late November, 2001, changes were made to this web site to create an ongoing log of the chatroom. The code below should no longer be used, due to its impact on the host computer. Instead, see grabchat for a tool that will return for you the previous day's chat log. If you want some other day's chat log, feel free to modify the tool.


Purpose: to maintain a disk file history of the tcler's wiki chat room, without having to be logged on all the time.

This version has a peculiar bug that causes chat room http: references to be repeated in the disk file. I've not figured out why yet.

This script was written in ksh because that was the language with which the author was most comfortable.


 #! /bin/ksh
 # Author: Larry W. Virden < mailto:[email protected] >
 # Date:    Sept. 19, 2001
 # Version: 1.6
 # Purpose: to scrape tcl'ers chat log pages and accumulate them
 # NOTE: This script is going to record private messages and memos to your
 #   id, so you should be careful to review the information before making it
 #   public.  Also, right now it does not toss away /help msgs, the
 #  WELCOME message, etc.
 #
 # USAGE: scrape NUMBER_OF_SECONDS

 set -u

 if [ "$#" -ne 1 ] ; then
        echo "USAGE: $0 snapshot_time_in_seconds" 2>&1
        exit 1
 fi

 pslock()
 {
 set -o nolog
 machine=$(hostname)
 if [ -f $HOME/.pslock ] ; then
        read psmachine psprocess < $HOME/.pslock
        if [ "$psmachine" != "$machine" ] ; then
                # lock is remote
                prefix="rsh -n $psmachine "
        else
                prefix=""
        fi
        eval $prefix kill -0 $psprocess 2>/tmp/$$.lockck
        if [ -s /tmp/$$.lockck ] ; then
                echo "Removing (probably) dead link $psmachine:$psprocess" >&2
                rm /tmp/$$.lockck
                rm $HOME/.pslock
                echo  "$machine $$" > $HOME/.pslock
                chmod 600 $HOME/.pslock
        else
                rm /tmp/$$.lockck
                return 1
        fi
 else
        echo  "$machine $$" > $HOME/.pslock
        chmod 600 $HOME/.pslock
        return 0
 fi
 }
 pslock
 if [ $? -ne 0 ] ; then
        exit 2
 fi

 trap 'echo "TRAP encountered";rm $HOME/.pslock;exit 3' \
        HUP QUIT INT ABRT BUS SEGV SYS PIPE TERM \
        USR1 USR2 

 BASE="$HOME"                   # chat history file storage directory
 current=$BASE/chat.current
 alert="^ *\[[^-]"
 options=$HOME/.chat.rc         # configuration options
 if [ -f "$options" ] ; then
        . $options              # DANGER!  contents need to be carefully
                                # considered
 fi

 time="$1"
 timestamp="0"

 #      Set scrape to some non-interactive command that can fetch a
 #      page of text
 scrape="/projects/intranet/bin/lynx -dump -nolist -nolog -nopause -nostatus -noprint -dont_wrap_pre -hiddenlinks=ignore -noreferer -width=10240"

 # Set URL to your chat information
 # To get this URL, use your web browser to visit the
 #  chat room, and then check the URL information for the dialog frame.
 # This script expects that the user has the chat room configured for
 #  new messages to appear at the bottom of the screen.
 # WARNING: The URL contains your chat password - so this file needs to be
 #  protected appropriately.
 URL=""

 # Looping forever
 while [ /bin/true ] ; do
    date=$(date +%Y%m%d)
    history=$BASE/chat.$date
    working1=$BASE/chat.scrape.$date
    working2=$BASE/chat.working.$date

    rm $current
    ln -s $history $current

 #  Create file with today's date
    touch $history
    touch $working1
    touch $working2
    chmod 600 $history $working1 $working2

 #  Looping once every N seconds
    while [ /bin/true ] ; do

 #   Scrape the chat's page into a file

      sdate=$(date)
      $scrape $URL > $BASE/chat.scrape.$date
 #   diff the historical file and the new scraping
 #   The deletion of 4 lines is because of my use of lynx;  It will
 #   be removed once I figure out how to tell lynx to stop adding stuff to
 #   the output.  If you don't use lynx, then you probably won't need that
 #   sed segment.
      diff $history $working1 | sed -n '/^>/p'| \
        sed -e '1,4d' | sed -e 's!^> !!' | \
        sed -e '/REFRESH(180/d' | \
        sed -e 's!\[[0-9]\{1,\}\]http!http!g' | \
        egrep -v '^ *[^ ]+ has (entered|left) the chat' > $working2

 #   Manipulate the results so that the unique output is then appended
 #    to the history
      if [ -s $working2 ] ; then
        if [ "$timestamp" = "1" ] ; then
                echo "$sdate" >> $history
        fi
        cat $working2 >> $history 
        gegrep -s -i "$alert" $working2
        if [ $? -eq 0 ] ; then
                echo ".Seen on Tcler's Chat" >>/dev/console
                gegrep -i "$alert" $working2 >> /dev/console
        fi
      fi

 #   If the date has changed, exit the inner loop
 #
      cdate=$(date +%Y%m%d)
      if [ $cdate != $date ] ; then
        break
      fi
      sleep $time
    done

 done

See also Tcl chatroom snaphost history (2) for a pure Tcl version that will also run on non-*nix platforms.