rublox 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/Gemfile +6 -6
- data/LICENSE +21 -21
- data/{README.MD → README.md} +68 -68
- data/Rakefile +33 -33
- data/lib/rublox/derive/group.rb +50 -50
- data/lib/rublox/derive/user.rb +89 -89
- data/lib/rublox/models/full_group.rb +60 -60
- data/lib/rublox/models/full_user.rb +49 -49
- data/lib/rublox/models/group_member.rb +54 -54
- data/lib/rublox/models/group_role.rb +355 -70
- data/lib/rublox/models/group_shout.rb +62 -62
- data/lib/rublox/models/limited_user.rb +34 -34
- data/lib/rublox/models/presence.rb +98 -98
- data/lib/rublox/util/cache.rb +39 -39
- data/lib/rublox/util/errors.rb +109 -109
- data/lib/rublox/util/http_client.rb +95 -95
- data/lib/rublox/util/pages.rb +85 -85
- data/lib/rublox/util/url.rb +25 -25
- data/lib/rublox/version.rb +6 -6
- data/lib/rublox.rb +136 -136
- data/rublox.gemspec +32 -32
- metadata +5 -6
- data/CHANGELOG.MD +0 -4
@@ -1,98 +1,98 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "time"
|
4
|
-
|
5
|
-
module Rublox
|
6
|
-
# The state of the presence.
|
7
|
-
#
|
8
|
-
# Can be offline, online/on the website, playing a game, developing on studio.
|
9
|
-
module PresenceType
|
10
|
-
# The user is/was offline.
|
11
|
-
OFFLINE = :Offline
|
12
|
-
# The user is/was online (this also applies to the website).
|
13
|
-
ONLINE = :Online
|
14
|
-
# The user is/was playing a game.
|
15
|
-
GAME = :"In game"
|
16
|
-
# The user is/was developing on studio.
|
17
|
-
STUDIO = :"In Studio"
|
18
|
-
|
19
|
-
# @!visibility private
|
20
|
-
PRESENCE_MAP = [
|
21
|
-
OFFLINE,
|
22
|
-
ONLINE,
|
23
|
-
GAME,
|
24
|
-
STUDIO
|
25
|
-
].freeze
|
26
|
-
|
27
|
-
# Convert the Roblox PresenceType enum response to rublox's PresenceType
|
28
|
-
# equivalent.
|
29
|
-
# @!visibility private
|
30
|
-
# @param enum [Integer]
|
31
|
-
# @return [Symbol]
|
32
|
-
def self.enum_to_presence_type(enum)
|
33
|
-
PRESENCE_MAP[enum]
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
# @note This class is handled internally by the public interface such as
|
38
|
-
# {Client#user_presence_from_id}. You should not be creating it yourself.
|
39
|
-
# The {Presence} class corresponds to a response you can get via
|
40
|
-
# https://presence.roblox.com/v1/presence/users. You can use it to get information
|
41
|
-
# about the presence states of users.
|
42
|
-
class Presence
|
43
|
-
# @return [PresenceType] the current presence type
|
44
|
-
attr_reader :presence_type
|
45
|
-
|
46
|
-
# @return [PresenceType] the last presence type of the user
|
47
|
-
attr_reader :last_presence_type
|
48
|
-
|
49
|
-
# @note Unlike it sounds, this is not a numerical ID like of a user. It's a
|
50
|
-
# randomly generated string with hexadecimal numbers containing the server's
|
51
|
-
# job ID (which looks like "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"), it can be
|
52
|
-
# also accessed in-game via the game.JobId property.
|
53
|
-
# @return [String, nil] the job ID of the game last played by the user.
|
54
|
-
attr_reader :game_job_id
|
55
|
-
|
56
|
-
# @return [Time] the date at which the user was last online
|
57
|
-
attr_reader :last_online_date
|
58
|
-
|
59
|
-
def initialize(data, client)
|
60
|
-
@presence_type = PresenceType.enum_to_presence_type(data["userPresenceType"])
|
61
|
-
@last_location = data["lastLocation"]
|
62
|
-
@place_id = data["placeId"]
|
63
|
-
@root_place_id = data["rootPlaceId"]
|
64
|
-
@game_job_id = data["gameId"]
|
65
|
-
@universe_id = data["universeId"]
|
66
|
-
@user_id = data["userId"]
|
67
|
-
@last_online_date = Time.iso8601(data["lastOnline"])
|
68
|
-
|
69
|
-
@client = client
|
70
|
-
end
|
71
|
-
|
72
|
-
# @todo add Place class
|
73
|
-
# @return [Place, nil] the place last visited by the user, can be nil if the
|
74
|
-
# user has never played a game
|
75
|
-
def place
|
76
|
-
return unless @place_id
|
77
|
-
end
|
78
|
-
|
79
|
-
# @todo add Place class
|
80
|
-
# @return [Place, nil] the root of the place last visited by the user, can
|
81
|
-
# be nil if the user has never played a game
|
82
|
-
def root_place
|
83
|
-
return unless @root_place_id
|
84
|
-
end
|
85
|
-
|
86
|
-
# @todo add Universe class
|
87
|
-
# @return [Universe, nil] the universe of the place last visited by the user,
|
88
|
-
# can be nil if the user has never played a game
|
89
|
-
def universe
|
90
|
-
return unless @universe_id
|
91
|
-
end
|
92
|
-
|
93
|
-
# @return [FullUser] the user tied to the presence
|
94
|
-
def user
|
95
|
-
@client.user_from_id(@user_id)
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "time"
|
4
|
+
|
5
|
+
module Rublox
|
6
|
+
# The state of the presence.
|
7
|
+
#
|
8
|
+
# Can be offline, online/on the website, playing a game, developing on studio.
|
9
|
+
module PresenceType
|
10
|
+
# The user is/was offline.
|
11
|
+
OFFLINE = :Offline
|
12
|
+
# The user is/was online (this also applies to the website).
|
13
|
+
ONLINE = :Online
|
14
|
+
# The user is/was playing a game.
|
15
|
+
GAME = :"In game"
|
16
|
+
# The user is/was developing on studio.
|
17
|
+
STUDIO = :"In Studio"
|
18
|
+
|
19
|
+
# @!visibility private
|
20
|
+
PRESENCE_MAP = [
|
21
|
+
OFFLINE,
|
22
|
+
ONLINE,
|
23
|
+
GAME,
|
24
|
+
STUDIO
|
25
|
+
].freeze
|
26
|
+
|
27
|
+
# Convert the Roblox PresenceType enum response to rublox's PresenceType
|
28
|
+
# equivalent.
|
29
|
+
# @!visibility private
|
30
|
+
# @param enum [Integer]
|
31
|
+
# @return [Symbol]
|
32
|
+
def self.enum_to_presence_type(enum)
|
33
|
+
PRESENCE_MAP[enum]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# @note This class is handled internally by the public interface such as
|
38
|
+
# {Client#user_presence_from_id}. You should not be creating it yourself.
|
39
|
+
# The {Presence} class corresponds to a response you can get via
|
40
|
+
# https://presence.roblox.com/v1/presence/users. You can use it to get information
|
41
|
+
# about the presence states of users.
|
42
|
+
class Presence
|
43
|
+
# @return [PresenceType] the current presence type
|
44
|
+
attr_reader :presence_type
|
45
|
+
|
46
|
+
# @return [PresenceType] the last presence type of the user
|
47
|
+
attr_reader :last_presence_type
|
48
|
+
|
49
|
+
# @note Unlike it sounds, this is not a numerical ID like of a user. It's a
|
50
|
+
# randomly generated string with hexadecimal numbers containing the server's
|
51
|
+
# job ID (which looks like "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"), it can be
|
52
|
+
# also accessed in-game via the game.JobId property.
|
53
|
+
# @return [String, nil] the job ID of the game last played by the user.
|
54
|
+
attr_reader :game_job_id
|
55
|
+
|
56
|
+
# @return [Time] the date at which the user was last online
|
57
|
+
attr_reader :last_online_date
|
58
|
+
|
59
|
+
def initialize(data, client)
|
60
|
+
@presence_type = PresenceType.enum_to_presence_type(data["userPresenceType"])
|
61
|
+
@last_location = data["lastLocation"]
|
62
|
+
@place_id = data["placeId"]
|
63
|
+
@root_place_id = data["rootPlaceId"]
|
64
|
+
@game_job_id = data["gameId"]
|
65
|
+
@universe_id = data["universeId"]
|
66
|
+
@user_id = data["userId"]
|
67
|
+
@last_online_date = Time.iso8601(data["lastOnline"])
|
68
|
+
|
69
|
+
@client = client
|
70
|
+
end
|
71
|
+
|
72
|
+
# @todo add Place class
|
73
|
+
# @return [Place, nil] the place last visited by the user, can be nil if the
|
74
|
+
# user has never played a game
|
75
|
+
def place
|
76
|
+
return unless @place_id
|
77
|
+
end
|
78
|
+
|
79
|
+
# @todo add Place class
|
80
|
+
# @return [Place, nil] the root of the place last visited by the user, can
|
81
|
+
# be nil if the user has never played a game
|
82
|
+
def root_place
|
83
|
+
return unless @root_place_id
|
84
|
+
end
|
85
|
+
|
86
|
+
# @todo add Universe class
|
87
|
+
# @return [Universe, nil] the universe of the place last visited by the user,
|
88
|
+
# can be nil if the user has never played a game
|
89
|
+
def universe
|
90
|
+
return unless @universe_id
|
91
|
+
end
|
92
|
+
|
93
|
+
# @return [FullUser] the user tied to the presence
|
94
|
+
def user
|
95
|
+
@client.user_from_id(@user_id)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
data/lib/rublox/util/cache.rb
CHANGED
@@ -1,39 +1,39 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Rublox
|
4
|
-
# @note Only use if you have an use case that the library doesn't cover (and
|
5
|
-
# create an issue and perhaps we'll implement it!).
|
6
|
-
module Cache
|
7
|
-
# The key for the user cache.
|
8
|
-
USER = :users
|
9
|
-
# The key for the group cache.
|
10
|
-
GROUP = :groups
|
11
|
-
# The key for the page cache.
|
12
|
-
PAGE = :pages
|
13
|
-
|
14
|
-
# @!visiblity private
|
15
|
-
@cache = {
|
16
|
-
users: {},
|
17
|
-
groups: {},
|
18
|
-
pages: {}
|
19
|
-
}
|
20
|
-
|
21
|
-
# Try to get an object from cache.
|
22
|
-
# @param type [Symbol] {USER}, {GROUP} or {PAGE}
|
23
|
-
# @param id [Integer] the ID of the object
|
24
|
-
# @return [FullUser, FullGroup, Pages, nil]
|
25
|
-
def self.get(type, id)
|
26
|
-
@cache[type][id]
|
27
|
-
end
|
28
|
-
|
29
|
-
# Set an object in the cache, under the type's key.
|
30
|
-
# @param type [Symbol] {USER}, {GROUP} or {PAGE}
|
31
|
-
# @param id [Integer] the ID of the object
|
32
|
-
# @param object [FullUser, FullGroup, Pages] the object to be added to the
|
33
|
-
# cache
|
34
|
-
# @return [nil]
|
35
|
-
def self.set(type, id, object)
|
36
|
-
@cache[type][id] = object
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Rublox
|
4
|
+
# @note Only use if you have an use case that the library doesn't cover (and
|
5
|
+
# create an issue and perhaps we'll implement it!).
|
6
|
+
module Cache
|
7
|
+
# The key for the user cache.
|
8
|
+
USER = :users
|
9
|
+
# The key for the group cache.
|
10
|
+
GROUP = :groups
|
11
|
+
# The key for the page cache.
|
12
|
+
PAGE = :pages
|
13
|
+
|
14
|
+
# @!visiblity private
|
15
|
+
@cache = {
|
16
|
+
users: {},
|
17
|
+
groups: {},
|
18
|
+
pages: {}
|
19
|
+
}
|
20
|
+
|
21
|
+
# Try to get an object from cache.
|
22
|
+
# @param type [Symbol] {USER}, {GROUP} or {PAGE}
|
23
|
+
# @param id [Integer] the ID of the object
|
24
|
+
# @return [FullUser, FullGroup, Pages, nil]
|
25
|
+
def self.get(type, id)
|
26
|
+
@cache[type][id]
|
27
|
+
end
|
28
|
+
|
29
|
+
# Set an object in the cache, under the type's key.
|
30
|
+
# @param type [Symbol] {USER}, {GROUP} or {PAGE}
|
31
|
+
# @param id [Integer] the ID of the object
|
32
|
+
# @param object [FullUser, FullGroup, Pages] the object to be added to the
|
33
|
+
# cache
|
34
|
+
# @return [nil]
|
35
|
+
def self.set(type, id, object)
|
36
|
+
@cache[type][id] = object
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/rublox/util/errors.rb
CHANGED
@@ -1,109 +1,109 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Rublox
|
4
|
-
# This module contains errors that can be raised by rublox methods.
|
5
|
-
module Errors
|
6
|
-
# Exception raised when a user cannot be found.
|
7
|
-
class UserNotFoundError < StandardError
|
8
|
-
# @return [Integer, "(no ID information provided)"] the given user's ID
|
9
|
-
attr_reader :user_id
|
10
|
-
|
11
|
-
# @return [String, "(no username information provided)"] the given user's
|
12
|
-
# username
|
13
|
-
attr_reader :user_username
|
14
|
-
|
15
|
-
# @param user_id [Integer]
|
16
|
-
# @param username [String, nil]
|
17
|
-
def initialize(
|
18
|
-
user_id = "(no ID information provided)",
|
19
|
-
username = "(no username information provided)"
|
20
|
-
)
|
21
|
-
@user_id = user_id
|
22
|
-
@user_username = username
|
23
|
-
super("The user of ID #{user_id} and username #{username} could not be found.")
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
# Exception raised when a group cannot be found.
|
28
|
-
class GroupNotFoundError < StandardError
|
29
|
-
# @return [Integer] the given group's ID
|
30
|
-
attr_reader :group_id
|
31
|
-
|
32
|
-
# @param group_id [Integer]
|
33
|
-
def initialize(group_id)
|
34
|
-
@group_id = group_id
|
35
|
-
super("The group of ID #{group_id} could not be found.")
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
# Exception raised when a user's presence cannot be found.
|
40
|
-
class PresenceNotFoundError < StandardError
|
41
|
-
# @return [Integer] the presence user's ID
|
42
|
-
attr_reader :user_id
|
43
|
-
|
44
|
-
def initialize(user_id)
|
45
|
-
@user_id = user_id
|
46
|
-
super("The presence of the user with ID #{user_id} could not be found.")
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
# Exception raised when a user is not part of a group.
|
51
|
-
class MemberNotFoundError < StandardError
|
52
|
-
# @return [Integer] the given user's ID
|
53
|
-
attr_reader :user_id
|
54
|
-
|
55
|
-
# @return [Integer] the given group's ID
|
56
|
-
attr_reader :group_id
|
57
|
-
|
58
|
-
# @param id [Integer]
|
59
|
-
# @param group_id [Integer]
|
60
|
-
def initialize(id, group_id)
|
61
|
-
@user_id = id
|
62
|
-
@group_id = group_id
|
63
|
-
super("The user of ID #{id} is not part of this group of ID #{group_id}")
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
# Exception raised when a role doesn't exist.
|
68
|
-
class RoleNotFoundError < StandardError
|
69
|
-
# @return [Integer] the given role's ID
|
70
|
-
attr_reader :role_id
|
71
|
-
|
72
|
-
# @return [Integer] the given group's ID
|
73
|
-
attr_reader :group_id
|
74
|
-
|
75
|
-
# @param role_id [Integer]
|
76
|
-
# @param group_id [Integer]
|
77
|
-
def initialize(role_id, group_id)
|
78
|
-
@role_id = role_id
|
79
|
-
@group_id = group_id
|
80
|
-
super("The role of ID #{role_id} does not exist in group of ID #{group_id}.")
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
# Exception raised when an unhandled status code is returned.
|
85
|
-
class UnhandledStatusCodeError < StandardError
|
86
|
-
# @return [HTTP::Response::Status] the unhandled status code
|
87
|
-
attr_reader :status_code
|
88
|
-
|
89
|
-
# @return [String] a string containing all the errors returned by the API
|
90
|
-
# neatly formatted
|
91
|
-
attr_reader :errors
|
92
|
-
|
93
|
-
# @param status_code [Integer]
|
94
|
-
# @param errors [String, nil]
|
95
|
-
def initialize(status_code, errors = "")
|
96
|
-
super("Unhandled status code #{status_code}.\nRoblox errors:\n#{errors}")
|
97
|
-
@status_code = status_code
|
98
|
-
@errors = errors
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
# Exception raised when an invalid .ROBLOSECURITY cookie is used.
|
103
|
-
class InvalidROBLOSECURITYError < StandardError
|
104
|
-
def initialize
|
105
|
-
super("A valid .ROBLOSECURITY cookie needs to be passed to Rublox's constructor for this action.")
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Rublox
|
4
|
+
# This module contains errors that can be raised by rublox methods.
|
5
|
+
module Errors
|
6
|
+
# Exception raised when a user cannot be found.
|
7
|
+
class UserNotFoundError < StandardError
|
8
|
+
# @return [Integer, "(no ID information provided)"] the given user's ID
|
9
|
+
attr_reader :user_id
|
10
|
+
|
11
|
+
# @return [String, "(no username information provided)"] the given user's
|
12
|
+
# username
|
13
|
+
attr_reader :user_username
|
14
|
+
|
15
|
+
# @param user_id [Integer]
|
16
|
+
# @param username [String, nil]
|
17
|
+
def initialize(
|
18
|
+
user_id = "(no ID information provided)",
|
19
|
+
username = "(no username information provided)"
|
20
|
+
)
|
21
|
+
@user_id = user_id
|
22
|
+
@user_username = username
|
23
|
+
super("The user of ID #{user_id} and username #{username} could not be found.")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Exception raised when a group cannot be found.
|
28
|
+
class GroupNotFoundError < StandardError
|
29
|
+
# @return [Integer] the given group's ID
|
30
|
+
attr_reader :group_id
|
31
|
+
|
32
|
+
# @param group_id [Integer]
|
33
|
+
def initialize(group_id)
|
34
|
+
@group_id = group_id
|
35
|
+
super("The group of ID #{group_id} could not be found.")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Exception raised when a user's presence cannot be found.
|
40
|
+
class PresenceNotFoundError < StandardError
|
41
|
+
# @return [Integer] the presence user's ID
|
42
|
+
attr_reader :user_id
|
43
|
+
|
44
|
+
def initialize(user_id)
|
45
|
+
@user_id = user_id
|
46
|
+
super("The presence of the user with ID #{user_id} could not be found.")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Exception raised when a user is not part of a group.
|
51
|
+
class MemberNotFoundError < StandardError
|
52
|
+
# @return [Integer] the given user's ID
|
53
|
+
attr_reader :user_id
|
54
|
+
|
55
|
+
# @return [Integer] the given group's ID
|
56
|
+
attr_reader :group_id
|
57
|
+
|
58
|
+
# @param id [Integer]
|
59
|
+
# @param group_id [Integer]
|
60
|
+
def initialize(id, group_id)
|
61
|
+
@user_id = id
|
62
|
+
@group_id = group_id
|
63
|
+
super("The user of ID #{id} is not part of this group of ID #{group_id}")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# Exception raised when a role doesn't exist.
|
68
|
+
class RoleNotFoundError < StandardError
|
69
|
+
# @return [Integer] the given role's ID
|
70
|
+
attr_reader :role_id
|
71
|
+
|
72
|
+
# @return [Integer] the given group's ID
|
73
|
+
attr_reader :group_id
|
74
|
+
|
75
|
+
# @param role_id [Integer]
|
76
|
+
# @param group_id [Integer]
|
77
|
+
def initialize(role_id, group_id)
|
78
|
+
@role_id = role_id
|
79
|
+
@group_id = group_id
|
80
|
+
super("The role of ID #{role_id} does not exist in group of ID #{group_id}.")
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# Exception raised when an unhandled status code is returned.
|
85
|
+
class UnhandledStatusCodeError < StandardError
|
86
|
+
# @return [HTTP::Response::Status] the unhandled status code
|
87
|
+
attr_reader :status_code
|
88
|
+
|
89
|
+
# @return [String] a string containing all the errors returned by the API
|
90
|
+
# neatly formatted
|
91
|
+
attr_reader :errors
|
92
|
+
|
93
|
+
# @param status_code [Integer]
|
94
|
+
# @param errors [String, nil]
|
95
|
+
def initialize(status_code, errors = "")
|
96
|
+
super("Unhandled status code #{status_code}.\nRoblox errors:\n#{errors}")
|
97
|
+
@status_code = status_code
|
98
|
+
@errors = errors
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# Exception raised when an invalid .ROBLOSECURITY cookie is used.
|
103
|
+
class InvalidROBLOSECURITYError < StandardError
|
104
|
+
def initialize
|
105
|
+
super("A valid .ROBLOSECURITY cookie needs to be passed to Rublox's constructor for this action.")
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|