2018-12-10 05:43:15 +00:00
// Statup
// Copyright (C) 2018. Hunter Long and the project contributors
// Written by Hunter Long <info@socialeck.com> and the project contributors
//
// https://github.com/hunterlong/statup
//
// 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 <http://www.gnu.org/licenses/>.
2020-03-12 08:09:25 +00:00
package notifiers
2018-12-10 05:43:15 +00:00
import (
"encoding/json"
"errors"
"fmt"
2020-03-09 18:17:55 +00:00
"github.com/statping/statping/types/failures"
2020-03-14 03:13:20 +00:00
"github.com/statping/statping/types/notifications"
"github.com/statping/statping/types/notifier"
2020-03-09 18:17:55 +00:00
"github.com/statping/statping/types/services"
"github.com/statping/statping/utils"
2018-12-10 05:43:15 +00:00
"net/url"
"strings"
"time"
)
2020-03-14 03:13:20 +00:00
var _ notifier . Notifier = ( * telegram ) ( nil )
2020-03-09 15:15:15 +00:00
2018-12-10 05:43:15 +00:00
type telegram struct {
2020-03-14 03:13:20 +00:00
* notifications . Notification
2018-12-10 05:43:15 +00:00
}
2020-03-14 03:13:20 +00:00
func ( t * telegram ) Select ( ) * notifications . Notification {
return t . Notification
}
var Telegram = & telegram { & notifications . Notification {
2018-12-10 05:43:15 +00:00
Method : "telegram" ,
Title : "Telegram" ,
Description : "Receive notifications on your Telegram channel when a service has an issue. You must get a Telegram API token from the /botfather. Review the <a target=\"_blank\" href=\"http://techthoughts.info/how-to-create-a-telegram-bot-and-send-messages-via-api\">Telegram API Tutorial</a> to learn how to generate a new API Token." ,
Author : "Hunter Long" ,
AuthorUrl : "https://github.com/hunterlong" ,
Icon : "fab fa-telegram-plane" ,
Delay : time . Duration ( 5 * time . Second ) ,
2020-03-14 03:13:20 +00:00
Form : [ ] notifications . NotificationForm { {
2018-12-10 05:43:15 +00:00
Type : "text" ,
Title : "Telegram API Token" ,
Placeholder : "383810182:EEx829dtCeufeQYXG7CUdiQopqdmmxBPO7-s" ,
SmallText : "Enter the API Token given to you from the /botfather chat." ,
DbField : "api_secret" ,
Required : true ,
} , {
Type : "text" ,
Title : "Channel or User ID" ,
Placeholder : "789325392" ,
SmallText : "Insert your Telegram Channel ID or User ID here." ,
DbField : "Var1" ,
Required : true ,
} } } ,
}
// Send will send a HTTP Post to the Telegram API. It accepts type: string
2020-03-14 03:13:20 +00:00
func ( u * telegram ) sendMessage ( message string ) error {
2018-12-10 05:43:15 +00:00
apiEndpoint := fmt . Sprintf ( "https://api.telegram.org/bot%v/sendMessage" , u . ApiSecret )
v := url . Values { }
v . Set ( "chat_id" , u . Var1 )
v . Set ( "text" , message )
rb := * strings . NewReader ( v . Encode ( ) )
2019-09-17 10:18:12 +00:00
contents , _ , err := utils . HttpRequest ( apiEndpoint , "GET" , "application/x-www-form-urlencoded" , nil , & rb , time . Duration ( 10 * time . Second ) , true )
2018-12-10 05:43:15 +00:00
success , _ := telegramSuccess ( contents )
if ! success {
errorOut := telegramError ( contents )
out := fmt . Sprintf ( "Error code %v - %v" , errorOut . ErrorCode , errorOut . Description )
return errors . New ( out )
}
return err
}
// OnFailure will trigger failing service
2020-03-14 03:13:20 +00:00
func ( u * telegram ) OnFailure ( s * services . Service , f * failures . Failure ) error {
2018-12-10 05:43:15 +00:00
msg := fmt . Sprintf ( "Your service '%v' is currently offline!" , s . Name )
2020-03-14 03:13:20 +00:00
return u . sendMessage ( msg )
2018-12-10 05:43:15 +00:00
}
// OnSuccess will trigger successful service
2020-03-14 03:13:20 +00:00
func ( u * telegram ) OnSuccess ( s * services . Service ) error {
msg := fmt . Sprintf ( "Your service '%v' is currently online!" , s . Name )
return u . sendMessage ( msg )
2018-12-10 05:43:15 +00:00
}
// OnTest will test the Twilio SMS messaging
func ( u * telegram ) OnTest ( ) error {
2019-01-09 04:20:43 +00:00
msg := fmt . Sprintf ( "Testing the Twilio SMS Notifier on your Statping server" )
2020-03-14 03:13:20 +00:00
return u . sendMessage ( msg )
2018-12-10 05:43:15 +00:00
}
func telegramSuccess ( res [ ] byte ) ( bool , telegramResponse ) {
var obj telegramResponse
json . Unmarshal ( res , & obj )
if obj . Ok {
return true , obj
}
return false , obj
}
func telegramError ( res [ ] byte ) telegramErrorObj {
var obj telegramErrorObj
json . Unmarshal ( res , & obj )
return obj
}
type telegramErrorObj struct {
Ok bool ` json:"ok" `
ErrorCode int ` json:"error_code" `
Description string ` json:"description" `
}
type telegramResponse struct {
Ok bool ` json:"ok" `
Result struct {
MessageID int ` json:"message_id" `
From struct {
ID int ` json:"id" `
IsBot bool ` json:"is_bot" `
FirstName string ` json:"first_name" `
Username string ` json:"username" `
} ` json:"from" `
Chat struct {
ID int ` json:"id" `
FirstName string ` json:"first_name" `
LastName string ` json:"last_name" `
Username string ` json:"username" `
Type string ` json:"type" `
} ` json:"chat" `
Date int ` json:"date" `
Text string ` json:"text" `
} ` json:"result" `
}