#+Title: Meeting of the Minds #+Subtitle: A Replacement for the Slack Chat System #+AUTHOR: Samuel W. Flint #+EMAIL: swflint@flintfam.org #+DATE: \today #+INFOJS_OPT: view:info toc:nil path:http://flintfam.org/org-info.js #+OPTIONS: toc:nil H:5 ':t *:t todo:nil stat:nil d:nil #+PROPERTY: noweb no-export #+PROPERTY: comments noweb #+LATEX_HEADER: \usepackage[margins=0.75in]{geometry} #+LATEX_HEADER: \parskip=5pt #+LATEX_HEADER: \parindent=0pt #+LATEX_HEADER: \lstset{texcl=true,breaklines=true,columns=fullflexible,basicstyle=\ttfamily,frame=lines,literate={<=}{$\leq$}1 {>=}{$\geq$}1} #+LATEX_CLASS_OPTIONS: [10pt,twoside] #+LATEX_HEADER: \pagestyle{headings} * COMMENT Export #+Caption: Export Document #+Name: export-document #+BEGIN_SRC emacs-lisp :exports none :results none (save-buffer) (let ((org-confirm-babel-evaluate (lambda (lang body) (declare (ignorable lang body)) nil))) (org-latex-export-to-pdf)) #+END_SRC * COMMENT Tangle #+Caption: Tangle Document #+Name: tangle-document #+BEGIN_SRC emacs-lisp :exports none :results none (save-buffer) (let ((python-indent-offset 4)) (org-babel-tangle)) #+END_SRC * DONE Introduction :nonum: CLOSED: [2016-04-02 Sat 21:24] :PROPERTIES: :CREATED: <2016-04-02 Sat 16:26> :END: As time has gone on, I've started seeing the "Slack" chat platform become more and more popular. I see this as both a good thing, in that it promotes communication within teams, and a bad thing, in that it's not controlled by the company that actually subscribes to it, and it isn't free software. Because of the benefit, and as a response to the issues, I've decided to build this application, "Meeting of the Minds", built on standards and free software so it's likely to stay around for a long time. Thus, the goal is to produce an application that gives the following features: - Archival - Group Messaging - Easily Defined Groups - User-to-user Messaging - Simple Management - Freedom To accomplish this task, I've decided to build using the following tools and suites: - IRC :: The Internet Relay Chat protocol. I've chosen this as the transport protocol as it's been around for quite some time, and is well supported. - PostgreSQL :: An SQL storage backend. This will be a way to store metadata about conversations, topics, users and projects, allowing for data archival. I've chosen PostgreSQL as it has many advanced features and is very space efficient. - Common Lisp :: The server implementation language. I've chosen to use Common Lisp to implement Meeting of the Minds for the following reasons: - Familiarity - Flexibility - Library availability * TOC :ignore: :PROPERTIES: :CREATED: <2016-04-02 Sat 16:27> :END: #+TOC: headlines 3 #+TOC: listings * WORKING Architecture [0/3] :PROPERTIES: :CREATED: <2016-04-02 Sat 21:25> :END: ** TODO Protocol Design :PROPERTIES: :CREATED: <2016-04-02 Sat 21:27> :END: ** TODO Data Storage Requirements :PROPERTIES: :CREATED: <2016-04-02 Sat 21:27> :END: ** TODO Interaction Design :PROPERTIES: :CREATED: <2016-04-02 Sat 21:27> :END: * WORKING Database Design [0/5] :PROPERTIES: :CREATED: <2016-04-02 Sat 21:25> :END: ** TODO Users Table :PROPERTIES: :CREATED: <2016-04-02 Sat 21:27> :END: ** TODO Conversations Table :PROPERTIES: :CREATED: <2016-04-02 Sat 21:28> :END: ** TODO Topics Table :PROPERTIES: :CREATED: <2016-04-02 Sat 21:28> :END: ** TODO Archives Table :PROPERTIES: :CREATED: <2016-04-02 Sat 21:28> :END: ** TODO Decisions Table :PROPERTIES: :CREATED: <2016-04-02 Sat 21:28> :END: * TODO Management Interface :PROPERTIES: :CREATED: <2016-04-02 Sat 21:25> :END: * TODO Protocol Implementation :PROPERTIES: :CREATED: <2016-04-02 Sat 21:25> :END: * WORKING Packaging [1/2] :PROPERTIES: :CREATED: <2016-04-02 Sat 16:27> :END: ** WORKING The ~packages~ file :PROPERTIES: :CREATED: <2016-04-02 Sat 16:32> :ID: b0c08843-2ca4-4b6d-b570-8f54d9b0104e :END: This file describes and defines that packages, or namespaces used in the application. These include the following: - ~meeting-minds~ :: The main package, this is used to tie all of the other packages together, and can be used to produce a callable daemon. #+Caption: Packages #+Name: packages #+BEGIN_SRC lisp :tangle "package.lisp" (defpackage #:meeting-minds (:use #:cl)) #+END_SRC ** DONE The *ASDF* System Definition CLOSED: [2016-04-02 Sat 21:57] :PROPERTIES: :CREATED: <2016-04-02 Sat 16:45> :ID: 9d79d691-5ac0-43f9-a0ae-a4f1823cbcb6 :END: The definition of a system, or in Lisp terms, a set of connected and related software, either libraries or applications is what allows this to be put together and built. This is done using *ASDF*, or the "Another System Definition Facility". This defines the system itself, ~#:meeting-minds~, and it depends on the following other systems: - ~ningle~ :: A smart, simple web framework for the management/browsing interface. - ~clack-errors~ :: An error handling library for the clack/ningle framework. - ~clsql~ :: An SQL interface library that works extremely well with PostgreSQL. - ~stefil~ :: A testing framework - ~ironclad~ :: Encryption and hashing. - ~cl-who~ :: HTML Generation. - ~commonqt~, ~qtools~, & ~qtools-ui~ :: A GUI library for the user interface. - ~daemon~ :: A daemonization system for the server. - ~babel~ :: Byte string manipulation. - ~uiop~ :: A utilities collection. - ~cl-mustache~ :: A templating framework based on the popular "Mustache" system. - ~birch~ :: An IRC bot framework. - ~irc-logger~ :: To provide IRC logging functionality. #+Caption: ASDF System #+Name: asdf-system #+BEGIN_SRC lisp :tangle "meeting-minds.asd" (asdf:defsystem #:meeting-minds :description "Describe meeting-minds here" :author "Samuel W. Flint " :license "GNU GPLv3 or Later" :depends-on (#:ningle #:clack-errors #:clsql #:stefil #:ironclad #:cl-who #:commonqt #:qtools #:qtools-ui #:daemon #:babel #:uiop #:cl-mustache #:birch #:irc-logger) :serial t :components ((:file "package") (:file "meeting-minds"))) #+END_SRC