repltalk 0.0.2 → 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.
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: