blob: a2276ffb0a8886259c081111d0c13a76e9005a04 [file] [log] [blame]
Zesstra83f011d2016-04-24 20:09:05 +02001#pragma strict_types, save_types, rtt_checks, pedantic
2#pragma no_clone, no_shadow, no_inherit
3
4inherit __DIR__"i_service";
5
6#include <intermud.h>
7#include <regexp.h>
8
9#define CHMASTER "/p/daemon/channeld"
10#define COMMAND "cmd"
11#define CHANNEL "channel"
12
13public string service_name()
14{
15 return "channel";
16}
17
18public string name(int egal)
19{
20 return currentname || "<Intermud>";
21}
22
23varargs private string getName(mixed x, int fall) {
24
25 mixed o = closurep(x) ? query_closure_object(x) : x;
26 if(stringp(o) && sizeof(o) && (x = find_object(o)))
27 o = x;
28
29 // Objekte
30 if (objectp(o))
31 {
32 // Froesche mit Namen versorgen.
33 if (o->QueryProp(P_FROG))
34 return "Frosch "+capitalize(getuid(o));
35 // Default (Unsichtbare als "Jemand" (s. Name()))
36 return o->Name(fall, 2)||"<Unbekannt>";
37 }
38 // Strings
39 else if (stringp(o) && sizeof(o)) {
40 if (o[0] == '/')
41 {
42 // unsichtbare Objekte...
43 int p = strstr(o, "$");
44 if (p != -1)
45 return o[p+1..];
46 else
47 // doch nicht unsichtbar
48 return (fall == WESSEN ? o+"s" : o);
49 }
50 else
51 // nicht unsichtbar
52 return (fall == WESSEN ? o+"s" : o);
53 }
54 // Fall-through
55 return "<Unbekannt>";
56}
57
58// NOT USED we received a reply to one of our messages.
59//protected void recv_channel_reply(int id, mapping request, mapping response)
60//{
61//}
62
63// we received an intermud channel message
64protected void recv_request(mapping data)
65{
66 /* Compatability with older systems. */
67 if (!data[CHANNEL])
68 data[CHANNEL] = data["CHANNEL"];
69 if (!data[COMMAND])
70 data[COMMAND] = data["CMD"];
71 if (!data[DATA])
72 data[DATA]="";
73
74 if (!stringp(data[CHANNEL]) || !sizeof(data[CHANNEL])
75 || !stringp(data[DATA]) || !sizeof(data[DATA])
76 || !stringp(data[NAME]) || !sizeof(data[NAME])
77 || !stringp(data[SENDER]) || !sizeof(data[SENDER]))
78 return 0;
79
80 data[DATA]= regreplace(data[DATA],"[:^print:]|\n","",1);
81
82 int type;
83 switch(data[COMMAND])
84 {
85 case "list":
86 /* Request for a list of people listening to a certain channel. */
87 mapping l = CHMASTER->list(this_object());
88 string channel = lower_case(data[CHANNEL]);
89 string *members;
90 string ret;
91 if(mappingp(l))
92 {
93 if(stringp(channel) && sizeof(channel) && pointerp(l[channel]))
94 {
95 members=sort_array(map(l[channel][I_MEMBER],#'getName, WER),#'>);
96 }
97 }
98 if (members && sizeof(members))
99 ret = "[" + data[CHANNEL] + "@" + INETD->PeerName() + "] Listening:\n"
100 + implode(members, "\n");
101 else
102 ret = "Nobody listening / channel unknown.\n";
103
104 INETD->send(data[NAME], ([ REQUEST: REPLY, ID: data[ID],
105 RECIPIENT: data[SENDER],
106 DATA: ret ]),
107 0);
108 return 0;
109 case "emote": /* A channel emote. */
110 if (data["EMOTE"] == 1)
111 type = MSG_EMOTE;
112 else
113 type = MSG_GEMOTE;
114 break;
115 default: /* A regular channel message. */
116 type = MSG_SAY;
117 break;
118 }
119
120 currentname = capitalize(data[SENDER])+"@"+capitalize(data[NAME]);
121 CHMASTER->send(capitalize(data[CHANNEL]), this_object(),
122 data[DATA], type);
123 currentname = 0;
124}
125
126public string ChannelMessage(mixed* msg, int nonint)
127{
128 if ( previous_object() != find_object(CHMASTER))
129 return 0;
130
131 string channel=msg[0];
132 object sender=msg[1];
133 string channel_message=msg[2];
134 int msg_type = msg[3];
135
136 if(sender == this_object()) return 0;
137
138 string sender_name = getName(sender, msg_type == MSG_GEMOTE ? WESSEN : WER);
139
140 mapping request = ([REQUEST: "channel", SENDER: sender,
141 "CHANNEL": lower_case(channel),
142 DATA: channel_message ]);
143
144 switch(msg_type)
145 {
146 case MSG_GEMOTE:
147 request["EMOTE"] = 2;
148 request["CMD"] = "emote";
149 break;
150 case MSG_EMOTE:
151 request["EMOTE"] = 1;
152 request["CMD"] = "emote";
153 break;
154 case MSG_SAY:
155 default:
156 request["CMD"] = "";
157 break;
158 }
159
160 INETD->broadcast("channel", request, 0);
161
162 return 0;
163}
164
165public int request(string mudname, string|int data)
166{
167 raise_error("request should not be used, use ChannelMessage()!\n");
168}
169