reddit

package
v0.28.1 Latest Latest
Warning

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

Go to latest
Published: Apr 3, 2018 License: MIT Imports: 27 Imported by: 0

README

Reddit plugin for YAGPDB

How the feed works

Uses the same method mee6 uses for reliable cost effective scanning of all reddit posts.

works by by manually checking 100 ids per couple of second via the /api/info.json?id=t3_id1,t3_id2 etc route.

It then updates the cursor to the highest returned post id, continuing from that next call.

I don't believe this method has any bad parts at this moment, it seems to be more than enough even at a 5 second interval, unlike the polling of /all/new this does not appear to have any limitations on old posts and also shows absolutely all posts.

Redis layout:

reddit_last_post_id id of last post processed

global_subreddit_watch:sub Type: hash Key: {{guild}}:{{watchid}} Value: SubredditWatchItem

guild_subreddit_watch:guildid Type: hash Key: {{watchid}} Value: SubredditWatchItem

watchid is a per guild increasing id for items

Documentation

Index

Constants

View Source
const (
	// Max feeds per guild
	GuildMaxFeeds = 100
)

Variables

View Source
var (
	ClientID     = os.Getenv("YAGPDB_REDDIT_CLIENTID")
	ClientSecret = os.Getenv("YAGPDB_REDDIT_CLIENTSECRET")
	RedirectURI  = os.Getenv("YAGPDB_REDDIT_REDIRECT")
	RefreshToken = os.Getenv("YAGPDB_REDDIT_REFRESHTOKEN")
)
View Source
var KeyLastScannedPostID = "reddit_last_post_id"

Functions

func CreatePostEmbed

func CreatePostEmbed(post *reddit.Link) *discordgo.MessageEmbed

func Dir

func Dir(useLocal bool, name string) http.FileSystem

Dir returns a http.Filesystem for the embedded assets on a given prefix dir. If useLocal is true, the filesystem's contents are instead used.

func FS

func FS(useLocal bool) http.FileSystem

FS returns a http.Filesystem for the embedded assets. If useLocal is true, the filesystem's contents are instead used.

func FSByte

func FSByte(useLocal bool, name string) ([]byte, error)

FSByte returns the named file from the embedded assets. If useLocal is true, the filesystem's contents are instead used.

func FSMustByte

func FSMustByte(useLocal bool, name string) []byte

FSMustByte is the same as FSByte, but panics if name is not present.

func FSMustString

func FSMustString(useLocal bool, name string) string

FSMustString is the string version of FSMustByte.

func FSString

func FSString(useLocal bool, name string) (string, error)

FSString is the string version of FSByte.

func HandleModify

func HandleModify(w http.ResponseWriter, r *http.Request) interface{}

func HandleNew

func HandleNew(w http.ResponseWriter, r *http.Request) interface{}

func HandleReddit

func HandleReddit(w http.ResponseWriter, r *http.Request) interface{}

func HandleRemove

func HandleRemove(w http.ResponseWriter, r *http.Request) interface{}

func RegisterPlugin

func RegisterPlugin()

func UserAgent

func UserAgent() string

Types

type CtxKey

type CtxKey int
const (
	CurrentConfig CtxKey = iota
)

type Form

type Form struct {
	Subreddit string `schema:"subreddit" valid:",1,100"`
	Channel   string `schema:"channel" valid:"channel,false`
	ID        int    `schema:"id"`
}

type Plugin

type Plugin struct {
	// contains filtered or unexported fields
}

func (*Plugin) HandleMQueueError

func (p *Plugin) HandleMQueueError(elem *mqueue.QueuedElement, err error)

Remove feeds if they don't point to a proper channel

func (*Plugin) InitBot

func (p *Plugin) InitBot()

func (*Plugin) InitWeb

func (p *Plugin) InitWeb()

func (*Plugin) Name

func (p *Plugin) Name() string

func (*Plugin) RemoveGuild

func (p *Plugin) RemoveGuild(c *redis.Client, g int64) error

func (*Plugin) StartFeed

func (p *Plugin) StartFeed()

func (*Plugin) Status

func (p *Plugin) Status(client *redis.Client) (string, string)

func (*Plugin) StopFeed

func (p *Plugin) StopFeed(wg *sync.WaitGroup)

type PostFetcher

type PostFetcher struct {
	LastID int64
	// contains filtered or unexported fields
}

func NewPostFetcher

func NewPostFetcher(redditClient *reddit.Client, redisClient *redis.Client) *PostFetcher

func (*PostFetcher) GetNewPosts

func (p *PostFetcher) GetNewPosts() ([]*reddit.Link, error)

func (*PostFetcher) InitCursor

func (p *PostFetcher) InitCursor() (int64, error)

type RedditIdSlice

type RedditIdSlice []string

func (RedditIdSlice) Len

func (r RedditIdSlice) Len() int

Len is the number of elements in the collection.

func (RedditIdSlice) Less

func (r RedditIdSlice) Less(i, j int) bool

Less reports whether the element with index i should sort before the element with index j.

func (RedditIdSlice) Swap

func (r RedditIdSlice) Swap(i, j int)

Swap swaps the elements with indexes i and j.

type SubredditWatchItem

type SubredditWatchItem struct {
	Sub     string `json:"sub"`
	Guild   string `json:"guild"`
	Channel string `json:"channel"`
	ID      int    `json:"id"`
}

func FindWatchItem

func FindWatchItem(source []*SubredditWatchItem, id int) *SubredditWatchItem

func GetConfig

func GetConfig(client *redis.Client, key string) ([]*SubredditWatchItem, error)

func (*SubredditWatchItem) Remove

func (item *SubredditWatchItem) Remove(client *redis.Client) error

func (*SubredditWatchItem) Set

func (item *SubredditWatchItem) Set(client *redis.Client) error

Jump to

Keyboard shortcuts

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