From f79e3e46b75ad8bcf06a1ec9f045730f69c56e83 Mon Sep 17 00:00:00 2001 From: normen Date: Sat, 28 Nov 2020 15:37:09 +0100 Subject: [PATCH] add development info --- README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README.md b/README.md index 8c8bfe6..b30ebb8 100644 --- a/README.md +++ b/README.md @@ -52,3 +52,22 @@ Some ways to install via package managers are supported but the installed versio - `https://aur.archlinux.org/packages/whatscli/` +## Development + +This app started as my first attempt at writing something in go. Some areas that are marked with `TODO` can still be improved but work mostly. If you want to contribute features or improve the code thats great, send a PR and we can discuss. + +### Building + +Using a recent version of go, building should be straightforward. Either use `go build`, `go run` etc. or use the included Makefile. + +### Structure Overview + +The `main.go` contains most UI elements which are based around a tview app running on the main routine. It uses a keymap configuration based on the tslocum/cbind library. Apart from that it mostly manages the selection of messages in the current chat as well as displaying the messages and chat list that the session manager sends. + +The `messages/session_manager.go` runs a separate go routine to receive messages from the Rhymen/go-whatsapp library which in turn runs the websocket connection to the whatsapp server. The session manager receives the messages from go-whatsapp and the commands from the UI via channels that it drains on its main routine. It then updates the UI accordingly using the UiMessageHandler interface. This ensures "thread safe" management of the connection and data while both UI and network connection run separately. + +Session manager is designed "object like", the MessageDatabase in `messages/storage.go` is similar and somewhat linked to the session manager. In theory the session manager could be run multiple times (multiple accounts) or a different implementation of a session manager could connect to a different service like e.g. Telegram. + +In `messages/messages.go` most interfaces and data structures for communication are kept. + +The `config/settings.go` keeps a singleton `Config` struct with the config that is loaded via the gopkg.in/ini.v1 library when the app starts. This makes it easy to quickly add new configuration items with default values that can be used across the app.