use futures::future::Future;
use reqwest::Method;
use spectacles_model::channel::{Channel, CreateChannelOptions};
use spectacles_model::guild::{AddMemberOptions, CreateRoleOptions, GetAuditLogOptions, Guild, GuildAuditLog, GuildBan, GuildEmbed, GuildIntegration, GuildMember, GuildPrune, ListMembersOptions, ModifyGuildEmbedOptions, ModifyGuildIntegrationOptions, ModifyGuildOptions, ModifyMemberOptions, ModifyRoleOptions, Role};
use spectacles_model::invite::Invite;
use spectacles_model::message::{CreateEmojiOptions, Emoji, Webhook};
use spectacles_model::snowflake::Snowflake;
use spectacles_model::voice::VoiceRegion;
use crate::{Error, RestClient};
use crate::Endpoint;
pub struct GuildView {
id: u64,
client: RestClient,
}
impl GuildView {
pub(crate) fn new(id: u64, client: RestClient) -> Self {
Self {
id,
client,
}
}
pub fn modify(&self, opts: ModifyGuildOptions) -> impl Future<Item=Guild, Error=Error> {
self.client.request(
Endpoint::new(
Method::PATCH,
format!("/guilds/{}", self.id),
).json(opts)
)
}
pub fn delete(&self) -> impl Future<Item=(), Error=Error> {
self.client.request(Endpoint::new(
Method::DELETE,
format!("/guilds/{}", self.id),
))
}
pub fn get_channels(&self) -> impl Future<Item=Vec<Channel>, Error=Error> {
self.client.request(Endpoint::new(
Method::GET,
format!("/guilds/{}/channels", self.id),
))
}
pub fn create_channel(&self, opts: CreateChannelOptions) -> impl Future<Item=Channel, Error=Error> {
self.client.request(
Endpoint::new(
Method::POST,
format!("/guilds/{}/channels", self.id),
).json(opts)
)
}
pub fn modify_channel_positions(&self) {}
pub fn get_webhooks(&self) -> impl Future<Item=Webhook, Error=Error> {
self.client.request(Endpoint::new(
Method::GET,
format!("/guilds/{}/webhooks", self.id),
))
}
pub fn get_member(&self, id: &Snowflake) -> impl Future<Item=GuildMember, Error=Error> {
self.client.request(Endpoint::new(
Method::GET,
format!("/guilds/{}/members/{}", self.id, id.0),
))
}
pub fn list_members(&self, opts: ListMembersOptions) -> impl Future<Item=Vec<GuildMember>, Error=Error> {
self.client.request(
Endpoint::new(
Method::GET,
format!("/guilds/{}/members", self.id),
).query(opts)
)
}
pub fn add_member(&self, id: &Snowflake, opts: AddMemberOptions) -> impl Future<Item=GuildMember, Error=Error> {
self.client.request(
Endpoint::new(
Method::PUT,
format!("/guilds/{}/members/{}", self.id, id.0),
).json(opts)
)
}
pub fn add_member_role(&self, member: &Snowflake, role: &Snowflake) -> impl Future<Item=(), Error=Error> {
self.client.request_empty(
Endpoint::new(
Method::PUT,
format!("/guilds/{}/members/{}/roles/{}", self.id, member.0, role.0),
)
)
}
pub fn get_emojis(&self) -> impl Future<Item=Vec<Emoji>, Error=Error> {
self.client.request(Endpoint::new(
Method::GET,
format!("/guilds/{}/emojis", self.id),
))
}
pub fn get_emoji(&self, emoji: &Snowflake) -> impl Future<Item=Emoji, Error=Error> {
self.client.request(Endpoint::new(
Method::GET,
format!("/guilds/{}/emojis/{}", self.id, emoji.0),
))
}
pub fn create_emoji(&self, opts: CreateEmojiOptions) -> impl Future<Item=Emoji, Error=Error> {
self.client.request(
Endpoint::new(
Method::POST,
format!("/guilds/{}/emojis", self.id),
).json(opts)
)
}
pub fn modify_emoji(&self, id: &Snowflake, opts: ModifyGuildEmbedOptions) -> impl Future<Item=Emoji, Error=Error> {
self.client.request(
Endpoint::new(
Method::PATCH,
format!("/guilds/{}/emojis/{}", self.id, id.0),
).json(opts)
)
}
pub fn delete_emoji(&self, id: &Snowflake) -> impl Future<Item=(), Error=Error> {
self.client.request_empty(Endpoint::new(
Method::DELETE,
format!("/guilds/{}/emojis/{}", self.id, id.0),
))
}
pub fn get_audit_log(&self, opts: GetAuditLogOptions) -> impl Future<Item=GuildAuditLog, Error=Error> {
self.client.request(Endpoint::new(
Method::GET,
format!("/guilds/{}/audit-logs", self.id),
).query(opts))
}
pub fn get_bans(&self) -> impl Future<Item=Vec<GuildBan>, Error=Error> {
self.client.request(Endpoint::new(
Method::GET,
format!("/guilds/{}/bans", self.id),
))
}
pub fn get_ban(&self, user: &Snowflake) -> impl Future<Item=GuildBan, Error=Error> {
self.client.request(Endpoint::new(
Method::GET,
format!("/guilds/{}/bans/{}", self.id, user.0),
))
}
pub fn remove_ban(&self, user: &Snowflake) -> impl Future<Item=(), Error=Error> {
self.client.request_empty(Endpoint::new(
Method::DELETE,
format!("/guilds/{}/bans/{}", self.id, user.0),
))
}
pub fn get_roles(&self) -> impl Future<Item=Vec<Role>, Error=Error> {
self.client.request(Endpoint::new(
Method::GET,
format!("/guilds/{}/roles", self.id),
))
}
pub fn create_role(&self, opts: CreateRoleOptions) -> impl Future<Item=Role, Error=Error> {
self.client.request(
Endpoint::new(
Method::POST,
format!("/guilds/{}/roles", self.id),
).json(opts)
)
}
pub fn modify_role(&self, role: &Snowflake, opts: ModifyRoleOptions) -> impl Future<Item=Role, Error=Error> {
self.client.request(
Endpoint::new(
Method::PATCH,
format!("/guilds/{}/roles/{}", self.id, role.0),
).json(opts)
)
}
pub fn get_prune_count(&self, days: i32) -> impl Future<Item=GuildPrune, Error=Error> {
let query = json!({
"days": days
});
self.client.request(
Endpoint::new(
Method::GET,
format!("/guilds/{}/prune", self.id),
).query(query)
)
}
pub fn prune_members(&self, days: i32, compute: bool) -> impl Future<Item=GuildPrune, Error=Error> {
let body = json!({
"days": days,
"compute_prune_count": compute
});
self.client.request(
Endpoint::new(
Method::POST,
format!("/guilds/{}/prune", self.id),
).json(body)
)
}
pub fn get_voice_regions(&self) -> impl Future<Item=Vec<VoiceRegion>, Error=Error> {
self.client.request(Endpoint::new(
Method::GET,
format!("/guilds/{}/regions", self.id),
))
}
pub fn get_invites(&self) -> impl Future<Item=Vec<Invite>, Error=Error> {
self.client.request(Endpoint::new(
Method::GET,
format!("/guilds/{}/invites", self.id),
))
}
pub fn get_integrations(&self) -> impl Future<Item=Vec<GuildIntegration>, Error=Error> {
self.client.request(Endpoint::new(
Method::GET,
format!("/guilds/{}/integrations", self.id),
))
}
pub fn add_integration(&self, kind: &str, id: &Snowflake) -> impl Future<Item=(), Error=Error> {
let body = json!({
"type": kind,
"id": id
});
self.client.request_empty(
Endpoint::new(
Method::POST,
format!("/guilds/{}/integrations", self.id),
).json(body)
)
}
pub fn modify_integration(&self, id: &Snowflake, opts: ModifyGuildIntegrationOptions) -> impl Future<Item=(), Error=Error> {
self.client.request_empty(
Endpoint::new(
Method::PATCH,
format!("/guilds/{}/integrations/{}", self.id, id.0),
).json(opts)
)
}
pub fn delete_integration(&self, id: &Snowflake) -> impl Future<Item=(), Error=Error> {
self.client.request_empty(Endpoint::new(
Method::DELETE,
format!("/guilds/{}/integrations/{}", self.id, id.0),
))
}
pub fn sync_integration(&self, id: &Snowflake) -> impl Future<Item=(), Error=Error> {
self.client.request_empty(Endpoint::new(
Method::POST,
format!("/guilds/{}/integrations/{}", self.id, id.0),
))
}
pub fn get_embed(&self) -> impl Future<Item=GuildEmbed, Error=Error> {
self.client.request(Endpoint::new(
Method::GET,
format!("/guilds/{}/embed", self.id),
))
}
pub fn modify_embed(&self, opts: ModifyGuildEmbedOptions) -> impl Future<Item=GuildEmbed, Error=Error> {
self.client.request(
Endpoint::new(
Method::PATCH,
format!("/guilds/{}/embed", self.id),
).json(opts)
)
}
pub fn modify_role_positions(&self) {}
pub fn remove_member_role(&self, member: &Snowflake, role: &Snowflake) -> impl Future<Item=(), Error=Error> {
self.client.request_empty(Endpoint::new(
Method::DELETE,
format!("/guilds/{}/members/{}/roles/{}", self.id, member.0, role.0),
))
}
pub fn modify_member(&self, id: &Snowflake, opts: ModifyMemberOptions) -> impl Future<Item=(), Error=Error> {
self.client.request_empty(
Endpoint::new(
Method::PATCH,
format!("/guilds/{}/members/{}", self.id, id.0),
).json(opts)
)
}
pub fn remove_member(&self, member: &Snowflake) -> impl Future<Item=(), Error=Error> {
self.client.request_empty(Endpoint::new(
Method::DELETE,
format!("/guilds/{}/members/{}", self.id, member.0),
))
}
pub fn set_current_user_nick(&self, nick: &str) -> impl Future<Item=String, Error=Error> {
let json = json!({
"nick": nick
});
self.client.request(
Endpoint::new(
Method::PATCH,
format!("/guilds/{}/members/@me/nick", self.id),
).json(json)
)
}
}