lib_discord 0.1.0.pre2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/lib/lib_discord/application.rb +43 -0
  3. data/lib/lib_discord/application_command.rb +341 -0
  4. data/lib/lib_discord/application_role_connection_metadata.rb +52 -0
  5. data/lib/lib_discord/audit_log.rb +36 -0
  6. data/lib/lib_discord/auto_moderation.rb +106 -0
  7. data/lib/lib_discord/channel.rb +716 -0
  8. data/lib/lib_discord/client.rb +124 -14
  9. data/lib/lib_discord/emoji.rb +106 -0
  10. data/lib/lib_discord/errors.rb +24 -0
  11. data/lib/lib_discord/guild.rb +830 -0
  12. data/lib/lib_discord/guild_scheduled_event.rb +133 -0
  13. data/lib/lib_discord/guild_template.rb +128 -0
  14. data/lib/lib_discord/interaction.rb +163 -0
  15. data/lib/lib_discord/invite.rb +47 -0
  16. data/lib/lib_discord/mappers/application_command_option_types.rb +22 -0
  17. data/lib/lib_discord/mappers/application_command_permission_types.rb +14 -0
  18. data/lib/lib_discord/mappers/application_command_types.rb +14 -0
  19. data/lib/lib_discord/mappers/application_integration_types.rb +13 -0
  20. data/lib/lib_discord/mappers/application_role_connection_metadata_types.rb +19 -0
  21. data/lib/lib_discord/mappers/audit_log_events.rb +67 -0
  22. data/lib/lib_discord/mappers/auto_moderation_action_types.rb +14 -0
  23. data/lib/lib_discord/mappers/auto_moderation_event_types.rb +12 -0
  24. data/lib/lib_discord/mappers/auto_moderation_keyword_preset_types.rb +14 -0
  25. data/lib/lib_discord/mappers/auto_moderation_trigger_types.rb +15 -0
  26. data/lib/lib_discord/mappers/channel_forum_layout_types.rb +14 -0
  27. data/lib/lib_discord/mappers/channel_message_activity_types.rb +15 -0
  28. data/lib/lib_discord/mappers/channel_message_types.rb +42 -0
  29. data/lib/lib_discord/mappers/channel_sort_order_types.rb +13 -0
  30. data/lib/lib_discord/mappers/channel_types.rb +24 -0
  31. data/lib/lib_discord/mappers/channel_video_quality_modes.rb +13 -0
  32. data/lib/lib_discord/mappers/guild_default_message_notification_levels.rb +13 -0
  33. data/lib/lib_discord/mappers/guild_explicit_content_filter_levels.rb +14 -0
  34. data/lib/lib_discord/mappers/guild_integration_expire_behaviors.rb +13 -0
  35. data/lib/lib_discord/mappers/guild_mfa_levels.rb +13 -0
  36. data/lib/lib_discord/mappers/guild_nsfw_levels.rb +15 -0
  37. data/lib/lib_discord/mappers/guild_onboarding_modes.rb +13 -0
  38. data/lib/lib_discord/mappers/guild_premium_tiers.rb +15 -0
  39. data/lib/lib_discord/mappers/guild_prompt_types.rb +13 -0
  40. data/lib/lib_discord/mappers/guild_scheduled_event_entity_types.rb +14 -0
  41. data/lib/lib_discord/mappers/guild_scheduled_event_privacy_levels.rb +12 -0
  42. data/lib/lib_discord/mappers/guild_scheduled_event_statuses.rb +15 -0
  43. data/lib/lib_discord/mappers/guild_verification_levels.rb +16 -0
  44. data/lib/lib_discord/mappers/interaction_callback_types.rb +19 -0
  45. data/lib/lib_discord/mappers/interaction_context_types.rb +14 -0
  46. data/lib/lib_discord/mappers/interaction_types.rb +16 -0
  47. data/lib/lib_discord/mappers/invite_target_types.rb +13 -0
  48. data/lib/lib_discord/mappers/message_component_button_styles.rb +16 -0
  49. data/lib/lib_discord/mappers/message_component_text_input_styles.rb +13 -0
  50. data/lib/lib_discord/mappers/message_component_types.rb +19 -0
  51. data/lib/lib_discord/mappers/poll_layout_types.rb +12 -0
  52. data/lib/lib_discord/mappers/stage_instance_privacy_levels.rb +13 -0
  53. data/lib/lib_discord/mappers/sticker_format_types.rb +15 -0
  54. data/lib/lib_discord/mappers/sticker_types.rb +13 -0
  55. data/lib/lib_discord/mappers/user_premium_types.rb +15 -0
  56. data/lib/lib_discord/mappers/user_visibility_types.rb +13 -0
  57. data/lib/lib_discord/mappers/webhooks_types.rb +14 -0
  58. data/lib/lib_discord/mappers.rb +87 -0
  59. data/lib/lib_discord/poll.rb +62 -0
  60. data/lib/lib_discord/resource.rb +91 -21
  61. data/lib/lib_discord/response.rb +39 -7
  62. data/lib/lib_discord/stage_instance.rb +79 -0
  63. data/lib/lib_discord/sticker.rb +132 -0
  64. data/lib/lib_discord/types.rb +35 -11
  65. data/lib/lib_discord/urls.rb +20 -12
  66. data/lib/lib_discord/user.rb +174 -0
  67. data/lib/lib_discord/version.rb +5 -1
  68. data/lib/lib_discord/voice.rb +29 -0
  69. data/lib/lib_discord/webhook.rb +299 -0
  70. data/lib/lib_discord.rb +5 -0
  71. metadata +77 -20
  72. data/lib/lib_discord/resources/application.rb +0 -15
  73. data/lib/lib_discord/resources/application_command.rb +0 -71
  74. data/lib/lib_discord/resources/application_role_connection_metadata.rb +0 -15
  75. data/lib/lib_discord/resources/audit_log.rb +0 -11
  76. data/lib/lib_discord/resources/auto_moderation.rb +0 -27
  77. data/lib/lib_discord/resources/channel.rb +0 -168
  78. data/lib/lib_discord/resources/emoji.rb +0 -27
  79. data/lib/lib_discord/resources/guild.rb +0 -196
  80. data/lib/lib_discord/resources/guild_scheduled_event.rb +0 -31
  81. data/lib/lib_discord/resources/guild_template.rb +0 -35
  82. data/lib/lib_discord/resources/interaction.rb +0 -39
  83. data/lib/lib_discord/resources/invite.rb +0 -15
  84. data/lib/lib_discord/resources/stage_instance.rb +0 -23
  85. data/lib/lib_discord/resources/sticker.rb +0 -35
  86. data/lib/lib_discord/resources/user.rb +0 -51
  87. data/lib/lib_discord/resources/voice.rb +0 -11
  88. data/lib/lib_discord/resources/webhook.rb +0 -67
  89. data/lib/lib_discord/resources.rb +0 -19
@@ -1,40 +1,111 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "dry-container"
4
- require "forwardable"
5
4
  require "logger"
6
5
 
7
- require "lib_discord/resources"
6
+ require "lib_discord/application"
7
+ require "lib_discord/application_command"
8
+ require "lib_discord/application_role_connection_metadata"
9
+ require "lib_discord/audit_log"
10
+ require "lib_discord/auto_moderation"
11
+ require "lib_discord/channel"
12
+ require "lib_discord/emoji"
13
+ require "lib_discord/errors"
14
+ require "lib_discord/guild"
15
+ require "lib_discord/guild_scheduled_event"
16
+ require "lib_discord/guild_template"
17
+ require "lib_discord/interaction"
18
+ require "lib_discord/invite"
19
+ require "lib_discord/poll"
20
+ require "lib_discord/stage_instance"
21
+ require "lib_discord/sticker"
8
22
  require "lib_discord/types"
9
23
  require "lib_discord/urls"
24
+ require "lib_discord/user"
10
25
  require "lib_discord/version"
26
+ require "lib_discord/voice"
27
+ require "lib_discord/webhook"
11
28
 
12
29
  module LibDiscord
30
+ ##
31
+ # This class is the entry point in utilizing +lib_discord+ to access
32
+ # Discord's API. Initialize a client and cache it for as long as you need to
33
+ # make requests to Discord.
34
+ #
35
+ # require "lib_discord"
36
+ # client = LibDiscord::Client.new("Bot my.amazing.token")
13
37
  class Client
14
- extend Forwardable
15
-
16
- def initialize(auth_header:, base_url: nil, user_agent: nil, logger: nil)
17
- auth_header = Types::Strict::String[auth_header]
18
- base_url = Types::Strict::String[base_url || "https://discord.com/api/v10"]
19
- user_agent = Types::Strict::String[user_agent || "LibDiscord (#{LibDiscord.project_url}, #{LibDiscord.version})"]
38
+ ##
39
+ # Initialize a +LibDiscord::Client+ for making requests to Discord's
40
+ # RESTful web API.
41
+ #
42
+ # @param auth_header [#to_s] Authorization header to be used in
43
+ # communication with Discord. In the format +Bot <token>+ or +Bearer
44
+ # <token>+.
45
+ # @param base_url [#to_s] Base URL to use in requests to Discord.
46
+ # @param user_agent [#to_s] User-Agent header to use in requests to
47
+ # Discord.
48
+ # @param logger [Logger] Logger to use for output messages. If not
49
+ # provided, a basic INFO-level +$stdout+ logger is created for internal use
50
+ # ( +l = Logger.new($stdout); l.level = :info+ )
51
+ #
52
+ # @return [self]
53
+ #
54
+ # @raise [ConstraintError] if parameters for +auth_header+,
55
+ # +base_url+, or +user_agent+ do not respond to #to_s.
56
+ # @raise [ConstraintError] if the parameter for +logger+ is not
57
+ # an instance of Logger, or an instance that inherits from Logger.
58
+ #
59
+ # @example hook in your own logger and app-specific user-agent
60
+ # client = LibDiscord::Client.new(
61
+ # "Bot my.token",
62
+ # user_agent: "MyApp (https://example.myapp.com, 1.2.3)",
63
+ # logger: my_logger
64
+ # )
65
+ # @example I don't want any messages going to +stdout+.
66
+ # client = LibDiscord::Client.new(
67
+ # "Bot my.token",
68
+ # logger: Logger.new("/dev/null")
69
+ # )
70
+ #
71
+ # @see https://discord.com/developers/docs/reference#authentication Discord
72
+ # documentation "Authentication"
73
+ # @see https://discord.com/developers/docs/reference#user-agent Discord
74
+ # documentation "User Agent"
75
+ def initialize(
76
+ auth_header,
77
+ base_url: "https://discord.com/api/v10",
78
+ user_agent: "LibDiscord (#{LibDiscord::PROJECT_URL}, #{LibDiscord.version})",
79
+ logger: nil
80
+ )
81
+ auth_header = Types::Coercible::String[auth_header]
82
+ base_url = Types::Coercible::String[base_url]
83
+ user_agent = Types::Coercible::String[user_agent]
20
84
 
21
85
  unless logger
22
86
  logger = Logger.new($stdout)
23
87
  logger.level = :info
24
88
  end
25
89
 
90
+ logger = Types::Logger[logger]
91
+
26
92
  @container = Dry::Container.new
27
93
 
28
94
  @container.register("application") do
29
95
  Application.new(auth_header, base_url, user_agent, logger)
30
96
  end
31
97
 
32
- @container.register("application.command") do
98
+ @container.register("application_command") do
33
99
  ApplicationCommand.new(auth_header, base_url, user_agent, logger)
34
100
  end
35
101
 
36
- @container.register("application.role_connection_metadata") do
37
- ApplicationRoleConnectionMetadata.new(auth_header, base_url, user_agent, logger)
102
+ @container.register("application_role_connection_metadata") do
103
+ ApplicationRoleConnectionMetadata.new(
104
+ auth_header,
105
+ base_url,
106
+ user_agent,
107
+ logger
108
+ )
38
109
  end
39
110
 
40
111
  @container.register("audit_log") do
@@ -57,11 +128,11 @@ module LibDiscord
57
128
  Guild.new(auth_header, base_url, user_agent, logger)
58
129
  end
59
130
 
60
- @container.register("guild.scheduled_event") do
131
+ @container.register("guild_scheduled_event") do
61
132
  GuildScheduledEvent.new(auth_header, base_url, user_agent, logger)
62
133
  end
63
134
 
64
- @container.register("guild.template") do
135
+ @container.register("guild_template") do
65
136
  GuildTemplate.new(auth_header, base_url, user_agent, logger)
66
137
  end
67
138
 
@@ -73,6 +144,10 @@ module LibDiscord
73
144
  Invite.new(auth_header, base_url, user_agent, logger)
74
145
  end
75
146
 
147
+ @container.register("poll") do
148
+ Poll.new(auth_header, base_url, user_agent, logger)
149
+ end
150
+
76
151
  @container.register("stage_instance") do
77
152
  StageInstance.new(auth_header, base_url, user_agent, logger)
78
153
  end
@@ -92,8 +167,43 @@ module LibDiscord
92
167
  @container.register("webhook") do
93
168
  Webhook.new(auth_header, base_url, user_agent, logger)
94
169
  end
170
+ rescue Dry::Types::ConstraintError => e
171
+ raise ConstraintError.new(e.message)
172
+ end
173
+
174
+ ##
175
+ # Get a Resource for making Discord API requests.
176
+ #
177
+ # @param resource [String] Resource key. see {#keys} for available values.
178
+ #
179
+ # @return Resource
180
+ #
181
+ # @raise [KeyError] if no resource exists for a given key
182
+ #
183
+ # @example
184
+ # client["application"]
185
+ # # => #<LibDiscord::Application: ... >
186
+ # @example
187
+ # client["not.a.valid.key"]
188
+ # # => key not found "not.a.valid.key" (LibDiscord::KeyError)
189
+ def [](resource)
190
+ @container[resource]
191
+ rescue Dry::Container::KeyError => e
192
+ raise KeyError.new(e.message)
95
193
  end
96
194
 
97
- def_delegators :@container, :[], :keys
195
+ ##
196
+ # Get available Resource keys.
197
+ #
198
+ # @return [Array<String>] a list of resources available
199
+ #
200
+ # @example
201
+ # client.keys
202
+ # # =>
203
+ # # ["application",
204
+ # # "guild",
205
+ # # "channel",
206
+ # # ...]
207
+ def keys = @container.keys
98
208
  end
99
209
  end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lib_discord/resource"
4
+
5
+ module LibDiscord
6
+ ##
7
+ # Emoji Resource
8
+ #
9
+ # Do not instantiate an {Emoji} directly. Instead request one from an
10
+ # instance of {Client}.
11
+ #
12
+ # client = LibDiscord::Client.new("Bot auth.token")
13
+ # e = client["emoji"]
14
+ #
15
+ # @see https://discord.com/developers/docs/resources/emoji Discord
16
+ # documentation "Emoji Resource"
17
+ class Emoji < Resource
18
+ ##
19
+ # @param guild_id [#to_s]
20
+ # {https://discord.com/developers/docs/reference#snowflakes Discord
21
+ # documentation "Snowflakes"}
22
+ #
23
+ # @return [Response]
24
+ #
25
+ # @raise [TimeoutError] if the HTTP request times out
26
+ #
27
+ # @see https://discord.com/developers/docs/resources/emoji#list-guild-emojis
28
+ # Discord documentation "List Guild Emojis"
29
+ def list_guild_emojis(guild_id:)
30
+ send_request(:get, "/guilds/#{guild_id}/emojis")
31
+ end
32
+
33
+ ##
34
+ # @param guild_id [#to_s]
35
+ # {https://discord.com/developers/docs/reference#snowflakes Discord
36
+ # documentation "Snowflakes"}
37
+ # @param emoji_id [#to_s]
38
+ # {https://discord.com/developers/docs/reference#snowflakes Discord
39
+ # documentation "Snowflakes"}
40
+ #
41
+ # @return [Response]
42
+ #
43
+ # @raise [TimeoutError] if the HTTP request times out
44
+ #
45
+ # @see https://discord.com/developers/docs/resources/emoji#get-guild-emoji
46
+ # Discord documentation "Get Guild Emoji"
47
+ def get_guild_emoji(guild_id:, emoji_id:)
48
+ send_request(:get, "/guilds/#{guild_id}/emojis/#{emoji_id}")
49
+ end
50
+
51
+ ##
52
+ # @param guild_id [#to_s]
53
+ # {https://discord.com/developers/docs/reference#snowflakes Discord
54
+ # documentation "Snowflakes"}
55
+ # @param json [Hash] JSON serializable payload
56
+ #
57
+ # @return [Response]
58
+ #
59
+ # @raise [TimeoutError] if the HTTP request times out
60
+ # @raise [ConstraintError] if +json+ cannot be serialized to JSON
61
+ #
62
+ # @see https://discord.com/developers/docs/resources/emoji#create-guild-emoji
63
+ # Discord documentation "Create Guild Emoji"
64
+ def create_guild_emoji(guild_id:, json:)
65
+ send_request(:post, "/guilds/#{guild_id}/emojis", json:)
66
+ end
67
+
68
+ ##
69
+ # @param guild_id [#to_s]
70
+ # {https://discord.com/developers/docs/reference#snowflakes Discord
71
+ # documentation "Snowflakes"}
72
+ # @param emoji_id [#to_s]
73
+ # {https://discord.com/developers/docs/reference#snowflakes Discord
74
+ # documentation "Snowflakes"}
75
+ # @param json [Hash] JSON serializable payload
76
+ #
77
+ # @return [Response]
78
+ #
79
+ # @raise [TimeoutError] if the HTTP request times out
80
+ # @raise [ConstraintError] if +json+ cannot be serialized to JSON
81
+ #
82
+ # @see https://discord.com/developers/docs/resources/emoji#modify-guild-emoji
83
+ # Discord documentation "Modify Guild Emoji"
84
+ def modify_guild_emoji(guild_id:, emoji_id:, json:)
85
+ send_request(:patch, "/guilds/#{guild_id}/emojis/#{emoji_id}", json:)
86
+ end
87
+
88
+ ##
89
+ # @param guild_id [#to_s]
90
+ # {https://discord.com/developers/docs/reference#snowflakes Discord
91
+ # documentation "Snowflakes"}
92
+ # @param emoji_id [#to_s]
93
+ # {https://discord.com/developers/docs/reference#snowflakes Discord
94
+ # documentation "Snowflakes"}
95
+ #
96
+ # @return [Response]
97
+ #
98
+ # @raise [TimeoutError] if the HTTP request times out
99
+ #
100
+ # @see https://discord.com/developers/docs/resources/emoji#delete-guild-emoji
101
+ # Discord documentation "Delete Guild Emoji"
102
+ def delete_guild_emoji(guild_id:, emoji_id:)
103
+ send_request(:delete, "/guilds/#{guild_id}/emojis/#{emoji_id}")
104
+ end
105
+ end
106
+ end
@@ -1,7 +1,31 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "dry-container"
4
+ require "dry/types"
3
5
  require "http"
4
6
 
5
7
  module LibDiscord
8
+ ##
9
+ # Constraint Error
10
+ #
11
+ # This error is thrown when a type-check against LibDiscord's type
12
+ # constraints fails.
13
+ class ConstraintError < Dry::Types::ConstraintError; end
14
+
15
+ ##
16
+ # Key Error
17
+ #
18
+ # This error is thrown when a {Client} instance has no object mapped to the
19
+ # key used.
20
+ #
21
+ # @see Client#[]
22
+ # @see Client#keys
23
+ class KeyError < Dry::Container::KeyError; end
24
+
25
+ ##
26
+ # This error is thrown when an HTTP request made to Discord times out.
27
+ #
28
+ # @see https://github.com/httprb/http/wiki/Errors-and-Exceptions HTTP.rb
29
+ # "Errors and Exceptions"
6
30
  class TimeoutError < HTTP::TimeoutError; end
7
31
  end