1
0
Fork 0
mirror of https://github.com/diamondburned/arikawa.git synced 2024-12-10 23:45:42 +00:00
arikawa/api/channel.go

265 lines
9.3 KiB
Go
Raw Normal View History

2020-01-02 05:39:52 +00:00
package api
import (
"github.com/diamondburned/arikawa/discord"
"github.com/diamondburned/arikawa/utils/httputil"
"github.com/diamondburned/arikawa/utils/json/option"
2020-01-02 05:39:52 +00:00
)
var EndpointChannels = Endpoint + "channels/"
2020-01-02 05:39:52 +00:00
2020-05-11 22:06:19 +00:00
// Channels returns a list of guild channel objects.
func (c *Client) Channels(guildID discord.Snowflake) ([]discord.Channel, error) {
2020-01-05 07:50:22 +00:00
var chs []discord.Channel
2020-05-11 22:06:19 +00:00
return chs, c.RequestJSON(&chs, "GET", EndpointGuilds+guildID.String()+"/channels")
2020-01-05 07:50:22 +00:00
}
2020-05-11 22:06:19 +00:00
// https://discord.com/developers/docs/resources/guild#create-guild-channel-json-params
2020-01-05 07:50:22 +00:00
type CreateChannelData struct {
2020-05-11 22:06:19 +00:00
// Name is the channel name (2-100 characters).
//
// Channel Type: All
Name string `json:"name"`
// Type is the type of channel.
//
// Channel Type: All
Type discord.ChannelType `json:"type,omitempty"`
2020-05-11 22:06:19 +00:00
// Topic is the channel topic (0-1024 characters).
//
// Channel Types: Text, News
Topic string `json:"topic,omitempty"`
// VoiceBitrate is the bitrate (in bits) of the voice channel.
// 8000 to 96000 (128000 for VIP servers)
//
// Channel Types: Voice
VoiceBitrate uint `json:"bitrate,omitempty"`
// VoiceUserLimit is the user limit of the voice channel.
// 0 refers to no limit, 1 to 99 refers to a user limit.
//
// Channel Types: Voice
2020-01-05 07:50:22 +00:00
VoiceUserLimit uint `json:"user_limit,omitempty"`
2020-05-11 22:06:19 +00:00
// UserRateLimit is the amount of seconds a user has to wait before sending
// another message (0-21600).
// Bots, as well as users with the permission manage_messages or
// manage_channel, are unaffected.
//
// Channel Types: Text
2020-01-05 07:50:22 +00:00
UserRateLimit discord.Seconds `json:"rate_limit_per_user,omitempty"`
2020-05-11 22:06:19 +00:00
// Position is the sorting position of the channel.
//
// Channel Types: All
Position option.Int `json:"position,omitempty"`
2020-05-11 22:06:19 +00:00
// Permissions are the channel's permission overwrites.
//
// Channel Types: All
2020-01-05 07:50:22 +00:00
Permissions []discord.Overwrite `json:"permission_overwrites,omitempty"`
2020-05-11 22:06:19 +00:00
// CategoryID is the id of the parent category for a channel.
//
// Channel Types: Text, News, Store, Voice
CategoryID discord.Snowflake `json:"parent_id,string,omitempty"`
// NSFW specifies whether the channel is nsfw.
//
// Channel Types: Text, News, Store.
NSFW bool `json:"nsfw,omitempty"`
2020-01-05 07:50:22 +00:00
}
2020-05-11 22:06:19 +00:00
// CreateChannel creates a new channel object for the guild.
//
// Requires the MANAGE_CHANNELS permission.
// Fires a Channel Create Gateway event.
func (c *Client) CreateChannel(
2020-05-11 22:06:19 +00:00
guildID discord.Snowflake, data CreateChannelData) (*discord.Channel, error) {
2020-01-05 07:50:22 +00:00
var ch *discord.Channel
return ch, c.RequestJSON(
&ch, "POST",
EndpointGuilds+guildID.String()+"/channels",
httputil.WithJSONBody(data),
2020-01-05 07:50:22 +00:00
)
}
type MoveChannelData struct {
2020-05-11 22:06:19 +00:00
// ID is the channel id.
ID discord.Snowflake `json:"id"`
// Position is the sorting position of the channel
Position option.Int `json:"position"`
}
2020-01-05 07:50:22 +00:00
2020-05-11 22:06:19 +00:00
// MoveChannel modifies the position of channels in the guild.
//
// Requires MANAGE_CHANNELS.
func (c *Client) MoveChannel(guildID discord.Snowflake, datum []MoveChannelData) error {
2020-01-05 07:50:22 +00:00
return c.FastRequest(
"PATCH",
2020-05-11 22:06:19 +00:00
EndpointGuilds+guildID.String()+"/channels", httputil.WithJSONBody(datum),
2020-01-05 07:50:22 +00:00
)
}
2020-05-11 22:06:19 +00:00
// Channel gets a channel by ID. Returns a channel object.
func (c *Client) Channel(channelID discord.Snowflake) (*discord.Channel, error) {
2020-01-05 07:50:22 +00:00
var channel *discord.Channel
return channel, c.RequestJSON(&channel, "GET", EndpointChannels+channelID.String())
2020-01-05 07:50:22 +00:00
}
2020-05-11 22:06:19 +00:00
// https://discord.com/developers/docs/resources/channel#modify-channel-json-params
2020-01-05 07:50:22 +00:00
type ModifyChannelData struct {
2020-05-11 22:06:19 +00:00
// Name is the 2-100 character channel name.
//
// Channel Types: All
Name string `json:"name,omitempty"`
2020-05-11 22:06:19 +00:00
// Type is the type of the channel.
// Only conversion between text and news is supported and only in guilds
// with the "NEWS" feature
//
// Channel Types: Text, News
Type *discord.ChannelType `json:"type,omitempty"`
// Postion is the position of the channel in the left-hand listing
//
// Channel Types: All
Position option.NullableInt `json:"position,omitempty"`
// Topic is the 0-1024 character channel topic.
//
// Channel Types: Text, News
Topic option.NullableString `json:"topic,omitempty"`
// NSFW specifies whether the channel is nsfw.
//
// Channel Types: Text, News, Store.
NSFW option.NullableBool `json:"nsfw,omitempty"`
// UserRateLimit is the amount of seconds a user has to wait before sending
// another message (0-21600).
// Bots, as well as users with the permission manage_messages or
// manage_channel, are unaffected.
//
// Channel Types: Text
UserRateLimit option.NullableUint `json:"rate_limit_per_user,omitempty"`
// VoiceBitrate is the bitrate (in bits) of the voice channel.
// 8000 to 96000 (128000 for VIP servers)
//
// Channel Types: Voice
VoiceBitrate option.NullableUint `json:"bitrate,omitempty"`
// VoiceUserLimit is the user limit of the voice channel.
// 0 refers to no limit, 1 to 99 refers to a user limit.
//
// Channel Types: Voice
VoiceUserLimit option.NullableUint `json:"user_limit,omitempty"`
// Permissions are the channel or category-specific permissions.
//
// Channel Types: All
Permissions *[]discord.Overwrite `json:"permission_overwrites,omitempty"`
2020-05-11 22:06:19 +00:00
// CategoryID is the id of the new parent category for a channel.
// Channel Types: Text, News, Store, Voice
2020-01-05 07:50:22 +00:00
CategoryID discord.Snowflake `json:"parent_id,string,omitempty"`
2020-01-02 05:39:52 +00:00
}
2020-05-11 22:06:19 +00:00
// ModifyChannel updates a channel's settings.
//
// Requires the MANAGE_CHANNELS permission for the guild.
func (c *Client) ModifyChannel(channelID discord.Snowflake, data ModifyChannelData) error {
2020-05-11 22:06:19 +00:00
return c.FastRequest("PATCH", EndpointChannels+channelID.String(), httputil.WithJSONBody(data))
2020-01-02 05:39:52 +00:00
}
2020-05-11 22:06:19 +00:00
// DeleteChannel deletes a channel, or closes a private message. Requires the
// MANAGE_CHANNELS permission for the guild. Deleting a category does not
// delete its child channels: they will have their parent_id removed and a
// Channel Update Gateway event will fire for each of them.
//
// Fires a Channel Delete Gateway event.
2020-01-02 05:39:52 +00:00
func (c *Client) DeleteChannel(channelID discord.Snowflake) error {
return c.FastRequest("DELETE", EndpointChannels+channelID.String())
}
2020-05-11 22:06:19 +00:00
// EditChannelPermission edits the channel's permission overwrites for a user
// or role in a channel. Only usable for guild channels.
//
// Requires the MANAGE_ROLES permission.
func (c *Client) EditChannelPermission(
channelID discord.Snowflake, overwrite discord.Overwrite) error {
2020-01-02 05:39:52 +00:00
url := EndpointChannels + channelID.String() + "/permissions/" + overwrite.ID.String()
2020-01-02 05:39:52 +00:00
overwrite.ID = 0
return c.FastRequest("PUT", url, httputil.WithJSONBody(overwrite))
2020-01-02 05:39:52 +00:00
}
2020-05-11 22:06:19 +00:00
// DeleteChannelPermission deletes a channel permission overwrite for a user or
// role in a channel. Only usable for guild channels.
//
// Requires the MANAGE_ROLES permission.
func (c *Client) DeleteChannelPermission(channelID, overwriteID discord.Snowflake) error {
2020-05-11 22:06:19 +00:00
return c.FastRequest(
"DELETE",
EndpointChannels+channelID.String()+"/permissions/"+overwriteID.String(),
)
2020-01-02 05:39:52 +00:00
}
// Typing posts a typing indicator to the channel. Undocumented, but the client
// usually clears the typing indicator after 8-10 seconds (or after a message).
func (c *Client) Typing(channelID discord.Snowflake) error {
return c.FastRequest("POST", EndpointChannels+channelID.String()+"/typing")
2020-01-02 05:39:52 +00:00
}
2020-05-11 22:06:19 +00:00
// PinnedMessages returns all pinned messages in the channel as an array of
// message objects.
func (c *Client) PinnedMessages(channelID discord.Snowflake) ([]discord.Message, error) {
var pinned []discord.Message
return pinned, c.RequestJSON(&pinned, "GET", EndpointChannels+channelID.String()+"/pins")
2020-01-02 05:39:52 +00:00
}
2020-05-11 22:06:19 +00:00
// PinMessage pins a message in a channel.
//
// Requires the MANAGE_MESSAGES permission.
2020-01-02 05:39:52 +00:00
func (c *Client) PinMessage(channelID, messageID discord.Snowflake) error {
return c.FastRequest("PUT", EndpointChannels+channelID.String()+"/pins/"+messageID.String())
2020-01-02 05:39:52 +00:00
}
2020-05-11 22:06:19 +00:00
// UnpinMessage deletes a pinned message in a channel.
//
// Requires the MANAGE_MESSAGES permission.
2020-01-02 05:39:52 +00:00
func (c *Client) UnpinMessage(channelID, messageID discord.Snowflake) error {
return c.FastRequest("DELETE", EndpointChannels+channelID.String()+"/pins/"+messageID.String())
2020-01-02 05:39:52 +00:00
}
// AddRecipient adds a user to a group direct message. As accessToken is needed,
// clearly this endpoint should only be used for OAuth. AccessToken can be
// obtained with the "gdm.join" scope.
func (c *Client) AddRecipient(
channelID, userID discord.Snowflake, accessToken, nickname string) error {
2020-01-02 05:39:52 +00:00
var params struct {
AccessToken string `json:"access_token"`
Nickname string `json:"nickname"`
}
params.AccessToken = accessToken
params.Nickname = nickname
return c.FastRequest(
"PUT",
EndpointChannels+channelID.String()+"/recipients/"+userID.String(),
httputil.WithJSONBody(params),
2020-01-02 05:39:52 +00:00
)
}
// RemoveRecipient removes a user from a group direct message.
func (c *Client) RemoveRecipient(channelID, userID discord.Snowflake) error {
2020-05-11 22:06:19 +00:00
return c.FastRequest(
"DELETE",
EndpointChannels+channelID.String()+"/recipients/"+userID.String(),
)
2020-01-02 05:39:52 +00:00
}
// Ack is the read state of a channel. This is undocumented.
type Ack struct {
Token string `json:"token"`
}
// Ack marks the read state of a channel. This is undocumented. The method will
// write to the ack variable passed in. If this method is called asynchronously,
// then ack should be mutex guarded.
func (c *Client) Ack(channelID, messageID discord.Snowflake, ack *Ack) error {
return c.RequestJSON(
ack, "POST",
2020-05-11 22:06:19 +00:00
EndpointChannels+channelID.String()+"/messages/"+messageID.String()+"/ack",
httputil.WithJSONBody(ack),
)
}