blob: 3592ffe9dd31b46d235a76af7c7a1c640023f902 [file] [log] [blame]
// MorgenGrauen MUDlib
//
// channel.c
//
// $Id: channel.c 9142 2015-02-04 22:17:29Z Zesstra $
#include <udp.h>
#include <properties.h>
#include <daemon.h>
#ifdef ZEBEDEE
inherit "/sys/format";
#endif
#define COMMAND "cmd"
#define CHANNEL "channel"
private nosave mixed _name_;
int filter_listeners(object ob, string channel) {
return ob->QueryProp(P_INTERMUD);
}
int udp_channel(mapping data) {
object *list;
string msg;
int i, type;
/* Compatability with older systems. */
if (!data[CHANNEL])
data[CHANNEL] = data["CHANNEL"];
if (!data[COMMAND])
data[COMMAND] = data["CMD"];
if (!data[DATA])
data[DATA]="";
if (!stringp(data[CHANNEL]) || !sizeof(data[CHANNEL])
|| !stringp(data[DATA]) || !sizeof(data[DATA])
|| !stringp(data[NAME]) || !sizeof(data[NAME])
|| !stringp(data[SENDER]) || !sizeof(data[SENDER]))
return 0;
data[DATA]=
implode(filter(explode(data[DATA], ""), #'>=, " "), "");//'))
data[NAME]=
implode(filter(explode(data[NAME], ""), #'>=, " "), "");//'))
switch(data[COMMAND]) {
case "list":
/* Request for a list of people listening to a certain channel. */
list = filter(users(), "filter_listeners",
this_object(), data[CHANNEL]);
if (i = sizeof(list)) {
msg = "[" + capitalize(data[CHANNEL]) + "@" +
LOCAL_NAME + "] Listening:\n";
while(i--)
msg +=
" " + capitalize(list[i]->query_real_name()) + "\n";
}
else
msg = "[" + capitalize(data[CHANNEL]) + "@" + LOCAL_NAME
+ "] Nobody Listening.\n";
INETD->_send_udp(data[NAME], ([
REQUEST: REPLY,
RECIPIENT: data[SENDER],
ID: data[ID],
DATA: msg
]));
return 1;
case "emote": /* A channel emote. */
type = MSG_EMOTE;
break;
default: /* A regular channel message. */
type = MSG_SAY;
break;
}
_name_ = capitalize(data[SENDER])+"@"+capitalize(data[NAME]);
CHMASTER->send(capitalize(data[CHANNEL]), this_object(),
data[DATA], type);
_name_ = 0;
return 1;
}
string name() { return _name_ || "<Intermud>"; }
string Name() {return capitalize(_name_ || "<Intermud>");}
private void _send(string mud, mixed data, mapping request)
{
if(member(data[HOST_COMMANDS], "channel") != -1 ||
member(data[HOST_COMMANDS], "*") != -1)
INETD->_send_udp(data[HOST_NAME], request);
}
void ChannelMessage(mixed m)
{
mapping request;
if(m[1] == this_object()) return;
request = ([
REQUEST : "channel",
SENDER : m[1]->name() || capitalize(getuid(m[1])),
"CHANNEL": lower_case(m[0]),
DATA : implode(old_explode(m[2], "\n"), " ")]);
if(m[3] == MSG_GEMOTE || m[3] == MSG_EMOTE)
{
request["EMOTE"] = 1;
request["CMD"] = "emote";
}
walk_mapping(INETD->query("hosts") - ([lower_case(MUDNAME)]),
#'_send/*'*/, request);
}