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 | |
Zesstra | 39d1d2b | 2020-09-28 23:53:04 +0200 | [diff] [blame^] | 19 | inherit "/std/channel_supervisor"; |
| 20 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 21 | private nosave mixed _name_; |
| 22 | |
Zesstra | 39d1d2b | 2020-09-28 23:53:04 +0200 | [diff] [blame^] | 23 | protected void create() |
| 24 | { |
| 25 | ::create(); |
| 26 | ch_set_sv_name("<Intermud>"); |
| 27 | ch_read_init_file(); |
| 28 | } |
| 29 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 30 | int filter_listeners(object ob, string channel) { |
| 31 | return ob->QueryProp(P_INTERMUD); |
| 32 | } |
| 33 | |
| 34 | int udp_channel(mapping data) { |
| 35 | object *list; |
| 36 | string msg; |
| 37 | int i, type; |
| 38 | |
| 39 | /* Compatability with older systems. */ |
| 40 | if (!data[CHANNEL]) |
| 41 | data[CHANNEL] = data["CHANNEL"]; |
| 42 | if (!data[COMMAND]) |
| 43 | data[COMMAND] = data["CMD"]; |
| 44 | if (!data[DATA]) |
| 45 | data[DATA]=""; |
| 46 | |
| 47 | if (!stringp(data[CHANNEL]) || !sizeof(data[CHANNEL]) |
| 48 | || !stringp(data[DATA]) || !sizeof(data[DATA]) |
| 49 | || !stringp(data[NAME]) || !sizeof(data[NAME]) |
| 50 | || !stringp(data[SENDER]) || !sizeof(data[SENDER])) |
| 51 | return 0; |
| 52 | |
| 53 | data[DATA]= |
| 54 | implode(filter(explode(data[DATA], ""), #'>=, " "), "");//')) |
| 55 | data[NAME]= |
| 56 | implode(filter(explode(data[NAME], ""), #'>=, " "), "");//')) |
| 57 | switch(data[COMMAND]) { |
| 58 | case "list": |
| 59 | /* Request for a list of people listening to a certain channel. */ |
| 60 | list = filter(users(), "filter_listeners", |
| 61 | this_object(), data[CHANNEL]); |
| 62 | if (i = sizeof(list)) { |
| 63 | msg = "[" + capitalize(data[CHANNEL]) + "@" + |
| 64 | LOCAL_NAME + "] Listening:\n"; |
| 65 | while(i--) |
| 66 | msg += |
| 67 | " " + capitalize(list[i]->query_real_name()) + "\n"; |
| 68 | } |
| 69 | else |
| 70 | msg = "[" + capitalize(data[CHANNEL]) + "@" + LOCAL_NAME |
| 71 | + "] Nobody Listening.\n"; |
| 72 | INETD->_send_udp(data[NAME], ([ |
| 73 | REQUEST: REPLY, |
| 74 | RECIPIENT: data[SENDER], |
| 75 | ID: data[ID], |
| 76 | DATA: msg |
| 77 | ])); |
| 78 | return 1; |
| 79 | case "emote": /* A channel emote. */ |
| 80 | type = MSG_EMOTE; |
| 81 | break; |
| 82 | default: /* A regular channel message. */ |
| 83 | type = MSG_SAY; |
| 84 | break; |
| 85 | } |
| 86 | _name_ = capitalize(data[SENDER])+"@"+capitalize(data[NAME]); |
| 87 | CHMASTER->send(capitalize(data[CHANNEL]), this_object(), |
| 88 | data[DATA], type); |
| 89 | _name_ = 0; |
| 90 | return 1; |
| 91 | } |
| 92 | |
Zesstra | 39d1d2b | 2020-09-28 23:53:04 +0200 | [diff] [blame^] | 93 | public varargs string name() |
| 94 | { |
| 95 | return _name_ || "<Intermud>"; |
| 96 | } |
| 97 | public varargs string Name() |
| 98 | { |
| 99 | return capitalize(_name_ || "<Intermud>"); |
| 100 | } |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 101 | |
| 102 | private void _send(string mud, mixed data, mapping request) |
| 103 | { |
| 104 | if(member(data[HOST_COMMANDS], "channel") != -1 || |
| 105 | member(data[HOST_COMMANDS], "*") != -1) |
| 106 | INETD->_send_udp(data[HOST_NAME], request); |
| 107 | } |
| 108 | |
| 109 | void ChannelMessage(mixed m) |
| 110 | { |
| 111 | mapping request; |
| 112 | if(m[1] == this_object()) return; |
| 113 | request = ([ |
| 114 | REQUEST : "channel", |
| 115 | SENDER : m[1]->name() || capitalize(getuid(m[1])), |
| 116 | "CHANNEL": lower_case(m[0]), |
| 117 | DATA : implode(old_explode(m[2], "\n"), " ")]); |
| 118 | if(m[3] == MSG_GEMOTE || m[3] == MSG_EMOTE) |
| 119 | { |
| 120 | request["EMOTE"] = 1; |
| 121 | request["CMD"] = "emote"; |
| 122 | } |
| 123 | walk_mapping(INETD->query("hosts") - ([lower_case(MUDNAME)]), |
| 124 | #'_send/*'*/, request); |
| 125 | } |