Formatierung, Kosmetik
Change-Id: Iabbbfd3d610bcfbc1591ee34eef4072ad9d69ed4
diff --git a/p/daemon/channel.h b/p/daemon/channel.h
index ad1f506..9b2efc5 100644
--- a/p/daemon/channel.h
+++ b/p/daemon/channel.h
@@ -5,39 +5,38 @@
#ifndef __DAEMON_CHANNEL_H__
#define __DAEMON_CHANNEL_H__
-#define P_CHANNELS "channels"
-#define P_STD_CHANNEL "std_channel"
+#define P_CHANNELS "channels"
+#define P_STD_CHANNEL "std_channel"
-#define CHMASTER "/p/daemon/channeld"
+#define CHMASTER "/p/daemon/channeld"
// Message types
-#define MSG_SAY 0
-#define MSG_EMOTE 1
-#define MSG_GEMOTE 2
-#define MSG_EMPTY 3
+#define MSG_SAY 0
+#define MSG_EMOTE 1
+#define MSG_GEMOTE 2
+#define MSG_EMPTY 3
// Errors
-#define E_ACCESS_DENIED -1
-#define E_ALREADY_JOINED -2
-#define E_NOT_MEMBER -3
-#define E_EMPTY_MESSAGE -4
-#define E_UNKNOWN_TYPE -5
+#define E_ACCESS_DENIED -1
+#define E_ALREADY_JOINED -2
+#define E_NOT_MEMBER -3
+#define E_EMPTY_MESSAGE -4
+#define E_UNKNOWN_TYPE -5
// Commands
-#define C_NEW "new"
-#define C_JOIN "join"
-#define C_LEAVE "leave"
-#define C_SEND "send"
-#define C_LIST "list"
-#define C_FIND "find"
+#define C_NEW "new"
+#define C_JOIN "join"
+#define C_LEAVE "leave"
+#define C_SEND "send"
+#define C_LIST "list"
+#define C_FIND "find"
-// definition of the list mapping entry
-// ([ channelname : ({ I_MEMBER, I_ACCESS, I_INFO, I_MASTER, I_NAME }) ])
-#define I_MEMBER 0
-#define I_ACCESS 1
-#define I_INFO 2
-#define I_MASTER 3
-#define I_NAME 4
+// definition of the channel list entry indices
+#define I_MEMBER 0
+#define I_ACCESS 1
+#define I_INFO 2
+#define I_MASTER 3
+#define I_NAME 4
#endif //__DAEMON_CHANNEL_H__
@@ -56,4 +55,3 @@
#endif //__CHANNEL_H_PROTO__
#endif //NEED_PROTOTYPES
-
diff --git a/p/daemon/channeld.c b/p/daemon/channeld.c
index a26f9ed..a0e0768 100644
--- a/p/daemon/channeld.c
+++ b/p/daemon/channeld.c
@@ -20,23 +20,58 @@
#define NEED_PROTOTYPES
#include "channel.h"
-#define CMNAME "<MasteR>"
-#define CHANNEL_SAVE "/p/daemon/save/channeld"
+#define CMNAME "<MasteR>"
+#define CHANNEL_SAVE "/p/daemon/save/channeld"
+#define MEMORY "/secure/memory"
+#define TIMEOUT (time() - 60)
+#define CMDS ({C_FIND, C_LIST, C_JOIN, C_LEAVE, C_SEND, C_NEW})
-#define MEMORY "/secure/memory"
-
-// channels - contains the simple channel information
-// ([ channelname : ({ I_MEMBER, I_ACCESS, I_INFO, I_MASTER })...])
-private nosave mapping lowerch;
+/* list of channels and their corresponding data (members, etc.)
+ channels = ([string channelname : ({ ({object* members}),
+ closure access_rights,
+ string channel_info,
+ string|object master_object,
+ string channelname }) ]) */
private nosave mapping channels;
+//private nosave mapping lowerch; // unused
+
+/* channel history
+ mapping channelH = ([ string channelname : ({ string channelname,
+ string sender,
+ string msg,
+ int msg_type }) ]) */
private nosave mapping channelH;
+
+/* list of global channelmaster stats
+ mapping stats: ([ "time" : int object_time(),
+ "boot" : string load_name(previous_object()),
+ "new" : int total_channels_created,
+ "disposed" : int total_channels_removed ]) */
private nosave mapping stats;
+/* channel cache
+ mapping channelC = ([ string channelname : ({ string I_NAME,
+ string I_INFO,
+ int time() }) ]) */
private mapping channelC;
+
+/* list of players' banned commands, if any
+ mapping channelB = ([ string playername : ({ string* banned_commands })])*/
private mapping channelB;
+/* timeout cache for player commands (timeout = 60 s, see above)
+ ensures that the same command is only executed once per minute, max
+ mapping Tcmd = ([ "lag": int timestamp,
+ "uptime": int timestamp,
+ "statistik": int timestamp]) */
+private mapping Tcmd = ([]);
+
+/* Flag to indicate that data changes have occurred and that we need saving
+ in the next save_object() run.
+ set to 0 or 1 */
private int save_me_soon;
+
// BEGIN OF THE CHANNEL MASTER ADMINISTRATIVE PART
#define RECV 0
@@ -55,174 +90,221 @@
int check(string ch, object pl, string cmd)
{
int level;
-
- if((admin[ch, FLAG] & F_NOGUEST) && pl->QueryGuest()) return 0;
- if((admin[ch, FLAG] & F_WIZARD) && query_wiz_level(pl) < SEER_LVL) return 0;
+ if ((admin[ch, FLAG] & F_NOGUEST) && pl->QueryGuest())
+ return 0;
+
+ if ((admin[ch, FLAG] & F_WIZARD) && query_wiz_level(pl) < SEER_LVL)
+ return 0;
+
level = (admin[ch, FLAG] & F_WIZARD
- ? query_wiz_level(pl)
- : pl->QueryProp(P_LEVEL));
+ ? query_wiz_level(pl)
+ : pl->QueryProp(P_LEVEL));
- switch(cmd)
+ switch (cmd)
{
- case C_FIND:
- case C_LIST:
- case C_JOIN:
- if(admin[ch, RECV] == -1) return 0;
- if(admin[ch, RECV] <= level) return 1;
- break;
- case C_SEND:
- if(admin[ch, SEND] == -1) return 0;
- if(admin[ch, SEND] <= level) return 1;
- break;
- case C_LEAVE:
- return 1;
- default: break;
+ case C_FIND:
+ case C_LIST:
+ case C_JOIN:
+ if (admin[ch, RECV] == -1)
+ return 0;
+ if (admin[ch, RECV] <= level)
+ return 1;
+ break;
+
+ case C_SEND:
+ if (admin[ch, SEND] == -1)
+ return 0;
+ if (admin[ch, SEND] <= level)
+ return 1;
+ break;
+
+ case C_LEAVE:
+ return 1;
+
+ default:
+ break;
}
- return(0);
+ return (0);
}
private int CountUser(mapping l)
{
mapping n = ([]);
- walk_mapping(l, function void (string chan_name, mixed* chan_data) {
- n += mkmapping(chan_data[I_MEMBER]);
- });
+ walk_mapping(l, function void (string chan_name, mixed * chan_data)
+ {
+ n += mkmapping(chan_data[I_MEMBER]);
+ });
return sizeof(n);
}
-private void banned(string n, mixed cmds, string res)
+private void banned(string n, string* cmds, string res)
{
res += sprintf("%s [%s], ", capitalize(n), implode(cmds, ","));
}
-private mapping Tcmd = ([]);
-#define TIMEOUT (time() - 60)
-
void ChannelMessage(mixed msg)
{
string ret, mesg;
mixed lag;
int max, rekord;
string tmp;
- if(msg[1] == this_object() || !stringp(msg[2]) ||
- msg[0] != CMNAME || previous_object() != this_object()) return;
+ if (msg[1] == this_object() || !stringp(msg[2]) ||
+ msg[0] != CMNAME || previous_object() != this_object())
+ return;
mesg = lower_case(msg[2]);
- if(!strstr("hilfe", mesg) && sizeof(mesg) <= 5)
- ret = "Folgende Kommandos gibt es: hilfe, lag, up[time], statistik, bann";
- else
- if(!strstr("lag", mesg) && sizeof(mesg) <= 3)
+ if (!strstr("hilfe", mesg) && sizeof(mesg) <= 5)
{
- if(Tcmd["lag"] > TIMEOUT) return;
+ ret = "Folgende Kommandos gibt es: hilfe, lag, up[time], statistik, bann";
+ }
+ else if (!strstr("lag", mesg) && sizeof(mesg) <= 3)
+ {
+ // TODO: invert logic to make this better understandable, e.g.
+ // if ( CMD_AVAILABLE("lag") ) and rearrange code block
+ if (Tcmd["lag"] > TIMEOUT)
+ return;
+
Tcmd["lag"] = time();
lag = "/p/daemon/lag-o-daemon"->read_ext_lag_data();
ret = sprintf("Lag: %.1f%%/60, %.1f%%/15, %.1f%%/5, %.1f%%/1, "
- "%.1f%%/20s, %.1f%%/2s",
- lag[5], lag[4], lag[3], lag[2], lag[1], lag[0]);
- call_out(#'send/*'*/, 2, CMNAME, this_object(), ret);
+ "%.1f%%/20s, %.1f%%/2s",
+ lag[5], lag[4], lag[3], lag[2], lag[1], lag[0]);
+ call_out(#'send, 2, CMNAME, this_object(), ret);
ret = query_load_average();
- } else
- if(!strstr("uptime", mesg) && sizeof(mesg) <= 6)
+ }
+ // TODO: move this logic to a function with a self-explanatory name
+ else if (!strstr("uptime", mesg) && sizeof(mesg) <= 6)
{
- if(Tcmd["uptime"] > TIMEOUT) return;
+ if (Tcmd["uptime"] > TIMEOUT)
+ return;
+
Tcmd["uptime"] = time();
- if(file_size("/etc/maxusers") <= 0) {
+
+ if (file_size("/etc/maxusers") <= 0)
+ {
ret = "Diese Information liegt nicht vor.";
- } else {
+ }
+ else
+ {
sscanf(read_file("/etc/maxusers"), "%d %s", max, tmp);
sscanf(read_file("/etc/maxusers.ever"), "%d %s", rekord, tmp);
ret = sprintf("Das MUD laeuft jetzt %s. Es sind momentan %d Spieler "
- "eingeloggt; das Maximum lag heute bei %d und der Rekord "
- "bisher ist %d.", uptime(), sizeof(users()), max, rekord);
+ "eingeloggt; das Maximum lag heute bei %d und der Rekord "
+ "bisher ist %d.", uptime(), sizeof(users()), max, rekord);
}
- } else
- if(!strstr("statistik", mesg) && sizeof(mesg) <= 9)
+ }
+ else if (!strstr("statistik", mesg) && sizeof(mesg) <= 9)
{
- if(Tcmd["statistik"] > TIMEOUT) return;
+ if (Tcmd["statistik"] > TIMEOUT)
+ return;
+
Tcmd["statistik"] = time();
ret = sprintf(
- "Im Moment sind insgesamt %d Ebenen mit %d Teilnehmern aktiv.\n"
- "Der %s wurde das letzte mal am %s von %s neu gestartet.\n"
- "Seitdem wurden %d Ebenen neu erzeugt und %d zerstoert.\n",
- sizeof(channels), CountUser(channels), CMNAME,
- dtime(stats["time"]), stats["boot"], stats["new"], stats["dispose"]);
- } else
- if(!strstr(mesg, "bann"))
+ "Im Moment sind insgesamt %d Ebenen mit %d Teilnehmern aktiv.\n"
+ "Der %s wurde das letzte mal am %s von %s neu gestartet.\n"
+ "Seitdem wurden %d Ebenen neu erzeugt und %d zerstoert.\n",
+ sizeof(channels), CountUser(channels), CMNAME,
+ dtime(stats["time"]), stats["boot"], stats["new"], stats["dispose"]);
+ }
+ else if (!strstr(mesg, "bann"))
{
string pl, cmd;
- if(mesg == "bann")
- if(sizeof(channelB))
+
+ if (mesg == "bann")
+ {
+ if (sizeof(channelB))
{
ret = "";
- walk_mapping(channelB, #'banned/*'*/, &ret);
+ walk_mapping(channelB, #'banned, &ret);
ret = "Fuer folgende Spieler besteht ein Bann: " + ret;
- } else ret = "Zur Zeit ist kein Bann aktiv.";
- else
- {
- if(sscanf(mesg, "bann %s %s", pl, cmd) == 2 &&
- IS_DEPUTY(msg[1]))
- {
-# define CMDS ({C_FIND, C_LIST, C_JOIN, C_LEAVE, C_SEND, C_NEW})
- pl = lower_case(pl); cmd = lower_case(cmd);
- if(member(CMDS, cmd) != -1)
- {
- if(!pointerp(channelB[pl]))
- channelB[pl] = ({});
- if(member(channelB[pl], cmd) != -1)
- channelB[pl] -= ({ cmd });
- else
- channelB[pl] += ({ cmd });
- ret = "Fuer '"+capitalize(pl)+"' besteht "
- + (sizeof(channelB[pl]) ?
- "folgender Bann: "+implode(channelB[pl], ", ") :
- "kein Bann mehr.");
- if(!sizeof(channelB[pl]))
- channelB = m_copy_delete(channelB, pl);
- save_object(CHANNEL_SAVE);
- }
- else ret = "Das Kommando '"+cmd+"' ist unbekannt. Erlaubte Kommandos: "
- + implode(CMDS, ", ");
}
else
{
- if(!IS_ARCH(msg[1])) return;
- else ret = "Syntax: bann <name> <kommando>";
+ ret = "Zur Zeit ist kein Bann aktiv.";
+ }
+ }
+ else
+ {
+ if (sscanf(mesg, "bann %s %s", pl, cmd) == 2 && IS_DEPUTY(msg[1]))
+ {
+ pl = lower_case(pl);
+ cmd = lower_case(cmd);
+
+ if (member(CMDS, cmd) != -1)
+ {
+ if (!pointerp(channelB[pl]))
+ channelB[pl] = ({});
+
+ if (member(channelB[pl], cmd) != -1)
+ channelB[pl] -= ({ cmd });
+ else
+ channelB[pl] += ({ cmd });
+ ret = "Fuer '" + capitalize(pl) + "' besteht "
+ + (sizeof(channelB[pl]) ?
+ "folgender Bann: " + implode(channelB[pl], ", ") :
+ "kein Bann mehr.");
+
+ if (!sizeof(channelB[pl]))
+ channelB = m_copy_delete(channelB, pl);
+
+ save_object(CHANNEL_SAVE);
+ }
+ else
+ {
+ ret = "Das Kommando '" + cmd + "' ist unbekannt. "
+ "Erlaubte Kommandos: "+ implode(CMDS, ", ");
+ }
+ }
+ else
+ {
+ if (!IS_ARCH(msg[1]))
+ return;
+ else
+ ret = "Syntax: bann <name> <kommando>";
}
}
}
- else if(mesg == "lust")
+ else if (mesg == "lust")
{
mixed t, up;
- if(Tcmd["lag"] > TIMEOUT ||
- Tcmd["statistik"] > TIMEOUT ||
- Tcmd["uptime"] > TIMEOUT) return;
+
+ if (Tcmd["lag"] > TIMEOUT ||
+ Tcmd["statistik"] > TIMEOUT ||
+ Tcmd["uptime"] > TIMEOUT)
+ return;
+
Tcmd["lag"] = time();
Tcmd["statistik"] = time();
Tcmd["uptime"] = time();
lag = "/p/daemon/lag-o-daemon"->read_lag_data();
-
sscanf(read_file("/etc/maxusers"), "%d %s", max, tmp);
sscanf(read_file("/etc/maxusers.ever"), "%d %s", rekord, tmp);
+ t = time() - last_reboot_time();
+ up = "";
- t=time()-last_reboot_time();
- up="";
- if(t >= 86400)
- up += sprintf("%dT", t/86400);
- if(t >= 3600)
- up += sprintf("%dh", (t=t%86400)/3600);
- if(t > 60)
- up += sprintf("%dm", (t=t%3600)/60);
- up += sprintf("%ds", t%60);
+ if (t >= 86400)
+ up += sprintf("%dT", t / 86400);
+ if (t >= 3600)
+ up += sprintf("%dh", (t = t % 86400) / 3600);
+
+ if (t > 60)
+ up += sprintf("%dm", (t = t % 3600) / 60);
+
+ up += sprintf("%ds", t % 60);
ret = sprintf("%.1f%%/15 %.1f%%/1 %s %d:%d:%d E:%d T:%d",
- lag[1], lag[2], up, sizeof(users()), max, rekord,
- sizeof(channels), CountUser(channels));
- } else return;
+ lag[1], lag[2], up, sizeof(users()), max, rekord,
+ sizeof(channels), CountUser(channels));
+ }
+ else
+ {
+ return;
+ }
- call_out(#'send/*'*/, 2, CMNAME, this_object(), ret);
+ call_out(#'send, 2, CMNAME, this_object(), ret);
}
// setup() -- set up a channel and register it
@@ -240,33 +322,47 @@
string d;
d = "- Keine Beschreibung -";
m = this_object();
- if(sizeof(c) && sizeof(c[0]) > 1 && c[0][0] == '\\')
+
+ if (sizeof(c) && sizeof(c[0]) > 1 && c[0][0] == '\\')
c[0] = c[0][1..];
- switch(sizeof(c))
+ switch (sizeof(c))
{
- case 6:
- if(!stringp(c[5]) || !sizeof(c[5])
- || (catch(m=load_object(c[5]);publish) || !objectp(m) ))
- m = this_object();
- case 5: d = stringp(c[4]) || closurep(c[4]) ? c[4] : d;
- case 4: admin[c[0], FLAG] = to_int(c[3]);
- case 3: admin[c[0], SEND] = to_int(c[2]);
- case 2: admin[c[0], RECV] = to_int(c[1]);
- break;
- case 0:
- default:
- return;
+ case 6:
+ if (!stringp(c[5]) || !sizeof(c[5]) ||
+ (catch(m = load_object(c[5]); publish) ||
+ !objectp(m)))
+ m = this_object();
+
+ case 5:
+ d = stringp(c[4]) || closurep(c[4]) ? c[4] : d;
+
+ case 4:
+ admin[c[0], FLAG] = to_int(c[3]);
+
+ case 3:
+ admin[c[0], SEND] = to_int(c[2]);
+
+ case 2:
+ admin[c[0], RECV] = to_int(c[1]);
+ break;
+
+ case 0:
+ default:
+ return;
}
- switch(new(c[0], m, d))
+
+ switch (new(c[0], m, d))
{
- case E_ACCESS_DENIED:
- log_file("CHANNEL", sprintf("[%s] %s: %O: error, access denied\n",
- dtime(time()), c[0], m));
- break;
- default:
- break;
+ case E_ACCESS_DENIED:
+ log_file("CHANNEL", sprintf("[%s] %s: %O: error, access denied\n",
+ dtime(time()), c[0], m));
+ break;
+
+ default:
+ break;
}
+
return;
}
@@ -274,83 +370,103 @@
{
mixed tmp;
#if !defined(__TESTMUD__) && MUDNAME=="MorgenGrauen"
- tmp = read_file(object_name(this_object())+".init");
+ tmp = read_file(object_name(this_object()) + ".init");
#else
- tmp = read_file(object_name(this_object())+".init.testmud");
+ tmp = read_file(object_name(this_object()) + ".init.testmud");
#endif
+
if (!stringp(tmp))
return;
+
tmp = regexp(old_explode(tmp, "\n"), "^[^#]");
- tmp = map(tmp, #'regexplode/*'*/, "[^:][^:]*$|[ \\t]*:[ \\t]*");
- tmp = map(tmp, #'regexp/*'*/, "^[^: \\t]");
- map(tmp, #'setup/*'*/);
+ tmp = map(tmp, #'regexplode, "[^:][^:]*$|[ \\t]*:[ \\t]*");
+ tmp = map(tmp, #'regexp, "^[^: \\t]");
+ map(tmp, #'setup);
}
-// BEGIN OF THE CHANNEL MASTER IMPLEMENTATION
+ // BEGIN OF THE CHANNEL MASTER IMPLEMENTATION
protected void create()
{
seteuid(getuid());
restore_object(CHANNEL_SAVE);
- if(!channelC) channelC = ([]);
- if(!channelB) channelB = ([]);
+
+ if (!channelC)
+ channelC = ([]);
+
+ if (!channelB)
+ channelB = ([]);
+
channels = ([]);
- /* Die Channel-History wird nicht nur lokal sondern auch noch im Memory
- gespeichert, dadurch bleibt sie auch ueber ein Reload erhalten.
+ /* Die Channel-History wird nicht nur lokal sondern auch noch im Memory
+ gespeichert, dadurch bleibt sie auch ueber ein Reload erhalten.
Der folgende Code versucht, den Zeiger aus dem Memory zu holen. Falls
das nicht moeglich ist, wird ein neuer erzeugt und gegebenenfalls im
Memory abgelegt. */
// Hab ich die noetigen Rechte im Memory?
- if (call_other(MEMORY,"HaveRights")) {
+ if (call_other(MEMORY, "HaveRights"))
+ {
// Objektpointer laden
- channelH = call_other(MEMORY,"Load","History");
+ channelH = (mixed) call_other(MEMORY, "Load", "History");
// Wenns nich geklappt hat, hat der Memory noch keinen Zeiger, dann
- if (!mappingp(channelH)){
+ if (!mappingp(channelH)) {
// Zeiger erzeugen
channelH = ([]);
// und in den Memory schreiben
- call_other(MEMORY,"Save","History",channelH);
+ call_other(MEMORY, "Save", "History", channelH);
}
- } else {
+ }
+ else
+ {
// Keine Rechte im Memory, dann wird mit einem lokalen Zeiger gearbeitet.
channelH = ([]);
}
stats = (["time": time(),
- "boot": capitalize(getuid(previous_object())||"<Unbekannt>")]);
- new(CMNAME, this_object(), "Zentrale Informationen zu den Ebenen");
+ "boot": capitalize(getuid(previous_object()) || "<Unbekannt>")]);
+ new (CMNAME, this_object(), "Zentrale Informationen zu den Ebenen");
initialize();
map_objects(efun::users(), "RegisterChannels");
this_object()->send(CMNAME, this_object(),
- sprintf("%d Ebenen mit %d Teilnehmern initialisiert.",
- sizeof(channels),
- CountUser(channels)));
+ sprintf("%d Ebenen mit %d Teilnehmern initialisiert.",
+ sizeof(channels),
+ CountUser(channels)));
}
// reset() and cache_to() - Cache Timeout, remove timed out cached channels
// SEE: new, send
private int cache_to(string key, mapping m, int t)
{
- if(!pointerp(m[key]) || m[key][2] + 43200 > t) return 1;
- return(0);
+ if (!pointerp(m[key]) || m[key][2] + 43200 > t)
+ return 1;
+
+ return (0);
}
varargs void reset(int nonstd)
{
- channelC = filter_indices(channelC, #'cache_to/*'*/, channelC, time());
+ channelC = filter_indices(channelC, #'cache_to, channelC, time());
+
if (save_me_soon)
{
- save_me_soon=0;
+ save_me_soon = 0;
save_object(CHANNEL_SAVE);
}
}
// name() - define the name of this object.
-string name() { return CMNAME; }
-string Name() { return CMNAME; }
+string name()
+{
+ return CMNAME;
+}
+
+string Name()
+{
+ return CMNAME;
+}
// access() - check access by looking for the right argument types and
// calling access closures respectively
@@ -361,45 +477,53 @@
{
mixed co, m;
- if(!stringp(ch) || !sizeof(ch = lower_case(ch)) || !channels[ch])
+ if (!stringp(ch) || !sizeof(ch = lower_case(ch)) || !channels[ch])
return 0;
- if(!channels[ch][I_ACCESS]||!previous_object(1)||!extern_call()||
- previous_object(1)==this_object()||
- (stringp(channels[ch][I_MASTER])&&
- previous_object(1)==find_object(channels[ch][I_MASTER]))||
- getuid(previous_object(1)) == ROOTID)
+
+ if (!channels[ch][I_ACCESS] || !previous_object(1) || !extern_call() ||
+ previous_object(1) == this_object() ||
+ (stringp(channels[ch][I_MASTER]) &&
+ previous_object(1) == find_object(channels[ch][I_MASTER])) ||
+ getuid(previous_object(1)) == ROOTID)
return 2;
- if(!objectp(pl) ||
- ((previous_object(1)!=pl) &&(previous_object(1)!=this_object())))
- return 0;
- if(pointerp(channelB[getuid(pl)]) &&
- member(channelB[getuid(pl)], cmd) != -1)
+
+ if (!objectp(pl) ||
+ ((previous_object(1) != pl) && (previous_object(1) != this_object())))
return 0;
- if(stringp(channels[ch][I_MASTER]) &&
- (!(m = find_object(channels[ch][I_MASTER])) ||
- (!to_object(channels[ch][I_ACCESS]) ||
- get_type_info(channels[ch][I_ACCESS])[1])))
+
+ if (pointerp(channelB[getuid(pl)]) &&
+ member(channelB[getuid(pl)], cmd) != -1)
+ return 0;
+
+ if (stringp(channels[ch][I_MASTER]) &&
+ (!(m = find_object(channels[ch][I_MASTER])) ||
+ (!to_object(channels[ch][I_ACCESS]) ||
+ get_type_info(channels[ch][I_ACCESS])[1])))
{
string err;
- if(!objectp(m)) err = catch(load_object(channels[ch][I_MASTER]);publish);
- if(!err &&
- ((!to_object(channels[ch][I_ACCESS]) ||
- get_type_info(channels[ch][I_ACCESS])[1]) &&
- !closurep(channels[ch][I_ACCESS] =
- symbol_function("check",
- find_object(channels[ch][I_MASTER])))))
+
+ if (!objectp(m))
+ err = catch(load_object(channels[ch][I_MASTER]); publish);
+
+ if (!err &&
+ ((!to_object(channels[ch][I_ACCESS]) ||
+ get_type_info(channels[ch][I_ACCESS])[1]) &&
+ !closurep(channels[ch][I_ACCESS] =
+ symbol_function("check", find_object(channels[ch][I_MASTER])))))
{
log_file("CHANNEL", sprintf("[%s] %O -> %O\n",
- dtime(time()), channels[ch][I_MASTER],
- err));
+ dtime(time()), channels[ch][I_MASTER],
+ err));
channels = m_copy_delete(channels, ch);
return 0;
}
+
this_object()->join(ch, find_object(channels[ch][I_MASTER]));
}
- if(closurep(channels[ch][I_ACCESS]))
- return funcall(channels[ch][I_ACCESS],
- channels[ch][I_NAME], pl, cmd, &txt);
+
+ if (closurep(channels[ch][I_ACCESS]))
+ return funcall(channels[ch][I_ACCESS],
+ channels[ch][I_NAME], pl, cmd, &txt);
}
// new() - create a new channel
@@ -408,57 +532,61 @@
// to display up-to-date information, check may contain a closure
// called when a join/leave/send/list/users message is received
// SEE: access
-
#define IGNORE "^/xx"
varargs int new(string ch, object pl, mixed info)
{
mixed pls;
- if(!objectp(pl) || !stringp(ch) || !sizeof(ch) || channels[lower_case(ch)] ||
- (pl == this_object() && extern_call()) ||
- sizeof(channels) >= MAX_CHANNELS ||
- sizeof(regexp(({ object_name(pl) }), IGNORE)) ||
- (pointerp(channelB[getuid(pl)]) &&
+ if (!objectp(pl) || !stringp(ch) || !sizeof(ch) ||
+ channels[lower_case(ch)] || (pl == this_object() && extern_call()) ||
+ sizeof(channels) >= MAX_CHANNELS ||
+ sizeof(regexp(({ object_name(pl) }), IGNORE)) ||
+ (pointerp(channelB[getuid(pl)]) &&
member(channelB[getuid(pl)], C_NEW) != -1))
return E_ACCESS_DENIED;
- if(!info) {
- if(channelC[lower_case(ch)]) {
+ if (!info)
+ {
+ if (channelC[lower_case(ch)])
+ {
ch = channelC[lower_case(ch)][0];
info = channelC[lower_case(ch)][1];
}
- else return E_ACCESS_DENIED;
+ else
+ {
+ return E_ACCESS_DENIED;
+ }
}
- else channelC[lower_case(ch)] = ({ ch, info, time() });
+ else
+ {
+ channelC[lower_case(ch)] = ({ ch, info, time() });
+ }
pls = ({ pl });
-
- channels[lower_case(ch)] = ({ pls,
- symbol_function("check", pl) ||
- #'check/*'*/, info,
- (!living(pl) &&
- !clonep(pl) &&
- pl != this_object()
- ? object_name(pl)
- : pl),
- ch,
- });
+ channels[lower_case(ch)] = ({
+ pls,
+ symbol_function("check", pl) || #'check, info,
+ (!living(pl) && !clonep(pl) && pl != this_object()
+ ? object_name(pl)
+ : pl),
+ ch});
// ChannelH fuer einen Kanal nur dann initialisieren, wenn es sie noch nich gibt.
- if ( !pointerp(channelH[lower_case(ch)]) )
- channelH[lower_case(ch)] = ({});
+ if (!pointerp(channelH[lower_case(ch)]))
+ channelH[lower_case(ch)] = ({});
- if(pl != this_object())
+ if (pl != this_object())
log_file("CHANNEL.new", sprintf("[%s] %O: %O %O\n",
- dtime(time()), ch, pl, info));
- if(!pl->QueryProp(P_INVIS))
+ dtime(time()), ch, pl, info));
+
+ if (!pl->QueryProp(P_INVIS))
this_object()->send(CMNAME, pl,
- "laesst die Ebene '"+ch+"' entstehen.", MSG_EMOTE);
+ "laesst die Ebene '" + ch + "' entstehen.", MSG_EMOTE);
+
stats["new"]++;
-
- save_me_soon=1;
- return(0);
+ save_me_soon = 1;
+ return (0);
}
// join() - join a channel
@@ -468,10 +596,14 @@
// SEE: leave, access
int join(string ch, object pl)
{
- if(!funcall(#'access,&ch, pl, C_JOIN)) return E_ACCESS_DENIED;
- if(member(channels[ch][I_MEMBER], pl) != -1) return E_ALREADY_JOINED;
+ if (!funcall(#'access,&ch, pl, C_JOIN))
+ return E_ACCESS_DENIED;
+
+ if (member(channels[ch][I_MEMBER], pl) != -1)
+ return E_ALREADY_JOINED;
+
channels[ch][I_MEMBER] += ({ pl });
- return(0);
+ return (0);
}
// leave() - leave a channel
@@ -483,43 +615,46 @@
int leave(string ch, object pl)
{
int pos;
- if(!funcall(#'access,&ch, pl, C_LEAVE)) return E_ACCESS_DENIED;
+
+ if (!funcall(#'access,&ch, pl, C_LEAVE))
+ return E_ACCESS_DENIED;
+
channels[ch][I_MEMBER] -= ({0}); // kaputte Objekte erstmal raus
- if((pos = member(channels[ch][I_MEMBER], pl)) == -1) return E_NOT_MEMBER;
- if(pl == channels[ch][I_MASTER] && sizeof(channels[ch][I_MEMBER]) > 1)
+
+ if ((pos = member(channels[ch][I_MEMBER], pl)) == -1)
+ return E_NOT_MEMBER;
+
+ if (pl == channels[ch][I_MASTER] && sizeof(channels[ch][I_MEMBER]) > 1)
{
channels[ch][I_MASTER] = channels[ch][I_MEMBER][1];
- if(!pl->QueryProp(P_INVIS))
- this_object()->send(ch, pl, "uebergibt die Ebene an "
- +channels[ch][I_MASTER]->name(WEN)+".", MSG_EMOTE);
+
+ if (!pl->QueryProp(P_INVIS))
+ this_object()->send(ch, pl, "uebergibt die Ebene an " +
+ channels[ch][I_MASTER]->name(WEN) + ".", MSG_EMOTE);
}
channels[ch][I_MEMBER][pos..pos] = ({ });
-
- if(!sizeof(channels[ch][I_MEMBER]) &&
- !stringp(channels[ch][I_MASTER]))
+ if (!sizeof(channels[ch][I_MEMBER]) && !stringp(channels[ch][I_MASTER]))
{
// delete the channel that has no members
- if(!pl->QueryProp(P_INVIS))
- this_object()->send(CMNAME, pl,
- "verlaesst als "
- +(pl->QueryProp(P_GENDER) == 1 ? "Letzter" :
- "Letzte")
- +" die Ebene '"
- +channels[ch][I_NAME]
- +"', worauf diese sich in einem Blitz oktarinen "
- +"Lichts aufloest.", MSG_EMOTE);
- channelC[lower_case(ch)] = ({ channels[ch][I_NAME],
- channels[ch][I_INFO], time() });
+ if (!pl->QueryProp(P_INVIS))
+ this_object()->send(CMNAME, pl,
+ "verlaesst als "+
+ (pl->QueryProp(P_GENDER) == 1 ? "Letzter" : "Letzte")+
+ " die Ebene '"+channels[ch][I_NAME]+"', worauf diese sich in "
+ "einem Blitz oktarinen Lichts aufloest.", MSG_EMOTE);
+
+ channelC[lower_case(ch)] =
+ ({ channels[ch][I_NAME], channels[ch][I_INFO], time() });
m_delete(channels, lower_case(ch));
-
// Wird ein Channel entfernt, wird auch seine History geloescht
+ // TODO: this foils the attempts at creating a persistent channel
+ // history via /secure/memory.c
channelH = m_copy_delete(channelH, lower_case(ch));
-
stats["dispose"]++;
- save_me_soon=1;
+ save_me_soon = 1;
}
- return(0);
+ return (0);
}
// send() - send a message to all recipients of the specified channel 'ch'
@@ -532,35 +667,49 @@
{
int a;
- if(!(a = funcall(#'access,&ch, pl, C_SEND, &msg))) return E_ACCESS_DENIED;
- if(a < 2 && member(channels[ch][I_MEMBER], pl) == -1) return E_NOT_MEMBER;
- if(!msg || !stringp(msg) || !sizeof(msg)) return E_EMPTY_MESSAGE;
- map_objects(channels[ch][I_MEMBER],
- "ChannelMessage", ({ channels[ch][I_NAME], pl, msg, type }));
- if(sizeof(channelH[ch]) > MAX_HIST_SIZE)
+ if (!(a = funcall(#'access, &ch, pl, C_SEND, &msg)))
+ return E_ACCESS_DENIED;
+
+ if (a < 2 && member(channels[ch][I_MEMBER], pl) == -1)
+ return E_NOT_MEMBER;
+
+ if (!msg || !stringp(msg) || !sizeof(msg))
+ return E_EMPTY_MESSAGE;
+
+ map_objects(channels[ch][I_MEMBER], "ChannelMessage",
+ ({ channels[ch][I_NAME], pl, msg, type }));
+
+ if (sizeof(channelH[ch]) > MAX_HIST_SIZE)
channelH[ch] = channelH[ch][1..];
- channelH[ch] += ({ ({ channels[ch][I_NAME],
- (stringp(pl)
- ? pl
- : (pl->QueryProp(P_INVIS)
- ? "/("+capitalize(getuid(pl))+")$" : "")
- + (pl->Name(WER, 2) || "<Unbekannt>")),
- msg+" <"+strftime("%a, %H:%M:%S")+">\n",
- type }) });
- return(0);
+
+ channelH[ch] +=
+ ({ ({ channels[ch][I_NAME],
+ (stringp(pl)
+ ? pl
+ : (pl->QueryProp(P_INVIS)
+ ? "/(" + capitalize(getuid(pl)) + ")$"
+ : "")
+ + (pl->Name(WER, 2) || "<Unbekannt>")),
+ msg + " <" + strftime("%a, %H:%M:%S") + ">\n",
+ type }) });
+ return (0);
+ }
+
+private void clean(string n, mixed a)
+{
+ a[0] -= ({ 0 });
}
// list() - list all channels, that are at least receivable by 'pl'
// returns a mapping,
// SEE: access, channels
-private void clean(string n, mixed a) { a[0] -= ({ 0 }); }
mixed list(object pl)
{
- mapping chs;
-
- chs = filter_indices(channels, #'access/*'*/, pl, C_LIST);
- walk_mapping(chs, #'clean/*'*/);
- if(!sizeof(chs)) return E_ACCESS_DENIED;
+ mapping chs = filter_indices(channels, #'access, pl, C_LIST);
+ walk_mapping(chs, #'clean);
+
+ if (!sizeof(chs))
+ return E_ACCESS_DENIED;
return deep_copy(chs);
}
@@ -570,22 +719,34 @@
mixed find(string ch, object pl)
{
mixed chs, s;
- if(stringp(ch)) ch = lower_case(ch);
- if( !sizeof(regexp(({ch}),"^[<>a-z0-9#-]*$")) ) return 0; // RUM
- if(!sizeof(chs = regexp(m_indices(channels), "^"+ch+"$")))
- chs = regexp(m_indices(channels), "^"+ch);
- if((s = sizeof(chs)) > 1)
- if(sizeof(chs = filter(chs, #'access/*'*/, pl, C_FIND)) == 1)
+
+ if (stringp(ch))
+ ch = lower_case(ch);
+
+ if (!sizeof(regexp(({ch}), "^[<>a-z0-9#-]*$")))
+ return 0; // RUM
+
+ if (!sizeof(chs = regexp(m_indices(channels), "^" + ch + "$")))
+ chs = regexp(m_indices(channels), "^" + ch);
+
+ if ((s = sizeof(chs)) > 1)
+ {
+ if (sizeof(chs = filter(chs, #'access, pl, C_FIND)) == 1)
return channels[chs[0]][I_NAME];
- else return chs;
- return ((s && funcall(#'access,chs[0], pl, C_FIND)) ? channels[chs[0]][I_NAME] : 0);
+ else
+ return chs;
+ }
+
+ return ((s && funcall(#'access,chs[0], pl, C_FIND))
+ ? channels[chs[0]][I_NAME]
+ : 0);
}
// history() - get the history of a channel
// SEE: access
mixed history(string ch, object pl)
{
- if(!funcall(#'access,&ch, pl, C_JOIN))
+ if (!funcall(#'access, &ch, pl, C_JOIN))
return E_ACCESS_DENIED;
return deep_copy(channelH[ch]);
}
@@ -596,53 +757,60 @@
{
mixed members;
- if(previous_object() != this_object())
- if(!stringp(ch) ||
- pl != this_player() || this_player() != this_interactive() ||
- this_interactive() != previous_object() ||
- !IS_ARCH(this_interactive()))
+ if (previous_object() != this_object())
+ {
+ if (!stringp(ch) ||
+ pl != this_player() || this_player() != this_interactive() ||
+ this_interactive() != previous_object() ||
+ !IS_ARCH(this_interactive()))
return E_ACCESS_DENIED;
+ }
- if(channels[lower_case(ch)]) {
+ if (channels[lower_case(ch)])
+ {
channels[lower_case(ch)][I_MEMBER] =
- filter_objects(channels[lower_case(ch)][I_MEMBER],
- "QueryProp", P_CHANNELS);
+ filter_objects(channels[lower_case(ch)][I_MEMBER],
+ "QueryProp", P_CHANNELS);
map(channels[lower_case(ch)][I_MEMBER],
- function mixed (object listener) {
- string* chans = listener->QueryProp(P_CHANNELS);
- chans -= ({lower_case(ch)});
- ({string*})listener->SetProp(P_CHANNELS, chans);
- });
+ function mixed(object listener)
+ {
+ string* chans = listener->QueryProp(P_CHANNELS);
+ chans -= ({lower_case(ch)});
+ ({string*})listener->SetProp(P_CHANNELS, chans);
+ });
channels = m_copy_delete(channels, lower_case(ch));
// Wird ein Channel entfernt, wird auch seine History geloescht
- if( pointerp(channelH[lower_case(ch)] ))
- channelH = m_copy_delete(channelH, lower_case(ch));
+ if (pointerp(channelH[lower_case(ch)]))
+ channelH = m_copy_delete(channelH, lower_case(ch));
stats["dispose"]++;
}
- if(!channelC[lower_case(ch)])
+
+ if (!channelC[lower_case(ch)])
return E_ACCESS_DENIED;
+
channelC = m_copy_delete(channelC, lower_case(ch));
- save_me_soon=1;
- return(0);
+ save_me_soon = 1;
+ return (0);
}
-// Wird aus der Shell aufgerufen
+// Wird aus der Shell aufgerufen
mixed clear_history(string ch)
{
- mixed members;
// Sicherheitsabfragen
- if(previous_object() != this_object())
- if(!stringp(ch) ||
- this_player() != this_interactive() ||
- this_interactive() != previous_object() ||
- !IS_ARCH(this_interactive()))
+ if (previous_object() != this_object())
+ {
+ if (!stringp(ch) ||
+ this_player() != this_interactive() ||
+ this_interactive() != previous_object() ||
+ !IS_ARCH(this_interactive()))
return E_ACCESS_DENIED;
+ }
// History des Channels loeschen
- if( pointerp(channelH[lower_case(ch)] ))
- channelH[lower_case(ch)]=({});
+ if (pointerp(channelH[lower_case(ch)]))
+ channelH[lower_case(ch)] = ({});
return 0;
}