repltalk 0.0.3 → 0.3.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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/queries.rb +539 -2
  3. data/lib/repltalk.rb +199 -23
  4. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c1cda8e04a68e4e299b7f80da3003b8c1998ff344b64e6e2eb2e89189a93e038
4
- data.tar.gz: 075ad2f71c0ce004a543e074fc86d4d598340bf299a6d069320a961a8259c3ff
3
+ metadata.gz: 85e8d796ec5d9532272e6ffb20cfa6881e49a38990c13ec58b0f6126974c7d2b
4
+ data.tar.gz: 2a9f9217d0af746f6dcec692e498c248480d68a8f8e1c2851eefa50a07933326
5
5
  SHA512:
6
- metadata.gz: 36c7e81f76f47241badb5ddea3364308c87c661b584dba55fdd8851d094648edeee2ab8df59db3267d0bb37b4e9727eb7d986b21693617e21f62c3162f5a2bbb
7
- data.tar.gz: a373b3ba08598f682f4ca70ab773ebafc343d7831d622a20edfd6c8067776db4d71022bae8a32c71120f6556c95f4637149ca0b738e37c1a2732e9d97af7dbc6
6
+ metadata.gz: 449d1a9f1f3a0af88d2d4ab6c316f73f437db0f6fca7d521fdc46b66ad783a2f305fc62ea5f72e2b9624a8a0529e026a8ca590f2ca39a161dc0e8ae41daa0aeb
7
+ data.tar.gz: b37f383cb86062cf2f1a9788e4f2c6456d0f155fb9eb49932fbcbb7c5e55f8caa319549dcff10cf25dad845ddc0b06ade7f760c558995aa2c72492e52dad2daa
data/lib/queries.rb CHANGED
@@ -1,9 +1,546 @@
1
1
  class Queries
2
2
  def Queries.get_user
3
- "query userByUsername($username: String!) {\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
+ timeCreated
24
+ roles {
25
+ id
26
+ name
27
+ key
28
+ tagline
29
+ __typename
30
+ }
31
+ organization {
32
+ id
33
+ name
34
+ __typename
35
+ }
36
+ languages {
37
+ id
38
+ key
39
+ displayName
40
+ tagline
41
+ icon
42
+ __typename
43
+ }
44
+ __typename
45
+ }"
4
46
  end
5
47
 
6
48
  def Queries.get_user_by_id
7
- "query user($user_id: Int!) {\n user: user(id: $user_id) {\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}"
49
+ "query user($user_id: Int!) {
50
+ user: user(id: $user_id) {
51
+ id
52
+ username
53
+ fullName
54
+ image
55
+ url
56
+ ...ProfileHeaderUser
57
+ __typename
58
+ }
59
+ }
60
+
61
+ fragment ProfileHeaderUser on User {
62
+ id
63
+ fullName
64
+ username
65
+ image
66
+ bio
67
+ karma
68
+ isHacker
69
+ timeCreated
70
+ roles {
71
+ id
72
+ name
73
+ key
74
+ tagline
75
+ __typename
76
+ }
77
+ organization {
78
+ id
79
+ name
80
+ __typename
81
+ }
82
+ languages {
83
+ id
84
+ key
85
+ displayName
86
+ tagline
87
+ icon
88
+ __typename
89
+ }
90
+ __typename
91
+ }"
92
+ end
93
+
94
+ def Queries.get_user_posts
95
+ "query ProfilePosts($username: String!, $after: String, $order: String, $count: Int) {
96
+ user: userByUsername(username: $username) {
97
+ id
98
+ displayName
99
+ posts(after: $after, order: $order, count: $count) {
100
+ items {
101
+ id
102
+ isHidden
103
+ ...PostsFeedItemPost
104
+ board {
105
+ id
106
+ name
107
+ url
108
+ color
109
+ __typename
110
+ }
111
+ __typename
112
+ }
113
+ pageInfo {
114
+ nextCursor
115
+ __typename
116
+ }
117
+ __typename
118
+ }
119
+ __typename
120
+ }
121
+ }
122
+
123
+ fragment PostsFeedItemPost on Post {
124
+ id
125
+ title
126
+ body
127
+ preview(removeMarkdown: true, length: 150)
128
+ url
129
+ commentCount
130
+ isPinned
131
+ isLocked
132
+ isAnnouncement
133
+ timeCreated
134
+ isAnswered
135
+ isAnswerable
136
+ ...PostVoteControlPost
137
+ ...PostLinkPost
138
+ user {
139
+ id
140
+ username
141
+ isHacker
142
+ image
143
+ ...UserLabelUser
144
+ ...UserLinkUser
145
+ __typename
146
+ }
147
+ repl {
148
+ id
149
+ url
150
+ title
151
+ description
152
+ isPrivate
153
+ isAlwaysOn
154
+ lang {
155
+ id
156
+ icon
157
+ key
158
+ displayName
159
+ tagline
160
+ __typename
161
+ }
162
+ __typename
163
+ }
164
+ board {
165
+ id
166
+ name
167
+ color
168
+ __typename
169
+ }
170
+ }
171
+
172
+ fragment PostVoteControlPost on Post {
173
+ id
174
+ voteCount
175
+ canVote
176
+ hasVoted
177
+ __typename
178
+ }
179
+
180
+ fragment PostLinkPost on Post {
181
+ id
182
+ url
183
+ __typename
184
+ }
185
+
186
+ fragment UserLabelUser on User {
187
+ id
188
+ username
189
+ karma
190
+ ...UserLinkUser
191
+ __typename
192
+ }
193
+
194
+ fragment UserLinkUser on User {
195
+ id
196
+ url
197
+ username
198
+ timeCreated
199
+ roles {
200
+ id
201
+ name
202
+ key
203
+ tagline
204
+ __typename
205
+ }
206
+ organization {
207
+ id
208
+ name
209
+ __typename
210
+ }
211
+ languages {
212
+ id
213
+ key
214
+ displayName
215
+ tagline
216
+ icon
217
+ __typename
218
+ }
219
+ __typename
220
+ }"
221
+ end
222
+
223
+ def Queries.get_user_comments
224
+ "query ProfileComments($username: String!, $after: String, $order: String, $count: Int) {
225
+ user: userByUsername(username: $username) {
226
+ id
227
+ displayName
228
+ comments(after: $after, order: $order, count: $count) {
229
+ items {
230
+ id
231
+ ...ProfileCommentsComment
232
+ __typename
233
+ }
234
+ pageInfo {
235
+ nextCursor
236
+ __typename
237
+ }
238
+ __typename
239
+ }
240
+ __typename
241
+ }
242
+ }
243
+
244
+ fragment ProfileCommentsComment on Comment {
245
+ id
246
+ body
247
+ timeCreated
248
+ url
249
+ isAnswer
250
+ ...CommentVoteControlComment
251
+ user {
252
+ id
253
+ fullName
254
+ username
255
+ image
256
+ bio
257
+ karma
258
+ isHacker
259
+ timeCreated
260
+ roles {
261
+ id
262
+ name
263
+ key
264
+ tagline
265
+ __typename
266
+ }
267
+ organization {
268
+ id
269
+ name
270
+ __typename
271
+ }
272
+ languages {
273
+ id
274
+ key
275
+ displayName
276
+ tagline
277
+ icon
278
+ __typename
279
+ }
280
+ }
281
+ post {
282
+ id
283
+ title
284
+ url
285
+ user {
286
+ id
287
+ username
288
+ url
289
+ __typename
290
+ }
291
+ board {
292
+ id
293
+ name
294
+ url
295
+ slug
296
+ __typename
297
+ }
298
+ __typename
299
+ }
300
+ __typename
301
+ }
302
+
303
+ fragment CommentVoteControlComment on Comment {
304
+ id
305
+ voteCount
306
+ canVote
307
+ hasVoted
308
+ __typename
309
+ }"
310
+ end
311
+
312
+ def Queries.get_post
313
+ "query post($id: Int!) {
314
+ post(id: $id) {
315
+ id
316
+ title
317
+ preview(removeMarkdown: true, length: 150)
318
+ body
319
+ isAnnouncement
320
+ url
321
+ isAnswerable
322
+ isHidden
323
+ answeredBy {
324
+ id
325
+ ...PostAnsweredCardUser
326
+ __typename
327
+ }
328
+ answer {
329
+ id
330
+ ...PostAnsweredCardComment
331
+ __typename
332
+ }
333
+ board {
334
+ id
335
+ url
336
+ description
337
+ slug
338
+ __typename
339
+ }
340
+ ...PostDetailPost
341
+ __typename
342
+ }
343
+ }
344
+
345
+ fragment PostDetailPost on Post {
346
+ id
347
+ title
348
+ body
349
+ timeCreated
350
+ canReport
351
+ hasReported
352
+ isAnnouncement
353
+ isPinned
354
+ isLocked
355
+ isHidden
356
+ commentCount
357
+ isAnswered
358
+ isAnswerable
359
+ ...PostVoteControlPost
360
+ user {
361
+ id
362
+ timeCreated
363
+ roles {
364
+ id
365
+ name
366
+ key
367
+ tagline
368
+ __typename
369
+ }
370
+ organization {
371
+ id
372
+ name
373
+ __typename
374
+ }
375
+ languages {
376
+ id
377
+ key
378
+ displayName
379
+ tagline
380
+ icon
381
+ __typename
382
+ }
383
+ ...UserPostHeaderUser
384
+ __typename
385
+ }
386
+ repl {
387
+ id
388
+ url
389
+ title
390
+ description
391
+ isPrivate
392
+ isAlwaysOn
393
+ lang {
394
+ id
395
+ icon
396
+ key
397
+ displayName
398
+ tagline
399
+ __typename
400
+ }
401
+ __typename
402
+ }
403
+ board {
404
+ id
405
+ name
406
+ color
407
+ __typename
408
+ }
409
+ __typename
410
+ }
411
+
412
+ fragment PostVoteControlPost on Post {
413
+ id
414
+ voteCount
415
+ canVote
416
+ hasVoted
417
+ __typename
418
+ }
419
+
420
+ fragment UserPostHeaderUser on User {
421
+ id
422
+ image
423
+ isHacker
424
+ isModerator: hasRole(role: MODERATOR)
425
+ isAdmin: hasRole(role: ADMIN)
426
+ ...DepreciatedUserLabelUser
427
+ ...UserLinkUser
428
+ __typename
429
+ }
430
+
431
+ fragment UserLinkUser on User {
432
+ id
433
+ url
434
+ username
435
+ __typename
436
+ }
437
+
438
+ fragment DepreciatedUserLabelUser on User {
439
+ id
440
+ image
441
+ username
442
+ url
443
+ karma
444
+ __typename
445
+ }
446
+
447
+ fragment PostAnsweredCardUser on User {
448
+ id
449
+ username
450
+ ...DepreciatedUserLabelUser
451
+ __typename
452
+ }
453
+
454
+ fragment PostAnsweredCardComment on Comment {
455
+ id
456
+ url
457
+ __typename
458
+ }"
459
+ end
460
+
461
+ def Queries.get_comment
462
+ "query comment ($id: Int!) {
463
+ comment(id: $id) {
464
+ id
465
+ url
466
+ isAnswer
467
+ ...CommentDetailComment
468
+ comments {
469
+ id
470
+ url
471
+ isAnswer
472
+ ...CommentDetailComment
473
+ __typename
474
+ }
475
+ __typename
476
+ }
477
+ }
478
+
479
+ fragment DepreciatedUserLabelUser on User {
480
+ id
481
+ fullName
482
+ username
483
+ image
484
+ bio
485
+ karma
486
+ isHacker
487
+ timeCreated
488
+ roles {
489
+ id
490
+ name
491
+ key
492
+ tagline
493
+ __typename
494
+ }
495
+ organization {
496
+ id
497
+ name
498
+ __typename
499
+ }
500
+ languages {
501
+ id
502
+ key
503
+ displayName
504
+ tagline
505
+ icon
506
+ __typename
507
+ }
508
+ __typename
509
+ }
510
+
511
+ fragment CommentDetailComment on Comment {
512
+ id
513
+ body
514
+ timeCreated
515
+ url
516
+ isAnswer
517
+ ...CommentVoteControlComment
518
+ user {
519
+ id
520
+ username
521
+ ...DepreciatedUserLabelWithImageUser
522
+ __typename
523
+ }
524
+ post {
525
+ id
526
+ __typename
527
+ }
528
+ __typename
529
+ }
530
+
531
+ fragment DepreciatedUserLabelWithImageUser on User {
532
+ id
533
+ image
534
+ ...DepreciatedUserLabelUser
535
+ __typename
536
+ }
537
+
538
+ fragment CommentVoteControlComment on Comment {
539
+ id
540
+ voteCount
541
+ canVote
542
+ hasVoted
543
+ __typename
544
+ }"
8
545
  end
9
546
  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,126 @@ 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, :post_id, :is_answer, :vote_count, :timestamp, :comments, :can_vote, :has_voted
93
+
94
+ def initialize(client, comment)
95
+ @client = client
96
+
97
+ @id = comment["id"]
98
+ @url = comment["url"]
99
+ @author = comment["user"] == nil ? "[deleted user]" : User.new(@client, comment["user"])
100
+ @content = comment["body"]
101
+ @post_id = comment["post"]["id"]
102
+ @is_answer = comment["isAnswer"]
103
+ @vote_count = comment["voteCount"]
104
+ @timestamp = comment["timeCreated"]
105
+ @comments = comment.include?("comments") ? comment["comments"].map { |c| Comment.new(@client, c)} : Array.new
106
+
107
+ @can_vote = comment["canVote"]
108
+ @has_voted = comment["hasVoted"]
109
+ end
110
+
111
+ def get_post
112
+ p = @client.graphql(
113
+ "post",
114
+ Queries.get_post,
115
+ id: @post_id
116
+ )
117
+ Post.new(self, p["post"])
118
+ end
119
+
120
+ def to_s
121
+ @content
122
+ end
123
+ end
124
+
125
+
126
+
127
+ class Post
128
+ 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
129
+
130
+ def initialize(client, post)
131
+ @client = client
132
+
133
+ @id = post["id"]
134
+ @url = post["url"]
135
+ @title = post["title"]
136
+ @content = post["body"]
137
+ @preview = post["preview"]
138
+ @timestamp = post["timeCreated"]
139
+
140
+ @board = Board.new(post["board"])
141
+ @repl = post["repl"] == nil ? nil : Repl.new(post["repl"])
142
+ @author = post["user"] == nil ? "[deleted user]" : User.new(@client, post["user"])
143
+
144
+ @vote_count = post["voteCount"]
145
+ @comment_count = post["commentCount"]
146
+
147
+ @can_vote = post["canVote"]
148
+ @has_voted = post["hasVoted"]
149
+
150
+ @is_answered = post["isAnswered"]
151
+ @is_answerable = post["isAnswerable"]
152
+
153
+ @is_hidden = post["isHidden"]
154
+ @is_pinned = post["isPinned"]
155
+ @is_locked = post["isLocked"]
156
+ @is_announcement = post["isAnnouncement"]
157
+ end
158
+
159
+ def to_s
160
+ @title
161
+ end
162
+ end
163
+
164
+
165
+
35
166
  class User
36
- attr_reader :id, :username, :name, :pfp, :bio, :cycles, :is_hacker, :roles, :languages
167
+ attr_reader :id, :username, :name, :pfp, :bio, :cycles, :is_hacker, :timestamp, :roles, :organization, :languages
168
+
169
+ def initialize(client, user)
170
+ @client = client
37
171
 
38
- def initialize(user)
39
172
  @id = user["id"]
40
173
  @username = user["username"]
41
174
  @name = user["fullName"]
@@ -43,15 +176,43 @@ class User
43
176
  @bio = user["bio"]
44
177
  @cycles = user["karma"]
45
178
  @is_hacker = user["isHacker"]
179
+ @timestamp = user["timeCreated"]
46
180
  @roles = user["roles"].map { |role| Role.new(role) }
181
+ @organization = user["organization"] == nil ? nil : Organization.new(user["organization"])
47
182
  @languages = user["languages"].map { |lang| Language.new(lang) }
48
183
  end
49
184
 
185
+ def get_posts(order: "new", count: nil, after: nil)
186
+ p = @client.graphql(
187
+ "ProfilePosts",
188
+ Queries.get_user_posts,
189
+ username: @username,
190
+ order: order,
191
+ count: count,
192
+ after: after
193
+ )
194
+ p["user"]["posts"]["items"].map { |post| Post.new(@client, post) }
195
+ end
196
+
197
+ def get_comments(order: "new", count: nil, after: nil)
198
+ c = @client.graphql(
199
+ "ProfileComments",
200
+ Queries.get_user_comments,
201
+ username: @username,
202
+ order: order,
203
+ count: count,
204
+ after: after
205
+ )
206
+ c["user"]["comments"]["items"].map { |comment| Comment.new(@client, comment) }
207
+ end
208
+
50
209
  def to_s
51
210
  @username
52
211
  end
53
212
  end
54
213
 
214
+
215
+
55
216
  class Client
56
217
  attr_writer :sid
57
218
 
@@ -59,27 +220,6 @@ class Client
59
220
  @sid = sid
60
221
  end
61
222
 
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
- def get_user_by_id(id)
72
- u = graphql(
73
- "user",
74
- Queries.get_user_by_id,
75
- user_id: id
76
- )
77
- User.new(u["user"])
78
- end
79
-
80
-
81
- private
82
-
83
223
  def graphql(name, query, **variables)
84
224
  payload = {
85
225
  operationName: name,
@@ -106,4 +246,40 @@ class Client
106
246
  data = data["data"] if data.include?("data")
107
247
  data
108
248
  end
249
+
250
+ def get_user(name)
251
+ u = graphql(
252
+ "userByUsername",
253
+ Queries.get_user,
254
+ username: name
255
+ )
256
+ User.new(self, u["user"])
257
+ end
258
+
259
+ def get_user_by_id(id)
260
+ u = graphql(
261
+ "user",
262
+ Queries.get_user_by_id,
263
+ user_id: id
264
+ )
265
+ User.new(self, u["user"])
266
+ end
267
+
268
+ def get_post(id)
269
+ p = graphql(
270
+ "post",
271
+ Queries.get_post,
272
+ id: id
273
+ )
274
+ Post.new(self, p["post"])
275
+ end
276
+
277
+ def get_comment(id)
278
+ c = graphql(
279
+ "comment",
280
+ Queries.get_comment,
281
+ id: id
282
+ )
283
+ Comment.new(self, c["comment"])
284
+ end
109
285
  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.3
4
+ version: 0.3.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: