Brainfuck IRC bot
* Comments use ; in place of periods or commas as punctuation
* Meant to operate on 8 bit unsigned memory
* Uses a minimum of 35 bytes of memory; more may be needed depending on the length of channel names it works in
* Expects stdin to block until data is available
* If you use netfuck; it'd be useful to know that debug mode outputs every character read from the remote to the console

Send NICK and USER
++++++++++
[
    "NICK "  >++++++++>+++++++>+++++++>+++++++>+++
    "bfbot"  >++++++++++>++++++++++>++++++++++>+++++++++++>+++++++++++
    "\r\n"   >+>+
    "USER "  >++++++++>++++++++>+++++++>++++++++>+++
    "bfbot " >++++++++++>++++++++++>++++++++++>+++++++++++>+++++++++++>+++
    "a a :"  >+++++++++>+++>+++++++++>+++>+++++
    "bfbot"  >++++++++++>++++++++++>++++++++++>+++++++++++>+++++++++++
    "\r\n"   >+>+
    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-
]
"NICK "  >--.>+++.>---.>+++++.>++.
"bfbot"  >--.>++.>--.>+.>++++++.
"\r\n"   >+++.>.
"USER "  >+++++.>+++.>-.>++.>++.
"bfbot " >--.>++.>--.>+.>++++++.>++.
"a a :"  >+++++++.>++.> +++++++.>++.>++++++++.
"bfbot " >--.>++.>--.>+.>++++++.
"\r\n"   >+++.>.
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

[-]+[,[-]]

cell #0: working cell for iteration and such
cell #1 stdin (pointer currently points here)
[
    , Read out one character; see if it's a 'P' (80)
    <[-] ++++++++++ [>--------<-] [-]+>
    [ Handle NOT a ping
        [-]+[,<[-]++++++++++[>---<-]>--] Loop until a space (32) is read
        
        Check for P (80)
        , <[-] ++++++++++ [ > -------- <- ] [- set working cell to 1]+ >
        [ if (input != 'P')
            [ , ---------- ] Read to \n (10); also zeroes cell
            <->
        ]<[> if (input == 'P')
            Check for 'R' (82) PRIVMSG
            , <[-]++++++++++[>--------<-]>-- cell is zero if 'R' <[-]+>
            [
                Not 'R'
                [ , ---------- ] Read to \n (10); also zeroes cell
            <->]<[>
                Handle PRIVMSG
                Read remaining characters: I,V,M,S,G, ,
                
                Check for channel/user message ('#' = 35)
                , <[-]++++++++++ [>---<-]>----- <[-]+>
                [
                    Handle user message
                    Read to space: <[-]> [,<++++++++++[>---<-]>--],
                    
                    Check for 'J' 74
                    ,<++++++++++[>-------<-]>---- <[-]+>
                    [
                        [-] (not J; ignore)
                    <->]<[>,                    
                        Write JOIN command 74 79 73 78 32 (user text) 13 10
                        <[-]++++++++++
                        >[-]>[-]>[-]>[-]>[-]<<<<<
                        [>+++++++ >++++++++ >+++++++ >++++++++ >+++ <<<<<-]
                        >++++.>-.>+++.>--.>++.
                        <<<<<[-]>
                        
                        Write user text:
                        <[-]+[>
                            ,------------- Subtract \r<[-]>
                            [<+>+++++++++++++.[-]] Output if not \r
                            <
                        ]>
                        Write \r\n
                        [-]++++++++++.+++.
                    <[-]]>
                    +[ , ---------- ]
                <[-]>]<[>
                    Channel message
                    Read channel name into buffer (a zero on each side)
                    [-]>[-]+<
                    +[>,+
                        Copy value into next two cells for comparison
                        >[-]>[-]<<
                        [>+>+<<-]>[<+>-]>
                        Pointer is at third cell; middle cell is zero; first cell and third cell are read value
                        Subtract space (32) using middle cell as working cell <++++++++++[>---<-]>---<+> (note: we subtract 33 because the whole buffer is incremented)
                        [<->[-]]
                        <[
                            Handle space
                            <[-]>
                        [-]]<
                    ]
                    <-[<-]
                    , Read and discard
                    
                    , Check for control character '$' 36
                    <[-]++++++++++[>---<-]>------<+>
                    [ [-]+[ , ---------- ] <->]
                    <[>
                        Send 'PRIVMSG #' 80 82 73 86 77 83 71 32 35 without screwing up the channel name buffer
                        [-]<[-]++++++++++[>++++++++<-]>.
                        [-]<++++++++++[>++++++++<-]>++.
                        [-]<++++++++++[>+++++++<-]>+++.
                        [-]<++++++++++[>+++++++++<-]>----.
                        [-]<++++++++++[>++++++++<-]>---.
                        [-]<++++++++++[>++++++++<-]>+++.
                        [-]<++++++++++[>+++++++<-]>+.
                        [-]<++++++++++[>+++<-]>++.
                        [-]<++++++++++[>+++<-]>+++++.
                        
                        Send the channel name from our buffer
                        [-]>[.>]<[<]
                        
                        Send a space; then a colon (58)
                        [-]<[-]++++++++++[>+++<-]>++.
                        [-]<++++++++++[>++++++<-]>--.
                        
                        Finally; send the user's message
                        [-]+[ ,. ---------- ]
                    <[-]]
                [-]]
            [-]]
        [-]]>[-]+
    <[-]>[-]]<[
        Handle PING
        , Read out "I" (optimization: we steal the characters from this message later on; so we needn't write it)
        Write PO 80 79
        [-]++++++++++[>++++++++<-]
        >.-.<
        [-]+[ ,. ---------- ] Write out the PING response
    ]>+
]
