Skip to content

Commit

Permalink
adding session management with login and logout capabilities
Browse files Browse the repository at this point in the history
  • Loading branch information
abansal88 committed Mar 29, 2020
1 parent 64d22c1 commit dcc0170
Show file tree
Hide file tree
Showing 4 changed files with 162 additions and 15 deletions.
6 changes: 6 additions & 0 deletions executors/message_manager.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package executors

// SendText sends the provided text message to the receipient.
func SendText(text, reciever string) error {
return nil
}
85 changes: 85 additions & 0 deletions executors/session_manager.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package executors

import (
"encoding/gob"
"fmt"
"os"
"time"

qrcodeTerminal "github.com/Baozisoftware/qrcode-terminal-go"
"github.com/Rhymen/go-whatsapp"
)

// Login logs in the user. It ries to see if a session already exists. If not, tries to create a
// new one using qr scanned on the terminal.
func Login() error {
wac, err := whatsapp.NewConn(5 * time.Second)
if err != nil {
return fmt.Errorf("error while logging in %v\n", err)
}
//load saved session
session, err := readSession()
if err == nil {
//restore session
session, err = wac.RestoreWithSession(session)
if err != nil {
return fmt.Errorf("restoring failed: %v\n", err)
}
} else {
//no saved session -> regular login
qr := make(chan string)
go func() {
terminal := qrcodeTerminal.New()
terminal.Get(<-qr).Print()
}()
session, err = wac.Login(qr)
if err != nil {
return fmt.Errorf("error during login: %v\n", err)
}
}

//save session
err = writeSession(session)
if err != nil {
return fmt.Errorf("error saving session: %v\n", err)
}
return nil
}

// Logout logs out the user.
func Logout() error {
return removeSession()
}

func readSession() (whatsapp.Session, error) {
session := whatsapp.Session{}
file, err := os.Open(os.TempDir() + "/whatsappCLISession.gob")
if err != nil {
return session, err
}
defer file.Close()
decoder := gob.NewDecoder(file)
err = decoder.Decode(&session)
if err != nil {
return session, err
}
return session, nil
}

func writeSession(session whatsapp.Session) error {
file, err := os.Create(os.TempDir() + "/whatsappCLISession.gob")
if err != nil {
return err
}
defer file.Close()
encoder := gob.NewEncoder(file)
err = encoder.Encode(session)
if err != nil {
return err
}
return nil
}

func removeSession() error {
return os.Remove(os.TempDir() + "/whatsappCLISession.gob")
}
61 changes: 46 additions & 15 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,58 @@ package main

import (
"fmt"
"github.com/Baozisoftware/qrcode-terminal-go"
"github.com/Rhymen/go-whatsapp"
"flag"
"os"
"time"

"github.com/abansal4032/go-whatsapp-cli/executors"
"github.com/abansal4032/go-whatsapp-cli/utils"
)

func main() {
wac, err := whatsapp.NewConn(5 * time.Second)
func commandUsage(err error) {
// TODO : graceful error handling here
if err != nil {
panic(err)
fmt.Println("correct command usage is described below:")
flag.PrintDefaults()
}
}

qr := make(chan string)
go func() {
terminal := qrcodeTerminal.New()
terminal.Get(<-qr).Print()
func main() {
sendTextCmd := flag.NewFlagSet("sendText", flag.ExitOnError)
var err error
defer func() {
commandUsage(err)
}()

session, err := wac.Login(qr)
if err != nil {
fmt.Fprintf(os.Stderr, "error during login: %v\n", err)
switch os.Args[1] {

case "login":
if err = executors.Login(); err != nil {
fmt.Println(err)
return
}

case "logout":
if err = executors.Logout(); err != nil {
fmt.Println(err)
return
}

case "sendText":
//var args *utils.SendArgs
_, err = utils.ParseSendArgs(sendTextCmd, os.Args[2:])
if err != nil {
fmt.Println(err)
return
}
/*if err = executors.SendText(args); err != nil {
fmt.Println(err)
return
}*/

default:
fmt.Println("wrong command provided. please see below for the list of permitted actions")
flag.PrintDefaults()
return

}
fmt.Printf("login successful, session: %v\n", session)
}
}
25 changes: 25 additions & 0 deletions utils/models.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package utils

import (
"flag"
"fmt"
)

type SendArgs struct {
to string
}

func ParseSendArgs(f *flag.FlagSet, args []string) (*SendArgs, error) {
to := f.String("to", "", "the receipient of the message.")
if err := f.Parse(args); err != nil {
return nil, err
}
// checks for mandatory fields
if *to == "" {
return nil, fmt.Errorf("wrong arguments provided")
}
sendArgs := &SendArgs{
to: *to,
}
return sendArgs, nil
}

0 comments on commit dcc0170

Please sign in to comment.