discordrb-webhooks 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6e33e989ed634c58e7bec8ee4b270addbaf2afb1
4
+ data.tar.gz: d75947052d5ba2f4047622e65d3a83a829cfbc05
5
+ SHA512:
6
+ metadata.gz: '0093a27a7257c39ebb0f27d756be7c682e58a2479d7ec6a7bdaca72a1d251d36794ec5b503cd4ddc1d738f5fa91ae2170aa69fd1c334a944eac73078e54e96f9'
7
+ data.tar.gz: 5781b554604a09ea88afb284c4cb522c16581ac4855974f71c54462a67ae89cce117f5c23c62ba2ba5bc0be3d1198e5ae346036b3b58e9207d7f50e06ee6540d
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'discordrb/webhooks/version'
4
+ require 'discordrb/webhooks/embeds'
5
+ require 'discordrb/webhooks/client'
6
+ require 'discordrb/webhooks/builder'
7
+
8
+ module Discordrb
9
+ # Webhook client
10
+ module Webhooks
11
+ end
12
+ end
@@ -0,0 +1,91 @@
1
+ require 'discordrb/webhooks/embeds'
2
+
3
+ module Discordrb::Webhooks
4
+ # A class that acts as a builder for a webhook message object.
5
+ class Builder
6
+ def initialize(content: '', username: nil, avatar_url: nil, tts: false, file: nil, embeds: [])
7
+ @content = content
8
+ @username = username
9
+ @avatar_url = avatar_url
10
+ @tts = tts
11
+ @file = file
12
+ @embeds = embeds
13
+ end
14
+
15
+ # The content of the message. May be 2000 characters long at most.
16
+ # @return [String] the content of the message.
17
+ attr_accessor :content
18
+
19
+ # The username the webhook will display as. If this is not set, the default username set in the webhook's settings
20
+ # will be used instead.
21
+ # @return [String] the username.
22
+ attr_accessor :username
23
+
24
+ # The URL of an image file to be used as an avatar. If this is not set, the default avatar from the webhook's
25
+ # settings will be used instead.
26
+ # @return [String] the avatar URL.
27
+ attr_accessor :avatar_url
28
+
29
+ # Whether this message should use TTS or not. By default, it doesn't.
30
+ # @return [true, false] the TTS status.
31
+ attr_accessor :tts
32
+
33
+ # Sets a file to be sent together with the message. Mutually exclusive with embeds; a webhook message can contain
34
+ # either a file to be sent or an embed.
35
+ # @param file [File] A file to be sent.
36
+ def file=(file)
37
+ raise ArgumentError, 'Embeds and files are mutually exclusive!' unless @embeds.empty?
38
+ @file = file
39
+ end
40
+
41
+ # Adds an embed to this message.
42
+ # @param embed [Embed] The embed to add.
43
+ def <<(embed)
44
+ raise ArgumentError, 'Embeds and files are mutually exclusive!' if @file
45
+ @embeds << embed
46
+ end
47
+
48
+ # Convenience method to add an embed using a block-style builder pattern
49
+ # @example Add an embed to a message
50
+ # builder.add_embed do |embed|
51
+ # embed.title = 'Testing'
52
+ # embed.image = Discordrb::Webhooks::EmbedImage.new(url: 'https://i.imgur.com/PcMltU7.jpg')
53
+ # end
54
+ # @param embed [Embed, nil] The embed to start the building process with, or nil if one should be created anew.
55
+ # @return [Embed] The created embed.
56
+ def add_embed(embed = nil)
57
+ embed ||= Embed.new
58
+ yield(embed)
59
+ self << embed
60
+ embed
61
+ end
62
+
63
+ # @return [File, nil] the file attached to this message.
64
+ attr_reader :file
65
+
66
+ # @return [Array<Embed>] the embeds attached to this message.
67
+ attr_reader :embeds
68
+
69
+ # @return [Hash] a hash representation of the created message, for JSON format.
70
+ def to_json_hash
71
+ {
72
+ content: @content,
73
+ username: @username,
74
+ avatar_url: @avatar_url,
75
+ tts: @tts,
76
+ embeds: @embeds.map(&:to_hash)
77
+ }
78
+ end
79
+
80
+ # @return [Hash] a hash representation of the created message, for multipart format.
81
+ def to_multipart_hash
82
+ {
83
+ content: @content,
84
+ username: @username,
85
+ avatar_url: @avatar_url,
86
+ tts: @tts,
87
+ file: @file
88
+ }
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,72 @@
1
+ require 'rest-client'
2
+ require 'json'
3
+
4
+ require 'discordrb/webhooks/builder'
5
+
6
+ module Discordrb::Webhooks
7
+ # A client for a particular webhook added to a Discord channel.
8
+ class Client
9
+ # Create a new webhook
10
+ # @param url [String] The URL to post messages to.
11
+ # @param id [Integer] The webhook's ID. Will only be used if `url` is not
12
+ # set.
13
+ # @param token [String] The webhook's authorisation token. Will only be used
14
+ # if `url` is not set.
15
+ def initialize(url: nil, id: nil, token: nil)
16
+ @url = if url
17
+ url
18
+ else
19
+ generate_url(id, token)
20
+ end
21
+ end
22
+
23
+ # Executes the webhook this client points to with the given data.
24
+ # @param builder [Builder, nil] The builder to start out with, or nil if one should be created anew.
25
+ # @param wait [true, false] Whether Discord should wait for the message to be successfully received by clients, or
26
+ # whether it should return immediately after sending the message.
27
+ # @yield [builder] Gives the builder to the block to add additional steps, or to do the entire building process.
28
+ # @yieldparam builder [Builder] The builder given as a parameter which is used as the initial step to start from.
29
+ # @example Execute the webhook with an already existing builder
30
+ # builder = Discordrb::Webhooks::Builder.new # ...
31
+ # client.execute(builder)
32
+ # @example Execute the webhook by building a new message
33
+ # client.execute do |builder|
34
+ # builder.content = 'Testing'
35
+ # builder.username = 'discordrb'
36
+ # builder.add_embed do |embed|
37
+ # embed.timestamp = Time.now
38
+ # embed.title = 'Testing'
39
+ # embed.image = Discordrb::Webhooks::EmbedImage.new(url: 'https://i.imgur.com/PcMltU7.jpg')
40
+ # end
41
+ # end
42
+ # @return [RestClient::Response] the response returned by Discord.
43
+ def execute(builder = nil, wait = false)
44
+ raise TypeError, 'builder needs to be nil or like a Discordrb::Webhooks::Builder!' unless
45
+ builder.respond_to?(:file) && builder.respond_to?(:to_multipart_hash) || builder.respond_to?(:to_json_hash) || builder.nil?
46
+
47
+ builder ||= Builder.new
48
+
49
+ yield builder if block_given?
50
+
51
+ if builder.file
52
+ post_multipart(builder, wait)
53
+ else
54
+ post_json(builder, wait)
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ def post_json(builder, wait)
61
+ RestClient.post(@url + (wait ? '?wait=true' : ''), builder.to_json_hash.to_json, content_type: :json)
62
+ end
63
+
64
+ def post_multipart(builder, wait)
65
+ RestClient.post(@url + (wait ? '?wait=true' : ''), builder.to_multipart_hash)
66
+ end
67
+
68
+ def generate_url(id, token)
69
+ "https://discordapp.com/api/v6/webhooks/#{id}/#{token}"
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,220 @@
1
+ module Discordrb::Webhooks
2
+ # An embed is a multipart-style attachment to a webhook message that can have a variety of different purposes and
3
+ # appearances.
4
+ class Embed
5
+ def initialize(title: nil, description: nil, url: nil, timestamp: nil, colour: nil, color: nil, footer: nil,
6
+ image: nil, thumbnail: nil, video: nil, provider: nil, author: nil, fields: [])
7
+ @title = title
8
+ @description = description
9
+ @url = url
10
+ @timestamp = timestamp
11
+ @colour = colour || color
12
+ @footer = footer
13
+ @image = image
14
+ @thumbnail = thumbnail
15
+ @video = video
16
+ @provider = provider
17
+ @author = author
18
+ @fields = fields
19
+ end
20
+
21
+ # The title of this embed that will be displayed above everything else.
22
+ # @return [String]
23
+ attr_accessor :title
24
+
25
+ # The description for this embed.
26
+ # @return [String]
27
+ attr_accessor :description
28
+
29
+ # The URL the title should point to.
30
+ # @return [String]
31
+ attr_accessor :url
32
+
33
+ # The timestamp for this embed. Will be displayed just below the title.
34
+ # @return [Time]
35
+ attr_accessor :timestamp
36
+
37
+ # @return [Integer] the colour of the bar to the side, in decimal form.
38
+ attr_reader :colour
39
+ alias_method :color, :colour
40
+
41
+ # Sets the colour of the bar to the side of the embed to something new.
42
+ # @param value [Integer, String, {Integer, Integer, Integer}] The colour in decimal, hexadecimal, or R/G/B decimal
43
+ # form.
44
+ def colour=(value)
45
+ if value.is_a? Integer
46
+ raise ArgumentError, 'Embed colour must be 24-bit!' if value >= 16_777_216
47
+ @colour = value
48
+ elsif value.is_a? String
49
+ self.colour = value.delete('#').to_i(16)
50
+ elsif value.is_a? Array
51
+ raise ArgumentError, 'Colour tuple must have three values!' if value.length != 3
52
+ self.colour = value[0] << 16 | value[1] << 8 | value[2]
53
+ end
54
+ end
55
+
56
+ alias_method :color=, :colour=
57
+
58
+ # The footer for this embed.
59
+ # @example Add a footer to an embed
60
+ # embed.footer = Discordrb::Webhooks::EmbedFooter.new(text: 'Hello', icon_url: 'https://i.imgur.com/j69wMDu.jpg')
61
+ # @return [EmbedFooter]
62
+ attr_accessor :footer
63
+
64
+ # The image for this embed.
65
+ # @see EmbedImage
66
+ # @example Add a image to an embed
67
+ # embed.image = Discordrb::Webhooks::EmbedImage.new(url: 'https://i.imgur.com/PcMltU7.jpg')
68
+ # @return [EmbedImage]
69
+ attr_accessor :image
70
+
71
+ # The thumbnail for this embed.
72
+ # @see EmbedThumbnail
73
+ # @example Add a thumbnail to an embed
74
+ # embed.thumbnail = Discordrb::Webhooks::EmbedThumbnail.new(url: 'https://i.imgur.com/xTG3a1I.jpg')
75
+ # @return [EmbedThumbnail]
76
+ attr_accessor :thumbnail
77
+
78
+ # The author for this embed.
79
+ # @see EmbedAuthor
80
+ # @example Add a author to an embed
81
+ # embed.author = Discordrb::Webhooks::EmbedAuthor.new(name: 'meew0', url: 'https://github.com/meew0', icon_url: 'https://avatars2.githubusercontent.com/u/3662915?v=3&s=466')
82
+ # @return [EmbedAuthor]
83
+ attr_accessor :author
84
+
85
+ # Add a field object to this embed.
86
+ # @param field [EmbedField] The field to add.
87
+ def <<(field)
88
+ @fields << field
89
+ end
90
+
91
+ # Convenience method to add a field to the embed without having to create one manually.
92
+ # @see EmbedField
93
+ # @example Add a field to an embed, conveniently
94
+ # embed.add_field(name: 'A field', value: "The field's content")
95
+ # @param name [String] The field's name
96
+ # @param value [String] The field's value
97
+ # @param inline [true, false] Whether the field should be inlined
98
+ def add_field(name: nil, value: nil, inline: nil)
99
+ self << EmbedField.new(name: name, value: value, inline: inline)
100
+ end
101
+
102
+ # @return [Array<EmbedField>] the fields attached to this embed.
103
+ attr_reader :fields
104
+
105
+ # @return [Hash] a hash representation of this embed, to be converted to JSON.
106
+ def to_hash
107
+ {
108
+ title: @title,
109
+ description: @description,
110
+ url: @url,
111
+ timestamp: @timestamp && @timestamp.utc.iso8601,
112
+ color: @colour,
113
+ footer: @footer && @footer.to_hash,
114
+ image: @image && @image.to_hash,
115
+ thumbnail: @thumbnail && @thumbnail.to_hash,
116
+ video: @video && @video.to_hash,
117
+ provider: @provider && @provider.to_hash,
118
+ author: @author && @author.to_hash,
119
+ fields: @fields.map(&:to_hash)
120
+ }
121
+ end
122
+ end
123
+
124
+ # An embed's footer will be displayed at the very bottom of an embed, together with the timestamp. An icon URL can be
125
+ # set together with some text to be displayed.
126
+ class EmbedFooter
127
+ # Creates a new footer object.
128
+ # @param text [String, nil] The text to be displayed in the footer.
129
+ # @param icon_url [String, nil] The URL to an icon to be showed alongside the text.
130
+ def initialize(text: nil, icon_url: nil)
131
+ @text = text
132
+ @icon_url = icon_url
133
+ end
134
+
135
+ # @return [Hash] a hash representation of this embed footer, to be converted to JSON.
136
+ def to_hash
137
+ {
138
+ text: @text,
139
+ icon_url: @icon_url
140
+ }
141
+ end
142
+ end
143
+
144
+ # An embed's image will be displayed at the bottom, in large format. It will replace a footer icon URL if one is set.
145
+ class EmbedImage
146
+ # Creates a new image object.
147
+ # @param url [String, nil] The URL of the image.
148
+ def initialize(url: nil)
149
+ @url = url
150
+ end
151
+
152
+ # @return [Hash] a hash representation of this embed image, to be converted to JSON.
153
+ def to_hash
154
+ {
155
+ url: @url
156
+ }
157
+ end
158
+ end
159
+
160
+ # An embed's thumbnail will be displayed at the right of the message, next to the description and fields. When clicked
161
+ # it will point to the embed URL.
162
+ class EmbedThumbnail
163
+ # Creates a new thumbnail object.
164
+ # @param url [String, nil] The URL of the thumbnail.
165
+ def initialize(url: nil)
166
+ @url = url
167
+ end
168
+
169
+ # @return [Hash] a hash representation of this embed thumbnail, to be converted to JSON.
170
+ def to_hash
171
+ {
172
+ url: @url
173
+ }
174
+ end
175
+ end
176
+
177
+ # An embed's author will be shown at the top to indicate who "authored" the particular event the webhook was sent for.
178
+ class EmbedAuthor
179
+ # Creates a new author object.
180
+ # @param name [String, nil] The name of the author.
181
+ # @param url [String, nil] The URL the name should link to.
182
+ # @param icon_url [String, nil] The URL of the icon to be displayed next to the author.
183
+ def initialize(name: nil, url: nil, icon_url: nil)
184
+ @name = name
185
+ @url = url
186
+ @icon_url = icon_url
187
+ end
188
+
189
+ # @return [Hash] a hash representation of this embed author, to be converted to JSON.
190
+ def to_hash
191
+ {
192
+ name: @name,
193
+ url: @url,
194
+ icon_url: @icon_url
195
+ }
196
+ end
197
+ end
198
+
199
+ # A field is a small block of text with a header that can be relatively freely layouted with other fields.
200
+ class EmbedField
201
+ # Creates a new field object.
202
+ # @param name [String, nil] The name of the field, displayed in bold at the top.
203
+ # @param value [String, nil] The value of the field, displayed in normal text below the name.
204
+ # @param inline [true, false] Whether the field should be displayed in-line with other fields.
205
+ def initialize(name: nil, value: nil, inline: nil)
206
+ @name = name
207
+ @value = value
208
+ @inline = inline
209
+ end
210
+
211
+ # @return [Hash] a hash representation of this embed field, to be converted to JSON.
212
+ def to_hash
213
+ {
214
+ name: @name,
215
+ value: @value,
216
+ inline: @inline
217
+ }
218
+ end
219
+ end
220
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Webhook support for discordrb
4
+ module Discordrb
5
+ module Webhooks
6
+ # The current version of discordrb-webhooks.
7
+ VERSION = '0.1.0'.freeze
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,64 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: discordrb-webhooks
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - meew0
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-01-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: A client for Discord's webhooks to fit alongside [discordrb](https://rubygems.org/gems/discordrb).
28
+ email:
29
+ - ''
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - lib/discordrb/webhooks.rb
35
+ - lib/discordrb/webhooks/builder.rb
36
+ - lib/discordrb/webhooks/client.rb
37
+ - lib/discordrb/webhooks/embeds.rb
38
+ - lib/discordrb/webhooks/version.rb
39
+ homepage: https://github.com/meew0/discordrb
40
+ licenses:
41
+ - MIT
42
+ metadata: {}
43
+ post_install_message:
44
+ rdoc_options: []
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: 2.1.0
52
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ requirements: []
58
+ rubyforge_project:
59
+ rubygems_version: 2.6.10
60
+ signing_key:
61
+ specification_version: 4
62
+ summary: Webhook client for discordrb
63
+ test_files: []
64
+ has_rdoc: