1package admin23import (4 "database/sql"5 "fmt"67 "git.lin.moe/go/mlisting/storage"8 "github.com/spf13/cobra"9)1011func init() {12 memShowCmd := &cobra.Command{13 Use: "show {group_address}",14 Aliases: []string{"ls", "list"},15 Short: "show members",16 Args: cobra.MatchAll(cobra.ExactArgs(1), cobra.OnlyValidArgs),17 RunE: memShow,18 }19 memAddCmd := &cobra.Command{20 Use: "add {group_address} {mem_address ...}",21 Short: "add members",22 Args: cobra.MatchAll(cobra.MinimumNArgs(2), cobra.OnlyValidArgs),23 RunE: memAdd,24 }2526 memAddCmd.Flags().Uint8("perm", 0, "permission of new member (1:browser,2:reply,4:post)")2728 memDelCmd := &cobra.Command{29 Use: "delete {group_address} {mem_address ...}",30 Aliases: []string{"del"},31 Short: "delete members",32 Args: cobra.MatchAll(cobra.MinimumNArgs(2), cobra.OnlyValidArgs),33 RunE: memDel,34 }3536 memModifyCmd := &cobra.Command{37 Use: "update {group_address} {mem_address}",38 Short: "modify group member configures",39 Aliases: []string{"modify"},40 Args: cobra.MatchAll(cobra.MinimumNArgs(2), cobra.OnlyValidArgs),41 RunE: memModify,42 }43 mFlags := memModifyCmd.Flags()44 mFlags.Uint8("perm", 0, "permission of member (1:browser,2:reply,4:post)")4546 memCmd := &cobra.Command{47 Use: "member",48 Aliases: []string{"mem"},49 Short: "group members management",50 }51 memCmd.AddCommand(memShowCmd)52 memCmd.AddCommand(memAddCmd)53 memCmd.AddCommand(memDelCmd)54 memCmd.AddCommand(memModifyCmd)5556 cmd.AddCommand(memCmd)57}5859func memShow(cmd *cobra.Command, args []string) error {60 st, ok := storage.FromContext(cmd.Context())61 if !ok {62 return fmt.Errorf("storage not found")63 }64 list, err := st.GetList(cmd.Context(), args[0])65 if err != nil {66 if err == sql.ErrNoRows {67 return fmt.Errorf("not found list %s", args[0])68 }69 return err70 }71 mems, err := list.Members(cmd.Context())72 if err != nil {73 return err74 }75 for _, mem := range mems {76 cmd.Printf("%s <%s>: %d(%s)\n", mem.Name(), mem.Address(), mem.Perm(), storage.PermString(mem.Perm()))77 }78 return nil79}8081func memAdd(cmd *cobra.Command, args []string) error {82 st, ok := storage.FromContext(cmd.Context())83 if !ok {84 return fmt.Errorf("storage not found")85 }86 list, err := st.GetList(cmd.Context(), args[0])87 if err != nil {88 return err89 }9091 setperm := cmd.Flags().Changed("perm")92 perm, _ := cmd.Flags().GetUint8("perm")9394 for _, m := range args[1:] {95 info, err := list.NewMember(cmd.Context(), m)96 if err != nil {97 cmd.PrintErrf("add member [%s] failed: %v\n", m, err)98 continue99 }100 if setperm {101 info, err = list.UpdateMember(cmd.Context(), info.Address(), perm)102 if err != nil {103 cmd.PrintErrf("add permission for [%s] failed: %v\n", info.Address(), err)104 continue105 }106 }107 }108 return nil109}110111func memDel(cmd *cobra.Command, args []string) error {112 st, ok := storage.FromContext(cmd.Context())113 if !ok {114 return fmt.Errorf("storage not found")115 }116117 list, err := st.GetList(cmd.Context(), args[0])118 if err != nil {119 return err120 }121122 for _, m := range args[1:] {123 err := list.DelMember(cmd.Context(), m)124 if err != nil {125 cmd.PrintErrf("delete member [%s] failed: %v\n", m, err)126 continue127 } else {128 cmd.Printf("member [%s] been removed from group [%s]\n", m, list.Address())129 }130 }131 return nil132}133134func memModify(cmd *cobra.Command, args []string) error {135 st, ok := storage.FromContext(cmd.Context())136 if !ok {137 return fmt.Errorf("storage not found")138 }139140 list, err := st.GetList(cmd.Context(), args[0])141 if err != nil {142 return err143 }144145 memInfo, err := list.GetMember(cmd.Context(), args[1])146 if err != nil {147 return err148 }149150 if cmd.Flags().Changed("perm") {151 perm, _ := cmd.Flags().GetUint8("perm")152 _, err = list.UpdateMember(cmd.Context(), memInfo.Address(), perm)153 if err != nil {154 cmd.PrintErrf("add permission for [%s] failed: %v\n", memInfo.Address(), err)155 }156 }157 return nil158}