internet_scrabble_club 0.1.1 → 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 (62) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.ruby-version +1 -1
  4. data/Rakefile +1 -1
  5. data/bin/scraper.rb +12 -0
  6. data/bin/spectator.rb +91 -0
  7. data/internet_scrabble_club.gemspec +3 -4
  8. data/lib/internet_scrabble_club.rb +1 -1
  9. data/lib/internet_scrabble_club/client.rb +34 -30
  10. data/lib/internet_scrabble_club/client/callback_queue.rb +22 -0
  11. data/lib/internet_scrabble_club/client/middleware.rb +7 -4
  12. data/lib/internet_scrabble_club/client/middleware/request/echo_ping.rb +23 -0
  13. data/lib/internet_scrabble_club/client/middleware/request/keep_alive.rb +31 -0
  14. data/lib/internet_scrabble_club/client/middleware/response/emit.rb +20 -0
  15. data/lib/internet_scrabble_club/client/middleware/response/parse.rb +26 -0
  16. data/lib/internet_scrabble_club/client/middleware/response/read.rb +21 -0
  17. data/lib/internet_scrabble_club/client/middleware/response/transform.rb +22 -0
  18. data/lib/internet_scrabble_club/client/response_parsers.rb +17 -0
  19. data/lib/internet_scrabble_club/client/response_parsers/base.rb +78 -0
  20. data/lib/internet_scrabble_club/client/response_parsers/close.rb +14 -0
  21. data/lib/internet_scrabble_club/client/response_parsers/examine.rb +15 -0
  22. data/lib/internet_scrabble_club/client/response_parsers/examine/history.rb +51 -0
  23. data/lib/internet_scrabble_club/client/response_parsers/history.rb +17 -0
  24. data/lib/internet_scrabble_club/client/response_parsers/login.rb +14 -0
  25. data/lib/internet_scrabble_club/client/response_parsers/ping.rb +13 -0
  26. data/lib/internet_scrabble_club/client/response_parsers/ping/reply.rb +12 -0
  27. data/lib/internet_scrabble_club/client/response_parsers/seek.rb +15 -0
  28. data/lib/internet_scrabble_club/client/response_parsers/unseek.rb +14 -0
  29. data/lib/internet_scrabble_club/client/response_parsers/who.rb +13 -0
  30. data/lib/internet_scrabble_club/client/response_parsers/who/list.rb +16 -0
  31. data/lib/internet_scrabble_club/client/response_parsers/who/move.rb +14 -0
  32. data/lib/internet_scrabble_club/client/response_transformers.rb +2 -0
  33. data/lib/internet_scrabble_club/client/response_transformers/base.rb +50 -0
  34. data/lib/internet_scrabble_club/client/response_transformers/examine/history.rb +22 -0
  35. metadata +31 -32
  36. data/lib/internet_scrabble_club/client/extensions/authentication.rb +0 -21
  37. data/lib/internet_scrabble_club/client/extensions/echo_ping.rb +0 -17
  38. data/lib/internet_scrabble_club/client/extensions/keep_alive.rb +0 -16
  39. data/lib/internet_scrabble_club/client/middleware/emit.rb +0 -18
  40. data/lib/internet_scrabble_club/client/middleware/parse.rb +0 -24
  41. data/lib/internet_scrabble_club/client/middleware/read.rb +0 -19
  42. data/lib/internet_scrabble_club/client/middleware/transform.rb +0 -20
  43. data/lib/internet_scrabble_club/message_parsers.rb +0 -17
  44. data/lib/internet_scrabble_club/message_parsers/base.rb +0 -76
  45. data/lib/internet_scrabble_club/message_parsers/close.rb +0 -12
  46. data/lib/internet_scrabble_club/message_parsers/examine.rb +0 -13
  47. data/lib/internet_scrabble_club/message_parsers/examine/history.rb +0 -49
  48. data/lib/internet_scrabble_club/message_parsers/history.rb +0 -15
  49. data/lib/internet_scrabble_club/message_parsers/login.rb +0 -12
  50. data/lib/internet_scrabble_club/message_parsers/ping.rb +0 -11
  51. data/lib/internet_scrabble_club/message_parsers/ping/reply.rb +0 -11
  52. data/lib/internet_scrabble_club/message_parsers/seek.rb +0 -13
  53. data/lib/internet_scrabble_club/message_parsers/unseek.rb +0 -12
  54. data/lib/internet_scrabble_club/message_parsers/who.rb +0 -11
  55. data/lib/internet_scrabble_club/message_parsers/who/list.rb +0 -14
  56. data/lib/internet_scrabble_club/message_parsers/who/move.rb +0 -12
  57. data/lib/internet_scrabble_club/message_transformers.rb +0 -3
  58. data/lib/internet_scrabble_club/message_transformers/base.rb +0 -48
  59. data/lib/internet_scrabble_club/message_transformers/examine/history.rb +0 -32
  60. data/lib/internet_scrabble_club/message_transformers/history.rb +0 -14
  61. data/lib/internet_scrabble_club/message_transformers/who/move.rb +0 -14
  62. data/lib/internet_scrabble_club/multi_queue.rb +0 -20
@@ -0,0 +1,17 @@
1
+ require_relative 'response_parsers/close'
2
+
3
+ require_relative 'response_parsers/examine'
4
+ require_relative 'response_parsers/examine/history'
5
+
6
+ require_relative 'response_parsers/who'
7
+ require_relative 'response_parsers/who/list'
8
+ require_relative 'response_parsers/who/move'
9
+
10
+ require_relative 'response_parsers/history'
11
+ require_relative 'response_parsers/login'
12
+
13
+ require_relative 'response_parsers/ping'
14
+ require_relative 'response_parsers/ping/reply'
15
+
16
+ require_relative 'response_parsers/seek'
17
+ require_relative 'response_parsers/unseek'
@@ -0,0 +1,78 @@
1
+ require 'parslet'
2
+ require 'descendants_tracker'
3
+
4
+ module InternetScrabbleClub
5
+ class Client
6
+ module ResponseParsers
7
+
8
+ class Base < Parslet::Parser
9
+ extend DescendantsTracker
10
+
11
+ root(:response)
12
+
13
+ rule(:response) { descendant_parsers.reduce(:|) or (digit >> space >>
14
+ ( command_with_sub_command_and_arguments |
15
+ command_with_arguments | command_with_sub_command)) }
16
+
17
+ rule(:command_with_arguments) { command.as(:command) >> space >>
18
+ arguments.as(:arguments) }
19
+
20
+ rule(:command_with_sub_command_and_arguments) { command_with_sub_command >>
21
+ space >> arguments.as(:arguments) }
22
+
23
+ rule(:command_with_sub_command) { command.as(:command) >>
24
+ space >> sub_command.as(:sub_command) }
25
+
26
+ rule(:command) { nothing }
27
+ rule(:sub_command) { nothing }
28
+ rule(:arguments) { nothing }
29
+
30
+ rule(:nothing) { str('') }
31
+
32
+ rule(:space) { str(' ') }
33
+ rule(:space?) { space.maybe }
34
+
35
+ rule(:newline) { match('\n') }
36
+ rule(:newline?) { newline.maybe }
37
+
38
+ rule(:colon) { str(':') }
39
+ rule(:semicolon) { str(';') }
40
+ rule(:minus) { str('-') }
41
+
42
+ rule(:digit) { match['0-9'] }
43
+ rule(:alpha) { match['A-Za-z'] }
44
+
45
+ rule(:int) { _int.as(:int) }
46
+ rule(:_int) { minus.maybe >> digit.repeat(1) }
47
+
48
+ rule(:dashes) { str('---').as(:dashes) }
49
+ rule(:null) { str('null').as(:null) }
50
+
51
+ rule(:word) { (digit | alpha).repeat(1).as(:word) }
52
+ rule(:sentence) { (match['^.'].repeat(1) >> str('.')).as(:sentence) }
53
+ rule(:text) { any.repeat(1).as(:text) }
54
+
55
+ rule(:tiles) { (alpha | str('?')).repeat(1).as(:tiles) }
56
+ rule(:rack) { dashes | tiles }
57
+
58
+ rule(:month_day) { digit.repeat(1, 2) }
59
+ rule(:short_month) { match['A-Z'] >> match['a-z'].repeat(2, 2) }
60
+ rule(:short_year) { digit >> digit }
61
+ rule(:date) { (delimited [month_day, short_month, short_year], colon).as(:date) }
62
+
63
+ rule(:dictionary) { str('TWL') | str('SOWPODS') | str('ODS') | str('LOC') |
64
+ str('SWL') | str('PARO') | str('MULTI') }
65
+
66
+ def delimited(sequence, seperator = space)
67
+ seperators = Array.new(sequence.length - 1) { seperator }
68
+ sequence.zip(seperators).flatten(1).compact.inject(:>>)
69
+ end
70
+
71
+ private def descendant_parsers
72
+ @descendant_parsers ||= self.class.descendants.map(&:new)
73
+ end
74
+ end
75
+
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,14 @@
1
+ require_relative 'base'
2
+
3
+ module InternetScrabbleClub
4
+ class Client
5
+ module ResponseParsers
6
+
7
+ class Close < Base
8
+ rule(:command) { str('CLOSE') }
9
+ rule(:arguments) { text.as(:reason) }
10
+ end
11
+
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ require_relative 'base'
2
+
3
+ module InternetScrabbleClub
4
+ class Client
5
+ module ResponseParsers
6
+
7
+ class Examine < Base
8
+ rule(:command) { str('EXAMINE') }
9
+ rule(:command_with_sub_command_and_arguments) { command_with_sub_command >>
10
+ space? >> newline >> arguments.as(:arguments) }
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,51 @@
1
+ require_relative '../examine'
2
+
3
+ module InternetScrabbleClub
4
+ class Client
5
+ module ResponseParsers
6
+
7
+ class Examine::History < Examine
8
+ rule(:sub_command) { str('HISTORY') }
9
+
10
+ rule(:arguments) { delimited([stats, settings,
11
+ (player_info.as(:info) >> newline_with_whitespace >> plays.as(:plays)
12
+ ).as(:first_player), str('STOP'),
13
+ (player_info.as(:info) >> newline_with_whitespace >> plays.as(:plays)
14
+ ).as(:second_player), str('STOP')
15
+ ], newline_with_whitespace) >> newline_with_whitespace }
16
+
17
+ rule(:newline_with_whitespace) { space.repeat >> newline >> space.repeat }
18
+
19
+ rule(:stats) { _int >> space >> date.as(:date) }
20
+ rule(:settings) { delimited [int.as(:dictionary_code), _int, _int, _int] }
21
+
22
+ rule(:player_info) { delimited [word.as(:nickname), int.as(:rating),
23
+ rack.as(:initial_rack), (int | null).as(:final_score)] }
24
+
25
+ rule(:plays) { ((move | change | pass) >> space?).repeat }
26
+
27
+ rule(:move) { delimited [str('MOVE').as(:word).as(:type), position.as(:position),
28
+ tiles.as(:word), int.as(:score), _int, _int, rack.as(:rack), _int] }
29
+
30
+ rule(:change) { delimited [str('CHANGE').as(:word).as(:type), rack.as(:rack),
31
+ _int, _int, (dashes | int).as(:swap_count)] }
32
+
33
+ rule(:pass) { delimited [str('PAS').as(:word).as(:type), _int, _int, (dashes |
34
+ suggestion).as(:suggestion)] }
35
+
36
+ rule(:suggestion) { delimited [position.as(:position), word.as(:word),
37
+ int.as(:score)], underscore }
38
+
39
+ rule(:underscore) { match('_') }
40
+ rule(:underscored_word) { word >> underscore >> word }
41
+
42
+ rule(:position) { horizontal_position.as(:horizontal) |
43
+ vertical_position.as(:vertical) }
44
+
45
+ rule(:horizontal_position) { alpha.as(:word).as(:column) >> int.as(:row) }
46
+ rule(:vertical_position) { int.as(:row) >> alpha.as(:word).as(:column) }
47
+ end
48
+
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,17 @@
1
+ require_relative 'base'
2
+
3
+ module InternetScrabbleClub
4
+ class Client
5
+ module ResponseParsers
6
+
7
+ class History < Base
8
+ rule(:command) { str('HISTORY') }
9
+ rule(:arguments) { word.as(:subject) >> space >> entries.as(:entries) }
10
+ rule(:entries) { (entry.as(:entry) >> space?).repeat(1) }
11
+ rule(:entry) { delimited [digit.as(:index), players, dictionary, _int, date.as(:date)] }
12
+ rule(:players) { delimited [_int, word.as(:first_player), _int, word.as(:second_player)] }
13
+ end
14
+
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,14 @@
1
+ require_relative 'base'
2
+
3
+ module InternetScrabbleClub
4
+ class Client
5
+ module ResponseParsers
6
+
7
+ class Login < Base
8
+ rule(:command) { str('LOGIN') }
9
+ rule(:arguments) { sentence.as(:greeting) }
10
+ end
11
+
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ require_relative 'base'
2
+
3
+ module InternetScrabbleClub
4
+ class Client
5
+ module ResponseParsers
6
+
7
+ class Ping < Base
8
+ rule(:command) { str('PING') }
9
+ end
10
+
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ require_relative '../ping'
2
+
3
+ module InternetScrabbleClub
4
+ class Client
5
+ module ResponseParsers
6
+
7
+ class Ping::Reply < Ping
8
+ rule(:sub_command) { str('REPLY') }
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ require_relative 'base'
2
+
3
+ module InternetScrabbleClub
4
+ class Client
5
+ module ResponseParsers
6
+
7
+ class Seek < Base
8
+ rule(:command) { str('SEEK') }
9
+ rule(:arguments) { delimited [int.as(:rating), word.as(:nickname), settings] }
10
+ rule(:settings) { delimited([_int] * 7) }
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ require_relative 'base'
2
+
3
+ module InternetScrabbleClub
4
+ class Client
5
+ module ResponseParsers
6
+
7
+ class Unseek < Base
8
+ rule(:command) { str('UNSEEK') }
9
+ rule(:arguments) { word.as(:nickname) }
10
+ end
11
+
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ require_relative 'base'
2
+
3
+ module InternetScrabbleClub
4
+ class Client
5
+ module ResponseParsers
6
+
7
+ class Who < Base
8
+ rule(:command) { str('WHO') }
9
+ end
10
+
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,16 @@
1
+ require_relative '../who'
2
+
3
+ module InternetScrabbleClub
4
+ class Client
5
+ module ResponseParsers
6
+
7
+ class Who::List < Who
8
+ rule(:sub_command) { str('LIST') }
9
+ rule(:arguments) { int.as(:count) >> space >> space >> users.as(:users) }
10
+ rule(:users) { (user.as(:user) >> space?).repeat(1) }
11
+ rule(:user) { delimited [int.as(:rating), word.as(:nickname), any.as(:status), digit, digit] }
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,14 @@
1
+ require_relative '../who'
2
+
3
+ module InternetScrabbleClub
4
+ class Client
5
+ module ResponseParsers
6
+
7
+ class Who::Move< Who
8
+ rule(:sub_command) { str('MOVE') }
9
+ rule(:arguments) { delimited [_int, word.as(:nickname), alpha, _int, _int] }
10
+ end
11
+
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,2 @@
1
+ require_relative 'response_transformers/base'
2
+ require_relative 'response_transformers/examine/history'
@@ -0,0 +1,50 @@
1
+ require 'date'
2
+ require 'parslet'
3
+ require 'descendants_tracker'
4
+
5
+ module InternetScrabbleClub
6
+ class Client
7
+ class ResponseTransformers
8
+
9
+ class Base < Parslet::Transform
10
+ extend DescendantsTracker
11
+
12
+ rule(command: simple(:cmd), arguments: subtree(:args)) do
13
+ args.merge(command: cmd.to_s)
14
+ end
15
+
16
+ rule(command: simple(:cmd), sub_command: simple(:sub_cmd)) do
17
+ { command: cmd.to_s, sub_command: sub_cmd.to_s }
18
+ end
19
+
20
+ rule(command: simple(:cmd), sub_command: simple(:sub_cmd), arguments: subtree(:args)) do
21
+ args.merge(command: cmd.to_s, sub_command: sub_cmd.to_s)
22
+ end
23
+
24
+ rule(int: simple(:int)) { Integer(int) }
25
+
26
+ rule(word: simple(:word)) { word.to_s }
27
+ rule(sentence: simple(:sentence)) { sentence.to_s }
28
+ rule(text: simple(:text)) { text.to_s }
29
+
30
+ rule(date: simple(:date)) { Date.parse(date.to_s) }
31
+
32
+ rule(null: simple(:null)) { 0 }
33
+ rule(tiles: simple(:tiles)) { tiles.to_s }
34
+
35
+ rule(dashes: simple(:dashes)) { nil }
36
+
37
+ def apply(tree, context = nil)
38
+ descendent_transformers.reduce(super) do |tree, transformer|
39
+ transformer.apply(tree, context)
40
+ end
41
+ end
42
+
43
+ def descendent_transformers
44
+ @descendent_transformers ||= self.class.descendants.map(&:new)
45
+ end
46
+ end
47
+
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,22 @@
1
+ require 'ostruct'
2
+ require_relative '../base'
3
+
4
+ module InternetScrabbleClub
5
+ class Client
6
+ class ResponseTransformers
7
+ module Examine
8
+
9
+ class History < Base
10
+ rule(horizontal: { column: simple(:column), row: simple(:row) }) do
11
+ {direction: :horizontal, column: column, row: row}
12
+ end
13
+
14
+ rule(vertical: { column: simple(:column), row: simple(:row) }) do
15
+ {direction: :vertical, column: column, row: row}
16
+ end
17
+ end
18
+
19
+ end
20
+ end
21
+ end
22
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: internet_scrabble_club
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Brus
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2014-08-29 00:00:00 Z
12
+ date: 2014-11-25 00:00:00 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -94,8 +94,9 @@ dependencies:
94
94
  description: "Interact with the Internet Scrabble Club server. "
95
95
  email:
96
96
  - thomas.brus@me.com
97
- executables: []
98
-
97
+ executables:
98
+ - scraper.rb
99
+ - spectator.rb
99
100
  extensions: []
100
101
 
101
102
  extra_rdoc_files: []
@@ -107,37 +108,36 @@ files:
107
108
  - LICENSE.txt
108
109
  - README.md
109
110
  - Rakefile
111
+ - bin/scraper.rb
112
+ - bin/spectator.rb
110
113
  - internet_scrabble_club.gemspec
111
114
  - lib/internet_scrabble_club.rb
112
115
  - lib/internet_scrabble_club/client.rb
113
- - lib/internet_scrabble_club/client/extensions/authentication.rb
114
- - lib/internet_scrabble_club/client/extensions/echo_ping.rb
115
- - lib/internet_scrabble_club/client/extensions/keep_alive.rb
116
+ - lib/internet_scrabble_club/client/callback_queue.rb
116
117
  - lib/internet_scrabble_club/client/middleware.rb
117
- - lib/internet_scrabble_club/client/middleware/emit.rb
118
- - lib/internet_scrabble_club/client/middleware/parse.rb
119
- - lib/internet_scrabble_club/client/middleware/read.rb
120
- - lib/internet_scrabble_club/client/middleware/transform.rb
121
- - lib/internet_scrabble_club/message_parsers.rb
122
- - lib/internet_scrabble_club/message_parsers/base.rb
123
- - lib/internet_scrabble_club/message_parsers/close.rb
124
- - lib/internet_scrabble_club/message_parsers/examine.rb
125
- - lib/internet_scrabble_club/message_parsers/examine/history.rb
126
- - lib/internet_scrabble_club/message_parsers/history.rb
127
- - lib/internet_scrabble_club/message_parsers/login.rb
128
- - lib/internet_scrabble_club/message_parsers/ping.rb
129
- - lib/internet_scrabble_club/message_parsers/ping/reply.rb
130
- - lib/internet_scrabble_club/message_parsers/seek.rb
131
- - lib/internet_scrabble_club/message_parsers/unseek.rb
132
- - lib/internet_scrabble_club/message_parsers/who.rb
133
- - lib/internet_scrabble_club/message_parsers/who/list.rb
134
- - lib/internet_scrabble_club/message_parsers/who/move.rb
135
- - lib/internet_scrabble_club/message_transformers.rb
136
- - lib/internet_scrabble_club/message_transformers/base.rb
137
- - lib/internet_scrabble_club/message_transformers/examine/history.rb
138
- - lib/internet_scrabble_club/message_transformers/history.rb
139
- - lib/internet_scrabble_club/message_transformers/who/move.rb
140
- - lib/internet_scrabble_club/multi_queue.rb
118
+ - lib/internet_scrabble_club/client/middleware/request/echo_ping.rb
119
+ - lib/internet_scrabble_club/client/middleware/request/keep_alive.rb
120
+ - lib/internet_scrabble_club/client/middleware/response/emit.rb
121
+ - lib/internet_scrabble_club/client/middleware/response/parse.rb
122
+ - lib/internet_scrabble_club/client/middleware/response/read.rb
123
+ - lib/internet_scrabble_club/client/middleware/response/transform.rb
124
+ - lib/internet_scrabble_club/client/response_parsers.rb
125
+ - lib/internet_scrabble_club/client/response_parsers/base.rb
126
+ - lib/internet_scrabble_club/client/response_parsers/close.rb
127
+ - lib/internet_scrabble_club/client/response_parsers/examine.rb
128
+ - lib/internet_scrabble_club/client/response_parsers/examine/history.rb
129
+ - lib/internet_scrabble_club/client/response_parsers/history.rb
130
+ - lib/internet_scrabble_club/client/response_parsers/login.rb
131
+ - lib/internet_scrabble_club/client/response_parsers/ping.rb
132
+ - lib/internet_scrabble_club/client/response_parsers/ping/reply.rb
133
+ - lib/internet_scrabble_club/client/response_parsers/seek.rb
134
+ - lib/internet_scrabble_club/client/response_parsers/unseek.rb
135
+ - lib/internet_scrabble_club/client/response_parsers/who.rb
136
+ - lib/internet_scrabble_club/client/response_parsers/who/list.rb
137
+ - lib/internet_scrabble_club/client/response_parsers/who/move.rb
138
+ - lib/internet_scrabble_club/client/response_transformers.rb
139
+ - lib/internet_scrabble_club/client/response_transformers/base.rb
140
+ - lib/internet_scrabble_club/client/response_transformers/examine/history.rb
141
141
  homepage: https://github.com/thomasbrus/internet-scrabble-club
142
142
  licenses:
143
143
  - MIT
@@ -166,4 +166,3 @@ specification_version: 4
166
166
  summary: Fetches scrabble games from the Internet Scrabble Club.
167
167
  test_files: []
168
168
 
169
- has_rdoc: