dbots 0.0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a98618d6b8cd4b3f88e78ce4673abc7fbca9d420053dfb53f40c8b828829dee3
4
+ data.tar.gz: 6b87cbc42a0526618b07a73f28ecdcc283b1bcaea110e7eb1b55ba57a02a652b
5
+ SHA512:
6
+ metadata.gz: fcf4b19edec97311b83524c05e398e976d5a427b7b73d46dce800455c18c389f93c906dc477bcf1d83d02761397740ecc9e8017d88e67aa0209b4111ae463875
7
+ data.tar.gz: 7c8fa35c66e8c996ebba1bf0104f5691b9b0bb9d2eae71feb2ee42efd89295112b818a0ef892e9c0167c6ea12252f5214e671d0919b02cd552e810aaa7ff4eac
@@ -0,0 +1,2 @@
1
+ require 'dbots/poster'
2
+ require 'dbots/lists/discordbotsgg'
@@ -0,0 +1,79 @@
1
+ require 'dbots/err'
2
+ require 'dbots/ver'
3
+ require 'uri'
4
+ require 'json'
5
+ require 'rest-client'
6
+
7
+ module DBots
8
+ # Main API functions
9
+ module API
10
+ module_function
11
+
12
+ def get(url, headers = {})
13
+ headers['User-Agent'] = user_agent
14
+ request(:get, url, headers)
15
+ end
16
+
17
+ def post(url, body, headers = {})
18
+ headers['User-Agent'] = user_agent
19
+ request(:post, url, body, headers)
20
+ end
21
+
22
+ def user_agent
23
+ "dbots (https://github.com/dbots-pkg/dbots.rb #{DBots::VERSION}) rest-client/#{RestClient::VERSION} #{RUBY_ENGINE}/#{RUBY_VERSION}p#{RUBY_PATCHLEVEL}"
24
+ end
25
+
26
+ # Request an endpoint easily
27
+ def request(type, *attributes)
28
+ response = RestClient.send(type, *attributes)
29
+ Response.new(response, parse_json(response.body))
30
+ rescue RestClient::Unauthorized
31
+ raise DBots::Err::Unauthorized
32
+ rescue RestClient::InternalServerError
33
+ raise DBots::Err::ServerFail
34
+ end
35
+
36
+ # @!visibility private
37
+ def parse_json(raw)
38
+ JSON.parse(raw)
39
+ rescue JSON::ParserError
40
+ raw
41
+ end
42
+
43
+ # The nested response from rest-client
44
+ class Response
45
+ # @return [String] the HTTP response body.
46
+ attr_reader :body
47
+
48
+ # @return [Integer] HTTP status code.
49
+ attr_reader :code
50
+ alias_method :status, :code
51
+
52
+ # @return [Hash] a hash of the headers, beautified with symbols and underscores.
53
+ attr_reader :headers
54
+
55
+ # @return [Hash] cookie jar extracted from response headers.
56
+ attr_reader :cookies
57
+
58
+ # @return [Hash, nil] the parsed JSON of the response
59
+ attr_reader :json
60
+
61
+ # @return [RestClient::Response] the raw response given from rest-client
62
+ attr_reader :raw
63
+
64
+ # @!visibility private
65
+ def initialize(response, json = nil)
66
+ @raw = response
67
+ @code = response.code
68
+ @headers = response.headers
69
+ @cookies = response.cookies
70
+ @json = json
71
+ end
72
+
73
+ # @!visibility private
74
+ def inspect
75
+ "<DBots::API::Response #{@code} #{@raw.body_truncated(10).inspect}>"
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,65 @@
1
+ require 'dbots/api'
2
+ require 'dbots/err'
3
+ require 'uri'
4
+
5
+ # The main dbots module
6
+ module DBots
7
+ # Represents a basic service.
8
+ class Service
9
+ BASE_URL = ''.freeze
10
+ AUTH_HEADER = 'Authorization'.freeze
11
+
12
+ # @return [String, nil] the token that will be used for the service
13
+ attr_accessor :token
14
+ alias_method :key, :token
15
+ alias_method :api_key, :token
16
+
17
+ # @param token [String] the token/key for the service.
18
+ def initialize(token = nil)
19
+ @token = token
20
+ end
21
+
22
+ def token?
23
+ @token != nil
24
+ end
25
+
26
+ # @!visibility private
27
+ def get(path, query = {}, headers = {})
28
+ DBots::API.get("#{self.class::BASE_URL}#{path}?#{URI.encode_www_form(query)}", headers)
29
+ end
30
+
31
+ # @!visibility private
32
+ def get_authed(path, query = {}, headers = {})
33
+ raise DBots::Err::RequiresToken unless token?
34
+
35
+ headers[self.class::AUTH_HEADER] = @token
36
+ DBots::API.get("#{self.class::BASE_URL}#{path}?#{URI.encode_www_form(query)}", headers)
37
+ end
38
+
39
+ # @!visibility private
40
+ def post_authed(path, body, query = {}, headers = {})
41
+ raise DBots::Err::RequiresToken unless token?
42
+
43
+ headers[self.class::AUTH_HEADER] = @token
44
+ DBots::API.post("#{self.class::BASE_URL}#{path}?#{URI.encode_www_form(query)}", body, headers)
45
+ end
46
+
47
+ # @!visibility private
48
+ def inspect
49
+ "<#{self.class.name} @token?=#{token?}>"
50
+ end
51
+ end
52
+
53
+ # Gets a service class based on a key
54
+ # @param key [String] the service key to get
55
+ # @returns [Service, nil]
56
+ def self.get_service(key)
57
+ services = DBots::Service.constants.select { |c| DBots::Service.const_get(c).is_a? Class }
58
+ services.each do |service|
59
+ service = DBots::Service.const_get(service)
60
+ return service if service::ALIASES.include?(key.to_s)
61
+ end
62
+
63
+ nil
64
+ end
65
+ end
@@ -0,0 +1,28 @@
1
+ module DBots
2
+ # Custom errors raised in various places
3
+ module Err
4
+ # Raised when an API key is invalid or incorrect.
5
+ class Unauthorized < RuntimeError
6
+ # The default message for the error
7
+ def message
8
+ 'Invalid API key!'
9
+ end
10
+ end
11
+
12
+ # Raised when an authorized endpoint does not have a token
13
+ class RequiresToken < RuntimeError
14
+ # The default message for the error
15
+ def message
16
+ 'This endpoint requires a token.'
17
+ end
18
+ end
19
+
20
+ # Raised when a server error occurs
21
+ class ServerFail < RuntimeError
22
+ # The default message for the error
23
+ def message
24
+ 'Internal server error!'
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,29 @@
1
+ require 'dbots/data'
2
+
3
+ module DBots
4
+ class Service
5
+ # Represents the Discord Bots service.
6
+ # @see https://discord.bots.gg/docs
7
+ class DiscordBotsGG < Service
8
+ BASE_URL = 'https://discord.bots.gg/api/v1'.freeze
9
+ ALIASES = ['discordbotsgg', 'discord.bots.gg', 'botsgg', 'bots.gg', 'dbots'].freeze
10
+
11
+ # Gets the bot listed on this service.
12
+ # @Param id [String, Integer, #resolve_id] the bot's ID
13
+ # @Param sanitied [true, false] whether to sanitize descriptions
14
+ # @return [RestClient::Response]
15
+ def get_bot(id, sanitied = false)
16
+ id = id.respond_to?(:resolve_id) ? id.resolve_id.to_s : id.to_s
17
+ get_authed("/bots/#{id}", { sanitied: sanitied })
18
+ end
19
+
20
+ # Gets a list of bots on this service.
21
+ # @Param query [Hash] the query string that will be used in the request
22
+ # @return [RestClient::Response]
23
+ def get_bots(query = {})
24
+ id = id.respond_to?(:resolve_id) ? id.resolve_id.to_s : id.to_s
25
+ get_authed("/bots/#{id}", query)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,23 @@
1
+ module DBots
2
+ # A class that posts server count to listing site(s).
3
+ class Poster
4
+ # @return [Hash] the API keys that the poster is using
5
+ attr_accessor :api_keys
6
+ alias_method :tokens, :api_keys
7
+ alias_method :keys, :api_keys
8
+
9
+ # @return [String] the client ID used for posting to a service
10
+ attr_accessor :client_id
11
+
12
+ # @param [String, Integer, #resolve_id] the client ID used for posting to a service
13
+ def initialize(client_id, api_keys: {})
14
+ @client_id = client_id.respond_to?(:resolve_id) ? client_id.resolve_id.to_s : client_id.to_s
15
+ @api_keys = api_keys
16
+ end
17
+
18
+ # @!visibility private
19
+ def inspect
20
+ "<#{self.class.name} @client_id=#{@client_id}>"
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,3 @@
1
+ module DBots
2
+ VERSION = '0.0.1'.freeze
3
+ end
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dbots
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Snazzah
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-03-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: inch
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.8.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.8.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubocop
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 0.49.1
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 0.49.1
55
+ - !ruby/object:Gem::Dependency
56
+ name: rest-client
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 2.0.0
62
+ - - "~>"
63
+ - !ruby/object:Gem::Version
64
+ version: '2.0'
65
+ type: :runtime
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: 2.0.0
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '2.0'
75
+ description: A stats poster and API wrapper for all botlists.
76
+ email: suggesttosnazzy@gmail.com
77
+ executables: []
78
+ extensions: []
79
+ extra_rdoc_files: []
80
+ files:
81
+ - lib/dbots.rb
82
+ - lib/dbots/api.rb
83
+ - lib/dbots/data.rb
84
+ - lib/dbots/err.rb
85
+ - lib/dbots/lists/discordbotsgg.rb
86
+ - lib/dbots/poster.rb
87
+ - lib/dbots/ver.rb
88
+ homepage: https://github.com/dbots-pkg/dbots.rb
89
+ licenses:
90
+ - MIT
91
+ metadata: {}
92
+ post_install_message:
93
+ rdoc_options: []
94
+ require_paths:
95
+ - lib
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ required_rubygems_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ requirements: []
107
+ rubygems_version: 3.0.3
108
+ signing_key:
109
+ specification_version: 4
110
+ summary: Stats poster & API wrapper for botlists.
111
+ test_files: []