You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

192 lines
5.1 KiB

package services
import (
"context"
"errors"
"fmt"
domainUser "github.com/aldinokemal/go-whatsapp-web-multidevice/domains/user"
pkgError "github.com/aldinokemal/go-whatsapp-web-multidevice/pkg/error"
"github.com/aldinokemal/go-whatsapp-web-multidevice/pkg/whatsapp"
"github.com/aldinokemal/go-whatsapp-web-multidevice/validations"
"go.mau.fi/whatsmeow"
"go.mau.fi/whatsmeow/types"
"time"
)
type userService struct {
WaCli *whatsmeow.Client
}
func NewUserService(waCli *whatsmeow.Client) domainUser.IUserService {
return &userService{
WaCli: waCli,
}
}
func (service userService) Info(ctx context.Context, request domainUser.InfoRequest) (response domainUser.InfoResponse, err error) {
err = validations.ValidateUserInfo(ctx, request)
if err != nil {
return response, err
}
var jids []types.JID
dataWaRecipient, err := whatsapp.ValidateJidWithLogin(service.WaCli, request.Phone)
if err != nil {
return response, err
}
jids = append(jids, dataWaRecipient)
resp, err := service.WaCli.GetUserInfo(jids)
if err != nil {
return response, err
}
for _, userInfo := range resp {
var device []domainUser.InfoResponseDataDevice
for _, j := range userInfo.Devices {
device = append(device, domainUser.InfoResponseDataDevice{
User: j.User,
Agent: j.RawAgent,
Device: whatsapp.GetPlatformName(int(j.Device)),
Server: j.Server,
AD: j.ADString(),
})
}
data := domainUser.InfoResponseData{
Status: userInfo.Status,
PictureID: userInfo.PictureID,
Devices: device,
}
if userInfo.VerifiedName != nil {
data.VerifiedName = fmt.Sprintf("%v", *userInfo.VerifiedName)
}
response.Data = append(response.Data, data)
}
return response, nil
}
func (service userService) Check(ctx context.Context, request domainUser.CheckRequest) (response domainUser.CheckResponse, err error) {
err = validations.ValidateUserCheck(ctx, request)
if err != nil {
return response, err
}
var jids []types.JID
dataWaRecipient, err := whatsapp.ValidateJidWithLogin(service.WaCli, request.Phone)
if err != nil {
return response, err
}
jids = append(jids, dataWaRecipient)
resp, err := service.WaCli.IsOnWhatsApp([]string{request.Phone})
if err != nil {
return response, err
}
uc := new(domainUser.UserCollection)
for _, item := range resp {
if item.VerifiedName != nil {
var msg = domainUser.CheckResponseData{Query: item.Query, IsInWhatsapp: item.IsIn, JID: fmt.Sprintf("%s", item.JID), VerifiedName: item.VerifiedName.Details.GetVerifiedName()}
uc.Users = append(uc.Users, msg)
} else {
var msg = domainUser.CheckResponseData{Query: item.Query, IsInWhatsapp: item.IsIn, JID: fmt.Sprintf("%s", item.JID), VerifiedName: ""}
uc.Users = append(uc.Users, msg)
}
}
response.Data = append(response.Data, uc.Users[0])
// response := string(responseJson)
return response, err
}
func (service userService) Avatar(ctx context.Context, request domainUser.AvatarRequest) (response domainUser.AvatarResponse, err error) {
chanResp := make(chan domainUser.AvatarResponse)
chanErr := make(chan error)
waktu := time.Now()
go func() {
err = validations.ValidateUserAvatar(ctx, request)
if err != nil {
chanErr <- err
}
dataWaRecipient, err := whatsapp.ValidateJidWithLogin(service.WaCli, request.Phone)
if err != nil {
chanErr <- err
}
pic, err := service.WaCli.GetProfilePictureInfo(dataWaRecipient, &whatsmeow.GetProfilePictureParams{
Preview: request.IsPreview,
IsCommunity: request.IsCommunity,
})
if err != nil {
chanErr <- err
} else if pic == nil {
chanErr <- errors.New("no avatar found")
} else {
response.URL = pic.URL
response.ID = pic.ID
response.Type = pic.Type
chanResp <- response
}
}()
for {
select {
case err := <-chanErr:
return response, err
case response := <-chanResp:
return response, nil
default:
if waktu.Add(2 * time.Second).Before(time.Now()) {
return response, pkgError.ContextError("Error timeout get avatar !")
}
}
}
}
func (service userService) MyListGroups(_ context.Context) (response domainUser.MyListGroupsResponse, err error) {
whatsapp.MustLogin(service.WaCli)
groups, err := service.WaCli.GetJoinedGroups()
if err != nil {
return
}
fmt.Printf("%+v\n", groups)
for _, group := range groups {
response.Data = append(response.Data, *group)
}
return response, nil
}
func (service userService) MyListNewsletter(_ context.Context) (response domainUser.MyListNewsletterResponse, err error) {
whatsapp.MustLogin(service.WaCli)
datas, err := service.WaCli.GetSubscribedNewsletters()
if err != nil {
return
}
fmt.Printf("%+v\n", datas)
for _, data := range datas {
response.Data = append(response.Data, *data)
}
return response, nil
}
func (service userService) MyPrivacySetting(_ context.Context) (response domainUser.MyPrivacySettingResponse, err error) {
whatsapp.MustLogin(service.WaCli)
resp, err := service.WaCli.TryFetchPrivacySettings(true)
if err != nil {
return
}
response.GroupAdd = string(resp.GroupAdd)
response.Status = string(resp.Status)
response.ReadReceipts = string(resp.ReadReceipts)
response.Profile = string(resp.Profile)
return response, nil
}