Skip to content

Commit 1279a28

Browse files
authored
Merge pull request #350 from Droid00000/feat/bot-server-prperties
feat: per-server avatars, banners, and bio for bots
2 parents 89d4ff0 + 5220a47 commit 1279a28

File tree

4 files changed

+62
-60
lines changed

4 files changed

+62
-60
lines changed

lib/discordrb/api/server.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,13 +147,13 @@ def update_member(token, server_id, user_id, nick: :undef, roles: :undef, mute:
147147

148148
# Update the current member's properties.
149149
# https://discord.com/developers/docs/resources/guild#modify-current-member
150-
def update_current_member(token, server_id, nick = :undef, reason = nil)
150+
def update_current_member(token, server_id, nick = :undef, reason = nil, bio = :undef, banner = :undef, avatar = :undef)
151151
Discordrb::API.request(
152152
:guilds_sid_members_me,
153153
server_id,
154154
:patch,
155155
"#{Discordrb::API.api_base}/guilds/#{server_id}/members/@me",
156-
{ nick: nick }.reject { |_, v| v == :undef }.to_json,
156+
{ nick: nick, bio: bio, banner: banner, avatar: avatar }.reject { |_, v| v == :undef }.to_json,
157157
Authorization: token,
158158
content_type: :json,
159159
'X-Audit-Log-Reason': reason

lib/discordrb/api/user.rb

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,21 @@ def change_own_nickname(token, server_id, nick, reason = nil)
4343
)
4444
end
4545

46-
# Update user data
46+
# @deprecated Please use {update_current_user} instead.
4747
# https://discord.com/developers/docs/resources/user#modify-current-user
48-
def update_profile(token, email, password, new_username, avatar, new_password = nil)
48+
def update_profile(token, _email, _password, new_username, avatar, _new_password = nil)
49+
update_current_user(token, new_username, avatar)
50+
end
51+
52+
# Update the properties of the user for the current bot.
53+
# https://discord.com/developers/docs/resources/user#modify-current-user
54+
def update_current_user(token, username = :undef, avatar = :undef, banner = :undef)
4955
Discordrb::API.request(
5056
:users_me,
5157
nil,
5258
:patch,
5359
"#{Discordrb::API.api_base}/users/@me",
54-
{ avatar: avatar, email: email, new_password: new_password, password: password, username: new_username }.to_json,
60+
{ username: username, avatar: avatar, banner: banner }.reject { |_, value| value == :undef }.to_json,
5561
Authorization: token,
5662
content_type: :json
5763
)
@@ -119,19 +125,6 @@ def connections(token)
119125
)
120126
end
121127

122-
# Change user status setting
123-
def change_status_setting(token, status)
124-
Discordrb::API.request(
125-
:users_me_settings,
126-
nil,
127-
:patch,
128-
"#{Discordrb::API.api_base}/users/@me/settings",
129-
{ status: status }.to_json,
130-
Authorization: token,
131-
content_type: :json
132-
)
133-
end
134-
135128
# Returns one of the "default" discord avatars from the CDN given a discriminator or id since new usernames
136129
# TODO: Maybe change this method again after discriminator removal ?
137130
def default_avatar(discrim_id = 0, legacy: false)

lib/discordrb/data/member.rb

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ module MemberAttributes
1313
started_home_actions: 1 << 5,
1414
completed_home_actions: 1 << 6,
1515
automod_quarantined_username: 1 << 7,
16-
dm_settings_upsell_acknowledged: 1 << 9
16+
dm_settings_upsell_acknowledged: 1 << 9,
17+
automod_quarantined_server_tag: 1 << 10
1718
}.freeze
1819

1920
# @return [Time] when this member joined the server.
@@ -383,6 +384,30 @@ def flags=(flags)
383384
update_member_data(flags: flags)
384385
end
385386

387+
# Set the server banner for the current bot.
388+
# @param banner [File, nil] A file like object that responds to read, or `nil`.
389+
def server_banner=(banner)
390+
raise 'Can only set a banner for the current bot' unless current_bot?
391+
392+
update_current_member_data(banner: banner.respond_to?(:read) ? Discordrb.encode64(banner) : banner)
393+
end
394+
395+
# Set the server avatar for the current bot.
396+
# @param avatar [File, nil] A file like object that responds to read, or `nil`.
397+
def server_avatar=(avatar)
398+
raise 'Can only set an avatar for the current bot' unless current_bot?
399+
400+
update_current_member_data(avatar: avatar.respond_to?(:read) ? Discordrb.encode64(avatar) : avatar)
401+
end
402+
403+
# Set the server bio for the current bot.
404+
# @param bio [String, nil] The new server bio for the bot, or nil.
405+
def server_bio=(bio)
406+
raise 'Can only set a bio for the current bot' unless current_bot?
407+
408+
update_current_member_data(bio: bio)
409+
end
410+
386411
# Update this member's roles
387412
# @note For internal use only.
388413
# @!visibility private
@@ -489,7 +514,10 @@ def update_member_data(new_data)
489514
def update_current_member_data(new_data)
490515
update_data(JSON.parse(API::Server.update_current_member(@bot.token, @server_id,
491516
new_data.key?(:nick) ? new_data[:nick] : :undef,
492-
new_data[:reason])))
517+
new_data[:reason],
518+
new_data.key?(:bio) ? new_data[:bio] : :undef,
519+
new_data.key?(:banner) ? new_data[:banner] : :undef,
520+
new_data.key?(:avatar) ? new_data[:avatar] : :undef)))
493521
end
494522
end
495523
end

lib/discordrb/data/profile.rb

Lines changed: 21 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ def username=(username)
1919
alias_method :name=, :username=
2020

2121
# Changes the bot's avatar.
22-
# @param avatar [String, #read] A JPG file to be used as the avatar, either
23-
# something readable (e.g. File Object) or as a data URL.
22+
# @param avatar [String, File, #read, nil] A file to be used as the avatar, either
23+
# something readable (e.g. File Object) or a data URI.
2424
def avatar=(avatar)
2525
if avatar.respond_to?(:read)
2626
update_profile_data(avatar: Discordrb.encode64(avatar))
@@ -29,38 +29,24 @@ def avatar=(avatar)
2929
end
3030
end
3131

32+
# Changes the bot's banner.
33+
# @param banner [String, File, #read, nil] A file to be used as the banner, either
34+
# something readable (e.g. File Object) or a data URI.
35+
def banner=(banner)
36+
if banner.respond_to?(:read)
37+
update_profile_data(banner: Discordrb.encode64(banner))
38+
else
39+
update_profile_data(banner: banner)
40+
end
41+
end
42+
3243
# Updates the cached profile data with the new one.
3344
# @note For internal use only.
3445
# @!visibility private
3546
def update_data(new_data)
36-
@username = new_data[:username] || @username
37-
@avatar_id = new_data[:avatar_id] || @avatar_id
38-
end
39-
40-
# Sets the user status setting to Online.
41-
# @note Only usable on User accounts.
42-
def online
43-
update_profile_status_setting('online')
44-
end
45-
46-
# Sets the user status setting to Idle.
47-
# @note Only usable on User accounts.
48-
def idle
49-
update_profile_status_setting('idle')
50-
end
51-
52-
# Sets the user status setting to Do Not Disturb.
53-
# @note Only usable on User accounts.
54-
def dnd
55-
update_profile_status_setting('dnd')
56-
end
57-
58-
alias_method(:busy, :dnd)
59-
60-
# Sets the user status setting to Invisible.
61-
# @note Only usable on User accounts.
62-
def invisible
63-
update_profile_status_setting('invisible')
47+
@username = new_data['username']
48+
@avatar_id = new_data['avatar']
49+
@banner_id = new_data['banner']
6450
end
6551

6652
# The inspect method is overwritten to give more useful output
@@ -70,17 +56,12 @@ def inspect
7056

7157
private
7258

73-
# Internal handler for updating the user's status setting
74-
def update_profile_status_setting(status)
75-
API::User.change_status_setting(@bot.token, status)
76-
end
77-
59+
# @!visibility private
7860
def update_profile_data(new_data)
79-
API::User.update_profile(@bot.token,
80-
nil, nil,
81-
new_data[:username] || @username,
82-
new_data.key?(:avatar) ? new_data[:avatar] : @avatar_id)
83-
update_data(new_data)
61+
update_data(JSON.parse(API::User.update_current_user(@bot.token,
62+
new_data[:username] || :undef,
63+
new_data.key?(:avatar) ? new_data[:avatar] : :undef,
64+
new_data.key?(:banner) ? new_data[:banner] : :undef)))
8465
end
8566
end
8667
end

0 commit comments

Comments
 (0)