github.com/Ptt-official-app/go-bbs@v0.12.0/cmd/bbstool/main.go (about) 1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "os" 7 "strings" 8 9 "github.com/Ptt-official-app/go-bbs" 10 _ "github.com/Ptt-official-app/go-bbs/pttbbs" 11 ) 12 13 var driverName string 14 var bbshome string 15 16 func init() { 17 flag.StringVar(&driverName, "driver", "pttbbs", "bbs driver name, eg: pttbbs, maple, formosabbs") 18 flag.StringVar(&bbshome, "bbshome", "/home/bbs", "bbshome path, default is /home/bbs") 19 } 20 21 func main() { 22 flag.Parse() 23 24 fmt.Printf("driver name: %v\n", driverName) 25 fmt.Printf("bbshome: %v\n", bbshome) 26 fmt.Printf("args: %v\n", flag.Args()) 27 28 switch flag.Arg(0) { 29 case "show_board_list": 30 showboardlist() 31 return 32 case "add_board": 33 addboard() 34 return 35 case "show_user_list": 36 showuserlist() 37 return 38 case "show_user_article_list": 39 // Example: go run ./ --bbshome=../../home/bbs show_user_article_list --user_id pichu 40 showuserarticlelist() 41 return 42 case "show_user_comment_list": 43 // Example: go run ./ --bbshome=../../home/bbs show_user_comment_list --user_id pichu --board t 44 showusercommentlist() 45 return 46 47 case "show_board_article_list": 48 // Example: go run ./ --bbshome=../../home/bbs show_board_article_list --board test 49 showBoardArticleList() 50 return 51 52 case "add_board_article": 53 // Example: go run ./ --bbshome=../../home/bbs add_board_article --board test 54 addBoardArticle() 55 return 56 57 case "show_board_article": 58 // Example: go run ./ --bbshome=../../home/bbs show_board_article --board test --filename M.1621323571.A.4C6 59 showBoardArticle() 60 return 61 default: 62 fmt.Printf("unknown subcommand: %s\n", flag.Arg(0)) 63 return 64 } 65 66 } 67 68 func chkIsDir(dir string) error { 69 file, err := os.Open(dir) 70 if err != nil { 71 return err 72 } 73 defer file.Close() 74 stat, err := file.Stat() 75 if err != nil { 76 return err 77 } 78 79 if stat.IsDir() { 80 return nil 81 } 82 return fmt.Errorf("%v is not dir", dir) 83 84 } 85 86 func openDB() (db *bbs.DB, err error) { 87 err = chkIsDir(bbshome) 88 if err != nil { 89 // fmt.Printf("showBoardArticleList: error: %v\n", err) 90 return 91 } 92 93 db, err = bbs.Open(driverName, "file://"+bbshome) 94 if err != nil { 95 // fmt.Printf("showBoardArticleList: open db: %v\n", err) 96 return 97 } 98 return 99 } 100 101 func parseArgsToMap(flagArgs []string) map[string]interface{} { 102 newBoardArgs := map[string]interface{}{} 103 index := 1 104 for { 105 if index >= len(flagArgs) { 106 // fmt.Println("parsed") 107 break 108 } 109 110 if strings.HasPrefix(flagArgs[index], "--") { 111 if index+1 >= len(flagArgs) { 112 fmt.Println("flag with no args", flagArgs[index]) 113 break 114 } 115 newBoardArgs[flagArgs[index][2:]] = flagArgs[index+1] 116 index = index + 2 117 continue 118 } 119 index = index + 1 120 121 } 122 return newBoardArgs 123 } 124 125 func showboardlist() { 126 err := chkIsDir(bbshome) 127 if err != nil { 128 fmt.Printf("showboardlist: error: %v\n", err) 129 return 130 } 131 132 bbsDB, err := bbs.Open(driverName, "file://"+bbshome) 133 if err != nil { 134 fmt.Printf("showboardlist: open db: %v\n", err) 135 return 136 } 137 138 records, err := bbsDB.ReadBoardRecords() 139 if err != nil { 140 fmt.Printf("showboardlist: ReadBoardRecords: %v\n", err) 141 return 142 } 143 for _, r := range records { 144 fmt.Println("title:", r.Title()) 145 } 146 147 } 148 149 func addboard() { 150 err := chkIsDir(bbshome) 151 if err != nil { 152 fmt.Printf("addboard: error: %v\n", err) 153 return 154 } 155 156 bbsDB, err := bbs.Open(driverName, "file://"+bbshome) 157 if err != nil { 158 fmt.Printf("addboard: open db: %v\n", err) 159 return 160 } 161 162 newBoardArgs := parseArgsToMap(flag.Args()) 163 164 fmt.Printf("addboard args: %v\n", newBoardArgs) 165 166 newRecord, err := bbsDB.NewBoardRecord(newBoardArgs) 167 if err != nil { 168 fmt.Printf("addboard: NewBoardRecord: %v\n", err) 169 return 170 } 171 172 err = bbsDB.AddBoardRecord(newRecord) 173 if err != nil { 174 fmt.Printf("addboard: AddBoardRecordFileRecord: %v\n", err) 175 return 176 } 177 178 } 179 180 func showuserlist() { 181 err := chkIsDir(bbshome) 182 if err != nil { 183 fmt.Printf("showuserlist: error: %v\n", err) 184 return 185 } 186 187 bbsDB, err := bbs.Open(driverName, "file://"+bbshome) 188 if err != nil { 189 fmt.Printf("showuserlist: open db: %v\n", err) 190 return 191 } 192 193 records, err := bbsDB.ReadUserRecords() 194 if err != nil { 195 fmt.Printf("showuserlist: ReadUserRecords: %v\n", err) 196 return 197 } 198 199 for _, r := range records { 200 if r.UserID() == "" { 201 continue 202 } 203 fmt.Println("user id:", r.UserID()) 204 } 205 206 } 207 208 func showuserarticlelist() { 209 err := chkIsDir(bbshome) 210 if err != nil { 211 fmt.Printf("showuserarticlelist: error: %v\n", err) 212 return 213 } 214 215 bbsDB, err := bbs.Open(driverName, "file://"+bbshome) 216 if err != nil { 217 fmt.Printf("showuserarticlelist: open db: %v\n", err) 218 return 219 } 220 221 args := parseArgsToMap(flag.Args()) 222 223 records, err := bbsDB.GetUserArticleRecordFile(args["user_id"].(string)) 224 if err != nil { 225 fmt.Printf("showuserarticlelist: GetUserArticleRecordFile: %v\n", err) 226 return 227 } 228 229 for _, r := range records { 230 // if r.UserID() == "" { 231 // continue 232 // } 233 fmt.Println("titlex:", r.Title()) 234 } 235 236 } 237 238 func showusercommentlist() { 239 err := chkIsDir(bbshome) 240 if err != nil { 241 fmt.Printf("showusercommentlist: error: %v\n", err) 242 return 243 } 244 245 bbsDB, err := bbs.Open(driverName, "file://"+bbshome) 246 if err != nil { 247 fmt.Printf("showusercommentlist: open db: %v\n", err) 248 return 249 } 250 251 args := parseArgsToMap(flag.Args()) 252 userID := args["user_id"].(string) 253 254 records, err := bbsDB.GetUserCommentRecordFile(userID) 255 if err != nil { 256 fmt.Printf("showusercommentlist: GetUserCommentRecordFile: %v\n", err) 257 return 258 } 259 260 for _, r := range records { 261 fmt.Println("user comment record:", r.String()) 262 } 263 }