blob: d640484319798fd6158ba0acaeef7139c60aa3d6 [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
Zesstra39d1d2b2020-09-28 23:53:04 +020019inherit "/std/channel_supervisor";
20
MG Mud User88f12472016-06-24 23:31:02 +020021private nosave mixed _name_;
22
Zesstra39d1d2b2020-09-28 23:53:04 +020023protected void create()
24{
25 ::create();
26 ch_set_sv_name("<Intermud>");
27 ch_read_init_file();
28}
29
MG Mud User88f12472016-06-24 23:31:02 +020030int filter_listeners(object ob, string channel) {
31 return ob->QueryProp(P_INTERMUD);
32}
33
34int 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
Zesstra39d1d2b2020-09-28 23:53:04 +020093public varargs string name()
94{
95 return _name_ || "<Intermud>";
96}
97public varargs string Name()
98{
99 return capitalize(_name_ || "<Intermud>");
100}
MG Mud User88f12472016-06-24 23:31:02 +0200101
102private 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
109void 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}