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 }