internet_scrabble_club 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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: