slidge-whatsapp 0.2.5__cp313-cp313-manylinux_2_36_aarch64.whl → 0.2.6__cp313-cp313-manylinux_2_36_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of slidge-whatsapp might be problematic. Click here for more details.

Files changed (320) hide show
  1. slidge_whatsapp/config.py +3 -0
  2. slidge_whatsapp/event.go +23 -24
  3. slidge_whatsapp/gateway.go +13 -9
  4. slidge_whatsapp/gateway.py +2 -2
  5. slidge_whatsapp/generated/_whatsapp.cpython-313-aarch64-linux-gnu.h +181 -181
  6. slidge_whatsapp/generated/_whatsapp.cpython-313-aarch64-linux-gnu.so +0 -0
  7. slidge_whatsapp/generated/build.py +155 -155
  8. slidge_whatsapp/generated/whatsapp.c +1507 -1507
  9. slidge_whatsapp/generated/whatsapp.go +907 -907
  10. slidge_whatsapp/generated/whatsapp.py +1318 -1318
  11. slidge_whatsapp/generated/whatsapp_go.h +181 -181
  12. slidge_whatsapp/go.mod +15 -12
  13. slidge_whatsapp/go.sum +41 -29
  14. slidge_whatsapp/media/media.go +16 -10
  15. slidge_whatsapp/session.go +73 -66
  16. slidge_whatsapp/vendor/github.com/ebitengine/purego/dlfcn.go +4 -4
  17. slidge_whatsapp/vendor/github.com/ebitengine/purego/dlfcn_darwin.go +0 -5
  18. slidge_whatsapp/vendor/github.com/ebitengine/purego/internal/fakecgo/go_libinit.go +3 -0
  19. slidge_whatsapp/vendor/github.com/ebitengine/purego/internal/fakecgo/symbols.go +40 -20
  20. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/CHANGELOG.md +14 -1
  21. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/ffi.go +2 -2
  22. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/fun.go +10 -2
  23. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/lib.go +1 -1
  24. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/lib_unix.go +1 -1
  25. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/lib_windows.go +1 -1
  26. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/README.md +2 -7
  27. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/callback.go +2 -1
  28. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.c +8510 -5090
  29. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.h +344 -150
  30. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3.go +57 -23
  31. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_unlock_notify.c +4 -0
  32. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_unlock_notify.go +4 -0
  33. slidge_whatsapp/vendor/github.com/petermattis/goid/.gitignore +4 -0
  34. slidge_whatsapp/vendor/github.com/petermattis/goid/LICENSE +202 -0
  35. slidge_whatsapp/vendor/github.com/petermattis/goid/README.md +4 -0
  36. slidge_whatsapp/vendor/github.com/petermattis/goid/goid.go +35 -0
  37. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_gccgo.go +26 -0
  38. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.3.c +23 -0
  39. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.3.go +22 -0
  40. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.4.go +35 -0
  41. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.4.s +18 -0
  42. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.5.go +28 -0
  43. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.5.s +44 -0
  44. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_slow.go +24 -0
  45. slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_gccgo_go1.8.go +17 -0
  46. slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.23.go +38 -0
  47. slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.5.go +57 -0
  48. slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.6.go +43 -0
  49. slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.9.go +37 -0
  50. slidge_whatsapp/vendor/github.com/rs/zerolog/CONTRIBUTING.md +43 -0
  51. slidge_whatsapp/vendor/github.com/rs/zerolog/README.md +31 -0
  52. slidge_whatsapp/vendor/github.com/rs/zerolog/console.go +20 -5
  53. slidge_whatsapp/vendor/github.com/rs/zerolog/log/log.go +131 -0
  54. slidge_whatsapp/vendor/github.com/rs/zerolog/log.go +1 -1
  55. slidge_whatsapp/vendor/github.com/rs/zerolog/sampler.go +4 -1
  56. slidge_whatsapp/vendor/github.com/rs/zerolog/writer.go +9 -0
  57. slidge_whatsapp/vendor/go.mau.fi/libsignal/groups/GroupCipher.go +17 -6
  58. slidge_whatsapp/vendor/go.mau.fi/libsignal/groups/GroupSessionBuilder.go +17 -7
  59. slidge_whatsapp/vendor/go.mau.fi/libsignal/groups/state/store/SenderKeyStore.go +4 -2
  60. slidge_whatsapp/vendor/go.mau.fi/libsignal/keys/chain/ChainKey.go +1 -0
  61. slidge_whatsapp/vendor/go.mau.fi/libsignal/keys/identity/IdentityKey.go +1 -0
  62. slidge_whatsapp/vendor/go.mau.fi/libsignal/logger/DefaultLogger.go +2 -2
  63. slidge_whatsapp/vendor/go.mau.fi/libsignal/serialize/FingerprintProtocol.pb.go +3 -2
  64. slidge_whatsapp/vendor/go.mau.fi/libsignal/serialize/LocalStorageProtocol.pb.go +3 -2
  65. slidge_whatsapp/vendor/go.mau.fi/libsignal/serialize/WhisperTextProtocol.pb.go +3 -2
  66. slidge_whatsapp/vendor/go.mau.fi/libsignal/session/Session.go +41 -17
  67. slidge_whatsapp/vendor/go.mau.fi/libsignal/session/SessionCipher.go +64 -30
  68. slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/IdentityKeyStore.go +5 -3
  69. slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/MessageKeyStore.go +6 -4
  70. slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/PreKeyStore.go +6 -4
  71. slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/SessionStore.go +8 -6
  72. slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/SignedPreKeyStore.go +7 -5
  73. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/connlog.go +257 -0
  74. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/database.go +309 -0
  75. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/iter.go +233 -0
  76. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/json.go +47 -0
  77. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/log.go +129 -0
  78. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/massinsert.go +164 -0
  79. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/queryhelper.go +137 -0
  80. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/reflectscan.go +30 -0
  81. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/transaction.go +180 -0
  82. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/upgrades.go +250 -0
  83. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/upgradetable.go +331 -0
  84. slidge_whatsapp/vendor/go.mau.fi/util/exerrors/dualerror.go +33 -0
  85. slidge_whatsapp/vendor/go.mau.fi/util/exerrors/must.go +23 -0
  86. slidge_whatsapp/vendor/go.mau.fi/util/exhttp/cors.go +32 -0
  87. slidge_whatsapp/vendor/go.mau.fi/util/exhttp/handleerrors.go +64 -0
  88. slidge_whatsapp/vendor/go.mau.fi/util/exhttp/json.go +41 -0
  89. slidge_whatsapp/vendor/go.mau.fi/util/exhttp/middleware.go +30 -0
  90. slidge_whatsapp/vendor/go.mau.fi/util/exhttp/networkerror.go +37 -0
  91. slidge_whatsapp/vendor/go.mau.fi/util/exsync/event.go +88 -0
  92. slidge_whatsapp/vendor/go.mau.fi/util/exsync/returnonce.go +25 -0
  93. slidge_whatsapp/vendor/go.mau.fi/util/exsync/ringbuffer.go +139 -0
  94. slidge_whatsapp/vendor/go.mau.fi/util/exsync/syncmap.go +94 -0
  95. slidge_whatsapp/vendor/go.mau.fi/util/exsync/syncset.go +136 -0
  96. slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/callermarshal.go +28 -0
  97. slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/defaults.go +32 -0
  98. slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/generics.go +45 -0
  99. slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/writer.go +81 -0
  100. slidge_whatsapp/vendor/go.mau.fi/util/ptr/ptr.go +43 -0
  101. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/decode.go +27 -26
  102. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/encode.go +4 -3
  103. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/keys.go +5 -4
  104. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate.go +27 -25
  105. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/armadillomessage.go +3 -2
  106. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/broadcast.go +5 -4
  107. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/client.go +60 -15
  108. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/connectionevents.go +25 -9
  109. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/download-to-file.go +45 -19
  110. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/download.go +52 -28
  111. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/errors.go +1 -0
  112. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/group.go +59 -29
  113. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/internals.go +166 -146
  114. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/keepalive.go +2 -2
  115. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/mediaconn.go +5 -3
  116. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/mediaretry.go +2 -1
  117. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/message.go +270 -111
  118. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/msgsecret.go +118 -31
  119. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/notification.go +67 -36
  120. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/pair-code.go +7 -4
  121. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/pair.go +42 -18
  122. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/prekeys.go +9 -5
  123. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/presence.go +2 -1
  124. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/privacysettings.go +10 -11
  125. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waAdv/WAAdv.pb.go +39 -9
  126. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloApplication/WAArmadilloApplication.pb.go +354 -175
  127. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloApplication/WAArmadilloApplication.proto +5 -5
  128. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloXMA/WAArmadilloXMA.pb.go +158 -15
  129. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloXMA/WAArmadilloXMA.proto +1 -0
  130. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCert/WACert.pb.go +29 -9
  131. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waChatLockSettings/WAProtobufsChatLockSettings.pb.go +13 -9
  132. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCommon/WACommon.pb.go +344 -31
  133. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCommon/WACommon.proto +26 -0
  134. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/{WAWebProtobufsCompanionReg.pb.go → WACompanionReg.pb.go} +170 -84
  135. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/{WAWebProtobufsCompanionReg.proto → WACompanionReg.proto} +1 -1
  136. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waConsumerApplication/WAConsumerApplication.pb.go +173 -9
  137. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waDeviceCapabilities/WAProtobufsDeviceCapabilities.pb.go +78 -16
  138. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waDeviceCapabilities/WAProtobufsDeviceCapabilities.proto +5 -0
  139. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.pb.go +6747 -2230
  140. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.proto +294 -43
  141. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.pb.go +456 -135
  142. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.proto +14 -0
  143. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMediaTransport/WAMediaTransport.pb.go +162 -9
  144. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMediaTransport/WAMediaTransport.proto +1 -0
  145. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMmsRetry/WAMmsRetry.pb.go +32 -9
  146. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMmsRetry/WAMmsRetry.proto +1 -0
  147. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgApplication/WAMsgApplication.pb.go +192 -52
  148. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgApplication/WAMsgApplication.proto +8 -0
  149. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgTransport/WAMsgTransport.pb.go +60 -9
  150. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMultiDevice/WAMultiDevice.pb.go +39 -9
  151. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waServerSync/WAServerSync.pb.go +61 -9
  152. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.pb.go +1051 -382
  153. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.proto +32 -0
  154. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waUserPassword/WAProtobufsUserPassword.pb.go +27 -9
  155. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waVnameCert/WAWebProtobufsVnameCert.pb.go +59 -9
  156. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.pb.go +382 -78
  157. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.proto +8 -0
  158. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.pb.go +555 -9
  159. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.proto +2 -0
  160. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/receipt.go +13 -3
  161. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/retry.go +29 -19
  162. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/send.go +244 -73
  163. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/sendfb.go +27 -16
  164. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/clientpayload.go +3 -1
  165. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/noop.go +85 -43
  166. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/signal.go +75 -88
  167. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/container.go +79 -61
  168. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/lidmap.go +186 -0
  169. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/store.go +291 -167
  170. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/00-latest-schema.sql +153 -0
  171. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/03-message-secrets.sql +11 -0
  172. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/04-privacy-tokens.sql +8 -0
  173. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/05-account-jid-format.sql +2 -0
  174. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/06-facebook-uuid.sql +2 -0
  175. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/07-account-lid.sql +2 -0
  176. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/08-lid-mapping.sql +5 -0
  177. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/09-decryption-buffer.sql +10 -0
  178. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/upgrades.go +22 -0
  179. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/store.go +105 -56
  180. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/botmap.go +210 -0
  181. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/events/events.go +8 -0
  182. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/group.go +15 -6
  183. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/jid.go +7 -8
  184. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/message.go +17 -0
  185. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/update.go +3 -2
  186. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/upload.go +1 -1
  187. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/user.go +45 -29
  188. slidge_whatsapp/vendor/golang.org/x/exp/LICENSE +27 -0
  189. slidge_whatsapp/vendor/golang.org/x/exp/PATENTS +22 -0
  190. slidge_whatsapp/vendor/golang.org/x/exp/constraints/constraints.go +54 -0
  191. slidge_whatsapp/vendor/golang.org/x/net/http/httpguts/guts.go +50 -0
  192. slidge_whatsapp/vendor/golang.org/x/net/http/httpguts/httplex.go +347 -0
  193. slidge_whatsapp/vendor/golang.org/x/net/http2/.gitignore +2 -0
  194. slidge_whatsapp/vendor/golang.org/x/net/http2/ascii.go +53 -0
  195. slidge_whatsapp/vendor/golang.org/x/net/http2/ciphers.go +641 -0
  196. slidge_whatsapp/vendor/golang.org/x/net/http2/client_conn_pool.go +311 -0
  197. slidge_whatsapp/vendor/golang.org/x/net/http2/config.go +122 -0
  198. slidge_whatsapp/vendor/golang.org/x/net/http2/config_go124.go +61 -0
  199. slidge_whatsapp/vendor/golang.org/x/net/http2/config_pre_go124.go +16 -0
  200. slidge_whatsapp/vendor/golang.org/x/net/http2/databuffer.go +149 -0
  201. slidge_whatsapp/vendor/golang.org/x/net/http2/errors.go +145 -0
  202. slidge_whatsapp/vendor/golang.org/x/net/http2/flow.go +120 -0
  203. slidge_whatsapp/vendor/golang.org/x/net/http2/frame.go +1702 -0
  204. slidge_whatsapp/vendor/golang.org/x/net/http2/gotrack.go +170 -0
  205. slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/encode.go +245 -0
  206. slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/hpack.go +523 -0
  207. slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/huffman.go +226 -0
  208. slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/static_table.go +188 -0
  209. slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/tables.go +403 -0
  210. slidge_whatsapp/vendor/golang.org/x/net/http2/http2.go +432 -0
  211. slidge_whatsapp/vendor/golang.org/x/net/http2/pipe.go +184 -0
  212. slidge_whatsapp/vendor/golang.org/x/net/http2/server.go +3350 -0
  213. slidge_whatsapp/vendor/golang.org/x/net/http2/timer.go +20 -0
  214. slidge_whatsapp/vendor/golang.org/x/net/http2/transport.go +3287 -0
  215. slidge_whatsapp/vendor/golang.org/x/net/http2/unencrypted.go +32 -0
  216. slidge_whatsapp/vendor/golang.org/x/net/http2/write.go +381 -0
  217. slidge_whatsapp/vendor/golang.org/x/net/http2/writesched.go +251 -0
  218. slidge_whatsapp/vendor/golang.org/x/net/http2/writesched_priority.go +451 -0
  219. slidge_whatsapp/vendor/golang.org/x/net/http2/writesched_random.go +77 -0
  220. slidge_whatsapp/vendor/golang.org/x/net/http2/writesched_roundrobin.go +119 -0
  221. slidge_whatsapp/vendor/golang.org/x/net/idna/go118.go +13 -0
  222. slidge_whatsapp/vendor/golang.org/x/net/idna/idna10.0.0.go +769 -0
  223. slidge_whatsapp/vendor/golang.org/x/net/idna/idna9.0.0.go +717 -0
  224. slidge_whatsapp/vendor/golang.org/x/net/idna/pre_go118.go +11 -0
  225. slidge_whatsapp/vendor/golang.org/x/net/idna/punycode.go +217 -0
  226. slidge_whatsapp/vendor/golang.org/x/net/idna/tables10.0.0.go +4559 -0
  227. slidge_whatsapp/vendor/golang.org/x/net/idna/tables11.0.0.go +4653 -0
  228. slidge_whatsapp/vendor/golang.org/x/net/idna/tables12.0.0.go +4733 -0
  229. slidge_whatsapp/vendor/golang.org/x/net/idna/tables13.0.0.go +4959 -0
  230. slidge_whatsapp/vendor/golang.org/x/net/idna/tables15.0.0.go +5144 -0
  231. slidge_whatsapp/vendor/golang.org/x/net/idna/tables9.0.0.go +4486 -0
  232. slidge_whatsapp/vendor/golang.org/x/net/idna/trie.go +51 -0
  233. slidge_whatsapp/vendor/golang.org/x/net/idna/trie12.0.0.go +30 -0
  234. slidge_whatsapp/vendor/golang.org/x/net/idna/trie13.0.0.go +30 -0
  235. slidge_whatsapp/vendor/golang.org/x/net/idna/trieval.go +119 -0
  236. slidge_whatsapp/vendor/golang.org/x/net/internal/httpcommon/ascii.go +53 -0
  237. slidge_whatsapp/vendor/golang.org/x/net/internal/httpcommon/headermap.go +115 -0
  238. slidge_whatsapp/vendor/golang.org/x/net/internal/httpcommon/request.go +467 -0
  239. slidge_whatsapp/vendor/golang.org/x/sys/unix/syscall_darwin.go +148 -1
  240. slidge_whatsapp/vendor/golang.org/x/sys/unix/syscall_linux.go +16 -26
  241. slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +84 -0
  242. slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s +20 -0
  243. slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +84 -0
  244. slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s +20 -0
  245. slidge_whatsapp/vendor/golang.org/x/sys/windows/security_windows.go +44 -5
  246. slidge_whatsapp/vendor/golang.org/x/sys/windows/syscall_windows.go +4 -2
  247. slidge_whatsapp/vendor/golang.org/x/sys/windows/types_windows.go +239 -0
  248. slidge_whatsapp/vendor/golang.org/x/sys/windows/zsyscall_windows.go +9 -0
  249. slidge_whatsapp/vendor/golang.org/x/text/LICENSE +27 -0
  250. slidge_whatsapp/vendor/golang.org/x/text/PATENTS +22 -0
  251. slidge_whatsapp/vendor/golang.org/x/text/secure/bidirule/bidirule.go +336 -0
  252. slidge_whatsapp/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go +11 -0
  253. slidge_whatsapp/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go +14 -0
  254. slidge_whatsapp/vendor/golang.org/x/text/transform/transform.go +709 -0
  255. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/bidi.go +359 -0
  256. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/bracket.go +335 -0
  257. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/core.go +1071 -0
  258. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/prop.go +206 -0
  259. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go +1815 -0
  260. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go +1887 -0
  261. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go +1923 -0
  262. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go +1955 -0
  263. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go +2042 -0
  264. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go +1781 -0
  265. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/trieval.go +48 -0
  266. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/composition.go +512 -0
  267. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/forminfo.go +279 -0
  268. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/input.go +109 -0
  269. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/iter.go +458 -0
  270. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/normalize.go +610 -0
  271. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/readwriter.go +125 -0
  272. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables10.0.0.go +7657 -0
  273. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables11.0.0.go +7693 -0
  274. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables12.0.0.go +7710 -0
  275. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go +7760 -0
  276. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go +7907 -0
  277. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables9.0.0.go +7637 -0
  278. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/transform.go +88 -0
  279. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/trie.go +54 -0
  280. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/editiondefaults/editions_defaults.binpb +0 -0
  281. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/filedesc/editions.go +3 -0
  282. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go +16 -0
  283. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/strs/{strings_unsafe_go121.go → strings_unsafe.go} +0 -2
  284. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/version/version.go +1 -1
  285. slidge_whatsapp/vendor/google.golang.org/protobuf/proto/merge.go +6 -0
  286. slidge_whatsapp/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go +2 -0
  287. slidge_whatsapp/vendor/google.golang.org/protobuf/reflect/protoreflect/{value_unsafe_go121.go → value_unsafe.go} +0 -2
  288. slidge_whatsapp/vendor/modules.txt +38 -13
  289. {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.6.dist-info}/METADATA +1 -1
  290. {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.6.dist-info}/RECORD +293 -180
  291. {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.6.dist-info}/WHEEL +1 -1
  292. slidge_whatsapp/vendor/github.com/rs/zerolog/CNAME +0 -1
  293. slidge_whatsapp/vendor/github.com/rs/zerolog/_config.yml +0 -1
  294. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waAdv/WAAdv.pb.raw +0 -0
  295. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloApplication/WAArmadilloApplication.pb.raw +0 -0
  296. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloXMA/WAArmadilloXMA.pb.raw +0 -0
  297. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCert/WACert.pb.raw +0 -23
  298. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waChatLockSettings/WAProtobufsChatLockSettings.pb.raw +0 -7
  299. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCommon/WACommon.pb.raw +0 -0
  300. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/WAWebProtobufsCompanionReg.pb.raw +0 -0
  301. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waConsumerApplication/WAConsumerApplication.pb.raw +0 -0
  302. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waDeviceCapabilities/WAProtobufsDeviceCapabilities.pb.raw +0 -0
  303. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.pb.raw +0 -0
  304. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.pb.raw +0 -0
  305. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMediaTransport/WAMediaTransport.pb.raw +0 -0
  306. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMmsRetry/WAMmsRetry.pb.raw +0 -0
  307. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgApplication/WAMsgApplication.pb.raw +0 -0
  308. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgTransport/WAMsgTransport.pb.raw +0 -0
  309. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMultiDevice/WAMultiDevice.pb.raw +0 -0
  310. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waServerSync/WAServerSync.pb.raw +0 -0
  311. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.pb.raw +0 -0
  312. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waUserPassword/WAProtobufsUserPassword.pb.raw +0 -0
  313. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waVnameCert/WAWebProtobufsVnameCert.pb.raw +0 -0
  314. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.pb.raw +0 -0
  315. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.pb.raw +0 -0
  316. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrade.go +0 -296
  317. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go120.go +0 -94
  318. slidge_whatsapp/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go120.go +0 -98
  319. {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.6.dist-info}/LICENSE +0 -0
  320. {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.6.dist-info}/entry_points.txt +0 -0
@@ -20,6 +20,7 @@ import (
20
20
  "time"
21
21
 
22
22
  "github.com/gorilla/websocket"
23
+ "go.mau.fi/util/exhttp"
23
24
  "go.mau.fi/util/random"
24
25
  "golang.org/x/net/proxy"
25
26
 
@@ -67,13 +68,16 @@ type Client struct {
67
68
  isLoggedIn atomic.Bool
68
69
  expectedDisconnect atomic.Bool
69
70
  EnableAutoReconnect bool
71
+ InitialAutoReconnect bool
70
72
  LastSuccessfulConnect time.Time
71
73
  AutoReconnectErrors int
72
74
  // AutoReconnectHook is called when auto-reconnection fails. If the function returns false,
73
75
  // the client will not attempt to reconnect. The number of retries can be read from AutoReconnectErrors.
74
76
  AutoReconnectHook func(error) bool
75
77
  // If SynchronousAck is set, acks for messages will only be sent after all event handlers return.
76
- SynchronousAck bool
78
+ SynchronousAck bool
79
+ EnableDecryptedEventBuffer bool
80
+ lastDecryptedBufferClear time.Time
77
81
 
78
82
  DisableLoginAutoReconnect bool
79
83
 
@@ -120,10 +124,10 @@ type Client struct {
120
124
 
121
125
  privacySettingsCache atomic.Value
122
126
 
123
- groupParticipantsCache map[types.JID][]types.JID
124
- groupParticipantsCacheLock sync.Mutex
125
- userDevicesCache map[types.JID]deviceCache
126
- userDevicesCacheLock sync.Mutex
127
+ groupCache map[types.JID]*groupMetaCache
128
+ groupCacheLock sync.Mutex
129
+ userDevicesCache map[types.JID]deviceCache
130
+ userDevicesCacheLock sync.Mutex
127
131
 
128
132
  recentMessagesMap map[recentMessageKey]RecentMessage
129
133
  recentMessagesList [recentMessagesSize]recentMessageKey
@@ -174,6 +178,12 @@ type Client struct {
174
178
  RefreshCAT func() error
175
179
  }
176
180
 
181
+ type groupMetaCache struct {
182
+ AddressingMode types.AddressingMode
183
+ CommunityAnnouncementGroup bool
184
+ Members []types.JID
185
+ }
186
+
177
187
  type MessengerConfig struct {
178
188
  UserAgent string
179
189
  BaseURL string
@@ -226,8 +236,8 @@ func NewClient(deviceStore *store.Device, log waLog.Logger) *Client {
226
236
 
227
237
  historySyncNotifications: make(chan *waE2E.HistorySyncNotification, 32),
228
238
 
229
- groupParticipantsCache: make(map[types.JID][]types.JID),
230
- userDevicesCache: make(map[types.JID]deviceCache),
239
+ groupCache: make(map[types.JID]*groupMetaCache),
240
+ userDevicesCache: make(map[types.JID]deviceCache),
231
241
 
232
242
  recentMessagesMap: make(map[recentMessageKey]RecentMessage, recentMessagesSize),
233
243
  sessionRecreateHistory: make(map[types.JID]time.Time),
@@ -378,11 +388,14 @@ func (cli *Client) getOwnID() types.JID {
378
388
  if cli == nil {
379
389
  return types.EmptyJID
380
390
  }
381
- id := cli.Store.ID
382
- if id == nil {
391
+ return cli.Store.GetJID()
392
+ }
393
+
394
+ func (cli *Client) getOwnLID() types.JID {
395
+ if cli == nil {
383
396
  return types.EmptyJID
384
397
  }
385
- return *id
398
+ return cli.Store.GetLID()
386
399
  }
387
400
 
388
401
  func (cli *Client) WaitForConnection(timeout time.Duration) bool {
@@ -412,6 +425,17 @@ func (cli *Client) SetWSDialer(dialer *websocket.Dialer) {
412
425
  // Connect connects the client to the WhatsApp web websocket. After connection, it will either
413
426
  // authenticate if there's data in the device store, or emit a QREvent to set up a new link.
414
427
  func (cli *Client) Connect() error {
428
+ err := cli.connect()
429
+ if exhttp.IsNetworkError(err) && cli.InitialAutoReconnect && cli.EnableAutoReconnect {
430
+ cli.Log.Errorf("Initial connection failed but reconnecting in background")
431
+ go cli.dispatchEvent(&events.Disconnected{})
432
+ go cli.autoReconnect()
433
+ return nil
434
+ }
435
+ return err
436
+ }
437
+
438
+ func (cli *Client) connect() error {
415
439
  if cli == nil {
416
440
  return ErrClientIsNil
417
441
  }
@@ -510,7 +534,7 @@ func (cli *Client) autoReconnect() {
510
534
  cli.Log.Debugf("Automatically reconnecting after %v", autoReconnectDelay)
511
535
  cli.AutoReconnectErrors++
512
536
  time.Sleep(autoReconnectDelay)
513
- err := cli.Connect()
537
+ err := cli.connect()
514
538
  if errors.Is(err, ErrAlreadyConnected) {
515
539
  cli.Log.Debugf("Connect() said we're already connected after autoreconnect sleep")
516
540
  return
@@ -568,7 +592,7 @@ func (cli *Client) unlockedDisconnect() {
568
592
  //
569
593
  // Note that this will not emit any events. The LoggedOut event is only used for external logouts
570
594
  // (triggered by the user from the main device or by WhatsApp servers).
571
- func (cli *Client) Logout() error {
595
+ func (cli *Client) Logout(ctx context.Context) error {
572
596
  if cli == nil {
573
597
  return ErrClientIsNil
574
598
  } else if cli.MessengerConfig != nil {
@@ -594,7 +618,7 @@ func (cli *Client) Logout() error {
594
618
  return fmt.Errorf("error sending logout request: %w", err)
595
619
  }
596
620
  cli.Disconnect()
597
- err = cli.Store.Delete()
621
+ err = cli.Store.Delete(ctx)
598
622
  if err != nil {
599
623
  return fmt.Errorf("error deleting data from store: %w", err)
600
624
  }
@@ -816,7 +840,7 @@ func (cli *Client) ParseWebMessage(chatJID types.JID, webMsg *waWeb.WebMessageIn
816
840
  IsFromMe: webMsg.GetKey().GetFromMe(),
817
841
  IsGroup: chatJID.Server == types.GroupServer,
818
842
  },
819
- ID: webMsg.GetKey().GetId(),
843
+ ID: webMsg.GetKey().GetID(),
820
844
  PushName: webMsg.GetPushName(),
821
845
  Timestamp: time.Unix(int64(webMsg.GetMessageTimestamp()), 0),
822
846
  }
@@ -825,7 +849,7 @@ func (cli *Client) ParseWebMessage(chatJID types.JID, webMsg *waWeb.WebMessageIn
825
849
  if info.Sender.IsEmpty() {
826
850
  return nil, ErrNotLoggedIn
827
851
  }
828
- } else if chatJID.Server == types.DefaultUserServer || chatJID.Server == types.NewsletterServer {
852
+ } else if chatJID.Server == types.DefaultUserServer || chatJID.Server == types.HiddenUserServer || chatJID.Server == types.NewsletterServer {
829
853
  info.Sender = chatJID
830
854
  } else if webMsg.GetParticipant() != "" {
831
855
  info.Sender, err = types.ParseJID(webMsg.GetParticipant())
@@ -837,6 +861,10 @@ func (cli *Client) ParseWebMessage(chatJID types.JID, webMsg *waWeb.WebMessageIn
837
861
  if err != nil {
838
862
  return nil, fmt.Errorf("failed to parse sender of message %s: %v", info.ID, err)
839
863
  }
864
+ if pk := webMsg.GetCommentMetadata().GetCommentParentKey(); pk != nil {
865
+ info.MsgMetaInfo.ThreadMessageID = pk.GetID()
866
+ info.MsgMetaInfo.ThreadMessageSenderJID, _ = types.ParseJID(pk.GetParticipant())
867
+ }
840
868
  evt := &events.Message{
841
869
  RawMessage: webMsg.GetMessage(),
842
870
  SourceWebMsg: webMsg,
@@ -849,3 +877,20 @@ func (cli *Client) ParseWebMessage(chatJID types.JID, webMsg *waWeb.WebMessageIn
849
877
  }
850
878
  return evt, nil
851
879
  }
880
+
881
+ func (cli *Client) StoreLIDPNMapping(ctx context.Context, first, second types.JID) {
882
+ var lid, pn types.JID
883
+ if first.Server == types.HiddenUserServer && second.Server == types.DefaultUserServer {
884
+ lid = first
885
+ pn = second
886
+ } else if first.Server == types.DefaultUserServer && second.Server == types.HiddenUserServer {
887
+ lid = second
888
+ pn = first
889
+ } else {
890
+ return
891
+ }
892
+ err := cli.Store.LIDs.PutLIDMapping(ctx, lid, pn)
893
+ if err != nil {
894
+ cli.Log.Errorf("Failed to store LID-PN mapping for %s -> %s: %v", lid, pn, err)
895
+ }
896
+ }
@@ -7,6 +7,7 @@
7
7
  package whatsmeow
8
8
 
9
9
  import (
10
+ "context"
10
11
  "time"
11
12
 
12
13
  waBinary "go.mau.fi/whatsmeow/binary"
@@ -16,6 +17,7 @@ import (
16
17
  )
17
18
 
18
19
  func (cli *Client) handleStreamError(node *waBinary.Node) {
20
+ ctx := context.TODO()
19
21
  cli.isLoggedIn.Store(false)
20
22
  cli.clearResponseWaiters(node)
21
23
  code, _ := node.Attrs["code"].(string)
@@ -31,7 +33,7 @@ func (cli *Client) handleStreamError(node *waBinary.Node) {
31
33
  cli.Log.Infof("Got 515 code, reconnecting...")
32
34
  go func() {
33
35
  cli.Disconnect()
34
- err := cli.Connect()
36
+ err := cli.connect()
35
37
  if err != nil {
36
38
  cli.Log.Errorf("Failed to reconnect after 515 code: %v", err)
37
39
  }
@@ -40,7 +42,7 @@ func (cli *Client) handleStreamError(node *waBinary.Node) {
40
42
  cli.expectDisconnect()
41
43
  cli.Log.Infof("Got device removed stream error, sending LoggedOut event and deleting session")
42
44
  go cli.dispatchEvent(&events.LoggedOut{OnConnect: false, Reason: events.ConnectFailureLoggedOut})
43
- err := cli.Store.Delete()
45
+ err := cli.Store.Delete(ctx)
44
46
  if err != nil {
45
47
  cli.Log.Warnf("Failed to delete store after device_removed error: %v", err)
46
48
  }
@@ -92,6 +94,7 @@ func (cli *Client) handleIB(node *waBinary.Node) {
92
94
  }
93
95
 
94
96
  func (cli *Client) handleConnectFailure(node *waBinary.Node) {
97
+ ctx := context.TODO()
95
98
  ag := node.AttrGetter()
96
99
  reason := events.ConnectFailureReason(ag.Int("reason"))
97
100
  message := ag.OptionalString("message")
@@ -118,7 +121,7 @@ func (cli *Client) handleConnectFailure(node *waBinary.Node) {
118
121
  if reason.IsLoggedOut() {
119
122
  cli.Log.Infof("Got %s connect failure, sending LoggedOut event and deleting session", reason)
120
123
  go cli.dispatchEvent(&events.LoggedOut{OnConnect: true, Reason: reason})
121
- err := cli.Store.Delete()
124
+ err := cli.Store.Delete(ctx)
122
125
  if err != nil {
123
126
  cli.Log.Warnf("Failed to delete store after %d failure: %v", int(reason), err)
124
127
  }
@@ -148,24 +151,36 @@ func (cli *Client) handleConnectFailure(node *waBinary.Node) {
148
151
  }
149
152
 
150
153
  func (cli *Client) handleConnectSuccess(node *waBinary.Node) {
154
+ ctx := context.TODO()
151
155
  cli.Log.Infof("Successfully authenticated")
152
156
  cli.LastSuccessfulConnect = time.Now()
153
157
  cli.AutoReconnectErrors = 0
154
158
  cli.isLoggedIn.Store(true)
159
+ nodeLID := node.AttrGetter().JID("lid")
160
+ if cli.Store.LID.IsEmpty() && !nodeLID.IsEmpty() {
161
+ cli.Store.LID = nodeLID
162
+ err := cli.Store.Save(ctx)
163
+ if err != nil {
164
+ cli.Log.Warnf("Failed to save device after updating LID: %v", err)
165
+ } else {
166
+ cli.Log.Infof("Updated LID to %s", cli.Store.LID)
167
+ }
168
+ cli.StoreLIDPNMapping(ctx, cli.Store.GetLID(), cli.Store.GetJID())
169
+ }
155
170
  go func() {
156
- if dbCount, err := cli.Store.PreKeys.UploadedPreKeyCount(); err != nil {
171
+ if dbCount, err := cli.Store.PreKeys.UploadedPreKeyCount(ctx); err != nil {
157
172
  cli.Log.Errorf("Failed to get number of prekeys in database: %v", err)
158
- } else if serverCount, err := cli.getServerPreKeyCount(); err != nil {
173
+ } else if serverCount, err := cli.getServerPreKeyCount(ctx); err != nil {
159
174
  cli.Log.Warnf("Failed to get number of prekeys on server: %v", err)
160
175
  } else {
161
176
  cli.Log.Debugf("Database has %d prekeys, server says we have %d", dbCount, serverCount)
162
177
  if serverCount < MinPreKeyCount || dbCount < MinPreKeyCount {
163
- cli.uploadPreKeys()
164
- sc, _ := cli.getServerPreKeyCount()
178
+ cli.uploadPreKeys(ctx)
179
+ sc, _ := cli.getServerPreKeyCount(ctx)
165
180
  cli.Log.Debugf("Prekey count after upload: %d", sc)
166
181
  }
167
182
  }
168
- err := cli.SetPassive(false)
183
+ err := cli.SetPassive(ctx, false)
169
184
  if err != nil {
170
185
  cli.Log.Warnf("Failed to send post-connect passive IQ: %v", err)
171
186
  }
@@ -178,7 +193,7 @@ func (cli *Client) handleConnectSuccess(node *waBinary.Node) {
178
193
  //
179
194
  // This seems to mostly affect whether the device receives certain events.
180
195
  // By default, whatsmeow will automatically do SetPassive(false) after connecting.
181
- func (cli *Client) SetPassive(passive bool) error {
196
+ func (cli *Client) SetPassive(ctx context.Context, passive bool) error {
182
197
  tag := "active"
183
198
  if passive {
184
199
  tag = "passive"
@@ -187,6 +202,7 @@ func (cli *Client) SetPassive(passive bool) error {
187
202
  Namespace: "passive",
188
203
  Type: "set",
189
204
  To: types.ServerJID,
205
+ Context: ctx,
190
206
  Content: []waBinary.Node{{Tag: tag}},
191
207
  })
192
208
  if err != nil {
@@ -7,6 +7,7 @@
7
7
  package whatsmeow
8
8
 
9
9
  import (
10
+ "context"
10
11
  "crypto/hmac"
11
12
  "crypto/sha256"
12
13
  "encoding/base64"
@@ -37,7 +38,7 @@ type File interface {
37
38
  // DownloadToFile downloads the attachment from the given protobuf message.
38
39
  //
39
40
  // This is otherwise identical to [Download], but writes the attachment to a file instead of returning it as a byte slice.
40
- func (cli *Client) DownloadToFile(msg DownloadableMessage, file File) error {
41
+ func (cli *Client) DownloadToFile(ctx context.Context, msg DownloadableMessage, file File) error {
41
42
  if cli == nil {
42
43
  return ErrClientIsNil
43
44
  }
@@ -53,9 +54,9 @@ func (cli *Client) DownloadToFile(msg DownloadableMessage, file File) error {
53
54
  isWebWhatsappNetURL = strings.HasPrefix(url, "https://web.whatsapp.net")
54
55
  }
55
56
  if len(url) > 0 && !isWebWhatsappNetURL {
56
- return cli.downloadAndDecryptToFile(url, msg.GetMediaKey(), mediaType, getSize(msg), msg.GetFileEncSHA256(), msg.GetFileSHA256(), file)
57
+ return cli.downloadAndDecryptToFile(ctx, url, msg.GetMediaKey(), mediaType, getSize(msg), msg.GetFileEncSHA256(), msg.GetFileSHA256(), file)
57
58
  } else if len(msg.GetDirectPath()) > 0 {
58
- return cli.DownloadMediaWithPathToFile(msg.GetDirectPath(), msg.GetFileEncSHA256(), msg.GetFileSHA256(), msg.GetMediaKey(), getSize(msg), mediaType, mediaTypeToMMSType[mediaType], file)
59
+ return cli.DownloadMediaWithPathToFile(ctx, msg.GetDirectPath(), msg.GetFileEncSHA256(), msg.GetFileSHA256(), msg.GetMediaKey(), getSize(msg), mediaType, mediaTypeToMMSType[mediaType], file)
59
60
  } else {
60
61
  if isWebWhatsappNetURL {
61
62
  cli.Log.Warnf("Got a media message with a web.whatsapp.net URL (%s) and no direct path", url)
@@ -64,12 +65,25 @@ func (cli *Client) DownloadToFile(msg DownloadableMessage, file File) error {
64
65
  }
65
66
  }
66
67
 
67
- func (cli *Client) DownloadFBToFile(transport *waMediaTransport.WAMediaTransport_Integral, mediaType MediaType, file File) error {
68
- return cli.DownloadMediaWithPathToFile(transport.GetDirectPath(), transport.GetFileEncSHA256(), transport.GetFileSHA256(), transport.GetMediaKey(), -1, mediaType, mediaTypeToMMSType[mediaType], file)
68
+ func (cli *Client) DownloadFBToFile(
69
+ ctx context.Context,
70
+ transport *waMediaTransport.WAMediaTransport_Integral,
71
+ mediaType MediaType,
72
+ file File,
73
+ ) error {
74
+ return cli.DownloadMediaWithPathToFile(ctx, transport.GetDirectPath(), transport.GetFileEncSHA256(), transport.GetFileSHA256(), transport.GetMediaKey(), -1, mediaType, mediaTypeToMMSType[mediaType], file)
69
75
  }
70
76
 
71
- func (cli *Client) DownloadMediaWithPathToFile(directPath string, encFileHash, fileHash, mediaKey []byte, fileLength int, mediaType MediaType, mmsType string, file File) error {
72
- mediaConn, err := cli.refreshMediaConn(false)
77
+ func (cli *Client) DownloadMediaWithPathToFile(
78
+ ctx context.Context,
79
+ directPath string,
80
+ encFileHash, fileHash, mediaKey []byte,
81
+ fileLength int,
82
+ mediaType MediaType,
83
+ mmsType string,
84
+ file File,
85
+ ) error {
86
+ mediaConn, err := cli.refreshMediaConn(ctx, false)
73
87
  if err != nil {
74
88
  return fmt.Errorf("failed to refresh media connections: %w", err)
75
89
  }
@@ -79,7 +93,7 @@ func (cli *Client) DownloadMediaWithPathToFile(directPath string, encFileHash, f
79
93
  for i, host := range mediaConn.Hosts {
80
94
  // TODO omit hash for unencrypted media?
81
95
  mediaURL := fmt.Sprintf("https://%s%s&hash=%s&mms-type=%s&__wa-mms=", host.Hostname, directPath, base64.URLEncoding.EncodeToString(encFileHash), mmsType)
82
- err = cli.downloadAndDecryptToFile(mediaURL, mediaKey, mediaType, fileLength, encFileHash, fileHash, file)
96
+ err = cli.downloadAndDecryptToFile(ctx, mediaURL, mediaKey, mediaType, fileLength, encFileHash, fileHash, file)
83
97
  if err == nil || errors.Is(err, ErrFileLengthMismatch) || errors.Is(err, ErrInvalidMediaSHA256) ||
84
98
  errors.Is(err, ErrMediaDownloadFailedWith403) || errors.Is(err, ErrMediaDownloadFailedWith404) || errors.Is(err, ErrMediaDownloadFailedWith410) {
85
99
  return err
@@ -91,10 +105,18 @@ func (cli *Client) DownloadMediaWithPathToFile(directPath string, encFileHash, f
91
105
  return err
92
106
  }
93
107
 
94
- func (cli *Client) downloadAndDecryptToFile(url string, mediaKey []byte, appInfo MediaType, fileLength int, fileEncSHA256, fileSHA256 []byte, file File) error {
108
+ func (cli *Client) downloadAndDecryptToFile(
109
+ ctx context.Context,
110
+ url string,
111
+ mediaKey []byte,
112
+ appInfo MediaType,
113
+ fileLength int,
114
+ fileEncSHA256, fileSHA256 []byte,
115
+ file File,
116
+ ) error {
95
117
  iv, cipherKey, macKey, _ := getMediaKeys(mediaKey, appInfo)
96
118
  hasher := sha256.New()
97
- if mac, err := cli.downloadPossiblyEncryptedMediaWithRetriesToFile(url, fileEncSHA256, file); err != nil {
119
+ if mac, err := cli.downloadPossiblyEncryptedMediaWithRetriesToFile(ctx, url, fileEncSHA256, file); err != nil {
98
120
  return err
99
121
  } else if mediaKey == nil && fileEncSHA256 == nil && mac == nil {
100
122
  // Unencrypted media, just return the downloaded data
@@ -107,7 +129,7 @@ func (cli *Client) downloadAndDecryptToFile(url string, mediaKey []byte, appInfo
107
129
  return fmt.Errorf("failed to decrypt file: %w", err)
108
130
  } else if info, err := file.Stat(); err != nil {
109
131
  return fmt.Errorf("failed to stat file: %w", err)
110
- } else if info.Size() != int64(fileLength) {
132
+ } else if fileLength >= 0 && info.Size() != int64(fileLength) {
111
133
  return fmt.Errorf("%w: expected %d, got %d", ErrFileLengthMismatch, fileLength, info.Size())
112
134
  } else if _, err = file.Seek(0, io.SeekStart); err != nil {
113
135
  return fmt.Errorf("failed to seek to start of file after decrypting: %w", err)
@@ -119,12 +141,12 @@ func (cli *Client) downloadAndDecryptToFile(url string, mediaKey []byte, appInfo
119
141
  return nil
120
142
  }
121
143
 
122
- func (cli *Client) downloadPossiblyEncryptedMediaWithRetriesToFile(url string, checksum []byte, file File) (mac []byte, err error) {
144
+ func (cli *Client) downloadPossiblyEncryptedMediaWithRetriesToFile(ctx context.Context, url string, checksum []byte, file File) (mac []byte, err error) {
123
145
  for retryNum := 0; retryNum < 5; retryNum++ {
124
146
  if checksum == nil {
125
- _, _, err = cli.downloadMediaToFile(url, file)
147
+ _, _, err = cli.downloadMediaToFile(ctx, url, file)
126
148
  } else {
127
- mac, err = cli.downloadEncryptedMediaToFile(url, checksum, file)
149
+ mac, err = cli.downloadEncryptedMediaToFile(ctx, url, checksum, file)
128
150
  }
129
151
  if err == nil || !shouldRetryMediaDownload(err) {
130
152
  return
@@ -139,13 +161,17 @@ func (cli *Client) downloadPossiblyEncryptedMediaWithRetriesToFile(url string, c
139
161
  if err != nil {
140
162
  return nil, fmt.Errorf("failed to seek to start of file to retry download: %w", err)
141
163
  }
142
- time.Sleep(retryDuration)
164
+ select {
165
+ case <-ctx.Done():
166
+ return nil, ctx.Err()
167
+ case <-time.After(retryDuration):
168
+ }
143
169
  }
144
170
  return
145
171
  }
146
172
 
147
- func (cli *Client) downloadMediaToFile(url string, file io.Writer) (int64, []byte, error) {
148
- resp, err := cli.doMediaDownloadRequest(url)
173
+ func (cli *Client) downloadMediaToFile(ctx context.Context, url string, file io.Writer) (int64, []byte, error) {
174
+ resp, err := cli.doMediaDownloadRequest(ctx, url)
149
175
  if err != nil {
150
176
  return 0, nil, err
151
177
  }
@@ -162,8 +188,8 @@ func (cli *Client) downloadMediaToFile(url string, file io.Writer) (int64, []byt
162
188
  return n, hasher.Sum(nil), err
163
189
  }
164
190
 
165
- func (cli *Client) downloadEncryptedMediaToFile(url string, checksum []byte, file File) ([]byte, error) {
166
- size, hash, err := cli.downloadMediaToFile(url, file)
191
+ func (cli *Client) downloadEncryptedMediaToFile(ctx context.Context, url string, checksum []byte, file File) ([]byte, error) {
192
+ size, hash, err := cli.downloadMediaToFile(ctx, url, file)
167
193
  if err != nil {
168
194
  return nil, err
169
195
  } else if size <= mediaHMACLength {
@@ -7,6 +7,7 @@
7
7
  package whatsmeow
8
8
 
9
9
  import (
10
+ "context"
10
11
  "crypto/hmac"
11
12
  "crypto/sha256"
12
13
  "encoding/base64"
@@ -129,21 +130,21 @@ var mediaTypeToMMSType = map[MediaType]string{
129
130
  }
130
131
 
131
132
  // DownloadAny loops through the downloadable parts of the given message and downloads the first non-nil item.
132
- func (cli *Client) DownloadAny(msg *waE2E.Message) (data []byte, err error) {
133
+ func (cli *Client) DownloadAny(ctx context.Context, msg *waE2E.Message) (data []byte, err error) {
133
134
  if msg == nil {
134
135
  return nil, ErrNothingDownloadableFound
135
136
  }
136
137
  switch {
137
138
  case msg.ImageMessage != nil:
138
- return cli.Download(msg.ImageMessage)
139
+ return cli.Download(ctx, msg.ImageMessage)
139
140
  case msg.VideoMessage != nil:
140
- return cli.Download(msg.VideoMessage)
141
+ return cli.Download(ctx, msg.VideoMessage)
141
142
  case msg.AudioMessage != nil:
142
- return cli.Download(msg.AudioMessage)
143
+ return cli.Download(ctx, msg.AudioMessage)
143
144
  case msg.DocumentMessage != nil:
144
- return cli.Download(msg.DocumentMessage)
145
+ return cli.Download(ctx, msg.DocumentMessage)
145
146
  case msg.StickerMessage != nil:
146
- return cli.Download(msg.StickerMessage)
147
+ return cli.Download(ctx, msg.StickerMessage)
147
148
  default:
148
149
  return nil, ErrNothingDownloadableFound
149
150
  }
@@ -167,12 +168,12 @@ func getSize(msg DownloadableMessage) int {
167
168
  // var msg *waE2E.Message
168
169
  // ...
169
170
  // thumbnailImageBytes, err := cli.DownloadThumbnail(msg.GetExtendedTextMessage())
170
- func (cli *Client) DownloadThumbnail(msg DownloadableThumbnail) ([]byte, error) {
171
+ func (cli *Client) DownloadThumbnail(ctx context.Context, msg DownloadableThumbnail) ([]byte, error) {
171
172
  mediaType, ok := classToThumbnailMediaType[msg.ProtoReflect().Descriptor().Name()]
172
173
  if !ok {
173
174
  return nil, fmt.Errorf("%w '%s'", ErrUnknownMediaType, string(msg.ProtoReflect().Descriptor().Name()))
174
175
  } else if len(msg.GetThumbnailDirectPath()) > 0 {
175
- return cli.DownloadMediaWithPath(msg.GetThumbnailDirectPath(), msg.GetThumbnailEncSHA256(), msg.GetThumbnailSHA256(), msg.GetMediaKey(), -1, mediaType, mediaTypeToMMSType[mediaType])
176
+ return cli.DownloadMediaWithPath(ctx, msg.GetThumbnailDirectPath(), msg.GetThumbnailEncSHA256(), msg.GetThumbnailSHA256(), msg.GetMediaKey(), -1, mediaType, mediaTypeToMMSType[mediaType])
176
177
  } else {
177
178
  return nil, ErrNoURLPresent
178
179
  }
@@ -200,7 +201,7 @@ func GetMediaType(msg DownloadableMessage) MediaType {
200
201
  // imageData, err := cli.Download(msg.GetImageMessage())
201
202
  //
202
203
  // You can also use DownloadAny to download the first non-nil sub-message.
203
- func (cli *Client) Download(msg DownloadableMessage) ([]byte, error) {
204
+ func (cli *Client) Download(ctx context.Context, msg DownloadableMessage) ([]byte, error) {
204
205
  if cli == nil {
205
206
  return nil, ErrClientIsNil
206
207
  }
@@ -216,9 +217,9 @@ func (cli *Client) Download(msg DownloadableMessage) ([]byte, error) {
216
217
  isWebWhatsappNetURL = strings.HasPrefix(url, "https://web.whatsapp.net")
217
218
  }
218
219
  if len(url) > 0 && !isWebWhatsappNetURL {
219
- return cli.downloadAndDecrypt(url, msg.GetMediaKey(), mediaType, getSize(msg), msg.GetFileEncSHA256(), msg.GetFileSHA256())
220
+ return cli.downloadAndDecrypt(ctx, url, msg.GetMediaKey(), mediaType, getSize(msg), msg.GetFileEncSHA256(), msg.GetFileSHA256())
220
221
  } else if len(msg.GetDirectPath()) > 0 {
221
- return cli.DownloadMediaWithPath(msg.GetDirectPath(), msg.GetFileEncSHA256(), msg.GetFileSHA256(), msg.GetMediaKey(), getSize(msg), mediaType, mediaTypeToMMSType[mediaType])
222
+ return cli.DownloadMediaWithPath(ctx, msg.GetDirectPath(), msg.GetFileEncSHA256(), msg.GetFileSHA256(), msg.GetMediaKey(), getSize(msg), mediaType, mediaTypeToMMSType[mediaType])
222
223
  } else {
223
224
  if isWebWhatsappNetURL {
224
225
  cli.Log.Warnf("Got a media message with a web.whatsapp.net URL (%s) and no direct path", url)
@@ -227,14 +228,25 @@ func (cli *Client) Download(msg DownloadableMessage) ([]byte, error) {
227
228
  }
228
229
  }
229
230
 
230
- func (cli *Client) DownloadFB(transport *waMediaTransport.WAMediaTransport_Integral, mediaType MediaType) ([]byte, error) {
231
- return cli.DownloadMediaWithPath(transport.GetDirectPath(), transport.GetFileEncSHA256(), transport.GetFileSHA256(), transport.GetMediaKey(), -1, mediaType, mediaTypeToMMSType[mediaType])
231
+ func (cli *Client) DownloadFB(
232
+ ctx context.Context,
233
+ transport *waMediaTransport.WAMediaTransport_Integral,
234
+ mediaType MediaType,
235
+ ) ([]byte, error) {
236
+ return cli.DownloadMediaWithPath(ctx, transport.GetDirectPath(), transport.GetFileEncSHA256(), transport.GetFileSHA256(), transport.GetMediaKey(), -1, mediaType, mediaTypeToMMSType[mediaType])
232
237
  }
233
238
 
234
239
  // DownloadMediaWithPath downloads an attachment by manually specifying the path and encryption details.
235
- func (cli *Client) DownloadMediaWithPath(directPath string, encFileHash, fileHash, mediaKey []byte, fileLength int, mediaType MediaType, mmsType string) (data []byte, err error) {
240
+ func (cli *Client) DownloadMediaWithPath(
241
+ ctx context.Context,
242
+ directPath string,
243
+ encFileHash, fileHash, mediaKey []byte,
244
+ fileLength int,
245
+ mediaType MediaType,
246
+ mmsType string,
247
+ ) (data []byte, err error) {
236
248
  var mediaConn *MediaConn
237
- mediaConn, err = cli.refreshMediaConn(false)
249
+ mediaConn, err = cli.refreshMediaConn(ctx, false)
238
250
  if err != nil {
239
251
  return nil, fmt.Errorf("failed to refresh media connections: %w", err)
240
252
  }
@@ -244,7 +256,7 @@ func (cli *Client) DownloadMediaWithPath(directPath string, encFileHash, fileHas
244
256
  for i, host := range mediaConn.Hosts {
245
257
  // TODO omit hash for unencrypted media?
246
258
  mediaURL := fmt.Sprintf("https://%s%s&hash=%s&mms-type=%s&__wa-mms=", host.Hostname, directPath, base64.URLEncoding.EncodeToString(encFileHash), mmsType)
247
- data, err = cli.downloadAndDecrypt(mediaURL, mediaKey, mediaType, fileLength, encFileHash, fileHash)
259
+ data, err = cli.downloadAndDecrypt(ctx, mediaURL, mediaKey, mediaType, fileLength, encFileHash, fileHash)
248
260
  if err == nil || errors.Is(err, ErrFileLengthMismatch) || errors.Is(err, ErrInvalidMediaSHA256) ||
249
261
  errors.Is(err, ErrMediaDownloadFailedWith403) || errors.Is(err, ErrMediaDownloadFailedWith404) || errors.Is(err, ErrMediaDownloadFailedWith410) {
250
262
  return
@@ -256,10 +268,18 @@ func (cli *Client) DownloadMediaWithPath(directPath string, encFileHash, fileHas
256
268
  return
257
269
  }
258
270
 
259
- func (cli *Client) downloadAndDecrypt(url string, mediaKey []byte, appInfo MediaType, fileLength int, fileEncSHA256, fileSHA256 []byte) (data []byte, err error) {
271
+ func (cli *Client) downloadAndDecrypt(
272
+ ctx context.Context,
273
+ url string,
274
+ mediaKey []byte,
275
+ appInfo MediaType,
276
+ fileLength int,
277
+ fileEncSHA256,
278
+ fileSHA256 []byte,
279
+ ) (data []byte, err error) {
260
280
  iv, cipherKey, macKey, _ := getMediaKeys(mediaKey, appInfo)
261
281
  var ciphertext, mac []byte
262
- if ciphertext, mac, err = cli.downloadPossiblyEncryptedMediaWithRetries(url, fileEncSHA256); err != nil {
282
+ if ciphertext, mac, err = cli.downloadPossiblyEncryptedMediaWithRetries(ctx, url, fileEncSHA256); err != nil {
263
283
 
264
284
  } else if mediaKey == nil && fileEncSHA256 == nil && mac == nil {
265
285
  // Unencrypted media, just return the downloaded data
@@ -289,12 +309,12 @@ func shouldRetryMediaDownload(err error) bool {
289
309
  (errors.As(err, &httpErr) && retryafter.Should(httpErr.StatusCode, true))
290
310
  }
291
311
 
292
- func (cli *Client) downloadPossiblyEncryptedMediaWithRetries(url string, checksum []byte) (file, mac []byte, err error) {
312
+ func (cli *Client) downloadPossiblyEncryptedMediaWithRetries(ctx context.Context, url string, checksum []byte) (file, mac []byte, err error) {
293
313
  for retryNum := 0; retryNum < 5; retryNum++ {
294
314
  if checksum == nil {
295
- file, err = cli.downloadMedia(url)
315
+ file, err = cli.downloadMedia(ctx, url)
296
316
  } else {
297
- file, mac, err = cli.downloadEncryptedMedia(url, checksum)
317
+ file, mac, err = cli.downloadEncryptedMedia(ctx, url, checksum)
298
318
  }
299
319
  if err == nil || !shouldRetryMediaDownload(err) {
300
320
  return
@@ -305,13 +325,17 @@ func (cli *Client) downloadPossiblyEncryptedMediaWithRetries(url string, checksu
305
325
  retryDuration = retryafter.Parse(httpErr.Response.Header.Get("Retry-After"), retryDuration)
306
326
  }
307
327
  cli.Log.Warnf("Failed to download media due to network error: %v, retrying in %s...", err, retryDuration)
308
- time.Sleep(retryDuration)
328
+ select {
329
+ case <-ctx.Done():
330
+ return nil, nil, ctx.Err()
331
+ case <-time.After(retryDuration):
332
+ }
309
333
  }
310
334
  return
311
335
  }
312
336
 
313
- func (cli *Client) doMediaDownloadRequest(url string) (*http.Response, error) {
314
- req, err := http.NewRequest(http.MethodGet, url, nil)
337
+ func (cli *Client) doMediaDownloadRequest(ctx context.Context, url string) (*http.Response, error) {
338
+ req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
315
339
  if err != nil {
316
340
  return nil, fmt.Errorf("failed to prepare request: %w", err)
317
341
  }
@@ -332,8 +356,8 @@ func (cli *Client) doMediaDownloadRequest(url string) (*http.Response, error) {
332
356
  return resp, nil
333
357
  }
334
358
 
335
- func (cli *Client) downloadMedia(url string) ([]byte, error) {
336
- resp, err := cli.doMediaDownloadRequest(url)
359
+ func (cli *Client) downloadMedia(ctx context.Context, url string) ([]byte, error) {
360
+ resp, err := cli.doMediaDownloadRequest(ctx, url)
337
361
  if err != nil {
338
362
  return nil, err
339
363
  }
@@ -344,8 +368,8 @@ func (cli *Client) downloadMedia(url string) ([]byte, error) {
344
368
 
345
369
  const mediaHMACLength = 10
346
370
 
347
- func (cli *Client) downloadEncryptedMedia(url string, checksum []byte) (file, mac []byte, err error) {
348
- data, err := cli.downloadMedia(url)
371
+ func (cli *Client) downloadEncryptedMedia(ctx context.Context, url string, checksum []byte) (file, mac []byte, err error) {
372
+ data, err := cli.downloadMedia(ctx, url)
349
373
  if err != nil {
350
374
  return
351
375
  } else if len(data) <= mediaHMACLength {
@@ -141,6 +141,7 @@ var (
141
141
  var (
142
142
  ErrOriginalMessageSecretNotFound = errors.New("original message secret key not found")
143
143
  ErrNotEncryptedReactionMessage = errors.New("given message isn't an encrypted reaction message")
144
+ ErrNotEncryptedCommentMessage = errors.New("given message isn't an encrypted comment message")
144
145
  ErrNotPollUpdateMessage = errors.New("given message isn't a poll update message")
145
146
  )
146
147