Documentation
¶
Index ¶
- Constants
- type Activity
- type AllowedMentions
- type Application
- type Attachment
- type ChannelMention
- type ChannelType
- type Embed
- type EmbedAuthor
- type EmbedField
- type EmbedFooter
- type EmbedImage
- type EmbedProvider
- type EmbedThumbnail
- type EmbedType
- type EmbedVideo
- type Emoji
- type GuildMember
- type MentionType
- type Message
- type MessageActivityType
- type MessageFlag
- type MessageReference
- type Reaction
- type Role
- type User
- type UserFlag
- type UserPremiumType
- type Webhook
- type WebhookAPI
- func (wa *WebhookAPI) Delete(ctx context.Context) error
- func (wa *WebhookAPI) Execute(ctx context.Context, wep *WebhookExecuteParams, file io.Reader, ...) (*Message, error)
- func (wa *WebhookAPI) Get(ctx context.Context) (*Webhook, error)
- func (wa *WebhookAPI) Modify(ctx context.Context, wmp *WebhookModifyParams) (*Webhook, error)
- type WebhookExecuteParams
- type WebhookModifyParams
- type WebhookType
Constants ¶
const ( // ChannelTypeChannelTypeGuildText - a text channel within a server ChannelTypeChannelTypeGuildText = 0 // ChannelTypeDM - a direct message between users ChannelTypeDM = 1 // ChannelTypeGuildVoice - a voice channel within a server ChannelTypeGuildVoice = 2 // ChannelTypeGroupDM - a direct message between multiple users ChannelTypeGroupDM = 3 // ChannelTypeGuildCATEGORY - an organizational category that contains up to 50 channels ChannelTypeGuildCATEGORY = 4 // ChannelTypeGuildNews - a channel that users can follow and crosspost into their own server ChannelTypeGuildNews = 5 // ChannelTypeGuildSstor - a channel in which game developers can sell their game on Discord ChannelTypeGuildSstor = 6 )
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Activity ¶
type Activity struct { // Type - type of message activity Type int `json:"type"` // PartyID - party_id from a Rich Presence event PartyID snowflake.Snowflake `json:"party_id,omitempty"` }
Activity represents Message Activity Structure https://discord.com/developers/docs/resources/channel#message-object-message-activity-structure
type AllowedMentions ¶
type AllowedMentions struct { // Parse - an array of allowed mention types to parse from the content. Parse []MentionType `json:"parse,omitempty"` // Roles - an array of role_ids to mention (Max size of 100) Roles []snowflake.Snowflake `json:"roles,omitempty"` // Users - Array of user_ids to mention (Max size of 100) Users []snowflake.Snowflake `json:"users,omitempty"` }
AllowedMentions allows for more granular control over mentions without various hacks to the message content. This will always validate against message content to avoid phantom pings (e.g. to ping everyone, you must still have @everyone in the message content), and check against user/bot permissions. https://discord.com/developers/docs/resources/channel#allowed-mentions-object
type Application ¶
type Application struct { // ID (snowflake) - ID of the application ID snowflake.Snowflake `json:"id"` // CoverImage - ID of the embed's image asset CoverImage string `json:"cover_image,omitempty"` // Description - application's description Description string `json:"description"` // Icon - id of the application's icon Icon string `json:"icon"` // Name - name of the application Name string `json:"name"` }
Application represents Message Application Structure https://discord.com/developers/docs/resources/channel#message-object-message-application-structure
type Attachment ¶
type Attachment struct { // ID (snowflake) - attachment id ID snowflake.Snowflake `json:"id"` // Filenmae - name of file attached Filename string `json:"filename"` // Size - size of file in bytes Size int `json:"size"` // URL - source url of file URL string `json:"url"` // ProxyURL - a proxied url of file ProxyURL string `json:"proxy_url"` // Height - height of file (if image) Height int `json:"height"` // Width - width of file (if image) Width int `json:"width"` }
Attachment represents Attachment Structure https://discord.com/developers/docs/resources/channel#attachment-object-attachment-structure
type ChannelMention ¶
type ChannelMention struct { // ID (snowflake) - id of the channel ID snowflake.Snowflake `json:"id"` // GuildID (snowflake) - id of the guild containing the channel GuildID snowflake.Snowflake `json:"guild_id"` // Type - the type of channel Type ChannelType `json:"type"` // Name - the name of the channel Name string `json:"name"` }
ChannelMention represents Channel Mention Structure https://discord.com/developers/docs/resources/channel#channel-mention-object-channel-mention-structure
type ChannelType ¶
type ChannelType int
ChannelType - channel type integer https://discord.com/developers/docs/resources/channel#channel-object-channel-types
type Embed ¶
type Embed struct { // Title - title of embed Title string `json:"title,omitempty"` // Type - type of embed (always "rich" for webhook embeds) Type EmbedType `json:"type,omitempty"` // Description - description of embed Description string `json:"description,omitempty"` // URL - url of embed URL string `json:"url,omitempty"` // Timestamp - timestamp of embed content Timestamp *time.Time `json:"timestamp,omitempty"` // Color - color code of the embed Color int `json:"color,omitempty"` Footer *EmbedFooter `json:"footer,omitempty"` // Image - image information Image *EmbedImage `json:"image,omitempty"` // Thumbnail - thumbnail information Thumbnail *EmbedThumbnail `json:"thumbnail,omitempty"` // Video - video information Video *EmbedVideo `json:"video,omitempty"` // Provider - provider information Provider *EmbedProvider `json:"provider,omitempty"` // Author - author information Author *EmbedAuthor `json:"author,omitempty"` // Fields - fields information Fields []*EmbedField `json:"fields,omitempty"` }
Embed - embedded `rich` content For the webhook embed objects, you can set every field except `type` (it will be rich regardless of if you try to set it), `provider`, `video`, and any `height`, `width`, or `proxy_url` values for images. https://discord.com/developers/docs/resources/channel#embed-object-embed-structure
type EmbedAuthor ¶
type EmbedAuthor struct { // Name - name of author Name string `json:"name,omitempty"` // URL - url of author URL string `json:"url,omitempty"` // IconURL - url of author icon (only supports http(s) and attachments) IconURL string `json:"icon_url,omitempty"` // ProxyIconURL - a proxied url of author icon ProxyIconURL string `json:"proxy_icon_url,omitempty"` }
EmbedAuthor - represenst Embed Author Structure https://discord.com/developers/docs/resources/channel#embed-object-embed-author-structure
type EmbedField ¶
type EmbedField struct { // Name - name of the field (required) Name string `json:"name"` // Value - value of the field (required) Value string `json:"value"` // Inline - whether or not this field should display inline Inline bool `json:"inline,omitempty"` }
EmbedField - used to represent an embed field object https://discord.com/developers/docs/resources/channel#embed-object-embed-field-structure
type EmbedFooter ¶
type EmbedFooter struct { string `json:"text"` IconURL string `json:"icon_url,omitempty"` ProxyIconURL string `json:"proxy_icon_url,omitempty"` }Text
EmbedFooter represents Embed Footer Structure https://discord.com/developers/docs/resources/channel#embed-object-embed-footer-structure
type EmbedImage ¶
type EmbedImage struct { // URl source url of image (only supports http(s) and attachments) URL string `json:"url,omitempty"` // ProxyURL - a proxied url of the image ProxyURL string `json:"proxy_url,omitempty"` // Height - height of image Height int `json:"height,omitempty"` // Width - width of image Width int `json:"width,omitempty"` }
EmbedImage represents Embed Image Structure https://discord.com/developers/docs/resources/channel#embed-object-embed-image-structure
type EmbedProvider ¶
type EmbedProvider struct { // Name - name of provider Name string `json:"name,omitempty"` // URL - url of provider URL string `json:"url,omitempty"` }
EmbedProvider represents Embed Provider Structure https://discord.com/developers/docs/resources/channel#embed-object-embed-provider-structure
type EmbedThumbnail ¶
type EmbedThumbnail struct { // URL - source url of thumbnail (only supports http(s) and attachments) URL string `json:"url,omitempty"` // ProxyURL - a proxied url of the thumbnail ProxyURL string `json:"proxy_url,omitempty"` // Height - height of thumbnail Height int `json:"height,omitempty"` // Wifth - width of thumbnail Width int `json:"width,omitempty"` }
EmbedThumbnail represents Embed Thumbnail Structure https://discord.com/developers/docs/resources/channel#embed-object-embed-thumbnail-structure
type EmbedType ¶
type EmbedType string
EmbedType - embed types are "loosely defined" and, for the most part, are not used by Discord's clients for rendering. Embed attributes power what is rendered. Embed types should be considered deprecated and might be removed in a future API version. https://discord.com/developers/docs/resources/channel#embed-object-embed-types
const ( // EmbedTypeRich - generic embed rendered from embed attributes EmbedTypeRich EmbedType = "rich" // EmbedTypeImage - image embed EmbedTypeImage EmbedType = "image" // EmbedTypeVideo - video embed EmbedTypeVideo EmbedType = "video" // EmbedTypeGifv - animated gif image embed rendered as a video embed EmbedTypeGifv EmbedType = "gifv" // EmbedTypeArticle - article embed EmbedTypeArticle EmbedType = "article" // EmbedTypeLink - link embed EmbedTypeLink EmbedType = "link" )
type EmbedVideo ¶
type EmbedVideo struct { // URL - source url of video URL string `json:"url,omitempty"` // Height - height of video Height int `json:"height,omitempty"` // Width - width of video Width int `json:"width,omitempty"` }
EmbedVideo represents Embed Video Structure https://discord.com/developers/docs/resources/channel#embed-object-embed-video-structure
type Emoji ¶
type Emoji struct { // ID (snowflake) - emoji id ID snowflake.Snowflake `json:"id"` // Name - emoji name (can be empty only in reaction emoji objects) Name string `json:"name"` // Roles - roles this emoji is whitelisted to Roles []*Role `json:"roles,omitempty"` // User - user that created this emoji User *User `json:"user,omitempty"` // RequireColons - whether this emoji must be wrapped in colons RequireColons bool `json:"require_colons,omitempty"` // Managed - whether this emoji is managed Managed bool `json:"managed,omitempty"` // Animated - whether this emoji is animated Animated bool `json:"animated,omitempty"` // Available - whether this emoji can be used, may be false due to loss of Server Boosts Available bool `json:"available,omitempty"` }
Emoji represents Emoji Structure https://discord.com/developers/docs/resources/emoji#emoji-object-emoji-structure
type GuildMember ¶
type GuildMember struct { // User - the user this guild member represents User *User `json:"user,omitempty"` // Nick - this users guild nickname Nick string `json:"nick,omitempty"` // Roles - array of role object IDs (snowflakes) Roles []snowflake.Snowflake `json:"roles"` // JoindeAt - when the user joined the guild JoinedAt *time.Time `json:"joined_at"` // PremiumSince - when the user started boosting the guild PremiumSince *time.Time `json:"premium_since,omitempty"` // Deaf - whether the user is deafened in voice channels Deaf bool `json:"deaf"` // Mute - whether the user is muted in voice channels Mute bool `json:"mute"` }
GuildMember represents Guild Member Structure https://discord.com/developers/docs/resources/guild#guild-member-object-guild-member-structure
type MentionType ¶
type MentionType string
MentionType - discord mention type https://discord.com/developers/docs/resources/channel#allowed-mentions-object-allowed-mention-types
const ( // MentionTypeRole can be used in AllowedMentions to allow mention roles MentionTypeRole MentionType = "roles" // MentionTypeUser can be used in AllowedMentions to allow mention users MentionTypeUser MentionType = "users" // MentionTypeEveryone can be used in AllowedMentions to allow mention @everyone MentionTypeEveryone MentionType = "everyone" )
type Message ¶
type Message struct { // ID (snowflake) - ID of the message ID snowflake.Snowflake `json:"id"` // ChannelID (snowflake) - ID of the channel the message was sent in ChannelID snowflake.Snowflake `json:"channel_id"` // GuildID (snowflake) - ID of the guild the message was sent in GuildID snowflake.Snowflake `json:"guild_id,omitempty"` // Author - the author of this message (not guaranteed to be a valid user, see below) Author *User `json:"author"` // Member - member properties for this message's author Member *GuildMember `json:"member,omitempty"` // Content - contents of the message Content string `json:"content"` // Timestamp - when this message was sent Timestamp *time.Time `json:"timestamp"` // EditedTimestamp - when this message was edited (or null if never) EditedTimestamp *time.Time `json:"edited_timestamp,omitempty"` // TTS - whether this was a TTS message TTS bool `json:"tts"` // MentionEveryone - whether this message mentions everyone MentionEveryone bool `json:"mention_everyone"` // Mentions - users specifically mentioned in the message Mentions []*User `json:"mentions"` // MentionRoles - specifically mentioned in this message MentionRoles []*Role `json:"mention_roles"` // MentionChannels - channels specifically mentioned in this message MentionChannels []*ChannelMention `json:"mention_channels,omitempty"` // Attachments - any attached files Attachments []*Attachment `json:"attachments"` // Embeds - any embedded content Embeds []*Embed `json:"embeds"` // Reaction - reactions to the message Reactions []*Reaction `json:"reactions,omitempty"` // Nonce - used for validating a message was sent Nonce string `json:"nonce,omitempty"` // Pinned - whether this message is pinned Pinned bool `json:"pinned"` // WebhookID (snowflake) - if the message is generated by a webhook, this is the webhook's ID WebhookID snowflake.Snowflake `json:"webhook_id,omitempty"` // Type - type of message Type int `json:"type"` // Activity - sent with Rich Presence-related chat embeds Activity *Activity `json:"activity,omitempty"` // Application sent with Rich Presence-related chat embeds Application *Application `json:"application,omitempty"` // MessageReference - reference data sent with crossposted messages MessageReference *MessageReference `json:"message_reference,omitempty"` // Flags - message flags `OR`d together, describes extra features of the message Flags MessageFlag `json:"flags,omitempty"` }
Message represents a message sent in a channel within Discord. https://discord.com/developers/docs/resources/channel#message-object-message-structure
type MessageActivityType ¶
type MessageActivityType int
MessageActivityType userd describes message activity types https://discord.com/developers/docs/resources/channel#message-object-message-activity-types
const ( // MessageActivityTypeJoin - JOIN MessageActivityTypeJoin MessageActivityType = 1 // MessageActivityTypeSpectate - SPECTATE MessageActivityTypeSpectate MessageActivityType = 2 //MessageActivityTypeListen - LISTEN MessageActivityTypeListen MessageActivityType = 3 // MessageActivityTypeJoinRequest - JOIN_REQUEST MessageActivityTypeJoinRequest MessageActivityType = 5 )
type MessageFlag ¶
type MessageFlag int
MessageFlag used for describing extra features of the message by bits https://discord.com/developers/docs/resources/channel#message-object-message-flags
const ( // MessageFlagsCrossposted - this message has been published to subscribed channels (via Channel Following) MessageFlagsCrossposted MessageFlag = 1 << 0 // MessageFlagIsCrosspost - this message originated from a message in another channel (via Channel Following) MessageFlagIsCrosspost MessageFlag = 1 << 1 // MessageFlagSupressEmbeds - do not include any embeds when serializing this message MessageFlagSupressEmbeds MessageFlag = 1 << 2 // MessageFlagSourceMessageDeleted - the source message for this crosspost has been deleted (via Channel Following) MessageFlagSourceMessageDeleted MessageFlag = 1 << 3 // MessageFlagUrgent - this message came from the urgent message system MessageFlagUrgent MessageFlag = 1 << 4 )
type MessageReference ¶
type MessageReference struct { // MessageID (snowflake) - ID of the originating message MessageID snowflake.Snowflake `json:"name,omitempty"` // ChannelID (snowflake) - ID of the originating message's channel ChannelID snowflake.Snowflake `json:"channel_id"` // GuildID (snowflake) - ID of the originating message's guild GuildID snowflake.Snowflake `json:"guild_id,omitempty"` }
MessageReference represents Message Reference Structure https://discord.com/developers/docs/resources/channel#message-object-message-reference-structure
type Reaction ¶
type Reaction struct { // Count - times this emoji has been used to react Count int `json:"count"` // Me - whether the current user reacted using this emoji Me bool `json:"me"` // Emoji - emoji information Emoji *Emoji `json:"emoji"` }
Reaction represents Reaction Structure https://discord.com/developers/docs/resources/channel#reaction-object-reaction-structure
type Role ¶
type Role struct { // ID (snowflake) - role ID ID snowflake.Snowflake `json:"id"` // Name - role name Name string `json:"name"` // COlor - integer representation of hexadecimal color code Color int `json:"color"` // Hoist - if this role is pinned in the user listing Hoist bool `json:"hoist"` // Position - position of this role Position int `json:"position"` // Permissions - permission bit set Permissions int `json:"permissions"` // Managed - whether this role is managed by an integration Managed bool `json:"managed"` // Mentionable - whether this role is mentionable Mentionable bool `json:"mentionable"` }
Role - Roles represent a set of permissions attached to a group of users. Roles have unique names, colors, and can be "pinned" to the side bar, causing their members to be listed separately. Roles are unique per guild, and can have separate permission profiles for the global context (guild) and channel context. The @everyone role has the same ID as the guild it belongs to. https://discord.com/developers/docs/topics/permissions#role-object-role-structure
type User ¶
type User struct { // ID (snowflake) - the user's id ID snowflake.Snowflake `json:"id"` // - the user's username, not unique across the platform Username string `json:"username"` // - the user's 4-digit discord-tag Discriminator string `json:"discriminator"` // - the user's avatar hash Avatar string `json:"avatar,omitempty"` // - whether the user belongs to an OAuth2 application Bot bool `json:"bot,omitempty"` // - whether the user is an Official Discord System user (part of the urgent message system) System bool `json:"system,omitempty"` // - whether the user has two factor enabled on their account MfaEnabled bool `json:"mfa_enabled,omitempty"` // - the user's chosen language option Locale string `json:"locale,omitempty"` // - whether the email on this account has been verified Verified bool `json:"verified,omitempty"` // - the user's email Email string `json:"email,omitempty"` // - the flags on a user's account Flags UserFlag `json:"flags,omitempty"` // - the type of Nitro subscription on a user's account PremiumType UserPremiumType `json:"premium_type,omitempty"` // - the public flags on a user's account PublicFlags UserFlag `json:"public_flags,omitempty"` // Member - user's member object Member *GuildMember `json:"member,omitempty"` }
User represents User Structure https://discord.com/developers/docs/resources/user#user-object-user-structure
type UserFlag ¶
type UserFlag int
UserFlag used to describe user's flags by bits https://discord.com/developers/docs/resources/user#user-object-user-flags
const ( // UserFlagNone - None UserFlagNone UserFlag = 0 // UserFlagDiscordEmployee - Discord Employee UserFlagDiscordEmployee UserFlag = 1 << 0 // UserFlagDiscordPartner - Discord Partner UserFlagDiscordPartner UserFlag = 1 << 1 // UserFlagHypeSquadEvents - HypeSquad Events UserFlagHypeSquadEvents UserFlag = 1 << 2 // UserFlagBugHunterLevel1 - Bug Hunter Level 1 UserFlagBugHunterLevel1 UserFlag = 1 << 3 // UserFlagHouseBravery - House Bravery UserFlagHouseBravery UserFlag = 1 << 6 // UserFlagHouseBrilliance - House Brilliance UserFlagHouseBrilliance UserFlag = 1 << 7 // UserFlagHouseBalance - House Balance UserFlagHouseBalance UserFlag = 1 << 8 // UserFlagEarlySupporter - Early Supporter UserFlagEarlySupporter UserFlag = 1 << 9 // UserFlagTeamUser - Team User UserFlagTeamUser UserFlag = 1 << 10 // UserFlagSystem - System UserFlagSystem UserFlag = 1 << 12 // UserFlagBugHunterLevel2 - Bug Hunter Level 2 UserFlagBugHunterLevel2 UserFlag = 1 << 14 // UserFlagVerifiedBot - Verified Bot UserFlagVerifiedBot UserFlag = 1 << 16 // UserFlagVerifiedBotDeveloper - Verified Bot Developer UserFlagVerifiedBotDeveloper UserFlag = 1 << 17 )
type UserPremiumType ¶
type UserPremiumType int
UserPremiumType - premium types denote the level of premium a user has. https://discord.com/developers/docs/resources/user#user-object-premium-types
const ( // UserPremiumTypeNone - None UserPremiumTypeNone UserPremiumType = 0 // UserPremiumTypeNitroClassic - Nitro Classic UserPremiumTypeNitroClassic UserPremiumType = 1 // UserPremiumTypeNitro - Nitro UserPremiumTypeNitro UserPremiumType = 2 )
type Webhook ¶
type Webhook struct { // ID (snowflake) - the id of the webhook ID snowflake.Snowflake `json:"id"` // Type - the type of the webhook Type WebhookType `json:"type"` // GuildID (snowflake) - the guild id this webhook is for GuildID snowflake.Snowflake `json:"guild_id,omitempty"` // ChannelID (snowflake) - the channel id this webhook is for ChannelID snowflake.Snowflake `json:"channel_id"` // User - the user this webhook was created by (not returned when getting a webhook with its token) User *User `json:"user,omitempty"` // Name - the default name of the webhook Name string `json:"name,omitempty"` // Avatar - the default avatar of the webhook Avatar string `json:"avatar,omitempty"` // Token - the secure token of the webhook (returned for Incoming Webhooks) Token string `json:"token,omitempty"` }
Webhook represents Webhook Structure https://discord.com/developers/docs/resources/webhook#webhook-object-webhook-structure
type WebhookAPI ¶
type WebhookAPI struct { // URL of webhook URL *url.URL // Client which will be used for http requests Client *http.Client // Wait - if `true`, then the response will be expected and parsed in `msg`. Wait bool }
WebhookAPI - for those, who wants to use single webhook url several times
func NewWebhookAPI ¶
func NewWebhookAPI(webhookID snowflake.Snowflake, webhookToken string, wait bool, client *http.Client) (*WebhookAPI, error)
NewWebhookAPI creates WebhookExecuter (https://discord.com/api/webhooks/WEBHOOK_ID/WEBHOOK_TOKEN). if `wait` is `true`, then the response for method `Execute` will be expected and parsed in `msg`. client - *http.Client which will be used for http requests
func (*WebhookAPI) Delete ¶
func (wa *WebhookAPI) Delete(ctx context.Context) error
Delete - deletes a webhook. Returns http status code, error
func (*WebhookAPI) Execute ¶
func (wa *WebhookAPI) Execute(ctx context.Context, wep *WebhookExecuteParams, file io.Reader, filename string) (*Message, error)
Execute - executes webhook. If `wait` was set to `true`, then the response will be expected and parsed in `msg`. Return message, http status code, error
func (*WebhookAPI) Get ¶
func (wa *WebhookAPI) Get(ctx context.Context) (*Webhook, error)
Get - gets information about webhook. Return webhook, http status code, error
func (*WebhookAPI) Modify ¶
func (wa *WebhookAPI) Modify(ctx context.Context, wmp *WebhookModifyParams) (*Webhook, error)
Modify - modifies a webhook. Return webhook, http status code, error
type WebhookExecuteParams ¶
type WebhookExecuteParams struct { // Content - the message contents (up to 2000 characters) [Required: one of content, file, embeds] Content string `json:"content,omitempty"` // Username - override the default username of the webhook [Required: false] Username string `json:"username,omitempty"` // AvatarURL - override the default avatar of the webhook [Required: false] AvatarURL string `json:"avatar_url,omitempty"` // TTS - true if this is a TTS message [Required: false] TTS bool `json:"tts,omitempty"` // Embeds - array of up to 10 embed objects [Required: one of content, file, embeds] Embeds []*Embed `json:"embeds,omitempty"` // AllowedMentions - allowed mentions for the message [Required: false] AllowedMentions *AllowedMentions `json:"allowed_mentions,omitempty"` }
WebhookExecuteParams represents webhook params payload structure https://discord.com/developers/docs/resources/webhook#execute-webhook-jsonform-params
type WebhookModifyParams ¶
type WebhookModifyParams struct { // Name - the default name of the webhook Name string `json:"name,omitempty"` // Avatar - image for the default webhook avatar // Look https://discord.com/developers/docs/reference#image-data Avatar string `json:"avatar,omitempty"` // ChannelID - the new channel id this webhook should be moved to ChannelID snowflake.Snowflake `json:"channel_id,omitempty"` }
WebhookModifyParams represents modify params for webhook api https://discord.com/developers/docs/resources/webhook#modify-webhook-json-params
type WebhookType ¶
type WebhookType int
WebhookType used for describing webhook types https://discord.com/developers/docs/resources/webhook#webhook-object-webhook-types
const ( // WebhookTypeIncoming - incoming Webhooks can post messages to channels with a generated token WebhookTypeIncoming WebhookType = 1 // WebhookTypeChannelFollower - channel Follower Webhooks are internal webhooks used with Channel Following to post new messages into channels WebhookTypeChannelFollower WebhookType = 2 )