func (m *Member) Mention() string {
	return "<@!" + m.User.ID + ">"
}
Mention creates a member mention
package discordgo
import (
	"encoding/json"
	"fmt"
	"math"
	"net/http"
	"strings"
	"sync"
	"time"
	"github.com/gorilla/websocket"
)
type Session struct {
	sync.RWMutex
	Token string
	MFA bool
	Debug    bool  
	LogLevel int
	ShouldReconnectOnError bool
	Identify Identify
	Compress bool
	ShardID    int
	ShardCount int
	StateEnabled bool
	SyncEvents bool
	DataReady bool  
	MaxRestRetries int
	status int32
	VoiceReady bool  
	UDPReady bool  
	VoiceConnections map[string]*VoiceConnection
	State *State
	Client *http.Client
	UserAgent string
	LastHeartbeatAck time.Time
	LastHeartbeatSent time.Time
	Ratelimiter *RateLimiter
	handlersMu   sync.RWMutex
	handlers     map[string][]*eventHandlerInstance
	onceHandlers map[string][]*eventHandlerInstance
	wsConn *websocket.Conn
	listening chan interface{}
	sequence *int64
	gateway string
	sessionID string
	wsMutex sync.Mutex
}
type UserConnection struct {
	ID           string         `json:"id"`
	Name         string         `json:"name"`
	Type         string         `json:"type"`
	Revoked      bool           `json:"revoked"`
	Integrations []*Integration `json:"integrations"`
}
type Integration struct {
	ID                string             `json:"id"`
	Name              string             `json:"name"`
	Type              string             `json:"type"`
	Enabled           bool               `json:"enabled"`
	Syncing           bool               `json:"syncing"`
	RoleID            string             `json:"role_id"`
	EnableEmoticons   bool               `json:"enable_emoticons"`
	ExpireBehavior    ExpireBehavior     `json:"expire_behavior"`
	ExpireGracePeriod int                `json:"expire_grace_period"`
	User              *User              `json:"user"`
	Account           IntegrationAccount `json:"account"`
	SyncedAt          Timestamp          `json:"synced_at"`
}
type ExpireBehavior int
const (
	ExpireBehaviorRemoveRole ExpireBehavior = iota
	ExpireBehaviorKick
)
type IntegrationAccount struct {
	ID   string `json:"id"`
	Name string `json:"name"`
}
type VoiceRegion struct {
	ID       string `json:"id"`
	Name     string `json:"name"`
	Hostname string `json:"sample_hostname"`
	Port     int    `json:"sample_port"`
}
type VoiceICE struct {
	TTL     string       `json:"ttl"`
	Servers []*ICEServer `json:"servers"`
}
type ICEServer struct {
	URL        string `json:"url"`
	Username   string `json:"username"`
	Credential string `json:"credential"`
}
type Invite struct {
	Guild          *Guild         `json:"guild"`
	Channel        *Channel       `json:"channel"`
	Inviter        *User          `json:"inviter"`
	Code           string         `json:"code"`
	CreatedAt      Timestamp      `json:"created_at"`
	MaxAge         int            `json:"max_age"`
	Uses           int            `json:"uses"`
	MaxUses        int            `json:"max_uses"`
	Revoked        bool           `json:"revoked"`
	Temporary      bool           `json:"temporary"`
	Unique         bool           `json:"unique"`
	TargetUser     *User          `json:"target_user"`
	TargetUserType TargetUserType `json:"target_user_type"`
	ApproximatePresenceCount int `json:"approximate_presence_count"`
	ApproximateMemberCount   int `json:"approximate_member_count"`
}
type TargetUserType int
const (
	TargetUserTypeStream TargetUserType = iota
)
type ChannelType int
const (
	ChannelTypeGuildText ChannelType = iota
	ChannelTypeDM
	ChannelTypeGuildVoice
	ChannelTypeGroupDM
	ChannelTypeGuildCategory
	ChannelTypeGuildNews
	ChannelTypeGuildStore
)
type Channel struct {
	ID string `json:"id"`
	GuildID string `json:"guild_id"`
	Name string `json:"name"`
	Topic string `json:"topic"`
	Type ChannelType `json:"type"`
	LastMessageID string `json:"last_message_id"`
	LastPinTimestamp Timestamp `json:"last_pin_timestamp"`
	NSFW bool `json:"nsfw"`
	Icon string `json:"icon"`
	Position int `json:"position"`
	Bitrate int `json:"bitrate"`
	Recipients []*User `json:"recipients"`
	Messages []*Message `json:"-"`
	PermissionOverwrites []*PermissionOverwrite `json:"permission_overwrites"`
	UserLimit int `json:"user_limit"`
	ParentID string `json:"parent_id"`
	RateLimitPerUser int `json:"rate_limit_per_user"`
	OwnerID string `json:"owner_id"`
	ApplicationID string `json:"application_id"`
}
func (c *Channel) Mention() string {
	return fmt.Sprintf("<#%s>", c.ID)
}
type ChannelEdit struct {
	Name                 string                 `json:"name,omitempty"`
	Topic                string                 `json:"topic,omitempty"`
	NSFW                 bool                   `json:"nsfw,omitempty"`
	Position             int                    `json:"position"`
	Bitrate              int                    `json:"bitrate,omitempty"`
	UserLimit            int                    `json:"user_limit,omitempty"`
	PermissionOverwrites []*PermissionOverwrite `json:"permission_overwrites,omitempty"`
	ParentID             string                 `json:"parent_id,omitempty"`
	RateLimitPerUser     int                    `json:"rate_limit_per_user,omitempty"`
}
type ChannelFollow struct {
	ChannelID string `json:"channel_id"`
	WebhookID string `json:"webhook_id"`
}
type PermissionOverwriteType int
const (
	PermissionOverwriteTypeRole PermissionOverwriteType = iota
	PermissionOverwriteTypeMember
)
type PermissionOverwrite struct {
	ID    string                  `json:"id"`
	Type  PermissionOverwriteType `json:"type"`
	Deny  int64                   `json:"deny,string"`
	Allow int64                   `json:"allow,string"`
}
type Emoji struct {
	ID            string   `json:"id"`
	Name          string   `json:"name"`
	Roles         []string `json:"roles"`
	User          *User    `json:"user"`
	RequireColons bool     `json:"require_colons"`
	Managed       bool     `json:"managed"`
	Animated      bool     `json:"animated"`
	Available     bool     `json:"available"`
}
func (e *Emoji) MessageFormat() string {
	if e.ID != "" && e.Name != "" {
		if e.Animated {
			return "<a:" + e.APIName() + ">"
		}
		return "<:" + e.APIName() + ">"
	}
	return e.APIName()
}
func (e *Emoji) APIName() string {
	if e.ID != "" && e.Name != "" {
		return e.Name + ":" + e.ID
	}
	if e.Name != "" {
		return e.Name
	}
	return e.ID
}
type VerificationLevel int
const (
	VerificationLevelNone VerificationLevel = iota
	VerificationLevelLow
	VerificationLevelMedium
	VerificationLevelHigh
	VerificationLevelVeryHigh
)
type ExplicitContentFilterLevel int
const (
	ExplicitContentFilterDisabled ExplicitContentFilterLevel = iota
	ExplicitContentFilterMembersWithoutRoles
	ExplicitContentFilterAllMembers
)
type MfaLevel int
const (
	MfaLevelNone MfaLevel = iota
	MfaLevelElevated
)
type PremiumTier int
const (
	PremiumTierNone PremiumTier = iota
	PremiumTier1
	PremiumTier2
	PremiumTier3
)
type Guild struct {
	ID string `json:"id"`
	Name string `json:"name"`
	Icon string `json:"icon"`
	Region string `json:"region"`
	AfkChannelID string `json:"afk_channel_id"`
	OwnerID string `json:"owner_id"`
	Owner bool `json:"owner"`
	JoinedAt Timestamp `json:"joined_at"`
	DiscoverySplash string `json:"discovery_splash"`
	Splash string `json:"splash"`
	AfkTimeout int `json:"afk_timeout"`
	MemberCount int `json:"member_count"`
	VerificationLevel VerificationLevel `json:"verification_level"`
	Large bool `json:"large"`
	DefaultMessageNotifications MessageNotifications `json:"default_message_notifications"`
	Roles []*Role `json:"roles"`
	Emojis []*Emoji `json:"emojis"`
	Members []*Member `json:"members"`
	Presences []*Presence `json:"presences"`
	MaxPresences int `json:"max_presences"`
	MaxMembers int `json:"max_members"`
	Channels []*Channel `json:"channels"`
	VoiceStates []*VoiceState `json:"voice_states"`
	Unavailable bool `json:"unavailable"`
	ExplicitContentFilter ExplicitContentFilterLevel `json:"explicit_content_filter"`
	Features []string `json:"features"`
	MfaLevel MfaLevel `json:"mfa_level"`
	ApplicationID string `json:"application_id"`
	WidgetEnabled bool `json:"widget_enabled"`
	WidgetChannelID string `json:"widget_channel_id"`
	SystemChannelID string `json:"system_channel_id"`
	SystemChannelFlags SystemChannelFlag `json:"system_channel_flags"`
	RulesChannelID string `json:"rules_channel_id"`
	VanityURLCode string `json:"vanity_url_code"`
	Description string `json:"description"`
	Banner string `json:"banner"`
	PremiumTier PremiumTier `json:"premium_tier"`
	PremiumSubscriptionCount int `json:"premium_subscription_count"`
	PreferredLocale string `json:"preferred_locale"`
	PublicUpdatesChannelID string `json:"public_updates_channel_id"`
	MaxVideoChannelUsers int `json:"max_video_channel_users"`
	ApproximateMemberCount int `json:"approximate_member_count"`
	ApproximatePresenceCount int `json:"approximate_presence_count"`
	Permissions int64 `json:"permissions,string"`
}
type MessageNotifications int
const (
	MessageNotificationsAllMessages MessageNotifications = iota
	MessageNotificationsOnlyMentions
)
type SystemChannelFlag int
const (
	SystemChannelFlagsSuppressJoin SystemChannelFlag = 1 << iota
	SystemChannelFlagsSuppressPremium
)
func (g *Guild) IconURL() string {
	if g.Icon == "" {
		return ""
	}
	if strings.HasPrefix(g.Icon, "a_") {
		return EndpointGuildIconAnimated(g.ID, g.Icon)
	}
	return EndpointGuildIcon(g.ID, g.Icon)
}
type UserGuild struct {
	ID          string `json:"id"`
	Name        string `json:"name"`
	Icon        string `json:"icon"`
	Owner       bool   `json:"owner"`
	Permissions int64  `json:"permissions,string"`
}
type GuildParams struct {
	Name                        string             `json:"name,omitempty"`
	Region                      string             `json:"region,omitempty"`
	VerificationLevel           *VerificationLevel `json:"verification_level,omitempty"`
	DefaultMessageNotifications int                `json:"default_message_notifications,omitempty"`  
	AfkChannelID                string             `json:"afk_channel_id,omitempty"`
	AfkTimeout                  int                `json:"afk_timeout,omitempty"`
	Icon                        string             `json:"icon,omitempty"`
	OwnerID                     string             `json:"owner_id,omitempty"`
	Splash                      string             `json:"splash,omitempty"`
	Banner                      string             `json:"banner,omitempty"`
}
type Role struct {
	ID string `json:"id"`
	Name string `json:"name"`
	Managed bool `json:"managed"`
	Mentionable bool `json:"mentionable"`
	Hoist bool `json:"hoist"`
	Color int `json:"color"`
	Position int `json:"position"`
	Permissions int64 `json:"permissions,string"`
}
func (r *Role) Mention() string {
	return fmt.Sprintf("<@&%s>", r.ID)
}
type Roles []*Role
func (r Roles) Len() int {
	return len(r)
}
func (r Roles) Less(i, j int) bool {
	return r[i].Position > r[j].Position
}
func (r Roles) Swap(i, j int) {
	r[i], r[j] = r[j], r[i]
}
type VoiceState struct {
	UserID    string `json:"user_id"`
	SessionID string `json:"session_id"`
	ChannelID string `json:"channel_id"`
	GuildID   string `json:"guild_id"`
	Suppress  bool   `json:"suppress"`
	SelfMute  bool   `json:"self_mute"`
	SelfDeaf  bool   `json:"self_deaf"`
	Mute      bool   `json:"mute"`
	Deaf      bool   `json:"deaf"`
}
type Presence struct {
	User       *User       `json:"user"`
	Status     Status      `json:"status"`
	Activities []*Activity `json:"activities"`
	Since      *int        `json:"since"`
}
type TimeStamps struct {
	EndTimestamp   int64 `json:"end,omitempty"`
	StartTimestamp int64 `json:"start,omitempty"`
}
func (t *TimeStamps) UnmarshalJSON(b []byte) error {
	temp := struct {
		End   float64 `json:"end,omitempty"`
		Start float64 `json:"start,omitempty"`
	}{}
	err := json.Unmarshal(b, &temp)
	if err != nil {
		return err
	}
	t.EndTimestamp = int64(temp.End)
	t.StartTimestamp = int64(temp.Start)
	return nil
}
type Assets struct {
	LargeImageID string `json:"large_image,omitempty"`
	SmallImageID string `json:"small_image,omitempty"`
	LargeText    string `json:"large_text,omitempty"`
	SmallText    string `json:"small_text,omitempty"`
}
type Member struct {
	GuildID string `json:"guild_id"`
	JoinedAt Timestamp `json:"joined_at"`
	Nick string `json:"nick"`
	Deaf bool `json:"deaf"`
	Mute bool `json:"mute"`
	User *User `json:"user"`
	Roles []string `json:"roles"`
	PremiumSince Timestamp `json:"premium_since"`
	Pending bool `json:"pending"`
}