blob: 3592ffe9dd31b46d235a76af7c7a1c640023f902 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// 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
13inherit "/sys/format";
14#endif
15
16#define COMMAND "cmd"
17#define CHANNEL "channel"
18
19private nosave mixed _name_;
20
21int filter_listeners(object ob, string channel) {
22 return ob->QueryProp(P_INTERMUD);
23}
24
25int 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
84string name() { return _name_ || "<Intermud>"; }
85string Name() {return capitalize(_name_ || "<Intermud>");}
86
87private 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
94void 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}