Skip to content

Commit 9c5b6f1

Browse files
committed
feat(whatsapp): add notifications for view once messages
1 parent 73c4a1c commit 9c5b6f1

File tree

1 file changed

+113
-0
lines changed

1 file changed

+113
-0
lines changed

whatsapp/handlers.go

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ func WhatsAppEventHandler(evt interface{}) {
5454
case *events.CallOffer:
5555
CallOfferEventHandler(v)
5656

57+
case *events.UndecryptableMessage:
58+
UndecryptableMessageEventHandler(v)
59+
5760
case *events.Message:
5861

5962
isEdited := false
@@ -1271,6 +1274,116 @@ func MessageFromOthersEventHandler(text string, v *events.Message, isEdited bool
12711274
}
12721275
}
12731276

1277+
func UndecryptableMessageEventHandler(v *events.UndecryptableMessage) {
1278+
var (
1279+
cfg = state.State.Config
1280+
logger = state.State.Logger
1281+
tgBot = state.State.TelegramBot
1282+
msgId = v.Info.ID
1283+
)
1284+
defer logger.Sync()
1285+
1286+
if v.UnavailableType != events.UnavailableTypeViewOnce {
1287+
return
1288+
} else if slices.Contains(cfg.WhatsApp.IgnoreChats, v.Info.Chat.User) {
1289+
logger.Debug("returning because message from an ignored chat",
1290+
zap.String("event_id", v.Info.ID),
1291+
zap.String("chat_jid", v.Info.Chat.String()),
1292+
)
1293+
return
1294+
}
1295+
1296+
var bridgedText string
1297+
if cfg.WhatsApp.SkipChatDetails {
1298+
logger.Debug("skipping to add chat details as configured",
1299+
zap.String("event_id", v.Info.ID),
1300+
)
1301+
if v.Info.IsIncomingBroadcast() {
1302+
bridgedText += "👥: <b>(Broadcast)</b>\n"
1303+
} else if v.Info.IsFromMe {
1304+
bridgedText += "🧑: <b>You [other device]</b>\n"
1305+
} else if v.Info.IsGroup {
1306+
bridgedText += fmt.Sprintf("🧑: <b>%s</b>\n", html.EscapeString(utils.WaGetContactName(v.Info.MessageSource.Sender)))
1307+
}
1308+
1309+
} else {
1310+
1311+
if v.Info.IsFromMe {
1312+
bridgedText += "🧑: <b>You [other device]</b>\n"
1313+
} else {
1314+
bridgedText += fmt.Sprintf("🧑: <b>%s</b>\n", html.EscapeString(utils.WaGetContactName(v.Info.MessageSource.Sender)))
1315+
}
1316+
if v.Info.IsIncomingBroadcast() {
1317+
bridgedText += "👥: <b>(Broadcast)</b>\n"
1318+
} else if v.Info.IsGroup {
1319+
bridgedText += fmt.Sprintf("👥: <b>%s</b>\n", html.EscapeString(utils.WaGetGroupName(v.Info.Chat)))
1320+
} else {
1321+
bridgedText += "👥: <b>(PVT)</b>\n"
1322+
}
1323+
1324+
}
1325+
1326+
if time.Since(v.Info.Timestamp).Seconds() > 60 {
1327+
bridgedText += fmt.Sprintf("🕛: <b>%s</b>\n",
1328+
html.EscapeString(v.Info.Timestamp.In(state.State.LocalLocation).Format(cfg.TimeFormat)))
1329+
}
1330+
1331+
bridgedText += "\n<i>It is a View Once message.\nPlease check in your official WhatsApp application</i>"
1332+
1333+
var threadId int64
1334+
1335+
var err error
1336+
if v.Info.Chat.String() == "status@broadcast" {
1337+
threadId, err = utils.TgGetOrMakeThreadFromWa("status@broadcast", cfg.Telegram.TargetChatID,
1338+
"Status")
1339+
if err != nil {
1340+
utils.TgSendErrorById(tgBot, cfg.Telegram.TargetChatID, 0, "failed to create/find thread id for 'status@broadcast'", err)
1341+
return
1342+
}
1343+
} else if v.Info.IsIncomingBroadcast() {
1344+
threadId, err = utils.TgGetOrMakeThreadFromWa(v.Info.MessageSource.Sender.ToNonAD().String(), cfg.Telegram.TargetChatID,
1345+
utils.WaGetContactName(v.Info.MessageSource.Sender))
1346+
if err != nil {
1347+
utils.TgSendErrorById(tgBot, cfg.Telegram.TargetChatID, 0, fmt.Sprintf("failed to create/find thread id for '%s'",
1348+
v.Info.MessageSource.Sender.ToNonAD().String()), err)
1349+
return
1350+
}
1351+
} else if v.Info.IsGroup {
1352+
threadId, err = utils.TgGetOrMakeThreadFromWa(v.Info.Chat.String(), cfg.Telegram.TargetChatID,
1353+
utils.WaGetGroupName(v.Info.Chat))
1354+
if err != nil {
1355+
utils.TgSendErrorById(tgBot, cfg.Telegram.TargetChatID, 0, fmt.Sprintf("failed to create/find thread id for '%s'",
1356+
v.Info.Chat.String()), err)
1357+
return
1358+
}
1359+
} else {
1360+
var target_chat_jid waTypes.JID
1361+
if v.Info.IsFromMe {
1362+
target_chat_jid = v.Info.Chat
1363+
} else {
1364+
target_chat_jid = v.Info.Chat
1365+
}
1366+
1367+
threadId, err = utils.TgGetOrMakeThreadFromWa(target_chat_jid.ToNonAD().String(), cfg.Telegram.TargetChatID, utils.WaGetContactName(target_chat_jid))
1368+
if err != nil {
1369+
utils.TgSendErrorById(tgBot, cfg.Telegram.TargetChatID, 0, fmt.Sprintf("failed to create/find thread id for '%s'",
1370+
target_chat_jid.ToNonAD().String()), err)
1371+
return
1372+
}
1373+
}
1374+
1375+
sentMsg, err := tgBot.SendMessage(cfg.Telegram.TargetChatID, bridgedText, &gotgbot.SendMessageOpts{
1376+
MessageThreadId: threadId,
1377+
})
1378+
if err != nil {
1379+
panic(fmt.Errorf("failed to send telegram message: %s", err))
1380+
}
1381+
if sentMsg.MessageId != 0 {
1382+
database.MsgIdAddNewPair(msgId, v.Info.MessageSource.Sender.String(), v.Info.Chat.String(),
1383+
cfg.Telegram.TargetChatID, sentMsg.MessageId, sentMsg.MessageThreadId)
1384+
}
1385+
}
1386+
12741387
func CallOfferEventHandler(v *events.CallOffer) {
12751388
var (
12761389
cfg = state.State.Config

0 commit comments

Comments
 (0)