database

package
v0.1.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 22, 2023 License: AGPL-3.0 Imports: 13 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrPostContents = errors.New("invalid post contents")
	ErrPostRejected = errors.New("post was rejected")
)
View Source
var Engines = map[string]InitFunc{}

Functions

This section is empty.

Types

type Ban

type Ban struct {
	Target  string
	Reason  string
	Date    time.Time
	Expires time.Time
}

type Board

type Board struct {
	ID, Title, Description string
	Threads                int
}

type Database

type Database interface {
	// Board gets data about a board.
	Board(ctx context.Context, board string) (Board, error)

	// Boards returns a list of all boards.
	Boards(ctx context.Context) ([]Board, error)

	// Threads fetches all threads on a board.
	Threads(ctx context.Context, board string, page int) ([]Post, error)

	// Thread fetches all posts on a thread.
	Thread(ctx context.Context, board string, thread PostID, tail int, replies bool) ([]Post, error)

	// ThreadStat returns the number of posts and unique posters in any given thread.
	ThreadStat(ctx context.Context, board string, thread PostID) (int, int, error)

	// Post fetches a single post from a thread.
	Post(ctx context.Context, board string, post PostID) (Post, error)

	// FindAPID finds a post given its ActivityPub ID.
	FindAPID(ctx context.Context, board string, apid string) (Post, error)

	// Privilege returns the type of moderator username is.
	Privilege(ctx context.Context, username string) (ModType, error)

	// Reports returns a list of reports.
	Reports(ctx context.Context, withResolved bool) ([]Report, error)

	// BoardReports returns a list of reports specific to one board.
	BoardReports(ctx context.Context, board string, withResolved bool) ([]Report, error)

	// Audits returns a list of moderator actions.
	Audits(ctx context.Context) ([]ModerationAction, error)

	// News returns news. That's good news.
	News(ctx context.Context) ([]News, error)

	// Article gets a specific news article.
	Article(ctx context.Context, id int) (*News, error)

	// Moderators returns a list of currently registered moderators.
	Moderators(ctx context.Context) ([]Moderator, error)

	// Captchas returns captcha IDs.
	Captchas(ctx context.Context) ([]string, error)

	// Captcha returns a captcha.
	Captcha(ctx context.Context, id string) ([]byte, string, error)

	// Replies returns a list of replies to a post.
	Replies(ctx context.Context, board string, id PostID, reverse bool) ([]Post, error)

	// Following returns a list of Actors a board is following.
	Following(ctx context.Context, board string) ([]string, error)

	// Followers returns a list of Actors a board is being followed by.
	Followers(ctx context.Context, board string) ([]string, error)

	// Regexps returns a list of regular expressions for filtering posts.
	Regexps(ctx context.Context) ([]Regexp, error)

	// Banned checks to see if a user is banned.
	Banned(ctx context.Context, source string) (bool, time.Time, string, error)

	// AddFollow records an Actor as following a board.
	AddFollow(ctx context.Context, source string, board string) error

	// AddFollowing records a board is following an Actor.
	AddFollowing(ctx context.Context, board string, target string) error

	// AddRegexp adds a regular expression to the post filter.
	AddRegexp(ctx context.Context, regexp string) error

	// Ban bans a user.
	Ban(ctx context.Context, ban Ban, by string) error

	// SaveBoard updates data about a board, or creates a new one.
	SaveBoard(ctx context.Context, board Board) error

	// SavePost saves a post to the database.
	// If Post.ID is 0, one will be generated.
	// If Post.Thread is 0, it is considered a thread.
	SavePost(ctx context.Context, board string, post *Post) error

	// SaveModerator saves a moderator to the database, or updates an existing entry.
	SaveModerator(ctx context.Context, username, email, password string, priv ModType) error

	// SaveNews saves news.
	SaveNews(ctx context.Context, news *News) error

	// SaveCaptcha commits a captcha to the database.
	SaveCaptcha(ctx context.Context, id string, solution string, img []byte) error

	// FileReport files a new report for moderators to look at.
	FileReport(ctx context.Context, report Report) error

	// Resolve resolves a report.
	Resolve(ctx context.Context, reportID int) error

	// Solve checks a captcha.
	Solve(ctx context.Context, id, solution string) (bool, error)

	// AddReply links two posts together as a reply.
	AddReply(ctx context.Context, board string, from, to PostID) error

	// DeleteThread deletes a thread from the database and records a moderation action.
	// It will also delete all posts.
	DeleteThread(ctx context.Context, board string, thread PostID, modAction ModerationAction) error

	// DeletePost deletes a post from the database and records a moderation action.
	DeletePost(ctx context.Context, board string, post PostID, modAction ModerationAction) error

	// DeleteNews deletes news.
	DeleteNews(ctx context.Context, id int) error

	// DeleteModerator deletes a moderator.
	DeleteModerator(ctx context.Context, username string) error

	// DeleteFollow removes a follow from the "followers" entry from a board.
	DeleteFollow(ctx context.Context, source string, board string) error

	// DeleteFollowing removes a follow from the "following" entry from a board.
	DeleteFollowing(ctx context.Context, board string, target string) error

	// DeleteRegexp removes a regular expression from the post filter.
	DeleteRegexp(ctx context.Context, id int) error

	// PasswordCheck checks a moderator's password.
	PasswordCheck(ctx context.Context, username string, password string) (bool, error)

	// RecentPosts fetches the newest posts made on a board, and optionally, only posts made on this instance.
	RecentPosts(ctx context.Context, board string, limit int, local bool) ([]Post, error)

	// Close closes the database. This should only be called upon exit.
	Close() error
}

Database implements everything you might need in a textboard database. This should be generic enough to port to whatever engine you may like.

type InitFunc

type InitFunc func(arg string) (Database, error)

InitFunc is a function signature to make it easier to use any arbitrary database. Those who wish to implement a new database should create a new file in this package, give it a build tag, and provide an InitFunc by placing itself into the Engines map in the init function.

type ModType

type ModType uint8

ModType is an enum for moderator types

const (
	ModTypeJanitor ModType = iota
	ModTypeMod
	ModTypeAdmin
)

type ModerationAction

type ModerationAction struct {
	Author string
	Type   ModerationActionType
	Board  string
	Post   PostID
	Reason string

	Date time.Time
}

ModerationAction records any moderation action taken. This is used for transparency.

type ModerationActionType

type ModerationActionType uint8

ModerationActionType is an enum for moderation actions.

const (
	ModActionBan ModerationActionType = iota
	ModActionWarn
	ModActionDelete
)

type Moderator

type Moderator struct {
	Username  string
	Email     string
	Privilege ModType
}

type News

type News struct {
	ID int

	Author  string
	Subject string
	Content string

	Date time.Time
}

type Post

type Post struct {
	Thread PostID `json:"thread"`
	ID     PostID `json:"id"`

	Name     string `json:"name"`
	Tripcode string `json:"tripcode"`
	Subject  string `json:"subject"`

	Date     time.Time `json:"date"`
	Bumpdate time.Time // Set to above zero to bump if making a new post
	Raw      string    `json:"raw"`
	Content  string    `json:"content"`

	Source string `json:"source"`
	APID   string `json:"apid"` // ActivityPub ID

	// Replies is a slice that is optionally filled upon requesting a post.
	Replies []Post

	// Sage is a marker for incoming posts (i.e. never used when retriving
	// data) and if true, will not bump the thread to the top of the catalog.
	Sage bool `json:"sage"`

	// SJIS is true when the post is considered to be SJIS art.
	// The "sjis" class will be added to the post's content if this is true.
	SJIS bool `json:"sjis"`
}

Post contains data related to a single post. If this is a thread opening post, ID will be equal to Thread. ID does not have to be filled out; it will be done while saving to the database. It exists purely for the frontend.

func (Post) IsLocal

func (p Post) IsLocal() bool

IsLocal checks if a post was made from this instance or not.

func (*Post) Notify added in v0.1.2

func (p *Post) Notify(db Database, board string)

type PostID

type PostID uint64

PostID is the type of number used for posts. FChannel uses random strings for this, we use numbers (internally).

type Regexp

type Regexp struct {
	ID      int
	Pattern string
}

type Report

type Report struct {
	ID int

	Source string
	Board  string
	Post   PostID
	Reason string
	Date   time.Time

	Resolved bool
}

func (*Report) Notify added in v0.1.2

func (r *Report) Notify(db Database)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL