minecraft 0.2.1 → 0.3.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.
- data/CHANGES.md +15 -0
- data/README.md +12 -0
- data/bin/minecraft +1 -0
- data/lib/minecraft/commands.rb +440 -107
- data/lib/minecraft/data.rb +7 -1
- data/lib/minecraft/extensions.rb +163 -55
- data/lib/minecraft/server.rb +2 -0
- data/lib/minecraft/tools.rb +9 -0
- data/lib/minecraft/version.rb +1 -1
- data/test/commands_test.rb +253 -12
- data/test/extensions_test.rb +48 -0
- data/test/helper.rb +4 -1
- metadata +2 -2
data/CHANGES.md
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
0.3.0 (2011-08-29)
|
2
|
+
------------------
|
3
|
+
|
4
|
+
* Added `!warptime`, `!stop`, `!welcome`, `!memo`, `!disco`, `!dnd`, `!disturb`, `!printdnd`, `!todo`, `!finished`.
|
5
|
+
* Moved time commands out of `method_missing`.
|
6
|
+
* Added capability for users to not be disturbed by teleporting or `all` commands.
|
7
|
+
* Removed `add_command` calls, now indexes information from source code on initialization.
|
8
|
+
* Added more documentation (back at 100% coverage).
|
9
|
+
* Added many more test suites.
|
10
|
+
* Misc. bug fixes including lots of command feedback.
|
11
|
+
* Shortcuts and kits can now be accessed with `:` instead of `!s` or `!kit`.
|
12
|
+
* `!help` is now dynamic and includes command-specific help.
|
13
|
+
* Coloured terminal output.
|
14
|
+
* Basic word wrapped output.
|
15
|
+
|
1
16
|
0.2.1 (2011-08-22)
|
2
17
|
------------------
|
3
18
|
|
data/README.md
CHANGED
@@ -70,6 +70,18 @@ Please refer to `Minecraft::Extensions#initialize`.
|
|
70
70
|
!board <user> # Check a users points.
|
71
71
|
!board # View the leaderboard of points.
|
72
72
|
!om <noms> # Give golden apples equivalent to the number of noms.
|
73
|
+
!warptime # Prints the current time rate.
|
74
|
+
!warptime <rate> # Adds <rate> seconds every ten seconds to time.
|
75
|
+
!stop # Stops all the users timers.
|
76
|
+
!welcome # Changes the welcome message during runtime.
|
77
|
+
!memo <user> <message> # Leaves a memo for the user.
|
78
|
+
!disco # Turns time into a dancefloor.
|
79
|
+
!dnd # Toggles the users do-not-disturb status.
|
80
|
+
!disturb <user> # An op can remove a user from the DND list.
|
81
|
+
!printdnd # Prints the list of do-not-disturbed users.
|
82
|
+
!todo # Prints the list of items todo.
|
83
|
+
!todo <item> # Adds a todo list item.
|
84
|
+
!finished <item> # Removes an item from the todo list.
|
73
85
|
|
74
86
|
Development Path
|
75
87
|
----------------
|
data/bin/minecraft
CHANGED
@@ -19,6 +19,7 @@ opts = Slop.parse :help => true do
|
|
19
19
|
banner "Usage: minecraft [options]"
|
20
20
|
|
21
21
|
option :n, :no_run, "Don't run the Minecraft server instance."
|
22
|
+
option :no_colour, "Don't have coloured output on the server side."
|
22
23
|
option :u, :update, "Download the latest version of the Minecraft server jarfile."
|
23
24
|
option :s, :min_memory, "Specify the minimum amount of memory to allocate.", :optional => true
|
24
25
|
option :x, :max_memory, "Specify the maximum amount of memory to allocate.", :optional => true
|
data/lib/minecraft/commands.rb
CHANGED
@@ -4,6 +4,189 @@ module Minecraft
|
|
4
4
|
module Commands
|
5
5
|
include Data
|
6
6
|
|
7
|
+
# Allows a user to specify a periodic (once every ten seconds) time change.
|
8
|
+
#
|
9
|
+
# @param [String] user The requesting user.
|
10
|
+
# @param [Integer] time_change Amount of time to add (can be negative or
|
11
|
+
# positive) every ten seconds.
|
12
|
+
# @example
|
13
|
+
# warptime("basicxman", "5")
|
14
|
+
# warptime("basicxman")
|
15
|
+
# @note ops: op
|
16
|
+
def warptime(user, time_change = nil)
|
17
|
+
if time_change.nil?
|
18
|
+
return @server.puts "say Current rate: #{@time_change} every ten seconds." if @time_change
|
19
|
+
return @server.puts "say No custom rate specified."
|
20
|
+
end
|
21
|
+
|
22
|
+
time_change = time_change.to_i
|
23
|
+
if time_change < 0
|
24
|
+
@time_change = [-1000, time_change].max
|
25
|
+
else
|
26
|
+
@time_change = [1000, time_change].min
|
27
|
+
end
|
28
|
+
@server.puts "say New rate: #{@time_change} every ten seconds."
|
29
|
+
end
|
30
|
+
|
31
|
+
# Adds a memo for the specified user.
|
32
|
+
#
|
33
|
+
# @param [String] user The requesting user.
|
34
|
+
# @param [String] target_user The target user.
|
35
|
+
# @param args The memo.
|
36
|
+
# @example
|
37
|
+
# memo("basicxman", "mike_n_7", "Hi!")
|
38
|
+
# @note ops: none
|
39
|
+
def memo(user, target_user, *args)
|
40
|
+
target_user = target_user.downcase
|
41
|
+
if @memos.has_key? target_user and @memos[target_user].length == 5
|
42
|
+
return @server.puts "say #{target_user} has too many memos already!"
|
43
|
+
end
|
44
|
+
|
45
|
+
@memos[target_user] ||= []
|
46
|
+
@memos[target_user] << [user, args.join(" ")]
|
47
|
+
say "Memo for #{target_user} added. Will be printed next time s/he logs in."
|
48
|
+
end
|
49
|
+
|
50
|
+
# Stops all timers for a user.
|
51
|
+
#
|
52
|
+
# @param [String] user The requesting user.
|
53
|
+
# @example
|
54
|
+
# stop("basicxman")
|
55
|
+
# @note ops: hop
|
56
|
+
def stop(user)
|
57
|
+
@timers.delete user
|
58
|
+
@server.puts "say #{user} has stopped all his/her timers."
|
59
|
+
end
|
60
|
+
|
61
|
+
# Changes or appends to the welcome message. Use !welcome + foo to add foo.
|
62
|
+
#
|
63
|
+
# @param [String] user The requesting user.
|
64
|
+
# @param args The welcome message.
|
65
|
+
# @example
|
66
|
+
# welcome("basicxman", "Welcome", "to", "the", "server")
|
67
|
+
# welcome("basicxman", "+", "%")
|
68
|
+
# @note ops: op
|
69
|
+
def welcome(user, *args)
|
70
|
+
if args.first == "+"
|
71
|
+
@welcome_message += " " + args[1..-1].join(" ")
|
72
|
+
@server.puts "say Appended to welcome message."
|
73
|
+
else
|
74
|
+
@welcome_message = args.join(" ")
|
75
|
+
@server.puts "say Changed welcome message."
|
76
|
+
end
|
77
|
+
display_welcome_message("basicxman")
|
78
|
+
end
|
79
|
+
|
80
|
+
# Changes to dawn.
|
81
|
+
#
|
82
|
+
# @example
|
83
|
+
# dawn()
|
84
|
+
# @note ops: op
|
85
|
+
def dawn()
|
86
|
+
change_time(:dawn)
|
87
|
+
end
|
88
|
+
|
89
|
+
# Changes to dusk.
|
90
|
+
#
|
91
|
+
# @example
|
92
|
+
# dusk()
|
93
|
+
# @note ops: op
|
94
|
+
def dusk()
|
95
|
+
change_time(:dusk)
|
96
|
+
end
|
97
|
+
|
98
|
+
# Changes to day.
|
99
|
+
#
|
100
|
+
# @example
|
101
|
+
# day()
|
102
|
+
# @note ops: op
|
103
|
+
def day()
|
104
|
+
change_time(:day)
|
105
|
+
end
|
106
|
+
|
107
|
+
# Changes to night.
|
108
|
+
#
|
109
|
+
# @example
|
110
|
+
# night()
|
111
|
+
# @note ops: op
|
112
|
+
def night()
|
113
|
+
change_time(:night)
|
114
|
+
end
|
115
|
+
|
116
|
+
# Changes to morning.
|
117
|
+
#
|
118
|
+
# @example
|
119
|
+
# morning()
|
120
|
+
# @note ops: op
|
121
|
+
def morning()
|
122
|
+
change_time(:morning)
|
123
|
+
end
|
124
|
+
|
125
|
+
# Changes to evening.
|
126
|
+
#
|
127
|
+
# @example
|
128
|
+
# evening()
|
129
|
+
# @note ops: op
|
130
|
+
def evening()
|
131
|
+
change_time(:evening)
|
132
|
+
end
|
133
|
+
|
134
|
+
# Toggles disco.
|
135
|
+
#
|
136
|
+
# @param [String] user The requesting user.
|
137
|
+
# @example
|
138
|
+
# disco("basicxman")
|
139
|
+
# @note ops: op
|
140
|
+
def disco(user)
|
141
|
+
@disco ||= false
|
142
|
+
if @disco
|
143
|
+
@server.puts "say Disco ends."
|
144
|
+
@disco = false
|
145
|
+
else
|
146
|
+
@server.puts "say #{user} has requested disco, s/he likely can't actually dance."
|
147
|
+
@disco = true
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
# Stops users from disturbing you.
|
152
|
+
#
|
153
|
+
# @param [String] user The requesting user.
|
154
|
+
# @example
|
155
|
+
# dnd("basicxman")
|
156
|
+
# @note ops: none
|
157
|
+
def dnd(user)
|
158
|
+
user.downcase!
|
159
|
+
if @userdnd.include? user
|
160
|
+
@server.puts "say #{user} is ready to be disturbed. *cough*"
|
161
|
+
@userdnd.reject! { |u| u == user }
|
162
|
+
else
|
163
|
+
@server.puts "say #{user} does not wish to be disturbed."
|
164
|
+
@userdnd << user
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
# Removes somebody from the DND list.
|
169
|
+
#
|
170
|
+
# @param [String] user The requesting user.
|
171
|
+
# @param [String] target_user The target user.
|
172
|
+
# @example
|
173
|
+
# disturb("basicxman", "mike_n_7")
|
174
|
+
# @note ops: op
|
175
|
+
def disturb(user, target_user)
|
176
|
+
@server.puts "say #{target_user} is being disturbed by #{user}!"
|
177
|
+
@userdnd.reject! { |u| u == target_user.downcase }
|
178
|
+
end
|
179
|
+
|
180
|
+
# Prints the users who do not wish to be disturbed.
|
181
|
+
#
|
182
|
+
# @param [String] user The requesting user.
|
183
|
+
# @example
|
184
|
+
# printdnd()
|
185
|
+
# @note: ops: op
|
186
|
+
def printdnd()
|
187
|
+
@server.puts "say #{@userdnd.join(", ")}"
|
188
|
+
end
|
189
|
+
|
7
190
|
# Gives a user a specific amount of points, the quantity is capped
|
8
191
|
# depending on the privileges of the user.
|
9
192
|
#
|
@@ -13,13 +196,22 @@ module Minecraft
|
|
13
196
|
# @example
|
14
197
|
# points("basicxman", "mike_n_7")
|
15
198
|
# points("basicxman", "mike_n_7", "50")
|
199
|
+
# @note ops: none
|
16
200
|
def points(user, target_user, num_points = 1)
|
17
|
-
|
201
|
+
target_user = target_user.downcase
|
202
|
+
num_points = num_points.to_i
|
203
|
+
if user.downcase == target_user
|
18
204
|
@server.puts "say Did you just try to give yourself points? Sure, minus twenty."
|
19
205
|
@userpoints[target_user] ||= 0
|
20
206
|
@userpoints[target_user] -= 20
|
207
|
+
return
|
208
|
+
elsif num_points < 0
|
209
|
+
@server.puts "say Subtracting points? For shame."
|
210
|
+
@userpoints[user] ||= 0
|
211
|
+
@userpoints[user] -= num_points
|
212
|
+
return
|
21
213
|
end
|
22
|
-
num_points = [num_points
|
214
|
+
num_points = [num_points, cap_points(user)].min
|
23
215
|
@userpoints[target_user] ||= 0
|
24
216
|
@userpoints[target_user] += num_points
|
25
217
|
@server.puts "say #{user} has given #{target_user} #{num_points} points for a total of #{@userpoints[target_user]}."
|
@@ -32,6 +224,7 @@ module Minecraft
|
|
32
224
|
# @example
|
33
225
|
# board("basicxman")
|
34
226
|
# board("basicxman", "mike_n_7")
|
227
|
+
# @note ops: none
|
35
228
|
def board(user, target_user = nil)
|
36
229
|
if target_user.nil?
|
37
230
|
leaderboard = {}
|
@@ -54,18 +247,6 @@ module Minecraft
|
|
54
247
|
end
|
55
248
|
end
|
56
249
|
|
57
|
-
# Caps the quantity of points able to be given based on requesting user.
|
58
|
-
#
|
59
|
-
# @param [String] user The requesting user.
|
60
|
-
# @return [Integer] Maximum quantity of points.
|
61
|
-
# @example
|
62
|
-
# cap_points("basicxman")
|
63
|
-
def cap_points(user)
|
64
|
-
return 1000 if is_op? user
|
65
|
-
return 500 if is_hop? user
|
66
|
-
return 1
|
67
|
-
end
|
68
|
-
|
69
250
|
# Initiates or votes for a specific user to be kicked, since half-ops and
|
70
251
|
# regular connected players cannot kick users they can initiate a vote
|
71
252
|
# instead.
|
@@ -76,6 +257,7 @@ module Minecraft
|
|
76
257
|
# @example
|
77
258
|
# kickvote("basicxman", "blizzard4U")
|
78
259
|
# kickvote("basicxman")
|
260
|
+
# @note ops: none
|
79
261
|
def kickvote(user, target_user = nil)
|
80
262
|
return @server.puts "say No user #{target_user} exists." unless @users.include? target_user
|
81
263
|
return vote(user) if target_user.nil?
|
@@ -96,6 +278,7 @@ module Minecraft
|
|
96
278
|
# @param [String] user The requesting user.
|
97
279
|
# @example
|
98
280
|
# vote("basicxman")
|
281
|
+
# @note ops: none
|
99
282
|
def vote(user)
|
100
283
|
unless submit_vote(user, @last_kick_vote)
|
101
284
|
@server.puts "say No kickvote was initiated, dummy."
|
@@ -108,6 +291,7 @@ module Minecraft
|
|
108
291
|
# @param [String] target_user The user which currently has a kickvote.
|
109
292
|
# @example
|
110
293
|
# cancelvote("basicxman", "blizzard4U")
|
294
|
+
# @note ops: op
|
111
295
|
def cancelvote(user, target_user)
|
112
296
|
if @kickvotes.has_key? target_user
|
113
297
|
@kickvotes.delete(target_user)
|
@@ -122,77 +306,20 @@ module Minecraft
|
|
122
306
|
# @param [String] user The requesting user.
|
123
307
|
# @example
|
124
308
|
# kickvotes("basicxman")
|
309
|
+
# @note ops: op
|
125
310
|
def kickvotes(user)
|
126
311
|
@kickvotes.each do |target_user, data|
|
127
312
|
@server.puts "say #{target_user}: #{data[:tally]} #{data[:votes].map { |u| u[0] + u[-1] }.join(", ")}"
|
128
313
|
end
|
129
314
|
end
|
130
315
|
|
131
|
-
# Submits a kickvote.
|
132
|
-
#
|
133
|
-
# @param [String] user The requesting user who is voting.
|
134
|
-
# @param [String] target_user The user being voted against.
|
135
|
-
# @return [Boolean] Returns true if the kickvote has been initiated yet.
|
136
|
-
# @example
|
137
|
-
# submit_vote("basicxman", "blizzard4U")
|
138
|
-
def submit_vote(user, target_user)
|
139
|
-
return unless @users.include? target_user
|
140
|
-
if @kickvotes.has_key? target_user
|
141
|
-
if @kickvotes[target_user][:votes].include? user
|
142
|
-
@server.puts "say You have already voted."
|
143
|
-
else
|
144
|
-
@kickvotes[target_user][:votes] << user
|
145
|
-
@kickvotes[target_user][:tally] += kick_influence(user)
|
146
|
-
check_kickvote(target_user)
|
147
|
-
end
|
148
|
-
return true
|
149
|
-
else
|
150
|
-
return false
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
# Checks a kickvote entry to see if the tally number has crossed the
|
155
|
-
# threshold, if so, kicks the user.
|
156
|
-
#
|
157
|
-
# @param [String] user The specified user.
|
158
|
-
# @example
|
159
|
-
# check_kickvote("blizzard4U")
|
160
|
-
def check_kickvote(user)
|
161
|
-
if @kickvotes[user][:tally] >= @vote_threshold
|
162
|
-
@server.puts "say Enough votes have been given to kick #{user}."
|
163
|
-
@server.puts "kick #{user}"
|
164
|
-
@kickvotes.delete(user)
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
# Computes the influence a user has for kickvotes.
|
169
|
-
#
|
170
|
-
# @param [String] user The specified user.
|
171
|
-
# @return [Integer] The influence level.
|
172
|
-
# @example
|
173
|
-
# kick_influence("basicxman")
|
174
|
-
def kick_influence(user)
|
175
|
-
return 3 if is_op? user
|
176
|
-
return 2 if is_hop? user
|
177
|
-
return 1
|
178
|
-
end
|
179
|
-
|
180
|
-
# Checks to see if any kickvotes are expired.
|
181
|
-
def expire_kickvotes
|
182
|
-
@kickvotes.each do |target_user, data|
|
183
|
-
if Time.now > data[:start] + @vote_expiration
|
184
|
-
@server.puts "say The kickvote for #{target_user} has expired."
|
185
|
-
@kickvotes.delete(target_user)
|
186
|
-
end
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
316
|
# Kicks a random person, the requesting user has a higher cance of being
|
191
317
|
# picked.
|
192
318
|
#
|
193
319
|
# @param [String] user The requesting user.
|
194
320
|
# @example
|
195
321
|
# roulette("basicxman")
|
322
|
+
# @note ops: op
|
196
323
|
def roulette(user)
|
197
324
|
users = @users + [user] * 3
|
198
325
|
picked_user = users.sample
|
@@ -200,24 +327,13 @@ module Minecraft
|
|
200
327
|
@server.puts "kick #{picked_user}"
|
201
328
|
end
|
202
329
|
|
203
|
-
# Changes the time of day.
|
204
|
-
#
|
205
|
-
# @param [String] time The time of day to change it to.
|
206
|
-
# @example
|
207
|
-
# change_time("morning")
|
208
|
-
def change_time(time)
|
209
|
-
return false unless TIME.include? time
|
210
|
-
@server.puts "time set #{TIME[time]}"
|
211
|
-
@server.puts "say #{TIME_QUOTES[time]}" unless TIME_QUOTES[time] == ""
|
212
|
-
return true
|
213
|
-
end
|
214
|
-
|
215
330
|
# Gives half-op privileges to the target user.
|
216
331
|
#
|
217
332
|
# @param [String] user The requesting user.
|
218
333
|
# @param [String] target_user The target user to be hop'ed.
|
219
334
|
# @example
|
220
335
|
# hop("basicxman", "blizzard4U")
|
336
|
+
# @note ops: op
|
221
337
|
def hop(user, target_user)
|
222
338
|
@hops << target_user.downcase unless @hops.include? target_user.downcase
|
223
339
|
@server.puts "#{target_user} is now a hop, thanks #{user}!"
|
@@ -229,6 +345,7 @@ module Minecraft
|
|
229
345
|
# @param [String] target_user The target user to be de-hop'ed.
|
230
346
|
# @example
|
231
347
|
# dehop("basicxman", "blizzard4U")
|
348
|
+
# @note ops: op
|
232
349
|
def dehop(user, target_user)
|
233
350
|
@hops.reject! { |u| u == target_user.downcase }
|
234
351
|
@server.puts "#{target_user} has been de-hoped, thanks #{user}!"
|
@@ -244,6 +361,8 @@ module Minecraft
|
|
244
361
|
# give("basicxman", "cobblestone", "9m")
|
245
362
|
# give("basicxman", "flint", "and", "steel", "1")
|
246
363
|
# give("basicxman", "4")
|
364
|
+
# @note ops: hop
|
365
|
+
# @note all: is putting out.
|
247
366
|
def give(user, *args)
|
248
367
|
item, quantity = items_arg(1, args)
|
249
368
|
item = resolve_item(item)
|
@@ -251,14 +370,6 @@ module Minecraft
|
|
251
370
|
construct_give(user, item, quantity)
|
252
371
|
end
|
253
372
|
|
254
|
-
# Validates a kit group, if the kit cannot be found it executes the
|
255
|
-
# !kitlist command.
|
256
|
-
def validate_kit(group = "")
|
257
|
-
return true if KITS.include? group.to_sym
|
258
|
-
@server.puts "say #{group} is not a valid kit."
|
259
|
-
kitlist
|
260
|
-
end
|
261
|
-
|
262
373
|
# Kit command takes a group name and gives the contents of the kit to the
|
263
374
|
# target user.
|
264
375
|
#
|
@@ -266,6 +377,8 @@ module Minecraft
|
|
266
377
|
# @param [String] group Label of the kit.
|
267
378
|
# @example
|
268
379
|
# give("basicxman", "diamond")
|
380
|
+
# @note ops: hop
|
381
|
+
# @note all: is providing kits to all.
|
269
382
|
def kit(user, group)
|
270
383
|
KITS[group.to_sym].each do |item|
|
271
384
|
if item.is_a? Array
|
@@ -282,7 +395,10 @@ module Minecraft
|
|
282
395
|
# @param [String] target User to teleport to.
|
283
396
|
# @example
|
284
397
|
# tp("basicxman", "mike_n_7")
|
398
|
+
# @note ops: hop
|
399
|
+
# @note all: is teleporting all users to their location.
|
285
400
|
def tp(user, target)
|
401
|
+
return if check_dnd(target)
|
286
402
|
@server.puts "tp #{user} #{target}"
|
287
403
|
end
|
288
404
|
|
@@ -290,9 +406,9 @@ module Minecraft
|
|
290
406
|
#
|
291
407
|
# @param [String] user Current (target) user.
|
292
408
|
# @example
|
293
|
-
#
|
294
|
-
def tpall(user
|
295
|
-
@users.each { |u| tp(u, user) }
|
409
|
+
# tpall("basicxman")
|
410
|
+
def tpall(user)
|
411
|
+
@users.each { |u| tp(u, user) unless @userdnd.include? u.downcase }
|
296
412
|
end
|
297
413
|
|
298
414
|
# Gives a golden apple to the specified user.
|
@@ -300,6 +416,8 @@ module Minecraft
|
|
300
416
|
# @param [String] user Target user.
|
301
417
|
# @example
|
302
418
|
# nom("basicxman")
|
419
|
+
# @note ops: hop
|
420
|
+
# @note all: is providing noms to all.
|
303
421
|
def nom(user)
|
304
422
|
@server.puts "give #{user} 322 1"
|
305
423
|
end
|
@@ -310,6 +428,8 @@ module Minecraft
|
|
310
428
|
# @param args noms!
|
311
429
|
# @example
|
312
430
|
# om("basicxman", "nom", "nom", "nom")
|
431
|
+
# @note ops: hop
|
432
|
+
# @note all: is noming everybody, gross.
|
313
433
|
def om(user, *args)
|
314
434
|
args.length.times { nom(user) }
|
315
435
|
end
|
@@ -321,6 +441,7 @@ module Minecraft
|
|
321
441
|
# @example
|
322
442
|
# property("basicxman", "spawn-monsters")
|
323
443
|
# property("basicxman")
|
444
|
+
# @note ops: op
|
324
445
|
def property(user, key = nil)
|
325
446
|
if key.nil?
|
326
447
|
(@server_properties.length / 3.0).ceil.times do |n|
|
@@ -340,6 +461,7 @@ module Minecraft
|
|
340
461
|
# @example
|
341
462
|
# uptime("basicxman")
|
342
463
|
# uptime("basicxman", "mike_n_7")
|
464
|
+
# @note ops: none
|
343
465
|
def uptime(user, target_user = nil)
|
344
466
|
target_user ||= user
|
345
467
|
unless @users.include? target_user
|
@@ -362,7 +484,8 @@ module Minecraft
|
|
362
484
|
#
|
363
485
|
# @example
|
364
486
|
# rules()
|
365
|
-
|
487
|
+
# @note ops: none
|
488
|
+
def rules()
|
366
489
|
@server.puts "say #{@rules}"
|
367
490
|
end
|
368
491
|
|
@@ -372,6 +495,7 @@ module Minecraft
|
|
372
495
|
# @param [String] user The requesting user.
|
373
496
|
# @example
|
374
497
|
# list("basicxman")
|
498
|
+
# @note ops: none
|
375
499
|
def list(user)
|
376
500
|
l = @users.inject("") do |s, u|
|
377
501
|
pre, suf = "", ""
|
@@ -397,9 +521,11 @@ module Minecraft
|
|
397
521
|
# @example
|
398
522
|
# addtimer("basicxman", "cobblestone")
|
399
523
|
# addtimer("basicxman", "arrow", "10")
|
524
|
+
# @note ops: hop
|
400
525
|
def addtimer(user, *args)
|
401
526
|
item, duration = items_arg(30, args)
|
402
527
|
item = resolve_item(item)
|
528
|
+
return @server.puts "say Timer was not added." if item.nil?
|
403
529
|
@timers[user] ||= {}
|
404
530
|
@timers[user][item] = duration
|
405
531
|
@server.puts "say Timer added for #{user}. Giving item id #{item} every #{duration} seconds."
|
@@ -411,10 +537,16 @@ module Minecraft
|
|
411
537
|
# @param args item
|
412
538
|
# @example
|
413
539
|
# deltimer("basicxman", "cobblestone")
|
540
|
+
# @note ops: hop
|
414
541
|
def deltimer(user, *args)
|
415
542
|
item = args.join(" ")
|
416
543
|
item = resolve_item(item)
|
417
|
-
|
544
|
+
if @timers.has_key? user
|
545
|
+
@timers[user].delete item
|
546
|
+
@server.puts "say #{item} timer is deleted."
|
547
|
+
else
|
548
|
+
@server.puts "say #{item} timer did not exist."
|
549
|
+
end
|
418
550
|
end
|
419
551
|
|
420
552
|
# Prints the requesting users current timers.
|
@@ -422,6 +554,7 @@ module Minecraft
|
|
422
554
|
# @param [String] user The requesting user.
|
423
555
|
# @example
|
424
556
|
# printtimer("basicxman")
|
557
|
+
# @note ops: hop
|
425
558
|
def printtimer(user)
|
426
559
|
unless @timers.has_key? user || @timers[user].length == 0
|
427
560
|
@server.puts "say No timers have been added for #{user}."
|
@@ -436,8 +569,9 @@ module Minecraft
|
|
436
569
|
# initialized).
|
437
570
|
#
|
438
571
|
# @example
|
439
|
-
# printtimer(
|
440
|
-
|
572
|
+
# printtimer()
|
573
|
+
# @note ops: op
|
574
|
+
def printtime()
|
441
575
|
@server.puts "say Timer is at #{@counter}."
|
442
576
|
end
|
443
577
|
|
@@ -450,12 +584,14 @@ module Minecraft
|
|
450
584
|
# @example
|
451
585
|
# s("basicxman", "cobble", "give", "cobblestone", "64")
|
452
586
|
# s("basicxman", "mike", "tp", "mike_n_7")
|
587
|
+
# @note ops: hop
|
453
588
|
def s(user, *args)
|
454
|
-
return @server.puts "say You need to specify a shortcut silly!" if args.length == 0
|
455
|
-
|
456
589
|
shortcut_name = args.slice! 0
|
457
590
|
if args.length == 0
|
458
|
-
|
591
|
+
unless @shortcuts.has_key? user and @shortcuts[user].has_key? shortcut_name
|
592
|
+
return kit(user, shortcut_name) if KITS.include? shortcut_name.to_sym
|
593
|
+
@server.puts "say #{shortcut_name} is not a valid shortcut for #{user}."
|
594
|
+
end
|
459
595
|
return call_command(user, @shortcuts[user][shortcut_name].first, *@shortcuts[user][shortcut_name][1..-1]) if args.length == 0
|
460
596
|
end
|
461
597
|
|
@@ -470,7 +606,8 @@ module Minecraft
|
|
470
606
|
# @param [String] user The requesting user.
|
471
607
|
# @example
|
472
608
|
# shortcuts("basicxman")
|
473
|
-
|
609
|
+
# @note ops: hop
|
610
|
+
def shortcuts(user)
|
474
611
|
labels = @shortcuts[user].keys.join(", ") if @shortcuts.has_key? user
|
475
612
|
@server.puts "say Shortcuts for #{user}: #{labels}."
|
476
613
|
end
|
@@ -480,7 +617,15 @@ module Minecraft
|
|
480
617
|
# @param [String] user The requesting user.
|
481
618
|
# @example
|
482
619
|
# help("basicxman")
|
483
|
-
|
620
|
+
# @note ops: none
|
621
|
+
def help(user, command = nil)
|
622
|
+
unless command.nil?
|
623
|
+
return @server.puts "say #{command} does not exist." unless @commands.has_key? command.to_sym
|
624
|
+
command_signature(command.to_sym)
|
625
|
+
say(@commands[command.to_sym][:help])
|
626
|
+
return
|
627
|
+
end
|
628
|
+
|
484
629
|
commands = @commands.keys.inject([]) { |arr, key|
|
485
630
|
priv = @commands[key][:ops]
|
486
631
|
if is_op? user
|
@@ -491,17 +636,205 @@ module Minecraft
|
|
491
636
|
priv == :none ? arr << key : arr
|
492
637
|
end
|
493
638
|
}.map { |s| "!" + s.to_s }
|
494
|
-
|
639
|
+
say(commands.join(", "))
|
495
640
|
end
|
496
641
|
|
497
642
|
# Prints the list of available kits to the connected players.
|
498
643
|
#
|
499
644
|
# @example
|
500
645
|
# kitlist()
|
501
|
-
|
646
|
+
# @note ops: none
|
647
|
+
def kitlist()
|
502
648
|
@server.puts "say Kits: #{KITS.keys.join(", ")}"
|
503
649
|
end
|
504
650
|
|
651
|
+
# Adds or prints the current todo list items.
|
652
|
+
#
|
653
|
+
# @param [String] user The requesting user.
|
654
|
+
# @param args The item.
|
655
|
+
# @example
|
656
|
+
# todo("basicxman", "foo")
|
657
|
+
# todo("basicxman")
|
658
|
+
# @note ops: none
|
659
|
+
def todo(user, *args)
|
660
|
+
if args.length == 0
|
661
|
+
@todo_items.each_with_index do |item, index|
|
662
|
+
@server.puts "say #{index + 1}. #{item}"
|
663
|
+
end
|
664
|
+
return
|
665
|
+
end
|
666
|
+
|
667
|
+
item = args.join(" ")
|
668
|
+
@todo_items << item
|
669
|
+
@server.puts "say Added item."
|
670
|
+
end
|
671
|
+
|
672
|
+
# Removes an item from the todo list.
|
673
|
+
#
|
674
|
+
# @param [String] user The requesting user.
|
675
|
+
# @param args The item.
|
676
|
+
# @example
|
677
|
+
# finished("basicxman", "foo")
|
678
|
+
# finished("basicxman", "2")
|
679
|
+
# @note ops: none
|
680
|
+
def finished(user, *args)
|
681
|
+
item = args.join(" ")
|
682
|
+
if item.to_i.to_s == item
|
683
|
+
index = item.to_i - 1
|
684
|
+
else
|
685
|
+
index = @todo_items.find_index(item)
|
686
|
+
end
|
687
|
+
return @server.puts "say Item does not exist." if index.nil? or @todo_items[index].nil?
|
688
|
+
@todo_items.slice! index
|
689
|
+
@server.puts "say Hurray!"
|
690
|
+
end
|
691
|
+
|
692
|
+
private
|
693
|
+
|
694
|
+
# Prints the command signature options for a specified command.
|
695
|
+
#
|
696
|
+
# @param [Symbol] command The command method.
|
697
|
+
# @example
|
698
|
+
# command_signature(:give)
|
699
|
+
def command_signature(command)
|
700
|
+
params = method(command).parameters || []
|
701
|
+
|
702
|
+
return if params.length == 0
|
703
|
+
params.slice! 0 if params[0][1] == :user
|
704
|
+
if params.length == 1
|
705
|
+
name = params[0][1].to_s.gsub("_", " ")
|
706
|
+
type = params[0][0]
|
707
|
+
case type
|
708
|
+
when :opt
|
709
|
+
say("!#{command}")
|
710
|
+
say("!#{command} '#{name}'")
|
711
|
+
when :rest
|
712
|
+
say("!#{command} 'arguments', '...'")
|
713
|
+
when :req
|
714
|
+
say("!#{command} '#{name}'")
|
715
|
+
end
|
716
|
+
elsif params.length == 2
|
717
|
+
first_name = params[0][1].to_s.gsub("_", " ")
|
718
|
+
second_name = params[1][1].to_s.gsub("_", " ")
|
719
|
+
type = params[1][0]
|
720
|
+
case type
|
721
|
+
when :rest
|
722
|
+
say("!#{command} '#{first_name}', 'arguments', '...'")
|
723
|
+
when :opt
|
724
|
+
say("!#{command} '#{first_name}'")
|
725
|
+
say("!#{command} '#{first_name}', '#{second_name}'")
|
726
|
+
end
|
727
|
+
end
|
728
|
+
end
|
729
|
+
|
730
|
+
# Checks if the user does not wish to be disturbed and prints an error
|
731
|
+
# notice if so.
|
732
|
+
#
|
733
|
+
# @param [String] user The requesting user.
|
734
|
+
# @return [Boolean] Returns true if the user does not wish to be disturbed
|
735
|
+
# (should cancel action).
|
736
|
+
# @example
|
737
|
+
# check_dnd("basicxman")
|
738
|
+
def check_dnd(user)
|
739
|
+
if @userdnd.include? user.downcase
|
740
|
+
say("#{user} does not wish to be disturbed, don't be a jerk!")
|
741
|
+
return true
|
742
|
+
else
|
743
|
+
return false
|
744
|
+
end
|
745
|
+
end
|
746
|
+
|
747
|
+
# Validates a kit group, if the kit cannot be found it executes the
|
748
|
+
# !kitlist command.
|
749
|
+
def validate_kit(group = "")
|
750
|
+
return true if KITS.include? group.to_sym
|
751
|
+
@server.puts "say #{group} is not a valid kit."
|
752
|
+
kitlist
|
753
|
+
end
|
754
|
+
|
755
|
+
# Changes the time of day.
|
756
|
+
#
|
757
|
+
# @param [String] time The time of day to change it to.
|
758
|
+
# @example
|
759
|
+
# change_time("morning")
|
760
|
+
def change_time(time)
|
761
|
+
return false unless TIME.include? time
|
762
|
+
@server.puts "time set #{TIME[time]}"
|
763
|
+
@server.puts "say #{TIME_QUOTES[time]}" unless TIME_QUOTES[time] == ""
|
764
|
+
return true
|
765
|
+
end
|
766
|
+
|
767
|
+
# Checks a kickvote entry to see if the tally number has crossed the
|
768
|
+
# threshold, if so, kicks the user.
|
769
|
+
#
|
770
|
+
# @param [String] user The specified user.
|
771
|
+
# @example
|
772
|
+
# check_kickvote("blizzard4U")
|
773
|
+
def check_kickvote(user)
|
774
|
+
if @kickvotes[user][:tally] >= @vote_threshold
|
775
|
+
@server.puts "say Enough votes have been given to kick #{user}."
|
776
|
+
@server.puts "kick #{user}"
|
777
|
+
@kickvotes.delete(user)
|
778
|
+
end
|
779
|
+
end
|
780
|
+
|
781
|
+
# Computes the influence a user has for kickvotes.
|
782
|
+
#
|
783
|
+
# @param [String] user The specified user.
|
784
|
+
# @return [Integer] The influence level.
|
785
|
+
# @example
|
786
|
+
# kick_influence("basicxman")
|
787
|
+
def kick_influence(user)
|
788
|
+
return 3 if is_op? user
|
789
|
+
return 2 if is_hop? user
|
790
|
+
return 1
|
791
|
+
end
|
792
|
+
|
793
|
+
# Checks to see if any kickvotes are expired.
|
794
|
+
def expire_kickvotes
|
795
|
+
@kickvotes.each do |target_user, data|
|
796
|
+
if Time.now > data[:start] + @vote_expiration
|
797
|
+
@server.puts "say The kickvote for #{target_user} has expired."
|
798
|
+
@kickvotes.delete(target_user)
|
799
|
+
end
|
800
|
+
end
|
801
|
+
end
|
802
|
+
|
803
|
+
# Submits a kickvote.
|
804
|
+
#
|
805
|
+
# @param [String] user The requesting user who is voting.
|
806
|
+
# @param [String] target_user The user being voted against.
|
807
|
+
# @return [Boolean] Returns true if the kickvote has been initiated yet.
|
808
|
+
# @example
|
809
|
+
# submit_vote("basicxman", "blizzard4U")
|
810
|
+
def submit_vote(user, target_user)
|
811
|
+
return unless @users.include? target_user
|
812
|
+
if @kickvotes.has_key? target_user
|
813
|
+
if @kickvotes[target_user][:votes].include? user
|
814
|
+
@server.puts "say You have already voted."
|
815
|
+
else
|
816
|
+
@kickvotes[target_user][:votes] << user
|
817
|
+
@kickvotes[target_user][:tally] += kick_influence(user)
|
818
|
+
check_kickvote(target_user)
|
819
|
+
end
|
820
|
+
return true
|
821
|
+
else
|
822
|
+
return false
|
823
|
+
end
|
824
|
+
end
|
825
|
+
|
826
|
+
# Caps the quantity of points able to be given based on requesting user.
|
827
|
+
#
|
828
|
+
# @param [String] user The requesting user.
|
829
|
+
# @return [Integer] Maximum quantity of points.
|
830
|
+
# @example
|
831
|
+
# cap_points("basicxman")
|
832
|
+
def cap_points(user)
|
833
|
+
return 1000 if is_op? user
|
834
|
+
return 500 if is_hop? user
|
835
|
+
return 1
|
836
|
+
end
|
837
|
+
|
505
838
|
# Helper method for printing the final give statements to the server. If a
|
506
839
|
# quantity is above the default upper bound (64) it will print multiple
|
507
840
|
# statements.
|