forked from Silverfish/proton-bridge
fix(GODT-2708): fix dimensions event format + handling of ReportClicked event.
This commit is contained in:
@ -24,7 +24,7 @@ import (
|
|||||||
func (bridge *Bridge) ReportBugClicked() {
|
func (bridge *Bridge) ReportBugClicked() {
|
||||||
safe.Lock(func() {
|
safe.Lock(func() {
|
||||||
for _, user := range bridge.users {
|
for _, user := range bridge.users {
|
||||||
user.ReportBugSent()
|
user.ReportBugClicked()
|
||||||
}
|
}
|
||||||
}, bridge.usersLock)
|
}, bridge.usersLock)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -21,6 +21,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/ProtonMail/proton-bridge/v3/internal/safe"
|
"github.com/ProtonMail/proton-bridge/v3/internal/safe"
|
||||||
@ -74,8 +75,9 @@ func (status *ConfigurationStatus) Save() error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
enc := json.NewEncoder(f)
|
||||||
err = json.NewEncoder(f).Encode(status.Data)
|
enc.SetIndent("", " ")
|
||||||
|
err = enc.Encode(status.Data)
|
||||||
if err := f.Close(); err != nil {
|
if err := f.Close(); err != nil {
|
||||||
logrus.WithError(err).Error("Error while closing configstatus file.")
|
logrus.WithError(err).Error("Error while closing configstatus file.")
|
||||||
}
|
}
|
||||||
@ -197,3 +199,23 @@ func (data *ConfigurationStatusData) hasLinkClicked(pos uint) bool {
|
|||||||
val := data.DataV1.ClickedLink & (1 << pos)
|
val := data.DataV1.ClickedLink & (1 << pos)
|
||||||
return val > 0
|
return val > 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (data *ConfigurationStatusData) clickedLinkToString() string {
|
||||||
|
var str = ""
|
||||||
|
var first = true
|
||||||
|
for i := 0; i < 64; i++ {
|
||||||
|
if data.hasLinkClicked(uint(i)) {
|
||||||
|
if !first {
|
||||||
|
str += ","
|
||||||
|
} else {
|
||||||
|
first = false
|
||||||
|
str += "["
|
||||||
|
}
|
||||||
|
str += strconv.Itoa(i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if str != "" {
|
||||||
|
str += "]"
|
||||||
|
}
|
||||||
|
return str
|
||||||
|
}
|
||||||
|
|||||||
@ -17,16 +17,19 @@
|
|||||||
|
|
||||||
package configstatus
|
package configstatus
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type ConfigAbortValues struct {
|
type ConfigAbortValues struct {
|
||||||
Duration int `json:"duration"`
|
Duration int `json:"duration"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ConfigAbortDimensions struct {
|
type ConfigAbortDimensions struct {
|
||||||
ReportClick interface{} `json:"report_click"`
|
ReportClick string `json:"report_click"`
|
||||||
ReportSent interface{} `json:"report_sent"`
|
ReportSent string `json:"report_sent"`
|
||||||
ClickedLink uint64 `json:"clicked_link"`
|
ClickedLink string `json:"clicked_link"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ConfigAbortData struct {
|
type ConfigAbortData struct {
|
||||||
@ -46,9 +49,9 @@ func (*ConfigAbortBuilder) New(data *ConfigurationStatusData) ConfigAbortData {
|
|||||||
Duration: int(time.Since(data.DataV1.PendingSince).Minutes()),
|
Duration: int(time.Since(data.DataV1.PendingSince).Minutes()),
|
||||||
},
|
},
|
||||||
Dimensions: ConfigSuccessDimensions{
|
Dimensions: ConfigSuccessDimensions{
|
||||||
ReportClick: data.DataV1.ReportClick,
|
ReportClick: strconv.FormatBool(data.DataV1.ReportClick),
|
||||||
ReportSent: data.DataV1.ReportSent,
|
ReportSent: strconv.FormatBool(data.DataV1.ReportSent),
|
||||||
ClickedLink: data.DataV1.ClickedLink,
|
ClickedLink: data.clickedLinkToString(),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -38,9 +38,9 @@ func TestConfigurationAbort_default(t *testing.T) {
|
|||||||
require.Equal(t, "bridge.any.configuration", req.MeasurementGroup)
|
require.Equal(t, "bridge.any.configuration", req.MeasurementGroup)
|
||||||
require.Equal(t, "bridge_config_abort", req.Event)
|
require.Equal(t, "bridge_config_abort", req.Event)
|
||||||
require.Equal(t, 0, req.Values.Duration)
|
require.Equal(t, 0, req.Values.Duration)
|
||||||
require.Equal(t, false, req.Dimensions.ReportClick)
|
require.Equal(t, "false", req.Dimensions.ReportClick)
|
||||||
require.Equal(t, false, req.Dimensions.ReportSent)
|
require.Equal(t, "false", req.Dimensions.ReportSent)
|
||||||
require.Equal(t, uint64(0), req.Dimensions.ClickedLink)
|
require.Equal(t, "", req.Dimensions.ClickedLink)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestConfigurationAbort_fed(t *testing.T) {
|
func TestConfigurationAbort_fed(t *testing.T) {
|
||||||
@ -69,7 +69,7 @@ func TestConfigurationAbort_fed(t *testing.T) {
|
|||||||
require.Equal(t, "bridge.any.configuration", req.MeasurementGroup)
|
require.Equal(t, "bridge.any.configuration", req.MeasurementGroup)
|
||||||
require.Equal(t, "bridge_config_abort", req.Event)
|
require.Equal(t, "bridge_config_abort", req.Event)
|
||||||
require.Equal(t, 10, req.Values.Duration)
|
require.Equal(t, 10, req.Values.Duration)
|
||||||
require.Equal(t, true, req.Dimensions.ReportClick)
|
require.Equal(t, "true", req.Dimensions.ReportClick)
|
||||||
require.Equal(t, false, req.Dimensions.ReportSent)
|
require.Equal(t, "false", req.Dimensions.ReportSent)
|
||||||
require.Equal(t, uint64(42), req.Dimensions.ClickedLink)
|
require.Equal(t, "[1,3,5]", req.Dimensions.ClickedLink)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -46,7 +46,7 @@ func (*ConfigProgressBuilder) New(data *ConfigurationStatusData) ConfigProgressD
|
|||||||
|
|
||||||
func numberOfDay(now, prev time.Time) int {
|
func numberOfDay(now, prev time.Time) int {
|
||||||
if now.IsZero() || prev.IsZero() {
|
if now.IsZero() || prev.IsZero() {
|
||||||
return 0
|
return 1
|
||||||
}
|
}
|
||||||
if now.Year() > prev.Year() {
|
if now.Year() > prev.Year() {
|
||||||
if now.YearDay() > prev.YearDay() {
|
if now.YearDay() > prev.YearDay() {
|
||||||
|
|||||||
@ -38,7 +38,7 @@ func TestConfigurationProgress_default(t *testing.T) {
|
|||||||
require.Equal(t, "bridge.any.configuration", req.MeasurementGroup)
|
require.Equal(t, "bridge.any.configuration", req.MeasurementGroup)
|
||||||
require.Equal(t, "bridge_config_progress", req.Event)
|
require.Equal(t, "bridge_config_progress", req.Event)
|
||||||
require.Equal(t, 0, req.Values.NbDay)
|
require.Equal(t, 0, req.Values.NbDay)
|
||||||
require.Equal(t, 0, req.Values.NbDaySinceLast)
|
require.Equal(t, 1, req.Values.NbDaySinceLast)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestConfigurationProgress_fed(t *testing.T) {
|
func TestConfigurationProgress_fed(t *testing.T) {
|
||||||
|
|||||||
@ -18,6 +18,7 @@
|
|||||||
package configstatus
|
package configstatus
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -27,9 +28,9 @@ type ConfigRecoveryValues struct {
|
|||||||
|
|
||||||
type ConfigRecoveryDimensions struct {
|
type ConfigRecoveryDimensions struct {
|
||||||
Autoconf string `json:"autoconf"`
|
Autoconf string `json:"autoconf"`
|
||||||
ReportClick interface{} `json:"report_click"`
|
ReportClick string `json:"report_click"`
|
||||||
ReportSent interface{} `json:"report_sent"`
|
ReportSent string `json:"report_sent"`
|
||||||
ClickedLink uint64 `json:"clicked_link"`
|
ClickedLink string `json:"clicked_link"`
|
||||||
FailureDetails string `json:"failure_details"`
|
FailureDetails string `json:"failure_details"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,9 +52,9 @@ func (*ConfigRecoveryBuilder) New(data *ConfigurationStatusData) ConfigRecoveryD
|
|||||||
},
|
},
|
||||||
Dimensions: ConfigRecoveryDimensions{
|
Dimensions: ConfigRecoveryDimensions{
|
||||||
Autoconf: data.DataV1.Autoconf,
|
Autoconf: data.DataV1.Autoconf,
|
||||||
ReportClick: data.DataV1.ReportClick,
|
ReportClick: strconv.FormatBool(data.DataV1.ReportClick),
|
||||||
ReportSent: data.DataV1.ReportSent,
|
ReportSent: strconv.FormatBool(data.DataV1.ReportSent),
|
||||||
ClickedLink: data.DataV1.ClickedLink,
|
ClickedLink: data.clickedLinkToString(),
|
||||||
FailureDetails: data.DataV1.FailureDetails,
|
FailureDetails: data.DataV1.FailureDetails,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@ -39,9 +39,9 @@ func TestConfigurationRecovery_default(t *testing.T) {
|
|||||||
require.Equal(t, "bridge_config_recovery", req.Event)
|
require.Equal(t, "bridge_config_recovery", req.Event)
|
||||||
require.Equal(t, 0, req.Values.Duration)
|
require.Equal(t, 0, req.Values.Duration)
|
||||||
require.Equal(t, "", req.Dimensions.Autoconf)
|
require.Equal(t, "", req.Dimensions.Autoconf)
|
||||||
require.Equal(t, false, req.Dimensions.ReportClick)
|
require.Equal(t, "false", req.Dimensions.ReportClick)
|
||||||
require.Equal(t, false, req.Dimensions.ReportSent)
|
require.Equal(t, "false", req.Dimensions.ReportSent)
|
||||||
require.Equal(t, uint64(0), req.Dimensions.ClickedLink)
|
require.Equal(t, "", req.Dimensions.ClickedLink)
|
||||||
require.Equal(t, "", req.Dimensions.FailureDetails)
|
require.Equal(t, "", req.Dimensions.FailureDetails)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,8 +72,8 @@ func TestConfigurationRecovery_fed(t *testing.T) {
|
|||||||
require.Equal(t, "bridge_config_recovery", req.Event)
|
require.Equal(t, "bridge_config_recovery", req.Event)
|
||||||
require.Equal(t, 10, req.Values.Duration)
|
require.Equal(t, 10, req.Values.Duration)
|
||||||
require.Equal(t, "Mr TBird", req.Dimensions.Autoconf)
|
require.Equal(t, "Mr TBird", req.Dimensions.Autoconf)
|
||||||
require.Equal(t, true, req.Dimensions.ReportClick)
|
require.Equal(t, "true", req.Dimensions.ReportClick)
|
||||||
require.Equal(t, false, req.Dimensions.ReportSent)
|
require.Equal(t, "false", req.Dimensions.ReportSent)
|
||||||
require.Equal(t, uint64(42), req.Dimensions.ClickedLink)
|
require.Equal(t, "[1,3,5]", req.Dimensions.ClickedLink)
|
||||||
require.Equal(t, "Not an error", req.Dimensions.FailureDetails)
|
require.Equal(t, "Not an error", req.Dimensions.FailureDetails)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,6 +18,7 @@
|
|||||||
package configstatus
|
package configstatus
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -27,9 +28,9 @@ type ConfigSuccessValues struct {
|
|||||||
|
|
||||||
type ConfigSuccessDimensions struct {
|
type ConfigSuccessDimensions struct {
|
||||||
Autoconf string `json:"autoconf"`
|
Autoconf string `json:"autoconf"`
|
||||||
ReportClick interface{} `json:"report_click"`
|
ReportClick string `json:"report_click"`
|
||||||
ReportSent interface{} `json:"report_sent"`
|
ReportSent string `json:"report_sent"`
|
||||||
ClickedLink uint64 `json:"clicked_link"`
|
ClickedLink string `json:"clicked_link"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ConfigSuccessData struct {
|
type ConfigSuccessData struct {
|
||||||
@ -50,9 +51,9 @@ func (*ConfigSuccessBuilder) New(data *ConfigurationStatusData) ConfigSuccessDat
|
|||||||
},
|
},
|
||||||
Dimensions: ConfigSuccessDimensions{
|
Dimensions: ConfigSuccessDimensions{
|
||||||
Autoconf: data.DataV1.Autoconf,
|
Autoconf: data.DataV1.Autoconf,
|
||||||
ReportClick: data.DataV1.ReportClick,
|
ReportClick: strconv.FormatBool(data.DataV1.ReportClick),
|
||||||
ReportSent: data.DataV1.ReportSent,
|
ReportSent: strconv.FormatBool(data.DataV1.ReportSent),
|
||||||
ClickedLink: data.DataV1.ClickedLink,
|
ClickedLink: data.clickedLinkToString(),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -39,9 +39,9 @@ func TestConfigurationSuccess_default(t *testing.T) {
|
|||||||
require.Equal(t, "bridge_config_success", req.Event)
|
require.Equal(t, "bridge_config_success", req.Event)
|
||||||
require.Equal(t, 0, req.Values.Duration)
|
require.Equal(t, 0, req.Values.Duration)
|
||||||
require.Equal(t, "", req.Dimensions.Autoconf)
|
require.Equal(t, "", req.Dimensions.Autoconf)
|
||||||
require.Equal(t, false, req.Dimensions.ReportClick)
|
require.Equal(t, "false", req.Dimensions.ReportClick)
|
||||||
require.Equal(t, false, req.Dimensions.ReportSent)
|
require.Equal(t, "false", req.Dimensions.ReportSent)
|
||||||
require.Equal(t, uint64(0), req.Dimensions.ClickedLink)
|
require.Equal(t, "", req.Dimensions.ClickedLink)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestConfigurationSuccess_fed(t *testing.T) {
|
func TestConfigurationSuccess_fed(t *testing.T) {
|
||||||
@ -71,7 +71,7 @@ func TestConfigurationSuccess_fed(t *testing.T) {
|
|||||||
require.Equal(t, "bridge_config_success", req.Event)
|
require.Equal(t, "bridge_config_success", req.Event)
|
||||||
require.Equal(t, 10, req.Values.Duration)
|
require.Equal(t, 10, req.Values.Duration)
|
||||||
require.Equal(t, "Mr TBird", req.Dimensions.Autoconf)
|
require.Equal(t, "Mr TBird", req.Dimensions.Autoconf)
|
||||||
require.Equal(t, true, req.Dimensions.ReportClick)
|
require.Equal(t, "true", req.Dimensions.ReportClick)
|
||||||
require.Equal(t, false, req.Dimensions.ReportSent)
|
require.Equal(t, "false", req.Dimensions.ReportSent)
|
||||||
require.Equal(t, uint64(42), req.Dimensions.ClickedLink)
|
require.Equal(t, "[1,3,5]", req.Dimensions.ClickedLink)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -124,10 +124,12 @@ func (user *User) SendConfigStatusProgress() {
|
|||||||
if !user.configStatus.IsPending() {
|
if !user.configStatus.IsPending() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var builder configstatus.ConfigProgressBuilder
|
var builder configstatus.ConfigProgressBuilder
|
||||||
progress := builder.New(user.configStatus.Data)
|
progress := builder.New(user.configStatus.Data)
|
||||||
if progress.Values.NbDaySinceLast == 0 || progress.Values.NbDay == 0 {
|
if progress.Values.NbDay == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if progress.Values.NbDaySinceLast == 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user