summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/Rhymen/go-whatsapp/message.go
diff options
context:
space:
mode:
authorWim <wim@42.be>2020-08-24 23:35:08 +0200
committerGitHub <noreply@github.com>2020-08-24 23:35:08 +0200
commit2f506425c25504662f50f49e742529195d63ff27 (patch)
tree47170c6086cee16549a695329a478fd49174c299 /vendor/github.com/Rhymen/go-whatsapp/message.go
parente8167ee3d73c47353eea1b0bd7062bd2fc3fc127 (diff)
downloadmatterbridge-msglm-2f506425c25504662f50f49e742529195d63ff27.tar.gz
matterbridge-msglm-2f506425c25504662f50f49e742529195d63ff27.tar.bz2
matterbridge-msglm-2f506425c25504662f50f49e742529195d63ff27.zip
Update whatsapp vendor and fix a panic (#1209)
* Fix another whatsapp panic * Update whatsapp vendor
Diffstat (limited to 'vendor/github.com/Rhymen/go-whatsapp/message.go')
-rw-r--r--vendor/github.com/Rhymen/go-whatsapp/message.go136
1 files changed, 135 insertions, 1 deletions
diff --git a/vendor/github.com/Rhymen/go-whatsapp/message.go b/vendor/github.com/Rhymen/go-whatsapp/message.go
index 77e7e1c3..d4bc0926 100644
--- a/vendor/github.com/Rhymen/go-whatsapp/message.go
+++ b/vendor/github.com/Rhymen/go-whatsapp/message.go
@@ -81,7 +81,7 @@ func (wac *Conn) Send(msg interface{}) (string, error) {
return "ERROR", fmt.Errorf("error decoding sending response: %v\n", err)
}
if int(resp["status"].(float64)) != 200 {
- return "ERROR", fmt.Errorf("message sending responded with %d", resp["status"])
+ return "ERROR", fmt.Errorf("message sending responded with %v", resp["status"])
}
if int(resp["status"].(float64)) == 200 {
return getMessageInfo(msgProto).Id, nil
@@ -105,6 +105,105 @@ func (wac *Conn) sendProto(p *proto.WebMessageInfo) (<-chan string, error) {
return wac.writeBinary(n, message, ignore, p.Key.GetId())
}
+// RevokeMessage revokes a message (marks as "message removed") for everyone
+func (wac *Conn) RevokeMessage(remotejid, msgid string, fromme bool) (revokeid string, err error) {
+ // create a revocation ID (required)
+ rawrevocationID := make([]byte, 10)
+ rand.Read(rawrevocationID)
+ revocationID := strings.ToUpper(hex.EncodeToString(rawrevocationID))
+ //
+ ts := uint64(time.Now().Unix())
+ status := proto.WebMessageInfo_PENDING
+ mtype := proto.ProtocolMessage_REVOKE
+
+ revoker := &proto.WebMessageInfo{
+ Key: &proto.MessageKey{
+ FromMe: &fromme,
+ Id: &revocationID,
+ RemoteJid: &remotejid,
+ },
+ MessageTimestamp: &ts,
+ Message: &proto.Message{
+ ProtocolMessage: &proto.ProtocolMessage{
+ Type: &mtype,
+ Key: &proto.MessageKey{
+ FromMe: &fromme,
+ Id: &msgid,
+ RemoteJid: &remotejid,
+ },
+ },
+ },
+ Status: &status,
+ }
+ if _, err := wac.Send(revoker); err != nil {
+ return revocationID, err
+ }
+ return revocationID, nil
+}
+
+// DeleteMessage deletes a single message for the user (removes the msgbox). To
+// delete the message for everyone, use RevokeMessage
+func (wac *Conn) DeleteMessage(remotejid, msgid string, fromMe bool) error {
+ ch, err := wac.deleteChatProto(remotejid, msgid, fromMe)
+ if err != nil {
+ return fmt.Errorf("could not send proto: %v", err)
+ }
+
+ select {
+ case response := <-ch:
+ var resp map[string]interface{}
+ if err = json.Unmarshal([]byte(response), &resp); err != nil {
+ return fmt.Errorf("error decoding deletion response: %v", err)
+ }
+ if int(resp["status"].(float64)) != 200 {
+ return fmt.Errorf("message deletion responded with %v", resp["status"])
+ }
+ if int(resp["status"].(float64)) == 200 {
+ return nil
+ }
+ case <-time.After(wac.msgTimeout):
+ return fmt.Errorf("deleting message timed out")
+ }
+
+ return nil
+}
+
+func (wac *Conn) deleteChatProto(remotejid, msgid string, fromMe bool) (<-chan string, error) {
+ tag := fmt.Sprintf("%s.--%d", wac.timeTag, wac.msgCount)
+
+ owner := "true"
+ if !fromMe {
+ owner = "false"
+ }
+ n := binary.Node{
+ Description: "action",
+ Attributes: map[string]string{
+ "epoch": strconv.Itoa(wac.msgCount),
+ "type": "set",
+ },
+ Content: []interface{}{
+ binary.Node{
+ Description: "chat",
+ Attributes: map[string]string{
+ "type": "clear",
+ "jid": remotejid,
+ "media": "true",
+ },
+ Content: []binary.Node{
+ {
+ Description: "item",
+ Attributes: map[string]string{
+ "owner": owner,
+ "index": msgid,
+ },
+ },
+ },
+ },
+ },
+ }
+ return wac.writeBinary(n, chat, expires|skipOffline, tag)
+}
+
func init() {
rand.Seed(time.Now().UTC().UnixNano())
}
@@ -744,3 +843,38 @@ func ParseProtoMessage(msg *proto.WebMessageInfo) interface{} {
return nil
}
+
+
+/*
+BatteryMessage represents a battery level and charging state.
+*/
+type BatteryMessage struct {
+ Plugged bool
+ Powersave bool
+ Percentage int
+}
+
+func getBatteryMessage(msg map[string]string) BatteryMessage {
+ plugged, _ := strconv.ParseBool(msg["live"])
+ powersave, _ := strconv.ParseBool(msg["powersave"])
+ percentage, _ := strconv.Atoi(msg["value"])
+ batteryMessage := BatteryMessage{
+ Plugged: plugged,
+ Powersave: powersave,
+ Percentage: percentage,
+ }
+
+ return batteryMessage
+}
+
+
+func ParseNodeMessage(msg binary.Node) interface{} {
+ switch msg.Description {
+ case "battery":
+ return getBatteryMessage(msg.Attributes)
+ default:
+ //cannot match message
+ }
+
+ return nil
+}