ssc.bot 0.1.1 → 0.2.0

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