mirror of
https://github.com/nikoksr/notify.git
synced 2025-02-09 13:13:44 +02:00
Merge pull request #14 from KrishanBhalla/feature/TwitterService
feat(service): Add Twitter service
This commit is contained in:
commit
0fc65d5e3b
@ -65,6 +65,7 @@ _ = notifier.Send(
|
||||
- *Email*
|
||||
- *Microsoft Teams*
|
||||
- *Slack*
|
||||
- *Twitter*
|
||||
- *Telegram*
|
||||
- *Pushbullet*
|
||||
|
||||
@ -82,6 +83,7 @@ _ = notifier.Send(
|
||||
- Telegram support: [go-telegram-bot-api/telegram-bot-api](https://github.com/go-telegram-bot-api/telegram-bot-api)
|
||||
- Pushbullet support: [cschomburg/go-pushbullet](https://github.com/cschomburg/go-pushbullet)
|
||||
- Logo: [MariaLetta/free-gophers-pack](https://github.com/MariaLetta/free-gophers-pack)
|
||||
- Twitter: [dghubble/go-twitter/twitter](https://github.com/dghubble/go-twitter/twitter)
|
||||
|
||||
## Author <a id="author"></a>
|
||||
|
||||
|
2
go.mod
2
go.mod
@ -6,6 +6,8 @@ require (
|
||||
github.com/atc0005/go-teams-notify/v2 v2.4.2
|
||||
github.com/bwmarrin/discordgo v0.23.1
|
||||
github.com/cschomburg/go-pushbullet v0.0.0-20171206132031-67759df45fbb
|
||||
github.com/dghubble/go-twitter v0.0.0-20201011215211-4b180d0cc78d
|
||||
github.com/dghubble/oauth1 v0.7.0
|
||||
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible
|
||||
github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible
|
||||
github.com/pkg/errors v0.9.1
|
||||
|
12
go.sum
12
go.sum
@ -2,15 +2,25 @@ github.com/atc0005/go-teams-notify/v2 v2.4.2 h1:3KQ8e8LN4kwuWWHpnCNTXA15JdLRaNWc
|
||||
github.com/atc0005/go-teams-notify/v2 v2.4.2/go.mod h1:BSlh1HBcgWcGoNM3Abm36WMPcj+k8Wf0ZLZx6lBx2qk=
|
||||
github.com/bwmarrin/discordgo v0.23.1 h1:xlK4/69bpl/VSoCYaKe3BOc9j1HkNopoRdCppRYu8dk=
|
||||
github.com/bwmarrin/discordgo v0.23.1/go.mod h1:c1WtWUGN6nREDmzIpyTp/iD3VYt4Fpx+bVyfBG7JE+M=
|
||||
github.com/cenkalti/backoff v2.1.1+incompatible h1:tKJnvO2kl0zmb/jA5UKAt4VoEVw1qxKWjE/Bpp46npY=
|
||||
github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
|
||||
github.com/cschomburg/go-pushbullet v0.0.0-20171206132031-67759df45fbb h1:7X9nrm+LNWdxzQOiCjy0G51rNUxbH35IDHCjAMvogyM=
|
||||
github.com/cschomburg/go-pushbullet v0.0.0-20171206132031-67759df45fbb/go.mod h1:RfQ9wji3fjcSEsQ+uFCtIh3+BXgcZum8Kt3JxvzYzlk=
|
||||
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=
|
||||
github.com/dghubble/go-twitter v0.0.0-20201011215211-4b180d0cc78d h1:sBKr0A8iQ1qAOozedZ8Aox+Jpv+TeP1Qv7dcQyW8V+M=
|
||||
github.com/dghubble/go-twitter v0.0.0-20201011215211-4b180d0cc78d/go.mod h1:xfg4uS5LEzOj8PgZV7SQYRHbG7jPUnelEiaAVJxmhJE=
|
||||
github.com/dghubble/oauth1 v0.7.0 h1:AlpZdbRiJM4XGHIlQ8BuJ/wlpGwFEJNnB4Mc+78tA/w=
|
||||
github.com/dghubble/oauth1 v0.7.0/go.mod h1:8pFdfPkv/jr8mkChVbNVuJ0suiHe278BtWI4Tk1ujxk=
|
||||
github.com/dghubble/sling v1.3.0 h1:pZHjCJq4zJvc6qVQ5wN1jo5oNZlNE0+8T/h0XeXBUKU=
|
||||
github.com/dghubble/sling v1.3.0/go.mod h1:XXShWaBWKzNLhu2OxikSNFrlsvowtz4kyRuXUG7oQKY=
|
||||
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible h1:2cauKuaELYAEARXRkq2LrJ0yDDv1rW7+wrTEdVL3uaU=
|
||||
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible/go.mod h1:qf9acutJ8cwBUhm1bqgz6Bei9/C/c93FPDljKWwsOgM=
|
||||
github.com/go-test/deep v1.0.4 h1:u2CU3YKy9I2pmu9pX0eq50wCgjfGIt539SqR7FbHiho=
|
||||
github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
|
||||
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
|
||||
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
|
||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
|
||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
@ -24,8 +34,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
|
||||
github.com/slack-go/slack v0.8.0 h1:ANyLY5KHLV+MxLJDQum2IuHTLwbCbDtaWY405X1EU9U=
|
||||
github.com/slack-go/slack v0.8.0/go.mod h1:FGqNzJBmxIsZURAxh2a8D21AnOVvvXZvGligs4npPUM=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM=
|
||||
|
101
service/twitter/twitter.go
Normal file
101
service/twitter/twitter.go
Normal file
@ -0,0 +1,101 @@
|
||||
package twitter
|
||||
|
||||
import (
|
||||
"github.com/dghubble/go-twitter/twitter"
|
||||
"github.com/dghubble/oauth1"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
// Twitter struct holds necessary data to communicate with the Twitter API
|
||||
type Twitter struct {
|
||||
client *twitter.Client
|
||||
twitterIDs []string
|
||||
}
|
||||
|
||||
// Credentials contains the authentication credentials needed for twitter
|
||||
// api access
|
||||
//
|
||||
// ConsumerKey and ConsumerSecret can be thought of as the user name
|
||||
// and password that represents your Twitter developer app when making
|
||||
// API requests.
|
||||
//
|
||||
// An access token and access token secret are user-specific credentials
|
||||
// used to authenticate OAuth 1.0a API requests.
|
||||
// They specify the Twitter account the request is made on behalf of.
|
||||
//
|
||||
// See https://developer.twitter.com/en/docs/authentication/oauth-1-0a for more details
|
||||
type Credentials struct {
|
||||
ConsumerKey string
|
||||
ConsumerSecret string
|
||||
AccessToken string
|
||||
AccessTokenSecret string
|
||||
}
|
||||
|
||||
// New returns a new instance of a Slack notification service.
|
||||
// For more information about slack api token:
|
||||
// -> https://pkg.go.dev/github.com/slack-go/slack#New
|
||||
func New(credentials Credentials) (*Twitter, error) {
|
||||
config := oauth1.NewConfig(credentials.ConsumerKey, credentials.ConsumerSecret)
|
||||
token := oauth1.NewToken(credentials.AccessToken, credentials.AccessTokenSecret)
|
||||
httpClient := config.Client(oauth1.NoContext, token)
|
||||
client := twitter.NewClient(httpClient)
|
||||
|
||||
// Verify Credentials
|
||||
verifyParams := &twitter.AccountVerifyParams{
|
||||
SkipStatus: twitter.Bool(true),
|
||||
IncludeEmail: twitter.Bool(true),
|
||||
}
|
||||
|
||||
// we can retrieve the user and verify if the credentials
|
||||
// we have used successfully allow us to log in!
|
||||
_, _, err := client.Accounts.VerifyCredentials(verifyParams)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
t := &Twitter{
|
||||
client: client,
|
||||
twitterIDs: []string{},
|
||||
}
|
||||
|
||||
return t, nil
|
||||
}
|
||||
|
||||
// AddReceivers takes TwitterIds and adds them to the internal twitterIDs list.
|
||||
func (t *Twitter) AddReceivers(twitterIDs ...string) {
|
||||
t.twitterIDs = append(t.twitterIDs, twitterIDs...)
|
||||
}
|
||||
|
||||
// Send takes a message subject and a message body and sends them to all previously set twitterIDs as a DM.
|
||||
// See https://developer.twitter.com/en/docs/twitter-api/v1/direct-messages/sending-and-receiving/api-reference/new-event
|
||||
func (t Twitter) Send(subject, message string) error {
|
||||
|
||||
directMessageData := &twitter.DirectMessageData{
|
||||
Text: subject + "\n" + message,
|
||||
}
|
||||
|
||||
for _, twitterID := range t.twitterIDs {
|
||||
|
||||
directMessageTarget := &twitter.DirectMessageTarget{
|
||||
RecipientID: twitterID,
|
||||
}
|
||||
directMessageEvent := &twitter.DirectMessageEvent{
|
||||
Type: "message_create",
|
||||
Message: &twitter.DirectMessageEventMessage{
|
||||
Target: directMessageTarget,
|
||||
Data: directMessageData,
|
||||
},
|
||||
}
|
||||
|
||||
directMessageParams := &twitter.DirectMessageEventsNewParams{
|
||||
Event: directMessageEvent,
|
||||
}
|
||||
|
||||
_, _, err := t.client.DirectMessages.EventsNew(directMessageParams)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "failed to send direct message to twitter ID '%s'", twitterID)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user