diff --git a/pkg/dbutil/map.go b/pkg/dbutil/map.go index 7e67516b..c4fd61a1 100644 --- a/pkg/dbutil/map.go +++ b/pkg/dbutil/map.go @@ -21,6 +21,10 @@ type HasSimpleKey interface { GetSimpleKey() string } +type HasSimpleInt64Key interface { + GetSimpleKey() int64 +} + type MapConverterPtr[T any] interface { MapConverter *T @@ -78,6 +82,14 @@ func MakeGenMap[T HasSimpleKey](arr []T) map[string]T { return rtn } +func MakeGenMapInt64[T HasSimpleInt64Key](arr []T) map[int64]T { + rtn := make(map[int64]T) + for _, val := range arr { + rtn[val.GetSimpleKey()] = val + } + return rtn +} + func isStructType(rt reflect.Type) bool { if rt.Kind() == reflect.Struct { return true diff --git a/pkg/pcloud/pcloud.go b/pkg/pcloud/pcloud.go index dca98837..1026eab1 100644 --- a/pkg/pcloud/pcloud.go +++ b/pkg/pcloud/pcloud.go @@ -15,6 +15,7 @@ import ( "sync" "time" + "github.com/scripthaus-dev/sh2-server/pkg/dbutil" "github.com/scripthaus-dev/sh2-server/pkg/rtnstate" "github.com/scripthaus-dev/sh2-server/pkg/scbase" "github.com/scripthaus-dev/sh2-server/pkg/sstore" @@ -328,6 +329,11 @@ func finalizeWebScreenUpdate(ctx context.Context, webUpdate *WebShareUpdateType) return nil } +type webShareResponseType struct { + Success bool `json:"success"` + Data []*WebShareUpdateResponseType `json:"data"` +} + func DoWebScreenUpdates(authInfo AuthInfo, updateArr []*sstore.ScreenUpdateType) error { var webUpdates []*WebShareUpdateType for _, update := range updateArr { @@ -353,16 +359,23 @@ func DoWebScreenUpdates(authInfo AuthInfo, updateArr []*sstore.ScreenUpdateType) if err != nil { return fmt.Errorf("cannot create auth-post-req for %s: %v", WebShareUpdateUrl, err) } - _, err = doRequest(req, nil) + var resp webShareResponseType + _, err = doRequest(req, &resp) if err != nil { return err } + respMap := dbutil.MakeGenMapInt64(resp.Data) for _, update := range webUpdates { err = finalizeWebScreenUpdate(context.Background(), update) if err != nil { // ignore this error (nothing to do) log.Printf("[pcloud] error finalizing web-update: %v\n", err) } + resp := respMap[update.UpdateId] + if resp == nil { + resp = &WebShareUpdateResponseType{Success: false, Error: "resp not found"} + } + log.Printf("[pcloud] updateid:%d, type:%s %s/%s success:%v err:%v\n", update.UpdateId, update.UpdateType, update.ScreenId, update.LineId, resp.Success, resp.Error) } return nil } @@ -390,9 +403,6 @@ func StartUpdateWriter() { } func computeBackoff(numFailures int) time.Duration { - // TODO remove once API implemented - return time.Hour - switch numFailures { case 1: return 100 * time.Millisecond diff --git a/pkg/pcloud/pclouddata.go b/pkg/pcloud/pclouddata.go index 8cfc3411..7f56edee 100644 --- a/pkg/pcloud/pclouddata.go +++ b/pkg/pcloud/pclouddata.go @@ -25,7 +25,7 @@ type TelemetryInputType struct { type WebShareUpdateType struct { ScreenId string `json:"screenid"` LineId string `json:"lineid"` - UpdateId int64 `json:"-"` // just for internal use + UpdateId int64 `json:"updateid"` UpdateType string `json:"updatetype"` Screen *WebShareScreenType `json:"screen,omitempty"` @@ -38,6 +38,16 @@ type WebShareUpdateType struct { TermOpts *sstore.TermOpts `json:"termopts,omitempty"` } +type WebShareUpdateResponseType struct { + UpdateId int64 `json:"updateid"` + Success bool `json:"success"` + Error string `json:"error,omitempty"` +} + +func (ur *WebShareUpdateResponseType) GetSimpleKey() int64 { + return ur.UpdateId +} + type WebShareRemotePtr struct { Alias string `json:"remotealias,omitempty"` CanonicalName string `json:"remotecanonicalname"` @@ -72,10 +82,13 @@ func webScreenFromScreen(s *sstore.ScreenType) (*WebShareScreenType, error) { if s.WebShareOpts.ViewKey == "" { return nil, fmt.Errorf("invalid screen, no ViewKey") } - if s.WebShareOpts.ShareName == "" { - return nil, fmt.Errorf("invalid screen, no ShareName") + var shareName string + if s.WebShareOpts.ShareName != "" { + shareName = s.WebShareOpts.ShareName + } else { + shareName = s.Name } - return &WebShareScreenType{ScreenId: s.ScreenId, ShareName: s.WebShareOpts.ShareName, ViewKey: s.WebShareOpts.ViewKey}, nil + return &WebShareScreenType{ScreenId: s.ScreenId, ShareName: shareName, ViewKey: s.WebShareOpts.ViewKey}, nil } type WebShareLineType struct {