mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-16 15:09:57 +00:00
* alert: Add optimizations * alert: add basic benchmarks * alert: fix linter issue * documentation: change to text/template as html/template escapes to protect against code injection. Add readme.md for alert. * README: Add package name * alert: link up with engine settings * request: isVerbose refactor * Update exchanges/alert/alert_test.go Co-authored-by: Scott <gloriousCode@users.noreply.github.com> * Update exchanges/alert/alert.go Co-authored-by: Scott <gloriousCode@users.noreply.github.com> * glorious: nits * glorious: fun police * documentation: regen Co-authored-by: Ryan O'Hara-Reid <ryan.oharareid@thrasher.io> Co-authored-by: Scott <gloriousCode@users.noreply.github.com>
127 lines
4.7 KiB
Markdown
127 lines
4.7 KiB
Markdown
# GoCryptoTrader package Alert
|
|
|
|
<img src="/common/gctlogo.png?raw=true" width="350px" height="350px" hspace="70">
|
|
|
|
|
|
[](https://github.com/thrasher-corp/gocryptotrader/actions/workflows/tests.yml)
|
|
[](https://github.com/thrasher-corp/gocryptotrader/blob/master/LICENSE)
|
|
[](https://godoc.org/github.com/thrasher-corp/gocryptotrader/exchanges/alert)
|
|
[](http://codecov.io/github/thrasher-corp/gocryptotrader?branch=master)
|
|
[](https://goreportcard.com/report/github.com/thrasher-corp/gocryptotrader)
|
|
|
|
|
|
This alert package is part of the GoCryptoTrader codebase.
|
|
|
|
## This is still in active development
|
|
|
|
You can track ideas, planned features and what's in progress on this Trello board: [https://trello.com/b/ZAhMhpOy/gocryptotrader](https://trello.com/b/ZAhMhpOy/gocryptotrader).
|
|
|
|
Join our slack to discuss all things related to GoCryptoTrader! [GoCryptoTrader Slack](https://join.slack.com/t/gocryptotrader/shared_invite/enQtNTQ5NDAxMjA2Mjc5LTc5ZDE1ZTNiOGM3ZGMyMmY1NTAxYWZhODE0MWM5N2JlZDk1NDU0YTViYzk4NTk3OTRiMDQzNGQ1YTc4YmRlMTk)
|
|
|
|
## Alert
|
|
|
|
+ This package allows for multiple routines to wait for a state change on any required data.
|
|
|
|
### Examples:
|
|
|
|
+ Implementation:
|
|
|
|
```go
|
|
// SomeChangingType defines an example struct with an embedded alert.Notice
|
|
// type for easy access to the notice methods.
|
|
type SomeChangingType struct {
|
|
ValueThatChanges int64
|
|
alert.Notice
|
|
mu sync.Mutex // Protection for routine shenanigans
|
|
}
|
|
|
|
// Update will update in a separate routine
|
|
func (s *SomeChangingType) Update(newValue int64) {
|
|
// This simulates a changing variable or state
|
|
s.mu.Lock()
|
|
s.ValueThatChanges = newValue
|
|
// This will alert any routines that are currently waiting for a change
|
|
s.Alert()
|
|
s.mu.Unlock()
|
|
}
|
|
|
|
// WhatsTheValue will retrieve the value that was changed and should be
|
|
// different from the past value. Efficiency++
|
|
func (s *SomeChangingType) WhatsTheValue() int64 {
|
|
s.mu.Lock()
|
|
value := s.ValueThatChanges
|
|
s.mu.Unlock()
|
|
return value
|
|
}
|
|
```
|
|
|
|
+ Routine waiting for change:
|
|
|
|
```go
|
|
// ExampleRoutineThatWaits defines an exchange potential routine that will wait
|
|
// for an impending change.
|
|
func ExampleRoutineThatWaits(potentialChange *SomeChangingType) {
|
|
// Every iteration requires a Wait() call.
|
|
for range potentialChange.Wait(nil) {
|
|
val := potentialChange.WhatsTheValue()
|
|
fmt.Println("Value:", val)
|
|
}
|
|
}
|
|
|
|
// AnotherExampleRoutineThatWaits defines an exchange potential routine that
|
|
// will wait for an impending change.
|
|
func AnotherExampleRoutineThatWaits(potentialChange *SomeChangingType) {
|
|
// Every iteration requires a Wait() call.
|
|
for {
|
|
select {
|
|
case <-potentialChange.Wait(nil):
|
|
val := potentialChange.WhatsTheValue()
|
|
fmt.Println("Value:", val)
|
|
case <-shutdownChannel:
|
|
fmt.Println("Good-Bye!")
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// WARNING: PLEASE DON'T DO THIS.
|
|
// This will stop alerting for this specific data type due to the shared nature
|
|
// of the underlying channels using a sync.Pool.
|
|
func ABadExampleRoutineThatWaits(potentialChange *SomeChangingType) {
|
|
capturedChannel := potentialChange.Wait(nil)
|
|
for {
|
|
select {
|
|
case <-capturedChannel:
|
|
// This will produce incorrect results or no change.
|
|
val := potentialChange.WhatsTheValue()
|
|
fmt.Println("Value:", val)
|
|
case <-shutdownChannel:
|
|
fmt.Println("Good-Bye!")
|
|
return
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Please click GoDocs chevron above to view current GoDoc information for this package
|
|
|
|
## Contribution
|
|
|
|
Please feel free to submit any pull requests or suggest any desired features to be added.
|
|
|
|
When submitting a PR, please abide by our coding guidelines:
|
|
|
|
+ Code must adhere to the official Go [formatting](https://golang.org/doc/effective_go.html#formatting) guidelines (i.e. uses [gofmt](https://golang.org/cmd/gofmt/)).
|
|
+ Code must be documented adhering to the official Go [commentary](https://golang.org/doc/effective_go.html#commentary) guidelines.
|
|
+ Code must adhere to our [coding style](https://github.com/thrasher-corp/gocryptotrader/blob/master/doc/coding_style.md).
|
|
+ Pull requests need to be based on and opened against the `master` branch.
|
|
|
|
## Donations
|
|
|
|
<img src="https://github.com/thrasher-corp/gocryptotrader/blob/master/web/src/assets/donate.png?raw=true" hspace="70">
|
|
|
|
If this framework helped you in any way, or you would like to support the developers working on it, please donate Bitcoin to:
|
|
|
|
***bc1qk0jareu4jytc0cfrhr5wgshsq8282awpavfahc***
|