View/Edit #84:edit_verb

Switch to edit mode.

Name(s): edit_verb
1:   caller == this || raise(E_PERM)
2:   player:isa($webber) || raise(E_PERM)
3:   player:tell($eval.antistealth)
4:   set_task_perms(player.user)
5:   {get, object} = args
6:   if (iobj && player.referer && $www:previous_object() != object && player.user != $no_one)
7:     "We have an unknown form refering a command to us with a user's perms..."
8:     $msg:mtell("www_error", "Warning!  Previous page doesn't appear to be this one!")
9:     player:tell("For security reasons the command will not be executed.  Refering page: [", player.referer, "]")
10:    iobj = {}
11:  endif
12:  suspend(0)
13:  url = tostr("/", toint(object))
14:  vnum = $code_utils:find_verb_named(object, get)
15:  if (vnum == -1)
16:    if ($www:parse_POST("create"))
17:      "Verb doesn't exist, and we want to create it."
18:      try
19:        add_verb(object, {player.user.wizard ? $hacker | player.user, "roxd", get}, {"this", "none", "this"})
20:      except (E_PERM)
21:        player:tell("<B>Verb not created. This may be because you are over-quota.</B><BR>")
22:        return
23:      endtry
24:      player:tell("<B>Verb created!</B><BR>")
25:      vnum = length(verbs(object))
26:      "Keep going, and show the edit page."
27:      iobj = {}
28:    else
29:      "Verb doesn't exist, offer to create it."
30:      player:tell("<B>", object:nn(), " doesn't define this verb.</B><BR>")
31:      if (host = object:has_verb(get))
32:        host = host[1]
33:        player:tell("However, its ancestor <A HREF=\"/", toint(host), "\">", host.name, " (", host, ")</A> does.  View/Edit <A HREF=\"/", toint(host), ":", get, "\">", host, ":", get, "</A><BR>")
34:      endif
35:      if ($perm_utils:controls(player.user, object) || (object.w && player.user != $no_one))
36:        player:tell("<FORM METHOD='post' ACTION=\"", url, ":", get, "?edit\"><INPUT NAME='create' TYPE='hidden' VALUE='X'><INPUT TYPE='submit' VALUE='Create verb'></FORM><BR>")
37:      endif
38:      inherited = 0
39:      for x in ({object, @object:ancestors()})
40:        inherited = inherited + length(`verbs(x) ! E_PERM => {}')
41:      endfor
42:      return player:tell("See the list of <A HREF=\"", url, ":\">", `length(verbs(object)) ! E_PERM => "?"', " defined verbs</A> and <A HREF=\"", url, ";\">", inherited, " inherited verbs</A> on ", $su:nn(object), ".")
43:    endif
44:  endif
45:  code = 0
46:  v_args = 0
47:  info = `verb_info(object, vnum) ! E_PERM'
48:  if (info == E_PERM)
49:    $msg:mtell("www_error", "You do not have permission to view this verb.")
50:    return $www.exam:tell_verbs(object)
51:  endif
52:  hack = player.user.programmer && player.user != $no_one && (player.user:controls(info[1]) || index(info[2], "w"))
53:  if ($www:parse_POST("delete") == "Delete verb")
54:    "Unconfirmed request to delete verb (probably no JavaScript)."
55:    player:tell("<B>Are you sure you want to delete this verb?</B><BR>")
56:    player:tell("<FORM ACTION=\"", url, ":", get, "\" METHOD='post'><INPUT NAME='delete' TYPE='hidden' VALUE='Confirmed'><INPUT TYPE='submit' VALUE='Delete verb'></FORM><BR>")
57:    return
58:  elseif ($www:parse_POST("delete"))
59:    "Delete the verb, then show the list of verbs."
60:    if (`delete_verb(object, vnum) ! E_PERM' == E_PERM)
61:      $msg:mtell("www_error", "You do not have permission to delete this verb.")
62:      return $www.exam:tell_verbs(object)
63:    else
64:      player:tell("<B>", object, ":", $html_utils:literal_text(get), " has been deleted!</B><BR>")
65:      return $www.exam:tell_verbs(object)
66:    endif
67:  elseif (iobj)
68:    "Recompile the verb."
69:    if ($www:parse_POST("create"))
70:      $msg:mtell("www_error", "Verb already exists!")
71:    elseif (this.sharing_violations && $www:parse_POST("hash") && this:hash(tostr(object, ":", get)) != $www:parse_POST("hash"))
72:      $msg:mtell("www_error", "Sharing violation!")
73:      player:tell("While you were in the editor, somebody/something changed this verb.  You have two choices: you can either lose your changes or you can lose the other person's changes.<P>")
74:      player:tell("<FORM ACTION=\"", url, ":", $su:subst(get, $www.desubst_single), "?edit\" METHOD=\"post\">")
75:      player:tell($html_utils:input_hidden("hash", ""))
76:      for x in (iobj)
77:        if (x[1] != "hash")
78:          player:tell($html_utils:input_hidden(@x))
79:        endif
80:      endfor
81:      player:tell("It might be wise to see what <A HREF=\"", url, ":", $su:subst(get, $www.desubst_single), "\">the&nbsp;verb looks like&nbsp;now</A> and determine if you want to redo your changes on the new version, or come back here and <INPUT TYPE=\"submit\" VALUE=\"overwrite\"> the new version with your changes.</FORM>")
82:      player:tell("<P>How did this happen?<UL><LI>Somebody else may be editing this verb at the same time as you.<LI>You may have two browsers open, both editing the same verb.<LI>You may have used the back button to return to an old editor.<LI>This verb might be self-modifying.</UL>")
83:      return
84:    elseif (!$set_utils:includes($list_utils:slice(iobj), {"hash", "verbnames", "code", "arg1", "arg2", "arg3"}))
85:      $msg:mtell("www_error", "Invalid form elements.")
86:      player:tell("Verb was not compiled due to an error in the web interface.  Tell a wizard.<BR>")
87:    else
88:      name = $www:parse_POST("verbnames")
89:      code = $www:parse_POST("code")
90:      typeof(code) == $STR && (code = $string_utils:explode(code, "%0a"))
91:      code = {@code}
92:      v_args = {$www:parse_POST("arg1"), $www:parse_POST("arg2"), $www:parse_POST("arg3")}
93:      mods = ($www:parse_POST("r") ? "r" | "") + ($www:parse_POST("w") ? "w" | "") + ($www:parse_POST("o") ? "o" | "") + ($www:parse_POST("x") ? "x" | "") + ($www:parse_POST("d") ? "d" | "")
94:      if (player.user.wizard && $www:parse_POST("owner") && $www:parse_POST("owner") != $su:nn(info[1]))
95:        owner = $su:match_nn_object($www:parse_POST("owner"), #-1, player.user)
96:        valid(owner) || (owner = $su:match_player($www:parse_POST("owner"), player.user))
97:      else
98:        owner = info[1]
99:      endif
100:     old_info = info
101:     info = {owner, mods, name}
102:     result = `set_verb_info(object, vnum, info) ! E_PERM, E_INVARG'
103:     if (result == E_PERM)
104:       $msg:mtell("www_error", "You do not have permission to modify this verb.")
105:     elseif (result == E_INVARG)
106:       if (valid(owner))
107:         $msg:mtell("www_error", "Error, verb not compiled.")
108:         player:tell("The name of the verb is probably invalid.<BR>")
109:       else
110:         $msg:mtell("www_error", "Couldn't match new owner (" + $www:parse_POST("owner") + ").")
111:         owner = $www:parse_POST("owner")
112:         player:tell("Verb not changed.")
113:       endif
114:     else
115:       "No problem setting the verb_info; try setting the code."
116:       if (result = set_verb_code(object, vnum, code))
117:         "Error in compile, reset the verb_info"
118:         $msg:mtell("www_error", "Error during compile!")
119:         player:tell("<PRE>")
120:         player:tell(result)
121:         line = toint(result[1][5..index(result[1], ":") - 1])
122:         player:tell()
123:         if (line > length(code))
124:           player:tell("<I>Check for missing endif/endfor/endwhile/endtry/endtry statements.</I>")
125:         else
126:           for x in [max(1, line - 2)..min(line + 2, length(code))]
127:             if (line == x)
128:               player:tell("<I>", $html_utils:literal_text(code[x]), "</I>")
129:             else
130:               player:tell($html_utils:literal_text(code[x]))
131:             endif
132:           endfor
133:         endif
134:         player:tell("</PRE><HR>")
135:         set_verb_info(object, vnum, old_info)
136:       else
137:         set_verb_args(object, vnum, v_args)
138:         if (info[1] != owner)
139:           player:tell("<B>Chowned verb from ", $su:nn(info[1]), " to ", $su:nn(owner), "!</B><BR>")
140:           hack = player.user:controls(owner) || index(info[2], "w")
141:         endif
142:         if (info[3] != name)
143:           player:tell("<B>Verb renamed from \"", info[3], "\" to \"", name, "\"!</B><P>")
144:         endif
145:         if (bad = $code_utils:bad_ref(object, vnum))
146:           $msg:mtell("www_warning", "Warning: Invalid $reference detected: " + $su:english_list(bad))
147:         endif
148:         if (bad = $code_utils:bad_obj(object, vnum))
149:           $msg:mtell("www_warning", "Warning: Invalid object number detected: " + $su:english_list(bad))
150:         endif
151:         if (bad = $code_utils:bad_var(object, vnum))
152:           $msg:mtell("www_warning", "Warning: Undefined variables may be present: " + $su:english_list(bad))
153:         endif
154:         if (bad = $code_utils:bad_var_unused(object, vnum))
155:           $msg:mtell("www_warning", "Warning: Unused variables may be present: " + $su:english_list(bad))
156:         endif
157:         if (length(code) >= 10 && !$help_utils:verb_documentation(object, vnum))
158:           $msg:mtell("www_warning", "Warning: This verb has no documentation comments.")
159:         endif
160:         player:tell("<B>Compile successful!</B><P>")
161:         code = verb_code(object, vnum)
162:       endif
163:     endif
164:     info = {owner, mods, name}
165:   endif
166:   "Keep going, and show the edit page."
167: endif
168: current_info = `verb_info(object, vnum) ! E_PERM'
169: "Redirect to the full URL if we aren't there already."
170: webname = $su:subst(current_info[3], $www.desubst_single)
171: if ($su:subst(get, $www.desubst_single) != webname)
172:   webname = webname + dobjstr
173:   player:tell({"<SCRIPT LANGUAGE='JavaScript'>", "<!--", "  // " + get + " is not the full name.  Redirect.", tostr("  location = \"", $www.url, toint(object), index(player.user_agent, "Mozilla") && !index(player.user_agent, "MSIE") ? ":" | "%3A", webname, "\";"), "//-->", "</SCRIPT>"})
174:   player:tell("Redirecting to <A HREF=\"", $www.url, toint(object), index(player.user_agent, "Mozilla") && !index(player.user_agent, "MSIE") ? ":" | "%3A", webname, "\">full name</A>...<P>")
175:   return
176: endif
177: "----------------------------------------------------------------------"
178: "Show the edit form."
179: suspend(0)
180: code == 0 && (code = verb_code(object, vnum))
181: typeof(info[1]) == $OBJ && (info[1] = $su:nn(info[1]))
182: if ($www:parse_GET("isindex") == "edit" || ($www:parse_GET("isindex") != "view" && this:view_or_edit(object, vnum) == 1))
183:   code = $html_utils:literal_text(code)
184:   if (code && index(code[$], "Last modified by"))
185:     lmb = strsub(code[$], "&quot;", "\"")[2..$ - 2]
186:     code = listdelete(code, length(code))
187:   else
188:     lmb = ""
189:   endif
190:   player:tell("<P><I>Switch to <A HREF=\"/", toint(object), index(player.user_agent, "Mozilla") && !index(player.user_agent, "MSIE") ? ":" | "%3A", webname, "?view\">view mode</A>.</I></P>")
191:   player:tell("<FORM ACTION=\"/", toint(object), index(player.user_agent, "Mozilla") && !index(player.user_agent, "MSIE") ? ":" | "%3A", webname, "?edit\" METHOD=post>")
192:   player:tell("<INPUT NAME=hash TYPE=hidden VALUE=\"", this:hash(tostr(object, ":", current_info[3])), "\">")
193:   player:tell("Verb name(s): <INPUT NAME=verbnames VALUE=\"", $html_utils:literal_text(info[3]), "\" SIZE=", max(20, length(info[3]) + 5), "><BR>")
194:   code || (code = {""})
195:   code[1] = tostr("<TEXTAREA NAME=code ROWS='", max(length(code), value_bytes(code) / abs(player.user:linelength())) + 5, "' COLS='", abs(player.user:linelength()) - 1, "' WRAP='virtual' STYLE='width: 100%'>", code[1])
196:   code = {@code, "</TEXTAREA>"}
197:   player:tell(code)
198:   v_args == 0 && (v_args = verb_args(object, vnum))
199:   lmb && player:tell("<BR><I>", lmb, "</I>")
200:   player:tell("<BR>Verb arguments: ")
201:   player:tell(@$html_utils:input_select("arg1", {"this", "none", "any"}, v_args[1]))
202:   player:tell(@$html_utils:input_select("arg2", {"none", "any", @$code_utils.prepositions}, v_args[2]))
203:   player:tell(@$html_utils:input_select("arg3", {"this", "none", "any"}, v_args[3]))
204:   player:tell("<BR><INPUT NAME=r TYPE=checkbox", index(info[2], "r") ? " CHECKED>" | ">", " <B>R</B>eadable")
205:   index(info[2], "w") && player:tell("<INPUT NAME=w TYPE=checkbox CHECKED> <B>W</B>riteable")
206:   player:tell("<INPUT NAME=o TYPE=checkbox", index(info[2], "o") ? " CHECKED>" | ">", " <B>O</B>verridable")
207:   player:tell("<INPUT NAME=x TYPE=checkbox", index(info[2], "x") ? " CHECKED>" | ">", " e<B>X</B>ecutable")
208:   player:tell(index(info[2], "d") ? "<INPUT NAME=d TYPE=hidden VALUE=on>" | "<INPUT NAME=d TYPE=checkbox><B>D</B>ebug")
209:   if (player.user.wizard)
210:     player:tell("<BR>Verb owned by: <INPUT NAME=owner VALUE=\"", info[1], "\"><BR>")
211:   else
212:     player:tell("<BR>Verb owned by: <TT>", info[1], "</TT>")
213:   endif
214:   if (hack)
215:     player:tell("<P><INPUT TYPE=submit VALUE='Save verb'> <INPUT TYPE=reset>")
216:   else
217:     player:tell("<P><IMG SRC='", $www.fileURL, "/2/8/stop.gif' ALIGN='left' HEIGHT=32 WIDTH=32 ALT='[Stop]'>You do not have permission to save changes to this verb.")
218:     if (player.user == $no_one)
219:       player:tell("This is because you are not logged in.")
220:     elseif (!player.user:isa($prog))
221:       player:tell("This is because you are not a programmer.")
222:     elseif (!player.user.programmer)
223:       player:tell("This may be because you are over-quota.")
224:     endif
225:     player:tell("If you have made changes you wish to keep, you can always copy and paste the code elsewhere.")
226:   endif
227:   player:tell("</FORM>")
228:   player:tell("<SCRIPT LANGUAGE='JavaScript1.2' SRC='", $www.fileURL, "/8/4/expand.js'></SCRIPT>")
229: else
230:   player:tell("<P><I>Switch to <A HREF=\"/", toint(object), index(player.user_agent, "Mozilla") && !index(player.user_agent, "MSIE") ? ":" | "%3A", webname, "?edit\">edit mode</A>.</I></P>")
231:   player:tell("Name(s): <TT>", $html_utils:literal_text(info[3]), "</TT><BR>")
232:   if (code)
233:     "Add line numbers"
234:     for x in [1..length(code)]
235:       code[x] = tostr(x, ":           ")[1..length(tostr(length(code))) + 2] + strsub(strsub(strsub(code[x], "&", "&amp;"), "<", "&lt;"), ">", "&gt;")
236:       "code[x] = tostr(x, \":           \")[1..length(tostr(length(code))) + 2] + tostr(@$compile_utils:tokens2html($compile_utils:code2tokens(code[x])))"
237:       $command_utils:suspend_if_needed()
238:     endfor
239:     code[1] = tostr("<PRE ID='code'>", code[1])
240:     code[$] = code[$] + "</PRE>"
241:     player:tell(code)
242:     player:tell("<SCRIPT LANGUAGE='JavaScript1.2' SRC='", $www.fileURL, "/8/4/colourcode.js'></SCRIPT>")
243:     player:tell("<SCRIPT LANGUAGE='JavaScript1.2'><!--")
244:     player:tell("setTimeout(\"colourcode('code')\", 1);")
245:     player:tell("--></SCRIPT>")
246:   else
247:     player:tell("<I>[Empty verb]</I>")
248:   endif
249:   v_args == 0 && (v_args = verb_args(object, vnum))
250:   player:tell("<BR>Verb arguments: <TT>", $su:from_list(v_args, " "), "</TT>")
251:   player:tell("<BR>Verb perms: <TT>", index(info[2], "r") ? "<B>R</B>eadable " | "", index(info[2], "w") ? "<B>W</B>riteable " | "", index(info[2], "o") ? "<B>O</B>verridable " | "", index(info[2], "x") ? "e<B>X</B>ecutable " | "", index(info[2], "d") ? "" | "NOT-<B>D</B>ebug", "</TT>")
252:   player:tell("<BR>Verb owned by: <TT>", info[1], "</TT>")
253: endif
254: hack && player:tell("<HR><FORM ACTION=\"", url, ":", webname, "\" METHOD='post'><INPUT TYPE='submit' NAME='delete' VALUE='Delete verb' onClick=\"var ok=confirm('Are you sure you want to delete this verb?');if(ok)this.value='Confirmed';return ok;\"></FORM>")
255: "Last modified by whiz (#3135) on Wed Feb 27 23:34:28 2008 EST."

Verb arguments: this none this
Verb perms: Readable eXecutable NOT-Debug
Verb owned by: Dax (#789)

You are not logged in.

[home | help | who | search | setup | code]