mud/lib/secure/modules/mapping.c
2020-09-06 05:43:07 -07:00

349 lines
11 KiB
C

#include <lib.h>
#include <daemons.h>
#include <modules.h>
string globaltmp, globalstr, globalstr2, func, data, temporary;
int automated;
object target;
mixed newval;
int GetKey(string str);
varargs mapping GetTheValue(string str, object targ, string tempy, string k1, string v1, mapping MapThing, string passed_fun);
string *key_arr = ({});
mapping NewMap = ([]);
int eventStoreMapping(string savefile, mapping plan){
string filename = "/tmp/"+savefile;
if(file_exists(filename) && !check_privs(this_player(),filename)){
write("You do not appear to have write access to this file. Modification aborted.");
return 1;
}
store_variable("data", plan);
}
varargs int eventStartMappingQuestions(mapping oldmap, object ob, string tmpfile, string auto){
if(ob) target = ob;
if(tmpfile) temporary = tmpfile;
if(auto && auto != "") {
automated = 1;
func = auto;
}
if(ob && !check_privs(this_player(),ob)){
write("You do not appear to have write access to this file. Modification aborted.");
return 1;
}
if(file_exists(temporary) && !check_privs(this_player(),temporary)){
write("You do not appear to have write access to this file. Modification aborted.");
return 1;
}
if(sizeof(oldmap)) NewMap = oldmap;
else NewMap = ([]);
key_arr = ({});
write("If you don't understand these questions, type the letter q on a blank "+
"line and hit enter.\n");
write("Please enter the first key element for this mapping:\n");
input_to( (: GetKey :) );
return 1;
}
int GetKey(string str){
if(file_exists(temporary) && !check_privs(this_player(),temporary)){
write("You do not appear to have write access to this file. Modification aborted.");
return 1;
}
if(str && str == "q" ) {
write("Aborting modification. For information on mappings, type: help mappings");
rm(temporary);
return 1;
}
if(!str || str == "" || str == "."){
if(!sizeof(key_arr)){
write("Aborting modification. For information on mappings, type: help mappings");
rm(temporary);
return 1;
}
write("Please enter the value for key "+identify(key_arr)+":\n");
input_to( (: GetTheValue :) );
return 1;
}
else {
key_arr += ({ str });
write("Please enter the next key element, or enter a single dot to "
"finish entering key elements.");
input_to( (: GetKey :) );
return 1;
}
}
varargs mapping GetTheValue(string str, object targ, string tempy, string k1, string v1, mapping MapThing, string passed_fun){
int i;
string repl_key;
string *mapkeys;
if(!str && !targ && !tempy && !k1 && !v1){
return 0;
}
if(str == "AUTOMATED"){
NewMap = ([]);
automated = 1;
target = targ;
key_arr = ({ k1 });
temporary = tempy;
str = v1;
if(sizeof(MapThing)) NewMap = MapThing;
func = passed_fun;
unguarded( (: cp(base_name(target)+".c",temporary) :) );
}
if(file_exists(temporary) && !check_privs(this_player(),temporary)){
write("You do not appear to have write access to this file. Modification aborted.");
return ([]);
}
if(!str || str == "" || str == "." || str == "q") {
write("Aborting modification. For information on mappings, type: help mappings");
rm(temporary);
return ([]);
}
if(sscanf(str,"%d",i) == 1) newval = i;
else newval = str;
if(sizeof(replace_string(str, itoa(i), ""))) newval = str;
mapkeys = keys(NewMap);
foreach(mixed llave in mapkeys){
foreach(string nueva_llave in key_arr){
if(arrayp(llave) && member_array(nueva_llave,llave) != -1) repl_key = llave;
else if(stringp(llave) && nueva_llave == llave ) repl_key = llave;
}
}
if(repl_key || repl_key != "") map_delete(NewMap, repl_key);
if(sizeof(key_arr) > 1) NewMap[key_arr] = newval;
else NewMap[key_arr[0]] = newval;
if(automated){
automated = 0;
if(func) this_object()->eventResumeMappingChange(target, temporary, NewMap, func);
else this_object()->eventResumeMappingChange(target, temporary, NewMap);
}
return copy(NewMap);
}
varargs string eventStringifyMap(mapping source, string key_excl, string val_excl){
string map_str, key;
mixed val;
if(!key_excl) key_excl = ""+time();
if(!val_excl) val_excl = ""+time();
map_str = "([\n";
foreach( key, val in source){
if(intp(val)){
map_str += identify(key) + " : " + val +",\n";
}
else if(stringp(val) && last(val,1) == "'" && first(val,1) == "'"){
val = replace_string(val,"'","");
map_str += identify(key) + " : " + val +",\n";
}
else
map_str += identify(key) + " : " + identify(val) +",\n";
}
map_str += "])";
return map_str;
}
string eventReadThing(string map){
// This doesn't actually work yet, and perhaps never will,
// but I'm leaving it here to remind myself to fix it.
// -Crat
string new_string;
int i, iterations;
string *arr;
string *new_arr = ({});
new_string = "";
arr = explode(map,":");
foreach(string element in arr){
string s1, s2, type;
int num;
if(!sizeof(new_arr)) new_arr = ({ replace_string(element,"\"", "") });
else if(sizeof(element) && element != ""){
if(sscanf(element,"%d ,%s",num,s1) != 2) {
sscanf(element,"%d,%s",num,s1);
type = "int";
}
if(!s1 || s1 == "") {
sscanf(element,"(:%s:)%s", s1, s2);
type = "function";
}
if(!s2 || s2 == "") {
sscanf(element,"([%s])%s", s1, s2);
type = "mapping";
}
if(!s2 || s2 == "") {
sscanf(element,"\"%s\"%s", s1, s2);
type = "string";
}
if(!s2 || s2 == "") {
s1 = element;
type = "null";
}
if(!type || type == ""){
write("Whoops! An incomprehensible error occurs.");
return "";
}
if(type == "int") new_arr += ({ ""+num });
else if(type == "function") new_arr += ({ "(: "+s1+" :)" });
else if(type == "mapping") new_arr += ({ "([ "+s1+" ])" });
else if(type == "string") new_arr += ({ "\""+s1+"\"" });
else if(type == "null") new_arr += ({ replace_string(s1,",","",1) });
}
}
iterations = sizeof(new_arr);
for( i = 0; i < (iterations -2) ; i = i+2 ){
new_string += new_arr[i]+" : "+new_arr[i+1]+",\n";
}
new_string += new_arr[iterations -1]+"\n";
new_string += "])";
return new_string;
}
int eventSpecialMapHandler(object ob, string func, mixed mode, mixed value){
string tmp, filename, func2, junk, junk2;
string *plural_maps;
int integer;
mapping NewMap = ([]);
mapping FirstMap = ([]);
mapping SecondMap = ([]);
plural_maps = ({ "SetProperties" });
if(stringp(value)) value = trim(replace_string(value,mode,""));
if(stringp(value) && !grepp(lower_case(func),"prop") ){
if(sscanf(value,"%d",integer) != 1 &&
sscanf(value,"%d %s",integer,junk) != 2) {
sscanf(value,"%s %s",tmp,junk);
if(!tmp || !junk) value = 0;
else if(sscanf(junk,"%d",integer) != 1) sscanf(junk,"%d %s",integer,junk2);
if(tmp) mode += " "+tmp;
}
if(integer) value = integer;
else value = 0;
if(!intp(value)) value = 0;
}
else {
if(sscanf(value,"%s %s",tmp, junk) == 2){
mode += " "+tmp;
value = trim(junk);
}
}
filename = base_name(ob)+".c";
if(!check_privs(this_player(),filename)){
write("You do not appear to have write access to this file. Modification aborted.");
return 1;
}
if(!mode || !value){
write("Invalid entry. Modification cancelled.");
return 1;
}
globalstr = filename;
unguarded( (: globalstr2 = read_file(globalstr) :) );
switch(func){
case "SetProperties" : func2 = "SetProperty";break;
case "SetSkills" : func2 = "SetSkill";break;
case "SetStats" : func2 = "SetStat";break;
}
FirstMap = this_object()->eventReadPair(filename, func2, 1);
SecondMap = this_object()->eventReadMapping(filename, ({ func }), 1);
NewMap = add_maps(FirstMap, SecondMap);
if(stringp(value) && sscanf(value,"%d",integer) == 1) {
NewMap[mode] = integer;
}
else NewMap[mode] = value;
globaltmp = generate_tmp(ob);
unguarded( (: write_file(globaltmp,globalstr2,1) :) );
if(member_array(func,plural_maps) != -1)
this_object()->eventResumeMappingChange(ob,globaltmp,copy(NewMap),func);
else this_object()->eventAddSettings(ob,globaltmp,copy(NewMap),func2);
return 1;
}
mapping eventReadPair(string filename, string param, int destructive){
mixed numerator, denominator;
int integer;
string s1, junk, contents, tmp;
string *file_arr, *line_arr;
mapping NewMap = ([]);
if(file_exists(filename) && !check_privs(this_player(),filename)){
write("You do not appear to have write access to this file. Modification aborted.");
return ([]);
}
globalstr = filename;
if(file_exists(filename)) {
unguarded( (: globalstr2 = read_file(globalstr) :) );
}
contents = globalstr2;
file_arr = explode(contents,"\n");
line_arr = ({});
foreach(string line in file_arr){
if(grepp(line,param)) line_arr += ({ line });
}
if(!sizeof(line_arr)) return ([]);
foreach(string element in line_arr){
element = trim(element);
if(sscanf(element,param+"(%s);",s1) != -1) sscanf(element,param+"(%s) ;",s1);
if(!s1) sscanf(element,param+" (%s);",s1,junk);
sscanf(s1,"%s,%s",denominator,numerator);
numerator = trim(numerator);
denominator = trim(denominator);
if(sscanf(denominator,"\"%s\"",junk) == 1) denominator = junk;
if(sscanf(numerator,"%d",integer) == 1) numerator = integer;
else if(sscanf(numerator,"\"%s\"",junk) == 1) numerator = junk;
if(stringp(numerator)) numerator = trim(numerator);
denominator = trim(denominator);
NewMap[denominator] = numerator;
}
if(destructive) {
globalstr2 = remove_matching_line(globalstr2, param, 1);
globalstr = generate_tmp();
unguarded( (: write_file(globalstr,globalstr2,1) :) );
tmp = globalstr;
globalstr = filename;
globalstr2 = tmp;
unguarded( (: cp(globalstr2, globalstr) :) );
rm(tmp);
}
return copy(NewMap);
}