discord

package
v0.0.0-...-b16daea Latest Latest
Warning

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

Go to latest
Published: Jun 18, 2021 License: MIT Imports: 37 Imported by: 0

Documentation

Index

Constants

View Source
const ASCIICrewmate = "" +
	"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⣠⣤⣤⣤⣤⣤⣤⣤⣤⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀\n" +
	"⠀⠀⠀⠀⠀⠀⠀⠀ ⢀⣴⣿⡿⠛⠉⠙⠛⠛⠛⠻⢿⣿⣷⣤⡀⠀⠀⠀⠀⠀\n" +
	"⠀⠀⠀⠀⠀⠀⠀⠀ ⣼⣿⠋⠀⠀⠀⠀      ⠀⢀⣀⣀⠈⢻⣿⣿⡄⠀⠀⠀⠀\n" +
	"⠀⠀⠀⠀⠀⠀⠀  ⣸⣿   ⠀⠀⣠⣶⣾⣿⣿⣿⠿⠿⠿⢿⣿⣿⣿⣄⠀⠀⠀\n" +
	"⠀⠀⠀⠀⠀⠀⠀  ⣿⣿   ⠀⢰⣿⣿⣯⠁⠀⠀⠀⠀⠀⠀⠀  ⠈⠙⢿⣷⡄⠀\n" +
	"⠀⠀⣀⣤⣴⣶⣶⣿⡟⠀⠀⢸⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀    ⠀⠀⣿⣷⠀\n" +
	"⠀⢰⣿⡟⠋⠉⣹⣿⡇⠀⠀⠘⣿⣿⣿⣿⣷⣦⣤⣤⣤⣶⣶⣶⣶⣿⣿⣿⠀\n" +
	"⠀⢸⣿⡇⠀⠀⣿⣿⡇⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠃⠀\n" +
	"⠀⣸⣿⡇⠀⠀⣿⣿⡇⠀⠀⠀⠀⠉⠻⠿⣿⣿⣿⣿⡿⠿⠿⠛⢻⣿⡇⠀⠀\n" +
	"⠀⣿⣿⠁⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀  ⢸⣿⣧⠀⠀\n" +
	"⠀⣿⣿⠀⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀  ⢸⣿⣿⠀⠀\n" +
	"⠀⣿⣿⠀⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀  ⢸⣿⣿⠀⠀\n" +
	"⠀⢿⣿⡆⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀  ⠀⢸⣿⡇⠀⠀\n" +
	"⠀⠸⣿⣧⡀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀  ⠀⠀⣿⣿⠃⠀⠀\n" +
	"⠀⠀⠛⢿⣿⣿⣿⣿⣇⠀⠀⠀⠀⠀⣰⣿⣿⣷⣶⣶⣶⣶⠶⢠⣿⣿⠀⠀⠀\n" +
	"⠀⠀⠀⠀⠀⠀⠀⣿⣿⠀⠀⠀⠀⠀⣿⣿⡇⠀⣽⣿⡏⠁⠀⠀⢸⣿⡇⠀⠀⠀\n" +
	"⠀⠀⠀⠀⠀⠀⠀⣿⣿⠀⠀⠀⠀⠀⣿⣿⡇⠀⢹⣿⡆⠀⠀⠀⣸⣿⠇⠀⠀⠀\n" +
	"⠀⠀⠀⠀⠀⠀⠀⢿⣿⣦⣄⣀⣠⣴⣿⣿  ⠀⠈⠻⣿⣿⣿⡿⠏⠀⠀⠀⠀\n" +
	"⠀⠀⠀⠀⠀⠀⠀⠈⠛⠻⠿⠿⠿⠿⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀"
View Source
const BaseMapURL = "https://github.com/killerbad/MuteBot/blob/main/assets/maps/"
View Source
const BasePremiumURL = "https://automute.us/premium?guild="
View Source
const DefaultMaxActiveGames = 150
View Source
const DeferredEditSeconds = 2

bumped for public rollout. Don't need to update the status message more than once every 2 secs prob

View Source
const GameTimeoutSeconds = 900

15 minute timeout

View Source
const ISO8601 = "2006-01-02T15:04:05-0700"
View Source
const LinearBackoffMs = 100
View Source
const LockTimeoutMs = 250
View Source
const (
	MaxDebugMessageSize = 1980
)
View Source
const MaxRetries = 10
View Source
const SnowflakeLockMs = 3000

Variables

View Source
var AllEmojisStartup []*discordgo.Emoji = nil
View Source
var BotInvites = []string{
	"https://discord.com/api/oauth2/authorize?client_id=780323275624546304&permissions=12582912&scope=bot",
	"https://discord.com/api/oauth2/authorize?client_id=780589033033302036&permissions=12582912&scope=bot",

	"https://discord.com/api/oauth2/authorize?client_id=780323801173983262&permissions=12582912&scope=bot"} // amu3

if you're reading this, adding these bots won't help you. Galactus+AutoMuteUs verify the premium status internally before using these bots ;)

View Source
var DeferredEdits = make(map[string]*discordgo.MessageEmbed)
View Source
var DeferredEditsLock = sync.Mutex{}
View Source
var EmojiLock = sync.Mutex{}
View Source
var EmojiNums = []string{":one:", ":two:", ":three:"}
View Source
var GlobalAlivenessEmojis = AlivenessEmojis{
	// contains filtered or unexported fields
}

GlobalAlivenessEmojis keys are IsAlive, Color

View Source
var GlobalReady = false
View Source
var MatchIDRegex = regexp.MustCompile(`^[A-Z0-9]{8}:[0-9]+$`)

Functions

func ASCIIStarfield

func ASCIIStarfield(sett *storage.GuildSettings, name string, isImpostor bool, count int) string

func CommandPrefixSetting

func CommandPrefixSetting(s *discordgo.Session, m *discordgo.MessageCreate, sett *storage.GuildSettings, args []string) bool

func ConstructEmbedForCommand

func ConstructEmbedForCommand(prefix string, cmd command.Command, sett *storage.GuildSettings) *discordgo.MessageEmbed

TODO cache/preconstruct these (no reason to make them fresh everytime help is called, except for the prefix...)

func ConstructEmbedForSetting

func ConstructEmbedForSetting(value string, setting setting.Setting, sett *storage.GuildSettings) discordgo.MessageEmbed

func MessageDeleteWorker

func MessageDeleteWorker(s *discordgo.Session, msgChannelID, msgID string, waitDur time.Duration)

func RecordDiscordRequestsByCounts

func RecordDiscordRequestsByCounts(client *redis.Client, counts *task.MuteDeafenSuccessCounts)

func RemovePendingDGSEdit

func RemovePendingDGSEdit(messageID string)

func SettingAdminUserIDs

func SettingAdminUserIDs(s *discordgo.Session, m *discordgo.MessageCreate, sett *storage.GuildSettings, args []string) bool

func SettingAutoRefresh

func SettingAutoRefresh(s *discordgo.Session, m *discordgo.MessageCreate, sett *storage.GuildSettings, args []string) bool

func SettingDelays

func SettingDelays(s *discordgo.Session, m *discordgo.MessageCreate, sett *storage.GuildSettings, args []string) bool

func SettingDisplayRoomCode

func SettingDisplayRoomCode(s *discordgo.Session, m *discordgo.MessageCreate, sett *storage.GuildSettings, args []string) bool

func SettingLanguage

func SettingLanguage(s *discordgo.Session, m *discordgo.MessageCreate, sett *storage.GuildSettings, args []string) bool

func SettingLeaderboardMin

func SettingLeaderboardMin(s *discordgo.Session, m *discordgo.MessageCreate, sett *storage.GuildSettings, args []string) bool

func SettingLeaderboardNameMention

func SettingLeaderboardNameMention(s *discordgo.Session, m *discordgo.MessageCreate, sett *storage.GuildSettings, args []string) bool

func SettingLeaderboardSize

func SettingLeaderboardSize(s *discordgo.Session, m *discordgo.MessageCreate, sett *storage.GuildSettings, args []string) bool

func SettingMapVersion

func SettingMapVersion(s *discordgo.Session, m *discordgo.MessageCreate, sett *storage.GuildSettings, args []string) bool

func SettingMatchSummary

func SettingMatchSummary(s *discordgo.Session, m *discordgo.MessageCreate, sett *storage.GuildSettings, args []string) bool

func SettingMatchSummaryChannel

func SettingMatchSummaryChannel(s *discordgo.Session, m *discordgo.MessageCreate, sett *storage.GuildSettings, args []string) bool

func SettingMuteSpectators

func SettingMuteSpectators(s *discordgo.Session, m *discordgo.MessageCreate, sett *storage.GuildSettings, args []string) bool

func SettingPermissionRoleIDs

func SettingPermissionRoleIDs(s *discordgo.Session, m *discordgo.MessageCreate, sett *storage.GuildSettings, args []string) bool

func SettingUnmuteDeadDuringTasks

func SettingUnmuteDeadDuringTasks(s *discordgo.Session, m *discordgo.MessageCreate, sett *storage.GuildSettings, args []string) bool

func SettingVoiceRules

func SettingVoiceRules(s *discordgo.Session, m *discordgo.MessageCreate, sett *storage.GuildSettings, args []string) bool

func StartHealthCheckServer

func StartHealthCheckServer(port string)

func TrimEmbedFields

func TrimEmbedFields(fields []*discordgo.MessageEmbedField) []*discordgo.MessageEmbedField

func ValidFields

func ValidFields(me *discordgo.MessageEmbed) bool

Types

type AlivenessEmojis

type AlivenessEmojis map[bool][]Emoji

AlivenessEmojis map

type Bot

type Bot struct {

	// mapping of socket connections to the game connect codes
	ConnsToGames map[string]string

	StatusEmojis AlivenessEmojis

	EndGameChannels map[string]chan EndGameMessage

	ChannelsMapLock sync.RWMutex

	PrimarySession *discordgo.Session

	GalactusClient *GalactusClient

	RedisInterface *RedisInterface

	StorageInterface *storage.StorageInterface

	PostgresInterface *storage.PsqlInterface
	// contains filtered or unexported fields
}

func MakeAndStartBot

func MakeAndStartBot(version, commit, botToken, url, emojiGuildID string, extraTokens []string, numShards, shardID int, redisInterface *RedisInterface, storageInterface *storage.StorageInterface, psql *storage.PsqlInterface, gc *GalactusClient, logPath string) *Bot

MakeAndStartBot does what it sounds like TODO collapse these fields into proper structs?

func (*Bot) CheckOrFetchCachedUserData

func (bot *Bot) CheckOrFetchCachedUserData(userID, guildID string) (string, string, string)

func (*Bot) Close

func (bot *Bot) Close()

func (*Bot) GameStatsEmbed

func (bot *Bot) GameStatsEmbed(guildID, matchID, connectCode string, sett *storage.GuildSettings, prem premium.Tier) *discordgo.MessageEmbed

func (*Bot) GuildStatsEmbed

func (bot *Bot) GuildStatsEmbed(guildID string, sett *storage.GuildSettings, prem premium.Tier) *discordgo.MessageEmbed

func (*Bot) HandleCommand

func (bot *Bot) HandleCommand(isAdmin, isPermissioned bool, sett *storage.GuildSettings, s *discordgo.Session, g *discordgo.Guild, m *discordgo.MessageCreate, args []string)

func (*Bot) HandleSettingsCommand

func (bot *Bot) HandleSettingsCommand(s *discordgo.Session, m *discordgo.MessageCreate, sett *storage.GuildSettings, args []string, prem bool)

func (*Bot) MentionWithCacheData

func (bot *Bot) MentionWithCacheData(userID, guildID string, sett *storage.GuildSettings) string

func (*Bot) RefreshGameStateMessage

func (bot *Bot) RefreshGameStateMessage(gsr GameStateRequest, sett *storage.GuildSettings)

func (*Bot) SubscribeToGameByConnectCode

func (bot *Bot) SubscribeToGameByConnectCode(guildID, connectCode string, endGameChannel chan EndGameMessage)

func (*Bot) UserStatsEmbed

func (bot *Bot) UserStatsEmbed(userID, guildID string, sett *storage.GuildSettings, prem premium.Tier) *discordgo.MessageEmbed

type Emoji

type Emoji struct {
	Name string
	ID   string
}

Emoji struct for discord

func (*Emoji) DownloadAndBase64Encode

func (e *Emoji) DownloadAndBase64Encode() string

DownloadAndBase64Encode does what it sounds like

func (*Emoji) FormatForInline

func (e *Emoji) FormatForInline() string

FormatForInline does what it sounds like

func (*Emoji) FormatForReaction

func (e *Emoji) FormatForReaction() string

FormatForReaction does what it sounds like

func (*Emoji) GetDiscordCDNUrl

func (e *Emoji) GetDiscordCDNUrl() string

GetDiscordCDNUrl does what it sounds like

type EndGameMessage

type EndGameMessage bool

type GalactusClient

type GalactusClient struct {
	Address string
	// contains filtered or unexported fields
}

func NewGalactusClient

func NewGalactusClient(address string) (*GalactusClient, error)

func (*GalactusClient) AddToken

func (gc *GalactusClient) AddToken(token string) error

func (*GalactusClient) ModifyUsers

func (gc *GalactusClient) ModifyUsers(guildID, connectCode string, request task.UserModifyRequest, lock *redislock.Lock) *task.MuteDeafenSuccessCounts

type GameState

type GameState struct {
	GuildID string `json:"guildID"`

	ConnectCode string `json:"connectCode"`

	Linked     bool `json:"linked"`
	Running    bool `json:"running"`
	Subscribed bool `json:"subscribed"`

	MatchID        int64 `json:"matchID"`
	MatchStartUnix int64 `json:"matchStartUnix"`

	UserData UserDataSet     `json:"userData"`
	Tracking TrackingChannel `json:"tracking"`

	GameStateMsg GameStateMessage `json:"gameStateMessage"`

	AmongUsData amongus.AmongUsData `json:"amongUsData"`
}

func NewDiscordGameState

func NewDiscordGameState(guildID string) *GameState

func (*GameState) AddAllReactions

func (dgs *GameState) AddAllReactions(s *discordgo.Session, emojis []Emoji)

func (*GameState) AddReaction

func (dgs *GameState) AddReaction(s *discordgo.Session, emoji string)

func (*GameState) AttemptPairingByMatchingNames

func (dgs *GameState) AttemptPairingByMatchingNames(data amongus.PlayerData) string

func (*GameState) AttemptPairingByUserIDs

func (dgs *GameState) AttemptPairingByUserIDs(data amongus.PlayerData, userIDs map[string]interface{}) string

func (*GameState) ClearAllPlayerData

func (dgs *GameState) ClearAllPlayerData()

func (*GameState) ClearPlayerData

func (dgs *GameState) ClearPlayerData(userID string)

func (*GameState) ClearPlayerDataByPlayerName

func (dgs *GameState) ClearPlayerDataByPlayerName(playerName string)

func (*GameState) CreateMessage

func (dgs *GameState) CreateMessage(s *discordgo.Session, me *discordgo.MessageEmbed, channelID string, authorID string)

func (*GameState) DeleteGameStateMsg

func (dgs *GameState) DeleteGameStateMsg(s *discordgo.Session)

func (GameState) Edit

Note this is not a pointer; we never expect the underlying DGS to change on an edit

func (*GameState) Exists

func (dgs *GameState) Exists() bool

func (*GameState) GetCountLinked

func (dgs *GameState) GetCountLinked() int

func (*GameState) GetUser

func (dgs *GameState) GetUser(userID string) (UserData, error)

func (*GameState) IsReactionTo

func (dgs *GameState) IsReactionTo(m *discordgo.MessageReactionAdd) bool

func (*GameState) RemoveAllReactions

func (dgs *GameState) RemoveAllReactions(s *discordgo.Session)

func (*GameState) Reset

func (dgs *GameState) Reset()

func (*GameState) SameChannel

func (dgs *GameState) SameChannel(channelID string) bool

func (*GameState) ToEmojiEmbedFields

func (dgs *GameState) ToEmojiEmbedFields(emojis AlivenessEmojis, sett *storage.GuildSettings) []*discordgo.MessageEmbedField

func (*GameState) UpdateUserData

func (dgs *GameState) UpdateUserData(userID string, data UserData)

func (*GameState) UserDataSize

func (dgs *GameState) UserDataSize() int

type GameStateMessage

type GameStateMessage struct {
	MessageID        string `json:"messageID"`
	MessageChannelID string `json:"messageChannelID"`
	MessageAuthorID  string `json:"messageAuthorID"`
	LeaderID         string `json:"leaderID"`
}

func MakeGameStateMessage

func MakeGameStateMessage() GameStateMessage

type GameStateRequest

type GameStateRequest struct {
	GuildID      string
	TextChannel  string
	VoiceChannel string
	ConnectCode  string
}

type HandlePriority

type HandlePriority int
const (
	NoPriority    HandlePriority = 0
	AlivePriority HandlePriority = 1
	DeadPriority  HandlePriority = 2
)

type MapImage

type MapImage struct {
	Simple   string
	Detailed string
}

type MapItem

type MapItem struct {
	Name     string
	MapImage MapImage
}

func NewMapItem

func NewMapItem(name string) (*MapItem, error)

func (*MapItem) String

func (m *MapItem) String() string

type RedisInterface

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

func (*RedisInterface) AddUniqueGuildCounter

func (redisInterface *RedisInterface) AddUniqueGuildCounter(guildID string)
func (redisInterface *RedisInterface) AddUsernameLink(guildID, userID, userName string) error

func (*RedisInterface) CheckPointer

func (redisInterface *RedisInterface) CheckPointer(pointer string) string

func (*RedisInterface) Close

func (redisInterface *RedisInterface) Close() error

func (*RedisInterface) DeleteDiscordGameState

func (redisInterface *RedisInterface) DeleteDiscordGameState(dgs *GameState)

func (*RedisInterface) DeleteLinksByUserID

func (redisInterface *RedisInterface) DeleteLinksByUserID(guildID, userID string) error

func (*RedisInterface) GetDiscordGameStateAndLock

func (redisInterface *RedisInterface) GetDiscordGameStateAndLock(gsr GameStateRequest) (*redislock.Lock, *GameState)

func (*RedisInterface) GetReadOnlyDiscordGameState

func (redisInterface *RedisInterface) GetReadOnlyDiscordGameState(gsr GameStateRequest) *GameState

need at least one of these fields to fetch

func (*RedisInterface) GetUsernameOrUserIDMappings

func (redisInterface *RedisInterface) GetUsernameOrUserIDMappings(guildID, key string) map[string]interface{}

func (*RedisInterface) Init

func (redisInterface *RedisInterface) Init(params interface{}) error

func (*RedisInterface) LeaveUniqueGuildCounter

func (redisInterface *RedisInterface) LeaveUniqueGuildCounter(guildID string)

func (*RedisInterface) LoadAllActiveGames

func (redisInterface *RedisInterface) LoadAllActiveGames(guildID string) []string

only deletes from the guild's responsibility, NOT the entire guild counter!

func (*RedisInterface) LockSnowflake

func (redisInterface *RedisInterface) LockSnowflake(snowflake string) *redislock.Lock

func (*RedisInterface) LockVoiceChanges

func (redisInterface *RedisInterface) LockVoiceChanges(connectCode string, dur time.Duration) *redislock.Lock

func (*RedisInterface) RefreshActiveGame

func (redisInterface *RedisInterface) RefreshActiveGame(guildID, connectCode string)

func (*RedisInterface) RemoveOldGame

func (redisInterface *RedisInterface) RemoveOldGame(guildID, connectCode string)

func (*RedisInterface) SetDiscordGameState

func (redisInterface *RedisInterface) SetDiscordGameState(data *GameState, lock *redislock.Lock)

type TrackingChannel

type TrackingChannel struct {
	ChannelID   string `json:"channelID"`
	ChannelName string `json:"channelName"`
}

func (TrackingChannel) ToDescString

func (tc TrackingChannel) ToDescString(sett *storage.GuildSettings) string

func (TrackingChannel) ToStatusString

func (tc TrackingChannel) ToStatusString(sett *storage.GuildSettings) string

type User

type User struct {
	Nick          string `json:"Nick"`
	UserID        string `json:"UserID"`
	UserName      string `json:"UserName"`
	Discriminator string `json:"Discriminator"`
}

User struct

type UserData

type UserData struct {
	User         User   `json:"User"`
	ShouldBeMute bool   `json:"ShouldBeMute"`
	ShouldBeDeaf bool   `json:"ShouldBeDeaf"`
	InGameName   string `json:"PlayerName"`
}

UserData struct

func MakeUserDataFromDiscordUser

func MakeUserDataFromDiscordUser(dUser *discordgo.User, nick string) UserData

func (*UserData) GetID

func (user *UserData) GetID() string

func (*UserData) GetNickName

func (user *UserData) GetNickName() string

func (*UserData) GetPlayerName

func (user *UserData) GetPlayerName() string

func (*UserData) GetUserName

func (user *UserData) GetUserName() string
func (user *UserData) Link(player amongus.PlayerData)

func (*UserData) SetShouldBeMuteDeaf

func (user *UserData) SetShouldBeMuteDeaf(mute, deaf bool)

type UserDataSet

type UserDataSet map[string]UserData

type UserPatchParameters

type UserPatchParameters struct {
	GuildID  string
	Userdata UserData
	Deaf     bool
	Mute     bool
}

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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