MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | // MorgenGrauen MUDlib |
| 2 | // |
| 3 | // channel.c |
| 4 | // |
| 5 | // $Id: channel.c 9142 2015-02-04 22:17:29Z Zesstra $ |
| 6 | |
| 7 | #include <udp.h> |
| 8 | |
| 9 | #include <properties.h> |
| 10 | #include <daemon.h> |
| 11 | |
| 12 | #ifdef ZEBEDEE |
| 13 | inherit "/sys/format"; |
| 14 | #endif |
| 15 | |
| 16 | #define COMMAND "cmd" |
| 17 | #define CHANNEL "channel" |
| 18 | |
| 19 | private nosave mixed _name_; |
| 20 | |
| 21 | int filter_listeners(object ob, string channel) { |
| 22 | return ob->QueryProp(P_INTERMUD); |
| 23 | } |
| 24 | |
| 25 | int udp_channel(mapping data) { |
| 26 | object *list; |
| 27 | string msg; |
| 28 | int i, type; |
| 29 | |
| 30 | /* Compatability with older systems. */ |
| 31 | if (!data[CHANNEL]) |
| 32 | data[CHANNEL] = data["CHANNEL"]; |
| 33 | if (!data[COMMAND]) |
| 34 | data[COMMAND] = data["CMD"]; |
| 35 | if (!data[DATA]) |
| 36 | data[DATA]=""; |
| 37 | |
| 38 | if (!stringp(data[CHANNEL]) || !sizeof(data[CHANNEL]) |
| 39 | || !stringp(data[DATA]) || !sizeof(data[DATA]) |
| 40 | || !stringp(data[NAME]) || !sizeof(data[NAME]) |
| 41 | || !stringp(data[SENDER]) || !sizeof(data[SENDER])) |
| 42 | return 0; |
| 43 | |
| 44 | data[DATA]= |
| 45 | implode(filter(explode(data[DATA], ""), #'>=, " "), "");//')) |
| 46 | data[NAME]= |
| 47 | implode(filter(explode(data[NAME], ""), #'>=, " "), "");//')) |
| 48 | switch(data[COMMAND]) { |
| 49 | case "list": |
| 50 | /* Request for a list of people listening to a certain channel. */ |
| 51 | list = filter(users(), "filter_listeners", |
| 52 | this_object(), data[CHANNEL]); |
| 53 | if (i = sizeof(list)) { |
| 54 | msg = "[" + capitalize(data[CHANNEL]) + "@" + |
| 55 | LOCAL_NAME + "] Listening:\n"; |
| 56 | while(i--) |
| 57 | msg += |
| 58 | " " + capitalize(list[i]->query_real_name()) + "\n"; |
| 59 | } |
| 60 | else |
| 61 | msg = "[" + capitalize(data[CHANNEL]) + "@" + LOCAL_NAME |
| 62 | + "] Nobody Listening.\n"; |
| 63 | INETD->_send_udp(data[NAME], ([ |
| 64 | REQUEST: REPLY, |
| 65 | RECIPIENT: data[SENDER], |
| 66 | ID: data[ID], |
| 67 | DATA: msg |
| 68 | ])); |
| 69 | return 1; |
| 70 | case "emote": /* A channel emote. */ |
| 71 | type = MSG_EMOTE; |
| 72 | break; |
| 73 | default: /* A regular channel message. */ |
| 74 | type = MSG_SAY; |
| 75 | break; |
| 76 | } |
| 77 | _name_ = capitalize(data[SENDER])+"@"+capitalize(data[NAME]); |
| 78 | CHMASTER->send(capitalize(data[CHANNEL]), this_object(), |
| 79 | data[DATA], type); |
| 80 | _name_ = 0; |
| 81 | return 1; |
| 82 | } |
| 83 | |
| 84 | string name() { return _name_ || "<Intermud>"; } |
| 85 | string Name() {return capitalize(_name_ || "<Intermud>");} |
| 86 | |
| 87 | private void _send(string mud, mixed data, mapping request) |
| 88 | { |
| 89 | if(member(data[HOST_COMMANDS], "channel") != -1 || |
| 90 | member(data[HOST_COMMANDS], "*") != -1) |
| 91 | INETD->_send_udp(data[HOST_NAME], request); |
| 92 | } |
| 93 | |
| 94 | void ChannelMessage(mixed m) |
| 95 | { |
| 96 | mapping request; |
| 97 | if(m[1] == this_object()) return; |
| 98 | request = ([ |
| 99 | REQUEST : "channel", |
| 100 | SENDER : m[1]->name() || capitalize(getuid(m[1])), |
| 101 | "CHANNEL": lower_case(m[0]), |
| 102 | DATA : implode(old_explode(m[2], "\n"), " ")]); |
| 103 | if(m[3] == MSG_GEMOTE || m[3] == MSG_EMOTE) |
| 104 | { |
| 105 | request["EMOTE"] = 1; |
| 106 | request["CMD"] = "emote"; |
| 107 | } |
| 108 | walk_mapping(INETD->query("hosts") - ([lower_case(MUDNAME)]), |
| 109 | #'_send/*'*/, request); |
| 110 | } |