From 1997b9ea44360a6ecf1860d927898cadbeaa1ea9 Mon Sep 17 00:00:00 2001 From: sawka Date: Fri, 26 Aug 2022 17:51:28 -0700 Subject: [PATCH] implement screen:set name --- pkg/cmdrunner/cmdrunner.go | 46 ++++++++++++++++++++++++++++++-------- pkg/sstore/dbops.go | 23 ++++++++++++++++++- pkg/sstore/sstore.go | 2 +- 3 files changed, 60 insertions(+), 11 deletions(-) diff --git a/pkg/cmdrunner/cmdrunner.go b/pkg/cmdrunner/cmdrunner.go index 68b0b63d..b555b2e4 100644 --- a/pkg/cmdrunner/cmdrunner.go +++ b/pkg/cmdrunner/cmdrunner.go @@ -56,6 +56,7 @@ func init() { registerCmdFn("screen:close", ScreenCloseCommand) registerCmdFn("screen:open", ScreenOpenCommand) registerCmdAlias("screen:new", ScreenOpenCommand) + registerCmdFn("screen:set", ScreenSetCommand) registerCmdAlias("remote", RemoteCommand) registerCmdFn("remote:show", RemoteShowCommand) @@ -232,6 +233,40 @@ func ScreenOpenCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (s return update, nil } +func ScreenSetCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstore.UpdatePacket, error) { + ids, err := resolveIds(ctx, pk, R_Session|R_Screen) + if err != nil { + return nil, err + } + var varsUpdated []string + if pk.Kwargs["name"] != "" { + newName := pk.Kwargs["name"] + err = validateName(newName, "screen") + if err != nil { + return nil, err + } + err = sstore.SetScreenName(ctx, ids.SessionId, ids.ScreenId, newName) + if err != nil { + return nil, fmt.Errorf("setting screen name: %v", err) + } + varsUpdated = append(varsUpdated, "name") + } + if len(varsUpdated) == 0 { + return nil, fmt.Errorf("/screen:set no updates, can set %s", formatStrs([]string{"name", "pos"}, "or", false)) + } + screenObj, err := sstore.GetScreenById(ctx, ids.SessionId, ids.ScreenId) + if err != nil { + return nil, err + } + update, session := sstore.MakeSingleSessionUpdate(ids.SessionId) + session.Screens = append(session.Screens, screenObj) + update.Info = &sstore.InfoMsgType{ + InfoMsg: fmt.Sprintf("screen updated %s", formatStrs(varsUpdated, "and", false)), + TimeoutMs: 2000, + } + return update, nil +} + func ScreenCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstore.UpdatePacket, error) { ids, err := resolveIds(ctx, pk, R_Session) if err != nil { @@ -765,13 +800,6 @@ func SessionSetCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (s if err != nil { return nil, err } - bareSession, err := sstore.GetBareSessionById(ctx, ids.SessionId) - if err != nil { - return nil, err - } - if bareSession == nil { - return nil, fmt.Errorf("session '%s' not found", ids.SessionId) - } var varsUpdated []string if pk.Kwargs["name"] != "" { newName := pk.Kwargs["name"] @@ -791,11 +819,11 @@ func SessionSetCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (s if len(varsUpdated) == 0 { return nil, fmt.Errorf("/session:set no updates, can set %s", formatStrs([]string{"name", "pos"}, "or", false)) } - bareSession, err = sstore.GetBareSessionById(ctx, ids.SessionId) + bareSession, err := sstore.GetBareSessionById(ctx, ids.SessionId) update := sstore.ModelUpdate{ Sessions: []*sstore.SessionType{bareSession}, Info: &sstore.InfoMsgType{ - InfoMsg: fmt.Sprintf("[%s]: session updated %s", bareSession.Name, formatStrs(varsUpdated, "and", false)), + InfoMsg: fmt.Sprintf("session updated %s", formatStrs(varsUpdated, "and", false)), TimeoutMs: 2000, }, } diff --git a/pkg/sstore/dbops.go b/pkg/sstore/dbops.go index d8b6aca3..4ea5bfa4 100644 --- a/pkg/sstore/dbops.go +++ b/pkg/sstore/dbops.go @@ -726,7 +726,7 @@ func SetSessionName(ctx context.Context, sessionId string, name string) error { if dupSessionId == sessionId { return nil } - if tx.Exists(query, name) { + if dupSessionId != "" { return fmt.Errorf("invalid duplicate session name '%s'", name) } query = `UPDATE session SET name = ? WHERE sessionid = ?` @@ -735,3 +735,24 @@ func SetSessionName(ctx context.Context, sessionId string, name string) error { }) return txErr } + +func SetScreenName(ctx context.Context, sessionId string, screenId string, name string) error { + txErr := WithTx(ctx, func(tx *TxWrap) error { + query := `SELECT screenid FROM screen WHERE sessionid = ? AND screenid = ?` + if !tx.Exists(query, sessionId, screenId) { + return fmt.Errorf("screen does not exist") + } + query = `SELECT screenid FROM screen WHERE sessionid = ? AND name = ?` + dupScreenId := tx.GetString(query, sessionId, name) + if dupScreenId == screenId { + return nil + } + if dupScreenId != "" { + return fmt.Errorf("invalid duplicate screen name '%s'", name) + } + query = `UPDATE screen SET name = ? WHERE sessionid = ? AND screenid = ?` + tx.ExecWrap(query, name, sessionId, screenId) + return nil + }) + return txErr +} diff --git a/pkg/sstore/sstore.go b/pkg/sstore/sstore.go index dadbb4ad..0eea99bd 100644 --- a/pkg/sstore/sstore.go +++ b/pkg/sstore/sstore.go @@ -224,7 +224,7 @@ type ScreenType struct { ScreenIdx int64 `json:"screenidx"` Name string `json:"name"` ActiveWindowId string `json:"activewindowid"` - ScreenOpts ScreenOptsType `json:"screenopts"` + ScreenOpts *ScreenOptsType `json:"screenopts"` OwnerId string `json:"ownerid"` ShareMode string `json:"sharemode"` Windows []*ScreenWindowType `json:"windows"`