Skip to content

Commit

Permalink
adding support for sending media messages
Browse files Browse the repository at this point in the history
  • Loading branch information
abansal88 committed Mar 30, 2020
1 parent f8151c7 commit 1593667
Show file tree
Hide file tree
Showing 6 changed files with 285 additions and 87 deletions.
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
# go-whatsapp-client
# go-whatsapp-cli
This repo builds over Rhymen/go-whatsapp to provide a cli for whatsapp.

# Downloading
go get github.com/abansal4032/go-whatsapp-cli

# Building
The Makefile consists of rules to help you build the project.

Expand All @@ -22,6 +25,7 @@ Make sure you make the changes in the Makefile if you are using go 1.13. The cur
Current commands installed:\
**1. whatsapp-cli login**: Logs you in\
**2. whatsapp-cli logout**: Logs you out\
**3. whatsapp-cli sendText --to <phone_number> --text <text_message>**: Sends the text_message to the phone_number
**3. whatsapp-cli sendText --to <phone_number> --text <text_message>**: Sends the text_message to the phone_number\
**4. whatsapp-cli sendMedia --to <phone_number> --text <text_message> --filepath <file_path>**: Sends the file contents to the uphone_number. Currently supports sending audio, video and images.\

**NOTE** : More coming soon...
65 changes: 0 additions & 65 deletions executors/message_manager.go

This file was deleted.

152 changes: 152 additions & 0 deletions executors/send_message_manager.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
package executors

import (
"fmt"
"github.com/abansal4032/go-whatsapp-cli/utils"
"os"
"strings"
"time"

"github.com/Rhymen/go-whatsapp"
)

// SendMessage sends the provided message to the recipient.
func SendMessage(args interface{}, msgType string) error {
msg, err := composeMessage(args, msgType)
if err != nil {
return fmt.Errorf("error while composing message: %v\n", err)
}
return sendMessage(msg)
}

func composeMessage(msgMetadata interface{}, msgType string) (interface{}, error) {
switch msgType {
case utils.TEXTMESSAGEKEY:
return textMessage(msgMetadata)
case utils.IMAGEMESSAGEKEY:
return imageMessage(msgMetadata)
case utils.VIDEOMESSAGEKEY:
return videoMessage(msgMetadata)
case utils.AUDIOMESSAGEKEY:
return audioMessage(msgMetadata)
case utils.MEDIAMESSAGEKEY:
return mediaMessage(msgMetadata)
default:
return nil, fmt.Errorf("unknown message type : %v\n feel free to raise an issue on the github repo with the desired message type to send", msgType)
}
}

func textMessage(msgMetadata interface{}) (interface{}, error) {
sendTextArgs, ok := msgMetadata.(*utils.SendTextArgs)
if !ok {
return nil, fmt.Errorf("cannot read args for text message")
}
text := sendTextArgs.Content() + utils.MESSAGEFOOTER
receiver := sendTextArgs.Receiver()
msg := whatsapp.TextMessage{
Info: whatsapp.MessageInfo{
RemoteJid: receiver + utils.CONTACTSUFFIX,
},
Text: text,
}
return msg, nil
}

func videoMessage(msgMetadata interface{}) (interface{}, error) {
sendMediaArgs, ok := msgMetadata.(*utils.SendMediaArgs)
if !ok {
return nil, fmt.Errorf("cannot read args for media message")
}
text := sendMediaArgs.Content() + utils.MESSAGEFOOTER
receiver := sendMediaArgs.Receiver()
contentType := sendMediaArgs.ContentType()
media, _ := os.Open(sendMediaArgs.Filepath())
msg := whatsapp.VideoMessage{
Info: whatsapp.MessageInfo{
RemoteJid: receiver + utils.CONTACTSUFFIX,
},
Type: contentType,
Caption: text,
Content: media,
}
return msg, nil
}

func imageMessage(msgMetadata interface{}) (interface{}, error) {
sendMediaArgs, ok := msgMetadata.(*utils.SendMediaArgs)
if !ok {
return nil, fmt.Errorf("cannot read args for media message")
}
text := sendMediaArgs.Content() + utils.MESSAGEFOOTER
receiver := sendMediaArgs.Receiver()
contentType := sendMediaArgs.ContentType()
media, _ := os.Open(sendMediaArgs.Filepath())
msg := whatsapp.ImageMessage{
Info: whatsapp.MessageInfo{
RemoteJid: receiver + utils.CONTACTSUFFIX,
},
Type: contentType,
Caption: text,
Content: media,
}
return msg, nil
}

func audioMessage(msgMetadata interface{}) (interface{}, error) {
sendMediaArgs, ok := msgMetadata.(*utils.SendMediaArgs)
if !ok {
return nil, fmt.Errorf("cannot read args for media message")
}
receiver := sendMediaArgs.Receiver()
contentType := sendMediaArgs.ContentType()
media, _ := os.Open(sendMediaArgs.Filepath())
msg := whatsapp.AudioMessage{
Info: whatsapp.MessageInfo{
RemoteJid: receiver + utils.CONTACTSUFFIX,
},
Type: contentType,
Content: media,
}
return msg, nil
}

func mediaMessage(msgMetadata interface{}) (interface{}, error) {
sendMediaArgs, ok := msgMetadata.(*utils.SendMediaArgs)
if !ok {
return nil, fmt.Errorf("cannot read args for media message")
}
contentType := sendMediaArgs.ContentType()
t := strings.Split(contentType, "/")[0]
switch t {
case "image":
return imageMessage(msgMetadata)
case "video":
return videoMessage(msgMetadata)
case "audio":
return audioMessage(msgMetadata)
default:
return nil, fmt.Errorf("unknown content type : %v\n feel free to raise an issue with the content type on the github repo", contentType)
}
}

func sendMessage(msg interface{}) error {
wac, err := whatsapp.NewConn(5 * time.Second)
if err != nil {
return fmt.Errorf("error creating connection: %v\n", err)
}

err = LoginWithConnection(wac)
if err != nil {
return fmt.Errorf("error logging in: %v\n", err)
}

<-time.After(3 * time.Second)

msgID, err := wac.Send(msg)
if err != nil {
return fmt.Errorf("error sending message: %v", err)
}

fmt.Printf("successfully sent, messaageID : %v\n", msgID)
return nil
}
16 changes: 14 additions & 2 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ func errorHandler(err error) {
}

func main() {
sendTextCmd := flag.NewFlagSet("sendText", flag.ExitOnError)
var err error
defer func() {
errorHandler(err)
Expand All @@ -41,8 +40,9 @@ func main() {
}

case "sendText":
sendTextCmd := flag.NewFlagSet("sendText", flag.ExitOnError)
var args *utils.SendTextArgs
args, err = utils.ParseSendArgs(sendTextCmd, os.Args[2:])
args, err = utils.ParseSendTextArgs(sendTextCmd, os.Args[2:])
if err != nil {
commandUsage(err, sendTextCmd)
return
Expand All @@ -51,6 +51,18 @@ func main() {
return
}

case "sendMedia":
sendMediaCmd := flag.NewFlagSet("sendMedia", flag.ExitOnError)
var args *utils.SendMediaArgs
args, err = utils.ParseSendMediaArgs(sendMediaCmd, os.Args[2:])
if err != nil {
commandUsage(err, sendMediaCmd)
return
}
if err = executors.SendMessage(args, utils.MEDIAMESSAGEKEY); err != nil {
return
}

default:
// TODO : add a list of all permitted actions
err = fmt.Errorf("wrong command provided. please see below for the list of permitted actions")
Expand Down
6 changes: 6 additions & 0 deletions utils/keys.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@ const IMAGEMESSAGEKEY = "ImageMessage"
// VIDEOMESSAGEKEY identifies a message of video type.
const VIDEOMESSAGEKEY = "VideoMessage"

// AUDIOMESSAGEKEY identifies a message of audio type.
const AUDIOMESSAGEKEY = "AudioMessage"

// MEDIAMESSAGEKEY identifies a message of media type.
const MEDIAMESSAGEKEY = "MediaMessage"

// MESSAGEFOOTER is the identifier added to every message to distinguish the messages sent using CLI.
const MESSAGEFOOTER = "\n sent using github.com/abansal4032/go-whatsapp-client"

Expand Down
Loading

0 comments on commit 1593667

Please sign in to comment.