• CompuBBS - open source bulletin board system

    From SPP@anon246813579@gmail.com to soc.culture.indian,soc.culture.usa,soc.culture.asian.american on Wed Sep 24 08:29:25 2025
    From Newsgroup: soc.culture.indian

    --------------------------------------------------------------------------------

    readme.txt --------------------------------------------------------------------------------

    The CompuBBS code : please use it to communicate :-)
    Satya P. Popuri
    Bachelors in Computer Science

    Silence is death. The need for an open source bulletin board system is
    vital for communication to prosper across this earth planet. In my
    travels I have discovered certain tools that help many to research and
    develop with ease while maintaining a sound and cogent system toward
    such an end. This CompuBBS is an open source version of the NYUNET
    bulletin board system I discovered while mistakenly studying and working
    there in my quest for enlightenment. As fate would have it, I chanced
    upon certain tools that I now present with an assortment of other tools
    I have discovered in my triste with death while working in the I.T.
    industry.

    Indeed, such tools have helped me here and there to maintain a
    consistent understanding of not only Unix fundamentals but also a feel
    good experience that is second to none. These tools represent the love
    affair that never quit. Not only has it valorized and inundated across
    this earth planet but has been the aims and means of my reason for
    living.

    Man needs a proper meditation of the heart and this tool list is one of
    the things I have used to be able to better understand myself and
    others. It was during the college years that I was exposed to such
    tools in over 3 universities and 11 years of employment here and there.
    They just work. Given the level of complexity the graphical user
    interface engenders, it is refreshing to fall back on a tool base that is
    time immemorial. So please feel free to use them and contribute toward
    the open source endeavor to foster freedom of speech.

    For me prayer works but without a means of communication that is
    uninhibited and unmoderated we are at a loss for words. That is the
    shear beauty of the traditional tools as in tin of the USENET NEWS servers;
    as well as the irssi of the IRC servers. It goes on. The list of tools
    I mention are as follows based on over 20 years of experience with the
    UNIX pragma.

    0. Alpine - a nice email client
    1. Tin - a nice newsreader
    2. Irssi - a nice internet relay chat client
    3. Lynx - a nice web browser
    4. Gopher - a nice ftp client
    5. Nano - a nice text editor
    6. Bash - a nice command prompt
    7. T.I.A. - a nice programming editor [This is known as Tiny IDE
    Ada/Anything editor. I am trying to encourage the Ada programming
    language over C++ and Java.]
    8. Nslookup - a nice directory service
    9. Telnet - a nice remote login tool
    A. Tailer - a nice monitoring tool [This I discovered at a .com I worked
    for. It simply goes to an i.p. address and searches for a string. If
    the string is not there an alert is generated. Maybe the code is out there
    in the wild blue yonder of the internet.]
    B. Calc - a nice calculator tool
    C. ECN - a nice day trading game [This is Josh Green's day trading
    algorithm in Python when he worked at Daytek. I posted it somewhere on
    USENET. If you are able to find it please let me know. I encourage
    learning how to deal with money because "when men and women get together [money] gets in the way".] That too, they say, education is about
    learning how to communicate and learning how to deal with money.
    D. Tutor - a nice Unix tutorial [This tutorial I discovered at New York University. I wonder if there is an open source version of it.] It is
    a great way to learn the Unix operating system.
    E. Bible - a nice text based bible program [Does anyone know of an old
    school Bible program that is text based and worthy of praise? Prayer to
    Jesus Christ works!]
    F. Sendpage - this is a nice beeper software that helps to keep in touch
    with loved ones and others through the beeper or pager tool.
    $. Exit - a simple exit to the whole compubbs tools for research and development.

    I have foregoed using the queue tool as it may cause some problems as
    far as managing and maintaining. The queue tool is always an issue for
    any I.T. computer lab as it is often the target of attacks by
    miscreants. There are other tools, such as 'talk', that are also good
    if you know how to use them in the code I mentioned. I refrained from mentioning talk because it requires input about the user and terminal to literally talk in using a text based interface. Maybe someone can
    design a text based form to fill out, which will allow for one to use talk
    and then go back to the main menu. The file list for this compubbs
    endeavor is as follows:

    compubbs.sh
    bash-menu.sh
    bash-draw.sh
    readme.txt

    Please find the code in the following USENET newsgroups:

    soc.culture.indian
    soc.culture.asian.american
    soc.culture.usa

    Let's setup servers of this type of an unmoderated bulletin board
    system. While the internet has encouraged reciprocity or mutual
    respect, the radio has encouraged comaraderie or mutual trust. This
    cybermatrix endeavor which I am trying to contravecy is an attempt
    toward synergy or mutual success. As well, there is a need for unity or
    mutual purpose. The T.E.A.M. acronymn for "together everyone
    accomplishes more" is worth encouraging.

    The following are some nice networks I am encouraging toward some level
    of mutuality:

    # - network - tool - industry - mutuality ----------------------------------------------------------
    1 - Simulcast - radio - spiritual - comaradery
    2 - Internet - computer - technological - reciprocity
    3 - Cybermatrix - television - financial - synergy
    4 - Tektocracy - beeper(a.k.a. smartwatch) - political - unity
    5 - Sneakerweb - tablet - educational - infidelity
    6 - Darkring - console - architectural - ?
    7 - Datatron - tracker(i.e. fitbit) - medical - ?
    8 - Heliopex - watch - recreational - ?
    9 - Transpace - PDA(a.k.a smartphone) - sexual - ?
    10 - Stargate - controller - audiovisual - ?

    Anyway, join us in this endeavor to liberate humanity from the vice grip
    of the Zen ways of life of the idiot and wrong. I pray to Jesus
    Christ that you find them useful and worthy of praise as I have. This
    compubbs is a brief history of time and space of a world so good. In a
    way, the nature of the good is to overcome and defeat the bad. So, God
    bless and God speed for Jesus Christ is God. Always a pleasure. May
    you and your loved one's in the name of Jesus Christ be well, happy, prosperous, peaceful, healthy, and safe.

    P.S.
    Let it be said, "[financial] frustration creates a great imbalance
    in mind and body." We need to allay our antagonizing forces so that
    universal basic income is provided for all concerned. The UNIX
    may help with learning how to communicate but the UBI may help with
    learning how to deal with monies.

    Sincerely,

    Satya P. Popuri
    (a.k.a. Steven)

    Signature:
    "The nature of the good is to overcome and defeat the bad." - divine voice

    --------------------------------------------------------------------------------

    compubbs.sh file --------------------------------------------------------------------------------

    #!/bin/bash

    # Ensure we are running under bash
    if [ "$BASH_SOURCE" = "" ]; then
    /bin/bash "$0"
    exit 0
    fi

    #
    # Load bash-menu script
    #
    # NOTE: Ensure this is done before using
    # or overriding menu functions/variables.
    #
    . "bash-menu.sh"


    ################################
    ## Example Menu Actions
    ##
    ## They should return 1 to indicate that the menu
    ## should continue, or return 0 to signify the menu
    ## should exit.
    ################################
    actionA() {
    alpine
    return 1
    }

    actionB() {
    tin -r -g freenews.netfront.net
    return 1
    }

    actionC() {
    irssi
    return 1
    }

    actionD() {
    lynx
    return 1
    }

    actionE() {
    gopher
    return 1
    }

    actionF() {
    nano
    return 1
    }

    actionG() {
    bash
    return 1
    }

    actionH() {
    tia
    return 1
    }

    actionI() {
    nslookup
    return 1
    }

    actionJ() {
    telnet
    return 1
    }

    actionK() {
    tailer
    return 1
    }

    actionL() {
    calc
    return 1
    }

    actionM() {
    ecn
    return 1
    }

    actionN() {
    bible
    return 1
    }

    actionO() {
    tutor
    return 1
    }

    actionP() {
    sendpage
    return 1
    }

    actionX() {
    return 0
    }


    ################################
    ## Setup Example Menu
    ################################

    ## Menu Item Text
    ##
    ## It makes sense to have "Exit" as the last item,
    ## as pressing Esc will jump to last item (and
    ## pressing Esc while on last item will perform the
    ## associated action).
    ##
    ## NOTE: If these are not all the same width
    ## the menu highlight will look wonky
    menuItems=(
    "0. Alpine ----------------------- email client"
    "1. Tin -------------------------- usenet news reader"
    "2. Irssi ------------------------ irc network"
    "3. Lynx ------------------------- web browser"
    "4. Gopher ----------------------- ftp protocol"
    "5. Nano ------------------------- text editor"
    "6. Bash ------------------------- command prompt"
    "7. T.I.A. ----------------------- programming IDE"
    "8. Nslookup --------------------- directory service"
    "9. Telnet ----------------------- remote login"
    "A. Tailer ----------------------- monitoring tool"
    "B. Calc ------------------------- calculator"
    "C. ECN -------------------------- daytrading game"
    "D. Tutor ------------------------ unix tutorial"
    "E. Bible ------------------------ way of enlightenment"
    "F. Sendpage --------------------- beeper server"
    "$. Exit ------------------------- God speed :-)"
    )

    ## Menu Item Actions
    menuActions=(
    actionA
    actionB
    actionC
    actionD
    actionE
    actionF
    actionG
    actionH
    actionI
    actionJ
    actionK
    actionL
    actionM
    actionN
    actionO
    actionP
    actionX
    )

    ## Override some menu defaults
    menuTitle=" CompuBBS - The nature of the good is to overcome and defeat
    the bad..."
    menuFooter=" Enter=Select, Navigate via Up/Down/First number/letter -
    [Prayer works!]"
    menuWidth=74
    menuLeft=13
    menuHighlight=$DRAW_COL_WHITE


    ################################
    ## Run Menu
    ################################
    menuInit
    menuLoop


    exit 0 --------------------------------------------------------------------------------

    bash-draw.sh file --------------------------------------------------------------------------------

    #!/bin/bash

    #
    # Public Functions:
    #
    # drawClear()
    # drawColour(colour = DRAW_COL_DEF, bgColour = DRAW_COL_DEF)
    #
    # drawPlain(text, newLine = 0)
    # drawSpecial(text, newLine = 0)
    # drawHighlight(text, newLine = 0)
    # drawPlainAt(left, top, text, newLine = 0)
    # drawHighlightAt(left, top, text, newLine = 0)
    #
    #
    # Colours
    #
    # DRAW_COL_DEF # Default colour
    # DRAW_COL_BLACK
    # DRAW_COL_WHITE
    # DRAW_COL_RED
    # DRAW_COL_GREEN
    # DRAW_COL_YELLOW
    # DRAW_COL_BLUE
    # DRAW_COL_GRAY # Light gray (grey?)
    #


    # Ensure we are running under bash (will not work under sh or dash etc)
    if [ "$BASH_SOURCE" = "" ]; then
    echo "ERROR: bash-draw requires to be running under bash"
    exit 1
    fi


    DRAW_COL_DEF=39
    DRAW_COL_BLACK=30
    DRAW_COL_WHITE=97
    DRAW_COL_RED=31
    DRAW_COL_GREEN=32
    DRAW_COL_YELLOW=33
    DRAW_COL_BLUE=34
    DRAW_COL_GRAY=37


    # drawClear()
    drawClear() {
    $ESC_WRITE "\033c"
    }

    # drawColour(colour = DRAW_COL_DEF, bgColour = DRAW_COL_DEF)
    drawColour() {
    local colour=$DRAW_COL_DEF
    local bgColour=$((DRAW_COL_DEF+10))

    if [[ ! -z "$1" && "$1" != "" ]]; then
    colour="$1"
    fi

    if [[ ! -z "$2" && "$2" != "" ]]; then
    bgColour="$2"
    fi

    $ESC_ECHO "\033c\033[H\033[J\033[${colour};${bgColour}m\033[J"
    }

    # drawPlain(text, newLine = 0)
    drawPlain() {
    if [[ -z "$2" || "$2" -eq 0 ]]; then
    $ESC_WRITE "$1"
    else
    $ESC_ECHO "$1"
    fi
    }

    # drawSpecial(text, newLine = 0)
    drawSpecial() {
    [[ -z "$2" ]] && newLine=0 || newLine="$2"

    draw_SetDrawMode
    drawPlain "$1" "$newLine"
    draw_SetWriteMode
    }

    # drawHighlight(text, newLine = 0)
    drawHighlight() {
    [[ -z "$2" ]] && newLine=0 || newLine="$2"

    draw_StartHighlight
    drawPlain "$1" "$newLine"
    draw_EndHighlight
    }

    # drawPlainAt(left, top, text, newLine = 0)
    drawPlainAt() {
    [[ -z "$4" ]] && newLine=0 || newLine="$4"

    draw_MoveTo $1 $2
    drawPlain "$3" "$newLine"
    }

    # drawHighlightAt(left, top, text, newLine = 0)
    drawHighlightAt() {
    [[ -z "$4" ]] && newLine=0 || newLine="$4"

    draw_StartHighlight
    drawPlainAt "$1" "$2" "$3" "$newLine"
    draw_EndHighlight
    }


    # Write escape sequence with no newline
    ESC_WRITE='echo -en'

    # Write escape sequence adding newline
    ESC_ECHO='echo -e'


    # Move cursor to specified location
    draw_MoveTo() {
    $ESC_WRITE "\033[${1};${2}H"
    }

    draw_StartHighlight() {
    $ESC_WRITE "\033[7m"
    }

    draw_EndHighlight() {
    $ESC_WRITE "\033[27m"
    }

    draw_SetDrawMode() {
    $ESC_WRITE "\033%@\033(0"
    }

    draw_SetWriteMode() {
    $ESC_WRITE "\033(B"
    } --------------------------------------------------------------------------------

    bash-menu.sh file --------------------------------------------------------------------------------

    #!/bin/bash

    #
    # Public Functions
    #
    # menuInit()
    # menuLoop()
    #
    #
    # Public Variables to Override
    #
    # Should these get passed into menuInit() rather than be set as global
    # script variables?
    #
    # menuTop # Top row of menu (defaults to row 2)
    # menuLeft # Left offset for menu item text (defaults to column 15)
    # menuWidth # Width of menu (defaults to 42 columns)
    # menuMargin # Left offset for menu border (defaults to column 4)
    #
    # menuColour # Colour of menu text (defaults to DRAW_COL_WHITE)
    # menuHighlight # Highlight colour for menu (defaults to DRAW_COL_GREEN)
    #
    # menuTitle # Title of menu
    # menuFooter # Footer text of menu
    #
    # menuItems # Array containing menu item text
    # menuActions # Array containing functions to call upon menu item selection
    #


    # Ensure we are running under bash (will not work under sh or dash etc)
    if [ "$BASH_SOURCE" = "" ]; then
    echo "ERROR: bash-menu requires to be running under bash"
    exit 1
    fi

    # Get script root (as we are sourced from another script, $0 will not be
    us)
    declare -r menuScript=$(readlink -f ${BASH_SOURCE[0]})
    menuRoot=$(dirname "$menuScript")

    # Ensure we can access our dependencies
    if [ ! -s "$menuRoot/bash-draw.sh" ]; then
    echo "ERROR: Missing required draw.sh script"
    exit 1
    fi

    # Load terminal drawing functions
    . "$menuRoot/bash-draw.sh"


    ################################
    # Private Variables
    #
    # These should not be overridden
    ################################
    declare -a menuItems
    declare -a menuActions

    menuHeaderText=""
    menuFooterText=""
    menuBorderText=""


    ################################
    # Setup Menu
    #
    # These are defaults which should
    # be overridden as required.
    ################################

    # Top of menu (row 2)
    menuTop=2

    # Left offset for menu items (not border)
    menuLeft=15

    # Width of menu
    menuWidth=42

    # Left offset for menu border (not menu items)
    menuMargin=4

    menuItems[0]="Exit"
    menuActions[0]="return 0"

    menuItemCount=1
    menuLastItem=0

    menuColour=$DRAW_COL_WHITE
    menuHighlight=$DRAW_COL_GREEN

    menuTitle=" Super Bash Menu System"
    menuFooter=" Enter=Select, Up/Down=Prev/Next Option"


    ################################
    # Initialise Menu
    ################################
    menuInit() {
    menuItemCount=${#menuItems[@]}
    menuLastItem=$((menuItemCount-1))

    # Ensure header and footer are padded appropriately
    menuHeaderText=`printf "%-${menuWidth}s" "$menuTitle"`
    menuFooterText=`printf "%-${menuWidth}s" "$menuFooter"`

    # Menu (side) borders
    local marginSpaces=$((menuMargin-1))
    local menuSpaces=$((menuWidth-2))
    local leftGap=`printf "%${marginSpaces}s" ""`
    local midGap=`printf "%${menuSpaces}s" ""` menuBorderText="${leftGap}x${midGap}x"
    }


    ################################
    # Show Menu
    ################################
    menu_Display() {
    local menuSize=$((menuItemCount+2))
    local menuEnd=$((menuSize+menuTop+1))

    drawClear
    drawColour $menuColour $menuHighlight

    # Menu header
    drawHighlightAt $menuTop $menuMargin "$menuHeaderText" 1

    # Menu (side) borders
    for row in $(seq 1 $menuSize); do
    drawSpecial "$menuBorderText" 1
    done

    # Menu footer
    drawHighlightAt $menuEnd $menuMargin "$menuFooterText" 1

    # Menu items
    for item in $(seq 0 $menuLastItem); do
    menu_ClearItem $item
    done
    }


    ################################
    # Mark Menu Items
    ################################

    # Ensure menu item is not highlighted
    menu_ClearItem() {
    local item=$1
    local top=$((menuTop+item+2))
    local menuText=${menuItems[$item]}

    drawPlainAt $top $menuLeft "$menuText"
    }

    # Highlight menu item
    menu_HighlightItem() {
    local item=$1
    local top=$((menuTop+item+2))
    local menuText=${menuItems[$item]}

    drawHighlightAt $top $menuLeft "$menuText"
    }


    ################################
    # Wait for and process user input
    ################################
    menu_HandleInput() {
    local choice=$1

    local after=$((choice+1))
    [[ $after -gt $menuLastItem ]] && after=0

    local before=$((choice-1))
    [[ $before -lt 0 ]] && before=$menuLastItem

    # Clear highlight from prev/next menu items
    menu_ClearItem $before
    menu_ClearItem $after

    # Highlight current menu item
    menu_HighlightItem $choice

    # Get keyboard input
    local key=""
    local extra=""

    read -s -n1 key 2> /dev/null >&2
    while read -s -n1 -t .05 extra 2> /dev/null >&2 ; do<
    key="$key$extra"
    done

    # Handle known keys
    local escKey=`echo -en "\033"`
    local upKey=`echo -en "\033[A"`
    local downKey=`echo -en "\033[B"`

    if [[ $key = $upKey ]]; then
    return $before
    elif [[ $key = $downKey ]]; then
    return $after
    elif [[ $key = $escKey ]]; then
    if [[ $choice -eq $menuLastItem ]]; then
    # Pressing Esc while on last menu item will trigger action
    # This is a helper as we assume the last menu option is exit
    key=""
    else
    # Jumping possibly more than 1 (next/prev) item
    menu_ClearItem $choice
    return $menuLastItem
    fi
    elif [[ ${#key} -eq 1 ]]; then
    # See if we wanrt to jump to a menu item
    # by entering the first character
    for index in $(seq 0 $menuLastItem) ; do
    local item=${menuItems[$index]}
    local startChar=${item:0:1}
    if [[ "$key" = "$startChar" ]]; then
    # Jumping possibly more than 1 (next/prev) item
    menu_ClearItem $choice
    return $index
    fi
    done
    fi

    if [[ "$key" = "" ]]; then
    # Notify that Enter key was pressed
    return 255
    fi

    return $choice
    }

    ################################
    # Main Menu Loop
    ################################
    menuLoop() {
    local choice=0
    local running=1

    menu_Display

    while [[ $running -eq 1 ]]; do
    # Enable case insensitive matching
    local caseMatch=`shopt -p nocasematch`
    shopt -s nocasematch

    menu_HandleInput $choice
    local newChoice=$?

    # Revert to previous case matching
    $caseMatch

    if [[ $newChoice -eq 255 ]]; then
    # Enter pressed - run menu action
    drawClear
    action=${menuActions[$choice]}
    $action
    running=$?

    # Back from action
    # If we are still running, redraw menu
    [[ $running -eq 1 ]] && menu_Display

    elif [[ $newChoice -lt $menuItemCount ]]; then
    # Update selected menu item
    choice=$newChoice
    fi
    done

    # Cleanup screen
    drawClear
    } --------------------------------------------------------------------------------
    --
    "The nature of the good is to overcome and defeat the bad." - divine voice

    --- Synchronet 3.21a-Linux NewsLink 1.2