User:Yapperbot/FRS/Documentation/godoc/frslist

package frslist // import "yapperbot-frs/src/frslist"

VARIABLES

var list map[string][]*FRSUser list is the overall list of FRSUsers mapped to their headers.

var listHeaders []string listHeaders is just a boring old list of headers, we have a getter for it   later. It's used to keep track of which headers we have.

var listParserRegex *regexp.Regexp listParserRegex looks at the Feedback Request Service list, and finds each header and its users.

var randomGenerator *rand.Rand randomGenerator is our random number generator for this function, separated so we can separately seed it.

var sentCount map[string]map[string]uint16 // {header: {user: count sent}} sentCount maps headers down to users, and then users down to the number of   messages they've received this month.

var sentCountMux sync.Mutex sentCountMux is a simple mutex to make sure that, if we ever add goroutines, we don't start overwriting SentCount simultaneously.

var userParserRegex *regexp.Regexp userParserRegex looks over the contents of a FRS list header, and finds each user within the header.

FUNCTIONS

func FinishRun(w *mwclient.Client) FinishRun for now just calls saveSentCounts, but could do something else too in future

func GetListHeaders []string GetListHeaders is a simple getter for listHeaders

func Populate Populate sets up the FRSList list as appropriate for the start of the program.

func calculateMedian(calculatedWeights []float64) (float64, bool) calculateMedian takes a slice of float64s and returns the median if there is   one, and a bool indicating if a median could be calculated (i.e. if the    given slice has a length greater than zero).

func deserializeSentCount(json *jason.Object) (sc map[string]map[string]uint16) deserializeSentCount takes a jason JSON object containing the SentCount.json information, and adds the sent counts into a map, mapping headers to   usernames and usernames to numbers of messages sent. It returns this map as   a map[string]map[string]uint16.

func init func populateFrsList string populateFrsList fetches the wikitext of the FRS subscriptions page, and processes the page against the listParserRegex and userParserRegex. Together, those parse the headers in the file, along with the users that are subscribed, turning them into FRSUser objects and storing them in `list`.

func populateSentCount populateSentCount fetches the SentCount page, and checks it's of the right month. If it's a previous month, then it just leaves the `sentCount` map blank; if it's the same month listed on the JSON file, it will parse the JSON and load it into `sentCount`.

func saveSentCounts(w *mwclient.Client) saveSentCounts serializes our `sentCount` map into JSON, so we can save it   on-wiki and load it again when we need to for the next run.

TYPES

type FRSUser struct { Username string Header  string Limit   uint16 Limited bool }   An FRSUser is a struct representing a user who has signed up for the FRS. A   single username may have multiple FRSUser objects; each corresponds to an    individual subscription.

func GetUsersFromHeaders(headers []string, allHeader string, n int) (returnedUsers []*FRSUser) GetUsersFromHeaders takes a list of headers and an integer number of users n, and returns a randomly selected portion of the users from the headers, with a total size of maximum n. It won't pick the same user twice, and weights the users based on how far through their limit they are, in an   attempt to spread things out a bit. It may pick less than n if there are less users available.

func (f FRSUser) ExceedsLimit bool ExceedsLimit is a simple helper function for checking if a user is limited, and if they are, whether they can be messaged according to their limits.

func (f FRSUser) GetCount uint16 GetCount takes a header and gets the number of messages sent for that header this month.

func (f FRSUser) MarkMessageSent MarkMessageSent takes a header and increases the number of messages sent for that header by one.

type frsWeightedUser struct { *FRSUser // weight will represent our probability for this user to be selected weight float64 // _hasAllHeaderChecked is a simple boolean check to make sure we don't halve the probability twice _hasAllHeaderChecked bool }   frsWeightedUser extends FRSUser to add a weighting component. It's only used within frslist.

func (u *frsWeightedUser) checkWeightForAllHeader(allHeader string) checkWeightForAllHeader takes a string representation of the "All [type]s" header, and checks whether the frsWeightedUser is contained within that header. If it is, it will halve the user's weighting, to encourage users subscribed to specific categories to be selected.