|
1 -- Here we process special commands, for example, those with more than one object specified |
|
2 |
|
3 commands = {}; |
|
4 |
|
5 function commands:_parse(person, command) |
|
6 if person.group.perm_edit and command:match("^@.*$") then |
|
7 local verb, param = command:match("^@(%a+)%s?(.*)$"); |
|
8 end |
|
9 local verb, object = command:match("^(%a+%s%a+)%s(.+)$"); |
|
10 if verb and object and #verb > 0 and #object > 0 and person.room:_findobject(object) then |
|
11 return verb, object; |
|
12 end |
|
13 verb, object = command:match("^(%a+)%s?(.*)$"); |
|
14 if verb and object and #verb > 0 and #object > 0 then |
|
15 return verb, object; |
|
16 end |
|
17 if verb and ((not object) or (object == "")) then return verb, nil; end |
|
18 end |
|
19 |
|
20 function commands:_handle(person, action, object) |
|
21 -- if not (person and action) then print("Invalid parameters!"); return; end |
|
22 function callobjectmethod(object) |
|
23 local o = person.room._objects:findobject(object) or person._contents["in"]:findobject(object); |
|
24 if o and o[action] then o[action](o, {room = person.room, person = person, nick = person.nick }); return true; end |
|
25 return false; |
|
26 end |
|
27 |
|
28 if commands[action] then commands[action](person, action, object); |
|
29 elseif object and object ~= "" and callobjectmethod(object) then return true; |
|
30 elseif occupant[action] then occupant[action](person, { room = person.room, person = person }); return true; |
|
31 elseif action and type(person.room[action]) == "function" then person.room[action](person.room, { room = person.room, person = person, jid = person.jid, nick = person.nick, param = object }); return true; |
|
32 else return false; -- Unable to understand command |
|
33 end |
|
34 end |
|
35 |
|
36 function commands.get(person, action, param) |
|
37 -- Decide if we are taking it from a container |
|
38 obj1, obj2 = param:match("^([%a%s]+)%sfrom%s([%a%s]+)$"); |
|
39 if obj1 and obj2 then -- We are taking from a container |
|
40 local container = person:_findobject(obj2) or person.room:_findobject(obj2); |
|
41 if not container then person:_tell(string.format("I don't see any '%s' here.", obj2 or "")); return; end |
|
42 if not (container._contents and container._contents["in"]) then person:_tell(string.format("The %s is not a container.", obj2 or "")); return; end |
|
43 object = container:_findobject(obj1); |
|
44 if not object then |
|
45 if object == false then person:_tell(string.format("Sorry, the %s is locked.", obj2)); |
|
46 else person:_tell(string.format("I can't find any %s in there.", obj1)); end |
|
47 return; |
|
48 end |
|
49 if person:_get({ object = object, container = container, name = obj1 }) then |
|
50 person:_say(string.format("/me gets %s from %s", object._properties.longname or object._properties.name or "something", container._properties.longname or container._properties.name or "something")); |
|
51 else |
|
52 person:_tell("You can't get that"); |
|
53 end |
|
54 return; |
|
55 end |
|
56 obj1 = param:match("^([%a%s]+)$"); |
|
57 if not obj1 then person:_tell("uh?"); return; end |
|
58 -- So we are getting an object just in the room |
|
59 local container = person.room; |
|
60 local object = container:_findobject(obj1); |
|
61 if not object then person:_tell(string.format("I can't find any %s in here.", obj1)); return; end |
|
62 if person:_get({ object = object, container = container, name = obj1}) then |
|
63 person:_say(string.format("/me picks up %s", object._properties.longname or object._properties.name or "something")); |
|
64 else |
|
65 person:_tell("You can't get that"); |
|
66 end |
|
67 end |
|
68 |
|
69 function commands.put(person, action, param) |
|
70 obj1, obj2 = param:match("^([%a%s]+)%sin%s([%a%s]+)$"); |
|
71 if not (obj1 and obj2) then return end |
|
72 local oldcontainer = person; -- Where the object currently is |
|
73 local object = person:_findobject(obj1); |
|
74 if not object then object = person.room:_findobject(obj1); oldcontainer = person.room; end |
|
75 if not object then person:_tell(string.format("Sorry, I can't find the '%s'.", obj1)); return; end |
|
76 local newcontainer = person.room:_findobject(obj2); |
|
77 if not newcontainer then person:_tell(string.format("I don't see any '%s' here.", obj2 or "")); return; end |
|
78 if not (newcontainer._contents and newcontainer._contents["in"]) then person:_tell(string.format("The %s is not a container.", obj2 or "")); return; end |
|
79 |
|
80 if newcontainer:_get({ object = object, container = oldcontainer }) then |
|
81 person:_say(string.format("/me puts %s in %s", object._properties.longname or object._properties.name or "something", newcontainer._properties.longname or newcontainer._properties.name or "something")); |
|
82 else |
|
83 person:_tell("You can't put that in there"); |
|
84 end |
|
85 end |
|
86 |
|
87 function commands.drop(person, action, param) |
|
88 local o = person:_findobject(param); |
|
89 if not o then person:_tell("You don't seem to have any "..param); return false; end |
|
90 if person.room:_get({ object = o, container = person }) then |
|
91 person:_say("/me drops "..(o._properties.longname or o._properties.name)); |
|
92 end |
|
93 end |
|
94 |
|
95 function commands.give(person, action, param) |
|
96 if not param then person:_tell("Give what to whom?"); return; end |
|
97 local objname, tonick = param:match("([%a%s]-)%s* to (.*)"); |
|
98 if not objname or not tonick then person:_tell("Give what to whom?"); return; end |
|
99 local o = person:_findobject(objname); |
|
100 if not o then person:_tell("You don't seem to have any "..objname); return false; end |
|
101 if not person.room.people[tonick] then person:_tell("Sorry, I can't find "..(tonick or "that person").."in this room..."); return; end |
|
102 if person.room.people[tonick]:_get({object = o, container = person}) then |
|
103 person:_action("gives "..(o._properties.longname or ((o._properties.prepend or "the").." "..o._properties.name)).." to "..param); |
|
104 end |
|
105 end |
|
106 |
|
107 function commands.help(person, action, param) |
|
108 |
|
109 end |
|
110 |
|
111 function commands.loadclass(person, action, param) |
|
112 local subenv = { classes = { } } |
|
113 local classdefinition = loadfile("objects/"..param..".lua"); |
|
114 setfenv(classdefinition, subenv); |
|
115 local success, message = pcall(classdefinition); |
|
116 if not success then person:_tell(string.format("Error loading %s: %s", param, message)); |
|
117 else |
|
118 for k, v in pairs(classes[param]) do classes[param][k] = nil; end -- Clear current class |
|
119 for k, v in pairs(subenv.classes[param]) do classes[param][k] = v; end -- Fill with data from new definition |
|
120 person:_tell("Loaded"); |
|
121 end |
|
122 end |
|
123 |
|
124 function commands.dump(person, action, param) |
|
125 table.print(param, person.room:_findobject(param) or person:_findobject(param) or classes.default or {}); |
|
126 end |
|
127 |
|
128 function commands.dumproom(person, action, param) |
|
129 table.print(person.room.name or "room", person.room); |
|
130 end |
|
131 |
|
132 function commands.loadroom(person, action, param) |
|
133 if not rooms[param] then person:_tell("You should go into the room, it has not even been created yet."); end |
|
134 local oldpeople = rooms[param].people; |
|
135 rooms[param]:_create{ room = param, server = GetJIDParts(person.occjid).server} |
|
136 rooms[param].people = oldpeople; |
|
137 end |
|
138 |
|
139 commands["@create"] = function (person, action, param) |
|
140 local chunk = loadstring(param); |
|
141 if not chunk then person:_tell("There was an error in your syntax. Please read the manual"); return; end |
|
142 setfenv(chunk, 1); |
|
143 local success, message = pcall(chunk); |
|
144 if not success then person:_tell(message.."\nThere was an error processing the command"); return; end |
|
145 local t = message; |
|
146 local newobj = classes[t.class]:_create(t); |
|
147 if newobj then |
|
148 person._contents["in"]:add(newobj); |
|
149 person:_action("waves his hands, and conjures something from thin air!"); |
|
150 else |
|
151 person:_tell("For some reason, the object was not created"); |
|
152 end |
|
153 end |