/
Endpoints.pm6
129 lines (103 loc) · 4.54 KB
/
Endpoints.pm6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# Not sure we're using this, and if we are, not properly.
class X::API::Discord::Endpoint::NotEnoughArguments is Exception {
has @.required is required;
has $.endpoint is required;
method message {
return "You need to define {@.required} for endpoint {$.endpoint}";
}
}
module API::Discord::Endpoints {
our %ENDPOINTS =
User =>
{
read => '/users/{id}',
update => '/users/{id}',
get-guilds => '/users/{id}/guilds',
leave-guild => '/users/{id}/guilds',
get-dms => '/users/{id}/channels',
create-dm => '/users/{id}/channels',
# This is OAuth2 stuff, so we probably won't use it
get-connections => '/users/{id}/connections'
},
Channel =>
{
create => '/channels',
read => '/channels/{id}',
update => '/channels/{id}',
delete => '/channels/{id}',
get-messages => '/channels/{id}/messages',
bulk-delete-messages => '/channels/{id}/messages/bulk-delete',
edit-permissions => '/channels/{id}/permissions/{overwrite-id}',
delete-permission => '/channels/{id}/permissions/{overwrite-id}',
get-invites => '/channels/{id}/invites',
create-invite => '/channels/{id}/invites',
trigger-typing => '/channels/{id}/typing',
pinned-messages => '/channels/{id}/pins',
pinned-message => '/channels/{id}/pins/{message-id}',
add-group-recipient => '/channels/{id}/recipients/{user-id}',
remove-group-recipient => '/channels/{id}/recipients/{user-id}',
},
Guild =>
{
create => '/guilds',
read => '/guilds/{id}',
update => '/guilds/{id}',
delete => '/guilds/{id}',
get-channels => '/guilds/{id}/channels',
create-channel => '/guilds/{id}/channels',
get-member => '/guilds/{id}/members/{user-id}',
list-members => '/guilds/{id}/members',
add-member => '/guilds/{id}/members/{user-id}',
modify-member => '/guilds/{id}/members/{user-id}',
remove-member => '/guilds/{id}/members/{user-id}',
get-bans => '/guilds/{id}/bans',
create-ban => '/guilds/{id}/bans/{user.id}',
revoke-ban => '/guilds/{id}/bans/{user.id}',
get-prune-count => '/guilds/{id}/prune',
begin-prune => '/guilds/{id}/prune',
get-integrations => '/guilds/{id}/integrations',
create-integration => '/guilds/{id}/integrations',
modify-integration => '/guilds/{id}/integrations/{integration-id}',
delete-integration => '/guilds/{id}/integrations/{integration-id}',
sync-integration => '/guilds/{id}/integrations/{integration-id}/sync',
get-embed => '/guilds/{id}/embed',
modify-embed => '/guilds/{id}/embed',
modify-nick => '/guilds/{id}/members/@me/nick',
get-invites => '/guilds/{id}/invites',
get-voice-regions => '/guilds/{id}/regions',
audit-log => '/guilds/{id}/audit-logs',
vanity-url => '/guilds/{id}/vanity-url',
},
Message =>
{
create => '/channels/{channel-id}/messages',
read => '/channels/{channel-id}/messages/{id}',
update => '/channels/{channel-id}/messages/{id}',
delete => '/channels/{channel-id}/messages/{id}',
},
Reaction =>
{
create => '/channels/{message.channel-id}/messages/{message.id}/reactions/{emoji}/{user}',
read => '/channels/{message.channel-id}/messages/{message.id}/reactions/{emoji}',
delete => '/channels/{message.channel-id}/messages/{message.id}/reactions/{emoji}/{user}',
}
;
sub endpoint-for ($r, $method, *%args) is export {
my $type = $r.WHAT.^name.split('::')[*-1];
my $e = %ENDPOINTS{$type}{$method};
my @required-fields = $e ~~ m:g/ '{' <( .+? )> '}' /;
for @required-fields -> $f {
next if %args{$f};
my @f = $f.split('.');
my $val = reduce { $^a."$^b"() }, $r, |@f;
%args{$f} = $val if $val;
}
unless %args{@required-fields}:exists.all {
X::API::Discord::Endpoint::NotEnoughArguments.new(
required => @required-fields,
endpoint => "{$method.uc} $type"
).throw;
}
return S:g['{' ( .+? ) '}' ] = %args{$/[0]} given $e;
}
}