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.
- checksums.yaml +4 -4
- data/.yardopts +3 -0
- data/CHANGELOG.md +11 -1
- data/Gemfile +0 -18
- data/README.md +17 -42
- data/Rakefile +6 -23
- data/lib/ssc.bot.rb +6 -17
- data/lib/ssc.bot/chat_log.rb +102 -126
- data/lib/ssc.bot/chat_log/message.rb +32 -42
- data/lib/ssc.bot/chat_log/message_parsable.rb +14 -38
- data/lib/ssc.bot/chat_log/message_parser.rb +153 -164
- data/lib/ssc.bot/chat_log/messages.rb +43 -55
- data/lib/ssc.bot/chat_log_file.rb +12 -25
- data/lib/ssc.bot/clu.rb +55 -0
- data/lib/ssc.bot/error.rb +11 -33
- data/lib/ssc.bot/jruby.rb +31 -0
- data/lib/ssc.bot/ssc_file.rb +44 -55
- data/lib/ssc.bot/user.rb +21 -0
- data/lib/ssc.bot/user/jrobot_message_sender.rb +51 -62
- data/lib/ssc.bot/user/message_sender.rb +104 -162
- data/lib/ssc.bot/util.rb +37 -31
- data/lib/ssc.bot/version.rb +4 -16
- data/ssc.bot.gemspec +21 -44
- data/test/test_helper.rb +3 -19
- data/test/util_test.rb +93 -0
- metadata +21 -16
data/lib/ssc.bot/user.rb
ADDED
@@ -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
|
8
|
-
#
|
9
|
-
#
|
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
|
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,
|
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
|
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 =
|
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
|
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
|
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
|
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
|
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
|
8
|
-
#
|
9
|
-
#
|
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
|
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,
|
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,
|
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 '/'
|
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
|
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
|
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
|