diff --git a/README.md b/README.md index 8216bc8..70c54dc 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,7 @@ -# Cwtch Bot Libraries +# Cwtch Bot Framework -This repository contains some basic libraries and a few functional Cwtch Bots +A specialized Cwtch Bot framework in Go that provides a more lightweight and tailored approach to building chat bots for Cwtch. -* Echo Bot - Simply echos back what you say as a basic example -* Dev Bot - Provides a few development functions like delayed messaging, scheduled messaging and spam -* Fuzz Bot - Provides a number of security oriented functions like fuzzing chat messages and invite overlays. +For an introduction to building chatbots with the CwtchBot framework check out [the building an echobot tutorial](https://docs.cwtch.im/developing/building-a-cwtch-app/building-an-echobot). If you'd like to get involved please open an issue, or submit a pull request :) \ No newline at end of file diff --git a/bot.go b/bot.go index be64a9a..eb19acf 100644 --- a/bot.go +++ b/bot.go @@ -4,7 +4,6 @@ import ( "crypto/rand" "cwtch.im/cwtch/app" "cwtch.im/cwtch/event" - "cwtch.im/cwtch/model/constants" "cwtch.im/cwtch/peer" "cwtch.im/cwtch/protocol/connections" "cwtch.im/cwtch/settings" @@ -27,6 +26,7 @@ type CwtchBot struct { acn connectivity.ACN peername string engineHooks connections.EngineHooks + experiments []string } func NewCwtchBot(userdir string, peername string) *CwtchBot { @@ -34,6 +34,16 @@ func NewCwtchBot(userdir string, peername string) *CwtchBot { cb.dir = userdir cb.peername = peername cb.engineHooks = connections.DefaultEngineHooks{} + cb.experiments = nil + return cb +} + +func NewCwtchBotWithExperiments(userdir string, peername string, experiments []string) *CwtchBot { + cb := new(CwtchBot) + cb.dir = userdir + cb.peername = peername + cb.engineHooks = connections.DefaultEngineHooks{} + cb.experiments = experiments return cb } @@ -82,12 +92,27 @@ func (cb *CwtchBot) Launch() { cb.acn.WaitTillBootstrapped() settingsFile, _ := settings.InitGlobalSettingsFile(cb.dir, "") gSettings := settingsFile.ReadGlobalSettings() - gSettings.ExperimentsEnabled = true + + if cb.experiments != nil { + gSettings.ExperimentsEnabled = true + } else { + gSettings.ExperimentsEnabled = false + } gSettings.DownloadPath = "./" - gSettings.Experiments[constants.FileSharingExperiment] = true - gSettings.Experiments[constants.ImagePreviewsExperiment] = true + + // Reset all Experiments... + for experiment := range gSettings.Experiments { + gSettings.Experiments[experiment] = false + } + + // Explicitly Enable only the experiments we've specified... + for _, experiment := range cb.experiments { + gSettings.Experiments[experiment] = true + } + settingsFile.WriteGlobalSettings(gSettings) app := app.NewApp(cb.acn, cb.dir, settingsFile) + app.InstallEngineHooks(cb.engineHooks) app.LoadProfiles("") diff --git a/go.mod b/go.mod index 6b3f0a8..dc2c5de 100644 --- a/go.mod +++ b/go.mod @@ -4,15 +4,14 @@ go 1.19 require ( cwtch.im/cwtch v0.20.3 - git.openprivacy.ca/cwtch.im/tapir v0.6.0 git.openprivacy.ca/openprivacy/connectivity v1.8.6 git.openprivacy.ca/openprivacy/log v1.0.3 - github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de github.com/mutecomm/go-sqlcipher/v4 v4.4.2 ) require ( filippo.io/edwards25519 v1.0.0 // indirect + git.openprivacy.ca/cwtch.im/tapir v0.6.0 // indirect git.openprivacy.ca/openprivacy/bine v0.0.4 // indirect github.com/gtank/merlin v0.1.1 // indirect github.com/gtank/ristretto255 v0.1.3-0.20210930101514-6bb39798585c // indirect diff --git a/go.sum b/go.sum index 5f55726..2ed61d8 100644 --- a/go.sum +++ b/go.sum @@ -10,8 +10,6 @@ git.openprivacy.ca/openprivacy/connectivity v1.8.6 h1:g74PyDGvpMZ3+K0dXy3mlTJh+e git.openprivacy.ca/openprivacy/connectivity v1.8.6/go.mod h1:Hn1gpOx/bRZp5wvCtPQVJPXrfeUH0EGiG/Aoa0vjGLg= git.openprivacy.ca/openprivacy/log v1.0.3 h1:E/PMm4LY+Q9s3aDpfySfEDq/vYQontlvNj/scrPaga0= git.openprivacy.ca/openprivacy/log v1.0.3/go.mod h1:gGYK8xHtndRLDymFtmjkG26GaMQNgyhioNS82m812Iw= -github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhPwqqXc4/vE0f7GvRjuAsbW+HOIe8KnA= -github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoUhZrYW9p1lxo/cm8EmUOOzAPSEZNGF2DK1dJgw= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -20,7 +18,6 @@ github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is= github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= github.com/gtank/ristretto255 v0.1.3-0.20210930101514-6bb39798585c h1:gkfmnY4Rlt3VINCo4uKdpvngiibQyoENVj5Q88sxXhE= github.com/gtank/ristretto255 v0.1.3-0.20210930101514-6bb39798585c/go.mod h1:tDPFhGdt3hJWqtKwx57i9baiB1Cj0yAg22VOPUqm5vY= -github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b h1:QrHweqAtyJ9EwCaGHBu1fghwxIPiopAHV06JlXrMHjk= github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b/go.mod h1:xxLb2ip6sSUts3g1irPVHyk/DGslwQsNOo9I7smJfNU= @@ -30,13 +27,10 @@ github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= github.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7PQSMz9NShzorzCiG2fk9+xuCgLkPeCvMHYR2OWg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= diff --git a/quality.sh b/quality.sh new file mode 100755 index 0000000..66a70bd --- /dev/null +++ b/quality.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +echo "Staticcheck..." +staticcheck ./... + +echo "Formatting..." +gofmt -l -s -w . + +# ineffassign (https://github.com/gordonklaus/ineffassign) +echo "Checking for ineffectual assignment of errors (unchecked errors...)" +ineffassign ./.. + +# misspell (https://github.com/client9/misspell/cmd/misspell) +echo "Checking for misspelled words..." +misspell . | grep -v "testing/" | grep -v "vendor/" | grep -v "go.sum" | grep -v ".idea"