Documentation
¶
Index ¶
- Constants
- Variables
- func Big5ToUtf8(big5 []byte) (utf8 string)
- func DateMinStrToTime(dateTimeStr string) (time.Time, error)
- func DateStrToTime(dateStr string) (time.Time, error)
- func DateYearTimeStrToTime(dateYearTimeStr string) (time.Time, error)
- func ErrRecover(err interface{}) error
- func InitConfig() (err error)
- func IsReplyID(commentID CommentID) bool
- func NewDateTime(year int, month time.Month, day int, hr int, minute int, second int) time.Time
- func SetIsTest(pkgName string)
- func StringsSplitAsRune(str string, sep string) (strs []string)
- func UnsetIsTest(pkgName string)
- func Utf8ToBig5(utf8 string) (big5 []byte)
- type BoardArticleID
- type ClientType
- type Color
- type ColorMap
- type CommentID
- type ContentID
- type ManArticleID
- type NanoTS
- type ReadStatus
- type Rune
- type ServiceMode
- type Time8
Constants ¶
View Source
const ( TS_TO_NANO_TS = NanoTS(1000000000) // 10^9 MIN_TO_NANO_TS = NanoTS(60) * TS_TO_NANO_TS YEAR_NANO_TS = NanoTS(365*86400) * TS_TO_NANO_TS )
Variables ¶
View Source
var ( SERVICE_MODE = DEV // can be DEV, PRODUCTION, INFO, DEBUG HTTP_SCHEME = "http://" HTTP_HOST = "localhost:3457" // serving http-host URL_PREFIX = "http://localhost:3457/bbs" // advertising url-prefix (for constructing article url) BACKEND_PREFIX = "http://localhost:3456/v1" // backend url-prefix FRONTEND_PREFIX = "http://localhost:5173" // frontend-prefix, email API_PREFIX = "/api" // api-prefix REGISTER_USER_URL = "http://localhost:3457/api/account/register" INIT_URL = "http://localhost:5173/init" ERR_URL = "http://localhost:5173/error" ZK_PREFIX = "http://localhost:3458" EMAIL_URL = "http://localhost:3457" // for email url PTTSYSOP = bbs.UUserID("SYSOP") BBSNAME = "新批踢踢" // site-name BBSNAME_EN = "NeoPTT" // English site-name SENDER_SUFFIX = "管理員" // for utils.SendEmail // web STATIC_DIR = "docs/examples" ALLOW_ORIGINS = []string{"*"} BLOCKED_REFERERS = []string{} IS_ALLOW_CROSSDOMAIN = true COOKIE_DOMAIN = "localhost" TOKEN_COOKIE_SUFFIX = "Secure;" CSRF_SECRET = []byte("test_csrf_secret") CSRF_TOKEN = "csrftoken" CSRF_TOKEN_TS = 3600 // csrf-token expires in 1 hour. CSRF_TOKEN_TS_DURATION = time.Duration(CSRF_TOKEN_TS) * time.Second ACCESS_TOKEN_NAME = "token" // access-token-name in cookie ACCESS_TOKEN_EXPIRE_TS = 86400 ACCESS_TOKEN_EXPIRE_TS_DURATION = time.Duration(ACCESS_TOKEN_EXPIRE_TS) * time.Second ACCESS_TOKEN_SECRET = []byte("access_token_secret") REFRESH_TOKEN_EXPIRE_TS = 86400 REFRESH_TOKEN_EXPIRE_TS_DURATION = time.Duration(REFRESH_TOKEN_EXPIRE_TS) * time.Second REFRESH_TOKEN_SECRET = []byte("refresh_token_secret") IS_OVER_18_NAME = "over18" IS_OVER_18_VALUE = "1" // email EMAIL_TOKEN_NAME = "token" // email-token in email-url EMAIL_FROM = "noreply@localhost" EMAIL_SERVER = "localhost:25" EMAILTOKEN_TITLE_TEMPLATE = "增加 __BBSNAME__ 的聯絡信箱 (Adding __BBSNAME_EN__ Contact Email)" EMAILTOKEN_TITLE = "增加 " + BBSNAME + " 的聯絡信箱 (Adding " + BBSNAME_EN + " Contact Email)" EMAILTOKEN_TEMPLATE = "docs/etc/emailtoken.template" EMAILTOKEN_TEMPLATE_CONTENT = "__EMAIL__, __USER__, __URL__" IDEMAILTOKEN_TITLE_TEMPLATE = "更換 __BBSNAME__ 的認證信箱 (Updating __BBSNAME_EN__ Identity Email)" IDEMAILTOKEN_TITLE = "更換 " + BBSNAME + " 的認證信箱 (Updating " + BBSNAME_EN + " Identity Email)" IDEMAILTOKEN_TEMPLATE = "docs/etc/idemailtoken.template" IDEMAILTOKEN_TEMPLATE_CONTENT = "__EMAIL__, __USER__, __URL__" ATTEMPT_REGISTER_USER_TITLE_TEMPLATE = "註冊 __BBSNAME__ 的驗證連結 (Registering __BBSNAME_EN__ Verification Link)" ATTEMPT_REGISTER_USER_TITLE = "註冊 " + BBSNAME + " 的驗證連結 (Registering " + BBSNAME_EN + " Verification Link)" ATTEMPT_REGISTER_USER_TEMPLATE = "docs/etc/attemptregister.template" ATTEMPT_REGISTER_USER_TEMPLATE_CONTENT = "__EMAIL__, __USER__, __URL__" EXPIRE_ATTEMPT_REGISTER_USER_EMAIL_TS = 300 EXPIRE_ATTEMPT_REGISTER_USER_EMAIL_TS_DURATION = time.Duration(EXPIRE_ATTEMPT_REGISTER_USER_EMAIL_TS) * time.Second // 5 mins ATTEMPT_LOGIN_TITLE_TEMPLATE = "登入 __BBSNAME__ 的驗證碼 (Login __BBSNAME_EN__ Verification Code)" ATTEMPT_LOGIN_TITLE = "登入 " + BBSNAME + " 的驗證碼 (Login " + BBSNAME_EN + " Verification Code)" ATTEMPT_LOGIN_TEMPLATE = "docs/etc/attemptlogin.template" ATTEMPT_LOGIN_TEMPLATE_CONTENT = "__USER__, __TOKEN__" EXPIRE_ATTEMPT_LOGIN_EMAIL_TS = 300 EXPIRE_ATTEMPT_LOGIN_EMAIL_TS_DURATION = time.Duration(EXPIRE_ATTEMPT_LOGIN_EMAIL_TS) * time.Second // 5 mins EXPIRE_USER_ID_EMAIL_IS_SET_NANO_TS = NanoTS(100 * 86400 * 1000000000) // 100 days EXPIRE_USER_EMAIL_IS_SET_NANO_TS = NanoTS(1 * 86400 * 1000000000) // 1 day EXPIRE_USER_ID_EMAIL_IS_NOT_SET_NANO_TS = NanoTS(300 * 1000000000) // 5 mins EXPIRE_USER_EMAIL_IS_NOT_SET_NANO_TS = NanoTS(300 * 1000000000) // 5 mins // 2fa IS_2FA = true MAX_2FA_TOKEN int64 = 1000000 MAX_2FA_TOKEN_STR_PROMPT = "%06d" // big5 BIG5_TO_UTF8 = "types/uao250-b2u.big5.txt" UTF8_TO_BIG5 = "types/uao250-u2b.big5.txt" AMBCJK = "types/ambcjk.big5.txt" // time-location TIME_LOCATION = "Asia/Taipei" // carriage-return IS_CARRIAGE_RETURN = true // is-all-guest IS_ALL_GUEST = false // pttweb-hotboard-url PTTWEB_HOTBOARD_URL = "http://localhost:3457/static/ptt_cc_websites/bbs/HotBoards.html" // pttweb-base-url (excluding bbs/, man/, cls/) PTTWEB_BASE_URL = "http://localhost:3457/static/ptt_cc_websites" // expire-http-request-ts EXPIRE_HTTP_REQUEST_TS = 10 // max-popular-boards MAX_POPULAR_BOARDS = 128 BRDNAME_WHITE_LIST_MAP_FILENAME = "" BRDNAME_BLACK_LIST_MAP_FILENAME = "" SLEEP_RETRY_LOAD_POPULAR_BOARDS_TS = 3600 SLEEP_RETRY_LOAD_POPULAR_BOARDS_TS_DURATION = time.Duration(SLEEP_RETRY_LOAD_POPULAR_BOARDS_TS) * time.Second SLEEP_RETRY_LOAD_GENERAL_ARTICLES_TS = 3600 SLEEP_RETRY_LOAD_GENERAL_ARTICLES_TS_DURATION = time.Duration(SLEEP_RETRY_LOAD_GENERAL_ARTICLES_TS) * time.Second SLEEP_RETRY_LOAD_ARTICLE_DETAILS_TS = 3600 SLEEP_RETRY_LOAD_ARTICLE_DETAILS_TS_DURATION = time.Duration(SLEEP_RETRY_LOAD_ARTICLE_DETAILS_TS) * time.Second )
View Source
var ( DefaultColor = Color{Foreground: COLOR_FOREGROUND_WHITE, Background: COLOR_BACKGROUND_BLACK} InvalidColor = Color{Foreground: COLOR_INVALID, Background: COLOR_INVALID} ResetColor = Color{Foreground: COLOR_FOREGROUND_WHITE, Background: COLOR_BACKGROUND_BLACK, IsReset: true} )
View Source
var (
TIMEZONE, _ = time.LoadLocation(TIME_LOCATION)
VERSION = ""
GIT_VERSION = ""
LEN_DATE_YEAR_TIME_STR = len("01/02/2006 15:04:05")
LEN_DATE_MIN_STR = len("2006/01/02 15:04")
COLOR_PREFIX_BYTES = []byte("\x1b[")
COLOR_POSTFIX_BYTES = []byte("m")
COLOR_RESET_BYTES = []byte("\x1b[m")
DEFAULT_LEN_COLOR_BYTES = 20 // \x1b[0;1;5;37;40m
POSTTIME_REJECT = 15
TEMPLATE_EMAIL = "__EMAIL__"
TEMPLATE_TOKEN = "__TOKEN__"
TEMPLATE_USER = "__USER__"
TEMPLATE_URL = "__URL__"
TEMPLATE_BBSNAME = "__BBSNAME__"
TEMPLATE_BBSNAME_EN = "__BBSNAME_EN__"
ZK_USER_ID_KEY = "PTTBBS_USER_ID"
)
Functions ¶
func Big5ToUtf8 ¶
func DateMinStrToTime ¶
DateMinStrToTime
(YYYY/)MM/DD hh:mm
used in comment.
golang requires year to parse TIMEZONE with CST. https://github.com/golang/go/issues/34101
func DateStrToTime ¶
DateStrToTime
(YYYY/)MM/DD
used in old-comment.
golang requires year to parse TIMEZONE with CST. https://github.com/golang/go/issues/34101
func ErrRecover ¶ added in v0.43.0
func ErrRecover(err interface{}) error
func InitConfig ¶
func InitConfig() (err error)
func NewDateTime ¶
func UnsetIsTest ¶
func UnsetIsTest(pkgName string)
func Utf8ToBig5 ¶
Types ¶
type BoardArticleID ¶
type BoardArticleID string
func ToBoardArticleID ¶
func ToBoardArticleID(boardID bbs.BBoardID, articleID bbs.ArticleID) BoardArticleID
func (BoardArticleID) Deserialize ¶
type ClientType ¶
type ClientType string
const ( CLIENT_TYPE_APP ClientType = "app" CLIENT_TYPE_WEB ClientType = "web" )
type Color ¶
type Color struct {
Foreground ColorMap `json:"foreground" bson:"f"`
Background ColorMap `json:"background" bson:"b"`
Blink bool `json:"blink" bson:"k"`
Highlight bool `json:"highlight" bson:"h"`
IsReset bool `json:"reset" bson:"r"`
}
func (*Color) BytesWithPreColor ¶
type ColorMap ¶
type ColorMap int8
const ( COLOR_FOREGROUND_BLACK ColorMap = 30 COLOR_FOREGROUND_RED ColorMap = 31 COLOR_FOREGROUND_GREEN ColorMap = 32 COLOR_FOREGROUND_YELLOW ColorMap = 33 COLOR_FOREGROUND_BLUE ColorMap = 34 COLOR_FOREGROUND_MAGENTA ColorMap = 35 COLOR_FOREGROUND_CYAN ColorMap = 36 COLOR_FOREGROUND_WHITE ColorMap = 37 COLOR_BACKGROUND_BLACK ColorMap = 40 COLOR_BACKGROUND_RED ColorMap = 41 COLOR_BACKGROUND_GREEN ColorMap = 42 COLOR_BACKGROUND_YELLOW ColorMap = 43 COLOR_BACKGROUND_BLUE ColorMap = 44 COLOR_BACKGROUND_MAGENTA ColorMap = 45 COLOR_BACKGROUND_CYAN ColorMap = 46 COLOR_BACKGROUND_WHITE ColorMap = 47 COLOR_INVALID ColorMap = -1 )
type CommentID ¶
type CommentID string
CommentID
owner-id is embedded in md5
XXX currently it's very hard to maintain the comment-id. if we do comment-id only based on MD5:
got duplicated md5-id if the owner posts the same comments within 1 min.
if we add the inferred CreateTime into the comment-id:
the CreateTime may be changed if the author deletes some other comments within same minute.
func ToCommentID ¶
type ContentID ¶
type ContentID string
ContentID
ContentID is always queried / updated with ArticleID, ManArticleID. No need to add boardID and articleID inside ContentID.
func ToContentID ¶
type ManArticleID ¶
type ManArticleID string
ManArticleID
func (ManArticleID) ToCreateTime ¶
func (m ManArticleID) ToCreateTime() (createTime NanoTS)
type NanoTS ¶
type NanoTS int64
func Base64ToNanoTS ¶
func Time4ToNanoTS ¶
func Time4ToNanoTS(t pttbbstypes.Time4) NanoTS
func TimeToNanoTS ¶
func (NanoTS) ToTime4 ¶
func (t NanoTS) ToTime4() pttbbstypes.Time4
type ReadStatus ¶
type ReadStatus uint8
const ( READ_STATUS_UNREAD ReadStatus = 0 READ_STATUS_CREATE_TIME ReadStatus = 1 READ_STATUS_COMMENT_TIME ReadStatus = 2 READ_STATUS_MTIME ReadStatus = 3 )
func (ReadStatus) String ¶
func (r ReadStatus) String() string
type Rune ¶
type Rune struct {
Utf8 string `json:"text" bson:"utf8"` // utf8-string
Big5 []byte `json:"-" bson:"big5"` // big5-bytes, stored in db for debugging.
DBCS []byte `json:"-" bson:"dbcs"` // dbcs-bytes, stored in db for concat and debugging.
DBCSStr string `json:"-" bson:"dbcsstr"` // dbcs-str, stored in db for concat and debugging.
Color0 Color `json:"color0" bson:"color0"`
Color1 Color `json:"color1" bson:"color1"`
}
func (*Rune) Big5ToUtf8 ¶
func (r *Rune) Big5ToUtf8()
func (*Rune) Utf8ToBig5 ¶
func (r *Rune) Utf8ToBig5()
func (*Rune) Utf8ToDBCS ¶
type ServiceMode ¶
type ServiceMode string
const ( // in DEV mode, client_secret is always test_client_secret, log set to INFO DEV ServiceMode = "DEV" // in PRODUCTION mode, log set to WARN PRODUCTION ServiceMode = "PRODUCTION" // in INFO mode, log set to INFO INFO ServiceMode = "INFO" // in DEBUG mode, log set to DEBUG DEBUG ServiceMode = "DEBUG" // in test mode TEST ServiceMode = "TEST" )
Click to show internal directories.
Click to hide internal directories.