Skip to content

Algorithms and Modelling

Structure Chart

Structure Chart

Notation

  • Keywords are capitalised.
  • Subroutines in the code are underlined.
  • Subroutines from an external source (i.e. the C++ standard library, FTXUI, or tomlplusplus) are italicised.
  • Subroutine definitions are bold and underlined.
  • Notation for indexing uses square brackets, and literal strings are denoted with quotation marks.

Pseudocode


BEGIN MAINPROGRAM  
    INITIALISATION  
        set handler to handler-constructor   
        set colour-theme to handler.config.theme  
        set screen to interactive-fullscreen-constructor  
        set UI elements to default states  
    END INITIALISATION  
    WHILE running
        render-elements  
        CASEWHERE catch-event is  
            carriage return : send-message (message-content)  
            mousewheel up :   
                IF scroll-amount is not lowest THEN  
                    decrease scroll-amount  
                ENDIF  
            mousewheel down :   
                IF scroll-amount is not highest THEN  
                    increase scroll-amount  
                ENDIF  
            escape : quit program  
        ENDCASE  
        IF poll-for-messages returns true THEN  
            receive-messages  
            refresh-screen  
        ENDIF  
    ENDWHILE
END MAINPROGRAM  

BEGIN SUBPROGRAM 

handler-constructor

INITIALISATION set config to config-constructor set user to config.users[default-user] set server to config.server[default-server] set server-ip to convert to useable type (server.ip-address) set server-socket to socket-constructor (IPV4, TCP-socket, any, 6667, server-ip) set socket-file-descriptor to server-socket.get-socket-fd END INITIALISATION set socket to non-blocking (socket-file-descriptor) send-message (nick command) send-message (user command) END SUBPROGRAM handler-constructor BEGIN SUBPROGRAM

config-constructor

INITIALISATION IF config file doesn't exist THEN create config file with defaults ENDIF set config-location to get home directory/.config/ircat/config/toml END INITIALISATION set config to parse toml file END SUBPROGRAM config-constructor BEGIN SUBPROGRAM

socket-constructor

(address-family, socket-type, protocol, port, ip-address) INITIALISATION set member values to parameters END INITIALISATION IF set socket-file-descriptor to socket (family, socket-type, protocol) returns an error THEN print error-message ENDIF IF socket-purpose is binding THEN set socket option (reuse address, true) bind socket ELSE connect socket ENDIF END SUBPROGRAM socket-constructor BEGIN SUBPROGRAM

send-message

(content) set bytes-sent to 0 set total-sent to 0 set length to length of content WHILE total-sent < length send (content) set bytes-sent to return value of send set total-sent to total-sent + bytes-sent ENDWHILE END SUBPROGRAM send-message BEGIN SUBPROGRAM

poll-for-messages

set events-count to poll (socket-file-descriptor) IF events-count > 0 THEN append receive-messages to messages return true ENDIF END SUBPROGRAM poll-for-messages BEGIN SUBPROGRAM

receive-messages

set buffer to array of 2048 characters set bytes-received to 0 set messages to empty vector of strings set parsed-messages to empty vector of irc-messages recv (socket-file-descriptor, buffer) set bytes-received to return value of recv WHILE there are carriage returns in buffer append a slice of the buffer from the start until the next carriage return to messages remove that slice of the buffer including the carriage return ENDWHILE FOR message IN messages append parse-message (message) to parsed-messsages ENDFOR return parsed-messages END SUBPROGRAM receive-messages BEGIN SUBPROGRAM

parse-message

(message) set trailing to empty string set result to empty irc-message IF message size < 1 THEN return result ENDIF IF message[0] is a ":" THEN set result.prefix to the slice of message between 1 and the first space remove that slice from message ENDIF set result.command to the slice of message from the start until the first space remove that slice from message IF message contains " :" THEN set trailing to the slice of message from after " :" until the end remove that slice from message ENDIF WHILE there are spaces in message append the slice of message from the start until the first space to result.params remove that slice from message ENDWHILE IF there are still characters in message THEN append message to result.params ENDIF append trailinig to result.params return result END SUBPROGRAM parse-message BEGIN SUBPROGRAM

render-elements

set message-box to horizontal box (individual-components) set components to vertical box (message-box) render (render-messages) render (components) END SUBPROGRAM render-elements BEGIN SUBPROGRAM

render-messages

set rendered to vector of elements FOR message in messages append vertical box (separator-bar, message.prefix, msg.params[last]) to rendered ENDFOR return rendered END SUBPROGRAM render-messages