1package client
2
3import (
4	"context"
5	"fmt"
6
7	"github.com/keybase/cli"
8	"github.com/keybase/client/go/libcmdline"
9	"github.com/keybase/client/go/libkb"
10	"github.com/keybase/client/go/protocol/chat1"
11	"github.com/keybase/client/go/protocol/keybase1"
12)
13
14type CmdChatMute struct {
15	libkb.Contextified
16	resolvingRequest chatConversationResolvingRequest
17	status           chat1.ConversationStatus
18}
19
20func newCmdChatMute(cl *libcmdline.CommandLine, g *libkb.GlobalContext) cli.Command {
21	return cli.Command{
22		Name:         "mute",
23		Usage:        "Mute or unmute a conversation.",
24		ArgumentHelp: "[<conversation>]",
25		Action: func(c *cli.Context) {
26			cmd := &CmdChatMute{Contextified: libkb.NewContextified(g)}
27			cl.ChooseCommand(cmd, "mute", c)
28			cl.SetLogForward(libcmdline.LogForwardNone)
29		},
30		Flags: append(getConversationResolverFlags(), mustGetChatFlags("unmute")...),
31	}
32}
33
34func (c *CmdChatMute) ParseArgv(ctx *cli.Context) error {
35	var err error
36
37	if len(ctx.Args()) > 1 {
38		return fmt.Errorf("too many arguments")
39	}
40
41	tlfName := ""
42	if len(ctx.Args()) == 1 {
43		tlfName = ctx.Args()[0]
44	}
45
46	c.resolvingRequest, err = parseConversationResolvingRequest(ctx, tlfName)
47	if err != nil {
48		return err
49	}
50
51	unmute := ctx.Bool("unmute")
52
53	c.status = chat1.ConversationStatus_MUTED
54	if unmute {
55		c.status = chat1.ConversationStatus_UNFILED
56	}
57
58	return nil
59}
60
61func (c *CmdChatMute) Run() error {
62	ctx := context.TODO()
63
64	resolver, err := newChatConversationResolver(c.G())
65	if err != nil {
66		return err
67	}
68
69	if c.resolvingRequest.TlfName != "" {
70		if err = annotateResolvingRequest(c.G(), &c.resolvingRequest); err != nil {
71			return err
72		}
73	}
74
75	conversation, _, err := resolver.Resolve(ctx, c.resolvingRequest, chatConversationResolvingBehavior{
76		CreateIfNotExists: false,
77		MustNotExist:      false,
78		Interactive:       false,
79		IdentifyBehavior:  keybase1.TLFIdentifyBehavior_CHAT_CLI,
80	})
81	if err != nil {
82		return err
83	}
84
85	setStatusArg := chat1.SetConversationStatusLocalArg{
86		ConversationID: conversation.Info.Id,
87		Status:         c.status,
88	}
89
90	_, err = resolver.ChatClient.SetConversationStatusLocal(ctx, setStatusArg)
91	if err != nil {
92		return err
93	}
94	return nil
95}
96
97func (c *CmdChatMute) GetUsage() libkb.Usage {
98	return libkb.Usage{
99		API:       true,
100		KbKeyring: true,
101		Config:    true,
102	}
103}
104