package main import ( "errors" "github.com/bwmarrin/discordgo" ) var trustCache map[string]float64 var errNotMember = errors.New("trust: only members have trust value") func getTrust(s *discordgo.Session, discordID string) (float64, error) { if v, ok := trustCache[discordID]; ok { return v, nil } member, err := s.GuildMember(guildID, discordID) if err != nil { return 0.0, err } isMember := false for _, role := range member.Roles { if role == memberRoleID { isMember = true } } if !isMember { return 0.0, errNotMember } votes, err := getTrustVote(discordID) if err != nil { return 0.0, err } votes = append(votes, 3) var total float64 for _, v := range votes { total += float64(v) } return total / float64(len(votes)), nil } func getTotalTrust(s *discordgo.Session) (float64, error) { members, err := getAllMembers(s) if err != nil { return 0.0, err } var total float64 for _, member := range members { isMember := false for _, role := range member.Roles { if role == memberRoleID { isMember = true } } if !isMember { continue } trust, err := getTrust(s, member.User.ID) if err != nil { return 0.0, err } total += trust } return total, nil } func updateTrust(sourceID, targetID string, voteValue int) error { err := updateDbTrust(sourceID, targetID, voteValue, false) if err != nil { return err } delete(trustCache, targetID) return nil }