blob: 539cca1835c8e5eff8f589ccde749c796f3335a9 [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#include <living/comm.h>
9#include <defines.h>
10
11// we received a reply to one of our messages.
12// Note: if response is 0, the peer did not respond (timeout)...
13protected void recv_tell_reply(int id, mapping request, mapping response)
14{
15 if(response)
16 {
17 if (stringp(response[RECIPIENT]))
18 {
19 object ob = find_player(response[RECIPIENT])
20 || find_object(response[RECIPIENT]);
21 if (ob)
22 {
23 currentname = capitalize(data[SENDER])+"@"+capitalize(data[NAME]);
24 ob->ReceiveMsg(regreplace(response[DATA],"[:^print:]|\n","",1),
25 MT_COMM|MT_FAR, MA_TELL, 0, ME);
26 currentname = 0;
27 }
28 }
29 else
30 {
31 // no response, timeout...
32 if (request[SENDER] && stringp(request[SENDER]))
33 {
34 object ob = find_player(request[SENDER])
35 || find_object(request[SENDER]);
36 if (ob)
37 ob->ReceiveMsg("Das Mud \'" + request[NAME] +
38 "\' konnte nicht erreicht werden.\n",
39 MT_NOTIFICATION, MA_TELL, Name(0), ME);
40 }
41 }
42}
43
44// we received an intermud tell message
45protected void recv_tell(mapping data)
46{
47 object ob;
48 string msg;
49
50 if (data[RECIPIENT] &&
51 (ob = find_player(lower_case(data[RECIPIENT]))) &&
52 interactive(ob))
53 {
54 if (!stringp(data[SENDER]) || !sizeof(data[SENDER]))
55 data[SENDER]="<Unknown>";
56
57 currentname = data[SENDER] + +"@"+data[NAME];
58
59 if (!stringp(data[DATA]) || !sizeof(data[DATA]))
60 msg="<Nichts>";
61 else
62 msg= regreplace(data[DATA],"[:^print:]|\n","",1);
63
64 message_prefix=capitalize(data[SENDER])+"@"+data[NAME]+
65 " teilt Dir mit: ";
66
67 int ret = ob->ReceiveMsg(msg, MT_COMM|MT_FAR,
68 MA_TELL, message_prefix, ME);
69 currentname = 0;
70
71 // Wenn Empfaenger unsichtbar ist, bekommt der Absender immer die gleiche
72 // Meldung, egal was das Ergebnis von ReceiveMsg() ist.
73 if (ob->QueryProp(P_INVIS))
74 {
75 msg ="\nRoot@"MUDNAME": Spieler "+
76 capitalize(data[RECIPIENT])+
77 " finde ich in "MUDNAME" nicht!\n";
78 }
79 // Sonst kriegt er eine sinnvolle Angabe.
80 else
81 {
82 switch(ret)
83 {
84 case MSG_DELIVERED:
85 msg = break_string(data[DATA], 78,
86 "Du teilst "+capitalize(data[RECIPIENT]) + "@"
87 LOCAL_NAME + " mit: ");
88 if(ob->QueryProp(P_AWAY))
89 msg=sprintf("%s%s@"MUDNAME" ist gerade nicht da: %s\n",
90 msg, ob->name(WER),ob->QueryProp(P_AWAY));
91 else if ((i=query_idle(ob))>=600)
92 { // 10 Mins
93 string away;
94 if (i<3600)
95 away=time2string("%m %M",i);
96 else
97 away=time2string("%h %H und %m %M",i);
98 msg = sprintf("%s%s@"MUDNAME" ist seit %s voellig untaetig.\n",
99 msg, ob->Name(WER), away);
100 }
101 break;
102 case MSG_BUFFERED:
103 msg= ob->Name(WER) + " moechte gerade nicht gestoert werden."
104 "Die Mitteilung wurde von einem kleinen Kobold in Empfang "
105 "genommen. Er wird sie spaeter weiterleiten!";
106 break;
107 case MSG_IGNORED:
108 case MSG_VERB_IGN:
109 case MSG_MUD_IGN:
110 msg = ob->Name(WER) + " hoert gar nicht zu, was Du sagst.";
111 break;
112 case MSG_SENSE_BLOCK:
113 msg = ob->Name(WER) + " kann Dich leider nicht wahrnehmen.";
114 break;
115 case MSG_BUFFER_FULL:
116 msg = ob->Name(WER) + " moechte gerade nicht gestoert werden."
117 "Die Mitteilung ging verloren, denn der Kobold kann sich "
118 "nichts mehr merken!";
119 break;
120 default:
121 msg = ob->Name(WER) + " hat Deine Nachricht leider nicht "
122 "mitbekommen.";
123 break;
124 }
125 }
126 }
127 // Spieler nicht gefunden.
128 else
129 msg ="\nRoot@"MUDNAME": Spieler "+
130 capitalize(data[RECIPIENT])+
131 " finde ich in "MUDNAME" nicht!\n";
132
133 INETD->send(data[NAME],
134 ([REQUEST: REPLY, RECIPIENT: data[SENDER],
135 ID: data[ID],
136 DATA: msg]), 0);
137
138}
139
140public int send(string name, string mud, string msg)
141{
142 return INETD->send(mud,
143 ([REQUEST: "tell", RECIPIENT: name,
144 SENDER: getuid(previous_object()),
145 DATA: msg
146 ]), #'recv_tell_reply);
147}
148
149protected void create()
150{
151 INETD->register_service("tell", #'recv_tell);
152}
153
154public varargs int remove(int silent)
155{
156 INETD->unregister_service("tell");
157 destruct(this_object());
158}
159
160