github.com/Ptt-official-app/go-bbs@v0.12.0/pttbbs/pttbbs.go (about)

     1  package pttbbs
     2  
     3  import (
     4  	"github.com/Ptt-official-app/go-bbs"
     5  
     6  	"fmt"
     7  	"io/ioutil"
     8  	"os"
     9  	"strings"
    10  )
    11  
    12  type Connector struct {
    13  	home string
    14  }
    15  
    16  func init() {
    17  	bbs.Register("pttbbs", &Connector{})
    18  }
    19  
    20  // Open connect a file directory or SHMs, dataSourceName pointer to bbs home
    21  // And it can append argument for SHM
    22  // for example `file:///home/bbs/?UTMP=1993`
    23  func (c *Connector) Open(dataSourceName string) error {
    24  
    25  	if strings.HasPrefix(dataSourceName, "file://") {
    26  		s := dataSourceName[len("file://"):]
    27  		seg := strings.Split(s, "?")
    28  		c.home = seg[0]
    29  	} else {
    30  		c.home = dataSourceName
    31  	}
    32  	return nil
    33  }
    34  
    35  func (c *Connector) GetUserRecordsPath() (string, error) {
    36  	return GetPasswdsPath(c.home)
    37  }
    38  
    39  func (c *Connector) ReadUserRecordsFile(filename string) ([]bbs.UserRecord, error) {
    40  	rec, err := OpenUserecFile(filename)
    41  	ret := make([]bbs.UserRecord, len(rec))
    42  	for i, v := range rec {
    43  		ret[i] = v
    44  	}
    45  	return ret, err
    46  }
    47  
    48  func (c *Connector) GetUserDraftPath(userID, draftID string) (string, error) {
    49  	return GetUserDraftPath(c.home, userID, draftID)
    50  }
    51  
    52  func (c *Connector) GetUserFavoriteRecordsPath(userID string) (string, error) {
    53  	return GetUserFavoritePath(c.home, userID)
    54  }
    55  
    56  func (c *Connector) ReadUserFavoriteRecordsFile(filename string) ([]bbs.FavoriteRecord, error) {
    57  	if _, err := os.Stat(filename); err != nil {
    58  		return []bbs.FavoriteRecord{}, nil
    59  	}
    60  
    61  	rec, err := OpenFavFile(filename)
    62  	if err != nil {
    63  		return nil, fmt.Errorf("pttbbs: OpenFavFile error: %w", err)
    64  	}
    65  
    66  	bPath, err := c.GetBoardRecordsPath()
    67  	if err != nil {
    68  		return nil, fmt.Errorf("pttbbs: GetBoardRecordsPath error: %w", err)
    69  	}
    70  	br, err := OpenBoardHeaderFile(bPath)
    71  	if err != nil {
    72  		return nil, fmt.Errorf("pttbbs: ReadBoardRecordsFile error: %w", err)
    73  	}
    74  	appendBoardID(rec.Folder, br)
    75  	ret := make([]bbs.FavoriteRecord, len(rec.Folder.FavItems))
    76  	for i, v := range rec.Folder.FavItems {
    77  		ret[i] = v
    78  	}
    79  	return ret, err
    80  }
    81  
    82  func appendBoardID(folder *FavFolder, brd []*BoardHeader) {
    83  	for _, item := range folder.FavItems {
    84  
    85  		switch item.Item.(type) {
    86  		case *FavBoardItem:
    87  			bid := item.Item.(*FavBoardItem).BoardID - 1
    88  			item.Item.(*FavBoardItem).boardID = brd[bid].BrdName
    89  		case *FavFolderItem:
    90  			appendBoardID(item.Item.(*FavFolderItem).ThisFolder, brd)
    91  		case *FavLineItem:
    92  			break
    93  		default:
    94  			// logger.Warningf("parseFavoriteFolderItem unknown favItem type")
    95  		}
    96  	}
    97  
    98  }
    99  
   100  func (c *Connector) GetBoardRecordsPath() (string, error) {
   101  	return GetBoardPath(c.home)
   102  }
   103  
   104  func (c *Connector) ReadBoardRecordsFile(path string) ([]bbs.BoardRecord, error) {
   105  	rec, err := OpenBoardHeaderFile(path)
   106  	ret := make([]bbs.BoardRecord, len(rec))
   107  	for i, v := range rec {
   108  		ret[i] = v
   109  	}
   110  	return ret, err
   111  }
   112  
   113  func (c *Connector) GetBoardArticleRecordsPath(boardID string) (string, error) {
   114  	return GetBoardArticlesDirectoryPath(c.home, boardID)
   115  }
   116  
   117  func (c *Connector) ReadArticleRecordsFile(filename string) ([]bbs.ArticleRecord, error) {
   118  	var fileHeaders []*FileHeader
   119  	var err error
   120  	fileHeaders, err = OpenFileHeaderFile(filename)
   121  	if err != nil {
   122  		return nil, err
   123  	}
   124  	ret := make([]bbs.ArticleRecord, len(fileHeaders))
   125  	for i, v := range fileHeaders {
   126  		ret[i] = v
   127  	}
   128  	return ret, err
   129  }
   130  
   131  func (c *Connector) GetBoardTreasureRecordsPath(boardID string, treasureID []string) (string, error) {
   132  	return GetBoardTreasuresDirectoryPath(c.home, boardID, treasureID)
   133  }
   134  
   135  func (c *Connector) GetBoardArticleFilePath(boardID string, filename string) (string, error) {
   136  	return GetBoardArticleFilePath(c.home, boardID, filename)
   137  }
   138  
   139  func (c *Connector) GetBoardTreasureFilePath(boardID string, treasureID []string, filename string) (string, error) {
   140  	return GetBoardTreasureFilePath(c.home, boardID, treasureID, filename)
   141  }
   142  
   143  // ReadBoardArticleFile returns raw file of specific filename article.
   144  func (c *Connector) ReadBoardArticleFile(filename string) ([]byte, error) {
   145  	file, err := os.Open(filename)
   146  	if err != nil {
   147  		return nil, fmt.Errorf("pttbbs: open file error: %v", err)
   148  	}
   149  	defer file.Close()
   150  	buf, err := ioutil.ReadAll(file)
   151  	if err != nil {
   152  		return nil, fmt.Errorf("pttbbs: readfile error: %v", err)
   153  	}
   154  	return buf, err
   155  }