lib_discord 0.1.0.pre2 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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