#include <master.cfg>
#include <udp.h>
#include <pad_str.h>
string *known_channels; /* channels known */
void reset(status arg) {
if(arg) return;
known_channels = ({
"intermud",
});
}
static int filter_channel(object ob, string channel) {
return ob->query_channel(channel) && !ob->query_edit();
}
int udp_channel(mapping data) {
object *list;
string *who;
string msg;
int size, i;
list = filter_array(users(),"filter_channel",this_object(),data["CHANNEL"]);
size = sizeof(list);
for(who = ({}),i = 0; i < size; i++) {
who += ({ (string)list[i]->query_cap_name(), });
}
if(member_array(data["CHANNEL"],known_channels) == -1) {
log_file("NEW_CHANNEL","Channel: "+ data["CHANNEL"] +
", Mud: "+ data[NAME] +
", Sender: "+ data[SENDER] +
", Message: "+ data[msg] +
", Time: "+ ctime(time()) +"\n");
}
switch(data["CMD"]) {
case "emote":
/* A channel emote. */
msg = pad_str("->"+ capitalize(data["CHANNEL"]) +":"+
" -"+ capitalize(data[NAME]) +"- ",
capitalize(data[SENDER]) +" "+
data[DATA],79) +"\n";
break;
case "list":
/* Request for a list of people listening to a certain channel. */
msg = "["+ capitalize(data["CHANNEL"]) +"@"+ LOCAL_NAME +"] ";
if(size) {
msg = pad_str(msg+"Listening: ", implode(who,", ") +".",75);
}
else {
msg = "Nobody Listening.\n";
}
INETD->send_udp(data[NAME], ([
REQUEST: REPLY,
RECIPIENT: data[SENDER],
ID: data[ID],
DATA: msg
]) );
return 1;
break;
default:
/* A regular channel message. */
msg = pad_str("->"+ capitalize(data["CHANNEL"]) +":"+
" -"+capitalize(data[NAME]) +"- ",
capitalize(data[SENDER]) +" says "+
data[DATA],75) +"\n";
break;
}
while(size--) {
tell_object(list[size], msg);
}
return 1;
}
status channel(string send_channel, string msg, string cmd, string mud) {
string *channels;
mapping data, hosts;
string *muds;
int i, j;
status flag;
if(!MASTER->valid_player_call(previous_object())) {
write("Invalid Call.\n");
return 0;
}
/* change my mind aboud multiple channel send
channels = (string *)this_player()->query_channels();
*/
channels = ({ send_channel, });
if(!channels || !sizeof(channels)) {
write("You have No Channel Set!\n"); /* this should not happen */
return 0;
}
for(i = sizeof(muds = m_indices(hosts = INETD->query("hosts"))); i--;) {
if(mud && lower_case(mud) != lower_case(muds[i])) continue;
/*
if (muds[i] != lower_case(LOCAL_NAME) &&
*/
if (
(member_array("*", hosts[muds[i]][HOST_COMMANDS]) != -1
|| member_array("channel", hosts[muds[i]][HOST_COMMANDS]) != -1)) {
for(j = 0; j < sizeof(channels); j++) {
data = ([
REQUEST: "channel",
SENDER: (string)this_player()->query_name(1),
"CHANNEL": channels[j],
"CMD": cmd,
DATA: msg
]);
if(!INETD->send_udp(muds[i], data))
write("Channel Request to "+ capitalize(muds[i]) +" Failed.\n");
else
flag = 1;
}
}
}
if(flag)
write("Request Sent.\n");
else if(!sizeof(muds)) {
object ob;
write("No Host List!\n");
if(ob = find_object(INETD)) destruct(ob);
call_other(INETD,"??"); /* reload it */
write("Fixing....Try Again\n");
}
else
write("Request Failed.\n");
return 1;
}
string known_channels() { return implode(known_channels,", "); }