serverstats

package
v1.20.4 Latest Latest
Warning

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

Go to latest
Published: Aug 28, 2019 License: MIT Imports: 32 Imported by: 0

README

Server stats plugin for YAGPDB

Records and shows stats for individual servers.

Current stats

Simple temporary stats:

  • Messages last hour
  • Users joined/left today
  • Messages today, per channel with bar graphs
  • Current online users
  • Total amount of users
Planned soon

More peristent graphable stats:

  • Users joined/left day to day chart
  • Avg. users online day to day
  • Messages day to day per channel
Redis layout

To count 24h stats yagpdb stores things inside sorted sets with unix timestamp as score, it will then routinely walk over all stats and remove those with screos of less then current unix time - 24h, this might be expensive later on, if so i might have to figure out a better way.

guild_stats_msg_channel:{guildid} - sorted set: key: channelid:msg_id, score: unix timestamp guild_stats_members_changed:{guildid} - sorted set: key: joined|left:userid, score: unix timestamp

Documentation

Index

Constants

View Source
const (
	RedisKeyGuildMembersChanged = "servers_stats_guild_members_changed"
)
View Source
const (
	RedisKeyLastHourlyRan = "serverstats_last_hourly_worker_ran"
)

Variables

View Source
var DBSchemas = []string{
	`
CREATE TABLE IF NOT EXISTS server_stats_periods (
	id bigserial NOT NULL PRIMARY KEY,
	
	started  timestamptz,
	duration bigint,

	guild_id   bigint,
	user_id    bigint,
	channel_id bigint,
	count     bigint
);`,

	`CREATE INDEX IF NOT EXISTS serverstats_periods_guild_idx on server_stats_periods(guild_id);`,
	`CREATE INDEX IF NOT EXISTS started_x on server_stats_periods(started);`,

	`
CREATE TABLE IF NOT EXISTS server_stats_configs (
    guild_id BIGINT PRIMARY KEY,
    created_at TIMESTAMP WITH TIME ZONE,
    updated_at TIMESTAMP WITH TIME ZONE,
    public BOOLEAN,
    ignore_channels TEXT
);`,

	`
CREATE TABLE IF NOT EXISTS server_stats_member_periods (
	id BIGSERIAL PRIMARY KEY,
	guild_id BIGINT NOT NULL,

	created_at TIMESTAMP WITH TIME ZONE NOT NULL,

	num_members BIGINT NOT NULL,
	joins BIGINT NOT NULL,
	leaves BIGINT NOT NULL,
	max_online BIGINT NOT NULL,

	UNIQUE(guild_id, created_at)
);`,

	`CREATE INDEX IF NOT EXISTS server_stats_member_periods_guild_idx on server_stats_member_periods(guild_id);`,
	`CREATE INDEX IF NOT EXISTS server_stats_member_periods_created_at_idx on server_stats_member_periods(created_at);`,
}
View Source
var WebStatsCache = rcache.New(cacheChartFetcher, time.Minute)

Functions

func HandleGuildCreate

func HandleGuildCreate(evt *eventsystem.EventData)

func HandleMemberAdd

func HandleMemberAdd(evt *eventsystem.EventData)

func HandleMemberRemove

func HandleMemberRemove(evt *eventsystem.EventData)

func HandleMessageCreate

func HandleMessageCreate(evt *eventsystem.EventData) (retry bool, err error)

func HandleSaveStatsSettings added in v1.4.1

func HandleSaveStatsSettings(w http.ResponseWriter, r *http.Request) (web.TemplateData, error)

func HandleStatsCharts added in v1.16.0

func HandleStatsCharts(w http.ResponseWriter, r *http.Request, isPublicAccess bool) interface{}

func HandleStatsHtml

func HandleStatsHtml(w http.ResponseWriter, r *http.Request, isPublicAccess bool) (web.TemplateData, error)

Somewhat dirty - should clean up this mess sometime

func HandleStatsJson

func HandleStatsJson(w http.ResponseWriter, r *http.Request, isPublicAccess bool) interface{}

func MarkGuildAsToBeChecked

func MarkGuildAsToBeChecked(guildID int64)

func ProcessTempStats

func ProcessTempStats(full bool)

ProcessTempStats moves stats from redis to postgres batched up

func RedisKeyChannelMessages added in v1.16.0

func RedisKeyChannelMessages(guildID int64) string

func RegisterPlugin

func RegisterPlugin()

func RoundHour added in v1.16.0

func RoundHour(t time.Time) time.Time

RoundHour rounds a time.Time down to the hour

func SetUpdateMemberStatsPeriod added in v1.16.0

func SetUpdateMemberStatsPeriod(guildID int64, memberIncr int, numMembers int)

func UpdateGuildStats

func UpdateGuildStats(guildID int64) error

Updates the stats on a specific guild, removing expired stats

Types

type CacheKey added in v1.7.4

type CacheKey int
const (
	CacheKeyConfig CacheKey = iota
)

type ChannelStats

type ChannelStats struct {
	Name  string `json:"name"`
	Count int64  `json:"count"`
}

type ChartResponse added in v1.16.0

type ChartResponse struct {
	Days        int                       `json:"days"`
	MemberData  []*MemberChartDataPeriod  `json:"member_chart_data"`
	MessageData []*MessageChartDataPeriod `json:"message_chart_data"`
}

func CacheGetCharts added in v1.16.0

func CacheGetCharts(guildID int64, days int) *ChartResponse

type DailyStats added in v1.16.0

type DailyStats struct {
	ChannelMessages map[string]*ChannelStats `json:"channels_messages"`
	JoinedDay       int                      `json:"joined_day"`
	LeftDay         int                      `json:"left_day"`
	Online          int                      `json:"online_now"`
	TotalMembers    int                      `json:"total_members_now"`
}

func RetrieveDailyStats added in v1.16.0

func RetrieveDailyStats(guildID int64) (*DailyStats, error)

func RetrieveRedisStats

func RetrieveRedisStats(guildID int64) (*DailyStats, error)

type FormData

type FormData struct {
	Public         bool
	IgnoreChannels []int64 `valid:"channel,false"`
}

type MemberChartDataPeriod added in v1.16.0

type MemberChartDataPeriod struct {
	T          time.Time `json:"t"`
	Joins      int       `json:"joins"`
	Leaves     int       `json:"leaves"`
	NumMembers int       `json:"num_members"`
	MaxOnline  int       `json:"max_online"`
}

func RetrieveMemberChartStats added in v1.16.0

func RetrieveMemberChartStats(guildID int64, days int) ([]*MemberChartDataPeriod, error)

type MessageChartDataPeriod added in v1.16.0

type MessageChartDataPeriod struct {
	T            time.Time `json:"t"`
	MessageCount int       `json:"message_count"`
}

func RetrieveMessageChartData added in v1.16.0

func RetrieveMessageChartData(guildID int64, days int) ([]*MessageChartDataPeriod, error)

type Plugin

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

func (*Plugin) AddCommands added in v1.4.1

func (p *Plugin) AddCommands()

func (*Plugin) BotInit added in v1.4.1

func (p *Plugin) BotInit()

func (*Plugin) InitWeb

func (p *Plugin) InitWeb()

func (*Plugin) LoadServerHomeWidget added in v1.17.0

func (p *Plugin) LoadServerHomeWidget(w http.ResponseWriter, r *http.Request) (web.TemplateData, error)

func (*Plugin) PluginInfo added in v1.17.0

func (p *Plugin) PluginInfo() *common.PluginInfo

func (*Plugin) RunBackgroundWorker added in v1.11.0

func (p *Plugin) RunBackgroundWorker()

func (*Plugin) RunCleanup added in v1.16.0

func (p *Plugin) RunCleanup()

func (*Plugin) StopBackgroundWorker added in v1.11.0

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

func (*Plugin) UpdateStatsLoop added in v1.11.0

func (p *Plugin) UpdateStatsLoop()

type ServerStatsConfig

type ServerStatsConfig struct {
	Public         bool
	IgnoreChannels string

	ParsedChannels []int64
}

ServerStatsConfig represents a configuration for a server reason we dont reference the model directly is because i need to figure out a way to migrate them over to the new schema, painlessly.

func BotCachedFetchGuildConfig added in v1.7.4

func BotCachedFetchGuildConfig(ctx context.Context, gs *dstate.GuildState) (*ServerStatsConfig, error)

func GetConfig

func GetConfig(ctx context.Context, GuildID int64) (*ServerStatsConfig, error)

func (*ServerStatsConfig) ParseChannels added in v1.7.4

func (s *ServerStatsConfig) ParseChannels()

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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