Compare commits

...

13 commits

Author SHA1 Message Date
Andrew Ferrazzutti 5e80db0e2e
Merge 6022f88105 into de605d6161 2024-03-20 13:59:10 -06:00
Tulir Asokan de605d6161 Bump version to v0.10.6 2024-03-16 13:06:27 +02:00
Tulir Asokan 62aee50dcb Update roadmap link in readme 2024-03-13 15:58:28 +02:00
Tulir Asokan b3d29954f3 Update whatsmeow 2024-03-13 15:42:47 +02:00
Tulir Asokan bcdfa04c57 Fix order of variables 2024-03-12 20:59:46 +02:00
Tulir Asokan fee357b652 Count messages that failed to save 2024-03-12 20:58:16 +02:00
Tulir Asokan 46420c1319 Fix update user query 2024-03-12 20:58:00 +02:00
Tulir Asokan d1bc6871d0 Give bridge bot PL 100 in DMs 2024-03-12 20:21:01 +02:00
Andrew Ferrazzutti 6022f88105 Print debug mode in Docker build
This allows the build cache to be invalidated when DBGWAIT is set
2024-02-05 13:18:34 -05:00
Andrew Ferrazzutti 8194cd907a Use sh/POSIX expressions 2024-02-05 10:53:46 -05:00
Andrew Ferrazzutti 1c641e2f1c Use heredoc 2024-02-05 10:53:46 -05:00
Andrew Ferrazzutti 613c35fa5b Omit debug info on release build 2024-02-05 10:53:46 -05:00
Andrew Ferrazzutti 6b2a89913c Allow debug build & remote debugging 2024-02-05 10:53:46 -05:00
12 changed files with 73 additions and 30 deletions

View file

@ -1,8 +1,9 @@
# v0.10.6 (unreleased) # v0.10.6 (2024-03-16)
* Bumped minimum Go version to 1.21. * Bumped minimum Go version to 1.21.
* Added 8-letter code pairing support to provisioning API. * Added 8-letter code pairing support to provisioning API.
* Added more bugs to fix later. * Added more bugs to fix later.
* Renamed default branch from `master` to `main`.
# v0.10.5 (2023-12-16) # v0.10.5 (2023-12-16)

View file

@ -4,7 +4,15 @@ RUN apk add --no-cache git ca-certificates build-base su-exec olm-dev
COPY . /build COPY . /build
WORKDIR /build WORKDIR /build
RUN go build -o /usr/bin/mautrix-whatsapp ARG DBG=0
RUN <<EOF
if [ "$DBG" = 1 ]; then
go install github.com/go-delve/delve/cmd/dlv@latest
else
touch /go/bin/dlv
fi
EOF
RUN ./build.sh -o /usr/bin/mautrix-whatsapp
FROM alpine:3.19 FROM alpine:3.19
@ -16,6 +24,11 @@ RUN apk add --no-cache ffmpeg su-exec ca-certificates olm bash jq yq curl
COPY --from=builder /usr/bin/mautrix-whatsapp /usr/bin/mautrix-whatsapp COPY --from=builder /usr/bin/mautrix-whatsapp /usr/bin/mautrix-whatsapp
COPY --from=builder /build/example-config.yaml /opt/mautrix-whatsapp/example-config.yaml COPY --from=builder /build/example-config.yaml /opt/mautrix-whatsapp/example-config.yaml
COPY --from=builder /build/docker-run.sh /docker-run.sh COPY --from=builder /build/docker-run.sh /docker-run.sh
COPY --from=builder /go/bin/dlv /usr/bin/dlv
VOLUME /data VOLUME /data
ARG DBG
ARG DBGWAIT=0
ENV DBG=${DBG} DBGWAIT=${DBGWAIT}
RUN echo "Debug mode: DBG=${DBG} DBGWAIT=${DBGWAIT}"
CMD ["/docker-run.sh"] CMD ["/docker-run.sh"]

View file

@ -4,7 +4,13 @@ RUN apk add --no-cache git ca-certificates build-base su-exec olm-dev bash jq yq
COPY . /build COPY . /build
WORKDIR /build WORKDIR /build
RUN go build -o /whatsapp ARG DBG=0
if [ "$DBG" = 1 ]; then
go install github.com/go-delve/delve/cmd/dlv@latest
else
touch /go/bin/dlv
fi
RUN ./build.sh -o /mautrix-whatsapp
# Setup development stack using gow # Setup development stack using gow
RUN go install github.com/mitranim/gow@latest RUN go install github.com/mitranim/gow@latest

View file

@ -11,8 +11,7 @@ All setup and usage instructions are located on [docs.mau.fi]. Some quick links:
* Basic usage: [Authentication](https://docs.mau.fi/bridges/go/whatsapp/authentication.html) * Basic usage: [Authentication](https://docs.mau.fi/bridges/go/whatsapp/authentication.html)
### Features & Roadmap ### Features & Roadmap
[ROADMAP.md](https://github.com/mautrix/whatsapp/blob/master/ROADMAP.md) [ROADMAP.md](ROADMAP.md) contains a general overview of what is supported by the bridge.
contains a general overview of what is supported by the bridge.
## Discussion ## Discussion
Matrix room: [#whatsapp:maunium.net](https://matrix.to/#/#whatsapp:maunium.net) Matrix room: [#whatsapp:maunium.net](https://matrix.to/#/#whatsapp:maunium.net)

View file

@ -1,2 +1,7 @@
#!/bin/sh #!/bin/sh
go build -ldflags "-X main.Tag=$(git describe --exact-match --tags 2>/dev/null) -X main.Commit=$(git rev-parse HEAD) -X 'main.BuildTime=`date '+%b %_d %Y, %H:%M:%S'`'" "$@" if [ "$DBG" = 1 ]; then
GO_GCFLAGS='all=-N -l'
else
GO_LDFLAGS="-s -w ${GO_LDFLAGS}"
fi
go build -gcflags="$GO_GCFLAGS" -ldflags="-X main.Tag=$(git describe --exact-match --tags 2>/dev/null) -X main.Commit=$(git rev-parse HEAD) -X 'main.BuildTime=`date '+%b %_d %Y, %H:%M:%S'`'" "$@"

View file

@ -54,10 +54,10 @@ const (
` `
updateUserQuery = ` updateUserQuery = `
UPDATE "user" UPDATE "user"
SET username=$1, agent=$2, device=$3, SET username=$2, agent=$3, device=$4,
management_room=$4, space_room=$5, management_room=$5, space_room=$6,
phone_last_seen=$6, phone_last_pinged=$7, timezone=$8 phone_last_seen=$7, phone_last_pinged=$8, timezone=$9
WHERE mxid=$9 WHERE mxid=$1
` `
getUserLastAppStateKeyIDQuery = "SELECT key_id FROM whatsmeow_app_state_sync_keys WHERE jid=$1 ORDER BY timestamp DESC LIMIT 1" getUserLastAppStateKeyIDQuery = "SELECT key_id FROM whatsmeow_app_state_sync_keys WHERE jid=$1 ORDER BY timestamp DESC LIMIT 1"
) )
@ -126,9 +126,9 @@ func (user *User) sqlVariables() []any {
device = dbutil.NumPtr(user.JID.Device) device = dbutil.NumPtr(user.JID.Device)
} }
return []any{ return []any{
username, agent, device, user.ManagementRoom, user.SpaceRoom, user.MXID, username, agent, device, user.ManagementRoom, user.SpaceRoom,
dbutil.UnixPtr(user.PhoneLastSeen), dbutil.UnixPtr(user.PhoneLastPinged), dbutil.UnixPtr(user.PhoneLastSeen), dbutil.UnixPtr(user.PhoneLastPinged),
user.Timezone, user.MXID, user.Timezone,
} }
} }

View file

@ -33,4 +33,14 @@ fi
cd /data cd /data
fixperms fixperms
exec su-exec $UID:$GID /usr/bin/mautrix-whatsapp
EXE=/usr/bin/mautrix-whatsapp
DLV=/usr/bin/dlv
if [ -x "$DLV" ]; then
if [ "$DBGWAIT" != 1 ]; then
NOWAIT=1
fi
EXE="${DLV} exec ${EXE} ${NOWAIT:+--continue --accept-multiclient} --api-version 2 --headless -l :4040"
fi
exec su-exec $UID:$GID $EXE

11
go.mod
View file

@ -12,14 +12,14 @@ require (
github.com/rs/zerolog v1.32.0 github.com/rs/zerolog v1.32.0
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
github.com/tidwall/gjson v1.17.1 github.com/tidwall/gjson v1.17.1
go.mau.fi/util v0.4.1-0.20240311141448-53cb04950f7e go.mau.fi/util v0.4.1
go.mau.fi/webp v0.1.0 go.mau.fi/webp v0.1.0
go.mau.fi/whatsmeow v0.0.0-20240311200223-e9bca1903462 go.mau.fi/whatsmeow v0.0.0-20240316104858-18372a0653fa
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 golang.org/x/exp v0.0.0-20240314144324-c7f7c6466f7f
golang.org/x/image v0.15.0 golang.org/x/image v0.15.0
golang.org/x/net v0.22.0 golang.org/x/net v0.22.0
google.golang.org/protobuf v1.33.0 google.golang.org/protobuf v1.33.0
maunium.net/go/mautrix v0.18.0-beta.1.0.20240311183606-94246ffc85aa maunium.net/go/mautrix v0.18.0
) )
require ( require (
@ -48,6 +48,3 @@ require (
gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect
maunium.net/go/mauflag v1.0.0 // indirect maunium.net/go/mauflag v1.0.0 // indirect
) )
//replace go.mau.fi/util => ../../Go/go-util
//replace maunium.net/go/mautrix => ../mautrix-go

16
go.sum
View file

@ -69,18 +69,18 @@ github.com/yuin/goldmark v1.7.0 h1:EfOIvIMZIzHdB/R/zVrikYLPPwJlfMcNczJFMs1m6sA=
github.com/yuin/goldmark v1.7.0/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yuin/goldmark v1.7.0/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E=
go.mau.fi/libsignal v0.1.0 h1:vAKI/nJ5tMhdzke4cTK1fb0idJzz1JuEIpmjprueC+c= go.mau.fi/libsignal v0.1.0 h1:vAKI/nJ5tMhdzke4cTK1fb0idJzz1JuEIpmjprueC+c=
go.mau.fi/libsignal v0.1.0/go.mod h1:R8ovrTezxtUNzCQE5PH30StOQWWeBskBsWE55vMfY9I= go.mau.fi/libsignal v0.1.0/go.mod h1:R8ovrTezxtUNzCQE5PH30StOQWWeBskBsWE55vMfY9I=
go.mau.fi/util v0.4.1-0.20240311141448-53cb04950f7e h1:e1jDj/MjleSS5r9DMRbuCZYKy5Rr+sbsu8eWjtLqrGk= go.mau.fi/util v0.4.1 h1:3EC9KxIXo5+h869zDGf5OOZklRd/FjeVnimTwtm3owg=
go.mau.fi/util v0.4.1-0.20240311141448-53cb04950f7e/go.mod h1:jOAREC/go8T6rGic01cu6WRa90xi9U4z3QmDjRf8xpo= go.mau.fi/util v0.4.1/go.mod h1:GjkTEBsehYZbSh2LlE6cWEn+6ZIZTGrTMM/5DMNlmFY=
go.mau.fi/webp v0.1.0 h1:BHObH/DcFntT9KYun5pDr0Ot4eUZO8k2C7eP7vF4ueA= go.mau.fi/webp v0.1.0 h1:BHObH/DcFntT9KYun5pDr0Ot4eUZO8k2C7eP7vF4ueA=
go.mau.fi/webp v0.1.0/go.mod h1:e42Z+VMFrUMS9cpEwGRIor+lQWO8oUAyPyMtcL+NMt8= go.mau.fi/webp v0.1.0/go.mod h1:e42Z+VMFrUMS9cpEwGRIor+lQWO8oUAyPyMtcL+NMt8=
go.mau.fi/whatsmeow v0.0.0-20240311200223-e9bca1903462 h1:QOGjCIh2WEfkgX/38KLjnNof79GWx0T+KLrhTHiws3s= go.mau.fi/whatsmeow v0.0.0-20240316104858-18372a0653fa h1:ifQivrTMLAAkBkIqdE/D56uAZyc7ziRdhUU59VfNPFg=
go.mau.fi/whatsmeow v0.0.0-20240311200223-e9bca1903462/go.mod h1:lQHbhaG/fI+6hfGqz5Vzn2OBJBEZ05H0kCP6iJXriN4= go.mau.fi/whatsmeow v0.0.0-20240316104858-18372a0653fa/go.mod h1:kNI5foyzqd77d5HaWc1Jico6/rxtZ/UE8nr80hIsbIk=
go.mau.fi/zeroconfig v0.1.2 h1:DKOydWnhPMn65GbXZOafgkPm11BvFashZWLct0dGFto= go.mau.fi/zeroconfig v0.1.2 h1:DKOydWnhPMn65GbXZOafgkPm11BvFashZWLct0dGFto=
go.mau.fi/zeroconfig v0.1.2/go.mod h1:NcSJkf180JT+1IId76PcMuLTNa1CzsFFZ0nBygIQM70= go.mau.fi/zeroconfig v0.1.2/go.mod h1:NcSJkf180JT+1IId76PcMuLTNa1CzsFFZ0nBygIQM70=
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= golang.org/x/exp v0.0.0-20240314144324-c7f7c6466f7f h1:3CW0unweImhOzd5FmYuRsD4Y4oQFKZIjAnKbjV4WIrw=
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= golang.org/x/exp v0.0.0-20240314144324-c7f7c6466f7f/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc=
golang.org/x/image v0.15.0 h1:kOELfmgrmJlw4Cdb7g/QGuB3CvDrXbqEIww/pNtNBm8= golang.org/x/image v0.15.0 h1:kOELfmgrmJlw4Cdb7g/QGuB3CvDrXbqEIww/pNtNBm8=
golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE=
golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc=
@ -103,5 +103,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M=
maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA=
maunium.net/go/mautrix v0.18.0-beta.1.0.20240311183606-94246ffc85aa h1:TLSWIAWKIWxLghgzWfp7o92pVCcFR3yLsArc0s/tsMs= maunium.net/go/mautrix v0.18.0 h1:sNsApeSWB8x0hLjGcdmi5JqO6Tvp2PVkiSStz+Yas6k=
maunium.net/go/mautrix v0.18.0-beta.1.0.20240311183606-94246ffc85aa/go.mod h1:0sfLB2ejW+lhgio4UlZMmn5i9SuZ8mxFkonFSamrfTE= maunium.net/go/mautrix v0.18.0/go.mod h1:STwJZ+6CAeiEQs7fYCkd5aC12XR5DXANE6Swy/PBKGo=

View file

@ -526,6 +526,7 @@ func (user *User) storeHistorySync(evt *waProto.HistorySync) {
Msg("Storing history sync") Msg("Storing history sync")
successfullySavedTotal := 0 successfullySavedTotal := 0
failedToSaveTotal := 0
totalMessageCount := 0 totalMessageCount := 0
for _, conv := range evt.GetConversations() { for _, conv := range evt.GetConversations() {
jid, err := types.ParseJID(conv.GetId()) jid, err := types.ParseJID(conv.GetId())
@ -578,6 +579,7 @@ func (user *User) storeHistorySync(evt *waProto.HistorySync) {
var minTimeIndex, maxTimeIndex int var minTimeIndex, maxTimeIndex int
successfullySaved := 0 successfullySaved := 0
failedToSave := 0
unsupportedTypes := 0 unsupportedTypes := 0
for i, rawMsg := range conv.GetMessages() { for i, rawMsg := range conv.GetMessages() {
// Don't store messages that will just be skipped. // Don't store messages that will just be skipped.
@ -614,6 +616,7 @@ func (user *User) storeHistorySync(evt *waProto.HistorySync) {
Str("msg_id", msgEvt.Info.ID). Str("msg_id", msgEvt.Info.ID).
Time("msg_time", msgEvt.Info.Timestamp). Time("msg_time", msgEvt.Info.Timestamp).
Msg("Failed to save historical message") Msg("Failed to save historical message")
failedToSave++
continue continue
} }
err = message.Insert(ctx) err = message.Insert(ctx)
@ -623,12 +626,16 @@ func (user *User) storeHistorySync(evt *waProto.HistorySync) {
Str("msg_id", msgEvt.Info.ID). Str("msg_id", msgEvt.Info.ID).
Time("msg_time", msgEvt.Info.Timestamp). Time("msg_time", msgEvt.Info.Timestamp).
Msg("Failed to save historical message") Msg("Failed to save historical message")
failedToSave++
} else {
successfullySaved++
} }
successfullySaved++
} }
successfullySavedTotal += successfullySaved successfullySavedTotal += successfullySaved
failedToSaveTotal += failedToSave
log.Debug(). log.Debug().
Int("saved_count", successfullySaved). Int("saved_count", successfullySaved).
Int("failed_count", failedToSave).
Int("unsupported_msg_type_count", unsupportedTypes). Int("unsupported_msg_type_count", unsupportedTypes).
Time("lowest_time", minTime). Time("lowest_time", minTime).
Int("lowest_time_index", minTimeIndex). Int("lowest_time_index", minTimeIndex).
@ -646,6 +653,7 @@ func (user *User) storeHistorySync(evt *waProto.HistorySync) {
} }
log.Info(). log.Info().
Int("total_saved_count", successfullySavedTotal). Int("total_saved_count", successfullySavedTotal).
Int("total_failed_count", failedToSaveTotal).
Int("total_message_count", totalMessageCount). Int("total_message_count", totalMessageCount).
Msg("Finished storing history sync") Msg("Finished storing history sync")

View file

@ -278,7 +278,7 @@ func main() {
Name: "mautrix-whatsapp", Name: "mautrix-whatsapp",
URL: "https://github.com/mautrix/whatsapp", URL: "https://github.com/mautrix/whatsapp",
Description: "A Matrix-WhatsApp puppeting bridge.", Description: "A Matrix-WhatsApp puppeting bridge.",
Version: "0.10.5", Version: "0.10.6",
ProtocolName: "WhatsApp", ProtocolName: "WhatsApp",
BeeperServiceName: "whatsapp", BeeperServiceName: "whatsapp",
BeeperNetworkName: "whatsapp", BeeperNetworkName: "whatsapp",

View file

@ -1814,6 +1814,7 @@ func (portal *Portal) GetBasePowerLevels() *event.PowerLevelsEventContent {
InvitePtr: &invite, InvitePtr: &invite,
Users: map[id.UserID]int{ Users: map[id.UserID]int{
portal.MainIntent().UserID: 100, portal.MainIntent().UserID: 100,
portal.bridge.Bot.UserID: 100,
}, },
Events: map[string]int{ Events: map[string]int{
event.StateRoomName.Type: anyone, event.StateRoomName.Type: anyone,
@ -1831,6 +1832,9 @@ func (portal *Portal) applyPowerLevelFixes(levels *event.PowerLevelsEventContent
changed = levels.EnsureEventLevel(event.EventReaction, 0) || changed changed = levels.EnsureEventLevel(event.EventReaction, 0) || changed
changed = levels.EnsureEventLevel(event.EventRedaction, 0) || changed changed = levels.EnsureEventLevel(event.EventRedaction, 0) || changed
changed = levels.EnsureEventLevel(TypeMSC3381PollResponse, 0) || changed changed = levels.EnsureEventLevel(TypeMSC3381PollResponse, 0) || changed
if portal.IsPrivateChat() {
changed = levels.EnsureUserLevel(portal.bridge.Bot.UserID, 100) || changed
}
return changed return changed
} }