repltalk 0.0.1 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/queries.rb +302 -1
  3. data/lib/repltalk.rb +155 -14
  4. metadata +33 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 13027c3d3c0836aef9c475c378f3d9925279120baff4d78c257791e0ccd42e6d
4
- data.tar.gz: 9c01fe5c68960314f4324fb19e8531222f88bfc06a76d26831c05d8518466177
3
+ metadata.gz: 1f693b0e2f8cc3d1bcf1b646f02c8a551053f35b37f42aa5a6849a1cefcb086b
4
+ data.tar.gz: 29a598f83669519a169a2b7717e01cb53531b87e7651349e181f59b01558888a
5
5
  SHA512:
6
- metadata.gz: 868d939d3d8ab8a1899046304746f97f1b7ab17e6d81cdd3799642c81e7fffb8ada236c17adf90632f7f464f73f1345453fa775c45d251a0e67256d905d545af
7
- data.tar.gz: 8bff217952da08561b76038defe334f15f3b225e937b66813d576d6d3c614cb7fa0a3d99c0429a803e8f08e16085482200dd4c7726006bcadba968bdba066d55
6
+ metadata.gz: 9ec56f08034f1a82e343d4bca650a418ad2fba543e89e9d12ccf7c0d4e9435bffe5856194b4352c8de6cb0f28de22f884135399ba66d9eb5165050a947779481
7
+ data.tar.gz: 7fdcd18d242c366c0a249e31e5fb7b20b6e900e2dfeefa0c583772d13d161ebf171414721418179cc2ec63fc18facf0bbdf166843f4ba0e88d0fe9a4ceca1fb3
data/lib/queries.rb CHANGED
@@ -1,5 +1,306 @@
1
1
  class Queries
2
2
  def Queries.get_user
3
- "query userByUsername($username: String!) {\n currentUser {\n id\n hasAchievementsGate: gate(feature: \"flag-achievements-v0\")\n __typename\n }\n user: userByUsername(username: $username) {\n id\n username\n fullName\n image\n url\n redirectToTeamDashboard\n ...ProfileHeaderUser\n __typename\n }\n}\n\nfragment ProfileHeaderUser on User {\n id\n fullName\n username\n image\n isLoggedIn\n bio\n karma\n isHacker\n roles {\n id\n name\n key\n tagline\n __typename\n }\n organization {\n id\n name\n __typename\n }\n languages {\n id\n key\n displayName\n tagline\n icon\n __typename\n }\n __typename\n}"
3
+ "query userByUsername($username: String!) {
4
+ user: userByUsername(username: $username) {
5
+ id
6
+ username
7
+ fullName
8
+ image
9
+ url
10
+ ...ProfileHeaderUser
11
+ __typename
12
+ }
13
+ }
14
+
15
+ fragment ProfileHeaderUser on User {
16
+ id
17
+ fullName
18
+ username
19
+ image
20
+ bio
21
+ karma
22
+ isHacker
23
+ roles {
24
+ id
25
+ name
26
+ key
27
+ tagline
28
+ __typename
29
+ }
30
+ organization {
31
+ id
32
+ name
33
+ __typename
34
+ }
35
+ languages {
36
+ id
37
+ key
38
+ displayName
39
+ tagline
40
+ icon
41
+ __typename
42
+ }
43
+ __typename
44
+ }"
45
+ end
46
+
47
+ def Queries.get_user_by_id
48
+ "query user($user_id: Int!) {
49
+ user: user(id: $user_id) {
50
+ id
51
+ username
52
+ fullName
53
+ image
54
+ url
55
+ ...ProfileHeaderUser
56
+ __typename
57
+ }
58
+ }
59
+
60
+ fragment ProfileHeaderUser on User {
61
+ id
62
+ fullName
63
+ username
64
+ image
65
+ bio
66
+ karma
67
+ isHacker
68
+ roles {
69
+ id
70
+ name
71
+ key
72
+ tagline
73
+ __typename
74
+ }
75
+ organization {
76
+ id
77
+ name
78
+ __typename
79
+ }
80
+ languages {
81
+ id
82
+ key
83
+ displayName
84
+ tagline
85
+ icon
86
+ __typename
87
+ }
88
+ __typename
89
+ }"
90
+ end
91
+
92
+ def Queries.get_user_posts
93
+ "query ProfilePosts($username: String!, $after: String, $order: String, $count: Int) {
94
+ user: userByUsername(username: $username) {
95
+ id
96
+ displayName
97
+ posts(after: $after, order: $order, count: $count) {
98
+ items {
99
+ id
100
+ isHidden
101
+ ...PostsFeedItemPost
102
+ board {
103
+ id
104
+ name
105
+ url
106
+ color
107
+ __typename
108
+ }
109
+ __typename
110
+ }
111
+ pageInfo {
112
+ nextCursor
113
+ __typename
114
+ }
115
+ __typename
116
+ }
117
+ __typename
118
+ }
119
+ }
120
+
121
+ fragment PostsFeedItemPost on Post {
122
+ id
123
+ title
124
+ body
125
+ preview(removeMarkdown: true, length: 150)
126
+ url
127
+ commentCount
128
+ isPinned
129
+ isLocked
130
+ isAnnouncement
131
+ timeCreated
132
+ isAnswered
133
+ isAnswerable
134
+ ...PostVoteControlPost
135
+ ...PostLinkPost
136
+ user {
137
+ id
138
+ username
139
+ isHacker
140
+ image
141
+ ...UserLabelUser
142
+ ...UserLinkUser
143
+ __typename
144
+ }
145
+ repl {
146
+ id
147
+ url
148
+ title
149
+ description
150
+ isPrivate
151
+ isAlwaysOn
152
+ lang {
153
+ id
154
+ icon
155
+ key
156
+ displayName
157
+ tagline
158
+ __typename
159
+ }
160
+ __typename
161
+ }
162
+ board {
163
+ id
164
+ name
165
+ color
166
+ __typename
167
+ }
168
+ }
169
+
170
+ fragment PostVoteControlPost on Post {
171
+ id
172
+ voteCount
173
+ canVote
174
+ hasVoted
175
+ __typename
176
+ }
177
+
178
+ fragment PostLinkPost on Post {
179
+ id
180
+ url
181
+ __typename
182
+ }
183
+
184
+ fragment UserLabelUser on User {
185
+ id
186
+ username
187
+ karma
188
+ ...UserLinkUser
189
+ __typename
190
+ }
191
+
192
+ fragment UserLinkUser on User {
193
+ id
194
+ url
195
+ username
196
+ roles {
197
+ id
198
+ name
199
+ key
200
+ tagline
201
+ __typename
202
+ }
203
+ organization {
204
+ id
205
+ name
206
+ __typename
207
+ }
208
+ languages {
209
+ id
210
+ key
211
+ displayName
212
+ tagline
213
+ icon
214
+ __typename
215
+ }
216
+ __typename
217
+ }"
218
+ end
219
+
220
+ def Queries.get_user_comments
221
+ "query ProfileComments($username: String!, $after: String, $order: String, $count: Int) {
222
+ user: userByUsername(username: $username) {
223
+ id
224
+ displayName
225
+ comments(after: $after, order: $order, count: $count) {
226
+ items {
227
+ id
228
+ ...ProfileCommentsComment
229
+ __typename
230
+ }
231
+ pageInfo {
232
+ nextCursor
233
+ __typename
234
+ }
235
+ __typename
236
+ }
237
+ __typename
238
+ }
239
+ }
240
+
241
+ fragment ProfileCommentsComment on Comment {
242
+ id
243
+ body
244
+ timeCreated
245
+ url
246
+ ...CommentVoteControlComment
247
+ user {
248
+ id
249
+ fullName
250
+ username
251
+ image
252
+ bio
253
+ karma
254
+ isHacker
255
+ roles {
256
+ id
257
+ name
258
+ key
259
+ tagline
260
+ __typename
261
+ }
262
+ organization {
263
+ id
264
+ name
265
+ __typename
266
+ }
267
+ languages {
268
+ id
269
+ key
270
+ displayName
271
+ tagline
272
+ icon
273
+ __typename
274
+ }
275
+ }
276
+ post {
277
+ id
278
+ title
279
+ url
280
+ user {
281
+ id
282
+ username
283
+ url
284
+ __typename
285
+ }
286
+ board {
287
+ id
288
+ name
289
+ url
290
+ slug
291
+ __typename
292
+ }
293
+ __typename
294
+ }
295
+ __typename
296
+ }
297
+
298
+ fragment CommentVoteControlComment on Comment {
299
+ id
300
+ voteCount
301
+ canVote
302
+ hasVoted
303
+ __typename
304
+ }"
4
305
  end
5
306
  end
data/lib/repltalk.rb CHANGED
@@ -16,6 +16,19 @@ class Role
16
16
  end
17
17
  end
18
18
 
19
+ class Organization
20
+ attr_reader :id, :name
21
+
22
+ def initialize(organization)
23
+ @id = organization["id"]
24
+ @name = organization["name"]
25
+ end
26
+
27
+ def to_s
28
+ @name
29
+ end
30
+ end
31
+
19
32
  class Language
20
33
  attr_reader :id, :key, :name, :tagline, :icon
21
34
 
@@ -32,10 +45,103 @@ class Language
32
45
  end
33
46
  end
34
47
 
48
+ class Repl
49
+ attr_reader :id, :url, :title, :description, :language, :is_private, :is_always_on
50
+
51
+ def initialize(repl)
52
+ @id = repl["id"]
53
+ @url = repl["url"]
54
+ @title = repl["title"]
55
+ @description = repl["description"]
56
+ @language = Language.new(repl["lang"])
57
+
58
+ @is_private = repl["isPrivate"]
59
+ @is_always_on = repl["isAlwaysOn"]
60
+ end
61
+
62
+ def to_s
63
+ @title
64
+ end
65
+ end
66
+
67
+ class Board
68
+ attr_reader :id, :name, :color
69
+
70
+ def initialize(board)
71
+ @id = board["id"]
72
+ @name = board["name"]
73
+ @color = board["color"]
74
+ end
75
+
76
+ def to_s
77
+ @name
78
+ end
79
+ end
80
+
81
+ class Comment
82
+ attr_reader :id, :url, :author, :content, :vote_count, :can_vote, :has_voted
83
+
84
+ def initialize(client, comment)
85
+ @client = client
86
+
87
+ @id = comment["id"]
88
+ @url = comment["url"]
89
+ @author = User.new(@client, comment["user"])
90
+ @content = comment["body"]
91
+ @vote_count = comment["voteCount"]
92
+
93
+ @can_vote = comment["canVote"]
94
+ @has_voted = comment["hasVoted"]
95
+ end
96
+
97
+ def to_s
98
+ @content
99
+ end
100
+ end
101
+
102
+ class Post
103
+ attr_reader :id, :url, :repl, :board, :title, :author, :content, :preview, :timestamp, :vote_count, :comment_count, :can_vote, :has_voted, :is_anwered, :is_answerable, :is_hidden, :is_pinned, :is_locked, :is_announcement
104
+
105
+ def initialize(client, post)
106
+ @client = client
107
+
108
+ @id = post["id"]
109
+ @url = post["url"]
110
+ @title = post["title"]
111
+ @content = post["body"]
112
+ @preview = post["preview"]
113
+ @timestamp = post["timeCreated"]
114
+
115
+ @board = Board.new(post["board"])
116
+ @author = User.new(@client, post["user"])
117
+ @repl = post["repl"] == nil ? nil : Repl.new(post["repl"])
118
+
119
+ @vote_count = post["voteCount"]
120
+ @comment_count = post["commentCount"]
121
+
122
+ @can_vote = post["canVote"]
123
+ @has_voted = post["hasVoted"]
124
+
125
+ @is_answered = post["isAnswered"]
126
+ @is_answerable = post["isAnswerable"]
127
+
128
+ @is_hidden = post["isHidden"]
129
+ @is_pinned = post["isPinned"]
130
+ @is_locked = post["isLocked"]
131
+ @is_announcement = post["isAnnouncement"]
132
+ end
133
+
134
+ def to_s
135
+ @title
136
+ end
137
+ end
138
+
35
139
  class User
36
- attr_reader :id, :username, :name, :pfp, :bio, :cycles, :is_hacker, :roles, :languages
140
+ attr_reader :id, :username, :name, :pfp, :bio, :cycles, :is_hacker, :roles, :organization, :languages
141
+
142
+ def initialize(client, user)
143
+ @client = client
37
144
 
38
- def initialize(user)
39
145
  @id = user["id"]
40
146
  @username = user["username"]
41
147
  @name = user["fullName"]
@@ -44,9 +150,38 @@ class User
44
150
  @cycles = user["karma"]
45
151
  @is_hacker = user["isHacker"]
46
152
  @roles = user["roles"].map { |role| Role.new(role) }
153
+ @organization = user["organization"] == nil ? nil : Organization.new(user["organization"])
47
154
  @languages = user["languages"].map { |lang| Language.new(lang) }
48
155
  end
49
156
 
157
+ def get_posts(order: "new", count: nil, after: nil)
158
+ p = @client.graphql(
159
+ "ProfilePosts",
160
+ Queries.get_user_posts,
161
+ username: @username,
162
+ order: order,
163
+ count: count,
164
+ after: after
165
+ )
166
+ posts = Array.new
167
+ p["user"]["posts"]["items"].each { |post| posts << Post.new(@client, post) }
168
+ posts
169
+ end
170
+
171
+ def get_comments(order: "new", count: nil, after: nil)
172
+ c = @client.graphql(
173
+ "ProfileComments",
174
+ Queries.get_user_comments,
175
+ username: @username,
176
+ order: order,
177
+ count: count,
178
+ after: after
179
+ )
180
+ comments = Array.new
181
+ c["user"]["comments"]["items"].each { |comment| comments << Comment.new(@client, comment) }
182
+ comments
183
+ end
184
+
50
185
  def to_s
51
186
  @username
52
187
  end
@@ -59,18 +194,6 @@ class Client
59
194
  @sid = sid
60
195
  end
61
196
 
62
- def get_user(name)
63
- u = graphql(
64
- "userByUsername",
65
- Queries.get_user,
66
- username: name
67
- )
68
- User.new(u["user"])
69
- end
70
-
71
-
72
- private
73
-
74
197
  def graphql(name, query, **variables)
75
198
  payload = {
76
199
  operationName: name,
@@ -97,4 +220,22 @@ class Client
97
220
  data = data["data"] if data.include?("data")
98
221
  data
99
222
  end
223
+
224
+ def get_user(name)
225
+ u = graphql(
226
+ "userByUsername",
227
+ Queries.get_user,
228
+ username: name
229
+ )
230
+ User.new(self, u["user"])
231
+ end
232
+
233
+ def get_user_by_id(id)
234
+ u = graphql(
235
+ "user",
236
+ Queries.get_user_by_id,
237
+ user_id: id
238
+ )
239
+ User.new(u["user"])
240
+ end
100
241
  end
metadata CHANGED
@@ -1,17 +1,45 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: repltalk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - CodingCactus
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-03 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2021-03-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: http
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
+ - !ruby/object:Gem::Dependency
28
+ name: json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
13
41
  description: With the repltalk gem, you can easily interect with the repltalk graphql
14
- api.
42
+ api. See https://github.com/Coding-Cactus/repltalk for documentation
15
43
  email: codingcactus.cc@gmail.com
16
44
  executables: []
17
45
  extensions: []
@@ -22,7 +50,7 @@ files:
22
50
  homepage:
23
51
  licenses: []
24
52
  metadata:
25
- source_code_uri: https://github.com/Codin-Cactus/repltalk
53
+ source_code_uri: https://github.com/Coding-Cactus/repltalk
26
54
  post_install_message:
27
55
  rdoc_options: []
28
56
  require_paths: