ssc.bot 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.
@@ -0,0 +1,21 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ #--
5
+ # This file is part of SSC.Bot.
6
+ # Copyright (c) 2020-2021 Jonathan Bradley Whited
7
+ #
8
+ # SPDX-License-Identifier: LGPL-3.0-or-later
9
+ #++
10
+
11
+
12
+ require 'ssc.bot/user/message_sender'
13
+
14
+ module SSCBot
15
+ ###
16
+ # @author Jonathan Bradley Whited
17
+ # @since 0.1.2
18
+ ###
19
+ module User
20
+ end
21
+ end
@@ -1,30 +1,18 @@
1
- #!/usr/bin/env ruby
2
1
  # encoding: UTF-8
3
2
  # frozen_string_literal: true
4
3
 
5
4
  #--
6
5
  # This file is part of SSC.Bot.
7
- # Copyright (c) 2020 Jonathan Bradley Whited (@esotericpig)
8
- #
9
- # SSC.Bot is free software: you can redistribute it and/or modify
10
- # it under the terms of the GNU Lesser General Public License as published by
11
- # the Free Software Foundation, either version 3 of the License, or
12
- # (at your option) any later version.
13
- #
14
- # SSC.Bot is distributed in the hope that it will be useful,
15
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- # GNU Lesser General Public License for more details.
18
- #
19
- # You should have received a copy of the GNU Lesser General Public License
20
- # along with SSC.Bot. If not, see <https://www.gnu.org/licenses/>.
6
+ # Copyright (c) 2020-2021 Jonathan Bradley Whited
7
+ #
8
+ # SPDX-License-Identifier: LGPL-3.0-or-later
21
9
  #++
22
10
 
23
11
 
24
12
  begin
25
13
  require 'java'
26
14
  rescue LoadError => e
27
- raise e.exception('Must use JRuby for JRobotMessageSender')
15
+ raise e.exception('Must use JRuby for SSCBot::User::JRobotMessageSender')
28
16
  end
29
17
 
30
18
  require 'attr_bool'
@@ -42,11 +30,10 @@ java_import 'java.awt.datatransfer.StringSelection'
42
30
 
43
31
  java_import 'java.awt.event.KeyEvent'
44
32
 
45
-
46
33
  module SSCBot
47
34
  module User
48
35
  ###
49
- # @author Jonathan Bradley Whited (@esotericpig)
36
+ # @author Jonathan Bradley Whited
50
37
  # @since 0.1.0
51
38
  ###
52
39
  class JRobotMessageSender < MessageSender
@@ -60,21 +47,22 @@ module User
60
47
  attr_accessor? :warn_user
61
48
  attr_accessor :warn_user_key
62
49
  attr_accessor :warn_user_sleep
63
-
64
- def initialize(auto_delay: 110,msg_key: nil,os: Util::OS,warn_user: false,warn_user_key: KeyEvent::VK_BACK_SPACE,warn_user_sleep: 0.747,**kargs)
50
+
51
+ def initialize(auto_delay: 110,msg_key: nil,os: Util::OS,warn_user: false,
52
+ warn_user_key: KeyEvent::VK_BACK_SPACE,warn_user_sleep: 0.747,**kargs)
65
53
  super(**kargs)
66
-
67
- @clipboard = Toolkit.getDefaultToolkit().getSystemClipboard()
54
+
55
+ @clipboard = Toolkit.getDefaultToolkit.getSystemClipboard
68
56
  @msg_key = msg_key
69
57
  @os = os
70
- @robot = Robot.new()
58
+ @robot = Robot.new
71
59
  @warn_user = warn_user
72
60
  @warn_user_key = warn_user_key
73
61
  @warn_user_sleep = warn_user_sleep
74
-
62
+
75
63
  @robot.setAutoDelay(auto_delay)
76
-
77
- @shortcut_paste = ->(ms) do
64
+
65
+ @shortcut_paste = lambda do |ms|
78
66
  if ms.os == :macos
79
67
  @shortcut_paste_macos.call(ms)
80
68
  else
@@ -84,87 +72,88 @@ module User
84
72
  @shortcut_paste_default = ->(ms) { ms.roll_keys(KeyEvent::VK_CONTROL,KeyEvent::VK_V) }
85
73
  @shortcut_paste_macos = ->(ms) { ms.roll_keys(KeyEvent::VK_META,KeyEvent::VK_V) }
86
74
  end
87
-
88
- def backspace()
75
+
76
+ def backspace
89
77
  return type_key(KeyEvent::VK_BACK_SPACE)
90
78
  end
91
-
79
+
92
80
  def copy(str)
93
81
  @clipboard.setContents(StringSelection.new(str),nil)
94
-
82
+
95
83
  return self
96
84
  end
97
-
98
- def enter()
85
+
86
+ def enter
99
87
  return type_key(KeyEvent::VK_ENTER)
100
88
  end
101
-
89
+
102
90
  def paste(str=nil)
103
- copy(str) unless str.nil?()
104
-
91
+ copy(str) unless str.nil?
92
+
105
93
  @shortcut_paste.call(self)
106
-
94
+
107
95
  return self
108
96
  end
109
-
97
+
110
98
  def press_key(*key_codes)
111
- key_codes.each() do |key_code|
99
+ key_codes.each do |key_code|
112
100
  @robot.keyPress(key_code)
113
101
  end
114
-
102
+
115
103
  return self
116
104
  end
117
-
105
+
118
106
  def put(message)
119
107
  # If do type_msg_key() and then warn_user(), then a backspace from
120
108
  # warn_user() will cancel out the msg key.
121
109
  # Could do type_msg_key().warn_user().type_msg_key(), but then if the
122
110
  # client is in windowed mode and msg key is a tab, then a backspace
123
111
  # from warn_user() will do nothing.
124
- return warn_user().
125
- type_msg_key().
112
+ return warn_user.
113
+ type_msg_key.
126
114
  paste(message)
127
115
  end
128
-
116
+
129
117
  def release_key(*key_codes)
130
- key_codes.each() do |key_code|
118
+ key_codes.each do |key_code|
131
119
  @robot.keyRelease(key_code)
132
120
  end
133
-
121
+
134
122
  return self
135
123
  end
136
-
124
+
137
125
  def roll_keys(*key_codes)
138
- key_codes.each() do |key_code|
126
+ key_codes.each do |key_code|
139
127
  @robot.keyPress(key_code)
140
128
  end
141
-
129
+
142
130
  (key_codes.length - 1).downto(0) do |i|
143
131
  @robot.keyRelease(key_codes[i])
144
132
  end
145
-
133
+
146
134
  return self
147
135
  end
148
-
149
- def send_message()
150
- enter()
136
+
137
+ def send_message
138
+ enter
151
139
  end
152
-
140
+
141
+ # TODO: implement type(message)
153
142
  def type(message)
154
143
  # TODO: implement type(message)
155
144
  super(message)
156
145
  end
157
-
146
+
158
147
  def type_key(*key_codes)
159
- key_codes.each() do |key_code|
148
+ key_codes.each do |key_code|
160
149
  @robot.keyPress(key_code)
161
150
  @robot.keyRelease(key_code)
162
151
  end
163
-
152
+
164
153
  return self
165
154
  end
166
-
167
- def type_msg_key()
155
+
156
+ def type_msg_key
168
157
  if @msg_key
169
158
  if @msg_key.respond_to?(:call)
170
159
  @msg_key.call(self)
@@ -172,11 +161,11 @@ module User
172
161
  type_key(@msg_key)
173
162
  end
174
163
  end
175
-
164
+
176
165
  return self
177
166
  end
178
-
179
- def warn_user()
167
+
168
+ def warn_user
180
169
  if @warn_user
181
170
  if @warn_user_key.respond_to?(:call)
182
171
  @warn_user_key.call(self)
@@ -186,7 +175,7 @@ module User
186
175
  release_key(@warn_user_key)
187
176
  end
188
177
  end
189
-
178
+
190
179
  return self
191
180
  end
192
181
  end
@@ -1,23 +1,11 @@
1
- #!/usr/bin/env ruby
2
1
  # encoding: UTF-8
3
2
  # frozen_string_literal: true
4
3
 
5
4
  #--
6
5
  # This file is part of SSC.Bot.
7
- # Copyright (c) 2020 Jonathan Bradley Whited (@esotericpig)
8
- #
9
- # SSC.Bot is free software: you can redistribute it and/or modify
10
- # it under the terms of the GNU Lesser General Public License as published by
11
- # the Free Software Foundation, either version 3 of the License, or
12
- # (at your option) any later version.
13
- #
14
- # SSC.Bot is distributed in the hope that it will be useful,
15
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- # GNU Lesser General Public License for more details.
18
- #
19
- # You should have received a copy of the GNU Lesser General Public License
20
- # along with SSC.Bot. If not, see <https://www.gnu.org/licenses/>.
6
+ # Copyright (c) 2020-2021 Jonathan Bradley Whited
7
+ #
8
+ # SPDX-License-Identifier: LGPL-3.0-or-later
21
9
  #++
22
10
 
23
11
 
@@ -27,19 +15,20 @@ require 'time'
27
15
  require 'ssc.bot/error'
28
16
  require 'ssc.bot/util'
29
17
 
30
-
31
18
  module SSCBot
32
19
  module User
33
20
  ###
34
- # @author Jonathan Bradley Whited (@esotericpig)
21
+ # @author Jonathan Bradley Whited
35
22
  # @since 0.1.0
36
23
  ###
37
24
  class MessageSender
25
+ extend AttrBool::Ext
26
+
38
27
  DEFAULT_ESCAPE_STR = '.'
39
28
  DEFAULT_FLOOD_COUNT = 8
40
29
  DEFAULT_FLOOD_MIN_SLEEP = 0.001
41
30
  DEFAULT_FLOOD_SECS = 6
42
-
31
+
43
32
  # Message Macros
44
33
  # - In order of F1 Help box.
45
34
  MM_TICKNAME = '%tickname'
@@ -57,7 +46,17 @@ module User
57
46
  MM_REDNAME = '%redname'
58
47
  MM_REDBOUNTY = '%redbounty'
59
48
  MM_REDFLAGS = '%redflags'
60
-
49
+
50
+ constants.each do |constant|
51
+ name = constant.to_s
52
+
53
+ next unless name.start_with?('MM_')
54
+
55
+ define_method(name.downcase.to_sym) do
56
+ return self.class.const_get(constant)
57
+ end
58
+ end
59
+
61
60
  attr_accessor? :escape_percent
62
61
  attr_accessor? :escape_space
63
62
  attr_accessor :escape_str
@@ -67,22 +66,24 @@ module User
67
66
  attr_reader :message_count
68
67
  attr_reader :message_time
69
68
  attr_accessor? :staff
70
-
69
+
71
70
  def put(message)
72
- raise AbstractMethodError
71
+ raise AbstractMethodError,__method__
73
72
  end
74
-
75
- def send_message()
76
- raise AbstractMethodError
73
+
74
+ def send_message
75
+ raise AbstractMethodError,__method__
77
76
  end
78
-
77
+
79
78
  def type(message)
80
- raise AbstractMethodError
79
+ raise AbstractMethodError,__method__
81
80
  end
82
-
83
- def initialize(escape_percent: false,escape_space: true,escape_str: DEFAULT_ESCAPE_STR,flood_count: DEFAULT_FLOOD_COUNT,flood_min_sleep: DEFAULT_FLOOD_MIN_SLEEP,flood_secs: DEFAULT_FLOOD_SECS,staff: false)
81
+
82
+ def initialize(escape_percent: false,escape_space: true,escape_str: DEFAULT_ESCAPE_STR,
83
+ flood_count: DEFAULT_FLOOD_COUNT,flood_min_sleep: DEFAULT_FLOOD_MIN_SLEEP,
84
+ flood_secs: DEFAULT_FLOOD_SECS,staff: false)
84
85
  super()
85
-
86
+
86
87
  @escape_percent = escape_percent
87
88
  @escape_space = escape_space
88
89
  @escape_str = escape_str
@@ -90,17 +91,18 @@ module User
90
91
  @flood_min_sleep = flood_min_sleep
91
92
  @flood_secs = flood_secs
92
93
  @message_count = 0
93
- @message_time = Time.now()
94
+ @message_time = Time.now
94
95
  @staff = staff
95
96
  end
96
-
97
- def escape_pub(message,escape_percent: @escape_percent,escape_space: @escape_space,escape_str: @escape_str,staff: @staff)
97
+
98
+ def escape_pub(message,escape_percent: @escape_percent,escape_space: @escape_space,
99
+ escape_str: @escape_str,staff: @staff)
98
100
  if escape_percent
99
101
  message = message.gsub('%','%%')
100
102
  end
101
-
103
+
102
104
  escape = false
103
-
105
+
104
106
  case message[0]
105
107
  when '#'
106
108
  escape = true
@@ -109,13 +111,13 @@ module User
109
111
  escape = true
110
112
  else
111
113
  stripped_message = Util.u_lstrip(message)
112
-
114
+
113
115
  case stripped_message[0]
114
116
  when ':'
115
117
  if stripped_message.index(':',1)
116
118
  escape = true
117
119
  end
118
- when '/',%q{'},'"',';','='
120
+ when '/',"'",'"',';','='
119
121
  escape = true
120
122
  when '?'
121
123
  if stripped_message[1] =~ /[[:alpha:]]/
@@ -126,253 +128,193 @@ module User
126
128
  end
127
129
  end
128
130
  end
129
-
131
+
130
132
  if escape
131
133
  message = "#{escape_str}#{message}"
132
134
  end
133
-
135
+
134
136
  return message
135
137
  end
136
-
137
- def prevent_flood()
138
+
139
+ def prevent_flood
138
140
  @message_count += 1
139
-
141
+
140
142
  if @message_count >= @flood_count
141
- diff_time = Time.now() - @message_time
142
-
143
+ diff_time = Time.now - @message_time
144
+
143
145
  if diff_time <= @flood_secs
144
146
  sleep_secs = (@flood_secs - diff_time).round(4) + 0.001
145
147
  sleep_secs = @flood_min_sleep if sleep_secs < @flood_min_sleep
146
148
  else
147
149
  sleep_secs = @flood_min_sleep
148
150
  end
149
-
151
+
150
152
  sleep(sleep_secs)
151
-
153
+
152
154
  @message_count = 0
153
155
  end
154
-
155
- @message_time = Time.now()
156
+
157
+ @message_time = Time.now
156
158
  end
157
-
159
+
158
160
  def put_or_type(message)
159
161
  put(message)
160
162
  end
161
-
163
+
162
164
  def send(message)
163
165
  put(message)
164
- send_message()
166
+ send_message
165
167
  end
166
-
168
+
167
169
  def send_or_types(message)
168
170
  send(message)
169
171
  end
170
-
172
+
171
173
  def send_or_types_safe(message)
172
174
  send_or_types(message)
173
- prevent_flood()
175
+ prevent_flood
174
176
  end
175
-
177
+
176
178
  def send_safe(message)
177
179
  send(message)
178
- prevent_flood()
180
+ prevent_flood
179
181
  end
180
-
182
+
181
183
  def types(message)
182
184
  type(message)
183
- send_message()
185
+ send_message
184
186
  end
185
-
187
+
186
188
  def types_safe(message)
187
189
  types(message)
188
- prevent_flood()
190
+ prevent_flood
189
191
  end
190
-
192
+
191
193
  def send_chat(message)
192
194
  send_safe(";#{message}")
193
195
  end
194
-
196
+
195
197
  def send_chat_to(channel,message)
196
198
  send_safe(";#{channel};#{message}")
197
199
  end
198
-
200
+
199
201
  def send_freq(message)
200
- send_safe(%Q{"#{message}})
202
+ send_safe(%Q("#{message}))
201
203
  end
202
-
204
+
203
205
  def send_freq_eq(freq)
204
206
  send_safe("=#{freq}")
205
207
  end
206
-
208
+
207
209
  def send_private(message)
208
210
  send_safe("/#{message}")
209
211
  end
210
-
212
+
211
213
  def send_private_to(name,message)
212
214
  send_safe(":#{name}:#{message}")
213
215
  end
214
-
216
+
215
217
  def send_private_to_last(message,last=1)
216
218
  put_or_type('::')
217
-
219
+
218
220
  while (last -= 1) > 0
219
221
  put_or_type(':')
220
222
  end
221
-
223
+
222
224
  send_safe(message)
223
225
  end
224
-
226
+
225
227
  def send_pub(message,**kargs)
226
228
  send_safe(escape_pub(message,**kargs))
227
229
  end
228
-
229
- def send_q_chat()
230
+
231
+ def send_q_chat
230
232
  send_safe('?chat')
231
233
  end
232
-
234
+
233
235
  def send_q_chat_eq(*names)
234
236
  send_safe("?chat=#{names.join(',')}")
235
237
  end
236
-
237
- def send_q_enter()
238
+
239
+ def send_q_enter
238
240
  send_safe('?enter')
239
241
  end
240
-
242
+
241
243
  def send_q_find(player)
242
244
  send_safe("?find #{player}")
243
245
  end
244
-
245
- def send_q_kill()
246
+
247
+ def send_q_kill
246
248
  send_safe('?kill')
247
249
  end
248
-
249
- def send_q_leave()
250
+
251
+ def send_q_leave
250
252
  send_safe('?leave')
251
253
  end
252
-
254
+
253
255
  def send_q_loadmacro(filename)
254
256
  send_safe("?loadmacro #{filename}")
255
257
  end
256
-
257
- def send_q_log()
258
+
259
+ def send_q_log
258
260
  send_safe('?log')
259
261
  end
260
-
262
+
261
263
  def send_q_log_to(filename)
262
264
  send_safe("?log #{filename}")
263
265
  end
264
-
265
- def send_q_logbuffer()
266
+
267
+ def send_q_logbuffer
266
268
  send_safe('?logbuffer')
267
269
  end
268
-
270
+
269
271
  def send_q_logbuffer_to(filename)
270
272
  send_safe("?logbuffer #{filename}")
271
273
  end
272
-
273
- def send_q_namelen()
274
+
275
+ def send_q_namelen
274
276
  send_safe('?namelen')
275
277
  end
276
-
278
+
277
279
  def send_q_namelen_eq(namelen)
278
280
  send_safe("?namelen=#{namelen}")
279
281
  end
280
-
281
- def send_q_lines()
282
+
283
+ def send_q_lines
282
284
  send_safe('?lines')
283
285
  end
284
-
286
+
285
287
  def send_q_lines_eq(lines)
286
288
  send_safe("?lines=#{lines}")
287
289
  end
288
-
290
+
289
291
  def send_q_savemacro(filename)
290
292
  send_safe("?savemacro #{filename}")
291
293
  end
292
-
293
- def send_q_spec()
294
+
295
+ def send_q_spec
294
296
  send_safe('?spec')
295
297
  end
296
-
297
- def send_q_team()
298
+
299
+ def send_q_team
298
300
  send_safe('?team')
299
301
  end
300
-
302
+
301
303
  def send_squad(message)
302
304
  send_safe("##{message}")
303
305
  end
304
-
306
+
305
307
  def send_squad_to(squad,message)
306
308
  send_safe(":##{squad}:#{message}")
307
309
  end
308
-
310
+
309
311
  def send_team(message)
310
312
  send_safe("//#{message}")
311
313
  end
312
-
314
+
313
315
  def send_team2(message)
314
316
  send_safe("'#{message}")
315
317
  end
316
-
317
- def mm_tickname()
318
- return MM_TICKNAME
319
- end
320
-
321
- def mm_selfname()
322
- return MM_SELFNAME
323
- end
324
-
325
- def mm_squad()
326
- return MM_SQUAD
327
- end
328
-
329
- def mm_freq()
330
- return MM_FREQ
331
- end
332
-
333
- def mm_bounty()
334
- return MM_BOUNTY
335
- end
336
-
337
- def mm_flags()
338
- return MM_FLAGS
339
- end
340
-
341
- def mm_energy()
342
- return MM_ENERGY
343
- end
344
-
345
- def mm_killer()
346
- return MM_KILLER
347
- end
348
-
349
- def mm_killed()
350
- return MM_KILLED
351
- end
352
-
353
- def mm_coord()
354
- return MM_COORD
355
- end
356
-
357
- def mm_area()
358
- return MM_AREA
359
- end
360
-
361
- def mm_red()
362
- return MM_RED
363
- end
364
-
365
- def mm_redname()
366
- return MM_REDNAME
367
- end
368
-
369
- def mm_redbounty()
370
- return MM_REDBOUNTY
371
- end
372
-
373
- def mm_redflags()
374
- return MM_REDFLAGS
375
- end
376
318
  end
377
319
  end
378
320
  end