diff --git a/README.md b/README.md index 4a131056..08cc54d3 100644 --- a/README.md +++ b/README.md @@ -77,34 +77,33 @@ Yes, please! Contributions of all kinds are very welcome! Feel free to check our > Click [here](https://github.com/nikoksr/notify/issues/new?assignees=&labels=affects%2Fservices%2C+good+first+issue%2C+hacktoberfest%2C+help+wanted%2C+type%2Fenhancement%2C+up+for+grabs&template=service-request.md&title=feat%28service%29%3A+Add+%5BSERVICE+NAME%5D+service) to request a missing service. -| Service | Path | Credits | -|--------------------------------------------------------------------------------|------------------------------------------|-------------------------------------------------------------------------------------------------| -| [Amazon SES](https://aws.amazon.com/ses) | [service/amazonses](service/amazonses) | [aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) | -| [Amazon SNS](https://aws.amazon.com/sns) | [service/amazonsns](service/amazonsns) | [aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) | -| [Bark](https://apps.apple.com/us/app/bark-customed-notifications/id1403753865) | [service/bark](service/bark) | - | -| [DingTalk](https://www.dingtalk.com) | [service/dinding](service/dingding) | [blinkbean/dingtalk](https://github.com/blinkbean/dingtalk) | -| [Discord](https://discord.com) | [service/discord](service/discord) | [bwmarrin/discordgo](https://github.com/bwmarrin/discordgo) | -| [Email](https://wikipedia.org/wiki/Email) | [service/mail](service/mail) | [jordan-wright/email](https://github.com/jordan-wright/email) | -| [Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging) | [service/fcm](service/fcm) | [appleboy/go-fcm](https://github.com/appleboy/go-fcm) | -| [Lark](https://www.larksuite.com/) | [service/lark](service/lark) | [go-lark/lark](https://github.com/go-lark/lark) | -| [Line](https://line.me) | [service/line](service/line) | [line/line-bot-sdk-go](https://github.com/line/line-bot-sdk-go) | -| [Line Notify](https://notify-bot.line.me) | [service/line](service/line) | [utahta/go-linenotify](https://github.com/utahta/go-linenotify) | -| [Mailgun](https://www.mailgun.com) | [service/mailgun](service/mailgun) | [mailgun/mailgun-go](https://github.com/mailgun/mailgun-go) | -| [Microsoft Teams](https://www.microsoft.com/microsoft-teams) | [service/msteams](service/msteams) | [atc0005/go-teams-notify](https://github.com/atc0005/go-teams-notify) | -| [Plivo](https://www.plivo.com) | [service/plivo](service/plivo) | [plivo/plivo-go](https://github.com/plivo/plivo-go) | -| [Pushbullet](https://www.pushbullet.com) | [service/pushbullet](service/pushbullet) | [cschomburg/go-pushbullet](https://github.com/cschomburg/go-pushbullet) | -| [RocketChat](https://rocket.chat) | [service/rocketchat](service/rocketchat) | [RocketChat/Rocket.Chat.Go.SDK](https://github.com/RocketChat/Rocket.Chat.Go.SDK) | -| [SendGrid](https://sendgrid.com) | [service/sendgrid](service/sendgrid) | [sendgrid/sendgrid-go](https://github.com/sendgrid/sendgrid-go) | -| [Slack](https://slack.com) | [service/slack](service/slack) | [slack-go/slack](https://github.com/slack-go/slack) | -| [Syslog](https://wikipedia.org/wiki/Syslog) | [service/syslog](service/syslog) | [log/syslog](https://pkg.go.dev/log/syslog) | -| [Telegram](https://telegram.org) | [service/telegram](service/telegram) | [go-telegram-bot-api/telegram-bot-api](https://github.com/go-telegram-bot-api/telegram-bot-api) | -| [TextMagic](https://www.textmagic.com) | [service/textmagic](service/textmagic) | [textmagic/textmagic-rest-go-v2](https://github.com/textmagic/textmagic-rest-go-v2) | -| [Twilio](https://www.twilio.com/) | [service/twilio](service/twilio) | [kevinburke/twilio-go](https://github.com/kevinburke/twilio-go) | -| [Twitter](https://twitter.com) | [service/twitter](service/twitter) | [dghubble/go-twitter](https://github.com/dghubble/go-twitter) | -| [WeChat](https://www.wechat.com) | [service/wechat](service/wechat) | [silenceper/wechat](https://github.com/silenceper/wechat) | -| [WhatsApp](https://www.whatsapp.com) | [service/whatsapp](service/whatsapp) | [Rhymen/go-whatsapp](https://github.com/Rhymen/go-whatsapp) | -| [Matrix](https://www.matrix.org) | [service/matrix](service/matrix) | [mautrix/go](https://github.com/mautrix/go) | - +| Service | Path | Credits | Status | +|--------------------------------------------------------------------------------|------------------------------------------|-------------------------------------------------------------------------------------------------|:------------------:| +| [Amazon SES](https://aws.amazon.com/ses) | [service/amazonses](service/amazonses) | [aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) | :heavy_check_mark: | +| [Amazon SNS](https://aws.amazon.com/sns) | [service/amazonsns](service/amazonsns) | [aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) | :heavy_check_mark: | +| [Bark](https://apps.apple.com/us/app/bark-customed-notifications/id1403753865) | [service/bark](service/bark) | - | :heavy_check_mark: | +| [DingTalk](https://www.dingtalk.com) | [service/dinding](service/dingding) | [blinkbean/dingtalk](https://github.com/blinkbean/dingtalk) | :heavy_check_mark: | +| [Discord](https://discord.com) | [service/discord](service/discord) | [bwmarrin/discordgo](https://github.com/bwmarrin/discordgo) | :heavy_check_mark: | +| [Email](https://wikipedia.org/wiki/Email) | [service/mail](service/mail) | [jordan-wright/email](https://github.com/jordan-wright/email) | :heavy_check_mark: | +| [Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging) | [service/fcm](service/fcm) | [appleboy/go-fcm](https://github.com/appleboy/go-fcm) | :heavy_check_mark: | +| [Lark](https://www.larksuite.com/) | [service/lark](service/lark) | [go-lark/lark](https://github.com/go-lark/lark) | :heavy_check_mark: | +| [Line](https://line.me) | [service/line](service/line) | [line/line-bot-sdk-go](https://github.com/line/line-bot-sdk-go) | :heavy_check_mark: | +| [Line Notify](https://notify-bot.line.me) | [service/line](service/line) | [utahta/go-linenotify](https://github.com/utahta/go-linenotify) | :heavy_check_mark: | +| [Mailgun](https://www.mailgun.com) | [service/mailgun](service/mailgun) | [mailgun/mailgun-go](https://github.com/mailgun/mailgun-go) | :heavy_check_mark: | +| [Matrix](https://www.matrix.org) | [service/matrix](service/matrix) | [mautrix/go](https://github.com/mautrix/go) | :heavy_check_mark: | +| [Microsoft Teams](https://www.microsoft.com/microsoft-teams) | [service/msteams](service/msteams) | [atc0005/go-teams-notify](https://github.com/atc0005/go-teams-notify) | :heavy_check_mark: | +| [Plivo](https://www.plivo.com) | [service/plivo](service/plivo) | [plivo/plivo-go](https://github.com/plivo/plivo-go) | :heavy_check_mark: | +| [Pushbullet](https://www.pushbullet.com) | [service/pushbullet](service/pushbullet) | [cschomburg/go-pushbullet](https://github.com/cschomburg/go-pushbullet) | :heavy_check_mark: | +| [RocketChat](https://rocket.chat) | [service/rocketchat](service/rocketchat) | [RocketChat/Rocket.Chat.Go.SDK](https://github.com/RocketChat/Rocket.Chat.Go.SDK) | :heavy_check_mark: | +| [SendGrid](https://sendgrid.com) | [service/sendgrid](service/sendgrid) | [sendgrid/sendgrid-go](https://github.com/sendgrid/sendgrid-go) | :heavy_check_mark: | +| [Slack](https://slack.com) | [service/slack](service/slack) | [slack-go/slack](https://github.com/slack-go/slack) | :heavy_check_mark: | +| [Syslog](https://wikipedia.org/wiki/Syslog) | [service/syslog](service/syslog) | [log/syslog](https://pkg.go.dev/log/syslog) | :heavy_check_mark: | +| [Telegram](https://telegram.org) | [service/telegram](service/telegram) | [go-telegram-bot-api/telegram-bot-api](https://github.com/go-telegram-bot-api/telegram-bot-api) | :heavy_check_mark: | +| [TextMagic](https://www.textmagic.com) | [service/textmagic](service/textmagic) | [textmagic/textmagic-rest-go-v2](https://github.com/textmagic/textmagic-rest-go-v2) | :heavy_check_mark: | +| [Twilio](https://www.twilio.com/) | [service/twilio](service/twilio) | [kevinburke/twilio-go](https://github.com/kevinburke/twilio-go) | :heavy_check_mark: | +| [Twitter](https://twitter.com) | [service/twitter](service/twitter) | [dghubble/go-twitter](https://github.com/dghubble/go-twitter) | :heavy_check_mark: | +| [WeChat](https://www.wechat.com) | [service/wechat](service/wechat) | [silenceper/wechat](https://github.com/silenceper/wechat) | :heavy_check_mark: | +| [WhatsApp](https://www.whatsapp.com) | [service/whatsapp](service/whatsapp) | [Rhymen/go-whatsapp](https://github.com/Rhymen/go-whatsapp) | :x: | ## Special Thanks diff --git a/go.mod b/go.mod index e8884637..c19e7242 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,6 @@ module github.com/nikoksr/notify go 1.19 require ( - github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f - github.com/Rhymen/go-whatsapp v0.1.1 github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220903135808-56c5346a1a28 github.com/antihax/optional v1.0.0 // indirect github.com/atc0005/go-teams-notify/v2 v2.6.1 @@ -69,14 +67,11 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/kevinburke/go-types v0.0.0-20210723172823-2deba1f80ba7 // indirect github.com/kevinburke/rest v0.0.0-20210506044642-5611499aa33c // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/sendgrid/rest v2.6.9+incompatible // indirect github.com/sirupsen/logrus v1.9.0 // indirect - github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect github.com/spf13/cast v1.5.0 // indirect github.com/stretchr/objx v0.4.0 // indirect github.com/technoweenie/multipartstreamer v1.0.1 // indirect diff --git a/go.sum b/go.sum index 4c6a62f1..bfaf983e 100644 --- a/go.sum +++ b/go.sum @@ -1,14 +1,5 @@ -github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f h1:2dk3eOnYllh+wUOuDhOoC2vUVoJF/5z478ryJ+wzEII= -github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f/go.mod h1:4a58ifQTEe2uwwsaqbh3i2un5/CBPg+At/qHpt18Tmk= github.com/Jeffail/gabs v1.4.0 h1://5fYRRTq1edjfIrQGvdkcd22pkYUrHZ5YC/H2GJVAo= github.com/Jeffail/gabs v1.4.0/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc= -github.com/Rhymen/go-whatsapp v0.0.0/go.mod h1:rdQr95g2C1xcOfM7QGOhza58HeI3I+tZ/bbluv7VazA= -github.com/Rhymen/go-whatsapp v0.1.1 h1:OK+bCugQcr2YjyYKeDzULqCtM50TPUFM6LvQtszKfcw= -github.com/Rhymen/go-whatsapp v0.1.1/go.mod h1:o7jjkvKnigfu432dMbQ/w4PH0Yp5u4Y6ysCNjUlcYCk= -github.com/Rhymen/go-whatsapp/examples/echo v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:zgCiQtBtZ4P4gFWvwl9aashsdwOcbb/EHOGRmSzM8ME= -github.com/Rhymen/go-whatsapp/examples/restoreSession v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:5sCUSpG616ZoSJhlt9iBNI/KXBqrVLcNUJqg7J9+8pU= -github.com/Rhymen/go-whatsapp/examples/sendImage v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:RdiyhanVEGXTam+mZ3k6Y3VDCCvXYCwReOoxGozqhHw= -github.com/Rhymen/go-whatsapp/examples/sendTextMessages v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:suwzklatySS3Q0+NCxCDh5hYfgXdQUWU1DNcxwAxStM= github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220903135808-56c5346a1a28 h1:OJe0G++TYGhE525XnkrF9KF15D1WtQdyrk19SFwRrKk= github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220903135808-56c5346a1a28/go.mod h1:rjP7sIipbZcagro/6TCk6X0ZeFT2eyudH5+fve/cbBA= github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= @@ -98,7 +89,6 @@ github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3a github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -129,8 +119,6 @@ github.com/gopackage/ddp v0.0.0-20170117053602-652027933df4 h1:4EZlYQIiyecYJlUbV github.com/gopackage/ddp v0.0.0-20170117053602-652027933df4/go.mod h1:lEO7XoHJ/xNRBCxrn4h/CEB67h0kW1B0t4ooP2yrjUA= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -161,12 +149,6 @@ github.com/line/line-bot-sdk-go v7.8.0+incompatible h1:Uf9/OxV0zCVfqyvwZPH8CrdiH github.com/line/line-bot-sdk-go v7.8.0+incompatible/go.mod h1:0RjLjJEAU/3GIcHkC3av6O4jInAbt25nnZVmOFUgDBg= github.com/mailgun/mailgun-go/v4 v4.8.1 h1:1+MdKakJuXnW2JJDbyPdO1ngAANOyHyVPxQvFF8Sq6c= github.com/mailgun/mailgun-go/v4 v4.8.1/go.mod h1:FJlF9rI5cQT+mrwujtJjPMbIVy3Ebor9bKTVsJ0QU40= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -207,9 +189,6 @@ github.com/silenceper/wechat/v2 v2.1.4 h1:X+G9C/EiBET5AK0zhrflX3ESCP/yxhJUvoRoSX github.com/silenceper/wechat/v2 v2.1.4/go.mod h1:F0PKqImb15THnwoqRNrZO1z3vpwyWuiHr5zzfnjdECY= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/skip2/go-qrcode v0.0.0-20190110000554-dc11ecdae0a9/go.mod h1:PLPIyL7ikehBD1OAjmKKiOEhbvWyHGaNDjquXMcYABo= -github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= -github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= github.com/slack-go/slack v0.11.3 h1:GN7revxEMax4amCc3El9a+9SGnjmBvSUobs0QnO6ZO8= github.com/slack-go/slack v0.11.3/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw= github.com/sony/sonyflake v1.0.0 h1:MpU6Ro7tfXwgn2l5eluf9xQvQJDROTBImNCfRXn/YeM= @@ -249,7 +228,6 @@ github.com/ttacon/libphonenumber v1.2.1/go.mod h1:E0TpmdVMq5dyVlQ7oenAkhsLu86OkU github.com/utahta/go-linenotify v0.5.0 h1:E1tJaB/XhqRY/iz203FD0MaHm10DjQPOq5/Mem2A3Gs= github.com/utahta/go-linenotify v0.5.0/go.mod h1:KsvBXil2wx+ByaCR0e+IZKTbp4pDesc7yjzRigLf6pE= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -golang.org/x/crypto v0.0.0-20190131182504-b8fe1690c613/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -275,14 +253,12 @@ golang.org/x/oauth2 v0.0.0-20220722155238-128564f6959c h1:q3gFqPqH7NVofKo3c3yETA golang.org/x/oauth2 v0.0.0-20220722155238-128564f6959c/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/sync v0.0.0-20171101214715-fd80eb99c8f6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -295,8 +271,6 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220803195053-6e608f9ce704 h1:Y7NOhdqIOU8kYI7BxsgL38d0ot0raxvcW+EMQU2QrT4= @@ -317,7 +291,6 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/service/whatsapp/README.md b/service/whatsapp/README.md index 5d3322db..ef35c649 100644 --- a/service/whatsapp/README.md +++ b/service/whatsapp/README.md @@ -1,56 +1,14 @@ # WhatsApp -[![go.dev reference](https://img.shields.io/badge/go.dev-reference-007d9c?logo=go&logoColor=white&style=flat)](https://pkg.go.dev/github.com/nikoksr/notify/service/whatsapp) +## IMPORTANT -## Prerequisites +### Broken state; see [#274](https://github.com/nikoksr/notify/issues/274) -You will need a registered WhatsApp phone number to be used as source for sending WhatsApp messages. +Since our previous WhatsApp client library was abandoned, we had to switch to a new one. Unfortunately, the new library +is not yet ready for production use. We are working on a solution, but it will take some time. -## Usage +The broken client library caused our CI pipeline to break and for that reason we decided to turn the WhatsApp service +into a no-op service. This means that the WhatsApp service will not send any notifications, but it will not return any +errors either. This is a temporary solution until we have a working client library. We chose no-op over a hard error to +prevent breaking existing applications. -In the current implementation, authentication is implemented using 2 ways: - -1. Scanning QR code from terminal using a registered WhatsApp device. - - - Go to WhatsApp on your device. - - Click on the ellipsis icon (3 vertical dots) on top right, then click on "WhatsApp Web". - - Click on the "+" icon and scan the QR code from terminal. - -> Refer: [Login (go-whatsapp)](https://github.com/Rhymen/go-whatsapp#login) and [sigalor/whatsapp-web-reveng](https://github.com/sigalor/whatsapp-web-reveng) for more details. - -2. Providing the Session credentials explicitly. - -```go -package main - -import ( - "log" - - "github.com/nikoksr/notify" - "github.com/nikoksr/notify/service/whatsapp" -) - -func main() { - whatsappSvc, err := whatsapp.New() - if err != nil { - log.Fatalf("whatsapp.New() failed: %s", err.Error()) - } - - err = whatsappSvc.LoginWithQRCode() - if err != nil { - log.Fatalf("whatsappSvc.LoginWithQRCode() failed: %s", err.Error()) - } - - whatsappSvc.AddReceivers("Contact1") - - notifier := notify.New() - notifier.UseServices(whatsappSvc) - - err = notifier.Send(context.Background(), "subject", "message") - if err != nil { - log.Fatalf("notifier.Send() failed: %s", err.Error()) - } - - log.Println("notification sent") -} -``` diff --git a/service/whatsapp/doc.go b/service/whatsapp/doc.go index 1d1471d7..38f0a9d6 100644 --- a/service/whatsapp/doc.go +++ b/service/whatsapp/doc.go @@ -1,39 +1,8 @@ /* -Package whatsapp provides message notification integration for WhatsApp. +Package whatsapp is currently a [ NO-OP ] service! We're sorry for the inconveniences. We're already working on a fix. -Usage: +Please read this [1] for more. Thanks! - package main - - import ( - "log" - - "github.com/nikoksr/notify" - "github.com/nikoksr/notify/service/whatsapp" - ) - - func main() { - whatsappSvc, err := whatsapp.New() - if err != nil { - log.Fatalf("whatsapp.New() failed: %s", err.Error()) - } - - err = whatsappSvc.LoginWithQRCode() - if err != nil { - log.Fatalf("whatsappSvc.LoginWithQRCode() failed: %s", err.Error()) - } - - whatsappSvc.AddReceivers("Contact1") - - notifier := notify.New() - notifier.UseServices(whatsappSvc) - - err = notifier.Send(context.Background(), "subject", "message") - if err != nil { - log.Fatalf("notifier.Send() failed: %s", err.Error()) - } - - log.Println("notification sent") - } +[1]:https://github.com/nikoksr/notify/issues/274 */ package whatsapp diff --git a/service/whatsapp/mock_whatsapp_client.go b/service/whatsapp/mock_whatsapp_client.go deleted file mode 100644 index 2cb807df..00000000 --- a/service/whatsapp/mock_whatsapp_client.go +++ /dev/null @@ -1,91 +0,0 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. - -package whatsapp - -import ( - go_whatsapp "github.com/Rhymen/go-whatsapp" - mock "github.com/stretchr/testify/mock" -) - -// mockWhatsappClient is an autogenerated mock type for the whatsappClient type -type mockWhatsappClient struct { - mock.Mock -} - -// Login provides a mock function with given fields: qrChan -func (_m *mockWhatsappClient) Login(qrChan chan<- string) (go_whatsapp.Session, error) { - ret := _m.Called(qrChan) - - var r0 go_whatsapp.Session - if rf, ok := ret.Get(0).(func(chan<- string) go_whatsapp.Session); ok { - r0 = rf(qrChan) - } else { - r0 = ret.Get(0).(go_whatsapp.Session) - } - - var r1 error - if rf, ok := ret.Get(1).(func(chan<- string) error); ok { - r1 = rf(qrChan) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// RestoreWithSession provides a mock function with given fields: session -func (_m *mockWhatsappClient) RestoreWithSession(session go_whatsapp.Session) (go_whatsapp.Session, error) { - ret := _m.Called(session) - - var r0 go_whatsapp.Session - if rf, ok := ret.Get(0).(func(go_whatsapp.Session) go_whatsapp.Session); ok { - r0 = rf(session) - } else { - r0 = ret.Get(0).(go_whatsapp.Session) - } - - var r1 error - if rf, ok := ret.Get(1).(func(go_whatsapp.Session) error); ok { - r1 = rf(session) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// Send provides a mock function with given fields: msg -func (_m *mockWhatsappClient) Send(msg interface{}) (string, error) { - ret := _m.Called(msg) - - var r0 string - if rf, ok := ret.Get(0).(func(interface{}) string); ok { - r0 = rf(msg) - } else { - r0 = ret.Get(0).(string) - } - - var r1 error - if rf, ok := ret.Get(1).(func(interface{}) error); ok { - r1 = rf(msg) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -type mockConstructorTestingTnewMockWhatsappClient interface { - mock.TestingT - Cleanup(func()) -} - -// newMockWhatsappClient creates a new instance of mockWhatsappClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func newMockWhatsappClient(t mockConstructorTestingTnewMockWhatsappClient) *mockWhatsappClient { - mock := &mockWhatsappClient{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/service/whatsapp/whatsapp.go b/service/whatsapp/whatsapp.go index 574c79eb..47c5bde1 100644 --- a/service/whatsapp/whatsapp.go +++ b/service/whatsapp/whatsapp.go @@ -2,190 +2,24 @@ package whatsapp import ( "context" - "encoding/gob" - "fmt" - "os" - "path/filepath" - "time" - - qrcodeTerminal "github.com/Baozisoftware/qrcode-terminal-go" - "github.com/Rhymen/go-whatsapp" - "github.com/pkg/errors" -) - -const ( - qrLoginWaitTime = 3 * time.Second - clientTimeout = 5 * time.Second ) -var sessionFilePath = filepath.Join(os.TempDir(), "whatsappSession.gob") - -// whatsappClient abstracts go-whatsapp for writing unit tests -// -//go:generate mockery --name=whatsappClient --output=. --case=underscore --inpackage -type whatsappClient interface { - Login(qrChan chan<- string) (whatsapp.Session, error) - RestoreWithSession(session whatsapp.Session) (whatsapp.Session, error) - Send(msg interface{}) (string, error) -} - // Service encapsulates the WhatsApp client along with internal state for storing contacts. -type Service struct { - client whatsappClient - contacts []string -} +type Service struct{} // New returns a new instance of a WhatsApp notification service. -func New() (*Service, error) { - client, err := whatsapp.NewConn(clientTimeout) - if err != nil { - return nil, err - } - - return &Service{ - client: client, - contacts: []string{}, - }, nil -} +func New() (*Service, error) { return &Service{}, nil } // LoginWithSessionCredentials provides helper for authentication using whatsapp.Session credentials. -func (s *Service) LoginWithSessionCredentials(clientID, clientToken, serverToken, wid string, encKey, macKey []byte) error { - session := whatsapp.Session{ - ClientId: clientID, - ClientToken: clientToken, - ServerToken: serverToken, - Wid: wid, - EncKey: encKey, - MacKey: macKey, - } - - session, err := s.client.RestoreWithSession(session) - if err != nil { - return fmt.Errorf("restoring session failed: %w", err) - } - - // Save the updated session for future use without login. - err = writeSession(&session) - if err != nil { - return fmt.Errorf("error saving session: %w", err) - } - - return nil -} +func (s *Service) LoginWithSessionCredentials(_, _, _, _ string, _, _ []byte) error { return nil } // LoginWithQRCode provides helper for authentication using QR code on terminal. // Refer: https://github.com/Rhymen/go-whatsapp#login for more information. -func (s *Service) LoginWithQRCode() error { - session, err := readSession() - if err == nil { - session, err = s.client.RestoreWithSession(session) - if err != nil { - return fmt.Errorf("restoring session failed: %w", err) - } - } else { - // No saved session found; need to login again. - qr := make(chan string) - go func() { - terminal := qrcodeTerminal.New() - terminal.Get(<-qr).Print() - }() - - session, err = s.client.Login(qr) - if err != nil { - return fmt.Errorf("error during login: %w", err) - } - } - - err = writeSession(&session) - if err != nil { - return fmt.Errorf("error saving session: %w", err) - } - - <-time.After(qrLoginWaitTime) - - return nil -} - -// readSession helps load saved WhatsApp session from local file system. -func readSession() (whatsapp.Session, error) { - session := whatsapp.Session{} - file, err := os.Open(sessionFilePath) - if err != nil { - return session, err - } - defer func() { - cerr := file.Close() - if cerr != nil { - if err != nil { - err = errors.Wrap(err, cerr.Error()) - } else { - err = cerr - } - } - }() - - decoder := gob.NewDecoder(file) - err = decoder.Decode(&session) - if err != nil { - return session, err - } - - return session, nil -} - -// writeSession helps save WhatsApp session to local file system. -func writeSession(session *whatsapp.Session) error { - file, err := os.Create(sessionFilePath) - if err != nil { - return err - } - defer func() { - cerr := file.Close() - if cerr != nil { - if err != nil { - err = errors.Wrap(err, cerr.Error()) - } else { - err = cerr - } - } - }() - - encoder := gob.NewEncoder(file) - err = encoder.Encode(*session) - if err != nil { - return err - } - - return nil -} +func (s *Service) LoginWithQRCode() error { return nil } // AddReceivers takes WhatsApp contacts and adds them to the internal contacts list. The Send method will send // a given message to all those contacts. -func (s *Service) AddReceivers(contacts ...string) { - s.contacts = append(s.contacts, contacts...) -} +func (s *Service) AddReceivers(_ ...string) {} // Send takes a message subject and a message body and sends them to all previously set contacts. -func (s *Service) Send(ctx context.Context, subject, message string) error { - msg := whatsapp.TextMessage{ - Text: subject + "\n" + message, - } - - for _, contact := range s.contacts { - select { - case <-ctx.Done(): - return ctx.Err() - default: - msg.Info = whatsapp.MessageInfo{ - RemoteJid: contact + "@s.whatsapp.net", - } - - _, err := s.client.Send(msg) - if err != nil { - return errors.Wrapf(err, "failed to send message to WhatsApp contact '%s'", contact) - } - } - } - - return nil -} +func (s *Service) Send(_ context.Context, _, _ string) error { return nil } diff --git a/service/whatsapp/whatsapp_test.go b/service/whatsapp/whatsapp_test.go deleted file mode 100644 index b255b904..00000000 --- a/service/whatsapp/whatsapp_test.go +++ /dev/null @@ -1,79 +0,0 @@ -package whatsapp - -import ( - "context" - "testing" - - "github.com/Rhymen/go-whatsapp" - "github.com/pkg/errors" - "github.com/stretchr/testify/require" -) - -func TestWhatsApp_New(t *testing.T) { - t.Parallel() - - assert := require.New(t) - - service, err := New() - assert.NotNil(service) - assert.Nil(err) -} - -func TestWhatsApp_AddReceivers(t *testing.T) { - t.Parallel() - - assert := require.New(t) - - svc := &Service{ - contacts: []string{}, - } - contacts := []string{"Contact1", "Contact2", "Contact3"} - svc.AddReceivers(contacts...) - - assert.Equal(svc.contacts, contacts) -} - -func TestWhatsApp_Send(t *testing.T) { - t.Parallel() - - assert := require.New(t) - - svc := &Service{ - contacts: []string{}, - } - - // test whatsapp client returning error - mockClient := new(mockWhatsappClient) - mockClient.On("Send", whatsapp.TextMessage{ - Info: whatsapp.MessageInfo{ - RemoteJid: "Contact1@s.whatsapp.net", - }, - Text: "subject\nmessage", - }).Return("", errors.New("some error")) - svc.client = mockClient - svc.AddReceivers("Contact1") - ctx := context.Background() - err := svc.Send(ctx, "subject", "message") - assert.NotNil(err) - mockClient.AssertExpectations(t) - - // test success and multiple receivers - mockClient = new(mockWhatsappClient) - mockClient.On("Send", whatsapp.TextMessage{ - Info: whatsapp.MessageInfo{ - RemoteJid: "Contact1@s.whatsapp.net", - }, - Text: "subject\nmessage", - }).Return("", nil) - mockClient.On("Send", whatsapp.TextMessage{ - Info: whatsapp.MessageInfo{ - RemoteJid: "Contact2@s.whatsapp.net", - }, - Text: "subject\nmessage", - }).Return("", nil) - svc.client = mockClient - svc.AddReceivers("Contact1", "Contact2") - err = svc.Send(ctx, "subject", "message") - assert.Nil(err) - mockClient.AssertExpectations(t) -}