rublox 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 1e1d91f1dc37df6df866bdf110705af8a5f78e68748edd2d577ff44de821e0f7
4
+ data.tar.gz: c91696dacf025936ce517ffdcca4cae5672856bcd46822b04f28c002bc5eb0e5
5
+ SHA512:
6
+ metadata.gz: db8304263e8be041a5fb44b6c090240014c5473c84088d72b7c881b0c40abad7134d6f5dec7842b1d7a767655db833a193d4c8c79d5f0486c9a06d59748ea175
7
+ data.tar.gz: a32d33986c09589f38f95f9e91b8f4746b4236fea4263aabbb41af8fc63f6d717e865d21d02755b1a578c2673a45cf4f5a22fda4f3f8fb13b6fd659856fd4a6f
data/CHANGELOG.MD ADDED
@@ -0,0 +1,4 @@
1
+ # 0.1.0 (9th October, 2021)
2
+
3
+ - Initial repository and package setup
4
+ - User, group, presence, group member and group role APIs added
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "http://rubygems.org"
4
+ ruby ">= 3.0"
5
+
6
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021 Roblox API wrappers
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.MD ADDED
@@ -0,0 +1,68 @@
1
+ <div align="center">
2
+ <img src="https://raw.githubusercontent.com/roblox-api-wrappers/.github/main/res/rublox_logo.png" alt="rublox" width="15%" height="15%"/>
3
+ </div>
4
+
5
+ <br>
6
+
7
+ <div align="center">
8
+ <a href="https://rubygems.org/gems/rublox">
9
+ <img alt="gem" src="https://img.shields.io/gem/dt/rublox?color=rgb%28170%2C%200%2C%200%29&logo=rubygems&style=flat-square">
10
+ </a>
11
+
12
+ <a href="https://rubygems.org/gems/rublox">
13
+ <img alt="gem version" src="https://img.shields.io/gem/v/rublox?color=rgb%28170%2C%200%2C%200%29&label=gem%20version&logo=rubygems&style=flat-square">
14
+ </a>
15
+
16
+ <a href="https://github.com/roblox-api-wrappers/rublox/blob/main/LICENSE">
17
+ <img alt="license: MIT" src="https://img.shields.io/github/license/roblox-api-wrappers/rublox?color=rgb%28150%2C%200%2C%200%29&logo=github&style=flat-square">
18
+ </a>
19
+
20
+ <img alt="commit activity" src="https://img.shields.io/github/commit-activity/m/roblox-api-wrappers/rublox?color=rgb%28170%2C%200%2C%200%29&logo=github&style=flat-square">
21
+
22
+ <img alt="repo stars" src="https://img.shields.io/github/stars/roblox-api-wrappers/rublox?color=rgb%28170%2C%200%2C%200%29&logo=github&style=flat-square">
23
+
24
+ <a href="https://rubydoc.info/gems/rublox">
25
+ <img alt="docs" src="https://img.shields.io/badge/docs-rubydoc.info-aa0000?style=flat-square">
26
+ </a>
27
+
28
+ <a href="https://guilded.gg/roblox-api-wrappers">
29
+ <img alt="support server" src="https://img.shields.io/badge/guilded-support%20server-aa0000.svg?style=flat-square&logo=guilded">
30
+ </a>
31
+ </div>
32
+
33
+ <div align="center"> <i>rublox is a Roblox web API wrapper written in Ruby. It aims to provide an object oriented interface to get and modify data from Roblox's web API. </i> </div>
34
+
35
+ <br>
36
+
37
+ # Installation
38
+
39
+ Include rublox in your application's `Gemfile`
40
+
41
+ ```ruby
42
+ gem "rublox", "~> 0.1.0"
43
+ ```
44
+
45
+ or run
46
+
47
+ > $ gem install rublox
48
+
49
+ on your terminal.
50
+
51
+ # Getting started
52
+
53
+ The gateway to the API is the [Rublox::Client](https://rubydoc.info/gems/rublox/Rublox/Client) object. You can initialize it with your _.ROBLOSECURITY_ cookie if you need functionality that needs it.
54
+
55
+ ```ruby
56
+ # Without a cookie
57
+ client = Rublox::Client.new
58
+ # With a cookie
59
+ client = Rublox::Client.new("_|WARNING:-DO-NOT-SHARE-THIS.--Sharing-this ...")
60
+ ```
61
+
62
+ **(if you open-source/work with other people on your application, it is recommended to keep your cookie in a `.env` file and load it with a library like [dotenv](https://rubygems.org/gems/dotenv))**
63
+
64
+ From there, you can build off your application's logic with methods provided via [Rublox::Client](https://rubydoc.info/gems/rublox/Rublox/Client)
65
+
66
+ # Documentation
67
+
68
+ You can access the documentation at https://rubydoc.info/gems/rublox.
data/Rakefile ADDED
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rake"
4
+
5
+ desc "run rubocop"
6
+ task :rubocop do
7
+ system "rubocop"
8
+ end
9
+
10
+ desc "run tests"
11
+ task :test do
12
+ system "ruby -I ./lib ./tests/run_tests.rb"
13
+ end
14
+
15
+ desc "build docs"
16
+ task :docs do
17
+ system "yardoc"
18
+ end
19
+
20
+ desc "build docs, showing private objects"
21
+ task :docs_priv do
22
+ system "yardoc --private"
23
+ end
24
+
25
+ desc "open local server to live preview docs"
26
+ task :doc_server do
27
+ system "yard server --reload"
28
+ end
29
+
30
+ desc "list all undocumented objects"
31
+ task :list_undoc do
32
+ system "yard stats --list-undoc"
33
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rublox/models/group_member"
4
+ require "rublox/models/group_role"
5
+
6
+ module Rublox
7
+ # This mixin module contains functions that can be called on group objects.
8
+ # @abstract
9
+ module Group
10
+ # @example
11
+ # client = Rublox::Client.new
12
+ # group = client.group_from_id(1)
13
+ # group.roles.each { |role| puts role.rank } # 0, 1, 180, 100, 254, 255
14
+ # @return [Array<GroupRole>] the group's roles
15
+ def roles
16
+ @client.http_client.get(
17
+ URL.endpoint("groups", "v1/groups/#{@id}/roles")
18
+ )["roles"].map { |role| GroupRole.new(role, self, @client) }
19
+ end
20
+
21
+ # @example
22
+ # client = Rublox::Client.new
23
+ # group = client.group_from_id(7384468)
24
+ # member = group.member_by_id(1)
25
+ # puts member.role.rank # -> 1
26
+ # @param id [Integer] the user's ID
27
+ # @return [GroupMember] the user as a group member object
28
+ def member_by_id(id)
29
+ member_by_user(@client.user_from_id(id))
30
+ rescue Errors::UserNotFoundError
31
+ raise Errors::MemberNotFoundError.new(id, @id)
32
+ end
33
+
34
+ # @example
35
+ # client = Rublox::Client.new
36
+ # group = client.group_from_id(7384468)
37
+ # owner_member = group.member_by_user(group.owner)
38
+ # puts owner_member.role.rank # -> 255
39
+ # @param user [FullUser, LimitedUser] the user to tie to the group member
40
+ # @return [GroupMember] the user as a group member object
41
+ def member_by_user(user)
42
+ data = @client.http_client.get(
43
+ URL.endpoint("groups", "v2/users/#{user.id}/groups/roles")
44
+ )["data"].find { |member_data| member_data["group"]["id"] == @id }
45
+ raise Errors::MemberNotFoundError.new(user.id, @id) unless data
46
+
47
+ GroupMember.new(user, GroupRole.new(data["role"], self, @client), self, @client)
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rublox/util/url"
4
+
5
+ module Rublox
6
+ # This mixin module contains functions that can be called on user objects.
7
+ # @abstract
8
+ module User
9
+ # @example Updating a {FullUser}
10
+ # client = Rublox::Client.new
11
+ # user = client.user_from_id(1)
12
+ # puts user.display_name # -> Roblox
13
+ # # suppose the Roblox account changes it's display name to "ABC"
14
+ # refreshed_user = user.refresh
15
+ # puts refreshed_user.display_name # -> ABC
16
+ # @example Updating a {LimitedUser}
17
+ # client = Rublox::Client.new
18
+ # group = client.group_from_id(1)
19
+ # # say we want the user's join date. LimitedUsers do not contain that information, so we can update it to get a
20
+ # # FullUser, which has that
21
+ # the_full_user_owner = group.owner.refresh
22
+ # # we can now get the owner's join date
23
+ # puts the_full_user_owner.join_date.inspect # "2008-09-30 15:54:26 UTC"
24
+ # @return [FullUser] a mirrored {FullUser} object, containing new information
25
+ # about theuser if it has been changed, or if the user is a {LimitedUser}.
26
+ def refresh
27
+ @client.user_from_id(@id)
28
+ end
29
+
30
+ # @example
31
+ # client = Rublox::Client.new
32
+ # user = client.user_from_id(1)
33
+ # puts user.friend_count # -> 0
34
+ # @return [Integer] the count of how many friends the user has
35
+ def friend_count
36
+ @client.http_client.get(
37
+ URL.endpoint("friends", "/v1/users/#{@id}/friends/count")
38
+ )["count"]
39
+ end
40
+
41
+ # @example
42
+ # client = Rublox::Client.new
43
+ # user = client.user_from_id(1)
44
+ # puts user.follower_count # -> around 6 million
45
+ # @return [Integer] the count of how many followers the user has
46
+ def follower_count
47
+ @client.http_client.get(
48
+ URL.endpoint("friends", "/v1/users/#{@id}/followers/count")
49
+ )["count"]
50
+ end
51
+
52
+ # @example
53
+ # client = Rublox::Client.new
54
+ # user = client.user_from_id(1)
55
+ # puts user.followings_count # -> 0
56
+ # @return [Integer] the count of how many users the user has followed
57
+ def followings_count
58
+ @client.http_client.get(
59
+ URL.endpoint("friends", "/v1/users/#{@id}/followings/count")
60
+ )["count"]
61
+ end
62
+
63
+ # @example
64
+ # client = Rublox::Client.new
65
+ # user = client.user_from_id(1)
66
+ # puts user.status # -> "Welcome to Roblox, the Imagination Platform. Make friends, explore, and play games!"
67
+ # @return [String] the user's status
68
+ def status
69
+ @client.http_client.get(
70
+ URL.endpoint("users", "/v1/users/#{@id}/status")
71
+ )["status"]
72
+ end
73
+
74
+ # @example
75
+ # client = Rublox::Client.new
76
+ # user = client.user_from_id(1)
77
+ # presence = user.presence
78
+ # puts presence.last_location # -> "Website"
79
+ # @return [Presence] the presence state of the user
80
+ def presence
81
+ @client.user_presence_from_id(@id)
82
+ end
83
+
84
+ # @return [String] a readable string representation of the user
85
+ def to_s
86
+ "User of ID #{@id}, username: #{@username}"
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rublox/models/group_shout"
4
+ require "rublox/models/limited_user"
5
+ require "rublox/derive/group"
6
+
7
+ module Rublox
8
+ # @note This class is handled internally by the public interface such as
9
+ # {Client#group_from_id}. You should not be creating it yourself.
10
+ # The {FullGroup} class corresponds to a full group response you can get via
11
+ # https://groups.roblox.com/v1/groups/groupId. You can use it to get information
12
+ # about groups.
13
+ #
14
+ # See {Group} for methods you can call on groups!
15
+ class FullGroup
16
+ include Group
17
+
18
+ # @return [Integer] the group's ID
19
+ attr_reader :id
20
+
21
+ # @return [String] the group's name
22
+ attr_reader :name
23
+
24
+ # @return [String] the group's description
25
+ attr_reader :description
26
+
27
+ # @return [LimitedUser, nil] the group's owner, can be nil if the group has
28
+ # no owner
29
+ attr_reader :owner
30
+
31
+ # @return [GroupShout, nil] the group's shout, can be nil if the group has
32
+ # no shout
33
+ attr_reader :shout
34
+
35
+ # @return [Integer] the count of how many members the group has
36
+ attr_reader :member_count
37
+
38
+ # @return [true, false] is the group locked?
39
+ attr_reader :locked
40
+
41
+ # @return [true, false] is the group private/invite only?
42
+ attr_reader :private
43
+
44
+ # @param data [Hash]
45
+ # @param client [Client]
46
+ def initialize(data, client)
47
+ @id = data["id"]
48
+ @name = data["name"]
49
+ @description = data["description"]
50
+ @owner = LimitedUser.new(data["owner"], client) if data["owner"]
51
+ @shout = GroupShout.new(data["shout"], client, @id) if data["shout"]
52
+ @member_count = data["memberCount"]
53
+ # isLocked is only returned if the group is locked, else it is just null (awesome)
54
+ @locked = !data["isLocked"].nil?
55
+ @private = data["publicEntryAllowed"]
56
+
57
+ @client = client
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "time"
4
+
5
+ require "rublox/derive/user"
6
+
7
+ module Rublox
8
+ # @note This class is handled internally by the public interface such as
9
+ # {Client#user_from_id}. You should not be creating it yourself.
10
+ # The {FullUser} class corresponds to a full user response you can get via
11
+ # https://users.roblox.com/v1/users/userId. You can use it to get information
12
+ # about users.
13
+ #
14
+ # See {User} for methods you can call on users!
15
+ class FullUser
16
+ include User
17
+
18
+ # @return [Integer] the user's ID
19
+ attr_reader :id
20
+
21
+ # @return [String] the user's username
22
+ attr_reader :username
23
+
24
+ # @return [String] the user's display name
25
+ attr_reader :display_name
26
+
27
+ # @return [String] the user's profile description
28
+ attr_reader :description
29
+
30
+ # @return [true, false] is the user banned?
31
+ attr_reader :banned
32
+
33
+ # @return [Time] the user's join date
34
+ attr_reader :join_date
35
+
36
+ # @param data [Hash]
37
+ # @param client [Client]
38
+ def initialize(data, client)
39
+ @id = data["id"]
40
+ @username = data["name"]
41
+ @display_name = data["displayName"]
42
+ @description = data["description"]
43
+ @banned = data["banned"]
44
+ @join_date = Time.iso8601(data["created"])
45
+
46
+ @client = client
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rublox
4
+ # @note This class is handled internally by the public interface such as
5
+ # such as {Group#member_by_user}. You should not be creating it yourself.
6
+ # The {GroupMember} class corresponds to a member response, which contains
7
+ # information about the user, their role and group.
8
+ class GroupMember
9
+ # @return [LimitedUser] the user object tied to this member
10
+ attr_reader :user
11
+
12
+ # @return {GroupRole} the role object tied to this member
13
+ attr_reader :role
14
+
15
+ # @return [FullGroup] the group object tied to this member
16
+ attr_reader :group
17
+
18
+ # @param user [FullUser, LimitedUser]
19
+ # @param role [GroupRole]
20
+ # @param group [FullGroup]
21
+ # @param client [Client]
22
+ def initialize(user, role, group, client)
23
+ @user = user
24
+ @role = role
25
+ @group = group
26
+ @client = client
27
+ end
28
+
29
+ # @note Use this if you need the state of the member changed. If you only
30
+ # want the role's state updated without updating the member's state, use
31
+ # {GroupRole#refresh}
32
+ # @example
33
+ # client = Rublox::Client.new
34
+ # group = client.group_from_id(7384468)
35
+ # member = group.member_by_id(1)
36
+ # puts member.role.rank # -> 1
37
+ # # Assume Roblox now has the Owner role
38
+ # updated_member = member.refresh_role
39
+ # puts updated_member.role.rank # -> 255
40
+ # @return [GroupMember] a new {GroupMember} with a new {#role}, if it has been changed.
41
+ def refresh_role
42
+ data = @client.http_client.get(
43
+ URL.endpoint("groups", "/v2/users/#{@user.id}/groups/roles")
44
+ )["data"].find { |role| role["group"]["id"] == @group.id }
45
+
46
+ GroupMember.new(
47
+ @user,
48
+ GroupRole.new(data["role"], @group, @client),
49
+ @group,
50
+ @client
51
+ )
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rublox/util/Errors"
4
+
5
+ module Rublox
6
+ # @note This class is handled internally by the public interface such as
7
+ # {Group#roles}. You should not be creating it yourself.
8
+ # The {GroupRole} class corresponds to a group's role. You can use it to get
9
+ # and set information about roles.
10
+ class GroupRole
11
+ # @return [Integer] the role's ID
12
+ attr_reader :id
13
+
14
+ # @return [String] the role's name
15
+ attr_reader :name
16
+
17
+ # @return [String, nil] the role's description. Can be nil if the authenticated
18
+ # user does not have access to the group's role settings.
19
+ attr_reader :description
20
+
21
+ # @return [Integer] the role's rank (0-255)
22
+ attr_reader :rank
23
+
24
+ # @return [Integer] the count of how many users have the role
25
+ attr_reader :member_count
26
+
27
+ # @return [Group] the group tied to this role
28
+ attr_reader :group
29
+
30
+ # @param data [Hash]
31
+ # @param group [FullGroup]
32
+ # @param client [Client]
33
+ def initialize(data, group, client)
34
+ @id = data["id"]
35
+ @name = data["name"]
36
+ @description = data["description"]
37
+ @rank = data["rank"]
38
+ @member_count = data["memberCount"]
39
+ @group = group
40
+
41
+ @client = client
42
+ end
43
+
44
+ # @example
45
+ # client = Rublox::Client.new
46
+ # client.group_from_id(7384468)
47
+ # role = client
48
+ # .group_from_id(7384468)
49
+ # .member_by_id(1)
50
+ # .role
51
+ # puts role.rank # -> 1
52
+ # # Assume Roblox now has the Owner role
53
+ # updated_role = role.refresh
54
+ # puts updated_role.rank # -> 255
55
+ # @return [GroupRole] a mirrored {GroupRole} object, containing new information
56
+ # about the role if it has been changed.
57
+ def refresh
58
+ data = @client.http_client.get(
59
+ URL.endpoint("groups", "/v1/groups/#{@group.id}/roles")
60
+ )["roles"].find { |role| role["id"] == @id }
61
+ raise Errors::RoleNotFoundError.new(@id, @group.id) unless data
62
+
63
+ GroupRole.new(
64
+ data,
65
+ @group,
66
+ @client
67
+ )
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rublox/models/limited_user"
4
+
5
+ module Rublox
6
+ # @note This class is handled internally by the public interface such as
7
+ # {FullGroup#shout}. You should not be creating it yourself.
8
+ # The {GroupShout} class corresponds to a shout response. You can use it to get
9
+ # and set information about group shouts.
10
+ class GroupShout
11
+ # @return [String] the shout's body
12
+ attr_reader :body
13
+
14
+ # @return [LimitedUser, nil] the user that made the shout, can be nil if the
15
+ # shout has no poster
16
+ attr_reader :poster
17
+
18
+ # @param data [Hash]
19
+ # @param client [Client]
20
+ # @param group_id [Integer]
21
+ def initialize(data, client, group_id)
22
+ @body = data["body"]
23
+ @poster = LimitedUser.new(data["poster"], client) if data["poster"]
24
+
25
+ @group_id = group_id
26
+ @client = client
27
+ end
28
+
29
+ # Sends a new shout.
30
+ # @example
31
+ # client = Rublox::Client.new
32
+ # group = client.group_from_id(1)
33
+ # group.shout.send_shout("new shout")
34
+ # @param new_shout [String] the body of the new shout
35
+ # @return [void]
36
+ def send_shout(new_shout)
37
+ @client.http_client.patch(
38
+ URL.endpoint("groups", "v1/groups/#{@group_id}/status"),
39
+ json: {
40
+ message: new_shout
41
+ }
42
+ )
43
+ end
44
+
45
+ # Clears the group shout. Same as calling {#send_shout} with an empty string.
46
+ # @example
47
+ # client = Rublox::Client.new
48
+ # group = client.group_from_id(1)
49
+ # group.shout.clear
50
+ # # same as
51
+ # group.shout.send_shout("")
52
+ # @return [void]
53
+ def clear
54
+ send_shout("")
55
+ end
56
+
57
+ # @return [GroupShout] A new group shout object with updated information.
58
+ def refresh
59
+ @client.group_from_id(@group_id).shout
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "time"
4
+
5
+ require "rublox/derive/user"
6
+
7
+ module Rublox
8
+ # @note This class is handled internally by the public interface such as
9
+ # {FullGroup#owner}. You should not be creating it yourself.
10
+ # The {LimitedUser} is an user containing less information. It exists as some
11
+ # API's do not return full user information, and I decided to not send extra
12
+ # requests. You can call {#refresh} to get a {FullUser} if needed.
13
+ class LimitedUser
14
+ include User
15
+
16
+ # (see FullUser#id)
17
+ attr_reader :id
18
+
19
+ # (see FullUser#username)
20
+ attr_reader :username
21
+
22
+ # (see FullUser#display_name)
23
+ attr_reader :display_name
24
+
25
+ # (see FullUser#initialize)
26
+ def initialize(data, client)
27
+ @id = data["id"] || data["userId"] || data["builderId"]
28
+ @username = data["name"] || data["username"] || data["builder"]
29
+ @display_name = data["displayName"] || data["DisplayName"]
30
+
31
+ @client = client
32
+ end
33
+ end
34
+ end