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  }