Skip to content

Commit 55b18ae

Browse files
swrgekrisppurg
andauthored
Helpers fix (continued) (#133)
* helpers/channel: fix overloading & template instantiation + more descriptive names * helpers/guild: fix template overloading * helpers/message: fix template overloading and instantiation issue * helpers/user: template instantiation fix * restapi/message: support `bulkDelete` helper * update examples/helpers.nim * macros: fix getClient "client not found" error (docs needed); mainClient is now a no-op. * WIP: reimplement getClient/mainClient properly * explicit discard in helpers example * helpers/message: use proper arguments & functions * restapi/message: fix variable typo * helpers/channel: fix missing argument * helpers/guild: pass value instead of option in `editEmoji` * some updates * WIP: helpers test suite * helpers/guild: pass reason argument to `editGuild` call * helpers/channel: fix template overloading confusion * include restapi and some new fields in interaction * helpers/channel: topic argument for `editStageInstance` from Option(int) to int * helpers/guild: `tuple` to `TriggerMetadata` for `getIntegrations` argument; use `when` instead of `if` in `removeBan`; `tuple` return type instead of `void` * helper/message: Add missing channel ID and with_member params to thread templates * Fix wrong parameter order in `followup` guild_id usage, missing NSFW flag in `registerCommand`, bad `guild_id` usage in `getCommand` * tests/testHelpers: add missing tests --------- Co-authored-by: krisppurg <mineharderytps801@gmail.com>
1 parent 49def77 commit 55b18ae

File tree

9 files changed

+995
-219
lines changed

9 files changed

+995
-219
lines changed

dimscord/helpers/channel.nim

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import asyncdispatch, options, json
2+
import ../restapi
23
import ../objects, ../constants
34

45
template pin*(m: Message, reason = ""): Future[void] =
56
## Add pinned message.
67
getClient.api.addChannelMessagePin(m.channel_id, m.id, reason)
7-
8-
template removePin*(m: Message, reason = ""): Future[void] =
8+
9+
template unpin*(m: Message, reason = ""): Future[void] =
910
## Remove pinned message.
1011
getClient.api.deleteChannelMessagePin(m.channel_id, m.id, reason)
1112

@@ -28,7 +29,7 @@ template edit*(ch: GuildChannel;
2829
): Future[GuildChannel] =
2930
## Modify a guild channel.
3031
getClient.api.editGuildChannel(
31-
ch.id, name, parent_id, name, parent_id, topic, rtc_region,
32+
ch.id, name, parent_id, topic, rtc_region,
3233
default_auto_archive_duration, video_quality_mode, flags, available_tags,
3334
default_reaction_emoji, default_sort_order, default_forum_layout,
3435
rate_limit_per_user, default_thread_rate_limit_per_user,
@@ -41,6 +42,7 @@ template createChannel*(g: Guild;
4142
parent_id, topic, rtc_region = none string; nsfw = none bool;
4243
position, video_quality_mode = none int;
4344
default_sort_order, default_forum_layout = none int;
45+
default_thread_rate_limit_per_user = none int;
4446
available_tags = none seq[ForumTag];
4547
default_reaction_emoji = none DefaultForumReaction;
4648
rate_limit_per_user = none range[0..21600];
@@ -53,6 +55,7 @@ template createChannel*(g: Guild;
5355
g.id, name, kind, parent_id, topic,
5456
rtc_region, nsfw, position, video_quality_mode,
5557
default_sort_order, default_forum_layout,
58+
default_thread_rate_limit_per_user,
5659
available_tags, default_reaction_emoji,
5760
rate_limit_per_user, bitrate, user_limit,
5861
permission_overwrites, reason
@@ -77,10 +80,9 @@ template createInvite*(ch: GuildChannel;
7780
target_type, reason
7881
)
7982

80-
template delete*(inv: Invite | string, reason = ""): Future[void] =
83+
template delete*(inv: Invite, reason = ""): Future[void] =
8184
## Delete a guild invite.
82-
let code = when inv is Invite: inv.code else: inv
83-
getClient.api.deleteInvite(code, reason)
85+
getClient.api.deleteInvite(inv.code, reason)
8486

8587
template getInvites*(ch: GuildChannel): Future[seq[Invite]] =
8688
## Gets a list of a channel's invites.
@@ -90,19 +92,14 @@ template getWebhooks*(ch: GuildChannel): Future[seq[Webhook]] =
9092
## Gets a list of a channel's webhooks.
9193
getClient.api.getChannelWebhooks(ch.id)
9294

93-
template deleteWebhook*(w: Webhook | string, reason = ""): Future[void] =
95+
template delete*(w: Webhook, reason = ""): Future[void] =
9496
## Deletes a webhook.
95-
let wid = when w is Webhook: w.id else: w
96-
getClient.api.deleteWebhook(wid, reason)
97+
getClient.api.deleteWebhook(w.id, reason)
9798

9899
template edit*(w: Webhook,
99-
name, avatar = none string;
100+
name, avatar, channel_id = none string;
100101
reason = ""): Future[void] =
101-
let chan = w.channel_id
102-
if chan.isSome:
103-
getClient.api.editWebhook(w.id, name, avatar, w.channel_id, reason)
104-
else:
105-
raise newException(CatchableError, "Webhook is not in a channel")
102+
getClient.api.editWebhook(w.id, name, avatar, channel_id, reason)
106103

107104
template newThread*(ch: GuildChannel;
108105
name: string;
@@ -123,7 +120,7 @@ template createStageInstance*(ch: GuildChannel;
123120
getClient.api.createStageInstance(ch.id, topic, privacy, reason)
124121

125122
template editStageInstance*(si: StageInstance | string,
126-
topic = none string;
123+
topic: string;
127124
privacy = none int; reason = ""): Future[StageInstance] =
128125
## Modify a stage instance.
129126
let st = when si is StageInstance: si.channel_id else: si
@@ -133,4 +130,4 @@ template deleteStageInstance*(si: StageInstance | string,
133130
reason = ""): Future[void] =
134131
## Delete the stage instance.
135132
let st = when si is StageInstance: si.channel_id else: si
136-
getClient.api.deleteStageInstance(st, reason)
133+
getClient.api.deleteStageInstance(st, reason)

dimscord/helpers/guild.nim

Lines changed: 61 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ template beginPrune*(g: Guild;
88
## Begins a guild prune.
99
getClient.api.beginGuildPrune(g.id, days, include_roles, compute_prune_count)
1010

11-
template getPruneCount*(g: Guild, days: int): Future[int] =
11+
template getPruneCount*(g: Guild; days: int): Future[int] =
1212
## Gets the prune count.
1313
getClient.api.getGuildPruneCount(g.id, days)
1414

15-
template edit*(g: Guild, lvl: MFALevel; reason = ""): Future[MFALevel] =
15+
template editMFA*(g: Guild; lvl: MFALevel; reason = ""): Future[MFALevel] =
1616
## Modify Guild MFA Level, requiring guild ownership.
1717
getClient.api.editGuildMFALevel(g.id, lvl, reason)
1818

@@ -35,33 +35,33 @@ template edit*(g: Guild;
3535
## Modifies a guild.
3636
## Icon needs to be a base64 image.
3737
## (See: https://nim-lang.org/docs/base64.html)
38-
##
39-
##
40-
## Read more at:
38+
##
39+
##
40+
## Read more at:
4141
## https://discord.com/developers/docs/resources/guild#modify-guild
42-
getClient.api.editGuild(
42+
getClient.api.editGuild(
4343
g.id, name, description, region, afk_channel_id, icon,
4444
discovery_splash, owner_id, splash, banner,
4545
system_channel_id, rules_channel_id,
4646
preferred_locale, public_updates_channel_id,
4747
verification_level, default_message_notifications,
4848
system_channel_flags,
4949
explicit_content_filter, afk_timeout,
50-
features, premium_progress_bar_enabled
50+
features, premium_progress_bar_enabled, reason
5151
)
5252

53-
template getAuditLogs*(g: Guild;
54-
user_id, before = "", action_type = -1;
53+
template getAuditLogs*(g: Guild;
54+
user_id, before = ""; action_type = -1;
5555
limit: range[1..100] = 50
5656
): Future[AuditLog] =
5757
## Get guild audit logs. The maximum limit is 100.
5858
getClient.api.getGuildAuditLogs(g.id, user_id, before, action_type, limit)
5959

60-
template deleteRole*(g: Guild, r: Role): Future[void] =
61-
## Deletes a guild role.
62-
getClient.api.deleteGuildRole(g.id, r.id)
60+
template deleteRole*(g: Guild; r: Role): Future[void] =
61+
## Deletes a guild role.
62+
getClient.api.deleteGuildRole(g.id, r.id)
6363

64-
template editRole*(g: Guild, r: Role;
64+
template editRole*(g: Guild; r: Role;
6565
name = none string;
6666
icon, unicode_emoji = none string;
6767
permissions = none PermObj; color = none int;
@@ -81,17 +81,17 @@ template getInvites*(g: Guild): Future[seq[InviteMetadata]] =
8181
## Gets guild invites.
8282
getClient.api.getGuildInvites(g.id)
8383

84-
template getVanity*(g: Guild): Future[tuple[code: Option[string], uses: int]] =
85-
## Get the guild vanity url. Requires the MANAGE_GUILD permission.
84+
template getVanity*(g: Guild): Future[tuple[code: Option[string]; uses: int]] =
85+
## Get the guild vanity url. Requires the MANAGE_GUILD permission.
8686
## `code` will be null if a vanity url for the guild is not set.
8787
getClient.api.getGuildVanityUrl(g.id)
8888

89-
template editMember*(g: Guild, m: Member;
89+
template editMember*(g: Guild; m: Member;
9090
nick, channel_id, communication_disabled_until = none string;
9191
roles = none seq[string];
9292
mute, deaf = none bool;
9393
reason = ""
94-
): Future[void] =
94+
): Future[void] =
9595
## Modifies a guild member
9696
## Note:
9797
## - `communication_disabled_until` - ISO8601 timestamp :: [<=28 days]
@@ -100,26 +100,33 @@ template editMember*(g: Guild, m: Member;
100100
roles, mute, deaf, reason
101101
)
102102

103-
template removeMember*(g: Guild, m: Member, reason = ""): Future[void] =
103+
template removeMember*(g: Guild; m: Member; reason = ""): Future[void] =
104104
## Removes a guild member.
105105
getClient.api.removeGuildMember(g.id, m.user.id, reason)
106106

107-
template getBan*(g: Guild, user_id: string): Future[GuildBan] =
107+
template getBan*(g: Guild; m: Member | string): Future[GuildBan] =
108108
## Gets guild ban.
109-
getClient.api.getGuildBan(g.id, mb.user.id)
109+
getClient.api.getGuildBan(g.id, (when m is Member: m.user.id else: m))
110110

111111
template getBans*(g: Guild): Future[seq[GuildBan]] =
112112
## Gets all the guild bans.
113113
getClient.api.getGuildBans(g.id)
114114

115-
template ban*(g: Guild, m: Member, deletemsgdays: range[0..7] = 0;
115+
template ban*(g: Guild; m: Member; delete_msg_days: range[0..7] = 0;
116116
reason = ""): Future[void] =
117117
## Creates a guild ban.
118-
getClient.api.createGuildBan(g.id, m.user.id, deletemsgdays, reason)
118+
getClient.api.createGuildBan(g.id, m.user.id, delete_msg_days, reason)
119119

120-
template removeBan*(g: Guild, mb: Member, reason = ""): Future[void] =
120+
template bulkBan*(g: Guild;
121+
user_ids: seq[string];
122+
delete_message_seconds = 0;
123+
reason = ""): Future[tuple[banned_users, failed_users: seq[string]]] =
124+
## Creates a guild bulk ban.
125+
getClient.api.bulkGuildBan(g.id, user_ids, delete_message_seconds, reason)
126+
127+
template removeBan*(g: Guild; u: User | string; reason = ""): Future[void] =
121128
## Removes a guild ban.
122-
getClient.api.removeGuildBan(mb.guild_id, mb.user.id, reason)
129+
getClient.api.removeGuildBan(g.id, (when u is User: u.id else: u), reason)
123130

124131
template getIntegrations*(g: Guild): Future[seq[Integration]] =
125132
## Gets a list of guild integrations.
@@ -129,47 +136,50 @@ template getWebhooks*(g: Guild): Future[seq[Webhook]] =
129136
## Gets a list of a channel's webhooks.
130137
getClient.api.getGuildWebhooks(g.id)
131138

132-
template deleteIntegration*(integ: Integration, reason = ""): Future[void] =
139+
template deleteIntegration*(integ: Integration; reason = ""): Future[void] =
133140
## Deletes a guild integration.
134141
getClient.api.deleteGuildIntegration(integ.id, reason)
135142

136143
template preview*(g: Guild): Future[GuildPreview] =
137144
## Gets guild preview.
138145
getClient.api.getGuildPreview(g.id)
139146

140-
template searchMembers*(g: Guild, query = "";
147+
template searchMembers*(g: Guild; query = "";
141148
limit: range[1..1000] = 1): Future[seq[Member]] =
142149
## Search for guild members.
143150
getClient.api.searchGuildMembers(g.id, query, limit)
144151

145-
template editEmoji*(g: Guild, e: Emoji, name = none string;
152+
template editEmoji*(g: Guild; e: Emoji; name = none string;
146153
roles = none seq[string];
147154
reason = ""
148155
): Future[Emoji] =
149156
## Modifies a guild emoji.
150-
getClient.api.editGuildEmoji(g.id, e.id, name, roles, reason)
157+
assert e.id.isSome, "Cannot edit Emoji: the emoji might not be custom"
158+
getClient.api.editGuildEmoji(g.id, e.id.unsafeGet(), name, roles, reason)
151159

152-
template deleteEmoji*(g: Guild, e: Emoji, reason = ""): Future[void] =
160+
template deleteEmoji*(g: Guild; e: Emoji; reason = ""): Future[void] =
153161
## Deletes a guild emoji.
154-
getClient.api.deleteGuildEmoji(g.id, e.id, reason)
162+
assert e.id.isSome, "Cannot delete Emoji: the emoji might not be custom"
163+
getClient.api.deleteGuildEmoji(g.id, e.id.unsafeGet(), reason)
155164

156165
template getRegions*(g: Guild): Future[seq[VoiceRegion]] =
157166
## Gets a guild's voice regions.
158167
getClient.api.getGuildVoiceRegions(g.id)
159168

160-
template editSticker*(g: Guild, s: Sticker;
169+
template editSticker*(g: Guild; s: Sticker;
161170
name, desc, tags = none string;
162171
reason = ""
163172
): Future[Sticker] =
164173
## Modify a guild sticker.
165174
getClient.api.editGuildSticker(g.id, s.id, name, desc, tags, reason)
166175

167-
template deleteSticker*(g: Guild, sk: Sticker, reason = ""): Future[Sticker] =
176+
template deleteSticker*(g: Guild; sk: Sticker; reason = ""): Future[Sticker] =
168177
## Deletes a guild sticker.
169-
getClient.api.deleteGuildSticker(sk.guild_id.get, sk.id, reason)
178+
getClient.api.deleteGuildSticker(sk.guild_id.get, sk.id,
179+
reason) # TODO: assert sk.guild_id.isSome, "Cannot delete Sticker: the bot is probably not in the sticker's owning guild."
170180

171181
template getScheduledEvent*(g: Guild;
172-
event_id: string, with_user_count = false
182+
event_id: string; with_user_count = false
173183
): Future[GuildScheduledEvent] =
174184
## Get a scheduled event in a guild.
175185
getClient.api.getScheduledEvent(g.id, event_id, with_user_count)
@@ -178,7 +188,7 @@ template getScheduledEvents*(g: Guild): Future[seq[GuildScheduledEvent]] =
178188
## Get all scheduled events in a guild.
179189
getClient.api.getScheduledEvents(g.id)
180190

181-
template edit*(g: Guild, gse: GuildScheduledEvent;
191+
template editEvent*(g: Guild; gse: GuildScheduledEvent;
182192
name, start_time, image = none string;
183193
channel_id, end_time, desc = none string;
184194
privacy_level = none GuildScheduledEventPrivacyLevel;
@@ -198,49 +208,45 @@ template edit*(g: Guild, gse: GuildScheduledEvent;
198208
reason
199209
)
200210

201-
template delete*(gse: GuildScheduledEvent, reason = ""): Future[void] =
202-
## Delete a scheduled event in guild.
203-
getClient.api.deleteScheduledEvent(gse.guild_id, gse.id, reason)
211+
template delete*(gse: GuildScheduledEvent; reason = ""): Future[void] =
212+
## Delete a scheduled event in guild.
213+
getClient.api.deleteScheduledEvent(gse.guild_id, gse.id, reason)
204214

205215
template getEventUsers*(gse: GuildScheduledEvent;
206-
limit = 100, with_member = false;
216+
limit = 100; with_member = false;
207217
before, after = ""
208218
): Future[seq[GuildScheduledEventUser]] =
209219
## Gets the users and/or members that were subscribed to the scheduled event.
210220
getClient.api.getScheduledEventUsers(
211-
gse.guild_id, gse.id,
212-
limit, with_member, before, after
221+
gse.guild_id, gse.id, limit, with_member, before, after
213222
)
214223

215224
template getRules*(g: Guild): Future[seq[AutoModerationRule]] =
216225
## Get a Guild's current AutoMod Rules
217226
getClient.api.getAutoModerationRules(g.id)
218227

219-
template getRule*(g: Guild, rule_id: string): Future[AutoModerationRule] =
228+
template getRule*(g: Guild; rule_id: string): Future[AutoModerationRule] =
220229
## Get a Guild's specific AutoMod Rule
221230
getClient.api.getAutoModerationRule(g.id, rule_id)
222231

223-
template deleteRule*(g: Guild, amr: AutoModerationRule): Future[void] =
232+
template deleteRule*(g: Guild; amr: AutoModerationRule): Future[void] =
224233
## deletes automod rule
225234
getClient.api.deleteAutoModerationRule(g.id, amr.id)
226235

227-
template editRule*(g: Guild, amr: AutoModerationRule;
228-
event_type = none int, name = none string;
236+
template editRule*(g: Guild; amr: AutoModerationRule;
237+
event_type = none int; name = none string;
229238
trigger_type = none ModerationTriggerType;
230-
trigger_metadata = none tuple[
231-
keyword_filter: seq[string],
232-
presets: seq[int]
233-
];
239+
trigger_metadata = none TriggerMetadata;
234240
actions = none seq[ModerationAction]; enabled = none bool;
235241
exempt_roles, exempt_channels = none seq[string];
236-
reason = ""
242+
reason = "";
237243
): Future[AutoModerationRule] =
238244
## Edits an automod rule.
239245
## `event_type` is gonna be 1 for SEND_MESSAGE
240246
getClient.api.editAutoModerationRule(
241-
g.id, amr.id, event_type,
247+
g.id, amr.id, event_type,
242248
name, trigger_type,
243-
trigger_metadata, actions,
244-
enabled, exempt_roles, exempt_channels,
245-
reason
246-
)
249+
trigger_metadata, actions,
250+
enabled, exempt_roles, exempt_channels,
251+
reason
252+
)

0 commit comments

Comments
 (0)