// Statping // Copyright (C) 2018. Hunter Long and the project contributors // Written by Hunter Long and the project contributors // // https://github.com/hunterlong/statping // // The licenses for most software and other practical works are designed // to take away your freedom to share and change the works. By contrast, // the GNU General Public License is intended to guarantee your freedom to // share and change all versions of a program--to make sure it remains free // software for all its users. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . package notifier import ( "errors" "fmt" "github.com/hunterlong/statping/types" "time" ) // ExampleNotifier is an example on how to use the Statping notifier struct type ExampleNotifier struct { *Notification } // example is a example variable for a example notifier var example = &ExampleNotifier{&Notification{ Method: METHOD, Host: "http://exmaplehost.com", Title: "Example", Description: "Example Notifier", Author: "Hunter Long", AuthorUrl: "https://github.com/hunterlong", Delay: time.Duration(3 * time.Second), Limits: 7, Form: []NotificationForm{{ Type: "text", Title: "Host", Placeholder: "Insert your Host here.", DbField: "host", SmallText: "this is where you would put the host", }, { Type: "text", Title: "Username", Placeholder: "Insert your Username here.", DbField: "username", }, { Type: "password", Title: "Password", Placeholder: "Insert your Password here.", DbField: "password", }, { Type: "number", Title: "Port", Placeholder: "Insert your Port here.", DbField: "port", }, { Type: "text", Title: "API Key", Placeholder: "Insert your API Key here", DbField: "api_key", }, { Type: "text", Title: "API Secret", Placeholder: "Insert your API Secret here", DbField: "api_secret", }, { Type: "text", Title: "Var 1", Placeholder: "Insert your Var1 here", DbField: "var1", }, { Type: "text", Title: "Var2", Placeholder: "Var2 goes here", DbField: "var2", }}, }} // init will be ran when Statping is loaded, AddNotifier will add the notifier instance to the system func init() { AddNotifier(example) } // Send is the main function to hold your notifier functionality func (n *ExampleNotifier) Send(msg interface{}) error { message := msg.(string) fmt.Printf("i received this string: %v\n", message) return nil } // Select is a required basic event for the Notifier interface func (n *ExampleNotifier) Select() *Notification { return n.Notification } // OnSave is a required basic event for the Notifier interface func (n *ExampleNotifier) OnSave() error { msg := fmt.Sprintf("received on save trigger") n.AddQueue(0, msg) return errors.New("onsave triggered") } // OnSuccess is a required basic event for the Notifier interface func (n *ExampleNotifier) OnSuccess(s *types.Service) { msg := fmt.Sprintf("received a count trigger for service: %v\n", s.Name) n.AddQueue(s.Id, msg) } // OnFailure is a required basic event for the Notifier interface func (n *ExampleNotifier) OnFailure(s *types.Service, f *types.Failure) { msg := fmt.Sprintf("received a failure trigger for service: %v\n", s.Name) n.AddQueue(s.Id, msg) } // OnTest is a option testing event for the Notifier interface func (n *ExampleNotifier) OnTest() error { fmt.Printf("received a test trigger with form data: %v\n", n.Host) return nil } // OnNewService is a option event for new services func (n *ExampleNotifier) OnNewService(s *types.Service) { msg := fmt.Sprintf("received a new service trigger for service: %v\n", s.Name) n.AddQueue(s.Id, msg) } // OnUpdatedService is a option event for updated services func (n *ExampleNotifier) OnUpdatedService(s *types.Service) { msg := fmt.Sprintf("received a update service trigger for service: %v\n", s.Name) n.AddQueue(s.Id, msg) } // OnDeletedService is a option event for deleted services func (n *ExampleNotifier) OnDeletedService(s *types.Service) { msg := fmt.Sprintf("received a delete service trigger for service: %v\n", s.Name) n.AddQueue(s.Id, msg) } // OnNewUser is a option event for new users func (n *ExampleNotifier) OnNewUser(s *types.User) { msg := fmt.Sprintf("received a new user trigger for user: %v\n", s.Username) n.AddQueue(s.Id, msg) } // OnUpdatedUser is a option event for updated users func (n *ExampleNotifier) OnUpdatedUser(s *types.User) { msg := fmt.Sprintf("received a updated user trigger for user: %v\n", s.Username) n.AddQueue(s.Id, msg) } // OnDeletedUser is a option event for deleted users func (n *ExampleNotifier) OnDeletedUser(s *types.User) { msg := fmt.Sprintf("received a deleted user trigger for user: %v\n", s.Username) n.AddQueue(s.Id, msg) } // OnUpdatedCore is a option event when the settings are updated func (n *ExampleNotifier) OnUpdatedCore(s *types.Core) { msg := fmt.Sprintf("received a updated core trigger for core: %v\n", s.Name) n.AddQueue(0, msg) } // OnStart is triggered when statup has been started func (n *ExampleNotifier) OnStart(s *types.Core) { msg := fmt.Sprintf("received a trigger on Statping boot: %v\n", s.Name) n.AddQueue(0, msg) } // OnNewNotifier is triggered when a new notifier has initialized func (n *ExampleNotifier) OnNewNotifier(s *Notification) { msg := fmt.Sprintf("received a new notifier trigger for notifier: %v\n", s.Method) n.AddQueue(s.Id, msg) } // OnUpdatedNotifier is triggered when a notifier has been updated func (n *ExampleNotifier) OnUpdatedNotifier(s *Notification) { msg := fmt.Sprintf("received a update notifier trigger for notifier: %v\n", s.Method) n.AddQueue(s.Id, msg) } // Create a new notifier that includes a form for the end user to insert their own values func ExampleNotification() { // Create a new variable for your Notifier example = &ExampleNotifier{&Notification{ Method: "Example", Title: "Example Notifier", Description: "Example Notifier can hold many different types of fields for a customized look.", Author: "Hunter Long", AuthorUrl: "https://github.com/hunterlong", Delay: time.Duration(1500 * time.Millisecond), Limits: 7, Form: []NotificationForm{{ Type: "text", Title: "Host", Placeholder: "Insert your Host here.", DbField: "host", SmallText: "you can also use SmallText to insert some helpful hints under this input", }, { Type: "text", Title: "API Key", Placeholder: "Include some type of API key here", DbField: "api_key", }}, }} // AddNotifier accepts a Notifier to load into the Statping Notification system err := AddNotifier(example) fmt.Println(err) // Output: } // Add a Notifier to the AddQueue function to insert it into the system func ExampleAddNotifier() { err := AddNotifier(example) fmt.Println(err) // Output: } // OnSuccess will be triggered everytime a service is online func ExampleNotification_OnSuccess() { msg := fmt.Sprintf("this is a successful message as a string passing into AddQueue function") example.AddQueue(0, msg) fmt.Println(len(example.Queue)) // Output: 1 } // Add a new message into the queue OnSuccess func ExampleOnSuccess() { msg := fmt.Sprintf("received a count trigger for service: %v\n", service.Name) example.AddQueue(0, msg) } // Add a new message into the queue OnFailure func ExampleOnFailure() { msg := fmt.Sprintf("received a failing service: %v\n", service.Name) example.AddQueue(0, msg) } // OnTest allows your notifier to be testable func ExampleOnTest() { err := example.OnTest() fmt.Print(err) // Output } // Implement the Test interface to give your notifier testing abilities func ExampleNotification_CanTest() { testable := example.CanTest() fmt.Print(testable) // Output: false } // Add any type of interface to the AddQueue function to be ran in the queue func ExampleNotification_AddQueue() { msg := fmt.Sprintf("this is a failing message as a string passing into AddQueue function") example.AddQueue(0, msg) queue := example.Queue fmt.Printf("Example has %v items in the queue", len(queue)) // Output: Example has 2 items in the queue } // The Send method will run the main functionality of your notifier func ExampleNotification_Send() { msg := "this can be any type of interface" example.Send(msg) queue := example.Queue fmt.Printf("Example has %v items in the queue", len(queue)) // Output: // i received this string: this can be any type of interface // Example has 2 items in the queue } // LastSent will return the time.Duration of the last sent message func ExampleNotification_LastSent() { last := example.LastSent() fmt.Printf("Last message was sent %v seconds ago", last.Seconds()) // Output: Last message was sent 0 seconds ago } // Logs will return a slice of previously sent items from your notifier func ExampleNotification_Logs() { logs := example.Logs() fmt.Printf("Example has %v items in the log", len(logs)) // Output: Example has 0 items in the log } // SentLastMinute will return he amount of notifications sent in last 1 minute func ExampleNotification_SentLastMinute() { lastMinute := example.SentLastMinute() fmt.Printf("%v notifications sent in the last minute", lastMinute) // Output: 0 notifications sent in the last minute } // SentLastHour will return he amount of notifications sent in last 1 hour func ExampleNotification_SentLastHour() { lastHour := example.SentLastHour() fmt.Printf("%v notifications sent in the last hour", lastHour) // Output: 0 notifications sent in the last hour } // SentLastHour will return he amount of notifications sent in last 1 hour func ExampleNotification_WithinLimits() { ok, err := example.WithinLimits() if err != nil { panic(err) } if ok { fmt.Printf("Example notifier is still within its sending limits") } // Output: Example notifier is still within its sending limits }