repltalk 0.0.2 → 0.2.0

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 +450 -1
  3. data/lib/repltalk.rb +180 -14
  4. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 20a734e23845662221713e80116ff22642e1b29ac2c2a6c764df751b22e9525c
4
- data.tar.gz: ef93440afcbd6fd94e73a76a07afafa39ebb2e3d53876e7a54649971b3a89185
3
+ metadata.gz: 4c29ae54ca39ef4007759029d6fe54038a6be1d78899531f28f125f7e005d1da
4
+ data.tar.gz: 56b3e5523034aa80ceddd37be953e4ce6f41035cf719c2e1e8472ddfd25c1280
5
5
  SHA512:
6
- metadata.gz: 994fda44ba43bc320c033e81f8fff388ebfff232d26e77d56481601303862fd33334d5f0d4bfb7a36a49c500f6669c733f4f8e652c76f4dd829f5c4763194994
7
- data.tar.gz: 6d0198dfb4d1163a18d69473175f52d45801a6d36154e1bce5cdc555e0142aeca32e91847e68c5fefaa41ee3e46fce9961bfe8281359bf65f46a809ea391b7da
6
+ metadata.gz: 8583dc5b8e2ea98ae39dc3d1eaa5b8896f9730b877c246a37ef3761c31c3333f259e6e33adf6174dbbf5e8452cc35dfd6f16103bfa8f1cffdbce8259aa960d8b
7
+ data.tar.gz: df881342da9575ddaf044a7bc49ad3846470936fed45815365203d57854c271802108d7db505e5114a260ac13ff6f443b8c088cbf6484d688593517bfb938028
data/lib/queries.rb CHANGED
@@ -1,5 +1,454 @@
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
+ }"
305
+ end
306
+
307
+ def Queries.get_post
308
+ "query post($id: Int!) {
309
+ post(id: $id) {
310
+ id
311
+ title
312
+ preview(removeMarkdown: true, length: 150)
313
+ body
314
+ isAnnouncement
315
+ url
316
+ isAnswerable
317
+ isHidden
318
+ answeredBy {
319
+ id
320
+ ...PostAnsweredCardUser
321
+ __typename
322
+ }
323
+ answer {
324
+ id
325
+ ...PostAnsweredCardComment
326
+ __typename
327
+ }
328
+ board {
329
+ id
330
+ url
331
+ description
332
+ slug
333
+ __typename
334
+ }
335
+ ...PostDetailPost
336
+ __typename
337
+ }
338
+ }
339
+
340
+ fragment PostDetailPost on Post {
341
+ id
342
+ title
343
+ body
344
+ timeCreated
345
+ canReport
346
+ hasReported
347
+ isAnnouncement
348
+ isPinned
349
+ isLocked
350
+ isHidden
351
+ commentCount
352
+ isAnswered
353
+ isAnswerable
354
+ ...PostVoteControlPost
355
+ user {
356
+ id
357
+ roles {
358
+ id
359
+ name
360
+ key
361
+ tagline
362
+ __typename
363
+ }
364
+ organization {
365
+ id
366
+ name
367
+ __typename
368
+ }
369
+ languages {
370
+ id
371
+ key
372
+ displayName
373
+ tagline
374
+ icon
375
+ __typename
376
+ }
377
+ ...UserPostHeaderUser
378
+ __typename
379
+ }
380
+ repl {
381
+ id
382
+ url
383
+ title
384
+ description
385
+ isPrivate
386
+ isAlwaysOn
387
+ lang {
388
+ id
389
+ icon
390
+ key
391
+ displayName
392
+ tagline
393
+ __typename
394
+ }
395
+ __typename
396
+ }
397
+ board {
398
+ id
399
+ name
400
+ color
401
+ __typename
402
+ }
403
+ __typename
404
+ }
405
+
406
+ fragment PostVoteControlPost on Post {
407
+ id
408
+ voteCount
409
+ canVote
410
+ hasVoted
411
+ __typename
412
+ }
413
+
414
+ fragment UserPostHeaderUser on User {
415
+ id
416
+ image
417
+ isHacker
418
+ isModerator: hasRole(role: MODERATOR)
419
+ isAdmin: hasRole(role: ADMIN)
420
+ ...DepreciatedUserLabelUser
421
+ ...UserLinkUser
422
+ __typename
423
+ }
424
+
425
+ fragment UserLinkUser on User {
426
+ id
427
+ url
428
+ username
429
+ __typename
430
+ }
431
+
432
+ fragment DepreciatedUserLabelUser on User {
433
+ id
434
+ image
435
+ username
436
+ url
437
+ karma
438
+ __typename
439
+ }
440
+
441
+ fragment PostAnsweredCardUser on User {
442
+ id
443
+ username
444
+ ...DepreciatedUserLabelUser
445
+ __typename
446
+ }
447
+
448
+ fragment PostAnsweredCardComment on Comment {
449
+ id
450
+ url
451
+ __typename
452
+ }"
4
453
  end
5
454
  end
data/lib/repltalk.rb CHANGED
@@ -16,6 +16,23 @@ class Role
16
16
  end
17
17
  end
18
18
 
19
+
20
+
21
+ class Organization
22
+ attr_reader :id, :name
23
+
24
+ def initialize(organization)
25
+ @id = organization["id"]
26
+ @name = organization["name"]
27
+ end
28
+
29
+ def to_s
30
+ @name
31
+ end
32
+ end
33
+
34
+
35
+
19
36
  class Language
20
37
  attr_reader :id, :key, :name, :tagline, :icon
21
38
 
@@ -32,10 +49,113 @@ class Language
32
49
  end
33
50
  end
34
51
 
52
+
53
+
54
+ class Repl
55
+ attr_reader :id, :url, :title, :description, :language, :is_private, :is_always_on
56
+
57
+ def initialize(repl)
58
+ @id = repl["id"]
59
+ @url = repl["url"]
60
+ @title = repl["title"]
61
+ @description = repl["description"]
62
+ @language = Language.new(repl["lang"])
63
+
64
+ @is_private = repl["isPrivate"]
65
+ @is_always_on = repl["isAlwaysOn"]
66
+ end
67
+
68
+ def to_s
69
+ @title
70
+ end
71
+ end
72
+
73
+
74
+
75
+ class Board
76
+ attr_reader :id, :name, :color
77
+
78
+ def initialize(board)
79
+ @id = board["id"]
80
+ @name = board["name"]
81
+ @color = board["color"]
82
+ end
83
+
84
+ def to_s
85
+ @name
86
+ end
87
+ end
88
+
89
+
90
+
91
+ class Comment
92
+ attr_reader :id, :url, :author, :content, :vote_count, :can_vote, :has_voted
93
+
94
+ def initialize(client, comment)
95
+ @client = client
96
+
97
+ @id = comment["id"]
98
+ @url = comment["url"]
99
+ @author = User.new(@client, comment["user"])
100
+ @content = comment["body"]
101
+ @vote_count = comment["voteCount"]
102
+
103
+ @can_vote = comment["canVote"]
104
+ @has_voted = comment["hasVoted"]
105
+ end
106
+
107
+ def to_s
108
+ @content
109
+ end
110
+ end
111
+
112
+
113
+
114
+ class Post
115
+ attr_reader :id, :url, :repl, :board, :title, :author, :content, :preview, :timestamp, :vote_count, :comment_count, :can_vote, :has_voted, :is_answered, :is_answerable, :is_hidden, :is_pinned, :is_locked, :is_announcement
116
+
117
+ def initialize(client, post)
118
+ @client = client
119
+
120
+ @id = post["id"]
121
+ @url = post["url"]
122
+ @title = post["title"]
123
+ @content = post["body"]
124
+ @preview = post["preview"]
125
+ @timestamp = post["timeCreated"]
126
+
127
+ @board = Board.new(post["board"])
128
+ @author = User.new(@client, post["user"])
129
+ @repl = post["repl"] == nil ? nil : Repl.new(post["repl"])
130
+
131
+ @vote_count = post["voteCount"]
132
+ @comment_count = post["commentCount"]
133
+
134
+ @can_vote = post["canVote"]
135
+ @has_voted = post["hasVoted"]
136
+
137
+ @is_answered = post["isAnswered"]
138
+ @is_answerable = post["isAnswerable"]
139
+
140
+ @is_hidden = post["isHidden"]
141
+ @is_pinned = post["isPinned"]
142
+ @is_locked = post["isLocked"]
143
+ @is_announcement = post["isAnnouncement"]
144
+ end
145
+
146
+ def to_s
147
+ @title
148
+ end
149
+ end
150
+
151
+
152
+
35
153
  class User
36
- attr_reader :id, :username, :name, :pfp, :bio, :cycles, :is_hacker, :roles, :languages
154
+ attr_reader :id, :username, :name, :pfp, :bio, :cycles, :is_hacker, :roles, :organization, :languages
155
+
156
+ def initialize(client, user)
157
+ @client = client
37
158
 
38
- def initialize(user)
39
159
  @id = user["id"]
40
160
  @username = user["username"]
41
161
  @name = user["fullName"]
@@ -44,14 +164,45 @@ class User
44
164
  @cycles = user["karma"]
45
165
  @is_hacker = user["isHacker"]
46
166
  @roles = user["roles"].map { |role| Role.new(role) }
167
+ @organization = user["organization"] == nil ? nil : Organization.new(user["organization"])
47
168
  @languages = user["languages"].map { |lang| Language.new(lang) }
48
169
  end
49
170
 
171
+ def get_posts(order: "new", count: nil, after: nil)
172
+ p = @client.graphql(
173
+ "ProfilePosts",
174
+ Queries.get_user_posts,
175
+ username: @username,
176
+ order: order,
177
+ count: count,
178
+ after: after
179
+ )
180
+ posts = Array.new
181
+ p["user"]["posts"]["items"].each { |post| posts << Post.new(@client, post) }
182
+ posts
183
+ end
184
+
185
+ def get_comments(order: "new", count: nil, after: nil)
186
+ c = @client.graphql(
187
+ "ProfileComments",
188
+ Queries.get_user_comments,
189
+ username: @username,
190
+ order: order,
191
+ count: count,
192
+ after: after
193
+ )
194
+ comments = Array.new
195
+ c["user"]["comments"]["items"].each { |comment| comments << Comment.new(@client, comment) }
196
+ comments
197
+ end
198
+
50
199
  def to_s
51
200
  @username
52
201
  end
53
202
  end
54
203
 
204
+
205
+
55
206
  class Client
56
207
  attr_writer :sid
57
208
 
@@ -59,18 +210,6 @@ class Client
59
210
  @sid = sid
60
211
  end
61
212
 
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
213
  def graphql(name, query, **variables)
75
214
  payload = {
76
215
  operationName: name,
@@ -97,4 +236,31 @@ class Client
97
236
  data = data["data"] if data.include?("data")
98
237
  data
99
238
  end
239
+
240
+ def get_user(name)
241
+ u = graphql(
242
+ "userByUsername",
243
+ Queries.get_user,
244
+ username: name
245
+ )
246
+ User.new(self, u["user"])
247
+ end
248
+
249
+ def get_user_by_id(id)
250
+ u = graphql(
251
+ "user",
252
+ Queries.get_user_by_id,
253
+ user_id: id
254
+ )
255
+ User.new(self, u["user"])
256
+ end
257
+
258
+ def get_post(id)
259
+ p = graphql(
260
+ "post",
261
+ Queries.get_post,
262
+ id: id
263
+ )
264
+ Post.new(self, p["post"])
265
+ end
100
266
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: repltalk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.2.0
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
11
+ date: 2021-03-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: http
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  description: With the repltalk gem, you can easily interect with the repltalk graphql
42
- api.
42
+ api. See https://github.com/Coding-Cactus/repltalk for documentation
43
43
  email: codingcactus.cc@gmail.com
44
44
  executables: []
45
45
  extensions: []
@@ -50,7 +50,7 @@ files:
50
50
  homepage:
51
51
  licenses: []
52
52
  metadata:
53
- source_code_uri: https://github.com/Codin-Cactus/repltalk
53
+ source_code_uri: https://github.com/Coding-Cactus/repltalk
54
54
  post_install_message:
55
55
  rdoc_options: []
56
56
  require_paths: